Skip to content

Commit

Permalink
Remove unused nonce field (#574)
Browse files Browse the repository at this point in the history
# Goal
The goal of this PR is to remove the unused and unneeded nonce field
from the AddKeyData

Closes #573
  • Loading branch information
wilwade authored Oct 25, 2022
1 parent 94e30c1 commit 52d435b
Show file tree
Hide file tree
Showing 13 changed files with 168 additions and 171 deletions.
24 changes: 12 additions & 12 deletions pallets/messages/src/weights.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
Weight::from_ref_time(0 as u64)
// Standard Error: 0
.saturating_add(Weight::from_ref_time(1_000 as u64).saturating_mul(n as u64))
// Standard Error: 3_000
.saturating_add(Weight::from_ref_time(267_000 as u64).saturating_mul(m as u64))
// Standard Error: 2_000
.saturating_add(Weight::from_ref_time(264_000 as u64).saturating_mul(m as u64))
.saturating_add(T::DbWeight::get().reads(4 as u64))
.saturating_add(T::DbWeight::get().writes(1 as u64))
}
Expand All @@ -82,7 +82,7 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Standard Error: 0
.saturating_add(Weight::from_ref_time(2_000 as u64).saturating_mul(n as u64))
// Standard Error: 2_000
.saturating_add(Weight::from_ref_time(225_000 as u64).saturating_mul(m as u64))
.saturating_add(Weight::from_ref_time(223_000 as u64).saturating_mul(m as u64))
.saturating_add(T::DbWeight::get().reads(3 as u64))
.saturating_add(T::DbWeight::get().writes(1 as u64))
}
Expand All @@ -91,9 +91,9 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
fn on_initialize(m: u32, s: u32, ) -> Weight {
Weight::from_ref_time(0 as u64)
// Standard Error: 13_000
.saturating_add(Weight::from_ref_time(440_000 as u64).saturating_mul(m as u64))
// Standard Error: 140_000
.saturating_add(Weight::from_ref_time(5_098_000 as u64).saturating_mul(s as u64))
.saturating_add(Weight::from_ref_time(456_000 as u64).saturating_mul(m as u64))
// Standard Error: 139_000
.saturating_add(Weight::from_ref_time(5_254_000 as u64).saturating_mul(s as u64))
.saturating_add(T::DbWeight::get().reads(1 as u64))
.saturating_add(T::DbWeight::get().writes((1 as u64).saturating_mul(s as u64)))
}
Expand All @@ -109,8 +109,8 @@ impl WeightInfo for () {
Weight::from_ref_time(0 as u64)
// Standard Error: 0
.saturating_add(Weight::from_ref_time(1_000 as u64).saturating_mul(n as u64))
// Standard Error: 3_000
.saturating_add(Weight::from_ref_time(267_000 as u64).saturating_mul(m as u64))
// Standard Error: 2_000
.saturating_add(Weight::from_ref_time(264_000 as u64).saturating_mul(m as u64))
.saturating_add(RocksDbWeight::get().reads(4 as u64))
.saturating_add(RocksDbWeight::get().writes(1 as u64))
}
Expand All @@ -122,7 +122,7 @@ impl WeightInfo for () {
// Standard Error: 0
.saturating_add(Weight::from_ref_time(2_000 as u64).saturating_mul(n as u64))
// Standard Error: 2_000
.saturating_add(Weight::from_ref_time(225_000 as u64).saturating_mul(m as u64))
.saturating_add(Weight::from_ref_time(223_000 as u64).saturating_mul(m as u64))
.saturating_add(RocksDbWeight::get().reads(3 as u64))
.saturating_add(RocksDbWeight::get().writes(1 as u64))
}
Expand All @@ -131,9 +131,9 @@ impl WeightInfo for () {
fn on_initialize(m: u32, s: u32, ) -> Weight {
Weight::from_ref_time(0 as u64)
// Standard Error: 13_000
.saturating_add(Weight::from_ref_time(440_000 as u64).saturating_mul(m as u64))
// Standard Error: 140_000
.saturating_add(Weight::from_ref_time(5_098_000 as u64).saturating_mul(s as u64))
.saturating_add(Weight::from_ref_time(456_000 as u64).saturating_mul(m as u64))
// Standard Error: 139_000
.saturating_add(Weight::from_ref_time(5_254_000 as u64).saturating_mul(s as u64))
.saturating_add(RocksDbWeight::get().reads(1 as u64))
.saturating_add(RocksDbWeight::get().writes((1 as u64).saturating_mul(s as u64)))
}
Expand Down
2 changes: 1 addition & 1 deletion pallets/msa/src/benchmarking.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ fn create_payload_and_signature<T: Config>() -> (AddProvider, MultiSignature, T:

fn add_key_payload_and_signature<T: Config>() -> (AddKeyData, MultiSignature, T::AccountId) {
let account = SignerId::generate_pair(None);
let add_key_payload = AddKeyData { msa_id: 1u64.into(), nonce: 0, expiration: 10 };
let add_key_payload = AddKeyData { msa_id: 1u64.into(), expiration: 10 };
let encode_add_provider_data = wrap_binary_data(add_key_payload.encode());

let signature = account.sign(&encode_add_provider_data).unwrap();
Expand Down
4 changes: 2 additions & 2 deletions pallets/msa/src/replay_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ pub fn user_adds_key_to_msa(
delegator_pair: sp_core::sr25519::Pair,
new_pair: sp_core::sr25519::Pair,
) {
let add_key_payload: AddKeyData = AddKeyData { msa_id: 2, nonce: 0, expiration: 109 };
let add_key_payload: AddKeyData = AddKeyData { msa_id: 2, expiration: 109 };
let encode_add_key_data = wrap_binary_data(add_key_payload.encode());
let add_key_signature_delegator = delegator_pair.sign(&encode_add_key_data);
let add_key_signature_new_key = new_pair.sign(&encode_add_key_data);
Expand Down Expand Up @@ -252,7 +252,7 @@ fn replaying_create_sponsored_account_with_delegation_fails_03() {
let (new_key_pair, _) = sr25519::Pair::generate();
let new_public_key = new_key_pair.public();

let add_new_key_data = AddKeyData { nonce: 1, msa_id: 2, expiration: 10 };
let add_new_key_data = AddKeyData { msa_id: 2, expiration: 10 };
let encode_add_key_data = wrap_binary_data(add_new_key_data.encode());

let add_key_signature_delegator = delegator_keypair.sign(&encode_add_key_data);
Expand Down
23 changes: 11 additions & 12 deletions pallets/msa/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ fn it_throws_error_when_key_verification_fails() {

let fake_account = key_pair_2.public();

let add_new_key_data = AddKeyData { nonce: 1, msa_id: new_msa_id, expiration: 10 };
let add_new_key_data = AddKeyData { msa_id: new_msa_id, expiration: 10 };
let encode_data_new_key_data = wrap_binary_data(add_new_key_data.encode());

let signature: MultiSignature = key_pair.sign(&encode_data_new_key_data).into();
Expand Down Expand Up @@ -111,7 +111,7 @@ fn it_throws_error_when_not_msa_owner() {
let new_account = key_pair_2.public();
let (_new_msa_id2, _) = Msa::create_account(new_account.into(), EMPTY_FUNCTION).unwrap();

let add_new_key_data = AddKeyData { nonce: 0, msa_id: new_msa_id, expiration: 10 };
let add_new_key_data = AddKeyData { msa_id: new_msa_id, expiration: 10 };
let encode_data_new_key_data = wrap_binary_data(add_new_key_data.encode());

let signature: MultiSignature = key_pair_2.sign(&encode_data_new_key_data).into();
Expand Down Expand Up @@ -139,7 +139,7 @@ fn it_throws_error_when_for_duplicate_key() {

let (new_msa_id, _) = Msa::create_account(new_account.into(), EMPTY_FUNCTION).unwrap();

let add_new_key_data = AddKeyData { nonce: 1, msa_id: new_msa_id, expiration: 10 };
let add_new_key_data = AddKeyData { msa_id: new_msa_id, expiration: 10 };
let encode_data_new_key_data = wrap_binary_data(add_new_key_data.encode());

let signature: MultiSignature = key_pair.sign(&encode_data_new_key_data).into();
Expand All @@ -165,7 +165,7 @@ fn add_key_with_more_than_allowed_should_panic() {
let (key_pair, _) = sr25519::Pair::generate();
let account = key_pair.public();
let (new_msa_id, _) = Msa::create_account(account.into(), EMPTY_FUNCTION).unwrap();
let add_new_key_data = AddKeyData { nonce: 1, msa_id: new_msa_id, expiration: 10 };
let add_new_key_data = AddKeyData { msa_id: new_msa_id, expiration: 10 };
let encode_data_new_key_data = wrap_binary_data(add_new_key_data.encode());

for _ in 1..<Test as Config>::MaxPublicKeysPerMsa::get() {
Expand Down Expand Up @@ -215,7 +215,7 @@ fn add_key_with_valid_request_should_store_value_and_event() {

let new_key = key_pair_2.public();

let add_new_key_data = AddKeyData { nonce: 1, msa_id: new_msa_id, expiration: 10 };
let add_new_key_data = AddKeyData { msa_id: new_msa_id, expiration: 10 };
let encode_data_new_key_data = wrap_binary_data(add_new_key_data.encode());
let signature_owner: MultiSignature = key_pair.sign(&encode_data_new_key_data).into();
let signature_new_key: MultiSignature = key_pair_2.sign(&encode_data_new_key_data).into();
Expand Down Expand Up @@ -257,7 +257,7 @@ fn add_key_with_expired_proof_fails() {

// The current block is 1, therefore setting the proof expiration to 1 shoud cause
// the extrinsic to fail because the proof has expired.
let add_new_key_data = AddKeyData { nonce: 1, msa_id: new_msa_id, expiration: 1 };
let add_new_key_data = AddKeyData { msa_id: new_msa_id, expiration: 1 };
let encode_data_new_key_data = wrap_binary_data(add_new_key_data.encode());

System::set_block_number(2);
Expand Down Expand Up @@ -294,7 +294,7 @@ fn add_key_with_proof_too_far_into_future_fails() {
// The current block is 1, therefore setting the proof expiration to + 1
// should cause the extrinsic to fail because the proof is only valid for
// more blocks.
let add_new_key_data = AddKeyData { nonce: 1, msa_id: new_msa_id, expiration: 202 };
let add_new_key_data = AddKeyData { msa_id: new_msa_id, expiration: 202 };
let encode_data_new_key_data = wrap_binary_data(add_new_key_data.encode());

let signature: MultiSignature = key_pair_2.sign(&encode_data_new_key_data).into();
Expand Down Expand Up @@ -384,7 +384,7 @@ fn test_retire_msa_success() {
let new_account2 = key_pair2.public();
let (msa_id2, _) = Msa::create_account(new_account2.into(), EMPTY_FUNCTION).unwrap();

let add_new_key_data = AddKeyData { nonce: 1, msa_id: msa_id2, expiration: 10 };
let add_new_key_data = AddKeyData { msa_id: msa_id2, expiration: 10 };
let encode_data_new_key_data = wrap_binary_data(add_new_key_data.encode());
let signature: MultiSignature = key_pair1.sign(&encode_data_new_key_data).into();
assert_noop!(
Expand Down Expand Up @@ -1494,7 +1494,7 @@ fn double_add_key_two_msa_fails() {
let (msa_id1, _) = Msa::create_account(new_account1.into(), EMPTY_FUNCTION).unwrap();
let (_msa_id2, _) = Msa::create_account(new_account2.into(), EMPTY_FUNCTION).unwrap();

let add_new_key_data = AddKeyData { nonce: 1, msa_id: msa_id1, expiration: 10 };
let add_new_key_data = AddKeyData { msa_id: msa_id1, expiration: 10 };
let encode_data_new_key_data = wrap_binary_data(add_new_key_data.encode());
let signature: MultiSignature = key_pair1.sign(&encode_data_new_key_data).into();
assert_noop!(
Expand Down Expand Up @@ -1524,7 +1524,7 @@ fn add_removed_key_to_msa_pass() {

assert_ok!(Msa::delete_key_for_msa(msa_id1, &new_account1.into()));

let add_new_key_data = AddKeyData { nonce: 1, msa_id: msa_id2, expiration: 10 };
let add_new_key_data = AddKeyData { msa_id: msa_id2, expiration: 10 };
let encode_data_new_key_data = wrap_binary_data(add_new_key_data.encode());
let signature_owner: MultiSignature = key_pair2.sign(&encode_data_new_key_data).into();
let signature_new_key: MultiSignature = key_pair1.sign(&encode_data_new_key_data).into();
Expand Down Expand Up @@ -2101,8 +2101,7 @@ pub fn add_msa_key_replay_fails() {
let nonce = 1u32;
for tc in test_cases {
System::set_block_number(tc.current);
let add_new_key_data =
AddKeyData { nonce, msa_id: new_msa_id, expiration: tc.mortality };
let add_new_key_data = AddKeyData { msa_id: new_msa_id, expiration: tc.mortality };
let encode_data_new_key_data = wrap_binary_data(add_new_key_data.encode());
let (new_key_pair, _) = sr25519::Pair::generate();
let new_delegator_account = new_key_pair.public();
Expand Down
2 changes: 0 additions & 2 deletions pallets/msa/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ pub const EMPTY_FUNCTION: fn(MessageSourceId) -> DispatchResult = |_| Ok(());
pub struct AddKeyData {
/// Message Source Account identifier
pub msa_id: MessageSourceId,
/// A cryptographic nonce.
pub nonce: u32,
/// The block number at which the signed proof for add_public_key_to_msa expires.
pub expiration: BlockNumber,
}
Expand Down
56 changes: 28 additions & 28 deletions pallets/msa/src/weights.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,9 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Msa PublicKeyToMsaId (r:1 w:1)
// Storage: Msa PublicKeyCountForMsaId (r:1 w:1)
fn create(s: u32, ) -> Weight {
Weight::from_ref_time(50_141_000 as u64)
Weight::from_ref_time(50_067_000 as u64)
// Standard Error: 4_000
.saturating_add(Weight::from_ref_time(53_000 as u64).saturating_mul(s as u64))
.saturating_add(Weight::from_ref_time(56_000 as u64).saturating_mul(s as u64))
.saturating_add(T::DbWeight::get().reads(3 as u64))
.saturating_add(T::DbWeight::get().writes(3 as u64))
}
Expand All @@ -86,38 +86,38 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Schemas CurrentSchemaIdentifierMaximum (r:1 w:0)
// Storage: Msa DelegatorAndProviderToDelegation (r:1 w:1)
fn create_sponsored_account_with_delegation() -> Weight {
Weight::from_ref_time(102_749_000 as u64)
Weight::from_ref_time(101_957_000 as u64)
.saturating_add(T::DbWeight::get().reads(8 as u64))
.saturating_add(T::DbWeight::get().writes(5 as u64))
}
// Storage: Msa PublicKeyToMsaId (r:1 w:0)
// Storage: Msa DelegatorAndProviderToDelegation (r:1 w:1)
fn revoke_delegation_by_provider(s: u32, ) -> Weight {
Weight::from_ref_time(47_692_000 as u64)
// Standard Error: 4_000
.saturating_add(Weight::from_ref_time(94_000 as u64).saturating_mul(s as u64))
Weight::from_ref_time(45_478_000 as u64)
// Standard Error: 3_000
.saturating_add(Weight::from_ref_time(96_000 as u64).saturating_mul(s as u64))
.saturating_add(T::DbWeight::get().reads(2 as u64))
.saturating_add(T::DbWeight::get().writes(1 as u64))
}
// Storage: Msa PayloadSignatureRegistry (r:1 w:1)
// Storage: Msa PublicKeyToMsaId (r:2 w:1)
// Storage: Msa PublicKeyCountForMsaId (r:1 w:1)
fn add_public_key_to_msa() -> Weight {
Weight::from_ref_time(141_996_000 as u64)
Weight::from_ref_time(141_649_000 as u64)
.saturating_add(T::DbWeight::get().reads(4 as u64))
.saturating_add(T::DbWeight::get().writes(3 as u64))
}
// Storage: Msa PublicKeyToMsaId (r:2 w:1)
// Storage: Msa PublicKeyCountForMsaId (r:1 w:1)
fn delete_msa_public_key() -> Weight {
Weight::from_ref_time(28_480_000 as u64)
Weight::from_ref_time(28_617_000 as u64)
.saturating_add(T::DbWeight::get().reads(3 as u64))
.saturating_add(T::DbWeight::get().writes(2 as u64))
}
// Storage: Msa PublicKeyToMsaId (r:1 w:1)
// Storage: Msa PublicKeyCountForMsaId (r:1 w:1)
fn retire_msa() -> Weight {
Weight::from_ref_time(29_868_000 as u64)
Weight::from_ref_time(30_135_000 as u64)
.saturating_add(T::DbWeight::get().reads(2 as u64))
.saturating_add(T::DbWeight::get().writes(2 as u64))
}
Expand All @@ -127,28 +127,28 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Schemas CurrentSchemaIdentifierMaximum (r:1 w:0)
// Storage: Msa DelegatorAndProviderToDelegation (r:1 w:1)
fn grant_delegation() -> Weight {
Weight::from_ref_time(93_732_000 as u64)
Weight::from_ref_time(92_574_000 as u64)
.saturating_add(T::DbWeight::get().reads(6 as u64))
.saturating_add(T::DbWeight::get().writes(2 as u64))
}
// Storage: Msa PublicKeyToMsaId (r:1 w:0)
// Storage: Msa DelegatorAndProviderToDelegation (r:1 w:1)
fn revoke_delegation_by_delegator() -> Weight {
Weight::from_ref_time(25_188_000 as u64)
Weight::from_ref_time(24_773_000 as u64)
.saturating_add(T::DbWeight::get().reads(2 as u64))
.saturating_add(T::DbWeight::get().writes(1 as u64))
}
// Storage: Msa PublicKeyToMsaId (r:1 w:0)
// Storage: Msa ProviderToRegistryEntry (r:1 w:1)
fn create_provider() -> Weight {
Weight::from_ref_time(20_918_000 as u64)
Weight::from_ref_time(20_605_000 as u64)
.saturating_add(T::DbWeight::get().reads(2 as u64))
.saturating_add(T::DbWeight::get().writes(1 as u64))
}
fn on_initialize(m: u32, ) -> Weight {
Weight::from_ref_time(11_950_000 as u64)
Weight::from_ref_time(11_493_000 as u64)
// Standard Error: 0
.saturating_add(Weight::from_ref_time(2_000 as u64).saturating_mul(m as u64))
.saturating_add(Weight::from_ref_time(3_000 as u64).saturating_mul(m as u64))
}
}

Expand All @@ -158,9 +158,9 @@ impl WeightInfo for () {
// Storage: Msa PublicKeyToMsaId (r:1 w:1)
// Storage: Msa PublicKeyCountForMsaId (r:1 w:1)
fn create(s: u32, ) -> Weight {
Weight::from_ref_time(50_141_000 as u64)
Weight::from_ref_time(50_067_000 as u64)
// Standard Error: 4_000
.saturating_add(Weight::from_ref_time(53_000 as u64).saturating_mul(s as u64))
.saturating_add(Weight::from_ref_time(56_000 as u64).saturating_mul(s as u64))
.saturating_add(RocksDbWeight::get().reads(3 as u64))
.saturating_add(RocksDbWeight::get().writes(3 as u64))
}
Expand All @@ -172,38 +172,38 @@ impl WeightInfo for () {
// Storage: Schemas CurrentSchemaIdentifierMaximum (r:1 w:0)
// Storage: Msa DelegatorAndProviderToDelegation (r:1 w:1)
fn create_sponsored_account_with_delegation() -> Weight {
Weight::from_ref_time(102_749_000 as u64)
Weight::from_ref_time(101_957_000 as u64)
.saturating_add(RocksDbWeight::get().reads(8 as u64))
.saturating_add(RocksDbWeight::get().writes(5 as u64))
}
// Storage: Msa PublicKeyToMsaId (r:1 w:0)
// Storage: Msa DelegatorAndProviderToDelegation (r:1 w:1)
fn revoke_delegation_by_provider(s: u32, ) -> Weight {
Weight::from_ref_time(47_692_000 as u64)
// Standard Error: 4_000
.saturating_add(Weight::from_ref_time(94_000 as u64).saturating_mul(s as u64))
Weight::from_ref_time(45_478_000 as u64)
// Standard Error: 3_000
.saturating_add(Weight::from_ref_time(96_000 as u64).saturating_mul(s as u64))
.saturating_add(RocksDbWeight::get().reads(2 as u64))
.saturating_add(RocksDbWeight::get().writes(1 as u64))
}
// Storage: Msa PayloadSignatureRegistry (r:1 w:1)
// Storage: Msa PublicKeyToMsaId (r:2 w:1)
// Storage: Msa PublicKeyCountForMsaId (r:1 w:1)
fn add_public_key_to_msa() -> Weight {
Weight::from_ref_time(141_996_000 as u64)
Weight::from_ref_time(141_649_000 as u64)
.saturating_add(RocksDbWeight::get().reads(4 as u64))
.saturating_add(RocksDbWeight::get().writes(3 as u64))
}
// Storage: Msa PublicKeyToMsaId (r:2 w:1)
// Storage: Msa PublicKeyCountForMsaId (r:1 w:1)
fn delete_msa_public_key() -> Weight {
Weight::from_ref_time(28_480_000 as u64)
Weight::from_ref_time(28_617_000 as u64)
.saturating_add(RocksDbWeight::get().reads(3 as u64))
.saturating_add(RocksDbWeight::get().writes(2 as u64))
}
// Storage: Msa PublicKeyToMsaId (r:1 w:1)
// Storage: Msa PublicKeyCountForMsaId (r:1 w:1)
fn retire_msa() -> Weight {
Weight::from_ref_time(29_868_000 as u64)
Weight::from_ref_time(30_135_000 as u64)
.saturating_add(RocksDbWeight::get().reads(2 as u64))
.saturating_add(RocksDbWeight::get().writes(2 as u64))
}
Expand All @@ -213,27 +213,27 @@ impl WeightInfo for () {
// Storage: Schemas CurrentSchemaIdentifierMaximum (r:1 w:0)
// Storage: Msa DelegatorAndProviderToDelegation (r:1 w:1)
fn grant_delegation() -> Weight {
Weight::from_ref_time(93_732_000 as u64)
Weight::from_ref_time(92_574_000 as u64)
.saturating_add(RocksDbWeight::get().reads(6 as u64))
.saturating_add(RocksDbWeight::get().writes(2 as u64))
}
// Storage: Msa PublicKeyToMsaId (r:1 w:0)
// Storage: Msa DelegatorAndProviderToDelegation (r:1 w:1)
fn revoke_delegation_by_delegator() -> Weight {
Weight::from_ref_time(25_188_000 as u64)
Weight::from_ref_time(24_773_000 as u64)
.saturating_add(RocksDbWeight::get().reads(2 as u64))
.saturating_add(RocksDbWeight::get().writes(1 as u64))
}
// Storage: Msa PublicKeyToMsaId (r:1 w:0)
// Storage: Msa ProviderToRegistryEntry (r:1 w:1)
fn create_provider() -> Weight {
Weight::from_ref_time(20_918_000 as u64)
Weight::from_ref_time(20_605_000 as u64)
.saturating_add(RocksDbWeight::get().reads(2 as u64))
.saturating_add(RocksDbWeight::get().writes(1 as u64))
}
fn on_initialize(m: u32, ) -> Weight {
Weight::from_ref_time(11_950_000 as u64)
Weight::from_ref_time(11_493_000 as u64)
// Standard Error: 0
.saturating_add(Weight::from_ref_time(2_000 as u64).saturating_mul(m as u64))
.saturating_add(Weight::from_ref_time(3_000 as u64).saturating_mul(m as u64))
}
}
Loading

0 comments on commit 52d435b

Please sign in to comment.