diff --git a/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/workflows/record/SingleTransactionRecordBuilder.java b/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/workflows/record/SingleTransactionRecordBuilder.java index abd8f33f35fd..dd83bd474478 100644 --- a/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/workflows/record/SingleTransactionRecordBuilder.java +++ b/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/workflows/record/SingleTransactionRecordBuilder.java @@ -17,6 +17,9 @@ package com.hedera.node.app.spi.workflows.record; import com.hedera.hapi.node.base.ResponseCodeEnum; +import com.hedera.hapi.node.base.Transaction; +import com.hedera.hapi.node.transaction.SignedTransaction; +import com.hedera.hapi.node.transaction.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; /** @@ -39,4 +42,20 @@ public interface SingleTransactionRecordBuilder { * @return the builder */ SingleTransactionRecordBuilder status(@NonNull ResponseCodeEnum status); + + /** + * Convenience method to package as {@link TransactionBody} as a {@link Transaction} . + * + * @param body the transaction body + * @return the transaction + */ + static Transaction transactionWith(@NonNull TransactionBody body) { + final var bodyBytes = TransactionBody.PROTOBUF.toBytes(body); + final var signedTransaction = + SignedTransaction.newBuilder().bodyBytes(bodyBytes).build(); + final var signedTransactionBytes = SignedTransaction.PROTOBUF.toBytes(signedTransaction); + return Transaction.newBuilder() + .signedTransactionBytes(signedTransactionBytes) + .build(); + } } diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/ChildFinalizeContextImpl.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/ChildFinalizeContextImpl.java new file mode 100644 index 000000000000..817dd0af5c7a --- /dev/null +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/ChildFinalizeContextImpl.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hedera.node.app.workflows.handle; + +import static com.hedera.node.app.workflows.handle.TokenContextImpl.castRecordBuilder; +import static java.util.Objects.requireNonNull; + +import com.hedera.node.app.service.token.records.ChildFinalizeContext; +import com.hedera.node.app.workflows.dispatcher.ReadableStoreFactory; +import com.hedera.node.app.workflows.dispatcher.WritableStoreFactory; +import com.hedera.node.app.workflows.handle.record.SingleTransactionRecordBuilderImpl; +import edu.umd.cs.findbugs.annotations.NonNull; + +/** + * Standard implementation of {@link ChildFinalizeContext}. + */ +public class ChildFinalizeContextImpl implements ChildFinalizeContext { + private final ReadableStoreFactory readableStoreFactory; + private final WritableStoreFactory writableStoreFactory; + private final SingleTransactionRecordBuilderImpl recordBuilder; + + public ChildFinalizeContextImpl( + @NonNull final ReadableStoreFactory readableStoreFactory, + @NonNull final WritableStoreFactory writableStoreFactory, + @NonNull final SingleTransactionRecordBuilderImpl recordBuilder) { + this.readableStoreFactory = requireNonNull(readableStoreFactory); + this.writableStoreFactory = requireNonNull(writableStoreFactory); + this.recordBuilder = requireNonNull(recordBuilder); + } + + @NonNull + @Override + public T readableStore(@NonNull Class storeInterface) { + requireNonNull(storeInterface, "storeInterface must not be null"); + return readableStoreFactory.getStore(storeInterface); + } + + @NonNull + @Override + public T writableStore(@NonNull Class storeInterface) { + requireNonNull(storeInterface, "storeInterface must not be null"); + return writableStoreFactory.getStore(storeInterface); + } + + @NonNull + @Override + public T userTransactionRecordBuilder(@NonNull final Class recordBuilderClass) { + requireNonNull(recordBuilderClass, "recordBuilderClass must not be null"); + return castRecordBuilder(recordBuilder, recordBuilderClass); + } +} diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/HandleContextImpl.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/HandleContextImpl.java index cf119910c8e1..697d34be355e 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/HandleContextImpl.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/HandleContextImpl.java @@ -44,7 +44,9 @@ import com.hedera.node.app.fees.NoOpFeeCalculator; import com.hedera.node.app.ids.EntityIdService; import com.hedera.node.app.ids.WritableEntityIdStore; +import com.hedera.node.app.service.token.TokenService; import com.hedera.node.app.service.token.api.TokenServiceApi; +import com.hedera.node.app.service.token.records.ChildRecordFinalizer; import com.hedera.node.app.services.ServiceScopeLookup; import com.hedera.node.app.signature.DelegateKeyVerifier; import com.hedera.node.app.signature.KeyVerifier; @@ -126,6 +128,7 @@ public class HandleContextImpl implements HandleContext, FeeContext { private final ExchangeRateManager exchangeRateManager; private final Authorizer authorizer; private final SolvencyPreCheck solvencyPreCheck; + private final ChildRecordFinalizer childRecordFinalizer; private ReadableStoreFactory readableStoreFactory; private AttributeValidator attributeValidator; @@ -135,26 +138,27 @@ public class HandleContextImpl implements HandleContext, FeeContext { /** * Constructs a {@link HandleContextImpl}. * - * @param txBody The {@link TransactionBody} of the transaction - * @param functionality The {@link HederaFunctionality} of the transaction - * @param signatureMapSize The size of the {@link com.hedera.hapi.node.base.SignatureMap} of the transaction - * @param payer The {@link AccountID} of the payer - * @param payerKey The {@link Key} of the payer - * @param networkInfo The {@link NetworkInfo} of the network - * @param category The {@link TransactionCategory} of the transaction (either user, preceding, or child) - * @param recordBuilder The main {@link SingleTransactionRecordBuilderImpl} - * @param stack The {@link SavepointStackImpl} used to manage savepoints - * @param configuration The current {@link Configuration} - * @param verifier The {@link KeyVerifier} used to verify signatures and hollow accounts - * @param recordListBuilder The {@link RecordListBuilder} used to build the record stream - * @param checker The {@link TransactionChecker} used to check dispatched transaction - * @param dispatcher The {@link TransactionDispatcher} used to dispatch child transactions - * @param serviceScopeLookup The {@link ServiceScopeLookup} used to look up the scope of a service - * @param feeManager The {@link FeeManager} used to convert usage into fees - * @param exchangeRateManager The {@link ExchangeRateManager} used to obtain exchange rate information + * @param txBody The {@link TransactionBody} of the transaction + * @param functionality The {@link HederaFunctionality} of the transaction + * @param signatureMapSize The size of the {@link com.hedera.hapi.node.base.SignatureMap} of the transaction + * @param payer The {@link AccountID} of the payer + * @param payerKey The {@link Key} of the payer + * @param networkInfo The {@link NetworkInfo} of the network + * @param category The {@link TransactionCategory} of the transaction (either user, preceding, or child) + * @param recordBuilder The main {@link SingleTransactionRecordBuilderImpl} + * @param stack The {@link SavepointStackImpl} used to manage savepoints + * @param configuration The current {@link Configuration} + * @param verifier The {@link KeyVerifier} used to verify signatures and hollow accounts + * @param recordListBuilder The {@link RecordListBuilder} used to build the record stream + * @param checker The {@link TransactionChecker} used to check dispatched transaction + * @param dispatcher The {@link TransactionDispatcher} used to dispatch child transactions + * @param serviceScopeLookup The {@link ServiceScopeLookup} used to look up the scope of a service + * @param feeManager The {@link FeeManager} used to convert usage into fees + * @param exchangeRateManager The {@link ExchangeRateManager} used to obtain exchange rate information * @param userTransactionConsensusTime The consensus time of the user transaction, not any child transactions - * @param authorizer The {@link Authorizer} used to authorize the transaction - * @param solvencyPreCheck The {@link SolvencyPreCheck} used to validate if the account is able to pay the fees + * @param authorizer The {@link Authorizer} used to authorize the transaction + * @param solvencyPreCheck The {@link SolvencyPreCheck} used to validate if the account is able to pay the fees + * @param childRecordFinalizer The {@link ChildRecordFinalizer} used to finalize child records */ public HandleContextImpl( @NonNull final TransactionBody txBody, @@ -178,7 +182,8 @@ public HandleContextImpl( @NonNull final ExchangeRateManager exchangeRateManager, @NonNull final Instant userTransactionConsensusTime, @NonNull final Authorizer authorizer, - @NonNull final SolvencyPreCheck solvencyPreCheck) { + @NonNull final SolvencyPreCheck solvencyPreCheck, + @NonNull final ChildRecordFinalizer childRecordFinalizer) { this.txBody = requireNonNull(txBody, "txBody must not be null"); this.functionality = requireNonNull(functionality, "functionality must not be null"); this.payer = requireNonNull(payer, "payer must not be null"); @@ -199,6 +204,7 @@ public HandleContextImpl( this.userTransactionConsensusTime = requireNonNull(userTransactionConsensusTime, "userTransactionConsensusTime must not be null"); this.authorizer = requireNonNull(authorizer, "authorizer must not be null"); + this.childRecordFinalizer = requireNonNull(childRecordFinalizer, "childRecordFinalizer must not be null"); final var serviceScope = serviceScopeLookup.getServiceName(txBody); this.writableStoreFactory = new WritableStoreFactory(stack, serviceScope); @@ -689,11 +695,15 @@ private void dispatchSyntheticTxn( exchangeRateManager, userTransactionConsensusTime, authorizer, - solvencyPreCheck); + solvencyPreCheck, + childRecordFinalizer); try { dispatcher.dispatchHandle(childContext); childRecordBuilder.status(ResponseCodeEnum.SUCCESS); + final var finalizeContext = new ChildFinalizeContextImpl( + readableStoreFactory, new WritableStoreFactory(childStack, TokenService.NAME), childRecordBuilder); + childRecordFinalizer.finalizeChildRecord(finalizeContext); childStack.commitFullStack(); } catch (final HandleException e) { childRecordBuilder.status(e.getStatus()); diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/HandleWorkflow.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/HandleWorkflow.java index 42635369bc3b..8409266bfdfe 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/HandleWorkflow.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/HandleWorkflow.java @@ -57,6 +57,7 @@ import com.hedera.node.app.records.BlockRecordManager; import com.hedera.node.app.service.token.ReadableAccountStore; import com.hedera.node.app.service.token.api.TokenServiceApi; +import com.hedera.node.app.service.token.records.ChildRecordFinalizer; import com.hedera.node.app.service.token.records.CryptoUpdateRecordBuilder; import com.hedera.node.app.service.token.records.ParentRecordFinalizer; import com.hedera.node.app.services.ServiceScopeLookup; @@ -137,6 +138,7 @@ public class HandleWorkflow { private final StakingPeriodTimeHook stakingPeriodTimeHook; private final FeeManager feeManager; private final ExchangeRateManager exchangeRateManager; + private final ChildRecordFinalizer childRecordFinalizer; private final ParentRecordFinalizer transactionFinalizer; private final SystemFileUpdateFacility systemFileUpdateFacility; private final DualStateUpdateFacility dualStateUpdateFacility; @@ -160,6 +162,7 @@ public HandleWorkflow( @NonNull final StakingPeriodTimeHook stakingPeriodTimeHook, @NonNull final FeeManager feeManager, @NonNull final ExchangeRateManager exchangeRateManager, + @NonNull final ChildRecordFinalizer childRecordFinalizer, @NonNull final ParentRecordFinalizer transactionFinalizer, @NonNull final SystemFileUpdateFacility systemFileUpdateFacility, @NonNull final DualStateUpdateFacility dualStateUpdateFacility, @@ -180,6 +183,7 @@ public HandleWorkflow( this.stakingPeriodTimeHook = requireNonNull(stakingPeriodTimeHook, "stakingPeriodTimeHook must not be null"); this.feeManager = requireNonNull(feeManager, "feeManager must not be null"); this.exchangeRateManager = requireNonNull(exchangeRateManager, "exchangeRateManager must not be null"); + this.childRecordFinalizer = childRecordFinalizer; this.transactionFinalizer = requireNonNull(transactionFinalizer, "transactionFinalizer must not be null"); this.systemFileUpdateFacility = requireNonNull(systemFileUpdateFacility, "systemFileUpdateFacility must not be null"); @@ -376,7 +380,8 @@ private void handleUserTransaction( exchangeRateManager, consensusNow, authorizer, - solvencyPreCheck); + solvencyPreCheck, + childRecordFinalizer); // Calculate the fee fees = dispatcher.dispatchComputeFees(context); @@ -487,7 +492,8 @@ private void handleUserTransaction( } catch (final HandleException e) { // In case of a ContractCall when it reverts, the gas charged should not be rolled back rollback(e.shouldRollbackStack(), e.getStatus(), stack, recordListBuilder); - if (!hasWaivedFees) { + if (!hasWaivedFees && e.shouldRollbackStack()) { + // Only re-charge fees if we rolled back the stack feeAccumulator.chargeFees(payer, creator.accountId(), fees); } } diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/TokenContextImpl.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/TokenContextImpl.java index ef36ab6e8e8a..0c6fd818ba55 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/TokenContextImpl.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/TokenContextImpl.java @@ -84,6 +84,11 @@ public T userTransactionRecordBuilder(@NonNull Class recordBuilderClass) return castRecordBuilder(recordListBuilder.userTransactionRecordBuilder(), recordBuilderClass); } + @Override + public boolean hasChildRecords() { + return !recordListBuilder.childRecordBuilders().isEmpty(); + } + @Override public void forEachChildRecord(@NonNull Class recordBuilderClass, @NonNull Consumer consumer) { requireNonNull(consumer, "consumer must not be null"); @@ -105,7 +110,7 @@ public T addUncheckedPrecedingChildRecordBuilder(@NonNull Class recordBui return castRecordBuilder(result, recordBuilderClass); } - private static T castRecordBuilder( + static T castRecordBuilder( @NonNull final SingleTransactionRecordBuilderImpl recordBuilder, @NonNull final Class recordBuilderClass) { if (!recordBuilderClass.isInstance(recordBuilder)) { diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/record/RecordListBuilder.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/record/RecordListBuilder.java index b58869c1eb0d..1409e3fb93bb 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/record/RecordListBuilder.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/record/RecordListBuilder.java @@ -264,9 +264,9 @@ private SingleTransactionRecordBuilderImpl doAddChild( ? userTxnRecordBuilder.consensusNow() : childRecordBuilders.get(childRecordBuilders.size() - 1).consensusNow(); final var consensusNow = prevConsensusNow.plusNanos(1L); + // Note we do not repeat exchange rates for child transactions final var recordBuilder = new SingleTransactionRecordBuilderImpl(consensusNow, reversingBehavior, customizer) - .parentConsensus(parentConsensusTimestamp) - .exchangeRate(userTxnRecordBuilder.exchangeRate()); + .parentConsensus(parentConsensusTimestamp); if (!customizer.shouldSuppressRecord()) { childRecordBuilders.add(recordBuilder); } diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/record/SingleTransactionRecordBuilderImpl.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/record/SingleTransactionRecordBuilderImpl.java index 6f697ad20463..66e3902720b4 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/record/SingleTransactionRecordBuilderImpl.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/handle/record/SingleTransactionRecordBuilderImpl.java @@ -368,6 +368,7 @@ public SingleTransactionRecordBuilderImpl transactionID(@NonNull final Transacti /** * When we update nonce on the record, we need to update the body as well with the same transactionID. + * * @return the builder */ @NonNull @@ -382,13 +383,7 @@ public SingleTransactionRecordBuilderImpl syncBodyIdFromRecordId() { .copyBuilder() .transactionID(newTransactionID) .build(); - final var newBodyBytes = TransactionBody.PROTOBUF.toBytes(body); - final var newSignedTransaction = - SignedTransaction.newBuilder().bodyBytes(newBodyBytes).build(); - final var signedTransactionBytes = SignedTransaction.PROTOBUF.toBytes(newSignedTransaction); - this.transaction = Transaction.newBuilder() - .signedTransactionBytes(signedTransactionBytes) - .build(); + this.transaction = SingleTransactionRecordBuilder.transactionWith(body); return this; } catch (Exception e) { throw new RuntimeException(e); @@ -515,6 +510,11 @@ public SingleTransactionRecordBuilderImpl tokenTransferLists( return this; } + @Override + public List tokenTransferLists() { + return tokenTransferLists; + } + /** * Adds a tokenTransferList. * @@ -925,6 +925,11 @@ public SingleTransactionRecordBuilderImpl serialNumbers(@NonNull final List serialNumbers() { + return serialNumbers; + } + /** * Adds a serialNumber to the receipt. * diff --git a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/HandleContextImplTest.java b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/HandleContextImplTest.java index 06ecf97fd523..b5e246c7032f 100644 --- a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/HandleContextImplTest.java +++ b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/HandleContextImplTest.java @@ -60,6 +60,7 @@ import com.hedera.node.app.service.token.ReadableAccountStore; import com.hedera.node.app.service.token.TokenService; import com.hedera.node.app.service.token.impl.WritableAccountStore; +import com.hedera.node.app.service.token.records.ChildRecordFinalizer; import com.hedera.node.app.service.token.records.CryptoCreateRecordBuilder; import com.hedera.node.app.services.ServiceScopeLookup; import com.hedera.node.app.signature.KeyVerifier; @@ -173,6 +174,9 @@ class HandleContextImplTest extends StateTestBase implements Scenarios { @Mock private SolvencyPreCheck solvencyPreCheck; + @Mock + private ChildRecordFinalizer childRecordFinalizer; + @Mock private SelfNodeInfo selfNodeInfo; @@ -218,7 +222,8 @@ private HandleContextImpl createContext(final TransactionBody txBody) { exchangeRateManager, DEFAULT_CONSENSUS_NOW, authorizer, - solvencyPreCheck); + solvencyPreCheck, + childRecordFinalizer); } @SuppressWarnings("ConstantConditions") @@ -246,7 +251,8 @@ void testConstructorWithInvalidArguments() { exchangeRateManager, DEFAULT_CONSENSUS_NOW, authorizer, - solvencyPreCheck + solvencyPreCheck, + childRecordFinalizer }; final var constructor = HandleContextImpl.class.getConstructors()[0]; @@ -311,7 +317,8 @@ void setUp() { exchangeRateManager, DEFAULT_CONSENSUS_NOW, authorizer, - solvencyPreCheck); + solvencyPreCheck, + childRecordFinalizer); } @Test @@ -827,7 +834,8 @@ private HandleContextImpl createContext(final TransactionBody txBody, final Tran exchangeRateManager, DEFAULT_CONSENSUS_NOW, authorizer, - solvencyPreCheck); + solvencyPreCheck, + childRecordFinalizer); } @SuppressWarnings("ConstantConditions") diff --git a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/HandleWorkflowTest.java b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/HandleWorkflowTest.java index 4010a7d093ef..1b437f189772 100644 --- a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/HandleWorkflowTest.java +++ b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/handle/HandleWorkflowTest.java @@ -47,6 +47,7 @@ import com.hedera.node.app.records.BlockRecordManager; import com.hedera.node.app.service.token.TokenService; import com.hedera.node.app.service.token.impl.WritableAccountStore; +import com.hedera.node.app.service.token.records.ChildRecordFinalizer; import com.hedera.node.app.service.token.records.ParentRecordFinalizer; import com.hedera.node.app.services.ServiceScopeLookup; import com.hedera.node.app.signature.SignatureExpander; @@ -192,6 +193,9 @@ private static PreHandleResult createPreHandleResult(@NonNull Status status, @No @Mock private ParentRecordFinalizer finalizer; + @Mock + private ChildRecordFinalizer childRecordFinalizer; + @Mock(strictness = LENIENT) private SystemFileUpdateFacility systemFileUpdateFacility; @@ -278,6 +282,7 @@ void setup() throws PreCheckException { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -304,6 +309,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -326,6 +332,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -348,6 +355,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -370,6 +378,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -392,6 +401,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -414,6 +424,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -436,6 +447,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -458,6 +470,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -480,6 +493,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -502,6 +516,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -524,6 +539,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -546,6 +562,7 @@ void testContructorWithInvalidArguments() { null, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -568,6 +585,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, null, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -590,6 +608,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, null, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -612,6 +631,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, null, systemFileUpdateFacility, dualStateUpdateFacility, @@ -634,6 +654,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, null, dualStateUpdateFacility, @@ -656,6 +677,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, null, @@ -678,6 +700,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -700,6 +723,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, @@ -722,6 +746,7 @@ void testContructorWithInvalidArguments() { stakingPeriodTimeHook, feeManager, exchangeRateManager, + childRecordFinalizer, finalizer, systemFileUpdateFacility, dualStateUpdateFacility, diff --git a/hedera-node/hedera-app/src/xtest/java/common/BaseScaffoldingModule.java b/hedera-node/hedera-app/src/xtest/java/common/BaseScaffoldingModule.java index 2ba0a90cf35b..3bc126eeeaab 100644 --- a/hedera-node/hedera-app/src/xtest/java/common/BaseScaffoldingModule.java +++ b/hedera-node/hedera-app/src/xtest/java/common/BaseScaffoldingModule.java @@ -40,8 +40,10 @@ import com.hedera.node.app.service.mono.config.HederaNumbers; import com.hedera.node.app.service.token.CryptoSignatureWaivers; import com.hedera.node.app.service.token.impl.CryptoSignatureWaiversImpl; +import com.hedera.node.app.service.token.impl.handlers.FinalizeChildRecordHandler; import com.hedera.node.app.service.token.impl.handlers.staking.StakeRewardCalculator; import com.hedera.node.app.service.token.impl.handlers.staking.StakeRewardCalculatorImpl; +import com.hedera.node.app.service.token.records.ChildRecordFinalizer; import com.hedera.node.app.services.ServiceScopeLookup; import com.hedera.node.app.signature.DefaultKeyVerifier; import com.hedera.node.app.spi.UnknownHederaFunctionality; @@ -188,6 +190,10 @@ static ConfigProvider provideConfigProvider(@NonNull final Configuration configu return () -> new VersionedConfigImpl(configuration, 1L); } + @Binds + @Singleton + ChildRecordFinalizer provideChildRecordFinalizer(@NonNull FinalizeChildRecordHandler childRecordFinalizer); + @Provides @Singleton static BiFunction provideQueryContextFactory( @@ -220,7 +226,8 @@ static Function provideHandleContextCreator( @NonNull final HederaState state, @NonNull final ExchangeRateManager exchangeRateManager, @NonNull final FeeManager feeManager, - @NonNull final Authorizer authorizer) { + @NonNull final Authorizer authorizer, + @NonNull final ChildRecordFinalizer childRecordFinalizer) { final var consensusTime = Instant.now(); final var recordListBuilder = new RecordListBuilder(consensusTime); final var parentRecordBuilder = recordListBuilder.userTransactionRecordBuilder(); @@ -257,7 +264,8 @@ static Function provideHandleContextCreator( exchangeRateManager, consensusTime, authorizer, - solvencyPreCheck); + solvencyPreCheck, + childRecordFinalizer); }; } } diff --git a/hedera-node/hedera-app/src/xtest/java/contract/AbstractContractXTest.java b/hedera-node/hedera-app/src/xtest/java/contract/AbstractContractXTest.java index 538a8d3c4163..b6e61571ce8b 100644 --- a/hedera-node/hedera-app/src/xtest/java/contract/AbstractContractXTest.java +++ b/hedera-node/hedera-app/src/xtest/java/contract/AbstractContractXTest.java @@ -26,6 +26,7 @@ import static contract.XTestConstants.SENDER_ID; import static contract.XTestConstants.TYPICAL_SENDER_ACCOUNT; import static contract.XTestConstants.TYPICAL_SENDER_CONTRACT; +import static java.util.Objects.requireNonNull; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.BDDMockito.given; @@ -296,9 +297,10 @@ private void runHtsCallAndExpect( given(frame.getMessageFrameStack()).willReturn(stack); given(addressChecks.hasParentDelegateCall(frame)).willReturn(requiresDelegatePermission); - final var call = callAttemptFactory.createCallFrom(input, frame); + final var attempt = callAttemptFactory.createCallAttemptFrom(input, frame); + final var call = attempt.asExecutableCall(); - final var pricedResult = call.execute(frame); + final var pricedResult = requireNonNull(call).execute(frame); resultAssertions.accept(pricedResult); // Note that committing a reverted calls should have no effect on state ((SavepointStackImpl) context.savepointStack()).commitFullStack(); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/processors/ProcessorModule.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/processors/ProcessorModule.java index 73f74d856a1b..a65cac60b238 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/processors/ProcessorModule.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/processors/ProcessorModule.java @@ -17,7 +17,7 @@ package com.hedera.node.app.service.contract.impl.exec.processors; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.ExchangeRateSystemContract.EXCHANGE_RATE_SYSTEM_CONTRACT_ADDRESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HtsSystemContract.HTS_PRECOMPILE_ADDRESS; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HtsSystemContract.HTS_EVM_ADDRESS; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.PrngSystemContract.PRNG_PRECOMPILE_ADDRESS; import static java.util.Map.entry; import static java.util.Objects.requireNonNull; @@ -65,7 +65,7 @@ static Map provideHederaSystemContracts( @NonNull final ExchangeRateSystemContract exchangeRateSystemContract, @NonNull final PrngSystemContract prngSystemContract) { return Map.ofEntries( - entry(Address.fromHexString(HTS_PRECOMPILE_ADDRESS), requireNonNull(htsSystemContract)), + entry(Address.fromHexString(HTS_EVM_ADDRESS), requireNonNull(htsSystemContract)), entry( Address.fromHexString(EXCHANGE_RATE_SYSTEM_CONTRACT_ADDRESS), requireNonNull(exchangeRateSystemContract)), diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/HandleSystemContractOperations.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/HandleSystemContractOperations.java index 65103df4ceab..2865a3e52309 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/HandleSystemContractOperations.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/HandleSystemContractOperations.java @@ -16,27 +16,21 @@ package com.hedera.node.app.service.contract.impl.exec.scope; -import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; import static com.hedera.node.app.spi.workflows.HandleContext.TransactionCategory.CHILD; +import static com.hedera.node.app.spi.workflows.record.SingleTransactionRecordBuilder.transactionWith; import static java.util.Objects.requireNonNull; import com.hedera.hapi.node.base.AccountID; import com.hedera.hapi.node.base.Key; -import com.hedera.hapi.node.base.NftID; import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.contract.ContractFunctionResult; -import com.hedera.hapi.node.state.token.Account; -import com.hedera.hapi.node.state.token.Nft; -import com.hedera.hapi.node.state.token.Token; import com.hedera.hapi.node.transaction.ExchangeRate; import com.hedera.hapi.node.transaction.TransactionBody; import com.hedera.node.app.service.contract.impl.annotations.TransactionScope; import com.hedera.node.app.service.contract.impl.records.ContractCallRecordBuilder; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.ResultStatus; import com.hedera.node.app.spi.workflows.HandleContext; import edu.umd.cs.findbugs.annotations.NonNull; -import edu.umd.cs.findbugs.annotations.Nullable; import java.util.function.Predicate; import javax.inject.Inject; @@ -56,35 +50,6 @@ public HandleSystemContractOperations(@NonNull final HandleContext context) { this.context = requireNonNull(context); } - /** - * {@inheritDoc} - */ - @Override - public @Nullable Nft getNftAndExternalizeResult( - @NonNull final NftID id, - final long callingContractNumber, - @NonNull final ResultTranslator translator) { - throw new AssertionError("Not implemented"); - } - - /** - * {@inheritDoc} - */ - @Override - public @Nullable Token getTokenAndExternalizeResult( - final long number, final long callingContractNumber, @NonNull final ResultTranslator translator) { - throw new AssertionError("Not implemented"); - } - - /** - * {@inheritDoc} - */ - @Override - public @Nullable Account getAccountAndExternalizeResult( - final long number, final long callingContractNumber, @NonNull final ResultTranslator translator) { - throw new AssertionError("Not implemented"); - } - /** * {@inheritDoc} */ @@ -111,19 +76,28 @@ public HandleSystemContractOperations(@NonNull final HandleContext context) { syntheticBody, recordBuilderClass, activeSignatureTestWith(strategy), syntheticPayerId, CHILD); } + @Override + public ContractCallRecordBuilder externalizePreemptedDispatch( + @NonNull final TransactionBody syntheticBody, @NonNull final ResponseCodeEnum preemptingStatus) { + requireNonNull(syntheticBody); + requireNonNull(preemptingStatus); + + return context.addChildRecordBuilder(ContractCallRecordBuilder.class) + .transaction(transactionWith(syntheticBody)) + .status(preemptingStatus); + } + /** * {@inheritDoc} */ @Override public void externalizeResult( - @NonNull final ContractFunctionResult result, - @NonNull final ResultStatus status, - @NonNull final ResponseCodeEnum responseStatus) { + @NonNull final ContractFunctionResult result, @NonNull final ResponseCodeEnum responseStatus) { final var childRecordBuilder = context.addChildRecordBuilder(ContractCallRecordBuilder.class); childRecordBuilder .transaction(Transaction.DEFAULT) .contractID(result.contractID()) - .status(status == ResultStatus.IS_ERROR ? responseStatus : SUCCESS) + .status(responseStatus) .contractCallResult(result); } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/QuerySystemContractOperations.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/QuerySystemContractOperations.java index 0b903d09c5b1..87d9b006fc93 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/QuerySystemContractOperations.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/QuerySystemContractOperations.java @@ -18,19 +18,14 @@ import com.hedera.hapi.node.base.AccountID; import com.hedera.hapi.node.base.Key; -import com.hedera.hapi.node.base.NftID; import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.contract.ContractFunctionResult; -import com.hedera.hapi.node.state.token.Account; -import com.hedera.hapi.node.state.token.Nft; -import com.hedera.hapi.node.state.token.Token; import com.hedera.hapi.node.transaction.ExchangeRate; import com.hedera.hapi.node.transaction.TransactionBody; import com.hedera.node.app.service.contract.impl.annotations.QueryScope; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.ResultStatus; +import com.hedera.node.app.service.contract.impl.records.ContractCallRecordBuilder; import com.hedera.node.app.spi.workflows.QueryContext; import edu.umd.cs.findbugs.annotations.NonNull; -import edu.umd.cs.findbugs.annotations.Nullable; import java.time.Instant; import java.util.function.Predicate; import javax.inject.Inject; @@ -52,35 +47,6 @@ public QuerySystemContractOperations(@NonNull final QueryContext queryContext) { this.context = queryContext; } - /** - * {@inheritDoc} - */ - @Override - public @Nullable Nft getNftAndExternalizeResult( - @NonNull final NftID id, - final long callingContractNumber, - @NonNull final ResultTranslator translator) { - throw new UnsupportedOperationException("Cannot get Nft and externalize result"); - } - - /** - * {@inheritDoc} - */ - @Override - public @Nullable Token getTokenAndExternalizeResult( - final long number, final long callingContractNumber, @NonNull final ResultTranslator translator) { - throw new UnsupportedOperationException("Cannot get fungible token and externalize result"); - } - - /** - * {@inheritDoc} - */ - @Override - public @Nullable Account getAccountAndExternalizeResult( - final long number, final long callingContractNumber, @NonNull final ResultTranslator translator) { - throw new UnsupportedOperationException("Cannot get account and externalize result"); - } - /** * {@inheritDoc} */ @@ -93,6 +59,12 @@ public QuerySystemContractOperations(@NonNull final QueryContext queryContext) { throw new UnsupportedOperationException("Cannot dispatch synthetic transaction"); } + @Override + public ContractCallRecordBuilder externalizePreemptedDispatch( + @NonNull final TransactionBody syntheticBody, @NonNull final ResponseCodeEnum preemptingStatus) { + throw new UnsupportedOperationException("Cannot externalize preempted dispatch"); + } + /** * {@inheritDoc} */ @@ -106,9 +78,7 @@ public QuerySystemContractOperations(@NonNull final QueryContext queryContext) { */ @Override public void externalizeResult( - @NonNull final ContractFunctionResult result, - @NonNull final ResultStatus status, - @NonNull final ResponseCodeEnum responseStatus) { + @NonNull final ContractFunctionResult result, @NonNull final ResponseCodeEnum responseStatus) { // no-op } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/SystemContractOperations.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/SystemContractOperations.java index 67cd1fbc944b..8f523dbeb647 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/SystemContractOperations.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/scope/SystemContractOperations.java @@ -18,62 +18,15 @@ import com.hedera.hapi.node.base.AccountID; import com.hedera.hapi.node.base.Key; -import com.hedera.hapi.node.base.NftID; import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.contract.ContractFunctionResult; -import com.hedera.hapi.node.state.token.Account; -import com.hedera.hapi.node.state.token.Nft; -import com.hedera.hapi.node.state.token.Token; import com.hedera.hapi.node.transaction.ExchangeRate; import com.hedera.hapi.node.transaction.TransactionBody; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.ResultStatus; +import com.hedera.node.app.service.contract.impl.records.ContractCallRecordBuilder; import edu.umd.cs.findbugs.annotations.NonNull; -import edu.umd.cs.findbugs.annotations.Nullable; import java.util.function.Predicate; public interface SystemContractOperations { - /** - * Returns the {@link Nft} with the given id, and also externalizes the result of the state read via a record whose - * (1) origin is a given contract number and (2) result is derived from the read state via a given - * {@link ResultTranslator}. - * - * @param id the NFT id - * @param callingContractNumber the number of the contract that is calling this method - * @param translator the {@link ResultTranslator} that derives the record result from the read state - * @return the NFT, or {@code null} if no such NFT exists - */ - @Nullable - Nft getNftAndExternalizeResult( - @NonNull NftID id, long callingContractNumber, @NonNull ResultTranslator translator); - - /** - * Returns the {@link Token} with the given number, and also externalizes the result of the state read via a record - * whose (1) origin is a given contract number and (2) result is derived from the read state via a given - * {@link ResultTranslator}. - * - * @param number the token number - * @param callingContractNumber the number of the contract that is calling this method - * @param translator the {@link ResultTranslator} that derives the record result from the read state - * @return the token, or {@code null} if no such token exists - */ - @Nullable - Token getTokenAndExternalizeResult( - long number, long callingContractNumber, @NonNull ResultTranslator translator); - - /** - * Returns the {@link Account} with the given number, and also externalizes the result of the state read via a - * record whose (1) origin is a given contract number and (2) result is derived from the read state via a given - * {@link ResultTranslator}. - * - * @param number the account number - * @param callingContractNumber the number of the contract that is calling this method - * @param translator the {@link ResultTranslator} that derives the record result from the read state - * @return the account, or {@code null} if no such account exists - */ - @Nullable - Account getAccountAndExternalizeResult( - long number, long callingContractNumber, @NonNull ResultTranslator translator); - /** * Attempts to dispatch the given {@code syntheticTransaction} in the context of the current * {@link HandleHederaOperations}, performing signature verification with priority given to the included @@ -95,6 +48,17 @@ T dispatch( @NonNull AccountID syntheticPayerId, @NonNull Class recordBuilderClass); + /** + * Externalizes the preemption of the given {@code syntheticTransaction} hat would have otherwise been + * dispatched in the context of the current {@link HandleHederaOperations}. + * + * @param syntheticBody the preempted dispatch + * @param preemptingStatus the status code causing the preemption + * @return the record of the preemption + */ + ContractCallRecordBuilder externalizePreemptedDispatch( + @NonNull TransactionBody syntheticBody, @NonNull ResponseCodeEnum preemptingStatus); + /** * Returns a {@link Predicate} that tests whether the given {@link Key} is active based on the * given verification strategy. @@ -109,12 +73,9 @@ T dispatch( * Attempts to create a child record of the current record, with the given {@code result} * * @param result contract function result - * @param status whether the result is success or an error */ void externalizeResult( - @NonNull final ContractFunctionResult result, - @NonNull final ResultStatus status, - @NonNull final ResponseCodeEnum responseStatus); + @NonNull final ContractFunctionResult result, @NonNull final ResponseCodeEnum responseStatus); /** * Returns the {@Link ExchangeRate} for the current consensus time. This will enable the translation from hbars diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/ExchangeRateSystemContract.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/ExchangeRateSystemContract.java index b7f8a6595967..3f0aad04f2c9 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/ExchangeRateSystemContract.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/ExchangeRateSystemContract.java @@ -70,11 +70,12 @@ public FullResult computeFully(@NonNull Bytes input, @NonNull MessageFrame messa default -> null; }; requireNonNull(result); - return new FullResult(PrecompileContractResult.success(result), gasRequirement); + return new FullResult(PrecompileContractResult.success(result), gasRequirement, null); } catch (Exception ignore) { return new FullResult( PrecompileContractResult.halt(Bytes.EMPTY, Optional.of(ExceptionalHaltReason.INVALID_OPERATION)), - gasRequirement); + gasRequirement, + null); } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/FullResult.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/FullResult.java new file mode 100644 index 000000000000..e34ae335dffb --- /dev/null +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/FullResult.java @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hedera.node.app.service.contract.impl.exec.systemcontracts; + +import static com.hedera.hapi.node.base.ResponseCodeEnum.NOT_SUPPORTED; +import static java.util.Objects.requireNonNull; + +import com.hedera.hapi.node.base.ResponseCodeEnum; +import com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes; +import com.hedera.node.app.service.contract.impl.records.ContractCallRecordBuilder; +import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.Nullable; +import java.nio.ByteBuffer; +import java.util.Optional; +import org.apache.tuweni.bytes.Bytes; +import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; +import org.hyperledger.besu.evm.precompile.PrecompiledContract; + +/** + * Represents the result of executing a Hedera system contract. + * + * @param result the result of the computation + * @param gasRequirement the gas requirement of the computation + * @param recordBuilder the record builder, if any, generated as a side effect of the computation + */ +public record FullResult( + @NonNull PrecompiledContract.PrecompileContractResult result, + long gasRequirement, + @Nullable ContractCallRecordBuilder recordBuilder) { + public FullResult { + requireNonNull(result); + } + + public Bytes output() { + return result.getOutput(); + } + + public boolean isRefundGas() { + return result.isRefundGas(); + } + + public static FullResult revertResult(@NonNull final ResponseCodeEnum reason, final long gasRequirement) { + requireNonNull(reason); + return new FullResult( + PrecompiledContract.PrecompileContractResult.revert( + Bytes.wrap(reason.protoName().getBytes())), + gasRequirement, + null); + } + + public static FullResult revertResult(@NonNull Bytes reason, final long gasRequirement) { + requireNonNull(reason); + return new FullResult(PrecompiledContract.PrecompileContractResult.revert(reason), gasRequirement, null); + } + + public static FullResult revertResult( + @NonNull final ContractCallRecordBuilder recordBuilder, final long gasRequirement) { + requireNonNull(recordBuilder); + return new FullResult( + PrecompiledContract.PrecompileContractResult.revert( + ReturnTypes.tuweniEncodedRc(recordBuilder.status())), + gasRequirement, + recordBuilder); + } + + public static FullResult haltResult( + @NonNull final ContractCallRecordBuilder recordBuilder, final long gasRequirement) { + requireNonNull(recordBuilder); + final var reason = recordBuilder.status() == NOT_SUPPORTED + ? CustomExceptionalHaltReason.NOT_SUPPORTED + : CustomExceptionalHaltReason.ERROR_DECODING_PRECOMPILE_INPUT; + return new FullResult( + PrecompiledContract.PrecompileContractResult.halt(Bytes.EMPTY, Optional.of(reason)), + gasRequirement, + recordBuilder); + } + + public static FullResult haltResult(@NonNull final ExceptionalHaltReason reason, final long gasRequirement) { + requireNonNull(reason); + return new FullResult( + PrecompiledContract.PrecompileContractResult.halt(Bytes.EMPTY, Optional.of(reason)), + gasRequirement, + null); + } + + public static FullResult completionResult( + @NonNull final ByteBuffer encoded, + final long gasRequirement, + @NonNull final ContractCallRecordBuilder recordBuilder) { + requireNonNull(encoded); + return new FullResult( + PrecompiledContract.PrecompileContractResult.success(Bytes.wrap(encoded.array())), + gasRequirement, + recordBuilder); + } + + public static FullResult successResult(@NonNull final ByteBuffer encoded, final long gasRequirement) { + requireNonNull(encoded); + return new FullResult( + PrecompiledContract.PrecompileContractResult.success(Bytes.wrap(encoded.array())), + gasRequirement, + null); + } +} diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/HederaSystemContract.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/HederaSystemContract.java index 96e7dfa87708..dd4af74be7dc 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/HederaSystemContract.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/HederaSystemContract.java @@ -16,14 +16,8 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts; -import static java.util.Objects.requireNonNull; - -import com.hedera.hapi.node.base.ResponseCodeEnum; import edu.umd.cs.findbugs.annotations.NonNull; -import java.nio.ByteBuffer; -import java.util.Optional; import org.apache.tuweni.bytes.Bytes; -import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.precompile.PrecompiledContract; @@ -37,37 +31,6 @@ * the work of the precompile itself. */ public interface HederaSystemContract extends PrecompiledContract { - record FullResult(@NonNull PrecompileContractResult result, long gasRequirement) { - public FullResult { - requireNonNull(result); - } - - public Bytes output() { - return result.getOutput(); - } - - public boolean isRefundGas() { - return result.isRefundGas(); - } - - public static FullResult revertResult(@NonNull final ResponseCodeEnum reason, final long gasRequirement) { - requireNonNull(reason); - return new FullResult( - PrecompileContractResult.revert( - Bytes.wrap(reason.protoName().getBytes())), - gasRequirement); - } - - public static FullResult haltResult(@NonNull final ExceptionalHaltReason reason, final long gasRequirement) { - requireNonNull(reason); - return new FullResult(PrecompileContractResult.halt(Bytes.EMPTY, Optional.of(reason)), gasRequirement); - } - - public static FullResult successResult(@NonNull final ByteBuffer encoded, final long gasRequirement) { - requireNonNull(encoded); - return new FullResult(PrecompileContractResult.success(Bytes.wrap(encoded.array())), gasRequirement); - } - } /** * Computes the result of this contract, and also returns the gas requirement. @@ -77,6 +40,6 @@ public static FullResult successResult(@NonNull final ByteBuffer encoded, final * @return the result of the computation, and its gas requirement */ default FullResult computeFully(@NonNull Bytes input, @NonNull MessageFrame messageFrame) { - return new FullResult(computePrecompile(input, messageFrame), gasRequirement(input)); + return new FullResult(computePrecompile(input, messageFrame), gasRequirement(input), null); } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/HtsSystemContract.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/HtsSystemContract.java index 5ac6f5faac47..2eb571d78127 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/HtsSystemContract.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/HtsSystemContract.java @@ -16,12 +16,22 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.haltResult; +import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.haltResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.contractsConfigOf; +import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.unqualifiedDelegateDetected; +import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asNumberedContractId; +import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultFailedFor; +import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultSuccessFor; import static java.util.Objects.requireNonNull; +import com.hedera.hapi.node.base.ContractID; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCallAttempt; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCallFactory; import com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils; +import com.hedera.node.app.service.contract.impl.utils.ConversionUtils; import com.hedera.node.app.spi.workflows.HandleException; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; @@ -29,6 +39,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.tuweni.bytes.Bytes; +import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.GasCalculator; @@ -36,14 +47,15 @@ @Singleton public class HtsSystemContract extends AbstractFullContract implements HederaSystemContract { private static final Logger log = LogManager.getLogger(HtsSystemContract.class); - private static final String HTS_PRECOMPILE_NAME = "HTS"; - public static final String HTS_PRECOMPILE_ADDRESS = "0x167"; - + private static final Bytes STATIC_CALL_REVERT_REASON = Bytes.of("HTS precompiles are not static".getBytes()); + private static final String HTS_SYSTEM_CONTRACT_NAME = "HTS"; + public static final String HTS_EVM_ADDRESS = "0x167"; + private static final ContractID HTS_CONTRACT_ID = asNumberedContractId(Address.fromHexString(HTS_EVM_ADDRESS)); private final HtsCallFactory callFactory; @Inject public HtsSystemContract(@NonNull final GasCalculator gasCalculator, @NonNull final HtsCallFactory callFactory) { - super(HTS_PRECOMPILE_NAME, gasCalculator); + super(HTS_SYSTEM_CONTRACT_NAME, gasCalculator); this.callFactory = requireNonNull(callFactory); } @@ -51,25 +63,66 @@ public HtsSystemContract(@NonNull final GasCalculator gasCalculator, @NonNull fi public FullResult computeFully(@NonNull final Bytes input, @NonNull final MessageFrame frame) { requireNonNull(input); requireNonNull(frame); - if (FrameUtils.unqualifiedDelegateDetected(frame)) { + if (unqualifiedDelegateDetected(frame)) { return haltResult(ExceptionalHaltReason.PRECOMPILE_ERROR, frame.getRemainingGas()); } final HtsCall call; + final HtsCallAttempt attempt; try { - call = callFactory.createCallFrom(input, frame); + attempt = callFactory.createCallAttemptFrom(input, frame); + call = requireNonNull(attempt.asExecutableCall()); + if (frame.isStatic() && !call.allowsStaticFrame()) { + return revertResult( + STATIC_CALL_REVERT_REASON, contractsConfigOf(frame).precompileHtsDefaultGasCost()); + } } catch (final RuntimeException e) { log.debug("Failed to create HTS call from input {}", input, e); return haltResult(ExceptionalHaltReason.INVALID_OPERATION, frame.getRemainingGas()); } - return resultOfExecuting(call, input, frame); + return resultOfExecuting(attempt, call, input, frame); } private static FullResult resultOfExecuting( - @NonNull final HtsCall call, @NonNull final Bytes input, @NonNull final MessageFrame frame) { + @NonNull final HtsCallAttempt attempt, + @NonNull final HtsCall call, + @NonNull final Bytes input, + @NonNull final MessageFrame frame) { final HtsCall.PricedResult pricedResult; try { pricedResult = call.execute(frame); + final var dispatchedRecordBuilder = pricedResult.fullResult().recordBuilder(); + if (dispatchedRecordBuilder != null) { + dispatchedRecordBuilder.contractCallResult(pricedResult.asResultOfCall( + attempt.senderId(), + HTS_CONTRACT_ID, + ConversionUtils.tuweniToPbjBytes(input), + frame.getRemainingGas())); + } + if (pricedResult.isViewCall()) { + final var proxyWorldUpdater = FrameUtils.proxyUpdaterFor(frame); + final var enhancement = proxyWorldUpdater.enhancement(); + final var responseCode = pricedResult.responseCode() != null ? pricedResult.responseCode() : null; + + if (responseCode == SUCCESS) { + final var output = pricedResult.fullResult().result().getOutput(); + enhancement + .systemOperations() + .externalizeResult( + contractFunctionResultSuccessFor( + pricedResult.fullResult().gasRequirement(), output, HTS_CONTRACT_ID), + responseCode); + } else { + enhancement + .systemOperations() + .externalizeResult( + contractFunctionResultFailedFor( + pricedResult.fullResult().gasRequirement(), + responseCode.toString(), + HTS_CONTRACT_ID), + responseCode); + } + } } catch (final HandleException handleException) { throw handleException; } catch (final Exception internal) { diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/PrngSystemContract.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/PrngSystemContract.java index 9dcad0aa24fe..dd53bcc39749 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/PrngSystemContract.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/PrngSystemContract.java @@ -27,7 +27,6 @@ import com.hedera.hapi.node.base.ContractID; import com.hedera.node.app.service.contract.impl.state.ProxyWorldUpdater; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.ResultStatus; import com.hedera.node.app.service.evm.exceptions.InvalidTransactionException; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; import edu.umd.cs.findbugs.annotations.NonNull; @@ -83,20 +82,22 @@ public FullResult computeFully(@NonNull final Bytes input, @NonNull final Messag // create a child record createSuccessfulRecord(frame, randomNum, contractID); - return new FullResult(result, gasRequirement); + return new FullResult(result, gasRequirement, null); } catch (InvalidTransactionException e) { // This error is caused by the user sending in the wrong selector createFailedRecord(frame, FAIL_INVALID.toString(), contractID); return new FullResult( PrecompiledContract.PrecompileContractResult.halt(Bytes.EMPTY, Optional.of(INVALID_OPERATION)), - gasRequirement); + gasRequirement, + null); } catch (NullPointerException e) { // Log a warning as this error will be caused by insufficient entropy log.warn("Internal precompile failure", e); createFailedRecord(frame, FAIL_INVALID.toString(), contractID); return new FullResult( PrecompiledContract.PrecompileContractResult.halt(Bytes.EMPTY, Optional.of(INVALID_OPERATION)), - gasRequirement); + gasRequirement, + null); } } @@ -108,9 +109,7 @@ void createSuccessfulRecord( requireNonNull(contractID); var updater = (ProxyWorldUpdater) frame.getWorldUpdater(); updater.externalizeSystemContractResults( - contractFunctionResultSuccessFor(gasRequirement, randomNum, contractID), - ResultStatus.IS_SUCCESS, - SUCCESS); + contractFunctionResultSuccessFor(gasRequirement, randomNum, contractID), SUCCESS); } } @@ -122,9 +121,7 @@ void createFailedRecord( contractFunctionResultFailedFor(gasRequirement, errorMsg, contractID); var updater = (ProxyWorldUpdater) frame.getWorldUpdater(); updater.externalizeSystemContractResults( - contractFunctionResultFailedFor(gasRequirement, errorMsg, contractID), - ResultStatus.IS_ERROR, - FAIL_INVALID); + contractFunctionResultFailedFor(gasRequirement, errorMsg, contractID), FAIL_INVALID); } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractHtsCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractHtsCall.java index f2a54f30f299..84992b730b13 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractHtsCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractHtsCall.java @@ -16,11 +16,13 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts; -import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_FULL_PREFIX_SIGNATURE_FOR_PRECOMPILE; -import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_SIGNATURE; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.completionResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.haltResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall.PricedResult.gasOnly; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes.encodedRc; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes.standardized; import static java.util.Objects.requireNonNull; import com.hedera.hapi.node.base.ResponseCodeEnum; @@ -28,7 +30,10 @@ import com.hedera.node.app.service.contract.impl.exec.scope.HederaNativeOperations; import com.hedera.node.app.service.contract.impl.exec.scope.SystemContractOperations; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; +import com.hedera.node.app.service.contract.impl.records.ContractCallRecordBuilder; +import com.hedera.node.app.service.token.ReadableAccountStore; import edu.umd.cs.findbugs.annotations.NonNull; +import java.nio.ByteBuffer; /** * Minimal implementation support for an {@link HtsCall} that needs an {@link HederaWorldUpdater.Enhancement} @@ -37,31 +42,52 @@ public abstract class AbstractHtsCall implements HtsCall { protected final SystemContractGasCalculator gasCalculator; protected final HederaWorldUpdater.Enhancement enhancement; + private final boolean isViewCall; protected AbstractHtsCall( @NonNull final SystemContractGasCalculator gasCalculator, - @NonNull final HederaWorldUpdater.Enhancement enhancement) { + @NonNull final HederaWorldUpdater.Enhancement enhancement, + final boolean isViewCall) { this.gasCalculator = requireNonNull(gasCalculator); this.enhancement = requireNonNull(enhancement); + this.isViewCall = isViewCall; } protected HederaNativeOperations nativeOperations() { return enhancement.nativeOperations(); } + protected ReadableAccountStore readableAccountStore() { + return nativeOperations().readableAccountStore(); + } + protected SystemContractOperations systemContractOperations() { return enhancement.systemOperations(); } protected PricedResult completionWith(@NonNull final ResponseCodeEnum status, final long gasRequirement) { - return gasOnly(successResult(ReturnTypes.encodedRc(standardized(status)), gasRequirement)); + return gasOnly(successResult(encodedRc(standardized(status)), gasRequirement), status, isViewCall); + } + + protected PricedResult completionWith( + final long gasRequirement, + @NonNull final ContractCallRecordBuilder recordBuilder, + @NonNull final ByteBuffer output) { + requireNonNull(output); + requireNonNull(recordBuilder); + return gasOnly(completionResult(output, gasRequirement, recordBuilder), recordBuilder.status(), isViewCall); } protected PricedResult reversionWith(@NonNull final ResponseCodeEnum status, final long gasRequirement) { - return gasOnly(revertResult(standardized(status), gasRequirement)); + return gasOnly(revertResult(standardized(status), gasRequirement), status, isViewCall); + } + + protected PricedResult reversionWith( + final long gasRequirement, @NonNull final ContractCallRecordBuilder recordBuilder) { + return gasOnly(revertResult(recordBuilder, gasRequirement), recordBuilder.status(), isViewCall); } - private ResponseCodeEnum standardized(@NonNull final ResponseCodeEnum status) { - return requireNonNull(status) == INVALID_SIGNATURE ? INVALID_FULL_PREFIX_SIGNATURE_FOR_PRECOMPILE : status; + protected PricedResult haltWith(final long gasRequirement, @NonNull final ContractCallRecordBuilder recordBuilder) { + return gasOnly(haltResult(recordBuilder, gasRequirement), recordBuilder.status(), isViewCall); } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractNftViewCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractNftViewCall.java index 6049a8d17e04..0fd86604a389 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractNftViewCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractNftViewCall.java @@ -17,13 +17,13 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts; import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_NFT_ID; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; import static java.util.Objects.requireNonNull; import com.hedera.hapi.node.state.token.Nft; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; @@ -47,7 +47,7 @@ protected AbstractNftViewCall( * {@inheritDoc} */ @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingToken(@NonNull final Token token) { + protected @NonNull FullResult resultOfViewingToken(@NonNull final Token token) { requireNonNull(token); final var nft = nativeOperations().getNft(token.tokenIdOrThrow().tokenNum(), serialNo); if (nft == null) { @@ -65,5 +65,5 @@ protected AbstractNftViewCall( * @return the result of viewing the given NFT of the given token */ @NonNull - protected abstract HederaSystemContract.FullResult resultOfViewingNft(@NonNull Token token, @NonNull Nft nft); + protected abstract FullResult resultOfViewingNft(@NonNull Token token, @NonNull Nft nft); } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractNonRevertibleTokenViewCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractNonRevertibleTokenViewCall.java index ff3d95b4acf5..70382f807adf 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractNonRevertibleTokenViewCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractNonRevertibleTokenViewCall.java @@ -16,77 +16,21 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts; -import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID; -import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HtsSystemContract.HTS_PRECOMPILE_ADDRESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall.PricedResult.gasOnly; -import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asEvmContractId; -import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultSuccessFor; - -import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; -import org.hyperledger.besu.datatypes.Address; /** * Implementation support for view calls that require an extant token. * Classic view function calls are generally non-revertible. */ -public abstract class AbstractNonRevertibleTokenViewCall extends AbstractHtsCall { - @Nullable - protected final Token token; - +public abstract class AbstractNonRevertibleTokenViewCall extends AbstractTokenViewCall { protected AbstractNonRevertibleTokenViewCall( @NonNull final SystemContractGasCalculator gasCalculator, @NonNull final HederaWorldUpdater.Enhancement enhancement, @Nullable final Token token) { - super(gasCalculator, enhancement); - this.token = token; - } - - @Override - public @NonNull PricedResult execute() { - PricedResult result; - if (token == null) { - result = gasOnly(viewCallResultWith(INVALID_TOKEN_ID, gasCalculator.viewGasRequirement())); - } else { - result = gasOnly(resultOfViewingToken(token)); - } - - final var gasRequirement = result.fullResult().gasRequirement(); - final var output = result.fullResult().result().getOutput(); - final var contractID = asEvmContractId(Address.fromHexString(HTS_PRECOMPILE_ADDRESS)); - enhancement - .systemOperations() - .externalizeResult( - contractFunctionResultSuccessFor(gasRequirement, output, contractID), - SystemContractUtils.ResultStatus.IS_SUCCESS, - SUCCESS); - - return result; + super(gasCalculator, enhancement, token); } - - /** - * Returns the result of viewing the given {@code token}. - * - * @param token the token to view - * @return the result of viewing the given {@code token} - */ - @NonNull - protected abstract FullResult resultOfViewingToken(@NonNull Token token); - - /** - * Returns the result of viewing the given {@code token} given the {@code status}. - * Currently, the only usage for this method is to return an INVALID_TOKEN_ID status - * if the token is null. - * @param status - ResponseCodeEnum status - * @return the results to return to the caller - */ - @NonNull - protected abstract FullResult viewCallResultWith(ResponseCodeEnum status, long gasRequirement); } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractRevertibleTokenViewCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractRevertibleTokenViewCall.java index d52f7fcbb074..97e689ca011d 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractRevertibleTokenViewCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractRevertibleTokenViewCall.java @@ -16,67 +16,31 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts; -import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID; -import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HtsSystemContract.HTS_PRECOMPILE_ADDRESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall.PricedResult.gasOnly; -import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asEvmContractId; -import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultSuccessFor; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; -import org.hyperledger.besu.datatypes.Address; /** * Implementation support for view calls that require an extant token. * ERC view function calls are generally revertible. */ -public abstract class AbstractRevertibleTokenViewCall extends AbstractHtsCall { - @Nullable - protected final Token token; - +public abstract class AbstractRevertibleTokenViewCall extends AbstractTokenViewCall { protected AbstractRevertibleTokenViewCall( @NonNull final SystemContractGasCalculator gasCalculator, @NonNull final HederaWorldUpdater.Enhancement enhancement, @Nullable final Token token) { - super(gasCalculator, enhancement); - this.token = token; + super(gasCalculator, enhancement, token); } + @NonNull @Override - public @NonNull PricedResult execute() { - PricedResult result; - if (token == null) { - result = gasOnly(revertResult(INVALID_TOKEN_ID, gasCalculator.viewGasRequirement())); - } else { - result = gasOnly(resultOfViewingToken(token)); - } - - final var gasRequirement = result.fullResult().gasRequirement(); - final var output = result.fullResult().result().getOutput(); - final var contractID = asEvmContractId(Address.fromHexString(HTS_PRECOMPILE_ADDRESS)); - enhancement - .systemOperations() - .externalizeResult( - contractFunctionResultSuccessFor(gasRequirement, output, contractID), - SystemContractUtils.ResultStatus.IS_SUCCESS, - SUCCESS); - - return result; + protected FullResult viewCallResultWith(@NonNull ResponseCodeEnum status, long gasRequirement) { + return revertResult(status, gasRequirement); } - - /** - * Returns the result of viewing the given {@code token}. - * - * @param token the token to view - * @return the result of viewing the given {@code token} - */ - @NonNull - protected abstract HederaSystemContract.FullResult resultOfViewingToken(@NonNull Token token); } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractTokenViewCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractTokenViewCall.java new file mode 100644 index 000000000000..53e50333df28 --- /dev/null +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/AbstractTokenViewCall.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts; + +import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID; +import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall.PricedResult.gasOnly; +import static java.util.Objects.requireNonNull; + +import com.hedera.hapi.node.base.ResponseCodeEnum; +import com.hedera.hapi.node.state.token.Token; +import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; +import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; +import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.Nullable; + +public abstract class AbstractTokenViewCall extends AbstractHtsCall { + protected final Token token; + + protected AbstractTokenViewCall( + @NonNull final SystemContractGasCalculator gasCalculator, + @NonNull final HederaWorldUpdater.Enhancement enhancement, + @Nullable final Token token) { + super(gasCalculator, enhancement, true); + this.token = token; + } + + @Override + public @NonNull PricedResult execute() { + if (token == null) { + return externalizeUnsuccessfulResult(INVALID_TOKEN_ID, gasCalculator.viewGasRequirement()); + } else { + return externalizeSuccessfulResult(); + } + } + + @Override + public boolean allowsStaticFrame() { + return true; + } + + protected PricedResult externalizeSuccessfulResult() { + return gasOnly(resultOfViewingToken(requireNonNull(token)), SUCCESS, true); + } + + protected PricedResult externalizeUnsuccessfulResult(ResponseCodeEnum responseCode, long gasRequirement) { + return gasOnly(viewCallResultWith(responseCode, gasRequirement), responseCode, true); + } + + /** + * Returns the result of viewing the given {@code token}. + * + * @param token the token to view + * @return the result of viewing the given {@code token} + */ + @NonNull + protected abstract FullResult resultOfViewingToken(@NonNull Token token); + + /** + * Returns the result of viewing the given {@code token} given the {@code status}. + * Currently, the only usage for this method is to return an INVALID_TOKEN_ID status + * if the token is null. + * @param status - ResponseCodeEnum status + * @return the results to return to the caller + */ + @NonNull + protected abstract FullResult viewCallResultWith(@NonNull ResponseCodeEnum status, long gasRequirement); +} diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/DispatchForResponseCodeHtsCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/DispatchForResponseCodeHtsCall.java index a0176a83fce7..277dba88d9d9 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/DispatchForResponseCodeHtsCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/DispatchForResponseCodeHtsCall.java @@ -17,6 +17,9 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.DispatchForResponseCodeHtsCall.OutputFn.STANDARD_OUTPUT_FN; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes.encodedRc; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes.standardized; import com.hedera.hapi.node.base.AccountID; import com.hedera.hapi.node.base.ResponseCodeEnum; @@ -25,9 +28,12 @@ import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; import com.hedera.node.app.service.contract.impl.exec.scope.VerificationStrategy; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; +import com.hedera.node.app.service.contract.impl.records.ContractCallRecordBuilder; import com.hedera.node.app.spi.workflows.record.SingleTransactionRecordBuilder; import edu.umd.cs.findbugs.annotations.NonNull; +import java.nio.ByteBuffer; import java.util.Objects; +import java.util.function.Function; /** * An HTS call that simply dispatches a synthetic transaction body and returns a result that is @@ -36,11 +42,19 @@ * @param the type of the record builder to expect from the dispatch */ public class DispatchForResponseCodeHtsCall extends AbstractHtsCall { - private static final FailureCustomizer NOOP_FAILURE_CODE_CUSTOMIZER = (body, code, enhancement) -> code; + /** + * The "standard" failure customizer that replaces {@link ResponseCodeEnum#INVALID_SIGNATURE} with + * {@link ResponseCodeEnum#INVALID_FULL_PREFIX_SIGNATURE_FOR_PRECOMPILE}. (Note this code no longer + * makes sense after the security model change that revoked use of top-level signatures; but for + * now it is retained for backwards compatibility.) + */ + private static final FailureCustomizer STANDARD_FAILURE_CUSTOMIZER = + (body, code, enhancement) -> standardized(code); private final AccountID senderId; private final TransactionBody syntheticBody; private final Class recordBuilderType; + private final OutputFn outputFn; private final FailureCustomizer failureCustomizer; private final VerificationStrategy verificationStrategy; private final DispatchGasCalculator dispatchGasCalculator; @@ -50,6 +64,11 @@ public class DispatchForResponseCodeHtsCall code; + /** * Customizes the failure status of a dispatch. * @@ -65,6 +84,17 @@ ResponseCodeEnum customize( @NonNull HederaWorldUpdater.Enhancement enhancement); } + /** + * A function that can be used to generate the output of a dispatch from its completed + * record builder. + */ + public interface OutputFn extends Function { + /** + * The standard output function that simply returns the encoded status. + */ + OutputFn STANDARD_OUTPUT_FN = recordBuilder -> encodedRc(recordBuilder.status()); + } + /** * Convenience overload that slightly eases construction for the most common case. * @@ -86,7 +116,8 @@ public DispatchForResponseCodeHtsCall( recordBuilderType, attempt.defaultVerificationStrategy(), dispatchGasCalculator, - NOOP_FAILURE_CODE_CUSTOMIZER); + STANDARD_FAILURE_CUSTOMIZER, + STANDARD_OUTPUT_FN); } /** @@ -111,7 +142,34 @@ public DispatchForResponseCodeHtsCall( recordBuilderType, attempt.defaultVerificationStrategy(), dispatchGasCalculator, - failureCustomizer); + failureCustomizer, + STANDARD_OUTPUT_FN); + } + + /** + * Convenience overload that eases construction with a custom output function. + * + * @param attempt the attempt to translate to a dispatching + * @param syntheticBody the synthetic body to dispatch + * @param recordBuilderType the type of the record builder to expect from the dispatch + * @param dispatchGasCalculator the dispatch gas calculator to use + */ + public DispatchForResponseCodeHtsCall( + @NonNull final HtsCallAttempt attempt, + @NonNull final TransactionBody syntheticBody, + @NonNull final Class recordBuilderType, + @NonNull final DispatchGasCalculator dispatchGasCalculator, + @NonNull final OutputFn outputFn) { + this( + attempt.enhancement(), + attempt.systemContractGasCalculator(), + attempt.addressIdConverter().convertSender(attempt.senderAddress()), + syntheticBody, + recordBuilderType, + attempt.defaultVerificationStrategy(), + dispatchGasCalculator, + STANDARD_FAILURE_CUSTOMIZER, + outputFn); } /** @@ -124,6 +182,7 @@ public DispatchForResponseCodeHtsCall( * @param verificationStrategy the verification strategy to use * @param dispatchGasCalculator the dispatch gas calculator to use * @param failureCustomizer the status customizer to use + * @param outputFn the output function to use */ // too many parameters @SuppressWarnings("java:S107") @@ -135,9 +194,11 @@ public DispatchForResponseCodeHtsCall @NonNull final Class recordBuilderType, @NonNull final VerificationStrategy verificationStrategy, @NonNull final DispatchGasCalculator dispatchGasCalculator, - @NonNull final FailureCustomizer failureCustomizer) { - super(gasCalculator, enhancement); + @NonNull final FailureCustomizer failureCustomizer, + @NonNull final OutputFn outputFn) { + super(gasCalculator, enhancement, false); this.senderId = Objects.requireNonNull(senderId); + this.outputFn = Objects.requireNonNull(outputFn); this.syntheticBody = Objects.requireNonNull(syntheticBody); this.recordBuilderType = Objects.requireNonNull(recordBuilderType); this.verificationStrategy = Objects.requireNonNull(verificationStrategy); @@ -145,13 +206,10 @@ public DispatchForResponseCodeHtsCall this.failureCustomizer = Objects.requireNonNull(failureCustomizer); } - /** - * {@inheritDoc} - */ @Override public @NonNull PricedResult execute() { - final var recordBuilder = - systemContractOperations().dispatch(syntheticBody, verificationStrategy, senderId, recordBuilderType); + final var recordBuilder = systemContractOperations() + .dispatch(syntheticBody, verificationStrategy, senderId, ContractCallRecordBuilder.class); final var gasRequirement = dispatchGasCalculator.gasRequirement(syntheticBody, gasCalculator, enhancement, senderId); var status = recordBuilder.status(); @@ -159,6 +217,6 @@ public DispatchForResponseCodeHtsCall status = failureCustomizer.customize(syntheticBody, status, enhancement); recordBuilder.status(status); } - return completionWith(status, gasRequirement); + return completionWith(gasRequirement, recordBuilder, outputFn.apply(recordBuilder)); } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/HtsCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/HtsCall.java index ee8864543caa..56663e8ca9b2 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/HtsCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/HtsCall.java @@ -16,7 +16,15 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; +import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; +import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.tuweniToPbjBytes; + +import com.hedera.hapi.node.base.AccountID; +import com.hedera.hapi.node.base.ContractID; +import com.hedera.hapi.node.base.ResponseCodeEnum; +import com.hedera.hapi.node.contract.ContractFunctionResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; +import com.hedera.pbj.runtime.io.buffer.Bytes; import edu.umd.cs.findbugs.annotations.NonNull; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.precompile.PrecompiledContract.PrecompileContractResult; @@ -29,16 +37,35 @@ public interface HtsCall { * Encapsulates the result of a call to the HTS system contract. There are two elements, *
    *
  1. The "full result" of the call, including both its EVM-standard {@link PrecompileContractResult} - * and gas requirement (which is often difficult to compute without executing the call).
  2. + * and gas requirement (which is often difficult to compute without executing the call); as well as + * any {@link com.hedera.node.app.service.contract.impl.records.ContractCallRecordBuilder} created + * as a side-effect of executing the system contract. *
  3. Any additional cost beyond the gas requirement.
  4. *
* * @param fullResult the full result of the call * @param nonGasCost any additional cost beyond the gas requirement + * @param responseCode the response code after the execution */ - record PricedResult(HederaSystemContract.FullResult fullResult, long nonGasCost) { - public static PricedResult gasOnly(HederaSystemContract.FullResult result) { - return new PricedResult(result, 0L); + record PricedResult(FullResult fullResult, long nonGasCost, ResponseCodeEnum responseCode, boolean isViewCall) { + public static PricedResult gasOnly(FullResult result, ResponseCodeEnum responseCode, boolean isViewCall) { + return new PricedResult(result, 0L, responseCode, isViewCall); + } + + public ContractFunctionResult asResultOfCall( + @NonNull final AccountID senderId, + @NonNull final ContractID contractId, + @NonNull final Bytes functionParameters, + final long remainingGas) { + return ContractFunctionResult.newBuilder() + .contractID(contractId) + .contractCallResult(tuweniToPbjBytes(fullResult.output())) + .errorMessage(responseCode == SUCCESS ? null : responseCode.protoName()) + .gasUsed(fullResult().gasRequirement()) + .gas(remainingGas) + .functionParameters(functionParameters) + .senderId(senderId) + .build(); } } @@ -49,10 +76,21 @@ public static PricedResult gasOnly(HederaSystemContract.FullResult result) { * @return the result, the gas requirement, and any non-gas cost */ @NonNull - PricedResult execute(); + default PricedResult execute() { + throw new UnsupportedOperationException("Prefer an explicit execute(MessageFrame) override"); + } @NonNull default PricedResult execute(MessageFrame frame) { return execute(); } + + /** + * Returns whether this call allows a static frame. Default is false for safety. + * + * @return whether this call allows a static frame + */ + default boolean allowsStaticFrame() { + return false; + } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/HtsCallAttempt.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/HtsCallAttempt.java index 337f9c24f42c..a0199afcdfc6 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/HtsCallAttempt.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/HtsCallAttempt.java @@ -41,6 +41,8 @@ import java.util.List; import org.apache.tuweni.bytes.Bytes; import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.evm.frame.BlockValues; /** * Manages the call attempted by a {@link Bytes} payload received by the {@link HtsSystemContract}. @@ -68,7 +70,8 @@ public class HtsCallAttempt { private final SystemContractGasCalculator gasCalculator; private final List callTranslators; private final boolean isStaticCall; - + private final BlockValues blockValues; + private final Wei value; // too many parameters @SuppressWarnings("java:S107") public HtsCallAttempt( @@ -81,7 +84,9 @@ public HtsCallAttempt( @NonNull final VerificationStrategies verificationStrategies, @NonNull final SystemContractGasCalculator gasCalculator, @NonNull final List callTranslators, - final boolean isStaticCall) { + final boolean isStaticCall, + @NonNull final BlockValues blockValues, + @NonNull final Wei value) { requireNonNull(input); this.callTranslators = requireNonNull(callTranslators); this.gasCalculator = requireNonNull(gasCalculator); @@ -91,6 +96,8 @@ public HtsCallAttempt( this.enhancement = requireNonNull(enhancement); this.verificationStrategies = requireNonNull(verificationStrategies); this.onlyDelegatableContractKeysActive = onlyDelegatableContractKeysActive; + this.blockValues = blockValues; + this.value = value; this.isRedirect = isRedirect(input.toArrayUnsafe()); if (this.isRedirect) { @@ -190,6 +197,13 @@ public HtsCallAttempt( return senderAddress; } + public @NonNull BlockValues blockValues() { + return blockValues; + } + + public @NonNull Wei getValue() { + return value; + } /** * Returns whether only delegatable contract keys are active for this call. * diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/HtsCallFactory.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/HtsCallFactory.java index e95bb301e34e..8e980d750b6d 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/HtsCallFactory.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/HtsCallFactory.java @@ -53,18 +53,19 @@ public HtsCallFactory( } /** - * Creates a new {@link HtsCall} for the given input and message frame. + * Creates a new {@link HtsCallAttempt} for the given input and message frame. * * @param input the input * @param frame the message frame * @return the new attempt * @throws RuntimeException if the call cannot be created */ - public @NonNull HtsCall createCallFrom(@NonNull final Bytes input, @NonNull final MessageFrame frame) { + public @NonNull HtsCallAttempt createCallAttemptFrom( + @NonNull final Bytes input, @NonNull final MessageFrame frame) { requireNonNull(input); requireNonNull(frame); final var enhancement = proxyUpdaterFor(frame).enhancement(); - final var attempt = new HtsCallAttempt( + return new HtsCallAttempt( input, frame.getSenderAddress(), addressChecks.hasParentDelegateCall(frame), @@ -74,7 +75,8 @@ public HtsCallFactory( verificationStrategies, systemContractGasCalculatorOf(frame), callTranslators, - frame.isStatic()); - return requireNonNull(attempt.asExecutableCall()); + frame.isStatic(), + frame.getBlockValues(), + frame.getValue()); } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/ReturnTypes.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/ReturnTypes.java index 5effd4b30225..3822a478cf78 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/ReturnTypes.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/ReturnTypes.java @@ -16,6 +16,10 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts; +import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_FULL_PREFIX_SIGNATURE_FOR_PRECOMPILE; +import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_SIGNATURE; +import static java.util.Objects.requireNonNull; + import com.esaulpaugh.headlong.abi.TupleType; import com.hedera.hapi.node.base.AccountID; import com.hedera.hapi.node.base.ContractID; @@ -25,6 +29,7 @@ import com.hedera.hapi.node.transaction.FixedFee; import edu.umd.cs.findbugs.annotations.NonNull; import java.nio.ByteBuffer; +import org.apache.tuweni.bytes.Bytes; /** * Literal representations of output types used by HTS system contract functions. @@ -43,8 +48,6 @@ private ReturnTypes() { public static final Fraction ZERO_FRACTION = new Fraction(0, 1); public static final FixedFee ZERO_FIXED_FEE = new FixedFee(0, null); - private static final String RESPONSE_STATUS_AT_BEGINNING = "(int32,"; - public static final String INT = "(int)"; public static final String INT_64 = "(int64)"; public static final String INT64_INT64 = "(int64,int64)"; @@ -168,6 +171,10 @@ private ReturnTypes() { private static final TupleType RC_ENCODER = TupleType.parse(INT_64); + public static Bytes tuweniEncodedRc(@NonNull final ResponseCodeEnum status) { + return Bytes.wrap(encodedRc(status).array()); + } + /** * Encodes the given {@code status} as a return value for a classic transfer call. * @@ -177,4 +184,8 @@ private ReturnTypes() { public static ByteBuffer encodedRc(@NonNull final ResponseCodeEnum status) { return RC_ENCODER.encodeElements((long) status.protoOrdinal()); } + + public static ResponseCodeEnum standardized(@NonNull final ResponseCodeEnum status) { + return requireNonNull(status) == INVALID_SIGNATURE ? INVALID_FULL_PREFIX_SIGNATURE_FOR_PRECOMPILE : status; + } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/allowance/GetAllowanceCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/allowance/GetAllowanceCall.java index 810a349fa89c..766df3b52304 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/allowance/GetAllowanceCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/allowance/GetAllowanceCall.java @@ -16,7 +16,7 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.allowance; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static java.util.Objects.requireNonNull; import com.esaulpaugh.headlong.abi.Address; @@ -26,7 +26,7 @@ import com.hedera.hapi.node.state.token.AccountFungibleTokenAllowance; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AddressIdConverter; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/balanceof/BalanceOfCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/balanceof/BalanceOfCall.java index 0bc7bb6f26db..dcd62028b486 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/balanceof/BalanceOfCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/balanceof/BalanceOfCall.java @@ -17,26 +17,17 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.balanceof; import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_ACCOUNT_ID; -import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID; -import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HtsSystemContract.HTS_PRECOMPILE_ADDRESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall.PricedResult.gasOnly; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.accountNumberForEvmReference; -import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asEvmContractId; -import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultFailedFor; -import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultSuccessFor; import static java.util.Objects.requireNonNull; import com.esaulpaugh.headlong.abi.Address; -import com.hedera.hapi.node.base.ContractID; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; import java.math.BigInteger; @@ -56,43 +47,11 @@ public BalanceOfCall( this.owner = requireNonNull(owner); } - @Override - public @NonNull PricedResult execute() { - PricedResult result; - long gasRequirement; - ContractID contractID = - asEvmContractId(org.hyperledger.besu.datatypes.Address.fromHexString(HTS_PRECOMPILE_ADDRESS)); - - if (token == null) { - result = gasOnly(revertResult(INVALID_TOKEN_ID, gasCalculator.viewGasRequirement())); - - gasRequirement = result.fullResult().gasRequirement(); - enhancement - .systemOperations() - .externalizeResult( - contractFunctionResultFailedFor(gasRequirement, INVALID_TOKEN_ID.toString(), contractID), - SystemContractUtils.ResultStatus.IS_ERROR, - INVALID_TOKEN_ID); - } else { - result = gasOnly(resultOfViewingToken(token)); - - gasRequirement = result.fullResult().gasRequirement(); - final var output = result.fullResult().result().getOutput(); - enhancement - .systemOperations() - .externalizeResult( - contractFunctionResultSuccessFor(gasRequirement, output, contractID), - SystemContractUtils.ResultStatus.IS_SUCCESS, - SUCCESS); - } - return result; - } - /** * {@inheritDoc} */ @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingToken(@NonNull Token token) { + protected @NonNull FullResult resultOfViewingToken(@NonNull Token token) { final var ownerNum = accountNumberForEvmReference(owner, nativeOperations()); if (ownerNum < 0) { return revertResult(INVALID_ACCOUNT_ID, gasCalculator.viewGasRequirement()); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/burn/BurnDecoder.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/burn/BurnDecoder.java index dfa3544fc824..12f9d0c21fed 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/burn/BurnDecoder.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/burn/BurnDecoder.java @@ -16,10 +16,14 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.burn; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes.INT64_INT64; + +import com.esaulpaugh.headlong.abi.TupleType; import com.google.common.primitives.Longs; import com.hedera.hapi.node.base.TokenID; import com.hedera.hapi.node.token.TokenBurnTransactionBody; import com.hedera.hapi.node.transaction.TransactionBody; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.DispatchForResponseCodeHtsCall; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCallAttempt; import com.hedera.node.app.service.contract.impl.utils.ConversionUtils; import edu.umd.cs.findbugs.annotations.NonNull; @@ -30,8 +34,15 @@ @Singleton public class BurnDecoder { + private static final TupleType BURN_RESULT_ENCODER = TupleType.parse(INT64_INT64); + public static final DispatchForResponseCodeHtsCall.OutputFn BURN_OUTPUT_FN = + recordBuilder -> BURN_RESULT_ENCODER.encodeElements( + (long) recordBuilder.status().protoOrdinal(), recordBuilder.getNewTotalSupply()); + @Inject - public BurnDecoder() {} + public BurnDecoder() { + // Dagger2 + } public TransactionBody decodeBurn(@NonNull final HtsCallAttempt attempt) { final var call = BurnTranslator.BURN_TOKEN_V1.decodeCall(attempt.inputBytes()); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/burn/BurnTranslator.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/burn/BurnTranslator.java index 70e2def9b4c8..1286b06c664f 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/burn/BurnTranslator.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/burn/BurnTranslator.java @@ -16,6 +16,9 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.burn; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes.INT64_INT64; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.burn.BurnDecoder.BURN_OUTPUT_FN; + import com.esaulpaugh.headlong.abi.Function; import com.hedera.hapi.node.base.AccountID; import com.hedera.hapi.node.transaction.TransactionBody; @@ -25,7 +28,6 @@ import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.DispatchForResponseCodeHtsCall; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCallAttempt; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import com.hedera.node.app.spi.workflows.record.SingleTransactionRecordBuilder; import edu.umd.cs.findbugs.annotations.NonNull; @@ -33,8 +35,8 @@ import javax.inject.Inject; public class BurnTranslator extends AbstractHtsCallTranslator { - public static final Function BURN_TOKEN_V1 = new Function("burnToken(address,uint64,int64[])", ReturnTypes.INT); - public static final Function BURN_TOKEN_V2 = new Function("burnToken(address,int64,int64[])", ReturnTypes.INT); + public static final Function BURN_TOKEN_V1 = new Function("burnToken(address,uint64,int64[])", INT64_INT64); + public static final Function BURN_TOKEN_V2 = new Function("burnToken(address,int64,int64[])", INT64_INT64); BurnDecoder decoder; @@ -57,7 +59,8 @@ public HtsCall callFrom(@NonNull HtsCallAttempt attempt) { attempt, body, SingleTransactionRecordBuilder.class, - isFungibleMint ? BurnTranslator::fungibleBurnGasRequirement : BurnTranslator::nftBurnGasRequirement); + isFungibleMint ? BurnTranslator::fungibleBurnGasRequirement : BurnTranslator::nftBurnGasRequirement, + BURN_OUTPUT_FN); } private TransactionBody bodyForClassic(@NonNull final HtsCallAttempt attempt) { diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/create/ClassicCreatesCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/create/ClassicCreatesCall.java index 96c2751831a7..92f740139585 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/create/ClassicCreatesCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/create/ClassicCreatesCall.java @@ -16,10 +16,17 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.create; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.hapi.node.base.ResponseCodeEnum.INSUFFICIENT_TX_FEE; +import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_ACCOUNT_ID; +import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_EXPIRATION_TIME; +import static com.hedera.hapi.node.base.ResponseCodeEnum.MISSING_TOKEN_SYMBOL; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HtsSystemContract.HTS_EVM_ADDRESS; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall.PricedResult.gasOnly; +import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asEvmContractId; import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asHeadlongAddress; +import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultFailedFor; import static java.util.Objects.requireNonNull; import com.hedera.hapi.node.base.ResponseCodeEnum; @@ -35,6 +42,9 @@ import edu.umd.cs.findbugs.annotations.NonNull; import java.math.BigInteger; import java.nio.ByteBuffer; +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.evm.frame.BlockValues; public class ClassicCreatesCall extends AbstractHtsCall { /** @@ -49,31 +59,62 @@ public class ClassicCreatesCall extends AbstractHtsCall { private final VerificationStrategy verificationStrategy; private final org.hyperledger.besu.datatypes.Address spender; + @NonNull + private final BlockValues blockValues; + + @NonNull + private final Wei value; + public ClassicCreatesCall( @NonNull final SystemContractGasCalculator systemContractGasCalculator, @NonNull final HederaWorldUpdater.Enhancement enhancement, @NonNull final TransactionBody syntheticCreate, @NonNull final VerificationStrategy verificationStrategy, @NonNull final org.hyperledger.besu.datatypes.Address spender, - @NonNull final AddressIdConverter addressIdConverter) { - super(systemContractGasCalculator, enhancement); + @NonNull final AddressIdConverter addressIdConverter, + @NonNull final BlockValues blockValues, + @NonNull final Wei value) { + super(systemContractGasCalculator, enhancement, false); this.syntheticCreate = requireNonNull(syntheticCreate); this.verificationStrategy = requireNonNull(verificationStrategy); this.spender = requireNonNull(spender); this.addressIdConverter = requireNonNull(addressIdConverter); + this.blockValues = blockValues; + this.value = value; } @Override public @NonNull PricedResult execute() { + final var token = ((TokenCreateTransactionBody) syntheticCreate.data().value()); + if (token.symbol().isEmpty()) { + return externalizeUnsuccessfulResult(MISSING_TOKEN_SYMBOL, gasCalculator.viewGasRequirement()); + } + + final var treasuryAccount = + nativeOperations().getAccount(token.treasury().accountNum()); + if (treasuryAccount == null) { + return externalizeUnsuccessfulResult(INVALID_ACCOUNT_ID, gasCalculator.viewGasRequirement()); + } + + if (token.autoRenewAccount() == null) { + return externalizeUnsuccessfulResult(INVALID_EXPIRATION_TIME, gasCalculator.viewGasRequirement()); + } final var spenderId = addressIdConverter.convert(asHeadlongAddress(spender.toArrayUnsafe())); + + final long gasRequirement = gasCalculator.gasRequirement(syntheticCreate, spenderId, MINIMUM_TINYBAR_PRICE); + if (!value.greaterOrEqualThan(Wei.of(gasRequirement))) { + return externalizeUnsuccessfulResult(INSUFFICIENT_TX_FEE, gasCalculator.viewGasRequirement()); + } + final var recordBuilder = systemContractOperations() .dispatch(syntheticCreate, verificationStrategy, spenderId, CryptoCreateRecordBuilder.class); final var customFees = ((TokenCreateTransactionBody) syntheticCreate.data().value()).customFees(); final var tokenType = ((TokenCreateTransactionBody) syntheticCreate.data().value()).tokenType(); - if (recordBuilder.status() != ResponseCodeEnum.SUCCESS) { - return gasOnly(revertResult(recordBuilder.status(), MINIMUM_TINYBAR_PRICE)); + final var status = recordBuilder.status(); + if (status != ResponseCodeEnum.SUCCESS) { + return gasOnly(revertResult(status, MINIMUM_TINYBAR_PRICE), status, false); } else { final var isFungible = tokenType == TokenType.FUNGIBLE_COMMON; ByteBuffer encodedOutput; @@ -95,8 +136,20 @@ public ClassicCreatesCall( .getOutputs() .encodeElements(BigInteger.valueOf(ResponseCodeEnum.SUCCESS.protoOrdinal())); } - final long gasRequirement = gasCalculator.gasRequirement(syntheticCreate, spenderId, MINIMUM_TINYBAR_PRICE); - return gasOnly(successResult(encodedOutput, gasRequirement)); + return gasOnly(successResult(encodedOutput, gasRequirement), status, false); } } + + // @TODO extract externalizeResult() calls into a single location on a higher level + private PricedResult externalizeUnsuccessfulResult(ResponseCodeEnum responseCode, long gasRequirement) { + final var result = gasOnly(revertResult(responseCode, gasRequirement), responseCode, false); + final var contractID = asEvmContractId(Address.fromHexString(HTS_EVM_ADDRESS)); + + enhancement + .systemOperations() + .externalizeResult( + contractFunctionResultFailedFor(MINIMUM_TINYBAR_PRICE, responseCode.toString(), contractID), + responseCode); + return result; + } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/create/CreateTranslator.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/create/CreateTranslator.java index 671501d1280b..c4b008868249 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/create/CreateTranslator.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/create/CreateTranslator.java @@ -154,7 +154,9 @@ public ClassicCreatesCall callFrom(@NonNull HtsCallAttempt attempt) { nominalBodyFor(attempt), attempt.defaultVerificationStrategy(), attempt.senderAddress(), - attempt.addressIdConverter()); + attempt.addressIdConverter(), + attempt.blockValues(), + attempt.getValue()); } private TransactionBody nominalBodyFor(@NonNull final HtsCallAttempt attempt) { diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/customfees/TokenCustomFeesCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/customfees/TokenCustomFeesCall.java index 96f57ce97ca5..f4ca14aa5a1b 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/customfees/TokenCustomFeesCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/customfees/TokenCustomFeesCall.java @@ -17,7 +17,7 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.customfees; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.TokenTupleUtils.feesTupleFor; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.customfees.TokenCustomFeesTranslator.TOKEN_CUSTOM_FEES; import static java.util.Objects.requireNonNull; @@ -25,7 +25,7 @@ import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNonRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/decimals/DecimalsCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/decimals/DecimalsCall.java index c741e4b72680..467906b59e28 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/decimals/DecimalsCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/decimals/DecimalsCall.java @@ -17,13 +17,13 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.decimals; import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import com.hedera.hapi.node.base.TokenType; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import edu.umd.cs.findbugs.annotations.NonNull; @@ -46,7 +46,7 @@ public DecimalsCall( * {@inheritDoc} */ @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingToken(@NonNull final Token token) { + protected @NonNull FullResult resultOfViewingToken(@NonNull final Token token) { if (token.tokenType() != TokenType.FUNGIBLE_COMMON) { return revertResult(INVALID_TOKEN_ID, gasCalculator.viewGasRequirement()); } else { diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/defaultfreezestatus/DefaultFreezeStatusCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/defaultfreezestatus/DefaultFreezeStatusCall.java index 8bd3c61f1f18..2312a1b3bc59 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/defaultfreezestatus/DefaultFreezeStatusCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/defaultfreezestatus/DefaultFreezeStatusCall.java @@ -17,15 +17,15 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.defaultfreezestatus; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.defaultfreezestatus.DefaultFreezeStatusTranslator.DEFAULT_FREEZE_STATUS; import static java.util.Objects.requireNonNull; import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNonRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/defaultkycstatus/DefaultKycStatusCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/defaultkycstatus/DefaultKycStatusCall.java index 85caea4d6b6e..4e957452b463 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/defaultkycstatus/DefaultKycStatusCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/defaultkycstatus/DefaultKycStatusCall.java @@ -17,16 +17,15 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.defaultkycstatus; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.defaultkycstatus.DefaultKycStatusTranslator.DEFAULT_KYC_STATUS; import static java.util.Objects.requireNonNull; import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNonRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import edu.umd.cs.findbugs.annotations.NonNull; @@ -48,7 +47,7 @@ public DefaultKycStatusCall( * {@inheritDoc} */ @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingToken(@Nullable final Token token) { + protected @NonNull FullResult resultOfViewingToken(@Nullable final Token token) { requireNonNull(token); return fullResultsFor(SUCCESS, gasCalculator.viewGasRequirement(), token.accountsKycGrantedByDefault()); } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/fungibletokeninfo/FungibleTokenInfoCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/fungibletokeninfo/FungibleTokenInfoCall.java index f5f3b0aa47f6..b872c8202738 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/fungibletokeninfo/FungibleTokenInfoCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/fungibletokeninfo/FungibleTokenInfoCall.java @@ -17,8 +17,8 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.fungibletokeninfo; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.TokenTupleUtils.fungibleTokenInfoTupleFor; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.fungibletokeninfo.FungibleTokenInfoTranslator.FUNGIBLE_TOKEN_INFO; import static java.util.Objects.requireNonNull; @@ -26,7 +26,7 @@ import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNonRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import com.hedera.node.config.data.LedgerConfig; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/getapproved/GetApprovedCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/getapproved/GetApprovedCall.java index c568d5faa9bb..4d1659a50224 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/getapproved/GetApprovedCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/getapproved/GetApprovedCall.java @@ -18,8 +18,8 @@ import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID; import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_NFT_SERIAL_NUMBER; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.getapproved.GetApprovedTranslator.ERC_GET_APPROVED; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.getapproved.GetApprovedTranslator.HAPI_GET_APPROVED; import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asHeadlongAddress; @@ -30,7 +30,7 @@ import com.hedera.hapi.node.base.TokenType; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import edu.umd.cs.findbugs.annotations.NonNull; @@ -56,7 +56,7 @@ public GetApprovedCall( } @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingToken(@NonNull final Token token) { + protected @NonNull FullResult resultOfViewingToken(@NonNull final Token token) { requireNonNull(token); if (token.tokenType() != TokenType.NON_FUNGIBLE_UNIQUE) { if (!isStaticCall) { diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantapproval/AbstractGrantApprovalCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantapproval/AbstractGrantApprovalCall.java index 66fa03e40843..309a2a15d3fc 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantapproval/AbstractGrantApprovalCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantapproval/AbstractGrantApprovalCall.java @@ -49,8 +49,9 @@ protected AbstractGrantApprovalCall( @NonNull final TokenID token, @NonNull final AccountID spender, @NonNull final BigInteger amount, - @NonNull final TokenType tokenType) { - super(gasCalculator, enhancement); + @NonNull final TokenType tokenType, + @NonNull final boolean isViewCall) { + super(gasCalculator, enhancement, isViewCall); this.verificationStrategy = verificationStrategy; this.senderId = senderId; this.token = token; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantapproval/ClassicGrantApprovalCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantapproval/ClassicGrantApprovalCall.java index 5928787f0aac..10c430a498ec 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantapproval/ClassicGrantApprovalCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantapproval/ClassicGrantApprovalCall.java @@ -29,7 +29,7 @@ import com.hedera.node.app.service.contract.impl.exec.gas.DispatchType; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; import com.hedera.node.app.service.contract.impl.exec.scope.VerificationStrategy; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbiConstants; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.LogBuilder; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater.Enhancement; @@ -41,7 +41,6 @@ import org.hyperledger.besu.evm.log.Log; public class ClassicGrantApprovalCall extends AbstractGrantApprovalCall { - public ClassicGrantApprovalCall( @NonNull final SystemContractGasCalculator gasCalculator, @NonNull final Enhancement enhancement, @@ -51,7 +50,7 @@ public ClassicGrantApprovalCall( @NonNull final AccountID spender, @NonNull final BigInteger amount, @NonNull final TokenType tokenType) { - super(gasCalculator, enhancement, verificationStrategy, senderId, token, spender, amount, tokenType); + super(gasCalculator, enhancement, verificationStrategy, senderId, token, spender, amount, tokenType, false); } @NonNull @@ -77,7 +76,7 @@ public PricedResult execute() { : GrantApprovalTranslator.GRANT_APPROVAL_NFT.getOutputs().encodeElements((long) status.protoOrdinal()); - return gasOnly(FullResult.successResult(encodedOutput, gasRequirement)); + return gasOnly(FullResult.successResult(encodedOutput, gasRequirement), status, false); } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantapproval/ERCGrantApprovalCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantapproval/ERCGrantApprovalCall.java index 70cd0b309c75..e800efb0d6c5 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantapproval/ERCGrantApprovalCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantapproval/ERCGrantApprovalCall.java @@ -17,8 +17,8 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.grantapproval; import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall.PricedResult.gasOnly; import com.hedera.hapi.node.base.AccountID; @@ -44,7 +44,7 @@ public ERCGrantApprovalCall( @NonNull final AccountID spender, @NonNull final BigInteger amount, @NonNull final TokenType tokenType) { - super(gasCalculator, enhancement, verificationStrategy, sender, token, spender, amount, tokenType); + super(gasCalculator, enhancement, verificationStrategy, sender, token, spender, amount, tokenType, false); } @NonNull @@ -57,15 +57,16 @@ public PricedResult execute() { final var recordBuilder = systemContractOperations() .dispatch(body, verificationStrategy, senderId, SingleTransactionRecordBuilder.class); final var gasRequirement = gasCalculator.gasRequirement(body, DispatchType.APPROVE, senderId); - if (recordBuilder.status() != ResponseCodeEnum.SUCCESS) { - return gasOnly(revertResult(recordBuilder.status(), gasRequirement)); + final var status = recordBuilder.status(); + if (status != ResponseCodeEnum.SUCCESS) { + return gasOnly(revertResult(status, gasRequirement), status, false); } else { final var encodedOutput = tokenType.equals(TokenType.FUNGIBLE_COMMON) ? GrantApprovalTranslator.ERC_GRANT_APPROVAL.getOutputs().encodeElements(true) : GrantApprovalTranslator.ERC_GRANT_APPROVAL_NFT .getOutputs() .encodeElements(); - return gasOnly(successResult(encodedOutput, gasRequirement)); + return gasOnly(successResult(encodedOutput, gasRequirement), status, false); } } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantrevokekyc/GrantRevokeKycTranslator.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantrevokekyc/GrantRevokeKycTranslator.java index a1cd8a578c83..ba5d8a50192e 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantrevokekyc/GrantRevokeKycTranslator.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/grantrevokekyc/GrantRevokeKycTranslator.java @@ -16,6 +16,8 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.grantrevokekyc; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.DispatchForResponseCodeHtsCall.FailureCustomizer.NOOP_CUSTOMIZER; + import com.esaulpaugh.headlong.abi.Function; import com.hedera.hapi.node.base.AccountID; import com.hedera.hapi.node.transaction.TransactionBody; @@ -64,7 +66,8 @@ public HtsCall callFrom(@NonNull HtsCallAttempt attempt) { SingleTransactionRecordBuilder.class, Arrays.equals(attempt.selector(), GRANT_KYC.selector()) ? GrantRevokeKycTranslator::grantGasRequirement - : GrantRevokeKycTranslator::revokeGasRequirement); + : GrantRevokeKycTranslator::revokeGasRequirement, + NOOP_CUSTOMIZER); } public static long grantGasRequirement( diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/isapprovedforall/IsApprovedForAllCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/isapprovedforall/IsApprovedForAllCall.java index 4ba9a9f2f550..d3ef00b5eb92 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/isapprovedforall/IsApprovedForAllCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/isapprovedforall/IsApprovedForAllCall.java @@ -18,8 +18,8 @@ import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.isapprovedforall.IsApprovedForAllTranslator.CLASSIC_IS_APPROVED_FOR_ALL; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.isapprovedforall.IsApprovedForAllTranslator.ERC_IS_APPROVED_FOR_ALL; import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.accountNumberForEvmReference; @@ -33,7 +33,7 @@ import com.hedera.hapi.node.state.token.Account; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import edu.umd.cs.findbugs.annotations.NonNull; @@ -66,7 +66,7 @@ public IsApprovedForAllCall( * {@inheritDoc} */ @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingToken(@NonNull final Token token) { + protected @NonNull FullResult resultOfViewingToken(@NonNull final Token token) { requireNonNull(token); if (token.tokenType() != TokenType.NON_FUNGIBLE_UNIQUE) { return revertResult(INVALID_TOKEN_ID, gasCalculator.viewGasRequirement()); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/isfrozen/IsFrozenCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/isfrozen/IsFrozenCall.java index eeba19a6415c..b2b4d8003ac6 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/isfrozen/IsFrozenCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/isfrozen/IsFrozenCall.java @@ -18,8 +18,8 @@ import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_ACCOUNT_ID; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.defaultfreezestatus.DefaultFreezeStatusTranslator.DEFAULT_FREEZE_STATUS; import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.accountNumberForEvmReference; import static java.util.Objects.requireNonNull; @@ -28,8 +28,7 @@ import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNonRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import edu.umd.cs.findbugs.annotations.NonNull; @@ -54,7 +53,7 @@ public IsFrozenCall( * {@inheritDoc} */ @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingToken(@NonNull final Token token) { + protected @NonNull FullResult resultOfViewingToken(@NonNull final Token token) { requireNonNull(token); final var accountNum = accountNumberForEvmReference(account, nativeOperations()); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/iskyc/IsKycCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/iskyc/IsKycCall.java index 9528ecf1814f..b711e22cdf5d 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/iskyc/IsKycCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/iskyc/IsKycCall.java @@ -18,8 +18,8 @@ import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_ACCOUNT_ID; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.iskyc.IsKycTranslator.IS_KYC; import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.accountNumberForEvmReference; import static java.util.Objects.requireNonNull; @@ -28,8 +28,7 @@ import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNonRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import edu.umd.cs.findbugs.annotations.NonNull; @@ -54,7 +53,7 @@ public IsKycCall( * {@inheritDoc} */ @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingToken(@NonNull final Token token) { + protected @NonNull FullResult resultOfViewingToken(@NonNull final Token token) { requireNonNull(token); final var accountNum = accountNumberForEvmReference(account, nativeOperations()); if (accountNum < 0) { diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/istoken/IsTokenCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/istoken/IsTokenCall.java index 29dfa62fa15f..11b6de9caf35 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/istoken/IsTokenCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/istoken/IsTokenCall.java @@ -17,15 +17,14 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.istoken; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.istoken.IsTokenTranslator.IS_TOKEN; import static java.util.Objects.requireNonNull; import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNonRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import edu.umd.cs.findbugs.annotations.NonNull; @@ -47,7 +46,7 @@ public IsTokenCall( * {@inheritDoc} */ @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingToken(@NonNull final Token token) { + protected @NonNull FullResult resultOfViewingToken(@NonNull final Token token) { requireNonNull(token); return fullResultsFor(SUCCESS, gasCalculator.viewGasRequirement(), true); } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/mint/MintDecoder.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/mint/MintDecoder.java index 3482239b0c8e..e0ff14bd9e7d 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/mint/MintDecoder.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/mint/MintDecoder.java @@ -17,8 +17,10 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.mint; import com.esaulpaugh.headlong.abi.Address; +import com.esaulpaugh.headlong.abi.TupleType; import com.hedera.hapi.node.token.TokenMintTransactionBody; import com.hedera.hapi.node.transaction.TransactionBody; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.DispatchForResponseCodeHtsCall; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCallAttempt; import com.hedera.node.app.service.contract.impl.utils.ConversionUtils; import com.hedera.pbj.runtime.io.buffer.Bytes; @@ -31,6 +33,14 @@ @Singleton public class MintDecoder { + private static final TupleType MINT_RESULT_ENCODER = TupleType.parse("(int64,int64,int64[])"); + public static final DispatchForResponseCodeHtsCall.OutputFn MINT_OUTPUT_FN = + recordBuilder -> MINT_RESULT_ENCODER.encodeElements( + (long) recordBuilder.status().protoOrdinal(), + recordBuilder.getNewTotalSupply(), + recordBuilder.serialNumbers().stream() + .mapToLong(Long::longValue) + .toArray()); @Inject public MintDecoder() { diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/mint/MintTranslator.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/mint/MintTranslator.java index bf0ec2b75583..6e05b784bd5e 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/mint/MintTranslator.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/mint/MintTranslator.java @@ -16,6 +16,8 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.mint; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.mint.MintDecoder.MINT_OUTPUT_FN; + import com.esaulpaugh.headlong.abi.Function; import com.hedera.hapi.node.base.AccountID; import com.hedera.hapi.node.transaction.TransactionBody; @@ -25,7 +27,6 @@ import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.DispatchForResponseCodeHtsCall; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCallAttempt; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import com.hedera.node.app.spi.workflows.record.SingleTransactionRecordBuilder; import edu.umd.cs.findbugs.annotations.NonNull; @@ -38,8 +39,8 @@ */ @Singleton public class MintTranslator extends AbstractHtsCallTranslator { - public static final Function MINT = new Function("mintToken(address,uint64,bytes[])", ReturnTypes.INT); - public static final Function MINT_V2 = new Function("mintToken(address,int64,bytes[])", ReturnTypes.INT); + public static final Function MINT = new Function("mintToken(address,uint64,bytes[])", "(int64,int64,int64[])"); + public static final Function MINT_V2 = new Function("mintToken(address,int64,bytes[])", "(int64,int64,int64[])"); private final MintDecoder decoder; @Inject @@ -64,7 +65,8 @@ public HtsCall callFrom(@NonNull final HtsCallAttempt attempt) { attempt, body, SingleTransactionRecordBuilder.class, - isFungibleMint ? MintTranslator::fungibleMintGasRequirement : MintTranslator::nftMintGasRequirement); + isFungibleMint ? MintTranslator::fungibleMintGasRequirement : MintTranslator::nftMintGasRequirement, + MINT_OUTPUT_FN); } public static long nftMintGasRequirement( diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/name/NameCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/name/NameCall.java index 2cf60784d761..58d81a634f61 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/name/NameCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/name/NameCall.java @@ -16,12 +16,12 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.name; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static java.util.Objects.requireNonNull; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCallAttempt; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; @@ -45,7 +45,7 @@ public NameCall( * {@inheritDoc} */ @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingToken(@NonNull Token token) { + protected @NonNull FullResult resultOfViewingToken(@NonNull Token token) { final var output = NameTranslator.NAME.getOutputs().encodeElements(token.name()); return successResult(output, gasCalculator.viewGasRequirement()); } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/nfttokeninfo/NftTokenInfoCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/nfttokeninfo/NftTokenInfoCall.java index 7ee651914905..a539d88c9d41 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/nfttokeninfo/NftTokenInfoCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/nfttokeninfo/NftTokenInfoCall.java @@ -17,8 +17,8 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.nfttokeninfo; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes.ZERO_TOKEN_ID; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.TokenTupleUtils.nftTokenInfoTupleFor; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.nfttokeninfo.NftTokenInfoTranslator.NON_FUNGIBLE_TOKEN_INFO; @@ -28,7 +28,7 @@ import com.hedera.hapi.node.state.token.Nft; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNonRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import com.hedera.node.config.data.LedgerConfig; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/ownerof/OwnerOfCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/ownerof/OwnerOfCall.java index 172eaec53678..36d749836b43 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/ownerof/OwnerOfCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/ownerof/OwnerOfCall.java @@ -17,7 +17,7 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ownerof; import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_ACCOUNT_ID; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.headlongAddressOf; import static java.util.Objects.requireNonNull; @@ -25,7 +25,7 @@ import com.hedera.hapi.node.state.token.Nft; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNftViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import edu.umd.cs.findbugs.annotations.NonNull; @@ -49,8 +49,7 @@ public OwnerOfCall( * {@inheritDoc} */ @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingNft( - @NonNull final Token token, @NonNull final Nft nft) { + protected @NonNull FullResult resultOfViewingNft(@NonNull final Token token, @NonNull final Nft nft) { requireNonNull(token); requireNonNull(nft); final var explicitId = nft.ownerIdOrElse(AccountID.DEFAULT); @@ -66,7 +65,7 @@ public OwnerOfCall( return revertResult(INVALID_ACCOUNT_ID, gasRequirement); } else { final var output = OwnerOfTranslator.OWNER_OF.getOutputs().encodeElements(headlongAddressOf(owner)); - return HederaSystemContract.FullResult.successResult(output, gasRequirement); + return FullResult.successResult(output, gasRequirement); } } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/setapproval/SetApprovalForAllCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/setapproval/SetApprovalForAllCall.java index a7174af7898f..0415e996c382 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/setapproval/SetApprovalForAllCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/setapproval/SetApprovalForAllCall.java @@ -58,7 +58,7 @@ public SetApprovalForAllCall( @NonNull final TransactionBody transactionBody, @NonNull final DispatchGasCalculator gasCalculator, final boolean isERC) { - super(attempt.systemContractGasCalculator(), attempt.enhancement()); + super(attempt.systemContractGasCalculator(), attempt.enhancement(), false); this.transactionBody = transactionBody; this.dispatchGasCalculator = gasCalculator; this.isERC = isERC; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/symbol/SymbolCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/symbol/SymbolCall.java index 1e10fc1c77ff..92b58a971abe 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/symbol/SymbolCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/symbol/SymbolCall.java @@ -16,11 +16,11 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.symbol; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import edu.umd.cs.findbugs.annotations.NonNull; @@ -41,7 +41,7 @@ public SymbolCall( * {@inheritDoc} */ @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingToken(@NonNull Token token) { + protected @NonNull FullResult resultOfViewingToken(@NonNull Token token) { final var output = SymbolTranslator.SYMBOL.getOutputs().encodeElements(token.symbol()); return successResult(output, gasCalculator.viewGasRequirement()); } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokenexpiry/TokenExpiryCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokenexpiry/TokenExpiryCall.java index 8c38e27de785..918c0c106eb8 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokenexpiry/TokenExpiryCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokenexpiry/TokenExpiryCall.java @@ -16,31 +16,21 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.tokenexpiry; -import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HtsSystemContract.HTS_PRECOMPILE_ADDRESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall.PricedResult.gasOnly; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.TokenTupleUtils.expiryTupleFor; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.tokenexpiry.TokenExpiryTranslator.TOKEN_EXPIRY; -import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asEvmContractId; -import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultFailedFor; -import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultSuccessFor; import static java.util.Objects.requireNonNull; -import com.hedera.hapi.node.base.ContractID; import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNonRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; -import org.apache.tuweni.bytes.Bytes; -import org.hyperledger.besu.datatypes.Address; public class TokenExpiryCall extends AbstractNonRevertibleTokenViewCall { private final boolean isStaticCall; @@ -78,35 +68,4 @@ public TokenExpiryCall( return successResult( TOKEN_EXPIRY.getOutputs().encodeElements(status.protoOrdinal(), expiryTupleFor(token)), gasRequirement); } - - @Override - public @NonNull PricedResult execute() { - PricedResult result; - long gasRequirement; - Bytes output; - ContractID contractID = asEvmContractId(Address.fromHexString(HTS_PRECOMPILE_ADDRESS)); - if (token == null) { - result = gasOnly(viewCallResultWith(INVALID_TOKEN_ID, gasCalculator.viewGasRequirement())); - - gasRequirement = result.fullResult().gasRequirement(); - enhancement - .systemOperations() - .externalizeResult( - contractFunctionResultFailedFor(gasRequirement, INVALID_TOKEN_ID.toString(), contractID), - SystemContractUtils.ResultStatus.IS_ERROR, - INVALID_TOKEN_ID); - } else { - result = gasOnly(resultOfViewingToken(token)); - - gasRequirement = result.fullResult().gasRequirement(); - output = result.fullResult().result().getOutput(); - enhancement - .systemOperations() - .externalizeResult( - contractFunctionResultSuccessFor(gasRequirement, output, contractID), - SystemContractUtils.ResultStatus.IS_SUCCESS, - SUCCESS); - } - return result; - } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokeninfo/TokenInfoCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokeninfo/TokenInfoCall.java index 53dd04ad057c..baec4f18d7aa 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokeninfo/TokenInfoCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokeninfo/TokenInfoCall.java @@ -17,8 +17,8 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.tokeninfo; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.TokenTupleUtils.tokenInfoTupleFor; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.tokeninfo.TokenInfoTranslator.TOKEN_INFO; import static java.util.Objects.requireNonNull; @@ -26,7 +26,7 @@ import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNonRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import com.hedera.node.config.data.LedgerConfig; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokenkey/TokenKeyCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokenkey/TokenKeyCall.java index 0037cea35359..6710135e56b7 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokenkey/TokenKeyCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokenkey/TokenKeyCall.java @@ -20,30 +20,21 @@ import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID; import static com.hedera.hapi.node.base.ResponseCodeEnum.KEY_NOT_PROVIDED; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HtsSystemContract.HTS_PRECOMPILE_ADDRESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall.PricedResult.gasOnly; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.TokenTupleUtils.keyTupleFor; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.tokenkey.TokenKeyTranslator.TOKEN_KEY; -import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asEvmContractId; -import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultFailedFor; -import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultSuccessFor; import static java.util.Objects.requireNonNull; -import com.hedera.hapi.node.base.ContractID; import com.hedera.hapi.node.base.Key; import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNonRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; -import org.apache.tuweni.bytes.Bytes; -import org.hyperledger.besu.datatypes.Address; public class TokenKeyCall extends AbstractNonRevertibleTokenViewCall { private final Key key; @@ -90,42 +81,12 @@ public TokenKeyCall( @Override public @NonNull PricedResult execute() { - PricedResult result; - long gasRequirement; - Bytes output; - ContractID contractID = asEvmContractId(Address.fromHexString(HTS_PRECOMPILE_ADDRESS)); if (token == null) { - result = gasOnly(viewCallResultWith(INVALID_TOKEN_ID, gasCalculator.viewGasRequirement())); - - gasRequirement = result.fullResult().gasRequirement(); - enhancement - .systemOperations() - .externalizeResult( - contractFunctionResultFailedFor(gasRequirement, INVALID_TOKEN_ID.toString(), contractID), - SystemContractUtils.ResultStatus.IS_ERROR, - INVALID_TOKEN_ID); + return externalizeUnsuccessfulResult(INVALID_TOKEN_ID, gasCalculator.viewGasRequirement()); } else if (key == null) { - result = gasOnly(viewCallResultWith(KEY_NOT_PROVIDED, gasCalculator.viewGasRequirement())); - - gasRequirement = result.fullResult().gasRequirement(); - enhancement - .systemOperations() - .externalizeResult( - contractFunctionResultFailedFor(gasRequirement, KEY_NOT_PROVIDED.toString(), contractID), - SystemContractUtils.ResultStatus.IS_ERROR, - KEY_NOT_PROVIDED); + return externalizeUnsuccessfulResult(KEY_NOT_PROVIDED, gasCalculator.viewGasRequirement()); } else { - result = gasOnly(resultOfViewingToken(token)); - - gasRequirement = result.fullResult().gasRequirement(); - output = result.fullResult().result().getOutput(); - enhancement - .systemOperations() - .externalizeResult( - contractFunctionResultSuccessFor(gasRequirement, output, contractID), - SystemContractUtils.ResultStatus.IS_SUCCESS, - SUCCESS); + return externalizeSuccessfulResult(); } - return result; } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokentype/TokenTypeCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokentype/TokenTypeCall.java index 0e9fba5fe92e..a1baf07827dd 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokentype/TokenTypeCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokentype/TokenTypeCall.java @@ -16,31 +16,20 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.tokentype; -import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HtsSystemContract.HTS_PRECOMPILE_ADDRESS; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall.PricedResult.gasOnly; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.tokentype.TokenTypeTranslator.TOKEN_TYPE; -import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asEvmContractId; -import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultFailedFor; -import static com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.contractFunctionResultSuccessFor; import static java.util.Objects.requireNonNull; -import com.hedera.hapi.node.base.ContractID; import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNonRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; -import org.apache.tuweni.bytes.Bytes; -import org.hyperledger.besu.datatypes.Address; public class TokenTypeCall extends AbstractNonRevertibleTokenViewCall { private final boolean isStaticCall; @@ -58,7 +47,7 @@ public TokenTypeCall( * {@inheritDoc} */ @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingToken(@NonNull final Token token) { + protected @NonNull FullResult resultOfViewingToken(@NonNull final Token token) { requireNonNull(token); return fullResultsFor( SUCCESS, gasCalculator.viewGasRequirement(), token.tokenType().protoOrdinal()); @@ -78,36 +67,4 @@ public TokenTypeCall( } return successResult(TOKEN_TYPE.getOutputs().encodeElements(status.protoOrdinal(), tokenType), gasRequirement); } - - @Override - public @NonNull PricedResult execute() { - PricedResult result; - long gasRequirement; - Bytes output; - - ContractID contractID = asEvmContractId(Address.fromHexString(HTS_PRECOMPILE_ADDRESS)); - if (token == null) { - result = gasOnly(viewCallResultWith(INVALID_TOKEN_ID, gasCalculator.viewGasRequirement())); - - gasRequirement = result.fullResult().gasRequirement(); - enhancement - .systemOperations() - .externalizeResult( - contractFunctionResultFailedFor(gasRequirement, INVALID_TOKEN_ID.toString(), contractID), - SystemContractUtils.ResultStatus.IS_ERROR, - INVALID_TOKEN_ID); - } else { - result = gasOnly(resultOfViewingToken(token)); - - gasRequirement = result.fullResult().gasRequirement(); - output = result.fullResult().result().getOutput(); - enhancement - .systemOperations() - .externalizeResult( - contractFunctionResultSuccessFor(gasRequirement, output, contractID), - SystemContractUtils.ResultStatus.IS_SUCCESS, - SUCCESS); - } - return result; - } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokenuri/TokenUriCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokenuri/TokenUriCall.java index 16529c46ff2d..108e515cd91f 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokenuri/TokenUriCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/tokenuri/TokenUriCall.java @@ -16,16 +16,13 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.tokenuri; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; -import static com.hedera.node.app.service.evm.utils.ValidationUtils.validateFalse; -import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.FAIL_INVALID; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static java.util.Objects.requireNonNull; -import com.hedera.hapi.node.base.TokenType; import com.hedera.hapi.node.state.token.Nft; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractNftViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import edu.umd.cs.findbugs.annotations.NonNull; @@ -50,9 +47,8 @@ public TokenUriCall( * {@inheritDoc} */ @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingNft(@NonNull final Token token, final Nft nft) { + protected @NonNull FullResult resultOfViewingNft(@NonNull final Token token, final Nft nft) { requireNonNull(token); - validateFalse(token.tokenType() == TokenType.FUNGIBLE_COMMON, FAIL_INVALID); String metadata; if (nft != null) { metadata = new String(nft.metadata().toByteArray()); @@ -64,7 +60,7 @@ public TokenUriCall( } @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingToken(@NonNull final Token token) { + protected @NonNull FullResult resultOfViewingToken(@NonNull final Token token) { requireNonNull(token); final var nft = nativeOperations().getNft(token.tokenIdOrThrow().tokenNum(), serialNo); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/totalsupply/TotalSupplyCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/totalsupply/TotalSupplyCall.java index a1079548c12f..112075cf39a1 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/totalsupply/TotalSupplyCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/totalsupply/TotalSupplyCall.java @@ -16,11 +16,11 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.totalsupply; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import com.hedera.hapi.node.state.token.Token; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractRevertibleTokenViewCall; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import edu.umd.cs.findbugs.annotations.NonNull; @@ -43,7 +43,7 @@ public TotalSupplyCall( * {@inheritDoc} */ @Override - protected @NonNull HederaSystemContract.FullResult resultOfViewingToken(@NonNull Token token) { + protected @NonNull FullResult resultOfViewingToken(@NonNull Token token) { final var output = TotalSupplyTranslator.TOTAL_SUPPLY.getOutputs().encodeElements(BigInteger.valueOf(token.totalSupply())); return successResult(output, 0L); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/ClassicTransfersCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/ClassicTransfersCall.java index cf9b6545d07b..e289ff02796f 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/ClassicTransfersCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/ClassicTransfersCall.java @@ -18,23 +18,26 @@ import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_RECEIVING_NODE_ACCOUNT; import static com.hedera.hapi.node.base.ResponseCodeEnum.NOT_SUPPORTED; +import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes.encodedRc; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes.standardized; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.transfer.TransferEventLoggingUtils.logSuccessfulFungibleTransfer; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.transfer.TransferEventLoggingUtils.logSuccessfulNftTransfer; import static java.util.Collections.emptyList; import static java.util.Objects.requireNonNull; import com.hedera.hapi.node.base.AccountID; import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.base.TransferList; -import com.hedera.hapi.node.contract.ContractFunctionResult; import com.hedera.hapi.node.token.CryptoTransferTransactionBody; import com.hedera.hapi.node.transaction.TransactionBody; import com.hedera.node.app.service.contract.impl.exec.gas.DispatchType; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; import com.hedera.node.app.service.contract.impl.exec.scope.VerificationStrategy; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractHtsCall; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; +import com.hedera.node.app.service.contract.impl.records.ContractCallRecordBuilder; import com.hedera.node.app.service.token.ReadableAccountStore; -import com.hedera.node.app.service.token.records.CryptoTransferRecordBuilder; import com.hedera.node.config.data.ContractsConfig; import com.hedera.pbj.runtime.io.buffer.Bytes; import com.swirlds.config.api.Configuration; @@ -43,6 +46,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Set; +import org.hyperledger.besu.evm.frame.MessageFrame; /** * Implements the "classic" HTS transfer calls, which differ from the ERC redirects in three notable ways: @@ -60,7 +64,6 @@ * But the basic pattern of constructing and dispatching a synthetic {@link CryptoTransferTransactionBody} remains. */ public class ClassicTransfersCall extends AbstractHtsCall { - private final byte[] selector; private final AccountID spenderId; private final TransactionBody syntheticTransfer; @@ -85,7 +88,7 @@ public ClassicTransfersCall( @Nullable ApprovalSwitchHelper approvalSwitchHelper, @NonNull final VerificationStrategy verificationStrategy, @NonNull final SystemAccountCreditScreen systemAccountCreditScreen) { - super(gasCalculator, enhancement); + super(gasCalculator, enhancement, false); this.selector = requireNonNull(selector); this.spenderId = requireNonNull(spenderId); this.syntheticTransfer = requireNonNull(syntheticTransfer); @@ -99,16 +102,18 @@ public ClassicTransfersCall( * {@inheritDoc} */ @Override - public @NonNull PricedResult execute() { + public @NonNull PricedResult execute(@NonNull final MessageFrame frame) { final var gasRequirement = transferGasRequirement(syntheticTransfer, gasCalculator, enhancement, spenderId); - // https://github.com/hashgraph/hedera-smart-contracts/blob/main/contracts/hts-precompile/IHederaTokenService.sol if (systemAccountCreditScreen.creditsToSystemAccount(syntheticTransfer.cryptoTransferOrThrow())) { - // TODO - externalize the invalid synthetic transfer without dispatching it - return reversionWith(INVALID_RECEIVING_NODE_ACCOUNT, gasRequirement); + return reversionWith( + gasRequirement, + systemContractOperations() + .externalizePreemptedDispatch(syntheticTransfer, INVALID_RECEIVING_NODE_ACCOUNT)); } if (executionIsNotSupported()) { - // TODO - externalize the unsupported synthetic transfer without dispatching it - return completionWith(NOT_SUPPORTED, gasRequirement); + return haltWith( + gasRequirement, + systemContractOperations().externalizePreemptedDispatch(syntheticTransfer, NOT_SUPPORTED)); } final var transferToDispatch = shouldRetryWithApprovals() ? syntheticTransfer @@ -121,14 +126,13 @@ public ClassicTransfersCall( .build() : syntheticTransfer; final var recordBuilder = systemContractOperations() - .dispatch(transferToDispatch, verificationStrategy, spenderId, CryptoTransferRecordBuilder.class); - - var output = ReturnTypes.encodedRc(recordBuilder.status()); - recordBuilder.contractCallResult(ContractFunctionResult.newBuilder() - .contractCallResult(Bytes.wrap(output.array())) - .build()); - - return completionWith(recordBuilder.status(), gasRequirement); + .dispatch(transferToDispatch, verificationStrategy, spenderId, ContractCallRecordBuilder.class); + if (recordBuilder.status() == SUCCESS) { + maybeEmitErcLogsFor(transferToDispatch.cryptoTransferOrThrow(), frame); + } else { + recordBuilder.status(standardized(recordBuilder.status())); + } + return completionWith(gasRequirement, recordBuilder, encodedRc(recordBuilder.status())); } /** @@ -224,4 +228,23 @@ private boolean executionIsNotSupported() { return Arrays.equals(selector, ClassicTransfersTranslator.CRYPTO_TRANSFER_V2.selector()) && !configuration.getConfigData(ContractsConfig.class).precompileAtomicCryptoTransferEnabled(); } + + private void maybeEmitErcLogsFor( + @NonNull final CryptoTransferTransactionBody op, @NonNull final MessageFrame frame) { + if (Arrays.equals(ClassicTransfersTranslator.TRANSFER_FROM.selector(), selector)) { + final var fungibleTransfers = op.tokenTransfersOrThrow().get(0); + logSuccessfulFungibleTransfer( + fungibleTransfers.tokenOrThrow(), + fungibleTransfers.transfersOrThrow(), + readableAccountStore(), + frame); + } else if (Arrays.equals(ClassicTransfersTranslator.TRANSFER_NFT_FROM.selector(), selector)) { + final var nftTransfers = op.tokenTransfersOrThrow().get(0); + logSuccessfulNftTransfer( + nftTransfers.tokenOrThrow(), + nftTransfers.nftTransfersOrThrow().get(0), + readableAccountStore(), + frame); + } + } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/ClassicTransfersDecoder.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/ClassicTransfersDecoder.java index ed01a078e95e..629ee4494697 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/ClassicTransfersDecoder.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/ClassicTransfersDecoder.java @@ -16,6 +16,9 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.transfer; +import static java.util.Collections.emptyList; +import static java.util.Objects.requireNonNull; + import com.esaulpaugh.headlong.abi.Address; import com.esaulpaugh.headlong.abi.Tuple; import com.hedera.hapi.node.base.AccountAmount; @@ -30,7 +33,15 @@ import com.hedera.node.app.service.contract.impl.utils.ConversionUtils; import edu.umd.cs.findbugs.annotations.NonNull; import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.function.Function; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; @@ -217,9 +228,78 @@ private TokenTransferList[] convertTokenTransfers( return allImpliedTransfers; } - private CryptoTransferTransactionBody.Builder tokenTransfers( - @NonNull final TokenTransferList... tokenTransferList) { - return CryptoTransferTransactionBody.newBuilder().tokenTransfers(tokenTransferList); + private CryptoTransferTransactionBody.Builder tokenTransfers(@NonNull TokenTransferList... tokenTransferLists) { + if (repeatsTokenId(tokenTransferLists)) { + final Map consolidatedTokenTransfers = new LinkedHashMap<>(); + for (final var tokenTransferList : tokenTransferLists) { + consolidatedTokenTransfers.merge( + tokenTransferList.tokenOrThrow(), tokenTransferList, this::mergeTokenTransferLists); + } + tokenTransferLists = consolidatedTokenTransfers.values().toArray(TokenTransferList[]::new); + } + return CryptoTransferTransactionBody.newBuilder().tokenTransfers(tokenTransferLists); + } + + private TokenTransferList mergeTokenTransferLists( + @NonNull final TokenTransferList from, @NonNull final TokenTransferList to) { + return from.copyBuilder() + .transfers(mergeTransfers(from.transfersOrElse(emptyList()), to.transfersOrElse(emptyList()))) + .nftTransfers( + mergeNftTransfers(from.nftTransfersOrElse(emptyList()), to.nftTransfersOrElse(emptyList()))) + .build(); + } + + private List mergeTransfers( + @NonNull final List from, @NonNull final List to) { + requireNonNull(from); + requireNonNull(to); + final Map consolidated = new LinkedHashMap<>(); + consolidateInto(consolidated, from); + consolidateInto(consolidated, to); + return consolidated.values().stream().toList(); + } + + private void consolidateInto( + @NonNull final Map consolidated, @NonNull final List transfers) { + for (final var transfer : transfers) { + consolidated.merge(transfer.accountID(), transfer, this::mergeAdjusts); + } + } + + private AccountAmount mergeAdjusts(@NonNull final AccountAmount from, @NonNull final AccountAmount to) { + return from.copyBuilder() + .amount(from.amount() + to.amount()) + .isApproval(from.isApproval() || to.isApproval()) + .build(); + } + + private List mergeNftTransfers( + @NonNull final List from, @NonNull final List to) { + final Set present = new HashSet<>(); + final List consolidated = new ArrayList<>(); + consolidateInto(present, consolidated, from); + consolidateInto(present, consolidated, to); + return consolidated; + } + + private void consolidateInto( + @NonNull final Set present, + @NonNull final List consolidated, + @NonNull final List transfers) { + for (final var transfer : transfers) { + if (present.add(transfer)) { + consolidated.add(transfer); + } + } + } + + private boolean repeatsTokenId(@NonNull final TokenTransferList[] tokenTransferList) { + return tokenTransferList.length > 1 + && Arrays.stream(tokenTransferList) + .map(TokenTransferList::token) + .collect(Collectors.toSet()) + .size() + < tokenTransferList.length; } private TokenTransferList adjustingUnits( diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/Erc20TransfersCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/Erc20TransfersCall.java index 8bd4ee3bf60a..8aacd6538a8e 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/Erc20TransfersCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/Erc20TransfersCall.java @@ -17,11 +17,10 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.transfer; import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall.PricedResult.gasOnly; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.transfer.ClassicTransfersCall.transferGasRequirement; -import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asLongZeroAddress; import static java.util.Objects.requireNonNull; import com.esaulpaugh.headlong.abi.Address; @@ -35,25 +34,19 @@ import com.hedera.hapi.node.transaction.TransactionBody; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; import com.hedera.node.app.service.contract.impl.exec.scope.VerificationStrategy; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbiConstants; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractHtsCall; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AddressIdConverter; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.LogBuilder; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; import com.hedera.node.app.service.token.records.CryptoTransferRecordBuilder; import com.hedera.pbj.runtime.io.buffer.Bytes; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; -import java.math.BigInteger; -import java.util.List; import org.hyperledger.besu.evm.frame.MessageFrame; -import org.hyperledger.besu.evm.log.Log; /** * Implements the ERC-20 {@code transfer()} and {@code transferFrom()} calls of the HTS contract. */ public class Erc20TransfersCall extends AbstractHtsCall { - private final long amount; @Nullable @@ -80,7 +73,7 @@ public Erc20TransfersCall( @NonNull final VerificationStrategy verificationStrategy, @NonNull final AccountID senderId, @NonNull final AddressIdConverter addressIdConverter) { - super(gasCalculator, enhancement); + super(gasCalculator, enhancement, false); this.amount = amount; this.from = from; this.to = requireNonNull(to); @@ -107,8 +100,9 @@ public Erc20TransfersCall( verificationStrategy, senderId, CryptoTransferRecordBuilder.class); - if (recordBuilder.status() != ResponseCodeEnum.SUCCESS) { - return gasOnly(revertResult(recordBuilder.status(), gasRequirement)); + final var status = recordBuilder.status(); + if (status != ResponseCodeEnum.SUCCESS) { + return gasOnly(revertResult(status, gasRequirement), status, false); } else { final var encodedOutput = (from == null) ? Erc20TransfersTranslator.ERC_20_TRANSFER.getOutputs().encodeElements(true) @@ -117,7 +111,7 @@ public Erc20TransfersCall( recordBuilder.contractCallResult(ContractFunctionResult.newBuilder() .contractCallResult(Bytes.wrap(encodedOutput.array())) .build()); - return gasOnly(successResult(encodedOutput, gasRequirement)); + return gasOnly(successResult(encodedOutput, gasRequirement), status, false); } } @@ -127,40 +121,20 @@ public PricedResult execute(final MessageFrame frame) { final var result = execute(); if (result.fullResult().result().getState().equals(MessageFrame.State.COMPLETED_SUCCESS)) { - final var tokenAddress = asLongZeroAddress(tokenId.tokenNum()); - List tokenTransferLists = - syntheticTransferOrTransferFrom(senderId).cryptoTransfer().tokenTransfers(); + final var tokenTransferLists = syntheticTransferOrTransferFrom(senderId) + .cryptoTransferOrThrow() + .tokenTransfersOrThrow(); for (final var fungibleTransfers : tokenTransferLists) { - frame.addLog(getLogForFungibleTransfer(tokenAddress, fungibleTransfers.transfers())); + TransferEventLoggingUtils.logSuccessfulFungibleTransfer( + requireNonNull(tokenId), + fungibleTransfers.transfersOrThrow(), + enhancement.nativeOperations().readableAccountStore(), + frame); } } return result; } - private Log getLogForFungibleTransfer( - final org.hyperledger.besu.datatypes.Address logger, List transfers) { - AccountID sender = AccountID.DEFAULT; - AccountID receiver = AccountID.DEFAULT; - BigInteger amount = BigInteger.ZERO; - - for (final var accountAmount : transfers) { - if (accountAmount.amount() > 0) { - receiver = accountAmount.accountID(); - amount = BigInteger.valueOf(accountAmount.amount()); - } else { - sender = accountAmount.accountID(); - } - } - - return LogBuilder.logBuilder() - .forLogger(logger) - .forEventSignature(AbiConstants.TRANSFER_EVENT) - .forIndexedArgument(asLongZeroAddress(sender.accountNum())) - .forIndexedArgument(asLongZeroAddress(receiver.accountNum())) - .forDataItem(amount) - .build(); - } - private TransactionBody syntheticTransferOrTransferFrom(@NonNull final AccountID spenderId) { final var receiverId = addressIdConverter.convertCredit(to); final var ownerId = (from == null) ? spenderId : addressIdConverter.convert(from); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/Erc721TransferFromCall.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/Erc721TransferFromCall.java index 967c6ab2cfff..94366211d0b6 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/Erc721TransferFromCall.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/Erc721TransferFromCall.java @@ -17,11 +17,11 @@ package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.transfer; import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TOKEN_ID; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.revertResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.revertResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall.PricedResult.gasOnly; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.transfer.ClassicTransfersCall.transferGasRequirement; -import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asLongZeroAddress; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.transfer.TransferEventLoggingUtils.logSuccessfulNftTransfer; import static java.util.Objects.requireNonNull; import com.esaulpaugh.headlong.abi.Address; @@ -37,15 +37,10 @@ import com.hedera.node.app.service.contract.impl.exec.scope.VerificationStrategy; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbstractHtsCall; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AddressIdConverter; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.LogBuilder; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; -import com.hedera.node.app.service.mono.store.contracts.precompile.AbiConstants; import com.hedera.node.app.service.token.records.CryptoTransferRecordBuilder; import edu.umd.cs.findbugs.annotations.NonNull; -import java.math.BigInteger; -import java.util.List; import org.hyperledger.besu.evm.frame.MessageFrame; -import org.hyperledger.besu.evm.log.Log; /** * Implements the ERC-721 {@code transferFrom()} call of the HTS contract. @@ -72,7 +67,7 @@ public Erc721TransferFromCall( @NonNull final SystemContractGasCalculator gasCalculator, @NonNull final AccountID senderId, @NonNull final AddressIdConverter addressIdConverter) { - super(gasCalculator, enhancement); + super(gasCalculator, enhancement, false); this.from = requireNonNull(from); this.to = requireNonNull(to); this.tokenId = tokenId; @@ -95,45 +90,52 @@ public Erc721TransferFromCall( final var gasRequirement = transferGasRequirement(syntheticTransfer, gasCalculator, enhancement, senderId); final var recordBuilder = systemContractOperations() .dispatch(syntheticTransfer, verificationStrategy, senderId, CryptoTransferRecordBuilder.class); - if (recordBuilder.status() != ResponseCodeEnum.SUCCESS) { - return gasOnly(revertResult(recordBuilder.status(), gasRequirement)); + final var status = recordBuilder.status(); + if (status != ResponseCodeEnum.SUCCESS) { + return gasOnly(revertResult(status, gasRequirement), status, false); } else { - return gasOnly(successResult( - Erc721TransferFromTranslator.ERC_721_TRANSFER_FROM - .getOutputs() - .encodeElements(), - gasRequirement)); + return gasOnly( + successResult( + Erc721TransferFromTranslator.ERC_721_TRANSFER_FROM + .getOutputs() + .encodeElements(), + gasRequirement), + status, + false); } } @NonNull @Override public PricedResult execute(final MessageFrame frame) { - final var result = execute(); - - if (result.fullResult().result().getState().equals(MessageFrame.State.COMPLETED_SUCCESS)) { - final var tokenAddress = asLongZeroAddress(tokenId.tokenNum()); - List tokenTransferLists = - syntheticTransfer(senderId).cryptoTransfer().tokenTransfers(); - for (final var nftTransfers : tokenTransferLists) { - frame.addLog(getLogForNftExchange( - tokenAddress, nftTransfers.nftTransfers().get(0))); - } + // https://eips.ethereum.org/EIPS/eip-721 + if (tokenId == null) { + return reversionWith(INVALID_TOKEN_ID, gasCalculator.canonicalGasRequirement(DispatchType.TRANSFER_NFT)); + } + final var syntheticTransfer = syntheticTransfer(senderId); + final var gasRequirement = transferGasRequirement(syntheticTransfer, gasCalculator, enhancement, senderId); + final var recordBuilder = systemContractOperations() + .dispatch(syntheticTransfer, verificationStrategy, senderId, CryptoTransferRecordBuilder.class); + final var status = recordBuilder.status(); + if (status != ResponseCodeEnum.SUCCESS) { + return gasOnly(revertResult(status, gasRequirement), status, false); + } else { + final var nftTransfer = syntheticTransfer + .cryptoTransferOrThrow() + .tokenTransfersOrThrow() + .get(0) + .nftTransfersOrThrow() + .get(0); + logSuccessfulNftTransfer(tokenId, nftTransfer, readableAccountStore(), frame); + return gasOnly( + successResult( + Erc721TransferFromTranslator.ERC_721_TRANSFER_FROM + .getOutputs() + .encodeElements(), + gasRequirement), + status, + false); } - return result; - } - - private Log getLogForNftExchange(final org.hyperledger.besu.datatypes.Address logger, NftTransfer nftTransfer) { - AccountID sender = nftTransfer.senderAccountID(); - AccountID receiver = nftTransfer.receiverAccountID(); - - return LogBuilder.logBuilder() - .forLogger(logger) - .forEventSignature(AbiConstants.TRANSFER_EVENT) - .forIndexedArgument(asLongZeroAddress(sender.accountNum())) - .forIndexedArgument(asLongZeroAddress(receiver.accountNum())) - .forIndexedArgument(BigInteger.valueOf(nftTransfer.serialNumber())) - .build(); } private TransactionBody syntheticTransfer(@NonNull final AccountID spenderId) { diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/TransferEventLoggingUtils.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/TransferEventLoggingUtils.java new file mode 100644 index 000000000000..f0e5d86c8907 --- /dev/null +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/systemcontracts/hts/transfer/TransferEventLoggingUtils.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.transfer; + +import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.asLongZeroAddress; +import static com.hedera.node.app.service.contract.impl.utils.ConversionUtils.priorityAddressOf; +import static java.util.Objects.requireNonNull; + +import com.hedera.hapi.node.base.AccountAmount; +import com.hedera.hapi.node.base.AccountID; +import com.hedera.hapi.node.base.NftTransfer; +import com.hedera.hapi.node.base.TokenID; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.AbiConstants; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.LogBuilder; +import com.hedera.node.app.service.token.ReadableAccountStore; +import edu.umd.cs.findbugs.annotations.NonNull; +import java.math.BigInteger; +import java.util.List; +import org.hyperledger.besu.evm.frame.MessageFrame; + +/** + * Helper for logging ERC transfer events for fungible and non-fungible transfers. + */ +public class TransferEventLoggingUtils { + private TransferEventLoggingUtils() { + throw new UnsupportedOperationException("Utility Class"); + } + + /** + * Logs a successful ERC-20 transfer event based on the Hedera-style representation of the fungible + * balance adjustments. + * + * @param tokenId the token ID + * @param adjusts the Hedera-style representation of the fungible balance adjustments + * @param accountStore the account store to get account addresses from + * @param frame the frame to log to + */ + public static void logSuccessfulFungibleTransfer( + @NonNull final TokenID tokenId, + @NonNull final List adjusts, + @NonNull final ReadableAccountStore accountStore, + @NonNull final MessageFrame frame) { + requireNonNull(tokenId); + requireNonNull(frame); + requireNonNull(adjusts); + requireNonNull(accountStore); + AccountID senderId = null; + AccountID receiverId = null; + long amount = 0L; + for (final var adjust : adjusts) { + amount = Math.abs(adjust.amount()); + if (adjust.amount() > 0) { + receiverId = adjust.accountIDOrThrow(); + } else { + senderId = adjust.accountIDOrThrow(); + } + } + frame.addLog(builderFor(tokenId, requireNonNull(senderId), requireNonNull(receiverId), accountStore) + .forDataItem(amount) + .build()); + } + + /** + * Logs a successful ERC-721 transfer event based on the Hedera-style representation of the NFT ownership change. + * + * @param tokenId the token ID + * @param nftTransfer the Hedera-style representation of the NFT ownership change + * @param accountStore the account store to get account addresses from + * @param frame the frame to log to + */ + public static void logSuccessfulNftTransfer( + @NonNull final TokenID tokenId, + @NonNull final NftTransfer nftTransfer, + @NonNull final ReadableAccountStore accountStore, + @NonNull final MessageFrame frame) { + requireNonNull(tokenId); + requireNonNull(frame); + requireNonNull(nftTransfer); + requireNonNull(accountStore); + frame.addLog(builderFor( + tokenId, + nftTransfer.senderAccountIDOrThrow(), + nftTransfer.receiverAccountIDOrThrow(), + accountStore) + .forIndexedArgument(BigInteger.valueOf(nftTransfer.serialNumber())) + .build()); + } + + private static LogBuilder builderFor( + @NonNull final TokenID tokenId, + @NonNull final AccountID senderId, + @NonNull final AccountID receiverId, + @NonNull final ReadableAccountStore accountStore) { + final var tokenAddress = asLongZeroAddress(tokenId.tokenNum()); + final var senderAddress = priorityAddressOf(requireNonNull(accountStore.getAccountById(senderId))); + final var receiverAddress = priorityAddressOf(requireNonNull(accountStore.getAccountById(receiverId))); + return LogBuilder.logBuilder() + .forLogger(tokenAddress) + .forEventSignature(AbiConstants.TRANSFER_EVENT) + .forIndexedArgument(senderAddress) + .forIndexedArgument(receiverAddress); + } +} diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/hevm/HederaWorldUpdater.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/hevm/HederaWorldUpdater.java index 22153565d92a..db63ea892413 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/hevm/HederaWorldUpdater.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/hevm/HederaWorldUpdater.java @@ -31,7 +31,6 @@ import com.hedera.node.app.service.contract.impl.state.PendingCreation; import com.hedera.node.app.service.contract.impl.state.ProxyWorldUpdater; import com.hedera.node.app.service.contract.impl.state.StorageAccesses; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.ResultStatus; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; import java.util.List; @@ -269,12 +268,9 @@ Optional tryTransfer( /** * Externalizes the results of a system contract call into a record * @param result The result of the system contract call - * @param status Whether the result is an error */ void externalizeSystemContractResults( - @NonNull final ContractFunctionResult result, - ResultStatus status, - @NonNull ResponseCodeEnum responseStatus); + @NonNull final ContractFunctionResult result, @NonNull ResponseCodeEnum responseStatus); /** * Returns the {@link ExchangeRate} for the current consensus timestamp diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/records/ContractCallRecordBuilder.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/records/ContractCallRecordBuilder.java index 315d47eeea64..e059d255585c 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/records/ContractCallRecordBuilder.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/records/ContractCallRecordBuilder.java @@ -22,6 +22,7 @@ import com.hedera.hapi.node.contract.ContractFunctionResult; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; +import java.util.List; /** * Exposes the record customizations needed for a HAPI contract call transaction. @@ -37,6 +38,14 @@ public interface ContractCallRecordBuilder extends GasFeeRecordBuilder { @NonNull ContractCallRecordBuilder status(@NonNull ResponseCodeEnum status); + /** + * Returns final status of this contract call's record. + * + * @return the final status of this contract call + */ + @NonNull + ResponseCodeEnum status(); + /** * Tracks the contract id called. * @@ -63,4 +72,18 @@ public interface ContractCallRecordBuilder extends GasFeeRecordBuilder { */ @NonNull ContractCallRecordBuilder transaction(@NonNull final Transaction txn); + + /** + * Gets the newly minted serial numbers. + * + * @return the newly minted serial numbers + */ + List serialNumbers(); + + /** + * Gets the new total supply of a token, e.g. after minting or burning. + * + * @return new total supply of a token + */ + long getNewTotalSupply(); } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/state/ProxyWorldUpdater.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/state/ProxyWorldUpdater.java index e67a9863050f..28823f07ab5f 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/state/ProxyWorldUpdater.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/state/ProxyWorldUpdater.java @@ -35,7 +35,6 @@ import com.hedera.hapi.node.transaction.ExchangeRate; import com.hedera.node.app.service.contract.impl.exec.scope.HandleHederaOperations; import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.ResultStatus; import com.hedera.node.app.spi.workflows.ResourceExhaustedException; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; @@ -458,10 +457,8 @@ public void commit() { */ @Override public void externalizeSystemContractResults( - @NonNull final ContractFunctionResult result, - final ResultStatus status, - @NonNull ResponseCodeEnum responseStatus) { - enhancement.systemOperations().externalizeResult(result, status, responseStatus); + @NonNull final ContractFunctionResult result, @NonNull ResponseCodeEnum responseStatus) { + enhancement.systemOperations().externalizeResult(result, responseStatus); } /** diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/utils/ConversionUtils.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/utils/ConversionUtils.java index bc7433b209de..df8a278488e1 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/utils/ConversionUtils.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/utils/ConversionUtils.java @@ -161,6 +161,17 @@ public static com.esaulpaugh.headlong.abi.Address headlongAddressOf(@NonNull fin return asHeadlongAddress(asEvmAddress(tokenId.tokenNum())); } + /** + * Given an account, returns its "priority" address as a Besu address. + * + * @param account the account + * @return the priority address + */ + public static Address priorityAddressOf(@NonNull final Account account) { + requireNonNull(account); + return Address.wrap(Bytes.wrap(explicitAddressOf(account))); + } + /** * Given an account, returns its "priority" address as a headlong address. * diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/TestHelpers.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/TestHelpers.java index c2bcda0000cf..441687e07cf6 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/TestHelpers.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/TestHelpers.java @@ -70,7 +70,7 @@ import com.hedera.node.app.service.contract.impl.exec.scope.ActiveContractVerificationStrategy; import com.hedera.node.app.service.contract.impl.exec.scope.ActiveContractVerificationStrategy.UseTopLevelSigs; import com.hedera.node.app.service.contract.impl.exec.scope.VerificationStrategy; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCallAttempt; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.TokenTupleUtils.TokenKeyType; import com.hedera.node.app.service.contract.impl.hevm.HederaEvmBlocks; @@ -592,8 +592,7 @@ public static void assertSameResult( assertEquals(expected.getGasCost(), actual.getGasCost()); } - public static void assertSamePrecompileResult( - final HederaSystemContract.FullResult expected, final HederaSystemContract.FullResult actual) { + public static void assertSamePrecompileResult(final FullResult expected, final FullResult actual) { assertEquals(expected.gasRequirement(), actual.gasRequirement()); final var expectedResult = expected.result(); final var actualResult = actual.result(); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/processors/CustomMessageCallProcessorTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/processors/CustomMessageCallProcessorTest.java index 195bdcd91c69..ee86c8fdba25 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/processors/CustomMessageCallProcessorTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/processors/CustomMessageCallProcessorTest.java @@ -32,7 +32,7 @@ import com.hedera.node.app.service.contract.impl.exec.FeatureFlags; import com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason; import com.hedera.node.app.service.contract.impl.exec.processors.CustomMessageCallProcessor; -import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.PrngSystemContract; import com.hedera.node.app.service.contract.impl.state.ProxyWorldUpdater; import com.hedera.node.app.service.contract.impl.test.TestHelpers; @@ -310,8 +310,7 @@ private void givenEvmPrecompileCall() { private void givenPrngCall(long gasRequirement) { givenCallWithCode(TestHelpers.PRNG_SYSTEM_CONTRACT_ADDRESS); given(frame.getInputData()).willReturn(TestHelpers.PRNG_SYSTEM_CONTRACT_ADDRESS); - given(prngPrecompile.computeFully(any(), any())) - .willReturn(new HederaSystemContract.FullResult(result, gasRequirement)); + given(prngPrecompile.computeFully(any(), any())).willReturn(new FullResult(result, gasRequirement, null)); given(result.getOutput()).willReturn(OUTPUT_DATA); } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/processors/ProcessorModuleTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/processors/ProcessorModuleTest.java index f7f3334f65ae..809ac8ea4890 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/processors/ProcessorModuleTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/processors/ProcessorModuleTest.java @@ -16,7 +16,7 @@ package com.hedera.node.app.service.contract.impl.test.exec.processors; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HtsSystemContract.HTS_PRECOMPILE_ADDRESS; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HtsSystemContract.HTS_EVM_ADDRESS; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.PrngSystemContract.PRNG_PRECOMPILE_ADDRESS; import static org.assertj.core.api.Assertions.assertThat; @@ -48,7 +48,7 @@ void provideHederaSystemContracts() { assertThat(hederaSystemContracts) .isNotNull() .hasSize(3) - .containsKey(Address.fromHexString(HTS_PRECOMPILE_ADDRESS)) + .containsKey(Address.fromHexString(HTS_EVM_ADDRESS)) .containsKey(Address.fromHexString(ExchangeRateSystemContract.EXCHANGE_RATE_SYSTEM_CONTRACT_ADDRESS)) .containsKey(Address.fromHexString(PRNG_PRECOMPILE_ADDRESS)); } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/scope/HandleSystemContractOperationsTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/scope/HandleSystemContractOperationsTest.java index eeff7d0ff08f..e67c91e23aa7 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/scope/HandleSystemContractOperationsTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/scope/HandleSystemContractOperationsTest.java @@ -20,7 +20,6 @@ import static com.hedera.node.app.service.contract.impl.test.TestHelpers.A_NEW_ACCOUNT_ID; import static com.hedera.node.app.spi.workflows.HandleContext.TransactionCategory.CHILD; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -29,7 +28,6 @@ import static org.mockito.Mockito.verify; import com.hedera.hapi.node.base.ContractID; -import com.hedera.hapi.node.base.NftID; import com.hedera.hapi.node.base.ResponseCodeEnum; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.transaction.TransactionBody; @@ -39,12 +37,10 @@ import com.hedera.node.app.service.contract.impl.records.ContractCallRecordBuilder; import com.hedera.node.app.service.contract.impl.test.TestHelpers; import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.ResultStatus; import com.hedera.node.app.service.token.records.CryptoTransferRecordBuilder; import com.hedera.node.app.spi.fees.ExchangeRateInfo; import com.hedera.node.app.spi.signatures.SignatureVerification; import com.hedera.node.app.spi.workflows.HandleContext; -import com.hedera.pbj.runtime.io.buffer.Bytes; import java.util.function.Predicate; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -81,13 +77,6 @@ void setUp() { subject = new HandleSystemContractOperations(context); } - @Test - void getNftNotImplementedYet() { - assertThrows( - AssertionError.class, - () -> subject.getNftAndExternalizeResult(NftID.DEFAULT, 1L, entity -> Bytes.EMPTY)); - } - @Test @SuppressWarnings("unchecked") void dispatchesRespectingGivenStrategy() { @@ -118,16 +107,6 @@ void dispatchesRespectingGivenStrategy() { assertFalse(test.test(TestHelpers.B_SECP256K1_KEY)); } - @Test - void getTokenNotImplementedYet() { - assertThrows(AssertionError.class, () -> subject.getTokenAndExternalizeResult(1L, 2L, entity -> Bytes.EMPTY)); - } - - @Test - void getAccountNotImplementedYet() { - assertThrows(AssertionError.class, () -> subject.getAccountAndExternalizeResult(1L, 2L, entity -> Bytes.EMPTY)); - } - @Test void externalizeSuccessfulResultTest() { var contractFunctionResult = SystemContractUtils.contractFunctionResultSuccessFor( @@ -140,7 +119,7 @@ void externalizeSuccessfulResultTest() { given(recordBuilder.contractID(ContractID.DEFAULT)).willReturn(recordBuilder); // when - subject.externalizeResult(contractFunctionResult, ResultStatus.IS_SUCCESS, ResponseCodeEnum.SUCCESS); + subject.externalizeResult(contractFunctionResult, ResponseCodeEnum.SUCCESS); // then verify(recordBuilder).contractID(ContractID.DEFAULT); @@ -161,7 +140,7 @@ void externalizeFailedResultTest() { given(recordBuilder.contractID(ContractID.DEFAULT)).willReturn(recordBuilder); // when - subject.externalizeResult(contractFunctionResult, ResultStatus.IS_ERROR, ResponseCodeEnum.FAIL_INVALID); + subject.externalizeResult(contractFunctionResult, ResponseCodeEnum.FAIL_INVALID); // then verify(recordBuilder).contractID(ContractID.DEFAULT); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/scope/QuerySystemContractOperationsTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/scope/QuerySystemContractOperationsTest.java index bd590ba9a425..6bb414640dbf 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/scope/QuerySystemContractOperationsTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/scope/QuerySystemContractOperationsTest.java @@ -36,7 +36,6 @@ import com.hedera.hapi.node.transaction.TransactionBody; import com.hedera.node.app.service.contract.impl.exec.scope.QuerySystemContractOperations; import com.hedera.node.app.service.contract.impl.exec.scope.ResultTranslator; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.ResultStatus; import com.hedera.node.app.spi.fees.ExchangeRateInfo; import com.hedera.node.app.spi.workflows.QueryContext; import com.hedera.node.config.data.ContractsConfig; @@ -85,15 +84,6 @@ void setUp() { @Test void doesNotSupportAnyMutations() { - assertThrows( - UnsupportedOperationException.class, - () -> subject.getNftAndExternalizeResult(nftID, 1L, nftResultTranslator)); - assertThrows( - UnsupportedOperationException.class, - () -> subject.getTokenAndExternalizeResult(1L, 2L, tokenResultTranslator)); - assertThrows( - UnsupportedOperationException.class, - () -> subject.getAccountAndExternalizeResult(1L, 2L, accountResultTranslator)); assertThrows( UnsupportedOperationException.class, () -> subject.dispatch( @@ -101,8 +91,7 @@ void doesNotSupportAnyMutations() { assertThrows( UnsupportedOperationException.class, () -> subject.activeSignatureTestWith(MOCK_VERIFICATION_STRATEGY)); - assertDoesNotThrow(() -> subject.externalizeResult( - ContractFunctionResult.DEFAULT, ResultStatus.IS_SUCCESS, ResponseCodeEnum.SUCCESS)); + assertDoesNotThrow(() -> subject.externalizeResult(ContractFunctionResult.DEFAULT, ResponseCodeEnum.SUCCESS)); } @Test diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/HtsSystemContractTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/HtsSystemContractTest.java index 7e5274bcb32e..e870160fb05b 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/HtsSystemContractTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/HtsSystemContractTest.java @@ -16,19 +16,26 @@ package com.hedera.node.app.service.contract.impl.test.exec.systemcontracts; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.haltResult; -import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.HederaSystemContract.FullResult.successResult; +import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.haltResult; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.FullResult.successResult; import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall.PricedResult.gasOnly; import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.isDelegateCall; +import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.proxyUpdaterFor; import static com.hedera.node.app.service.contract.impl.test.TestHelpers.assertSamePrecompileResult; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.lenient; +import com.hedera.node.app.service.contract.impl.exec.scope.SystemContractOperations; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.HtsSystemContract; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCall; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCallAttempt; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.HtsCallFactory; import com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils; +import com.hedera.node.app.service.contract.impl.hevm.HederaWorldUpdater; +import com.hedera.node.app.service.contract.impl.state.ProxyWorldUpdater; import java.nio.ByteBuffer; import org.apache.tuweni.bytes.Bytes; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; @@ -48,9 +55,21 @@ class HtsSystemContractTest { @Mock private HtsCall call; + @Mock + private HtsCallAttempt attempt; + @Mock private MessageFrame frame; + @Mock + private ProxyWorldUpdater updater; + + @Mock + private HederaWorldUpdater.Enhancement enhancement; + + @Mock + private SystemContractOperations systemOperations; + @Mock private HtsCallFactory attemptFactory; @@ -76,7 +95,7 @@ void clear() { void returnsResultFromImpliedCall() { givenValidCallAttempt(); - final var pricedResult = gasOnly(successResult(ByteBuffer.allocate(1), 123L)); + final var pricedResult = gasOnly(successResult(ByteBuffer.allocate(1), 123L), SUCCESS, true); given(call.execute(frame)).willReturn(pricedResult); assertSame(pricedResult.fullResult(), subject.computeFully(Bytes.EMPTY, frame)); @@ -84,7 +103,7 @@ void returnsResultFromImpliedCall() { @Test void invalidCallAttemptHaltsAndConsumesRemainingGas() { - given(attemptFactory.createCallFrom(Bytes.EMPTY, frame)).willThrow(RuntimeException.class); + given(attemptFactory.createCallAttemptFrom(Bytes.EMPTY, frame)).willThrow(RuntimeException.class); final var expected = haltResult(ExceptionalHaltReason.INVALID_OPERATION, frame.getRemainingGas()); final var result = subject.computeFully(Bytes.EMPTY, frame); @@ -104,7 +123,8 @@ void internalErrorAttemptHaltsAndConsumesRemainingGas() { @Test void callWithNonGasCostNotImplemented() { givenValidCallAttempt(); - final var pricedResult = new HtsCall.PricedResult(successResult(ByteBuffer.allocate(1), 123L), 456L); + final var pricedResult = + new HtsCall.PricedResult(successResult(ByteBuffer.allocate(1), 123L), 456L, SUCCESS, true); given(call.execute(frame)).willReturn(pricedResult); assertThrows(AssertionError.class, () -> subject.computeFully(Bytes.EMPTY, frame)); @@ -112,6 +132,10 @@ void callWithNonGasCostNotImplemented() { private void givenValidCallAttempt() { frameUtils.when(() -> isDelegateCall(frame)).thenReturn(false); - given(attemptFactory.createCallFrom(Bytes.EMPTY, frame)).willReturn(call); + frameUtils.when(() -> proxyUpdaterFor(frame)).thenReturn(updater); + lenient().when(updater.enhancement()).thenReturn(enhancement); + lenient().when(enhancement.systemOperations()).thenReturn(systemOperations); + given(attemptFactory.createCallAttemptFrom(Bytes.EMPTY, frame)).willReturn(attempt); + given(attempt.asExecutableCall()).willReturn(call); } } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/DispatchForResponseCodeHtsCallTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/DispatchForResponseCodeHtsCallTest.java index 9639f263f5e3..7f7f4495f6ce 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/DispatchForResponseCodeHtsCallTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/DispatchForResponseCodeHtsCallTest.java @@ -19,6 +19,7 @@ import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_ACCOUNT_ID; import static com.hedera.hapi.node.base.ResponseCodeEnum.INVALID_TREASURY_ACCOUNT_FOR_TOKEN; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.DispatchForResponseCodeHtsCall.OutputFn.STANDARD_OUTPUT_FN; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.verifyNoInteractions; @@ -29,6 +30,7 @@ import com.hedera.node.app.service.contract.impl.exec.scope.VerificationStrategy; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.DispatchForResponseCodeHtsCall; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes; +import com.hedera.node.app.service.contract.impl.records.ContractCallRecordBuilder; import com.hedera.node.app.spi.workflows.record.SingleTransactionRecordBuilder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -48,7 +50,7 @@ class DispatchForResponseCodeHtsCallTest extends HtsCallTestBase { private DispatchGasCalculator dispatchGasCalculator; @Mock - private SingleTransactionRecordBuilder recordBuilder; + private ContractCallRecordBuilder recordBuilder; private DispatchForResponseCodeHtsCall subject; @@ -62,7 +64,8 @@ void setUp() { SingleTransactionRecordBuilder.class, verificationStrategy, dispatchGasCalculator, - failureCustomizer); + failureCustomizer, + STANDARD_OUTPUT_FN); } @Test @@ -71,7 +74,7 @@ void successResultNotCustomized() { TransactionBody.DEFAULT, verificationStrategy, AccountID.DEFAULT, - SingleTransactionRecordBuilder.class)) + ContractCallRecordBuilder.class)) .willReturn(recordBuilder); given(dispatchGasCalculator.gasRequirement( TransactionBody.DEFAULT, gasCalculator, mockEnhancement(), AccountID.DEFAULT)) @@ -91,12 +94,12 @@ void failureResultCustomized() { TransactionBody.DEFAULT, verificationStrategy, AccountID.DEFAULT, - SingleTransactionRecordBuilder.class)) + ContractCallRecordBuilder.class)) .willReturn(recordBuilder); given(dispatchGasCalculator.gasRequirement( TransactionBody.DEFAULT, gasCalculator, mockEnhancement(), AccountID.DEFAULT)) .willReturn(123L); - given(recordBuilder.status()).willReturn(INVALID_ACCOUNT_ID); + given(recordBuilder.status()).willReturn(INVALID_ACCOUNT_ID).willReturn(INVALID_TREASURY_ACCOUNT_FOR_TOKEN); given(failureCustomizer.customize(TransactionBody.DEFAULT, INVALID_ACCOUNT_ID, mockEnhancement())) .willReturn(INVALID_TREASURY_ACCOUNT_FOR_TOKEN); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/HtsCallAttemptTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/HtsCallAttemptTest.java index 56cfb58447ff..bc216116c289 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/HtsCallAttemptTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/HtsCallAttemptTest.java @@ -77,6 +77,8 @@ import java.util.Arrays; import java.util.List; import org.apache.tuweni.bytes.Bytes; +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.evm.frame.BlockValues; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -90,6 +92,9 @@ class HtsCallAttemptTest extends HtsCallTestBase { @Mock private AddressIdConverter addressIdConverter; + @Mock + private BlockValues blockValues; + @Mock private VerificationStrategy strategy; @@ -104,6 +109,8 @@ class HtsCallAttemptTest extends HtsCallTestBase { private List callTranslators; + private Wei value = Wei.ZERO; + @BeforeEach void setUp() { callTranslators = List.of( @@ -136,7 +143,9 @@ void nonLongZeroAddressesArentTokens() { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertNull(subject.redirectToken()); verifyNoInteractions(nativeOperations); } @@ -156,7 +165,9 @@ void invalidSelectorLeadsToMissingCall() { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertNull(subject.asExecutableCall()); } @@ -174,7 +185,9 @@ void constructsDecimals() { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(DecimalsCall.class, subject.asExecutableCall()); } @@ -192,7 +205,9 @@ void constructsTokenUri() { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(TokenUriCall.class, subject.asExecutableCall()); } @@ -210,7 +225,9 @@ void constructsOwnerOf() { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(OwnerOfCall.class, subject.asExecutableCall()); } @@ -231,7 +248,9 @@ void constructsBalanceOf() { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(BalanceOfCall.class, subject.asExecutableCall()); } @@ -253,7 +272,9 @@ void constructsIsApprovedForAllErc() { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(IsApprovedForAllCall.class, subject.asExecutableCall()); } @@ -273,7 +294,9 @@ void constructsIsApprovedForAllClassic() { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(IsApprovedForAllCall.class, subject.asExecutableCall()); } @@ -291,7 +314,9 @@ void constructsTotalSupply() { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(TotalSupplyCall.class, subject.asExecutableCall()); } @@ -309,7 +334,9 @@ void constructsName() { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(NameCall.class, subject.asExecutableCall()); } @@ -327,7 +354,9 @@ void constructsSymbol() { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(SymbolCall.class, subject.asExecutableCall()); } @@ -356,7 +385,9 @@ void constructsErc721TransferFromRedirectToNonfungible() { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(Erc721TransferFromCall.class, subject.asExecutableCall()); } @@ -385,7 +416,9 @@ void constructsErc20TransferFromRedirectToFungible() { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(Erc20TransfersCall.class, subject.asExecutableCall()); } @@ -411,7 +444,9 @@ void constructsErc20TransferRedirectToFungible() { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(Erc20TransfersCall.class, subject.asExecutableCall()); } @@ -463,7 +498,9 @@ void constructsAssociations(boolean useExplicitCall, boolean isRedirect, String verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(DispatchForResponseCodeHtsCall.class, subject.asExecutableCall()); assertArrayEquals(selector, subject.selector()); @@ -525,7 +562,9 @@ void constructsClassicTransfers(String hexedSelector) { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(ClassicTransfersCall.class, subject.asExecutableCall()); assertArrayEquals(selector, subject.selector()); @@ -595,7 +634,9 @@ void constructsMints(String hexedSelector, LinkedTokenType linkedTokenType) { verificationStrategies, gasCalculator, callTranslators, - false); + false, + blockValues, + value); assertInstanceOf(DispatchForResponseCodeHtsCall.class, subject.asExecutableCall()); assertArrayEquals(selector, subject.selector()); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/HtsCallFactoryTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/HtsCallFactoryTest.java index 72c2db2cf7cc..65a344615a40 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/HtsCallFactoryTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/HtsCallFactoryTest.java @@ -40,6 +40,7 @@ import java.util.ArrayDeque; import java.util.Deque; import java.util.List; +import java.util.Objects; import org.hyperledger.besu.evm.frame.MessageFrame; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -98,7 +99,8 @@ void instantiatesCallWithInContextEnhancementAndDelegateCallInfo() { final var input = bytesForRedirect( BALANCE_OF.encodeCallWithArgs(asHeadlongAddress(NON_SYSTEM_LONG_ZERO_ADDRESS)), FUNGIBLE_TOKEN_ID); - final var call = subject.createCallFrom(input, frame); + final var attempt = subject.createCallAttemptFrom(input, frame); + final var call = Objects.requireNonNull(attempt.asExecutableCall()); assertInstanceOf(BalanceOfCall.class, call); } diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/create/ClassicCreatesCallTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/create/ClassicCreatesCallTest.java index b44ebb4f8e18..0464909345a3 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/create/ClassicCreatesCallTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/create/ClassicCreatesCallTest.java @@ -18,8 +18,10 @@ import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; import static com.hedera.hapi.node.base.ResponseCodeEnum.TOKEN_HAS_NO_SUPPLY_KEY; +import static com.hedera.node.app.service.contract.impl.test.TestHelpers.ALIASED_SOMEBODY; import static com.hedera.node.app.service.contract.impl.test.TestHelpers.A_NEW_ACCOUNT_ID; import static com.hedera.node.app.service.contract.impl.test.TestHelpers.EIP_1014_ADDRESS; +import static com.hedera.node.app.service.contract.impl.test.TestHelpers.SENDER_ID; import static com.hedera.node.app.service.contract.impl.test.TestHelpers.asBytesResult; import static com.hedera.node.app.service.contract.impl.test.TestHelpers.asHeadlongAddress; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -39,6 +41,8 @@ import com.hedera.node.app.service.token.records.CryptoCreateRecordBuilder; import java.math.BigInteger; import org.apache.tuweni.bytes.Bytes; +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.evm.frame.BlockValues; import org.hyperledger.besu.evm.frame.MessageFrame; import org.junit.jupiter.api.Test; import org.mockito.Mock; @@ -58,8 +62,17 @@ public class ClassicCreatesCallTest extends HtsCallTestBase { @Mock private CryptoCreateRecordBuilder recordBuilder; + @Mock + private BlockValues blockValues; + + private Wei value = Wei.MAX_WEI; + private static final TransactionBody PRETEND_CREATE_TOKEN = TransactionBody.newBuilder() - .tokenCreation(TokenCreateTransactionBody.DEFAULT) + .tokenCreation(TokenCreateTransactionBody.newBuilder() + .symbol("FT") + .treasury(A_NEW_ACCOUNT_ID) + .autoRenewAccount(SENDER_ID) + .build()) .build(); private ClassicCreatesCall subject; @@ -262,10 +275,13 @@ private void commonGivens() { PRETEND_CREATE_TOKEN, verificationStrategy, FRAME_SENDER_ADDRESS, - addressIdConverter); + addressIdConverter, + blockValues, + value); given(addressIdConverter.convert(asHeadlongAddress(FRAME_SENDER_ADDRESS))) .willReturn(A_NEW_ACCOUNT_ID); + given(nativeOperations.getAccount(A_NEW_ACCOUNT_ID.accountNumOrThrow())).willReturn(ALIASED_SOMEBODY); given(systemContractOperations.dispatch( any(TransactionBody.class), eq(verificationStrategy), diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/transfer/ClassicTransfersCallTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/transfer/ClassicTransfersCallTest.java index 6e593ec35e89..a1a62c979021 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/transfer/ClassicTransfersCallTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/systemcontracts/hts/transfer/ClassicTransfersCallTest.java @@ -22,6 +22,7 @@ import static com.hedera.hapi.node.base.ResponseCodeEnum.NOT_SUPPORTED; import static com.hedera.hapi.node.base.ResponseCodeEnum.SPENDER_DOES_NOT_HAVE_ALLOWANCE; import static com.hedera.hapi.node.base.ResponseCodeEnum.SUCCESS; +import static com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes.tuweniEncodedRc; import static com.hedera.node.app.service.contract.impl.test.TestHelpers.A_NEW_ACCOUNT_ID; import static com.hedera.node.app.service.contract.impl.test.TestHelpers.DEFAULT_CONFIG; import static com.hedera.node.app.service.contract.impl.test.TestHelpers.asBytesResult; @@ -29,11 +30,13 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; import com.esaulpaugh.headlong.abi.TupleType; import com.hedera.hapi.node.base.Key; import com.hedera.hapi.node.token.CryptoTransferTransactionBody; import com.hedera.hapi.node.transaction.TransactionBody; +import com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason; import com.hedera.node.app.service.contract.impl.exec.gas.SystemContractGasCalculator; import com.hedera.node.app.service.contract.impl.exec.scope.VerificationStrategy; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes; @@ -41,11 +44,11 @@ import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.transfer.ClassicTransfersCall; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.transfer.ClassicTransfersTranslator; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.transfer.SystemAccountCreditScreen; +import com.hedera.node.app.service.contract.impl.records.ContractCallRecordBuilder; import com.hedera.node.app.service.contract.impl.test.exec.systemcontracts.hts.HtsCallTestBase; -import com.hedera.node.app.service.token.records.CryptoTransferRecordBuilder; import com.hedera.node.config.testfixtures.HederaTestConfigBuilder; +import java.util.Optional; import java.util.function.Predicate; -import org.apache.tuweni.bytes.Bytes; import org.hyperledger.besu.evm.frame.MessageFrame; import org.junit.jupiter.api.Test; import org.mockito.Mock; @@ -63,7 +66,7 @@ class ClassicTransfersCallTest extends HtsCallTestBase { private ApprovalSwitchHelper approvalSwitchHelper; @Mock - private CryptoTransferRecordBuilder recordBuilder; + private ContractCallRecordBuilder recordBuilder; @Mock private SystemAccountCreditScreen systemAccountCreditScreen; @@ -80,16 +83,21 @@ void transferHappyPathCompletesWithSuccessResponseCode() { any(TransactionBody.class), eq(verificationStrategy), eq(A_NEW_ACCOUNT_ID), - eq(CryptoTransferRecordBuilder.class))) + eq(ContractCallRecordBuilder.class))) .willReturn(recordBuilder); given(recordBuilder.status()).willReturn(SUCCESS); + given(systemContractOperations.activeSignatureTestWith(verificationStrategy)) + .willReturn(signatureTest); + given(approvalSwitchHelper.switchToApprovalsAsNeededIn( + CryptoTransferTransactionBody.DEFAULT, signatureTest, nativeOperations)) + .willReturn(CryptoTransferTransactionBody.DEFAULT); givenRetryingSubject(); - final var result = subject.execute().fullResult().result(); + final var result = subject.execute(frame).fullResult().result(); assertEquals(MessageFrame.State.COMPLETED_SUCCESS, result.getState()); - assertEquals(asBytesResult(INT64_ENCODER.encodeElements((long) SUCCESS.protoOrdinal())), result.getOutput()); + assertEquals(tuweniEncodedRc(SUCCESS), result.getOutput()); } @Test @@ -99,7 +107,7 @@ void retryingTransferHappyPathCompletesWithSuccessResponseCode() { any(TransactionBody.class), eq(verificationStrategy), eq(A_NEW_ACCOUNT_ID), - eq(CryptoTransferRecordBuilder.class))) + eq(ContractCallRecordBuilder.class))) .willReturn(recordBuilder); given(recordBuilder.status()).willReturn(SUCCESS); given(systemContractOperations.activeSignatureTestWith(verificationStrategy)) @@ -110,7 +118,7 @@ void retryingTransferHappyPathCompletesWithSuccessResponseCode() { givenRetryingSubject(); - final var result = subject.execute().fullResult().result(); + final var result = subject.execute(frame).fullResult().result(); assertEquals(MessageFrame.State.COMPLETED_SUCCESS, result.getState()); assertEquals(asBytesResult(INT64_ENCODER.encodeElements((long) SUCCESS.protoOrdinal())), result.getOutput()); @@ -123,9 +131,11 @@ void retryingTransferInvalidSignatureCompletesWithStandardizedResponseCode() { any(TransactionBody.class), eq(verificationStrategy), eq(A_NEW_ACCOUNT_ID), - eq(CryptoTransferRecordBuilder.class))) + eq(ContractCallRecordBuilder.class))) .willReturn(recordBuilder); - given(recordBuilder.status()).willReturn(INVALID_SIGNATURE); + given(recordBuilder.status()) + .willReturn(INVALID_SIGNATURE) + .willReturn(INVALID_FULL_PREFIX_SIGNATURE_FOR_PRECOMPILE); given(systemContractOperations.activeSignatureTestWith(verificationStrategy)) .willReturn(signatureTest); given(approvalSwitchHelper.switchToApprovalsAsNeededIn( @@ -134,24 +144,24 @@ void retryingTransferInvalidSignatureCompletesWithStandardizedResponseCode() { givenRetryingSubject(); - final var result = subject.execute().fullResult().result(); + final var result = subject.execute(frame).fullResult().result(); assertEquals(MessageFrame.State.COMPLETED_SUCCESS, result.getState()); - assertEquals( - asBytesResult(INT64_ENCODER.encodeElements( - (long) INVALID_FULL_PREFIX_SIGNATURE_FOR_PRECOMPILE.protoOrdinal())), - result.getOutput()); + assertEquals(tuweniEncodedRc(INVALID_FULL_PREFIX_SIGNATURE_FOR_PRECOMPILE), result.getOutput()); + verify(recordBuilder).status(INVALID_FULL_PREFIX_SIGNATURE_FOR_PRECOMPILE); } @Test - void unsupportedV2transferCompletesWithNotSupportedResponseCode() { + void unsupportedV2transferHaltsWithNotSupportedReason() { givenV2SubjectWithV2Disabled(); + given(systemContractOperations.externalizePreemptedDispatch(any(TransactionBody.class), eq(NOT_SUPPORTED))) + .willReturn(recordBuilder); + given(recordBuilder.status()).willReturn(NOT_SUPPORTED); - final var result = subject.execute().fullResult().result(); + final var result = subject.execute(frame).fullResult().result(); - assertEquals(MessageFrame.State.COMPLETED_SUCCESS, result.getState()); - assertEquals( - asBytesResult(INT64_ENCODER.encodeElements((long) NOT_SUPPORTED.protoOrdinal())), result.getOutput()); + assertEquals(MessageFrame.State.EXCEPTIONAL_HALT, result.getState()); + assertEquals(Optional.of(CustomExceptionalHaltReason.NOT_SUPPORTED), result.getHaltReason()); } @Test @@ -159,11 +169,15 @@ void systemAccountCreditReverts() { givenRetryingSubject(); given(systemAccountCreditScreen.creditsToSystemAccount(CryptoTransferTransactionBody.DEFAULT)) .willReturn(true); + given(systemContractOperations.externalizePreemptedDispatch( + any(TransactionBody.class), eq(INVALID_RECEIVING_NODE_ACCOUNT))) + .willReturn(recordBuilder); + given(recordBuilder.status()).willReturn(INVALID_RECEIVING_NODE_ACCOUNT); - final var result = subject.execute().fullResult().result(); + final var result = subject.execute(frame).fullResult().result(); assertEquals(MessageFrame.State.REVERT, result.getState()); - assertEquals(Bytes.wrap(INVALID_RECEIVING_NODE_ACCOUNT.protoName().getBytes()), result.getOutput()); + assertEquals(tuweniEncodedRc(INVALID_RECEIVING_NODE_ACCOUNT), result.getOutput()); } @Test @@ -173,11 +187,11 @@ void supportedV2transferCompletesWithNominalResponseCode() { any(TransactionBody.class), eq(verificationStrategy), eq(A_NEW_ACCOUNT_ID), - eq(CryptoTransferRecordBuilder.class))) + eq(ContractCallRecordBuilder.class))) .willReturn(recordBuilder); given(recordBuilder.status()).willReturn(SPENDER_DOES_NOT_HAVE_ALLOWANCE); - final var result = subject.execute().fullResult().result(); + final var result = subject.execute(frame).fullResult().result(); assertEquals(MessageFrame.State.COMPLETED_SUCCESS, result.getState()); assertEquals( diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/utils/FrameUtilsTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/utils/FrameUtilsTest.java index 0b93819f6831..e490454a570b 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/utils/FrameUtilsTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/exec/utils/FrameUtilsTest.java @@ -32,6 +32,7 @@ import com.hedera.node.app.service.contract.impl.exec.operations.utils.OpUtils; import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.ReturnTypes; +import com.hedera.node.app.service.contract.impl.exec.systemcontracts.hts.transfer.TransferEventLoggingUtils; import com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils; import com.hedera.node.app.service.contract.impl.infra.StorageAccessTracker; import com.hedera.node.app.service.contract.impl.utils.ConversionUtils; @@ -55,6 +56,7 @@ class FrameUtilsTest { private static final Set> toBeTested = new HashSet<>(Arrays.asList( FrameUtils.class, ConversionUtils.class, + TransferEventLoggingUtils.class, OpUtils.class, OpcodeUtils.class, SynthTxnUtils.class, diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/state/ProxyWorldUpdaterTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/state/ProxyWorldUpdaterTest.java index 112da6c68ed8..cba24b3ee0a2 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/state/ProxyWorldUpdaterTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/state/ProxyWorldUpdaterTest.java @@ -57,7 +57,6 @@ import com.hedera.node.app.service.contract.impl.state.StorageAccess; import com.hedera.node.app.service.contract.impl.state.StorageAccesses; import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils; -import com.hedera.node.app.service.contract.impl.utils.SystemContractUtils.ResultStatus; import com.hedera.node.app.spi.workflows.ResourceExhaustedException; import java.util.List; import java.util.Optional; @@ -502,10 +501,8 @@ void externalizeSystemContractResultTest() { var contractFunctionResult = SystemContractUtils.contractFunctionResultSuccessFor( 0, org.apache.tuweni.bytes.Bytes.EMPTY, ContractID.DEFAULT); - subject.externalizeSystemContractResults( - contractFunctionResult, ResultStatus.IS_SUCCESS, ResponseCodeEnum.SUCCESS); - verify(systemContractOperations) - .externalizeResult(contractFunctionResult, ResultStatus.IS_SUCCESS, ResponseCodeEnum.SUCCESS); + subject.externalizeSystemContractResults(contractFunctionResult, ResponseCodeEnum.SUCCESS); + verify(systemContractOperations).externalizeResult(contractFunctionResult, ResponseCodeEnum.SUCCESS); } @Test diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/RecordFinalizerBase.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/RecordFinalizerBase.java index ec2b4eaabdf8..34e70874306c 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/RecordFinalizerBase.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/RecordFinalizerBase.java @@ -41,7 +41,7 @@ * classes. */ public class RecordFinalizerBase { - private static final AccountID ZERO_ACCOUNT_ID = + protected static final AccountID ZERO_ACCOUNT_ID = AccountID.newBuilder().accountNum(0).build(); /** @@ -81,7 +81,7 @@ protected Map hbarChangesFrom(@NonNull final WritableAccountSto * Gets all fungible tokenRelation balances for all modified token relations from the given {@link WritableTokenRelationStore}. * * @param writableTokenRelStore the {@link WritableTokenRelationStore} to get the token relation balances from - * @param tokenStore + * @param tokenStore the {@link ReadableTokenStore} to get the token from * @return a {@link Map} of {@link EntityIDPair} to {@link Long} representing the token relation balances for all * modified token relations */ diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/TokenServiceInjectionModule.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/TokenServiceInjectionModule.java index 1582424aae37..d518ec7d65f1 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/TokenServiceInjectionModule.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/TokenServiceInjectionModule.java @@ -30,6 +30,7 @@ import com.hedera.node.app.service.token.impl.handlers.CryptoGetStakersHandler; import com.hedera.node.app.service.token.impl.handlers.CryptoTransferHandler; import com.hedera.node.app.service.token.impl.handlers.CryptoUpdateHandler; +import com.hedera.node.app.service.token.impl.handlers.FinalizeChildRecordHandler; import com.hedera.node.app.service.token.impl.handlers.FinalizeParentRecordHandler; import com.hedera.node.app.service.token.impl.handlers.TokenAccountWipeHandler; import com.hedera.node.app.service.token.impl.handlers.TokenAssociateToAccountHandler; @@ -55,6 +56,7 @@ import com.hedera.node.app.service.token.impl.handlers.staking.StakeRewardCalculatorImpl; import com.hedera.node.app.service.token.impl.handlers.staking.StakingRewardsHandler; import com.hedera.node.app.service.token.impl.handlers.staking.StakingRewardsHandlerImpl; +import com.hedera.node.app.service.token.records.ChildRecordFinalizer; import com.hedera.node.app.service.token.records.ParentRecordFinalizer; import dagger.Binds; import dagger.Module; @@ -77,6 +79,9 @@ public interface TokenServiceInjectionModule { @Binds ParentRecordFinalizer parentRecordFinalizer(FinalizeParentRecordHandler parentRecordFinalizer); + @Binds + ChildRecordFinalizer childRecordFinalizer(FinalizeChildRecordHandler childRecordHandler); + CryptoAddLiveHashHandler cryptoAddLiveHashHandler(); CryptoApproveAllowanceHandler cryptoApproveAllowanceHandler(); diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/FinalizeChildRecordHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/FinalizeChildRecordHandler.java index ae2476af2ffa..df03bf86b20a 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/FinalizeChildRecordHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/FinalizeChildRecordHandler.java @@ -26,9 +26,9 @@ import com.hedera.node.app.service.token.impl.WritableAccountStore; import com.hedera.node.app.service.token.impl.WritableNftStore; import com.hedera.node.app.service.token.impl.WritableTokenRelationStore; +import com.hedera.node.app.service.token.records.ChildFinalizeContext; import com.hedera.node.app.service.token.records.ChildRecordFinalizer; import com.hedera.node.app.service.token.records.CryptoTransferRecordBuilder; -import com.hedera.node.app.service.token.records.FinalizeContext; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.ArrayList; import javax.inject.Inject; @@ -39,14 +39,13 @@ */ @Singleton public class FinalizeChildRecordHandler extends RecordFinalizerBase implements ChildRecordFinalizer { - @Inject public FinalizeChildRecordHandler() { // For Dagger Injection } @Override - public void finalizeChildRecord(@NonNull final FinalizeContext context) { + public void finalizeChildRecord(@NonNull final ChildFinalizeContext context) { final var recordBuilder = context.userTransactionRecordBuilder(CryptoTransferRecordBuilder.class); // This handler won't ask the context for its transaction, but instead will determine the net hbar transfers and diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/FinalizeParentRecordHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/FinalizeParentRecordHandler.java index 58bca85e8589..9214dcb3afcd 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/FinalizeParentRecordHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/FinalizeParentRecordHandler.java @@ -16,12 +16,18 @@ package com.hedera.node.app.service.token.impl.handlers; +import static com.hedera.hapi.node.base.ResponseCodeEnum.FAIL_INVALID; import static com.hedera.node.app.service.token.impl.comparator.TokenComparators.TOKEN_TRANSFER_LIST_COMPARATOR; import static com.hedera.node.app.service.token.impl.handlers.staking.StakingRewardsHelper.asAccountAmounts; +import static com.hedera.node.app.spi.workflows.HandleException.validateTrue; +import static java.util.Collections.emptyList; import com.hedera.hapi.node.base.AccountID; -import com.hedera.hapi.node.base.TokenTransferList; +import com.hedera.hapi.node.base.NftID; +import com.hedera.hapi.node.base.NftTransfer; +import com.hedera.hapi.node.base.TokenID; import com.hedera.hapi.node.base.TransferList; +import com.hedera.hapi.node.state.common.EntityIDPair; import com.hedera.node.app.service.token.ReadableTokenStore; import com.hedera.node.app.service.token.impl.RecordFinalizerBase; import com.hedera.node.app.service.token.impl.WritableAccountStore; @@ -34,7 +40,7 @@ import com.hedera.node.app.service.token.records.ParentRecordFinalizer; import com.hedera.node.config.data.StakingConfig; import edu.umd.cs.findbugs.annotations.NonNull; -import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; @@ -77,52 +83,88 @@ public void finalizeParentRecord(@NonNull final AccountID payer, @NonNull final } } - /* ------------------------- Hbar changes from transaction including staking rewards ------------------------- */ + // Hbar changes from transaction including staking rewards final var hbarChanges = hbarChangesFrom(writableAccountStore); - // any hbar changes listed in child records should not be recorded again in parent record, so deduct them. - deductChangesFromChildRecords(hbarChanges, context); + final var fungibleChanges = fungibleChangesFrom(writableTokenRelStore, tokenStore); + final var nftChanges = nftChangesFrom(writableNftStore, tokenStore); + if (context.hasChildRecords()) { + // All the above changes maps are mutable + deductChangesFromChildRecords(context, fungibleChanges, nftChanges, hbarChanges); + // In the current system a parent transaction that has child transactions cannot + // *itself* cause any net fungible or NFT transfers; fail fast if that happens + validateTrue(fungibleChanges.isEmpty(), FAIL_INVALID); + validateTrue(nftChanges.isEmpty(), FAIL_INVALID); + } if (!hbarChanges.isEmpty()) { // Save the modified hbar amounts so records can be written recordBuilder.transferList(TransferList.newBuilder() .accountAmounts(asAccountAmounts(hbarChanges)) .build()); } - - // Declare the top-level token transfer list, which list will include BOTH fungible and non-fungible token - // transfers - final ArrayList tokenTransferLists; - - // ---------- fungible token transfers - final var fungibleChanges = fungibleChangesFrom(writableTokenRelStore, tokenStore); - // any fungible token changes listed in child records should not be considered while building - // parent record, so don't deduct them. - final var fungibleTokenTransferLists = asTokenTransferListFrom(fungibleChanges); - tokenTransferLists = new ArrayList<>(fungibleTokenTransferLists); - - // ---------- nft transfers - final var nftChanges = nftChangesFrom(writableNftStore, tokenStore); - // any nft transfers listed in child records should not be considered while building - // parent record, so don't deduct them. - final var nftTokenTransferLists = asTokenTransferListFromNftChanges(nftChanges); - tokenTransferLists.addAll(nftTokenTransferLists); - - // Record the modified fungible and non-fungible changes so records can be written - if (!tokenTransferLists.isEmpty()) { + final var hasTokenTransferLists = !fungibleChanges.isEmpty() || !nftChanges.isEmpty(); + if (hasTokenTransferLists) { + final var tokenTransferLists = asTokenTransferListFrom(fungibleChanges); + final var nftTokenTransferLists = asTokenTransferListFromNftChanges(nftChanges); + tokenTransferLists.addAll(nftTokenTransferLists); tokenTransferLists.sort(TOKEN_TRANSFER_LIST_COMPARATOR); recordBuilder.tokenTransferLists(tokenTransferLists); } } - private void deductChangesFromChildRecords(final Map hbarChanges, final FinalizeContext context) { + private void deductChangesFromChildRecords( + @NonNull final FinalizeContext context, + @NonNull final Map fungibleChanges, + @NonNull final Map> nftTransfers, + @NonNull final Map hbarChanges) { + final Map finalNftOwners = new HashMap<>(); context.forEachChildRecord(ChildRecordBuilder.class, childRecord -> { final var childHbarChangesFromRecord = childRecord.transferList(); for (final var childChange : childHbarChangesFromRecord.accountAmountsOrElse(List.of())) { - final var childHbarChangeAccountId = childChange.accountID(); - final var childHbarChangeAmount = childChange.amount(); - if (hbarChanges.containsKey(childHbarChangeAccountId)) { - hbarChanges.merge(childHbarChangeAccountId, -childHbarChangeAmount, Long::sum); + final var accountId = childChange.accountID(); + if (hbarChanges.containsKey(accountId)) { + final var newAdjust = hbarChanges.merge(accountId, -childChange.amount(), Long::sum); + if (newAdjust == 0) { + hbarChanges.remove(accountId); + } + } + } + for (final var tokenTransfers : childRecord.tokenTransferLists()) { + final var fungibleTransfers = tokenTransfers.transfersOrElse(emptyList()); + final var tokenId = tokenTransfers.tokenOrThrow(); + if (!fungibleTransfers.isEmpty()) { + for (final var unitAdjust : fungibleTransfers) { + final var accountId = unitAdjust.accountIDOrThrow(); + final var amount = unitAdjust.amount(); + final var key = new EntityIDPair(accountId, tokenId); + if (fungibleChanges.containsKey(key)) { + final var newAdjust = fungibleChanges.merge(key, -amount, Long::sum); + if (newAdjust == 0) { + fungibleChanges.remove(key); + } + } + } + } else { + for (final var ownershipChange : tokenTransfers.nftTransfersOrElse(emptyList())) { + final var newOwnerId = ownershipChange.receiverAccountIDOrElse(ZERO_ACCOUNT_ID); + final var key = new NftID(tokenId, ownershipChange.serialNumber()); + finalNftOwners.put(key, newOwnerId); + } } } }); + for (final var iter = nftTransfers.entrySet().iterator(); iter.hasNext(); ) { + final var entry = iter.next(); + final var tokenId = entry.getKey(); + final var nftTransfersForToken = entry.getValue(); + nftTransfersForToken.removeIf(transfer -> { + final var key = new NftID(tokenId, transfer.serialNumber()); + return finalNftOwners + .getOrDefault(key, ZERO_ACCOUNT_ID) + .equals(transfer.receiverAccountIDOrElse(ZERO_ACCOUNT_ID)); + }); + if (nftTransfersForToken.isEmpty()) { + iter.remove(); + } + } } } diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/transfer/AdjustFungibleTokenChangesStep.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/transfer/AdjustFungibleTokenChangesStep.java index 4ca3c6d6ce6b..5e0c30e105c2 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/transfer/AdjustFungibleTokenChangesStep.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/transfer/AdjustFungibleTokenChangesStep.java @@ -110,8 +110,8 @@ public void doIn(@NonNull final TransferContext transferContext) { } } - modifyAggregatedTokenBalances(aggregatedFungibleTokenChanges, tokenRelStore, accountStore); modifyAggregatedAllowances(allowanceTransfers, accountStore, transferContext); + modifyAggregatedTokenBalances(aggregatedFungibleTokenChanges, tokenRelStore, accountStore); } /** diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/FinalizeParentRecordHandlerTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/FinalizeParentRecordHandlerTest.java index aee26da06696..9c1b7f5498da 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/FinalizeParentRecordHandlerTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/FinalizeParentRecordHandlerTest.java @@ -252,6 +252,7 @@ void handleHbarTransfersToAccountDeductsFromChildRecordsSuccess() { .amount(childRecordTransfer) .build()) .build()); + given(context.hasChildRecords()).willReturn(true); doAnswer(invocation -> { final var consumer = invocation.getArgument(1, Consumer.class); consumer.accept(childRecord); diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/transfer/AdjustFungibleTokenChangesStepTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/transfer/AdjustFungibleTokenChangesStepTest.java index 277580e26c34..a1a3fbee9575 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/transfer/AdjustFungibleTokenChangesStepTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/transfer/AdjustFungibleTokenChangesStepTest.java @@ -203,7 +203,7 @@ void allowanceWithGreaterThanAllowedAllowanceFails() { assertThatThrownBy(() -> adjustFungibleTokenChangesStep.doIn(transferContext)) .isInstanceOf(HandleException.class) - .has(responseCode(ResponseCodeEnum.INSUFFICIENT_TOKEN_BALANCE)); + .has(responseCode(ResponseCodeEnum.AMOUNT_EXCEEDS_ALLOWANCE)); } @Test diff --git a/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/ChildFinalizeContext.java b/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/ChildFinalizeContext.java new file mode 100644 index 000000000000..1a1dca417ef0 --- /dev/null +++ b/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/ChildFinalizeContext.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hedera.node.app.service.token.records; + +import edu.umd.cs.findbugs.annotations.NonNull; + +/** + * Provides the context needed to finalize the record of a child transaction. + */ +public interface ChildFinalizeContext { + /** + * Get a readable store given the store's interface. This gives read-only access to the store. + * + * @param storeInterface The store interface to find and create a store for + * @param Interface class for a Store + * @return An implementation of the provided store interface + * @throws IllegalArgumentException if the storeInterface class provided is unknown to the app + * @throws NullPointerException if {@code storeInterface} is {@code null} + */ + @NonNull + T readableStore(@NonNull Class storeInterface); + + /** + * Return a writable store given the store's interface. This gives write access to the store. + * + *

This method is limited to stores that are part of the transaction's service. + * + * @param storeInterface The store interface to find and create a store for + * @param Interface class for a Store + * @return An implementation of the provided store interface + * @throws IllegalArgumentException if the storeInterface class provided is unknown to the app + * @throws NullPointerException if {@code storeInterface} is {@code null} + */ + @NonNull + T writableStore(@NonNull Class storeInterface); + + /** + * Returns a record builder for the given record builder subtype. + * + * @param recordBuilderClass the record type + * @param the record type + * @return a builder for the given record type + * @throws NullPointerException if {@code recordBuilderClass} is {@code null} + * @throws IllegalArgumentException if the record builder type is unknown to the app + */ + @NonNull + T userTransactionRecordBuilder(@NonNull Class recordBuilderClass); +} diff --git a/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/ChildRecordBuilder.java b/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/ChildRecordBuilder.java index 8cd79cec743c..29f2c203b594 100644 --- a/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/ChildRecordBuilder.java +++ b/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/ChildRecordBuilder.java @@ -16,7 +16,9 @@ package com.hedera.node.app.service.token.records; +import com.hedera.hapi.node.base.TokenTransferList; import com.hedera.hapi.node.base.TransferList; +import java.util.List; /** * A {@code RecordBuilder} specialization for reading the transfer list from child records. @@ -29,4 +31,11 @@ public interface ChildRecordBuilder { * @return the transfer list */ TransferList transferList(); + + /** + * Get the token transfer lists, if any, from the child record. + * + * @return the token transfer lists + */ + List tokenTransferLists(); } diff --git a/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/ChildRecordFinalizer.java b/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/ChildRecordFinalizer.java index 55a37d293a7a..5e6822fea85e 100644 --- a/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/ChildRecordFinalizer.java +++ b/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/ChildRecordFinalizer.java @@ -34,5 +34,5 @@ * for the child record */ public interface ChildRecordFinalizer { - void finalizeChildRecord(@NonNull final FinalizeContext context); + void finalizeChildRecord(@NonNull ChildFinalizeContext context); } diff --git a/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/FinalizeContext.java b/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/FinalizeContext.java index 501e138dc353..3117ec6ac8a0 100644 --- a/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/FinalizeContext.java +++ b/hedera-node/hedera-token-service/src/main/java/com/hedera/node/app/service/token/records/FinalizeContext.java @@ -25,7 +25,7 @@ * Represents the context of used for finalizing a user transaction. */ @SuppressWarnings("UnusedReturnValue") -public interface FinalizeContext { +public interface FinalizeContext extends ChildFinalizeContext { /** * Returns the current consensus time. * @@ -43,42 +43,11 @@ public interface FinalizeContext { Configuration configuration(); /** - * Get a readable store given the store's interface. This gives read-only access to the store. + * Indicates whether or not the transaction has any child records. * - * @param storeInterface The store interface to find and create a store for - * @param Interface class for a Store - * @return An implementation of the provided store interface - * @throws IllegalArgumentException if the storeInterface class provided is unknown to the app - * @throws NullPointerException if {@code storeInterface} is {@code null} + * @return {@code true} if the transaction has child records; otherwise {@code false} */ - @NonNull - T readableStore(@NonNull Class storeInterface); - - /** - * Return a writable store given the store's interface. This gives write access to the store. - * - *

This method is limited to stores that are part of the transaction's service. - * - * @param storeInterface The store interface to find and create a store for - * @param Interface class for a Store - * @return An implementation of the provided store interface - * @throws IllegalArgumentException if the storeInterface class provided is unknown to the app - * @throws NullPointerException if {@code storeInterface} is {@code null} - */ - @NonNull - T writableStore(@NonNull Class storeInterface); - - /** - * Returns a record builder for the given record builder subtype. - * - * @param recordBuilderClass the record type - * @param the record type - * @return a builder for the given record type - * @throws NullPointerException if {@code recordBuilderClass} is {@code null} - * @throws IllegalArgumentException if the record builder type is unknown to the app - */ - @NonNull - T userTransactionRecordBuilder(@NonNull Class recordBuilderClass); + boolean hasChildRecords(); /** * This method can be used to iterate over all child records. diff --git a/hedera-node/test-clients/record-snapshots/CryptoTransferHTS.json b/hedera-node/test-clients/record-snapshots/CryptoTransferHTS.json new file mode 100644 index 000000000000..d62d970a5847 --- /dev/null +++ b/hedera-node/test-clients/record-snapshots/CryptoTransferHTS.json @@ -0,0 +1 @@ +{"specSnapshots":{"NonNestedCryptoTransferForFungibleTokenWithMultipleReceivers":{"placeholderNum":1001,"encodedItems":[{"b64Body":"Cg8KCQjRmNuqBhCoBRICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloyCiISIE4xrOWwZNFD2+w36nnWM9rTVj6ikZciznudOCsNpntrEIDQ28P0AkoFCIDO2gM=","b64Record":"CiUIFhIDGOoHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDh8zOVpDEUwG73bAFsuUkAV+GRFST1NZaFqgXl61EgMPYx35LhK0TIjO0G6LaWNOYaDAiNmduqBhD7vPi5ASIPCgkI0ZjbqgYQqAUSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIbCgsKAhgCEP+ft4fpBQoMCgMY6gcQgKC3h+kF"},{"b64Body":"Cg8KCQjRmNuqBhCqBRICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISINbovUyJSAz829HYAJGl0KLDQjy+Y2RJ9JMu58Nnp4rXEICQ38BKQAFKBQiAztoD","b64Record":"CiUIFhIDGOsHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDhjjB4xSu+6/hP8evVPP2ZDnznco0JW8GrrnjVlMMlKKbKePCxf641/E2jglPgnqEaDAiNmduqBhCbiMSkAyIPCgkI0ZjbqgYQqgUSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIbCgsKAhgCEP+fvoGVAQoMCgMY6wcQgKC+gZUB"},{"b64Body":"Cg8KCQjSmNuqBhCsBRICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISINrDO2Nm9r+RtWe5htB/A39DaLz10VcJ/Wbg39hSr3rvEIDIr6AlQAFKBQiAztoD","b64Record":"CiUIFhIDGOwHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjB0uzBIaadiyTxcRbDgQKBVT2Q+WhgKHiYneTqUGfSl5eN/1ESeK7EZ8o4HA2HopxAaDAiOmduqBhCjv4CxASIPCgkI0pjbqgYQrAUSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+P38BKCgsKAxjsBxCAkN/ASg=="},{"b64Body":"Cg8KCQjSmNuqBhCuBRICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIObRkYqthtsxB2wqONfo5VBWKKm2G6MQ05UYM3VWj045EICU69wDSgUIgM7aAw==","b64Record":"CiUIFhIDGO0HKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCiIo8aEaRqUO0IOfckoqO58Uw1gGzadAr1JufiQZPq+bprVpoTxB/6evLyFJ8dyAgaDAiOmduqBhCD5dGyAyIPCgkI0pjbqgYQrgUSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxjtBxCAqNa5Bw=="},{"b64Body":"Cg8KCQjTmNuqBhCwBRICGAISAhgDGKWr3ugCIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qASgKBlRva2VuQRIIVEtOQktTU00g6AcqAxjtB2oMCI/nta4GEIC10r0B","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGO4HEjDBzyktsYC6aVS9H90v54bm5aCnh2GYoz4D//aLfUOqfVfQypVez83wFUUMtZJ5O4IaDAiPmduqBhDD75ffASIPCgkI05jbqgYQsAUSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWg8KAxjuBxIICgMY7QcQ0A9yCgoDGO4HEgMY7Qc="},{"b64Body":"Cg8KCQjTmNuqBhC2BRICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGOoHEgMY7gc=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw+W+KSb1MXz0eKHVXlAtjUBhJWIQF6cWzPx2j6+Cv3gNxZyOlDOvns0xuyCJnKwvWGgwIj5nbqgYQ25G6yQMiDwoJCNOY26oGELYFEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjUmNuqBhC8BRICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGOsHEgMY7gc=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwlQcMNqxHNA1hU12pRpK7sB+XEB30kxoPNvpWf7MrA7ePJCFs7cdP7mTmn9+s/cLoGgwIkJnbqgYQo++t8AEiDwoJCNSY26oGELwFEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjUmNuqBhDCBRICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGOwHEgMY7gc=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwKGhETnFVQtOcY+vU3xuLH+l3lusI5R0yZRbTkGlMpGegMZeB7FOXy4LvQGOuSGH5GgsIkZnbqgYQy+OVFSIPCgkI1JjbqgYQwgUSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"ChAKCQjVmNuqBhDEBRIDGOoHEgIYAxjrnzYiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjnIbEhkKAxjuBxIICgMY7QcQjwMSCAoDGOoHEJAD","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwNhsaycP9VmEZFCup6PJ2Ko/7V5/AruMzFLzrSEvtrl3bT0Q8luCxV6nzjMOW1PL+GgwIkZnbqgYQy/mU/wEiEAoJCNWY26oGEMQFEgMY6gcqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMOufNlIqCggKAhgDEPDjBAoICgIYYhCcrF0KCQoDGKAGEMqvCgoJCgMY6gcQ1b9sWhkKAxjuBxIICgMY6gcQkAMSCAoDGO0HEI8D"},{"b64Body":"Cg8KCQjWmNuqBhDGBRICGAISAhgDGP7LzSwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjooBjgESCwiS57WuBhCQjvQYGm0KIhIgdNsMKweUTZ914bTIgtG/fCrRxme9vnmoXuioRPQpm9IKIzohA78ob57fv30WzTZhZiqNsgEza7M1Dz/oxH4Z2SJNCGfiCiISIF3iaahibmTOs1IxO2YCIhsBjzVn2iL9v+nRjAgvS/uyIgxIZWxsbyBXb3JsZCEqADIA","b64Record":"CiUIFhoDGO8HKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCCDpi/MvOKQzNKKGqCNE6teWST2dfsKfu0EhxgXVCISppQb+PdfdATWgoJQ5qmFgAaCwiSmduqBhDDleAqIg8KCQjWmNuqBhDGBRICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUgA="},{"b64Body":"Cg8KCQjWmNuqBhDKBRICGAISAhgDGIydjj4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjpoBiCAKAxjvByKAIDYwODA2MDQwNTIzNDgwMTU2MTAwMTA1NzYwMDA4MGZkNWI1MDYxMGRhNzgwNjEwMDIwNjAwMDM5NjAwMGYzZmU2MDgwNjA0MDUyMzQ4MDE1NjEwMDEwNTc2MDAwODBmZDViNTA2MDA0MzYxMDYxMDAzNjU3NjAwMDM1NjBlMDFjODA2MzBlZDA3Mjc2MTQ2MTAwM2I1NzgwNjM3YzQxYWQyYzE0NjEwMDU3NTc1YjYwMDA4MGZkNWI2MTAwNTU2MDA0ODAzNjAzODEwMTkwNjEwMDUwOTE5MDYxMDgwYTU2NWI2MTAwODc1NjViMDA1YjYxMDA3MTYwMDQ4MDM2MDM4MTAxOTA2MTAwNmM5MTkwNjEwODUzNTY1YjYxMDBkZTU2NWI2MDQwNTE2MTAwN2U5MTkwNjEwODk5NTY1YjYwNDA1MTgwOTEwMzkwZjM1YjYwMDA2MTAwOTI4MjYxMDFmMzU2NWI5MDUwNjAxNjYwMDMwYjgxMTQ2MTAwZGE1NzYwNDA1MTdmMDhjMzc5YTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgxNTI2MDA0MDE2MTAwZDE5MDYxMDkxMTU2NWI2MDQwNTE4MDkxMDM5MGZkNWI1MDUwNTY1YjYwMDA4MDYwMDA2MTAxNjc3M2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxNjYzN2M0MWFkMmM2MGUwMWI4NTYwNDA1MTYwMjQwMTYxMDExNTkxOTA2MTA5NDA1NjViNjA0MDUxNjAyMDgxODMwMzAzODE1MjkwNjA0MDUyOTA3YmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTkxNjYwMjA4MjAxODA1MTdiZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY4MzgxODMxNjE3ODM1MjUwNTA1MDUwNjA0MDUxNjEwMTdmOTE5MDYxMDljYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwMWJjNTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwMWMxNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTAxZDI1NzYwMTU2MTAxZTc1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTAxZTY5MTkwNjEwYTFjNTY1YjViNjAwMzBiOTI1MDUwNTA5MTkwNTA1NjViNjAwMDgwNjAwMDYxMDE2NzczZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE2NjMxODlhNTU0YzYwZTAxYjg1NjA0MDUxNjAyNDAxNjEwMjJhOTE5MDYxMGQ0ZjU2NWI2MDQwNTE2MDIwODE4MzAzMDM4MTUyOTA2MDQwNTI5MDdiZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxOTE2NjAyMDgyMDE4MDUxN2JmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjgzODE4MzE2MTc4MzUyNTA1MDUwNTA2MDQwNTE2MTAyOTQ5MTkwNjEwOWNjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTAyZDE1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTAyZDY1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA4MTYxMDJlNzU3NjAxNTYxMDJmYzU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDJmYjkxOTA2MTBhMWM1NjViNWI2MDAzMGI5MjUwNTA1MDkxOTA1MDU2NWI2MDAwNjA0MDUxOTA1MDkwNTY1YjYwMDA4MGZkNWI2MDAwODBmZDViNjAwMDgwZmQ1YjYwMDA2MDFmMTk2MDFmODMwMTE2OTA1MDkxOTA1MDU2NWI3ZjRlNDg3YjcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MDAwNTI2MDQxNjAwNDUyNjAyNDYwMDBmZDViNjEwMzZhODI2MTAzMjE1NjViODEwMTgxODExMDY3ZmZmZmZmZmZmZmZmZmZmZjgyMTExNzE1NjEwMzg5NTc2MTAzODg2MTAzMzI1NjViNWI4MDYwNDA1MjUwNTA1MDU2NWI2MDAwNjEwMzljNjEwMzA4NTY1YjkwNTA2MTAzYTg4MjgyNjEwMzYxNTY1YjkxOTA1MDU2NWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwM2M4NTc2MTAzYzc2MTAzMzI1NjViNWI2MDIwODIwMjkwNTA2MDIwODEwMTkwNTA5MTkwNTA1NjViNjAwMDgwZmQ1YjYwMDA4MGZkNWI2MDAwODBmZDViNjAwMDczZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjgyMTY5MDUwOTE5MDUwNTY1YjYwMDA2MTA0MTM4MjYxMDNlODU2NWI5MDUwOTE5MDUwNTY1YjYxMDQyMzgxNjEwNDA4NTY1YjgxMTQ2MTA0MmU1NzYwMDA4MGZkNWI1MDU2NWI2MDAwODEzNTkwNTA2MTA0NDA4MTYxMDQxYTU2NWI5MjkxNTA1MDU2NWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwNDYxNTc2MTA0NjA2MTAzMzI1NjViNWI2MDIwODIwMjkwNTA2MDIwODEwMTkwNTA5MTkwNTA1NjViNjAwMDgxNjAwNzBiOTA1MDkxOTA1MDU2NWI2MTA0ODg4MTYxMDQ3MjU2NWI4MTE0NjEwNDkzNTc2MDAwODBmZDViNTA1NjViNjAwMDgxMzU5MDUwNjEwNGE1ODE2MTA0N2Y1NjViOTI5MTUwNTA1NjViNjAwMDYwNDA4Mjg0MDMxMjE1NjEwNGMxNTc2MTA0YzA2MTAzZGU1NjViNWI2MTA0Y2I2MDQwNjEwMzkyNTY1YjkwNTA2MDAwNjEwNGRiODQ4Mjg1MDE2MTA0MzE1NjViNjAwMDgzMDE1MjUwNjAyMDYxMDRlZjg0ODI4NTAxNjEwNDk2NTY1YjYwMjA4MzAxNTI1MDkyOTE1MDUwNTY1YjYwMDA2MTA1MGU2MTA1MDk4NDYxMDQ0NjU2NWI2MTAzOTI1NjViOTA1MDgwODM4MjUyNjAyMDgyMDE5MDUwNjA0MDg0MDI4MzAxODU4MTExMTU2MTA1MzE1NzYxMDUzMDYxMDNkOTU2NWI1YjgzNWI4MTgxMTAxNTYxMDU1YTU3ODA2MTA1NDY4ODgyNjEwNGFiNTY1Yjg0NTI2MDIwODQwMTkzNTA1MDYwNDA4MTAxOTA1MDYxMDUzMzU2NWI1MDUwNTA5MzkyNTA1MDUwNTY1YjYwMDA4MjYwMWY4MzAxMTI2MTA1Nzk1NzYxMDU3ODYxMDMxYzU2NWI1YjgxMzU2MTA1ODk4NDgyNjAyMDg2MDE2MTA0ZmI1NjViOTE1MDUwOTI5MTUwNTA1NjViNjAwMDY3ZmZmZmZmZmZmZmZmZmZmZjgyMTExNTYxMDVhZDU3NjEwNWFjNjEwMzMyNTY1YjViNjAyMDgyMDI5MDUwNjAyMDgxMDE5MDUwOTE5MDUwNTY1YjYwMDA2MDYwODI4NDAzMTIxNTYxMDVkNDU3NjEwNWQzNjEwM2RlNTY1YjViNjEwNWRlNjA2MDYxMDM5MjU2NWI5MDUwNjAwMDYxMDVlZTg0ODI4NTAxNjEwNDMxNTY1YjYwMDA4MzAxNTI1MDYwMjA2MTA2MDI4NDgyODUwMTYxMDQzMTU2NWI2MDIwODMwMTUyNTA2MDQwNjEwNjE2ODQ4Mjg1MDE2MTA0OTY1NjViNjA0MDgzMDE1MjUwOTI5MTUwNTA1NjViNjAwMDYxMDYzNTYxMDYzMDg0NjEwNTkyNTY1YjYxMDM5MjU2NWI5MDUwODA4MzgyNTI2MDIwODIwMTkwNTA2MDYwODQwMjgzMDE4NTgxMTExNTYxMDY1ODU3NjEwNjU3NjEwM2Q5NTY1YjViODM1YjgxODExMDE1NjEwNjgxNTc4MDYxMDY2ZDg4ODI2MTA1YmU1NjViODQ1MjYwMjA4NDAxOTM1MDUwNjA2MDgxMDE5MDUwNjEwNjVhNTY1YjUwNTA1MDkzOTI1MDUwNTA1NjViNjAwMDgyNjAxZjgzMDExMjYxMDZhMDU3NjEwNjlmNjEwMzFjNTY1YjViODEzNTYxMDZiMDg0ODI2MDIwODYwMTYxMDYyMjU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwNjA2MDgyODQwMzEyMTU2MTA2Y2Y1NzYxMDZjZTYxMDNkZTU2NWI1YjYxMDZkOTYwNjA2MTAzOTI1NjViOTA1MDYwMDA2MTA2ZTk4NDgyODUwMTYxMDQzMTU2NWI2MDAwODMwMTUyNTA2MDIwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwNzBkNTc2MTA3MGM2MTAzZTM1NjViNWI2MTA3MTk4NDgyODUwMTYxMDU2NDU2NWI2MDIwODMwMTUyNTA2MDQwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwNzNkNTc2MTA3M2M2MTAzZTM1NjViNWI2MTA3NDk4NDgyODUwMTYxMDY4YjU2NWI2MDQwODMwMTUyNTA5MjkxNTA1MDU2NWI2MDAwNjEwNzY4NjEwNzYzODQ2MTAzYWQ1NjViNjEwMzkyNTY1YjkwNTA4MDgzODI1MjYwMjA4MjAxOTA1MDYwMjA4NDAyODMwMTg1ODExMTE1NjEwNzhiNTc2MTA3OGE2MTAzZDk1NjViNWI4MzViODE4MTEwMTU2MTA3ZDI1NzgwMzU2N2ZmZmZmZmZmZmZmZmZmZmY4MTExMTU2MTA3YjA1NzYxMDdhZjYxMDMxYzU2NWI1YjgwODYwMTYxMDdiZDg5ODI2MTA2Yjk1NjViODU1MjYwMjA4NTAxOTQ1MDUwNTA2MDIwODEwMTkwNTA2MTA3OGQ1NjViNTA1MDUwOTM5MjUwNTA1MDU2NWI2MDAwODI=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwBSVxs0JCkgtPnPFZMGr0pisK211YHjQcxfUUAGYKsm5i8vX4c07saf7d6HhUa8+fGgwIkpnbqgYQ86SRrQIiDwoJCNaY26oGEMoFEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjXmNuqBhDQBRICGAISAhgDGKPY6zkiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBlhcSAxjvByKOFzYwMWY4MzAxMTI2MTA3ZjE1NzYxMDdmMDYxMDMxYzU2NWI1YjgxMzU2MTA4MDE4NDgyNjAyMDg2MDE2MTA3NTU1NjViOTE1MDUwOTI5MTUwNTA1NjViNjAwMDYwMjA4Mjg0MDMxMjE1NjEwODIwNTc2MTA4MWY2MTAzMTI1NjViNWI2MDAwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwODNlNTc2MTA4M2Q2MTAzMTc1NjViNWI2MTA4NGE4NDgyODUwMTYxMDdkYzU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwNjAyMDgyODQwMzEyMTU2MTA4Njk1NzYxMDg2ODYxMDMxMjU2NWI1YjYwMDA2MTA4Nzc4NDgyODUwMTYxMDQzMTU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwODE5MDUwOTE5MDUwNTY1YjYxMDg5MzgxNjEwODgwNTY1YjgyNTI1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA2MTA4YWU2MDAwODMwMTg0NjEwODhhNTY1YjkyOTE1MDUwNTY1YjYwMDA4MjgyNTI2MDIwODIwMTkwNTA5MjkxNTA1MDU2NWI3ZjQzNzI3OTcwNzQ2ZjIwNTQ3MjYxNmU3MzY2NjU3MjIwNDY2MTY5NmM2NTY0MDAwMDAwMDAwMDAwMDAwMDAwMDA2MDAwODIwMTUyNTA1NjViNjAwMDYxMDhmYjYwMTY4MzYxMDhiNDU2NWI5MTUwNjEwOTA2ODI2MTA4YzU1NjViNjAyMDgyMDE5MDUwOTE5MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA4MTgxMDM2MDAwODMwMTUyNjEwOTJhODE2MTA4ZWU1NjViOTA1MDkxOTA1MDU2NWI2MTA5M2E4MTYxMDQwODU2NWI4MjUyNTA1MDU2NWI2MDAwNjAyMDgyMDE5MDUwNjEwOTU1NjAwMDgzMDE4NDYxMDkzMTU2NWI5MjkxNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgxOTA1MDkyOTE1MDUwNTY1YjYwMDA1YjgzODExMDE1NjEwOThmNTc4MDgyMDE1MTgxODQwMTUyNjAyMDgxMDE5MDUwNjEwOTc0NTY1YjYwMDA4NDg0MDE1MjUwNTA1MDUwNTY1YjYwMDA2MTA5YTY4MjYxMDk1YjU2NWI2MTA5YjA4MTg1NjEwOTY2NTY1YjkzNTA2MTA5YzA4MTg1NjAyMDg2MDE2MTA5NzE1NjViODA4NDAxOTE1MDUwOTI5MTUwNTA1NjViNjAwMDYxMDlkODgyODQ2MTA5OWI1NjViOTE1MDgxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTYwMDMwYjkwNTA5MTkwNTA1NjViNjEwOWY5ODE2MTA5ZTM1NjViODExNDYxMGEwNDU3NjAwMDgwZmQ1YjUwNTY1YjYwMDA4MTUxOTA1MDYxMGExNjgxNjEwOWYwNTY1YjkyOTE1MDUwNTY1YjYwMDA2MDIwODI4NDAzMTIxNTYxMGEzMjU3NjEwYTMxNjEwMzEyNTY1YjViNjAwMDYxMGE0MDg0ODI4NTAxNjEwYTA3NTY1YjkxNTA1MDkyOTE1MDUwNTY1YjYwMDA4MTUxOTA1MDkxOTA1MDU2NWI2MDAwODI4MjUyNjAyMDgyMDE5MDUwOTI5MTUwNTA1NjViNjAwMDgxOTA1MDYwMjA4MjAxOTA1MDkxOTA1MDU2NWI2MTBhN2U4MTYxMDQwODU2NWI4MjUyNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgyODI1MjYwMjA4MjAxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTkwNTA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjEwYWI5ODE2MTA0NzI1NjViODI1MjUwNTA1NjViNjA0MDgyMDE2MDAwODIwMTUxNjEwYWQ1NjAwMDg1MDE4MjYxMGE3NTU2NWI1MDYwMjA4MjAxNTE2MTBhZTg2MDIwODUwMTgyNjEwYWIwNTY1YjUwNTA1MDUwNTY1YjYwMDA2MTBhZmE4MzgzNjEwYWJmNTY1YjYwNDA4MzAxOTA1MDkyOTE1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjAwMDYxMGIxZTgyNjEwYTg0NTY1YjYxMGIyODgxODU2MTBhOGY1NjViOTM1MDYxMGIzMzgzNjEwYWEwNTY1YjgwNjAwMDViODM4MTEwMTU2MTBiNjQ1NzgxNTE2MTBiNGI4ODgyNjEwYWVlNTY1Yjk3NTA2MTBiNTY4MzYxMGIwNjU2NWI5MjUwNTA2MDAxODEwMTkwNTA2MTBiMzc1NjViNTA4NTkzNTA1MDUwNTA5MjkxNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgyODI1MjYwMjA4MjAxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTkwNTA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjA2MDgyMDE2MDAwODIwMTUxNjEwYmIzNjAwMDg1MDE4MjYxMGE3NTU2NWI1MDYwMjA4MjAxNTE2MTBiYzY2MDIwODUwMTgyNjEwYTc1NTY1YjUwNjA0MDgyMDE1MTYxMGJkOTYwNDA4NTAxODI2MTBhYjA1NjViNTA1MDUwNTA1NjViNjAwMDYxMGJlYjgzODM2MTBiOWQ1NjViNjA2MDgzMDE5MDUwOTI5MTUwNTA1NjViNjAwMDYwMjA4MjAxOTA1MDkxOTA1MDU2NWI2MDAwNjEwYzBmODI2MTBiNzE1NjViNjEwYzE5ODE4NTYxMGI3YzU2NWI5MzUwNjEwYzI0ODM2MTBiOGQ1NjViODA2MDAwNWI4MzgxMTAxNTYxMGM1NTU3ODE1MTYxMGMzYzg4ODI2MTBiZGY1NjViOTc1MDYxMGM0NzgzNjEwYmY3NTY1YjkyNTA1MDYwMDE4MTAxOTA1MDYxMGMyODU2NWI1MDg1OTM1MDUwNTA1MDkyOTE1MDUwNTY1YjYwMDA2MDYwODMwMTYwMDA4MzAxNTE2MTBjN2E2MDAwODYwMTgyNjEwYTc1NTY1YjUwNjAyMDgzMDE1MTg0ODIwMzYwMjA4NjAxNTI2MTBjOTI4MjgyNjEwYjEzNTY1YjkxNTA1MDYwNDA4MzAxNTE4NDgyMDM2MDQwODYwMTUyNjEwY2FjODI4MjYxMGMwNDU2NWI5MTUwNTA4MDkxNTA1MDkyOTE1MDUwNTY1YjYwMDA2MTBjYzU4MzgzNjEwYzYyNTY1YjkwNTA5MjkxNTA1MDU2NWI2MDAwNjAyMDgyMDE5MDUwOTE5MDUwNTY1YjYwMDA2MTBjZTU4MjYxMGE0OTU2NWI2MTBjZWY4MTg1NjEwYTU0NTY1YjkzNTA4MzYwMjA4MjAyODUwMTYxMGQwMTg1NjEwYTY1NTY1YjgwNjAwMDViODU4MTEwMTU2MTBkM2Q1Nzg0ODQwMzg5NTI4MTUxNjEwZDFlODU4MjYxMGNiOTU2NWI5NDUwNjEwZDI5ODM2MTBjY2Q1NjViOTI1MDYwMjA4YTAxOTk1MDUwNjAwMTgxMDE5MDUwNjEwZDA1NTY1YjUwODI5NzUwODc5NTUwNTA1MDUwNTA1MDkyOTE1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA4MTgxMDM2MDAwODMwMTUyNjEwZDY5ODE4NDYxMGNkYTU2NWI5MDUwOTI5MTUwNTA1NmZlYTI2NDY5NzA2NjczNTgyMjEyMjAxODI5MWU4ZjA2YmY3ZTNjMzc3OGEyMGUwNjhhZWY0NDAyODE4NWQyOGVkNWQyYWU3MzMxNDNiNTg4Zjc2MTYwNjQ3MzZmNmM2MzQzMDAwODEwMDAzMw==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwAxRt9iKsy3p67DTgWnvhLKaMZP+R5NLk7OTecRTbbr/tTCAcM1++QFiyoaY2or1zGgsIk5nbqgYQm8S+UiIPCgkI15jbqgYQ0AUSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjXmNuqBhDSBRICGAISAhgDGJb7rp0CIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5CRQoDGO8HGiISIGux1qw6CU/m4P7irGhIQVTIjrByAixyHl8Vs3kUW/HQIJChD0IFCIDO2gNSAFoAagtjZWxsYXIgZG9vcg==","b64Record":"CiUIFiIDGPAHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAYAf6t9DH53Pq2axGsX//BlZHaAz6SD9ojqFFPZJUT39mIgJYpxiC20nhcBBzu2B0aDAiTmduqBhDDtePXAiIPCgkI15jbqgYQ0gUSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjDA2eIGQtwdCgMY8AcSpxtggGBAUjSAFWEAEFdgAID9W1BgBDYQYQA2V2AANWDgHIBjDtBydhRhADtXgGN8Qa0sFGEAV1dbYACA/VthAFVgBIA2A4EBkGEAUJGQYQgKVlthAIdWWwBbYQBxYASANgOBAZBhAGyRkGEIU1ZbYQDeVltgQFFhAH6RkGEImVZbYEBRgJEDkPNbYABhAJKCYQHzVluQUGAWYAMLgRRhANpXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhANGQYQkRVltgQFGAkQOQ/VtQUFZbYACAYABhAWdz//////////////////////////8WY3xBrSxg4BuFYEBRYCQBYQEVkZBhCUBWW2BAUWAggYMDA4FSkGBAUpB7/////////////////////////////////////xkWYCCCAYBRe/////////////////////////////////////+DgYMWF4NSUFBQUGBAUWEBf5GQYQnMVltgAGBAUYCDA4FgAIZa8ZFQUD2AYACBFGEBvFdgQFGRUGAfGWA/PQEWggFgQFI9glI9YABgIIQBPmEBwVZbYGCRUFtQkVCRUIFhAdJXYBVhAedWW4CAYCABkFGBAZBhAeaRkGEKHFZbW2ADC5JQUFCRkFBWW2AAgGAAYQFnc///////////////////////////FmMYmlVMYOAbhWBAUWAkAWECKpGQYQ1PVltgQFFgIIGDAwOBUpBgQFKQe/////////////////////////////////////8ZFmAgggGAUXv/////////////////////////////////////g4GDFheDUlBQUFBgQFFhApSRkGEJzFZbYABgQFGAgwOBYACGWvGRUFA9gGAAgRRhAtFXYEBRkVBgHxlgPz0BFoIBYEBSPYJSPWAAYCCEAT5hAtZWW2BgkVBbUJFQ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VltgAIFgAwuQUJGQUFZbYQn5gWEJ41ZbgRRhCgRXYACA/VtQVltgAIFRkFBhChaBYQnwVluSkVBQVltgAGAggoQDEhVhCjJXYQoxYQMSVltbYABhCkCEgoUBYQoHVluRUFCSkVBQVltgAIFRkFCRkFBWW2AAgoJSYCCCAZBQkpFQUFZbYACBkFBgIIIBkFCRkFBWW2EKfoFhBAhWW4JSUFBWW2AAgVGQUJGQUFZbYACCglJgIIIBkFCSkVBQVltgAIGQUGAgggGQUJGQUFZbYQq5gWEEclZbglJQUFZbYECCAWAAggFRYQrVYACFAYJhCnVWW1BgIIIBUWEK6GAghQGCYQqwVltQUFBQVltgAGEK+oODYQq/VltgQIMBkFCSkVBQVltgAGAgggGQUJGQUFZbYABhCx6CYQqEVlthCyiBhWEKj1Zbk1BhCzODYQqgVluAYABbg4EQFWELZFeBUWELS4iCYQruVluXUGELVoNhCwZWW5JQUGABgQGQUGELN1ZbUIWTUFBQUJKRUFBWW2AAgVGQUJGQUFZbYACCglJgIIIBkFCSkVBQVltgAIGQUGAgggGQUJGQUFZbYGCCAWAAggFRYQuzYACFAYJhCnVWW1BgIIIBUWELxmAghQGCYQp1VltQYECCAVFhC9lgQIUBgmEKsFZbUFBQUFZbYABhC+uDg2ELnVZbYGCDAZBQkpFQUFZbYABgIIIBkFCRkFBWW2AAYQwPgmELcVZbYQwZgYVhC3xWW5NQYQwkg2ELjVZbgGAAW4OBEBVhDFVXgVFhDDyIgmEL31Zbl1BhDEeDYQv3VluSUFBgAYEBkFBhDChWW1CFk1BQUFCSkVBQVltgAGBggwFgAIMBUWEMemAAhgGCYQp1VltQYCCDAVGEggNgIIYBUmEMkoKCYQsTVluRUFBgQIMBUYSCA2BAhgFSYQysgoJhDARWW5FQUICRUFCSkVBQVltgAGEMxYODYQxiVluQUJKRUFBWW2AAYCCCAZBQkZBQVltgAGEM5YJhCklWW2EM74GFYQpUVluTUINgIIIChQFhDQGFYQplVluAYABbhYEQFWENPVeEhAOJUoFRYQ0ehYJhDLlWW5RQYQ0pg2EMzVZbklBgIIoBmVBQYAGBAZBQYQ0FVltQgpdQh5VQUFBQUFCSkVBQVltgAGAgggGQUIGBA2AAgwFSYQ1pgYRhDNpWW5BQkpFQUFb+omRpcGZzWCISIBgpHo8Gv348N3iiDgaK70QCgYXSjtXSrnMxQ7WI92FgZHNvbGNDAAgQADMigAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKMCaDDoDGPAHShYKFAAAAAAAAAAAAAAAAAAAAAAAAAPwcgcKAxjwBxABUhYKCQoCGAIQ/7LFDQoJCgIYYhCAs8UN"},{"b64Body":"Cg8KCQjYmNuqBhDYBRICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxjqBxoxKi8IARIrCiISIEc7vkGO5u0TgTpKKwuUYQKjao6NMs2QjrhXENOHzIwqCgVCAxjwBw==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwCkv8LRuBwcVByppnU7HdD6IOXRsRG2lCbsuBlGqy2fOMVX1OFZ6h3rIXB2RN0deJGgsIlJnbqgYQ47qtZCIPCgkI2JjbqgYQ2AUSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjYmNuqBhDeBRICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxjrBxoxKi8IARIrCiISIEc7vkGO5u0TgTpKKwuUYQKjao6NMs2QjrhXENOHzIwqCgVCAxjwBw==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwyuYViw+KAUDV12kWX+sfpkr9HlRTjYN+ExeFqovo6ZrWWQ3mzUJe2SQXj3xU3HqqGgwIlJnbqgYQk6KS6AIiDwoJCNiY26oGEN4FEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjZmNuqBhDkBRICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxjsBxoxKi8IARIrCiISIEc7vkGO5u0TgTpKKwuUYQKjao6NMs2QjrhXENOHzIwqCgVCAxjwBw==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwDzZFevYJp3nwnYV3Gx2ts+sDlOT/m6VtJJAxelBk6I1XEkSSbO08Lo80W0LPOSjiGgsIlZnbqgYQo6e8diIPCgkI2ZjbqgYQ5AUSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjZmNuqBhDmBRICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo460QMKAxjwBxCAkvQBIsQDDtBydgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+r/////////////////////////////////////////zgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","b64Record":"CiUIFiIDGPAHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjA0laxqkNpilcA+SfG+wxGLgUWyq0P6ZEzL00zeCHFwrmT7XQV278QsJgDev06WtCsaDAiVmduqBhDTkvP6AiIPCgkI2ZjbqgYQ5gUSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCAmKtsOo0CCgMY8AcigAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKICowwFSGAoKCgIYAhD/r9bYAQoKCgIYYhCAsNbYAQ=="},{"b64Body":"ChEKCQjZmNuqBhDmBRICGAIgAXIiEiAKAxjuBxIHCgMY6gcQYxIHCgMY6wcQPBIHCgMY7AcQKA==","b64Record":"CgIIFhIwaIRcjKqwsmnp1p0VhbySncBxHfLKrPIN4yqGGCmPji/xEXyhUejLIaXbiziCMA4hGgwIlZnbqgYQ1JLz+gIiEQoJCNmY26oGEOYFEgIYAiABOvwDCgMY5wISIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWKIelAVDsqO4BYsQDGJpVTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+r/////////////////////////////////////////zgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqAxjwB1IAWiAKAxjuBxIHCgMY6gcQYxIHCgMY6wcQPBIHCgMY7AcQKHoMCJWZ26oGENOS8/oC"}]},"NonNestedCryptoTransferForNonFungibleToken":{"placeholderNum":1009,"encodedItems":[{"b64Body":"Cg8KCQjemNuqBhCKBhICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloyCiISIG+PvnXp1hwMY0sRYrylOUkyIb6am1udElyQWugwrOb2EIDQ28P0AkoFCIDO2gM=","b64Record":"CiUIFhIDGPIHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCT+s37MwYhMT9DrKRrXDJl4+a8yM1vCyXbjSeCXEJGH6x+lTK/uCOI+bIKIH6MO40aDAiamduqBhDz27S6ASIPCgkI3pjbqgYQigYSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIbCgsKAhgCEP+ft4fpBQoMCgMY8gcQgKC3h+kF"},{"b64Body":"Cg8KCQjemNuqBhCMBhICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISIKVp3xLrT8M122bOw7+zc0hex3Auzh+n7Mtvjm542PXGEICU69wDQAFKBQiAztoD","b64Record":"CiUIFhIDGPMHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjD0CRNY080cPWnYBhfnCEyWHjttU8EybefpTwRr2E5Hr/2/HNDRE3NlLFbQ8eHGdyEaDAiamduqBhC7vLGoAyIPCgkI3pjbqgYQjAYSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxjzBxCAqNa5Bw=="},{"b64Body":"Cg8KCQjfmNuqBhCOBhICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIH2i1h6E/qIJOBppHgPXU+y8Rt84No+qKbcGK3hHbIi5EICU69wDSgUIgM7aAw==","b64Record":"CiUIFhIDGPQHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAZboRGcma8IR59Sp6MO5X5wFfwOi0FQ3lOPy9rPERdNfOJPm32DqyEByPFaadunXEaDAibmduqBhDT9aS5ASIPCgkI35jbqgYQjgYSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxj0BxCAqNa5Bw=="},{"b64Body":"Cg8KCQjfmNuqBhCQBhICGAISAhgDGN6ApvsCIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAXMKCVRva2VuX05GVBIITUFFU1pERFcqAxj0BzIiEiAsJIObfnYBo9ce3chTWMhF7FctMyGgFw2mox3IW7pU71IiEiAsJIObfnYBo9ce3chTWMhF7FctMyGgFw2mox3IW7pU72oMCJvnta4GELi4958DiAEB","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGPUHEjByyOAg2gnituiH/E6Y9CtQtZ16JlU9xGGIWzbPtX+F/YsovwXpeiE0vPeJPCOsZ3UaDAibmduqBhCzgYiqAyIPCgkI35jbqgYQkAYSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAcgoKAxj1BxIDGPQH"},{"b64Body":"Cg8KCQjgmNuqBhCWBhICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGPIHEgMY9Qc=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw0Sr83MYBAfOEY68m2/zAgDK7wzpEFCvJIei3fSG0xlgSXP6cbVuryWKiX4ukyhWMGgwInJnbqgYQm6OFvAEiDwoJCOCY26oGEJYGEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjgmNuqBhCcBhICGAISAhgDGP2NkRAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjqoCHAoDGPUHGglmaXJzdE1lbW8aCnNlY29uZE1lbW8=","b64Record":"CiYIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1gCcgIBAhIwIPBofqMim87Hmkz8Yt/Oa+MrtQTtIcknxqGeh8JbpVjHiJmP2Db+kYvnifP07+IqGgwInJnbqgYQ+426vwMiDwoJCOCY26oGEJwGEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFofCgMY9QcaCwoCGAASAxj0BxgBGgsKAhgAEgMY9AcYAg=="},{"b64Body":"Cg8KCQjhmNuqBhCkBhICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGPMHEgMY9Qc=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwNEc1HGWZ+pwPnGeNnz82O0UcsdsnEny45qO+KhQ6BGFhFeMH/Z5lon3KIaXh8SeBGgwInZnbqgYQy9Xu5QEiDwoJCOGY26oGEKQGEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"ChAKCQjhmNuqBhCmBhIDGPIHEgIYAxiNxjwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjnIVEhMKAxj1BxoMCgMY9AcSAxjyBxgB","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwf/doibp6N/4XSwyGr6txwnoaxHmDqTGnOwGJvjc5dS21OlgniN2vS83OF/vSzj4XGgwInZnbqgYQk8+21AMiEAoJCOGY26oGEKYGEgMY8gcqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMI3GPFIqCggKAhgDEOLUBAoICgIYYhCM5WgKCQoDGKAGEKzSCwoJCgMY8gcQmYx5WhMKAxj1BxoMCgMY9AcSAxjyBxgB"},{"b64Body":"Cg8KCQjimNuqBhCoBhICGAISAhgDGP7LzSwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjooBjwESDAie57WuBhCgyrTWARptCiISIBouFgyOP1dVGs46uWKiRmsYZO0jO4ie2fjpZnOR4Je5CiM6IQLj7YrERJvYd3x318hcxsXZp7aZ3toHRT0CuhJLkygUZgoiEiDjB3qwdLLNvnUKbToSxRbS2eU2jmMlPd66wsQClo8LlSIMSGVsbG8gV29ybGQhKgAyAA==","b64Record":"CiUIFhoDGPYHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAYmosJUlKqdi8lMlQ1L9GdLETIBvdM3uu04cxqgeAsl8g0P2qb0mQgrtDxV7iWy9oaDAiemduqBhDzpO/kASIPCgkI4pjbqgYQqAYSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjimNuqBhCsBhICGAISAhgDGIydjj4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjpoBiCAKAxj2ByKAIDYwODA2MDQwNTIzNDgwMTU2MTAwMTA1NzYwMDA4MGZkNWI1MDYxMGRhNzgwNjEwMDIwNjAwMDM5NjAwMGYzZmU2MDgwNjA0MDUyMzQ4MDE1NjEwMDEwNTc2MDAwODBmZDViNTA2MDA0MzYxMDYxMDAzNjU3NjAwMDM1NjBlMDFjODA2MzBlZDA3Mjc2MTQ2MTAwM2I1NzgwNjM3YzQxYWQyYzE0NjEwMDU3NTc1YjYwMDA4MGZkNWI2MTAwNTU2MDA0ODAzNjAzODEwMTkwNjEwMDUwOTE5MDYxMDgwYTU2NWI2MTAwODc1NjViMDA1YjYxMDA3MTYwMDQ4MDM2MDM4MTAxOTA2MTAwNmM5MTkwNjEwODUzNTY1YjYxMDBkZTU2NWI2MDQwNTE2MTAwN2U5MTkwNjEwODk5NTY1YjYwNDA1MTgwOTEwMzkwZjM1YjYwMDA2MTAwOTI4MjYxMDFmMzU2NWI5MDUwNjAxNjYwMDMwYjgxMTQ2MTAwZGE1NzYwNDA1MTdmMDhjMzc5YTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgxNTI2MDA0MDE2MTAwZDE5MDYxMDkxMTU2NWI2MDQwNTE4MDkxMDM5MGZkNWI1MDUwNTY1YjYwMDA4MDYwMDA2MTAxNjc3M2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxNjYzN2M0MWFkMmM2MGUwMWI4NTYwNDA1MTYwMjQwMTYxMDExNTkxOTA2MTA5NDA1NjViNjA0MDUxNjAyMDgxODMwMzAzODE1MjkwNjA0MDUyOTA3YmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTkxNjYwMjA4MjAxODA1MTdiZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY4MzgxODMxNjE3ODM1MjUwNTA1MDUwNjA0MDUxNjEwMTdmOTE5MDYxMDljYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwMWJjNTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwMWMxNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTAxZDI1NzYwMTU2MTAxZTc1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTAxZTY5MTkwNjEwYTFjNTY1YjViNjAwMzBiOTI1MDUwNTA5MTkwNTA1NjViNjAwMDgwNjAwMDYxMDE2NzczZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE2NjMxODlhNTU0YzYwZTAxYjg1NjA0MDUxNjAyNDAxNjEwMjJhOTE5MDYxMGQ0ZjU2NWI2MDQwNTE2MDIwODE4MzAzMDM4MTUyOTA2MDQwNTI5MDdiZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxOTE2NjAyMDgyMDE4MDUxN2JmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjgzODE4MzE2MTc4MzUyNTA1MDUwNTA2MDQwNTE2MTAyOTQ5MTkwNjEwOWNjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTAyZDE1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTAyZDY1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA4MTYxMDJlNzU3NjAxNTYxMDJmYzU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDJmYjkxOTA2MTBhMWM1NjViNWI2MDAzMGI5MjUwNTA1MDkxOTA1MDU2NWI2MDAwNjA0MDUxOTA1MDkwNTY1YjYwMDA4MGZkNWI2MDAwODBmZDViNjAwMDgwZmQ1YjYwMDA2MDFmMTk2MDFmODMwMTE2OTA1MDkxOTA1MDU2NWI3ZjRlNDg3YjcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MDAwNTI2MDQxNjAwNDUyNjAyNDYwMDBmZDViNjEwMzZhODI2MTAzMjE1NjViODEwMTgxODExMDY3ZmZmZmZmZmZmZmZmZmZmZjgyMTExNzE1NjEwMzg5NTc2MTAzODg2MTAzMzI1NjViNWI4MDYwNDA1MjUwNTA1MDU2NWI2MDAwNjEwMzljNjEwMzA4NTY1YjkwNTA2MTAzYTg4MjgyNjEwMzYxNTY1YjkxOTA1MDU2NWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwM2M4NTc2MTAzYzc2MTAzMzI1NjViNWI2MDIwODIwMjkwNTA2MDIwODEwMTkwNTA5MTkwNTA1NjViNjAwMDgwZmQ1YjYwMDA4MGZkNWI2MDAwODBmZDViNjAwMDczZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjgyMTY5MDUwOTE5MDUwNTY1YjYwMDA2MTA0MTM4MjYxMDNlODU2NWI5MDUwOTE5MDUwNTY1YjYxMDQyMzgxNjEwNDA4NTY1YjgxMTQ2MTA0MmU1NzYwMDA4MGZkNWI1MDU2NWI2MDAwODEzNTkwNTA2MTA0NDA4MTYxMDQxYTU2NWI5MjkxNTA1MDU2NWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwNDYxNTc2MTA0NjA2MTAzMzI1NjViNWI2MDIwODIwMjkwNTA2MDIwODEwMTkwNTA5MTkwNTA1NjViNjAwMDgxNjAwNzBiOTA1MDkxOTA1MDU2NWI2MTA0ODg4MTYxMDQ3MjU2NWI4MTE0NjEwNDkzNTc2MDAwODBmZDViNTA1NjViNjAwMDgxMzU5MDUwNjEwNGE1ODE2MTA0N2Y1NjViOTI5MTUwNTA1NjViNjAwMDYwNDA4Mjg0MDMxMjE1NjEwNGMxNTc2MTA0YzA2MTAzZGU1NjViNWI2MTA0Y2I2MDQwNjEwMzkyNTY1YjkwNTA2MDAwNjEwNGRiODQ4Mjg1MDE2MTA0MzE1NjViNjAwMDgzMDE1MjUwNjAyMDYxMDRlZjg0ODI4NTAxNjEwNDk2NTY1YjYwMjA4MzAxNTI1MDkyOTE1MDUwNTY1YjYwMDA2MTA1MGU2MTA1MDk4NDYxMDQ0NjU2NWI2MTAzOTI1NjViOTA1MDgwODM4MjUyNjAyMDgyMDE5MDUwNjA0MDg0MDI4MzAxODU4MTExMTU2MTA1MzE1NzYxMDUzMDYxMDNkOTU2NWI1YjgzNWI4MTgxMTAxNTYxMDU1YTU3ODA2MTA1NDY4ODgyNjEwNGFiNTY1Yjg0NTI2MDIwODQwMTkzNTA1MDYwNDA4MTAxOTA1MDYxMDUzMzU2NWI1MDUwNTA5MzkyNTA1MDUwNTY1YjYwMDA4MjYwMWY4MzAxMTI2MTA1Nzk1NzYxMDU3ODYxMDMxYzU2NWI1YjgxMzU2MTA1ODk4NDgyNjAyMDg2MDE2MTA0ZmI1NjViOTE1MDUwOTI5MTUwNTA1NjViNjAwMDY3ZmZmZmZmZmZmZmZmZmZmZjgyMTExNTYxMDVhZDU3NjEwNWFjNjEwMzMyNTY1YjViNjAyMDgyMDI5MDUwNjAyMDgxMDE5MDUwOTE5MDUwNTY1YjYwMDA2MDYwODI4NDAzMTIxNTYxMDVkNDU3NjEwNWQzNjEwM2RlNTY1YjViNjEwNWRlNjA2MDYxMDM5MjU2NWI5MDUwNjAwMDYxMDVlZTg0ODI4NTAxNjEwNDMxNTY1YjYwMDA4MzAxNTI1MDYwMjA2MTA2MDI4NDgyODUwMTYxMDQzMTU2NWI2MDIwODMwMTUyNTA2MDQwNjEwNjE2ODQ4Mjg1MDE2MTA0OTY1NjViNjA0MDgzMDE1MjUwOTI5MTUwNTA1NjViNjAwMDYxMDYzNTYxMDYzMDg0NjEwNTkyNTY1YjYxMDM5MjU2NWI5MDUwODA4MzgyNTI2MDIwODIwMTkwNTA2MDYwODQwMjgzMDE4NTgxMTExNTYxMDY1ODU3NjEwNjU3NjEwM2Q5NTY1YjViODM1YjgxODExMDE1NjEwNjgxNTc4MDYxMDY2ZDg4ODI2MTA1YmU1NjViODQ1MjYwMjA4NDAxOTM1MDUwNjA2MDgxMDE5MDUwNjEwNjVhNTY1YjUwNTA1MDkzOTI1MDUwNTA1NjViNjAwMDgyNjAxZjgzMDExMjYxMDZhMDU3NjEwNjlmNjEwMzFjNTY1YjViODEzNTYxMDZiMDg0ODI2MDIwODYwMTYxMDYyMjU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwNjA2MDgyODQwMzEyMTU2MTA2Y2Y1NzYxMDZjZTYxMDNkZTU2NWI1YjYxMDZkOTYwNjA2MTAzOTI1NjViOTA1MDYwMDA2MTA2ZTk4NDgyODUwMTYxMDQzMTU2NWI2MDAwODMwMTUyNTA2MDIwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwNzBkNTc2MTA3MGM2MTAzZTM1NjViNWI2MTA3MTk4NDgyODUwMTYxMDU2NDU2NWI2MDIwODMwMTUyNTA2MDQwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwNzNkNTc2MTA3M2M2MTAzZTM1NjViNWI2MTA3NDk4NDgyODUwMTYxMDY4YjU2NWI2MDQwODMwMTUyNTA5MjkxNTA1MDU2NWI2MDAwNjEwNzY4NjEwNzYzODQ2MTAzYWQ1NjViNjEwMzkyNTY1YjkwNTA4MDgzODI1MjYwMjA4MjAxOTA1MDYwMjA4NDAyODMwMTg1ODExMTE1NjEwNzhiNTc2MTA3OGE2MTAzZDk1NjViNWI4MzViODE4MTEwMTU2MTA3ZDI1NzgwMzU2N2ZmZmZmZmZmZmZmZmZmZmY4MTExMTU2MTA3YjA1NzYxMDdhZjYxMDMxYzU2NWI1YjgwODYwMTYxMDdiZDg5ODI2MTA2Yjk1NjViODU1MjYwMjA4NTAxOTQ1MDUwNTA2MDIwODEwMTkwNTA2MTA3OGQ1NjViNTA1MDUwOTM5MjUwNTA1MDU2NWI2MDAwODI=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw2Yfvgj4zgyJjncu7A6jNhS0HIzPV8ob/7qsqeT/Zn6bl9k/rpK5dE2UAG72rn45dGgwInpnbqgYQg7PV0gMiDwoJCOKY26oGEKwGEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjjmNuqBhCyBhICGAISAhgDGKPY6zkiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBlhcSAxj2ByKOFzYwMWY4MzAxMTI2MTA3ZjE1NzYxMDdmMDYxMDMxYzU2NWI1YjgxMzU2MTA4MDE4NDgyNjAyMDg2MDE2MTA3NTU1NjViOTE1MDUwOTI5MTUwNTA1NjViNjAwMDYwMjA4Mjg0MDMxMjE1NjEwODIwNTc2MTA4MWY2MTAzMTI1NjViNWI2MDAwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwODNlNTc2MTA4M2Q2MTAzMTc1NjViNWI2MTA4NGE4NDgyODUwMTYxMDdkYzU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwNjAyMDgyODQwMzEyMTU2MTA4Njk1NzYxMDg2ODYxMDMxMjU2NWI1YjYwMDA2MTA4Nzc4NDgyODUwMTYxMDQzMTU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwODE5MDUwOTE5MDUwNTY1YjYxMDg5MzgxNjEwODgwNTY1YjgyNTI1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA2MTA4YWU2MDAwODMwMTg0NjEwODhhNTY1YjkyOTE1MDUwNTY1YjYwMDA4MjgyNTI2MDIwODIwMTkwNTA5MjkxNTA1MDU2NWI3ZjQzNzI3OTcwNzQ2ZjIwNTQ3MjYxNmU3MzY2NjU3MjIwNDY2MTY5NmM2NTY0MDAwMDAwMDAwMDAwMDAwMDAwMDA2MDAwODIwMTUyNTA1NjViNjAwMDYxMDhmYjYwMTY4MzYxMDhiNDU2NWI5MTUwNjEwOTA2ODI2MTA4YzU1NjViNjAyMDgyMDE5MDUwOTE5MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA4MTgxMDM2MDAwODMwMTUyNjEwOTJhODE2MTA4ZWU1NjViOTA1MDkxOTA1MDU2NWI2MTA5M2E4MTYxMDQwODU2NWI4MjUyNTA1MDU2NWI2MDAwNjAyMDgyMDE5MDUwNjEwOTU1NjAwMDgzMDE4NDYxMDkzMTU2NWI5MjkxNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgxOTA1MDkyOTE1MDUwNTY1YjYwMDA1YjgzODExMDE1NjEwOThmNTc4MDgyMDE1MTgxODQwMTUyNjAyMDgxMDE5MDUwNjEwOTc0NTY1YjYwMDA4NDg0MDE1MjUwNTA1MDUwNTY1YjYwMDA2MTA5YTY4MjYxMDk1YjU2NWI2MTA5YjA4MTg1NjEwOTY2NTY1YjkzNTA2MTA5YzA4MTg1NjAyMDg2MDE2MTA5NzE1NjViODA4NDAxOTE1MDUwOTI5MTUwNTA1NjViNjAwMDYxMDlkODgyODQ2MTA5OWI1NjViOTE1MDgxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTYwMDMwYjkwNTA5MTkwNTA1NjViNjEwOWY5ODE2MTA5ZTM1NjViODExNDYxMGEwNDU3NjAwMDgwZmQ1YjUwNTY1YjYwMDA4MTUxOTA1MDYxMGExNjgxNjEwOWYwNTY1YjkyOTE1MDUwNTY1YjYwMDA2MDIwODI4NDAzMTIxNTYxMGEzMjU3NjEwYTMxNjEwMzEyNTY1YjViNjAwMDYxMGE0MDg0ODI4NTAxNjEwYTA3NTY1YjkxNTA1MDkyOTE1MDUwNTY1YjYwMDA4MTUxOTA1MDkxOTA1MDU2NWI2MDAwODI4MjUyNjAyMDgyMDE5MDUwOTI5MTUwNTA1NjViNjAwMDgxOTA1MDYwMjA4MjAxOTA1MDkxOTA1MDU2NWI2MTBhN2U4MTYxMDQwODU2NWI4MjUyNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgyODI1MjYwMjA4MjAxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTkwNTA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjEwYWI5ODE2MTA0NzI1NjViODI1MjUwNTA1NjViNjA0MDgyMDE2MDAwODIwMTUxNjEwYWQ1NjAwMDg1MDE4MjYxMGE3NTU2NWI1MDYwMjA4MjAxNTE2MTBhZTg2MDIwODUwMTgyNjEwYWIwNTY1YjUwNTA1MDUwNTY1YjYwMDA2MTBhZmE4MzgzNjEwYWJmNTY1YjYwNDA4MzAxOTA1MDkyOTE1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjAwMDYxMGIxZTgyNjEwYTg0NTY1YjYxMGIyODgxODU2MTBhOGY1NjViOTM1MDYxMGIzMzgzNjEwYWEwNTY1YjgwNjAwMDViODM4MTEwMTU2MTBiNjQ1NzgxNTE2MTBiNGI4ODgyNjEwYWVlNTY1Yjk3NTA2MTBiNTY4MzYxMGIwNjU2NWI5MjUwNTA2MDAxODEwMTkwNTA2MTBiMzc1NjViNTA4NTkzNTA1MDUwNTA5MjkxNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgyODI1MjYwMjA4MjAxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTkwNTA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjA2MDgyMDE2MDAwODIwMTUxNjEwYmIzNjAwMDg1MDE4MjYxMGE3NTU2NWI1MDYwMjA4MjAxNTE2MTBiYzY2MDIwODUwMTgyNjEwYTc1NTY1YjUwNjA0MDgyMDE1MTYxMGJkOTYwNDA4NTAxODI2MTBhYjA1NjViNTA1MDUwNTA1NjViNjAwMDYxMGJlYjgzODM2MTBiOWQ1NjViNjA2MDgzMDE5MDUwOTI5MTUwNTA1NjViNjAwMDYwMjA4MjAxOTA1MDkxOTA1MDU2NWI2MDAwNjEwYzBmODI2MTBiNzE1NjViNjEwYzE5ODE4NTYxMGI3YzU2NWI5MzUwNjEwYzI0ODM2MTBiOGQ1NjViODA2MDAwNWI4MzgxMTAxNTYxMGM1NTU3ODE1MTYxMGMzYzg4ODI2MTBiZGY1NjViOTc1MDYxMGM0NzgzNjEwYmY3NTY1YjkyNTA1MDYwMDE4MTAxOTA1MDYxMGMyODU2NWI1MDg1OTM1MDUwNTA1MDkyOTE1MDUwNTY1YjYwMDA2MDYwODMwMTYwMDA4MzAxNTE2MTBjN2E2MDAwODYwMTgyNjEwYTc1NTY1YjUwNjAyMDgzMDE1MTg0ODIwMzYwMjA4NjAxNTI2MTBjOTI4MjgyNjEwYjEzNTY1YjkxNTA1MDYwNDA4MzAxNTE4NDgyMDM2MDQwODYwMTUyNjEwY2FjODI4MjYxMGMwNDU2NWI5MTUwNTA4MDkxNTA1MDkyOTE1MDUwNTY1YjYwMDA2MTBjYzU4MzgzNjEwYzYyNTY1YjkwNTA5MjkxNTA1MDU2NWI2MDAwNjAyMDgyMDE5MDUwOTE5MDUwNTY1YjYwMDA2MTBjZTU4MjYxMGE0OTU2NWI2MTBjZWY4MTg1NjEwYTU0NTY1YjkzNTA4MzYwMjA4MjAyODUwMTYxMGQwMTg1NjEwYTY1NTY1YjgwNjAwMDViODU4MTEwMTU2MTBkM2Q1Nzg0ODQwMzg5NTI4MTUxNjEwZDFlODU4MjYxMGNiOTU2NWI5NDUwNjEwZDI5ODM2MTBjY2Q1NjViOTI1MDYwMjA4YTAxOTk1MDUwNjAwMTgxMDE5MDUwNjEwZDA1NTY1YjUwODI5NzUwODc5NTUwNTA1MDUwNTA1MDkyOTE1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA4MTgxMDM2MDAwODMwMTUyNjEwZDY5ODE4NDYxMGNkYTU2NWI5MDUwOTI5MTUwNTA1NmZlYTI2NDY5NzA2NjczNTgyMjEyMjAxODI5MWU4ZjA2YmY3ZTNjMzc3OGEyMGUwNjhhZWY0NDAyODE4NWQyOGVkNWQyYWU3MzMxNDNiNTg4Zjc2MTYwNjQ3MzZmNmM2MzQzMDAwODEwMDAzMw==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwRM+siKSA4rNPPhEYJPAswLGYTMRSRIbmTevrtSQ0RRlnNjRrqnmYDhTdz5VbaGDpGgwIn5nbqgYQg5SRgAIiDwoJCOOY26oGELIGEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjkmNuqBhC0BhICGAISAhgDGJb7rp0CIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5CRQoDGPYHGiISIOnIKVyuPj6cWM2ZFc9o9nLBDf8e06bAWwkBLKhI98ezIJChD0IFCIDO2gNSAFoAagtjZWxsYXIgZG9vcg==","b64Record":"CiUIFiIDGPcHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjBmlINEWATwJpJyEdBr9vYxGn50yRJFysYICUGqYwKGrr+QZsIDq6EVK52sC7i3ok4aCwigmduqBhCDrN8TIg8KCQjkmNuqBhC0BhICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMMDZ4gZC3B0KAxj3BxKnG2CAYEBSNIAVYQAQV2AAgP1bUGAENhBhADZXYAA1YOAcgGMO0HJ2FGEAO1eAY3xBrSwUYQBXV1tgAID9W2EAVWAEgDYDgQGQYQBQkZBhCApWW2EAh1ZbAFthAHFgBIA2A4EBkGEAbJGQYQhTVlthAN5WW2BAUWEAfpGQYQiZVltgQFGAkQOQ81tgAGEAkoJhAfNWW5BQYBZgAwuBFGEA2ldgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEA0ZBhCRFWW2BAUYCRA5D9W1BQVltgAIBgAGEBZ3P//////////////////////////xZjfEGtLGDgG4VgQFFgJAFhARWRkGEJQFZbYEBRYCCBgwMDgVKQYEBSkHv/////////////////////////////////////GRZgIIIBgFF7/////////////////////////////////////4OBgxYXg1JQUFBQYEBRYQF/kZBhCcxWW2AAYEBRgIMDgWAAhlrxkVBQPYBgAIEUYQG8V2BAUZFQYB8ZYD89ARaCAWBAUj2CUj1gAGAghAE+YQHBVltgYJFQW1CRUJFQgWEB0ldgFWEB51ZbgIBgIAGQUYEBkGEB5pGQYQocVltbYAMLklBQUJGQUFZbYACAYABhAWdz//////////////////////////8WYxiaVUxg4BuFYEBRYCQBYQIqkZBhDU9WW2BAUWAggYMDA4FSkGBAUpB7/////////////////////////////////////xkWYCCCAYBRe/////////////////////////////////////+DgYMWF4NSUFBQUGBAUWEClJGQYQnMVltgAGBAUYCDA4FgAIZa8ZFQUD2AYACBFGEC0VdgQFGRUGAfGWA/PQEWggFgQFI9glI9YABgIIQBPmEC1lZbYGCRUFtQkVCR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W2AAgWADC5BQkZBQVlthCfmBYQnjVluBFGEKBFdgAID9W1BWW2AAgVGQUGEKFoFhCfBWW5KRUFBWW2AAYCCChAMSFWEKMldhCjFhAxJWW1tgAGEKQISChQFhCgdWW5FQUJKRUFBWW2AAgVGQUJGQUFZbYACCglJgIIIBkFCSkVBQVltgAIGQUGAgggGQUJGQUFZbYQp+gWEECFZbglJQUFZbYACBUZBQkZBQVltgAIKCUmAgggGQUJKRUFBWW2AAgZBQYCCCAZBQkZBQVlthCrmBYQRyVluCUlBQVltgQIIBYACCAVFhCtVgAIUBgmEKdVZbUGAgggFRYQroYCCFAYJhCrBWW1BQUFBWW2AAYQr6g4NhCr9WW2BAgwGQUJKRUFBWW2AAYCCCAZBQkZBQVltgAGELHoJhCoRWW2ELKIGFYQqPVluTUGELM4NhCqBWW4BgAFuDgRAVYQtkV4FRYQtLiIJhCu5WW5dQYQtWg2ELBlZbklBQYAGBAZBQYQs3VltQhZNQUFBQkpFQUFZbYACBUZBQkZBQVltgAIKCUmAgggGQUJKRUFBWW2AAgZBQYCCCAZBQkZBQVltgYIIBYACCAVFhC7NgAIUBgmEKdVZbUGAgggFRYQvGYCCFAYJhCnVWW1BgQIIBUWEL2WBAhQGCYQqwVltQUFBQVltgAGEL64ODYQudVltgYIMBkFCSkVBQVltgAGAgggGQUJGQUFZbYABhDA+CYQtxVlthDBmBhWELfFZbk1BhDCSDYQuNVluAYABbg4EQFWEMVVeBUWEMPIiCYQvfVluXUGEMR4NhC/dWW5JQUGABgQGQUGEMKFZbUIWTUFBQUJKRUFBWW2AAYGCDAWAAgwFRYQx6YACGAYJhCnVWW1BgIIMBUYSCA2AghgFSYQySgoJhCxNWW5FQUGBAgwFRhIIDYECGAVJhDKyCgmEMBFZbkVBQgJFQUJKRUFBWW2AAYQzFg4NhDGJWW5BQkpFQUFZbYABgIIIBkFCRkFBWW2AAYQzlgmEKSVZbYQzvgYVhClRWW5NQg2AgggKFAWENAYVhCmVWW4BgAFuFgRAVYQ09V4SEA4lSgVFhDR6FgmEMuVZblFBhDSmDYQzNVluSUGAgigGZUFBgAYEBkFBhDQVWW1CCl1CHlVBQUFBQUJKRUFBWW2AAYCCCAZBQgYEDYACDAVJhDWmBhGEM2lZbkFCSkVBQVv6iZGlwZnNYIhIgGCkejwa/fjw3eKIOBorvRAKBhdKO1dKuczFDtYj3YWBkc29sY0MACBAAMyKAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAowJoMOgMY9wdKFgoUAAAAAAAAAAAAAAAAAAAAAAAAA/dyBwoDGPcHEAFSFgoJCgIYAhD/ssUNCgkKAhhiEICzxQ0="},{"b64Body":"Cg8KCQjkmNuqBhC6BhICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxjyBxoxKi8IARIrCiISIPuR6e2caeuRgI6GidAJDHmIx6eCmSee/rHKdKzM/xroCgVCAxj3Bw==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw3w+8u8ty5uEpnB97olYFGNdwKXiNfX2FSGve44PqakvNmEPO+uRPA+qWftkAf0srGgwIoJnbqgYQs+mKhQIiDwoJCOSY26oGELoGEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjlmNuqBhDABhICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxjzBxoxKi8IARIrCiISIPuR6e2caeuRgI6GidAJDHmIx6eCmSee/rHKdKzM/xroCgVCAxj3Bw==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwaV8UlEo2cQCnUU6mCGO+/6Fnc//F/DzWRodrISWQabk0V1nIh+PLlfIHCdZhg1ICGgsIoZnbqgYQm9noGCIPCgkI5ZjbqgYQwAYSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjlmNuqBhDCBhICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo468QIKAxj3BxCAkvQBIuQCDtBydgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=","b64Record":"CiUIFiIDGPcHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCqlOsCRe1Rm9McNNrg9qPdIoa17v6aiM8LQjaZnGiLdsegxMcKetg54ET/T59/GCQaDAihmduqBhDDzO+LAiIPCgkI5ZjbqgYQwgYSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCAmKtsOo0CCgMY9wcigAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKICowwFSGAoKCgIYAhD/r9bYAQoKCgIYYhCAsNbYAQ=="},{"b64Body":"ChEKCQjlmNuqBhDCBhICGAIgAXIVEhMKAxj1BxoMCgMY8gcSAxjzBxgB","b64Record":"CgIIFhIwnmluyXStKiVCpr0JPD6EUDINcr+Th9jbe7ctrXCTbS8x7ePCtPGUvEk2yY/7ZgvgGgwIoZnbqgYQxMzviwIiEQoJCOWY26oGEMIGEgIYAiABOpsDCgMY5wISIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWKIVuUNi77gFi5AIYmlVMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWoDGPcHUgBaEwoDGPUHGgwKAxjyBxIDGPMHGAF6DAihmduqBhDDzO+LAg=="}]},"NonNestedCryptoTransferForMultipleNonFungibleTokens":{"placeholderNum":1016,"encodedItems":[{"b64Body":"Cg8KCQjpmNuqBhDuBhICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloyCiISICjWXpx4yssVYs8Jaw8Wg3gkkJ5pf+NYs4071cYJXay1EIDQ28P0AkoFCIDO2gM=","b64Record":"CiUIFhIDGPkHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCjP6495xYhaTAp5PywKANEvoPeArqPIEHL25w+5tAjKUYB3KTqtW/4vBwxL3eONKwaDAilmduqBhDryJ7HAyIPCgkI6ZjbqgYQ7gYSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIbCgsKAhgCEP+ft4fpBQoMCgMY+QcQgKC3h+kF"},{"b64Body":"Cg8KCQjqmNuqBhDwBhICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloyCiISIMmEVVAX4QYRYLuVaLSVoo25BxnEg1H7sgXF7b/u7OCbEIDo7aG6AUoFCIDO2gM=","b64Record":"CiUIFhIDGPoHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAAUoLTuZI1z06YsBHa7Tp/AvQKDxE3DRUrskRT851BAN3YvO7KyNT3prrRd+9i7GoaDAimmduqBhCD+vPUASIPCgkI6pjbqgYQ8AYSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIbCgsKAhgCEP/P28P0AgoMCgMY+gcQgNDbw/QC"},{"b64Body":"Cg8KCQjqmNuqBhDyBhICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISIMAcX+r8kMxgwwp3dxKdAwZWX4b+0q77bUNdmtF4u2vyEICU69wDQAFKBQiAztoD","b64Record":"CiUIFhIDGPsHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCDI9+s7e3V4w37aF9L0lkHSCLU28ZHJEr8tMdXENOd70bc3vI9WpqnrX2nwPM4VPsaDAimmduqBhDDw77DAyIPCgkI6pjbqgYQ8gYSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxj7BxCAqNa5Bw=="},{"b64Body":"Cg8KCQjrmNuqBhD0BhICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISIEYhEL78KduCl/DAMMtsPTfWLOaSWpPn+W+tiyBGS9yaEICU69wDQAFKBQiAztoD","b64Record":"CiUIFhIDGPwHKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCAZwFlfkDozEm9izWIkAvS0OGDfEpyjiOCMUK8jsx5dLNqSpoSMzH9t4NzePYwAFsaDAinmduqBhCjkPTVASIPCgkI65jbqgYQ9AYSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxj8BxCAqNa5Bw=="},{"b64Body":"Cg8KCQjrmNuqBhD2BhICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIM7fgnq8lrPIw8XDJVo1cK4t02HWYig+xEnk7ZI29+ekEICU69wDSgUIgM7aAw==","b64Record":"CiUIFhIDGP0HKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDpQ3e6AAceQmBjyOHCDAOIwOvvk2uiT0O8TqxKi/iGijz3cqhX0Ctbud2z/WJMxGQaDAinmduqBhCj0vnGAyIPCgkI65jbqgYQ9gYSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxj9BxCAqNa5Bw=="},{"b64Body":"Cg8KCQjsmNuqBhD4BhICGAISAhgDGN6ApvsCIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAXMKCVRva2VuX05GVBIISVpVS1ZLWkkqAxj9BzIiEiD6hU5a77AqyrDVTaRFyHVLmBH83MpoCkVComUmNq2GVFIiEiD6hU5a77AqyrDVTaRFyHVLmBH83MpoCkVComUmNq2GVGoMCKjnta4GEJj8wNYBiAEB","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGP4HEjCyCBd0PS6faoms93rQuluQzWDIuyn0NZL0NqKebaUCMvOBIRvcPWILuVHVnY3DV1YaDAiomduqBhCT5tLcASIPCgkI7JjbqgYQ+AYSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAcgoKAxj+BxIDGP0H"},{"b64Body":"Cg8KCQjsmNuqBhD+BhICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGPkHEgMY/gc=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwp476cpC162tMLHN/ldS6okS+lXHuKgjJCAqUpAoAq4YW9VaDIgR5lkdngSL88lF5GgsIqZnbqgYQy5vdBSIPCgkI7JjbqgYQ/gYSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjtmNuqBhCEBxICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGPoHEgMY/gc=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw1yMbN8te95DTTUyPYMyqMrmF3jfPHqReR4R9cyLtzvgn4sF0Bik4PjQ93Pvla+LpGgwIqZnbqgYQ85XK8gEiDwoJCO2Y26oGEIQHEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjtmNuqBhCKBxICGAISAhgDGP2NkRAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjqoCHAoDGP4HGglmaXJzdE1lbW8aCnNlY29uZE1lbW8=","b64Record":"CiYIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1gCcgIBAhIwleM0D4x8WPq2p+AFrSNC9mO/0v9ygSaN5miOaSPwGwZB4yfNgjFRi1vH1pq42d/JGgsIqpnbqgYQ867xBCIPCgkI7ZjbqgYQigcSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWh8KAxj+BxoLCgIYABIDGP0HGAEaCwoCGAASAxj9BxgC"},{"b64Body":"Cg8KCQjumNuqBhCSBxICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGPsHEgMY/gc=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwc0IQRYb3JTa0/t3ENkmA1FGjqwvyiH3sSt6wAEn5eeM2LA/A8sQmhlTF71/j/8zoGgwIqpnbqgYQ45P49gEiDwoJCO6Y26oGEJIHEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjvmNuqBhCYBxICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGPwHEgMY/gc=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw0mcSlHoDUnfsHcvagkzrTOts8UcIHTEv2zQ89dGU9ZJyNz1v9CazsezgquOgbDIfGgsIq5nbqgYQ2+itIyIPCgkI75jbqgYQmAcSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"ChAKCQjvmNuqBhCaBxIDGPkHEgIYAxiNxjwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjnIVEhMKAxj+BxoMCgMY/QcSAxj5BxgB","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwks7O8lTrCoZufhccvvVUCEb1OsZuYXM+BNDgxyUmfaCB1Wv1oB5+5KV4RmNoNGukGgwIq5nbqgYQ++bijwIiEAoJCO+Y26oGEJoHEgMY+QcqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMI3GPFIqCggKAhgDEOLUBAoICgIYYhCM5WgKCQoDGKAGEKzSCwoJCgMY+QcQmYx5WhMKAxj+BxoMCgMY/QcSAxj5BxgB"},{"b64Body":"ChAKCQjwmNuqBhCcBxIDGPoHEgIYAxiNxjwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjnIVEhMKAxj+BxoMCgMY/QcSAxj6BxgC","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw3n8R8eVvtvEprKST0JFi4gI0zIX+XIFot9JwG754P+cAEbMgjMaBX8mKCykcMtK6GgsIrJnbqgYQw9foICIQCgkI8JjbqgYQnAcSAxj6Byogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo4wjcY8UioKCAoCGAMQ4tQECggKAhhiEIzlaAoJCgMYoAYQrNILCgkKAxj6BxCZjHlaEwoDGP4HGgwKAxj9BxIDGPoHGAI="},{"b64Body":"Cg8KCQjwmNuqBhCeBxICGAISAhgDGP7LzSwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjooBjwESDAis57WuBhCA/qOKAhptCiISIH92F2Q78VH8VRf8ThirCSrqCisnGtslJqzVd7In8CBpCiM6IQJfDa5+mEe1HgNXyQH6LdS8QdAFX6K5rIU8yndFrDkhowoiEiBGx0GeJnd98R1SD0ZZLzIa0eGgNfBMBLT6JDRaTZIYiSIMSGVsbG8gV29ybGQhKgAyAA==","b64Record":"CiUIFhoDGP8HKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAS5DIejM8lsoEjsyqalZGMiA2vcGj271BTI6eet6Yfb1+wIqVk05jxqUhF8u+QGW8aDAismduqBhCDk5GOAiIPCgkI8JjbqgYQngcSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjxmNuqBhCiBxICGAISAhgDGIudjj4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjpoBiCAKAxj/ByKAIDYwODA2MDQwNTIzNDgwMTU2MTAwMTA1NzYwMDA4MGZkNWI1MDYxMGRhNzgwNjEwMDIwNjAwMDM5NjAwMGYzZmU2MDgwNjA0MDUyMzQ4MDE1NjEwMDEwNTc2MDAwODBmZDViNTA2MDA0MzYxMDYxMDAzNjU3NjAwMDM1NjBlMDFjODA2MzBlZDA3Mjc2MTQ2MTAwM2I1NzgwNjM3YzQxYWQyYzE0NjEwMDU3NTc1YjYwMDA4MGZkNWI2MTAwNTU2MDA0ODAzNjAzODEwMTkwNjEwMDUwOTE5MDYxMDgwYTU2NWI2MTAwODc1NjViMDA1YjYxMDA3MTYwMDQ4MDM2MDM4MTAxOTA2MTAwNmM5MTkwNjEwODUzNTY1YjYxMDBkZTU2NWI2MDQwNTE2MTAwN2U5MTkwNjEwODk5NTY1YjYwNDA1MTgwOTEwMzkwZjM1YjYwMDA2MTAwOTI4MjYxMDFmMzU2NWI5MDUwNjAxNjYwMDMwYjgxMTQ2MTAwZGE1NzYwNDA1MTdmMDhjMzc5YTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgxNTI2MDA0MDE2MTAwZDE5MDYxMDkxMTU2NWI2MDQwNTE4MDkxMDM5MGZkNWI1MDUwNTY1YjYwMDA4MDYwMDA2MTAxNjc3M2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxNjYzN2M0MWFkMmM2MGUwMWI4NTYwNDA1MTYwMjQwMTYxMDExNTkxOTA2MTA5NDA1NjViNjA0MDUxNjAyMDgxODMwMzAzODE1MjkwNjA0MDUyOTA3YmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTkxNjYwMjA4MjAxODA1MTdiZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY4MzgxODMxNjE3ODM1MjUwNTA1MDUwNjA0MDUxNjEwMTdmOTE5MDYxMDljYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwMWJjNTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwMWMxNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTAxZDI1NzYwMTU2MTAxZTc1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTAxZTY5MTkwNjEwYTFjNTY1YjViNjAwMzBiOTI1MDUwNTA5MTkwNTA1NjViNjAwMDgwNjAwMDYxMDE2NzczZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE2NjMxODlhNTU0YzYwZTAxYjg1NjA0MDUxNjAyNDAxNjEwMjJhOTE5MDYxMGQ0ZjU2NWI2MDQwNTE2MDIwODE4MzAzMDM4MTUyOTA2MDQwNTI5MDdiZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxOTE2NjAyMDgyMDE4MDUxN2JmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjgzODE4MzE2MTc4MzUyNTA1MDUwNTA2MDQwNTE2MTAyOTQ5MTkwNjEwOWNjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTAyZDE1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTAyZDY1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA4MTYxMDJlNzU3NjAxNTYxMDJmYzU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDJmYjkxOTA2MTBhMWM1NjViNWI2MDAzMGI5MjUwNTA1MDkxOTA1MDU2NWI2MDAwNjA0MDUxOTA1MDkwNTY1YjYwMDA4MGZkNWI2MDAwODBmZDViNjAwMDgwZmQ1YjYwMDA2MDFmMTk2MDFmODMwMTE2OTA1MDkxOTA1MDU2NWI3ZjRlNDg3YjcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MDAwNTI2MDQxNjAwNDUyNjAyNDYwMDBmZDViNjEwMzZhODI2MTAzMjE1NjViODEwMTgxODExMDY3ZmZmZmZmZmZmZmZmZmZmZjgyMTExNzE1NjEwMzg5NTc2MTAzODg2MTAzMzI1NjViNWI4MDYwNDA1MjUwNTA1MDU2NWI2MDAwNjEwMzljNjEwMzA4NTY1YjkwNTA2MTAzYTg4MjgyNjEwMzYxNTY1YjkxOTA1MDU2NWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwM2M4NTc2MTAzYzc2MTAzMzI1NjViNWI2MDIwODIwMjkwNTA2MDIwODEwMTkwNTA5MTkwNTA1NjViNjAwMDgwZmQ1YjYwMDA4MGZkNWI2MDAwODBmZDViNjAwMDczZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjgyMTY5MDUwOTE5MDUwNTY1YjYwMDA2MTA0MTM4MjYxMDNlODU2NWI5MDUwOTE5MDUwNTY1YjYxMDQyMzgxNjEwNDA4NTY1YjgxMTQ2MTA0MmU1NzYwMDA4MGZkNWI1MDU2NWI2MDAwODEzNTkwNTA2MTA0NDA4MTYxMDQxYTU2NWI5MjkxNTA1MDU2NWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwNDYxNTc2MTA0NjA2MTAzMzI1NjViNWI2MDIwODIwMjkwNTA2MDIwODEwMTkwNTA5MTkwNTA1NjViNjAwMDgxNjAwNzBiOTA1MDkxOTA1MDU2NWI2MTA0ODg4MTYxMDQ3MjU2NWI4MTE0NjEwNDkzNTc2MDAwODBmZDViNTA1NjViNjAwMDgxMzU5MDUwNjEwNGE1ODE2MTA0N2Y1NjViOTI5MTUwNTA1NjViNjAwMDYwNDA4Mjg0MDMxMjE1NjEwNGMxNTc2MTA0YzA2MTAzZGU1NjViNWI2MTA0Y2I2MDQwNjEwMzkyNTY1YjkwNTA2MDAwNjEwNGRiODQ4Mjg1MDE2MTA0MzE1NjViNjAwMDgzMDE1MjUwNjAyMDYxMDRlZjg0ODI4NTAxNjEwNDk2NTY1YjYwMjA4MzAxNTI1MDkyOTE1MDUwNTY1YjYwMDA2MTA1MGU2MTA1MDk4NDYxMDQ0NjU2NWI2MTAzOTI1NjViOTA1MDgwODM4MjUyNjAyMDgyMDE5MDUwNjA0MDg0MDI4MzAxODU4MTExMTU2MTA1MzE1NzYxMDUzMDYxMDNkOTU2NWI1YjgzNWI4MTgxMTAxNTYxMDU1YTU3ODA2MTA1NDY4ODgyNjEwNGFiNTY1Yjg0NTI2MDIwODQwMTkzNTA1MDYwNDA4MTAxOTA1MDYxMDUzMzU2NWI1MDUwNTA5MzkyNTA1MDUwNTY1YjYwMDA4MjYwMWY4MzAxMTI2MTA1Nzk1NzYxMDU3ODYxMDMxYzU2NWI1YjgxMzU2MTA1ODk4NDgyNjAyMDg2MDE2MTA0ZmI1NjViOTE1MDUwOTI5MTUwNTA1NjViNjAwMDY3ZmZmZmZmZmZmZmZmZmZmZjgyMTExNTYxMDVhZDU3NjEwNWFjNjEwMzMyNTY1YjViNjAyMDgyMDI5MDUwNjAyMDgxMDE5MDUwOTE5MDUwNTY1YjYwMDA2MDYwODI4NDAzMTIxNTYxMDVkNDU3NjEwNWQzNjEwM2RlNTY1YjViNjEwNWRlNjA2MDYxMDM5MjU2NWI5MDUwNjAwMDYxMDVlZTg0ODI4NTAxNjEwNDMxNTY1YjYwMDA4MzAxNTI1MDYwMjA2MTA2MDI4NDgyODUwMTYxMDQzMTU2NWI2MDIwODMwMTUyNTA2MDQwNjEwNjE2ODQ4Mjg1MDE2MTA0OTY1NjViNjA0MDgzMDE1MjUwOTI5MTUwNTA1NjViNjAwMDYxMDYzNTYxMDYzMDg0NjEwNTkyNTY1YjYxMDM5MjU2NWI5MDUwODA4MzgyNTI2MDIwODIwMTkwNTA2MDYwODQwMjgzMDE4NTgxMTExNTYxMDY1ODU3NjEwNjU3NjEwM2Q5NTY1YjViODM1YjgxODExMDE1NjEwNjgxNTc4MDYxMDY2ZDg4ODI2MTA1YmU1NjViODQ1MjYwMjA4NDAxOTM1MDUwNjA2MDgxMDE5MDUwNjEwNjVhNTY1YjUwNTA1MDkzOTI1MDUwNTA1NjViNjAwMDgyNjAxZjgzMDExMjYxMDZhMDU3NjEwNjlmNjEwMzFjNTY1YjViODEzNTYxMDZiMDg0ODI2MDIwODYwMTYxMDYyMjU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwNjA2MDgyODQwMzEyMTU2MTA2Y2Y1NzYxMDZjZTYxMDNkZTU2NWI1YjYxMDZkOTYwNjA2MTAzOTI1NjViOTA1MDYwMDA2MTA2ZTk4NDgyODUwMTYxMDQzMTU2NWI2MDAwODMwMTUyNTA2MDIwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwNzBkNTc2MTA3MGM2MTAzZTM1NjViNWI2MTA3MTk4NDgyODUwMTYxMDU2NDU2NWI2MDIwODMwMTUyNTA2MDQwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwNzNkNTc2MTA3M2M2MTAzZTM1NjViNWI2MTA3NDk4NDgyODUwMTYxMDY4YjU2NWI2MDQwODMwMTUyNTA5MjkxNTA1MDU2NWI2MDAwNjEwNzY4NjEwNzYzODQ2MTAzYWQ1NjViNjEwMzkyNTY1YjkwNTA4MDgzODI1MjYwMjA4MjAxOTA1MDYwMjA4NDAyODMwMTg1ODExMTE1NjEwNzhiNTc2MTA3OGE2MTAzZDk1NjViNWI4MzViODE4MTEwMTU2MTA3ZDI1NzgwMzU2N2ZmZmZmZmZmZmZmZmZmZmY4MTExMTU2MTA3YjA1NzYxMDdhZjYxMDMxYzU2NWI1YjgwODYwMTYxMDdiZDg5ODI2MTA2Yjk1NjViODU1MjYwMjA4NTAxOTQ1MDUwNTA2MDIwODEwMTkwNTA2MTA3OGQ1NjViNTA1MDUwOTM5MjUwNTA1MDU2NWI2MDAwODI=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwoCmZN1BDsT4Hr3QPZwZfeShbQtctyFOgD0pY3FOQRQT/UjZTjeveNRp0cZMH1ogeGgsIrZnbqgYQk5eLOiIPCgkI8ZjbqgYQogcSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjxmNuqBhCoBxICGAISAhgDGKPY6zkiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBlhcSAxj/ByKOFzYwMWY4MzAxMTI2MTA3ZjE1NzYxMDdmMDYxMDMxYzU2NWI1YjgxMzU2MTA4MDE4NDgyNjAyMDg2MDE2MTA3NTU1NjViOTE1MDUwOTI5MTUwNTA1NjViNjAwMDYwMjA4Mjg0MDMxMjE1NjEwODIwNTc2MTA4MWY2MTAzMTI1NjViNWI2MDAwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwODNlNTc2MTA4M2Q2MTAzMTc1NjViNWI2MTA4NGE4NDgyODUwMTYxMDdkYzU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwNjAyMDgyODQwMzEyMTU2MTA4Njk1NzYxMDg2ODYxMDMxMjU2NWI1YjYwMDA2MTA4Nzc4NDgyODUwMTYxMDQzMTU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwODE5MDUwOTE5MDUwNTY1YjYxMDg5MzgxNjEwODgwNTY1YjgyNTI1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA2MTA4YWU2MDAwODMwMTg0NjEwODhhNTY1YjkyOTE1MDUwNTY1YjYwMDA4MjgyNTI2MDIwODIwMTkwNTA5MjkxNTA1MDU2NWI3ZjQzNzI3OTcwNzQ2ZjIwNTQ3MjYxNmU3MzY2NjU3MjIwNDY2MTY5NmM2NTY0MDAwMDAwMDAwMDAwMDAwMDAwMDA2MDAwODIwMTUyNTA1NjViNjAwMDYxMDhmYjYwMTY4MzYxMDhiNDU2NWI5MTUwNjEwOTA2ODI2MTA4YzU1NjViNjAyMDgyMDE5MDUwOTE5MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA4MTgxMDM2MDAwODMwMTUyNjEwOTJhODE2MTA4ZWU1NjViOTA1MDkxOTA1MDU2NWI2MTA5M2E4MTYxMDQwODU2NWI4MjUyNTA1MDU2NWI2MDAwNjAyMDgyMDE5MDUwNjEwOTU1NjAwMDgzMDE4NDYxMDkzMTU2NWI5MjkxNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgxOTA1MDkyOTE1MDUwNTY1YjYwMDA1YjgzODExMDE1NjEwOThmNTc4MDgyMDE1MTgxODQwMTUyNjAyMDgxMDE5MDUwNjEwOTc0NTY1YjYwMDA4NDg0MDE1MjUwNTA1MDUwNTY1YjYwMDA2MTA5YTY4MjYxMDk1YjU2NWI2MTA5YjA4MTg1NjEwOTY2NTY1YjkzNTA2MTA5YzA4MTg1NjAyMDg2MDE2MTA5NzE1NjViODA4NDAxOTE1MDUwOTI5MTUwNTA1NjViNjAwMDYxMDlkODgyODQ2MTA5OWI1NjViOTE1MDgxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTYwMDMwYjkwNTA5MTkwNTA1NjViNjEwOWY5ODE2MTA5ZTM1NjViODExNDYxMGEwNDU3NjAwMDgwZmQ1YjUwNTY1YjYwMDA4MTUxOTA1MDYxMGExNjgxNjEwOWYwNTY1YjkyOTE1MDUwNTY1YjYwMDA2MDIwODI4NDAzMTIxNTYxMGEzMjU3NjEwYTMxNjEwMzEyNTY1YjViNjAwMDYxMGE0MDg0ODI4NTAxNjEwYTA3NTY1YjkxNTA1MDkyOTE1MDUwNTY1YjYwMDA4MTUxOTA1MDkxOTA1MDU2NWI2MDAwODI4MjUyNjAyMDgyMDE5MDUwOTI5MTUwNTA1NjViNjAwMDgxOTA1MDYwMjA4MjAxOTA1MDkxOTA1MDU2NWI2MTBhN2U4MTYxMDQwODU2NWI4MjUyNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgyODI1MjYwMjA4MjAxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTkwNTA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjEwYWI5ODE2MTA0NzI1NjViODI1MjUwNTA1NjViNjA0MDgyMDE2MDAwODIwMTUxNjEwYWQ1NjAwMDg1MDE4MjYxMGE3NTU2NWI1MDYwMjA4MjAxNTE2MTBhZTg2MDIwODUwMTgyNjEwYWIwNTY1YjUwNTA1MDUwNTY1YjYwMDA2MTBhZmE4MzgzNjEwYWJmNTY1YjYwNDA4MzAxOTA1MDkyOTE1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjAwMDYxMGIxZTgyNjEwYTg0NTY1YjYxMGIyODgxODU2MTBhOGY1NjViOTM1MDYxMGIzMzgzNjEwYWEwNTY1YjgwNjAwMDViODM4MTEwMTU2MTBiNjQ1NzgxNTE2MTBiNGI4ODgyNjEwYWVlNTY1Yjk3NTA2MTBiNTY4MzYxMGIwNjU2NWI5MjUwNTA2MDAxODEwMTkwNTA2MTBiMzc1NjViNTA4NTkzNTA1MDUwNTA5MjkxNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgyODI1MjYwMjA4MjAxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTkwNTA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjA2MDgyMDE2MDAwODIwMTUxNjEwYmIzNjAwMDg1MDE4MjYxMGE3NTU2NWI1MDYwMjA4MjAxNTE2MTBiYzY2MDIwODUwMTgyNjEwYTc1NTY1YjUwNjA0MDgyMDE1MTYxMGJkOTYwNDA4NTAxODI2MTBhYjA1NjViNTA1MDUwNTA1NjViNjAwMDYxMGJlYjgzODM2MTBiOWQ1NjViNjA2MDgzMDE5MDUwOTI5MTUwNTA1NjViNjAwMDYwMjA4MjAxOTA1MDkxOTA1MDU2NWI2MDAwNjEwYzBmODI2MTBiNzE1NjViNjEwYzE5ODE4NTYxMGI3YzU2NWI5MzUwNjEwYzI0ODM2MTBiOGQ1NjViODA2MDAwNWI4MzgxMTAxNTYxMGM1NTU3ODE1MTYxMGMzYzg4ODI2MTBiZGY1NjViOTc1MDYxMGM0NzgzNjEwYmY3NTY1YjkyNTA1MDYwMDE4MTAxOTA1MDYxMGMyODU2NWI1MDg1OTM1MDUwNTA1MDkyOTE1MDUwNTY1YjYwMDA2MDYwODMwMTYwMDA4MzAxNTE2MTBjN2E2MDAwODYwMTgyNjEwYTc1NTY1YjUwNjAyMDgzMDE1MTg0ODIwMzYwMjA4NjAxNTI2MTBjOTI4MjgyNjEwYjEzNTY1YjkxNTA1MDYwNDA4MzAxNTE4NDgyMDM2MDQwODYwMTUyNjEwY2FjODI4MjYxMGMwNDU2NWI5MTUwNTA4MDkxNTA1MDkyOTE1MDUwNTY1YjYwMDA2MTBjYzU4MzgzNjEwYzYyNTY1YjkwNTA5MjkxNTA1MDU2NWI2MDAwNjAyMDgyMDE5MDUwOTE5MDUwNTY1YjYwMDA2MTBjZTU4MjYxMGE0OTU2NWI2MTBjZWY4MTg1NjEwYTU0NTY1YjkzNTA4MzYwMjA4MjAyODUwMTYxMGQwMTg1NjEwYTY1NTY1YjgwNjAwMDViODU4MTEwMTU2MTBkM2Q1Nzg0ODQwMzg5NTI4MTUxNjEwZDFlODU4MjYxMGNiOTU2NWI5NDUwNjEwZDI5ODM2MTBjY2Q1NjViOTI1MDYwMjA4YTAxOTk1MDUwNjAwMTgxMDE5MDUwNjEwZDA1NTY1YjUwODI5NzUwODc5NTUwNTA1MDUwNTA1MDkyOTE1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA4MTgxMDM2MDAwODMwMTUyNjEwZDY5ODE4NDYxMGNkYTU2NWI5MDUwOTI5MTUwNTA1NmZlYTI2NDY5NzA2NjczNTgyMjEyMjAxODI5MWU4ZjA2YmY3ZTNjMzc3OGEyMGUwNjhhZWY0NDAyODE4NWQyOGVkNWQyYWU3MzMxNDNiNTg4Zjc2MTYwNjQ3MzZmNmM2MzQzMDAwODEwMDAzMw==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw87owsL1a6s6JmcgXx8MnLgfRcIWi3Jc9azW/OeDeOLf9rFm+XyaTlT45vuFZUJyWGgwIrZnbqgYQ09WjrAIiDwoJCPGY26oGEKgHEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjymNuqBhCqBxICGAISAhgDGJb7rp0CIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5CRQoDGP8HGiISIAwhDfluy1b2Mv7sjK+RC0sVf7sPSWuUIE7Wv0nVpT5xIJChD0IFCIDO2gNSAFoAagtjZWxsYXIgZG9vcg==","b64Record":"CiUIFiIDGIAIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAOr7tIzbEu9cjCVUdkdjyNKjlcfd2okrHjbWbooI/OnVKZkRbo72/cYVHJRXpJyhgaCwiumduqBhDr1a87Ig8KCQjymNuqBhCqBxICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMMDZ4gZC3B0KAxiACBKnG2CAYEBSNIAVYQAQV2AAgP1bUGAENhBhADZXYAA1YOAcgGMO0HJ2FGEAO1eAY3xBrSwUYQBXV1tgAID9W2EAVWAEgDYDgQGQYQBQkZBhCApWW2EAh1ZbAFthAHFgBIA2A4EBkGEAbJGQYQhTVlthAN5WW2BAUWEAfpGQYQiZVltgQFGAkQOQ81tgAGEAkoJhAfNWW5BQYBZgAwuBFGEA2ldgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEA0ZBhCRFWW2BAUYCRA5D9W1BQVltgAIBgAGEBZ3P//////////////////////////xZjfEGtLGDgG4VgQFFgJAFhARWRkGEJQFZbYEBRYCCBgwMDgVKQYEBSkHv/////////////////////////////////////GRZgIIIBgFF7/////////////////////////////////////4OBgxYXg1JQUFBQYEBRYQF/kZBhCcxWW2AAYEBRgIMDgWAAhlrxkVBQPYBgAIEUYQG8V2BAUZFQYB8ZYD89ARaCAWBAUj2CUj1gAGAghAE+YQHBVltgYJFQW1CRUJFQgWEB0ldgFWEB51ZbgIBgIAGQUYEBkGEB5pGQYQocVltbYAMLklBQUJGQUFZbYACAYABhAWdz//////////////////////////8WYxiaVUxg4BuFYEBRYCQBYQIqkZBhDU9WW2BAUWAggYMDA4FSkGBAUpB7/////////////////////////////////////xkWYCCCAYBRe/////////////////////////////////////+DgYMWF4NSUFBQUGBAUWEClJGQYQnMVltgAGBAUYCDA4FgAIZa8ZFQUD2AYACBFGEC0VdgQFGRUGAfGWA/PQEWggFgQFI9glI9YABgIIQBPmEC1lZbYGCRUFtQkVCR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W2AAgWADC5BQkZBQVlthCfmBYQnjVluBFGEKBFdgAID9W1BWW2AAgVGQUGEKFoFhCfBWW5KRUFBWW2AAYCCChAMSFWEKMldhCjFhAxJWW1tgAGEKQISChQFhCgdWW5FQUJKRUFBWW2AAgVGQUJGQUFZbYACCglJgIIIBkFCSkVBQVltgAIGQUGAgggGQUJGQUFZbYQp+gWEECFZbglJQUFZbYACBUZBQkZBQVltgAIKCUmAgggGQUJKRUFBWW2AAgZBQYCCCAZBQkZBQVlthCrmBYQRyVluCUlBQVltgQIIBYACCAVFhCtVgAIUBgmEKdVZbUGAgggFRYQroYCCFAYJhCrBWW1BQUFBWW2AAYQr6g4NhCr9WW2BAgwGQUJKRUFBWW2AAYCCCAZBQkZBQVltgAGELHoJhCoRWW2ELKIGFYQqPVluTUGELM4NhCqBWW4BgAFuDgRAVYQtkV4FRYQtLiIJhCu5WW5dQYQtWg2ELBlZbklBQYAGBAZBQYQs3VltQhZNQUFBQkpFQUFZbYACBUZBQkZBQVltgAIKCUmAgggGQUJKRUFBWW2AAgZBQYCCCAZBQkZBQVltgYIIBYACCAVFhC7NgAIUBgmEKdVZbUGAgggFRYQvGYCCFAYJhCnVWW1BgQIIBUWEL2WBAhQGCYQqwVltQUFBQVltgAGEL64ODYQudVltgYIMBkFCSkVBQVltgAGAgggGQUJGQUFZbYABhDA+CYQtxVlthDBmBhWELfFZbk1BhDCSDYQuNVluAYABbg4EQFWEMVVeBUWEMPIiCYQvfVluXUGEMR4NhC/dWW5JQUGABgQGQUGEMKFZbUIWTUFBQUJKRUFBWW2AAYGCDAWAAgwFRYQx6YACGAYJhCnVWW1BgIIMBUYSCA2AghgFSYQySgoJhCxNWW5FQUGBAgwFRhIIDYECGAVJhDKyCgmEMBFZbkVBQgJFQUJKRUFBWW2AAYQzFg4NhDGJWW5BQkpFQUFZbYABgIIIBkFCRkFBWW2AAYQzlgmEKSVZbYQzvgYVhClRWW5NQg2AgggKFAWENAYVhCmVWW4BgAFuFgRAVYQ09V4SEA4lSgVFhDR6FgmEMuVZblFBhDSmDYQzNVluSUGAgigGZUFBgAYEBkFBhDQVWW1CCl1CHlVBQUFBQUJKRUFBWW2AAYCCCAZBQgYEDYACDAVJhDWmBhGEM2lZbkFCSkVBQVv6iZGlwZnNYIhIgGCkejwa/fjw3eKIOBorvRAKBhdKO1dKuczFDtYj3YWBkc29sY0MACBAAMyKAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAowJoMOgMYgAhKFgoUAAAAAAAAAAAAAAAAAAAAAAAABAByBwoDGIAIEAFSFgoJCgIYAhD/ssUNCgkKAhhiEICzxQ0="},{"b64Body":"Cg8KCQjymNuqBhCwBxICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxj5BxoxKi8IARIrCiISIAlTS1VGfrB/DmW2BKsytAPhZxlHy7/NxVFoO4pLuQBTCgVCAxiACA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwhFp5GYwSWCyp1j1pwbLNvbyqUnFmZx0mJ58Acwoh3aK6zvwQsatUQ2Izu23djbBoGgwIrpnbqgYQ8+O6wgIiDwoJCPKY26oGELAHEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjzmNuqBhC2BxICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxj6BxoxKi8IARIrCiISIAlTS1VGfrB/DmW2BKsytAPhZxlHy7/NxVFoO4pLuQBTCgVCAxiACA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwWm7zmfjrkJ1IGt/UJXRRt/4RCmXOSiq6Yj1SlxYHGe9n5b2VkfmR8C0iooFEKYWFGgsIr5nbqgYQ46m8UyIPCgkI85jbqgYQtgcSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjzmNuqBhC8BxICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxj7BxoxKi8IARIrCiISIAlTS1VGfrB/DmW2BKsytAPhZxlHy7/NxVFoO4pLuQBTCgVCAxiACA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwiXn2rNkFa21202WLxxzz/xYxy9g6ESBqJvzaHYUzqG1XT/kUx7fZ2Z0X6w9+GhfZGgwIr5nbqgYQs5vzvgIiDwoJCPOY26oGELwHEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQj0mNuqBhDCBxICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxj8BxoxKi8IARIrCiISIAlTS1VGfrB/DmW2BKsytAPhZxlHy7/NxVFoO4pLuQBTCgVCAxiACA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwpcadBvvQsVM1cjCiBdf2l7I8eW4vesPYSi0CYKBo66A17LSwQ8GOIlvGxxPgbEUrGgsIsJnbqgYQ8/SEZiIPCgkI9JjbqgYQwgcSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQj0mNuqBhDEBxICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo460QMKAxiACBCAkvQBIsQDDtBydgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI=","b64Record":"CiUIFiIDGIAIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDNqr7z5VFXor+IZ21kRt+8QvzjPsn9AiKxHuYAKm4mV/yJ4JGPcJklyUotqpsdwH8aDAiwmduqBhDrrt/TAiIPCgkI9JjbqgYQxAcSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCAmKtsOo0CCgMYgAgigAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKICowwFSGAoKCgIYAhD/r9bYAQoKCgIYYhCAsNbYAQ=="},{"b64Body":"ChEKCQj0mNuqBhDEBxICGAIgAXIjEiEKAxj+BxoMCgMY+QcSAxj7BxgBGgwKAxj6BxIDGPwHGAI=","b64Record":"CgIIFhIwOBtzQdIZ/BTBB0q+v46F8TQF3D6EsqLA/jt/BX/lY77UZyAn7qz1A/Qkno99Ny7WGgwIsJnbqgYQ7K7f0wIiEQoJCPSY26oGEMQHEgIYAiABOvwDCgMY5wISIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWKIrcAVD7rO4BYsQDGJpVTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqAxiACFIAWiEKAxj+BxoMCgMY+QcSAxj7BxgBGgwKAxj6BxIDGPwHGAJ6DAiwmduqBhDrrt/TAg=="}]},"NonNestedCryptoTransferForFungibleAndNonFungibleToken":{"placeholderNum":1025,"encodedItems":[{"b64Body":"Cg8KCQj5mNuqBhD4BxICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloyCiISIOM47Mv0mPIRN5hNh4hCEh5E05trxnlKEkIm307tJs/PEIDQ28P0AkoFCIDO2gM=","b64Record":"CiUIFhIDGIIIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDVQWkoe168Fm05F5PHmgl/s9OqNhpyM0OwOWBsQvkzGAfXPg/rcf1RTpAPdG8A4vIaCwi1mduqBhDzkKEiIg8KCQj5mNuqBhD4BxICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUhsKCwoCGAIQ/5+3h+kFCgwKAxiCCBCAoLeH6QU="},{"b64Body":"Cg8KCQj5mNuqBhD6BxICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISIP8cDAh4XHbnhg0tcutaPcwH37cvhpkLhzeQpXB8OfjIEICU69wDQAFKBQiAztoD","b64Record":"CiUIFhIDGIMIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjA8FdLjZ8QJ4SrUalAvU//V2qs4O3Y4vgGrTc8fZmpkylopMJb56ggqoea0dWTH4UoaDAi1mduqBhCj/JOTAiIPCgkI+ZjbqgYQ+gcSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxiDCBCAqNa5Bw=="},{"b64Body":"Cg8KCQj6mNuqBhD8BxICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloyCiISIDyexg7rH5ZK64GmzksIwCkQB0xq1n8sqf+qx6Hcds3eEIDo7aG6AUoFCIDO2gM=","b64Record":"CiUIFhIDGIQIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjC3+MXQCxVbtoqndEXAIbo3WcRccGo/X8WEw/8a1mCH5C0c4vEswkUufctRW89BhnQaCwi2mduqBhCjss8pIg8KCQj6mNuqBhD8BxICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUhsKCwoCGAIQ/8/bw/QCCgwKAxiECBCA0NvD9AI="},{"b64Body":"Cg8KCQj6mNuqBhD+BxICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISIJU9vtMRl/q4HPEgF8ODrwym3NZg3XxFQsqzvvq0MgXcEICU69wDQAFKBQiAztoD","b64Record":"CiUIFhIDGIUIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjD4rLDUlRVNUTJuI8+LImzQacfQZxclsem8vl1BsBvTk2eaFLJVRfQ7DkHDZhid1BMaDAi2mduqBhDj/9+cAiIPCgkI+pjbqgYQ/gcSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxiFCBCAqNa5Bw=="},{"b64Body":"Cg8KCQj7mNuqBhCACBICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIFVYQ9aBbmsZk43uUHeFCZRtkcDbrMq8Gp27PfnJvrJkEICU69wDSgUIgM7aAw==","b64Record":"CiUIFhIDGIYIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjATCEKObudZIIxNkYoKOH9J4WHs+VMDnbI92xbrjO1nxY0QESdXPuDXH5yWTVlX+qIaCwi3mduqBhDDzdwzIg8KCQj7mNuqBhCACBICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUhkKCgoCGAIQ/6fWuQcKCwoDGIYIEICo1rkH"},{"b64Body":"Cg8KCQj7mNuqBhCCCBICGAISAhgDGKWr3ugCIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qASgKBlRva2VuQRIISkNRV1RQT1Ag6AcqAxiGCGoMCLfnta4GENCWiZIC","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGIcIEjCrNRVjQvhStedOfC9ODhu2z9cAtIWWJK10cQa0NC3Tb/nKuIbp1gL3o+7BaXSskAEaDAi3mduqBhDLmcWjAiIPCgkI+5jbqgYQgggSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWg8KAxiHCBIICgMYhggQ0A9yCgoDGIcIEgMYhgg="},{"b64Body":"Cg8KCQj8mNuqBhCECBICGAISAhgDGN6ApvsCIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAXIKCVRva2VuX05GVBIIUEhBVUhYRlkqAxiGCDIiEiDGqotp0O0ue9lk+qFJwSKJOXbhwwwAlGTEDOQZ8X/XVlIiEiDGqotp0O0ue9lk+qFJwSKJOXbhwwwAlGTEDOQZ8X/XVmoLCLjnta4GEMiz7CeIAQE=","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGIgIEjBLS+os1yoSJqWR0XG/nmGZvjBN0SXdhuzK157YGZS+kXlcQV17lDn6dPhv8QYoW40aCwi4mduqBhDDtPw5Ig8KCQj8mNuqBhCECBICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUgByCgoDGIgIEgMYhgg="},{"b64Body":"Cg8KCQj8mNuqBhCKCBICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGIIIEgMYhwg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw/9r1EUM/Gw5rnLzjyOgMNivKCQybSvCYNmuKUGOH0yHosegvdBiwi6clmB5ZidViGgwIuJnbqgYQ07uOqAIiDwoJCPyY26oGEIoIEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQj9mNuqBhCQCBICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGIQIEgMYiAg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwzdawMPkbVDYjqhiX9Y6gRvj59NpbeaBgLJfHtZyvCE2sWI5SbbH8LCU6C1anWkIbGgsIuZnbqgYQ+7n/OiIPCgkI/ZjbqgYQkAgSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQj9mNuqBhCWCBICGAISAhgDGP2NkRAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjqoCHAoDGIgIGglmaXJzdE1lbW8aCnNlY29uZE1lbW8=","b64Record":"CiYIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1gCcgIBAhIw/9G/S0qZVNFQxrL06VA7t5izv4uZSICxX5UBzyR2ZQvrHEoAjkqA/rpeqZmAwk0QGgwIuZnbqgYQs+7sxQIiDwoJCP2Y26oGEJYIEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFofCgMYiAgaCwoCGAASAxiGCBgBGgsKAhgAEgMYhggYAg=="},{"b64Body":"Cg8KCQj+mNuqBhCeCBICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGIMIEgMYhwg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw4XnOkMq6pgUAAyfJM8zX2fF4XKsro69prSPUa5FCmYvi1XI5yZmi3jaHnkdmhWYbGgsIupnbqgYQk5DaWCIPCgkI/pjbqgYQnggSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQj+mNuqBhCkCBICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGIUIEgMYiAg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwBI/9wbseFxRTC3RGcQMxk30bzooN87DhHtPRbEyxmvIvXf6EyLsf//sLbGTurVIZGgwIupnbqgYQ883fxgIiDwoJCP6Y26oGEKQIEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"ChAKCQj/mNuqBhCmCBIDGIIIEgIYAxjrnzYiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjnIbEhkKAxiHCBIICgMYhggQjwMSCAoDGIIIEJAD","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwP3QchBFViQ9JoVI0dnkplHDicY3vfOmyDroWIkIJEOUtQONzuINyvAYsq62rMULeGgsIu5nbqgYQi7DmWiIQCgkI/5jbqgYQpggSAxiCCCogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo4w6582UioKCAoCGAMQ8OMECggKAhhiEJysXQoJCgMYoAYQyq8KCgkKAxiCCBDVv2xaGQoDGIcIEggKAxiCCBCQAxIICgMYhggQjwM="},{"b64Body":"ChAKCQj/mNuqBhCoCBIDGIQIEgIYAxiNxjwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjnIVEhMKAxiICBoMCgMYhggSAxiECBgB","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwGLq5Jjbg3IYfPgAwjoN6NV/P4FMWEOfaUHTY7BR7wMn8ybr0uqa036a+B0gp6CLqGgwIu5nbqgYQu7KHyAIiEAoJCP+Y26oGEKgIEgMYhAgqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMI3GPFIqCggKAhgDEOLUBAoICgIYYhCM5WgKCQoDGKAGEKzSCwoJCgMYhAgQmYx5WhMKAxiICBoMCgMYhggSAxiECBgB"},{"b64Body":"Cg8KCQiAmduqBhCqCBICGAISAhgDGP7LzSwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjooBjgESCwi857WuBhDohopeGm0KIhIgvjyYNTZX8LL36PVcCtxjr2YyTdoM2DeVIeCmo7XkdAUKIzohAt78dNbP+zAsSdtedpWRdIfmEAfi6FmU/a7k9xLgULjCCiISIJURnLiCoTp0ktvJjid8Lr7cbVxqVcmIM7RVV2dDhVY8IgxIZWxsbyBXb3JsZCEqADIA","b64Record":"CiUIFhoDGIkIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjA34ai5zku/rc7/oNBupKKyWgxdpMFNlx+2R7iDS9fdSuplBHYfveGH2++u1zkKRAQaCwi8mduqBhDT3KV2Ig8KCQiAmduqBhCqCBICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUgA="},{"b64Body":"Cg8KCQiAmduqBhCuCBICGAISAhgDGIydjj4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjpoBiCAKAxiJCCKAIDYwODA2MDQwNTIzNDgwMTU2MTAwMTA1NzYwMDA4MGZkNWI1MDYxMGRhNzgwNjEwMDIwNjAwMDM5NjAwMGYzZmU2MDgwNjA0MDUyMzQ4MDE1NjEwMDEwNTc2MDAwODBmZDViNTA2MDA0MzYxMDYxMDAzNjU3NjAwMDM1NjBlMDFjODA2MzBlZDA3Mjc2MTQ2MTAwM2I1NzgwNjM3YzQxYWQyYzE0NjEwMDU3NTc1YjYwMDA4MGZkNWI2MTAwNTU2MDA0ODAzNjAzODEwMTkwNjEwMDUwOTE5MDYxMDgwYTU2NWI2MTAwODc1NjViMDA1YjYxMDA3MTYwMDQ4MDM2MDM4MTAxOTA2MTAwNmM5MTkwNjEwODUzNTY1YjYxMDBkZTU2NWI2MDQwNTE2MTAwN2U5MTkwNjEwODk5NTY1YjYwNDA1MTgwOTEwMzkwZjM1YjYwMDA2MTAwOTI4MjYxMDFmMzU2NWI5MDUwNjAxNjYwMDMwYjgxMTQ2MTAwZGE1NzYwNDA1MTdmMDhjMzc5YTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgxNTI2MDA0MDE2MTAwZDE5MDYxMDkxMTU2NWI2MDQwNTE4MDkxMDM5MGZkNWI1MDUwNTY1YjYwMDA4MDYwMDA2MTAxNjc3M2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxNjYzN2M0MWFkMmM2MGUwMWI4NTYwNDA1MTYwMjQwMTYxMDExNTkxOTA2MTA5NDA1NjViNjA0MDUxNjAyMDgxODMwMzAzODE1MjkwNjA0MDUyOTA3YmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTkxNjYwMjA4MjAxODA1MTdiZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY4MzgxODMxNjE3ODM1MjUwNTA1MDUwNjA0MDUxNjEwMTdmOTE5MDYxMDljYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwMWJjNTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwMWMxNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTAxZDI1NzYwMTU2MTAxZTc1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTAxZTY5MTkwNjEwYTFjNTY1YjViNjAwMzBiOTI1MDUwNTA5MTkwNTA1NjViNjAwMDgwNjAwMDYxMDE2NzczZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE2NjMxODlhNTU0YzYwZTAxYjg1NjA0MDUxNjAyNDAxNjEwMjJhOTE5MDYxMGQ0ZjU2NWI2MDQwNTE2MDIwODE4MzAzMDM4MTUyOTA2MDQwNTI5MDdiZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxOTE2NjAyMDgyMDE4MDUxN2JmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjgzODE4MzE2MTc4MzUyNTA1MDUwNTA2MDQwNTE2MTAyOTQ5MTkwNjEwOWNjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTAyZDE1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTAyZDY1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA4MTYxMDJlNzU3NjAxNTYxMDJmYzU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDJmYjkxOTA2MTBhMWM1NjViNWI2MDAzMGI5MjUwNTA1MDkxOTA1MDU2NWI2MDAwNjA0MDUxOTA1MDkwNTY1YjYwMDA4MGZkNWI2MDAwODBmZDViNjAwMDgwZmQ1YjYwMDA2MDFmMTk2MDFmODMwMTE2OTA1MDkxOTA1MDU2NWI3ZjRlNDg3YjcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MDAwNTI2MDQxNjAwNDUyNjAyNDYwMDBmZDViNjEwMzZhODI2MTAzMjE1NjViODEwMTgxODExMDY3ZmZmZmZmZmZmZmZmZmZmZjgyMTExNzE1NjEwMzg5NTc2MTAzODg2MTAzMzI1NjViNWI4MDYwNDA1MjUwNTA1MDU2NWI2MDAwNjEwMzljNjEwMzA4NTY1YjkwNTA2MTAzYTg4MjgyNjEwMzYxNTY1YjkxOTA1MDU2NWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwM2M4NTc2MTAzYzc2MTAzMzI1NjViNWI2MDIwODIwMjkwNTA2MDIwODEwMTkwNTA5MTkwNTA1NjViNjAwMDgwZmQ1YjYwMDA4MGZkNWI2MDAwODBmZDViNjAwMDczZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjgyMTY5MDUwOTE5MDUwNTY1YjYwMDA2MTA0MTM4MjYxMDNlODU2NWI5MDUwOTE5MDUwNTY1YjYxMDQyMzgxNjEwNDA4NTY1YjgxMTQ2MTA0MmU1NzYwMDA4MGZkNWI1MDU2NWI2MDAwODEzNTkwNTA2MTA0NDA4MTYxMDQxYTU2NWI5MjkxNTA1MDU2NWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwNDYxNTc2MTA0NjA2MTAzMzI1NjViNWI2MDIwODIwMjkwNTA2MDIwODEwMTkwNTA5MTkwNTA1NjViNjAwMDgxNjAwNzBiOTA1MDkxOTA1MDU2NWI2MTA0ODg4MTYxMDQ3MjU2NWI4MTE0NjEwNDkzNTc2MDAwODBmZDViNTA1NjViNjAwMDgxMzU5MDUwNjEwNGE1ODE2MTA0N2Y1NjViOTI5MTUwNTA1NjViNjAwMDYwNDA4Mjg0MDMxMjE1NjEwNGMxNTc2MTA0YzA2MTAzZGU1NjViNWI2MTA0Y2I2MDQwNjEwMzkyNTY1YjkwNTA2MDAwNjEwNGRiODQ4Mjg1MDE2MTA0MzE1NjViNjAwMDgzMDE1MjUwNjAyMDYxMDRlZjg0ODI4NTAxNjEwNDk2NTY1YjYwMjA4MzAxNTI1MDkyOTE1MDUwNTY1YjYwMDA2MTA1MGU2MTA1MDk4NDYxMDQ0NjU2NWI2MTAzOTI1NjViOTA1MDgwODM4MjUyNjAyMDgyMDE5MDUwNjA0MDg0MDI4MzAxODU4MTExMTU2MTA1MzE1NzYxMDUzMDYxMDNkOTU2NWI1YjgzNWI4MTgxMTAxNTYxMDU1YTU3ODA2MTA1NDY4ODgyNjEwNGFiNTY1Yjg0NTI2MDIwODQwMTkzNTA1MDYwNDA4MTAxOTA1MDYxMDUzMzU2NWI1MDUwNTA5MzkyNTA1MDUwNTY1YjYwMDA4MjYwMWY4MzAxMTI2MTA1Nzk1NzYxMDU3ODYxMDMxYzU2NWI1YjgxMzU2MTA1ODk4NDgyNjAyMDg2MDE2MTA0ZmI1NjViOTE1MDUwOTI5MTUwNTA1NjViNjAwMDY3ZmZmZmZmZmZmZmZmZmZmZjgyMTExNTYxMDVhZDU3NjEwNWFjNjEwMzMyNTY1YjViNjAyMDgyMDI5MDUwNjAyMDgxMDE5MDUwOTE5MDUwNTY1YjYwMDA2MDYwODI4NDAzMTIxNTYxMDVkNDU3NjEwNWQzNjEwM2RlNTY1YjViNjEwNWRlNjA2MDYxMDM5MjU2NWI5MDUwNjAwMDYxMDVlZTg0ODI4NTAxNjEwNDMxNTY1YjYwMDA4MzAxNTI1MDYwMjA2MTA2MDI4NDgyODUwMTYxMDQzMTU2NWI2MDIwODMwMTUyNTA2MDQwNjEwNjE2ODQ4Mjg1MDE2MTA0OTY1NjViNjA0MDgzMDE1MjUwOTI5MTUwNTA1NjViNjAwMDYxMDYzNTYxMDYzMDg0NjEwNTkyNTY1YjYxMDM5MjU2NWI5MDUwODA4MzgyNTI2MDIwODIwMTkwNTA2MDYwODQwMjgzMDE4NTgxMTExNTYxMDY1ODU3NjEwNjU3NjEwM2Q5NTY1YjViODM1YjgxODExMDE1NjEwNjgxNTc4MDYxMDY2ZDg4ODI2MTA1YmU1NjViODQ1MjYwMjA4NDAxOTM1MDUwNjA2MDgxMDE5MDUwNjEwNjVhNTY1YjUwNTA1MDkzOTI1MDUwNTA1NjViNjAwMDgyNjAxZjgzMDExMjYxMDZhMDU3NjEwNjlmNjEwMzFjNTY1YjViODEzNTYxMDZiMDg0ODI2MDIwODYwMTYxMDYyMjU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwNjA2MDgyODQwMzEyMTU2MTA2Y2Y1NzYxMDZjZTYxMDNkZTU2NWI1YjYxMDZkOTYwNjA2MTAzOTI1NjViOTA1MDYwMDA2MTA2ZTk4NDgyODUwMTYxMDQzMTU2NWI2MDAwODMwMTUyNTA2MDIwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwNzBkNTc2MTA3MGM2MTAzZTM1NjViNWI2MTA3MTk4NDgyODUwMTYxMDU2NDU2NWI2MDIwODMwMTUyNTA2MDQwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwNzNkNTc2MTA3M2M2MTAzZTM1NjViNWI2MTA3NDk4NDgyODUwMTYxMDY4YjU2NWI2MDQwODMwMTUyNTA5MjkxNTA1MDU2NWI2MDAwNjEwNzY4NjEwNzYzODQ2MTAzYWQ1NjViNjEwMzkyNTY1YjkwNTA4MDgzODI1MjYwMjA4MjAxOTA1MDYwMjA4NDAyODMwMTg1ODExMTE1NjEwNzhiNTc2MTA3OGE2MTAzZDk1NjViNWI4MzViODE4MTEwMTU2MTA3ZDI1NzgwMzU2N2ZmZmZmZmZmZmZmZmZmZmY4MTExMTU2MTA3YjA1NzYxMDdhZjYxMDMxYzU2NWI1YjgwODYwMTYxMDdiZDg5ODI2MTA2Yjk1NjViODU1MjYwMjA4NTAxOTQ1MDUwNTA2MDIwODEwMTkwNTA2MTA3OGQ1NjViNTA1MDUwOTM5MjUwNTA1MDU2NWI2MDAwODI=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwOoB18ge+vPeMylxIX9qsoyGmxtMTNFitatsOvDhmcNaKZ5QEFdFaUPz2cx65qvLBGgwIvJnbqgYQw8Gg7AIiDwoJCICZ26oGEK4IEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiBmduqBhC0CBICGAISAhgDGKPY6zkiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBlhcSAxiJCCKOFzYwMWY4MzAxMTI2MTA3ZjE1NzYxMDdmMDYxMDMxYzU2NWI1YjgxMzU2MTA4MDE4NDgyNjAyMDg2MDE2MTA3NTU1NjViOTE1MDUwOTI5MTUwNTA1NjViNjAwMDYwMjA4Mjg0MDMxMjE1NjEwODIwNTc2MTA4MWY2MTAzMTI1NjViNWI2MDAwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwODNlNTc2MTA4M2Q2MTAzMTc1NjViNWI2MTA4NGE4NDgyODUwMTYxMDdkYzU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwNjAyMDgyODQwMzEyMTU2MTA4Njk1NzYxMDg2ODYxMDMxMjU2NWI1YjYwMDA2MTA4Nzc4NDgyODUwMTYxMDQzMTU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwODE5MDUwOTE5MDUwNTY1YjYxMDg5MzgxNjEwODgwNTY1YjgyNTI1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA2MTA4YWU2MDAwODMwMTg0NjEwODhhNTY1YjkyOTE1MDUwNTY1YjYwMDA4MjgyNTI2MDIwODIwMTkwNTA5MjkxNTA1MDU2NWI3ZjQzNzI3OTcwNzQ2ZjIwNTQ3MjYxNmU3MzY2NjU3MjIwNDY2MTY5NmM2NTY0MDAwMDAwMDAwMDAwMDAwMDAwMDA2MDAwODIwMTUyNTA1NjViNjAwMDYxMDhmYjYwMTY4MzYxMDhiNDU2NWI5MTUwNjEwOTA2ODI2MTA4YzU1NjViNjAyMDgyMDE5MDUwOTE5MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA4MTgxMDM2MDAwODMwMTUyNjEwOTJhODE2MTA4ZWU1NjViOTA1MDkxOTA1MDU2NWI2MTA5M2E4MTYxMDQwODU2NWI4MjUyNTA1MDU2NWI2MDAwNjAyMDgyMDE5MDUwNjEwOTU1NjAwMDgzMDE4NDYxMDkzMTU2NWI5MjkxNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgxOTA1MDkyOTE1MDUwNTY1YjYwMDA1YjgzODExMDE1NjEwOThmNTc4MDgyMDE1MTgxODQwMTUyNjAyMDgxMDE5MDUwNjEwOTc0NTY1YjYwMDA4NDg0MDE1MjUwNTA1MDUwNTY1YjYwMDA2MTA5YTY4MjYxMDk1YjU2NWI2MTA5YjA4MTg1NjEwOTY2NTY1YjkzNTA2MTA5YzA4MTg1NjAyMDg2MDE2MTA5NzE1NjViODA4NDAxOTE1MDUwOTI5MTUwNTA1NjViNjAwMDYxMDlkODgyODQ2MTA5OWI1NjViOTE1MDgxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTYwMDMwYjkwNTA5MTkwNTA1NjViNjEwOWY5ODE2MTA5ZTM1NjViODExNDYxMGEwNDU3NjAwMDgwZmQ1YjUwNTY1YjYwMDA4MTUxOTA1MDYxMGExNjgxNjEwOWYwNTY1YjkyOTE1MDUwNTY1YjYwMDA2MDIwODI4NDAzMTIxNTYxMGEzMjU3NjEwYTMxNjEwMzEyNTY1YjViNjAwMDYxMGE0MDg0ODI4NTAxNjEwYTA3NTY1YjkxNTA1MDkyOTE1MDUwNTY1YjYwMDA4MTUxOTA1MDkxOTA1MDU2NWI2MDAwODI4MjUyNjAyMDgyMDE5MDUwOTI5MTUwNTA1NjViNjAwMDgxOTA1MDYwMjA4MjAxOTA1MDkxOTA1MDU2NWI2MTBhN2U4MTYxMDQwODU2NWI4MjUyNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgyODI1MjYwMjA4MjAxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTkwNTA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjEwYWI5ODE2MTA0NzI1NjViODI1MjUwNTA1NjViNjA0MDgyMDE2MDAwODIwMTUxNjEwYWQ1NjAwMDg1MDE4MjYxMGE3NTU2NWI1MDYwMjA4MjAxNTE2MTBhZTg2MDIwODUwMTgyNjEwYWIwNTY1YjUwNTA1MDUwNTY1YjYwMDA2MTBhZmE4MzgzNjEwYWJmNTY1YjYwNDA4MzAxOTA1MDkyOTE1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjAwMDYxMGIxZTgyNjEwYTg0NTY1YjYxMGIyODgxODU2MTBhOGY1NjViOTM1MDYxMGIzMzgzNjEwYWEwNTY1YjgwNjAwMDViODM4MTEwMTU2MTBiNjQ1NzgxNTE2MTBiNGI4ODgyNjEwYWVlNTY1Yjk3NTA2MTBiNTY4MzYxMGIwNjU2NWI5MjUwNTA2MDAxODEwMTkwNTA2MTBiMzc1NjViNTA4NTkzNTA1MDUwNTA5MjkxNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgyODI1MjYwMjA4MjAxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTkwNTA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjA2MDgyMDE2MDAwODIwMTUxNjEwYmIzNjAwMDg1MDE4MjYxMGE3NTU2NWI1MDYwMjA4MjAxNTE2MTBiYzY2MDIwODUwMTgyNjEwYTc1NTY1YjUwNjA0MDgyMDE1MTYxMGJkOTYwNDA4NTAxODI2MTBhYjA1NjViNTA1MDUwNTA1NjViNjAwMDYxMGJlYjgzODM2MTBiOWQ1NjViNjA2MDgzMDE5MDUwOTI5MTUwNTA1NjViNjAwMDYwMjA4MjAxOTA1MDkxOTA1MDU2NWI2MDAwNjEwYzBmODI2MTBiNzE1NjViNjEwYzE5ODE4NTYxMGI3YzU2NWI5MzUwNjEwYzI0ODM2MTBiOGQ1NjViODA2MDAwNWI4MzgxMTAxNTYxMGM1NTU3ODE1MTYxMGMzYzg4ODI2MTBiZGY1NjViOTc1MDYxMGM0NzgzNjEwYmY3NTY1YjkyNTA1MDYwMDE4MTAxOTA1MDYxMGMyODU2NWI1MDg1OTM1MDUwNTA1MDkyOTE1MDUwNTY1YjYwMDA2MDYwODMwMTYwMDA4MzAxNTE2MTBjN2E2MDAwODYwMTgyNjEwYTc1NTY1YjUwNjAyMDgzMDE1MTg0ODIwMzYwMjA4NjAxNTI2MTBjOTI4MjgyNjEwYjEzNTY1YjkxNTA1MDYwNDA4MzAxNTE4NDgyMDM2MDQwODYwMTUyNjEwY2FjODI4MjYxMGMwNDU2NWI5MTUwNTA4MDkxNTA1MDkyOTE1MDUwNTY1YjYwMDA2MTBjYzU4MzgzNjEwYzYyNTY1YjkwNTA5MjkxNTA1MDU2NWI2MDAwNjAyMDgyMDE5MDUwOTE5MDUwNTY1YjYwMDA2MTBjZTU4MjYxMGE0OTU2NWI2MTBjZWY4MTg1NjEwYTU0NTY1YjkzNTA4MzYwMjA4MjAyODUwMTYxMGQwMTg1NjEwYTY1NTY1YjgwNjAwMDViODU4MTEwMTU2MTBkM2Q1Nzg0ODQwMzg5NTI4MTUxNjEwZDFlODU4MjYxMGNiOTU2NWI5NDUwNjEwZDI5ODM2MTBjY2Q1NjViOTI1MDYwMjA4YTAxOTk1MDUwNjAwMTgxMDE5MDUwNjEwZDA1NTY1YjUwODI5NzUwODc5NTUwNTA1MDUwNTA1MDkyOTE1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA4MTgxMDM2MDAwODMwMTUyNjEwZDY5ODE4NDYxMGNkYTU2NWI5MDUwOTI5MTUwNTA1NmZlYTI2NDY5NzA2NjczNTgyMjEyMjAxODI5MWU4ZjA2YmY3ZTNjMzc3OGEyMGUwNjhhZWY0NDAyODE4NWQyOGVkNWQyYWU3MzMxNDNiNTg4Zjc2MTYwNjQ3MzZmNmM2MzQzMDAwODEwMDAzMw==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwkSO9foZkZmi4bfvghRFORsEeh0PHBrYdHAvvO4Y91Upko/DOJrhd86CKlHK/CZfSGgwIvZnbqgYQu/HNgwEiDwoJCIGZ26oGELQIEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiBmduqBhC2CBICGAISAhgDGJb7rp0CIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5CRQoDGIkIGiISIEFUQIIYPVRCGBD3l7a+S0321tY+0XYSNh+wF3xmajq0IJChD0IFCIDO2gNSAFoAagtjZWxsYXIgZG9vcg==","b64Record":"CiUIFiIDGIoIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjC9bbChJ6lRKd9F18w1vA96FCLCCWpSzd0ElQMWCY0TzCsp6isHA/Cnk7mzhCi/HiIaDAi9mduqBhDL7Z76AiIPCgkIgZnbqgYQtggSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjDA2eIGQtwdCgMYiggSpxtggGBAUjSAFWEAEFdgAID9W1BgBDYQYQA2V2AANWDgHIBjDtBydhRhADtXgGN8Qa0sFGEAV1dbYACA/VthAFVgBIA2A4EBkGEAUJGQYQgKVlthAIdWWwBbYQBxYASANgOBAZBhAGyRkGEIU1ZbYQDeVltgQFFhAH6RkGEImVZbYEBRgJEDkPNbYABhAJKCYQHzVluQUGAWYAMLgRRhANpXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhANGQYQkRVltgQFGAkQOQ/VtQUFZbYACAYABhAWdz//////////////////////////8WY3xBrSxg4BuFYEBRYCQBYQEVkZBhCUBWW2BAUWAggYMDA4FSkGBAUpB7/////////////////////////////////////xkWYCCCAYBRe/////////////////////////////////////+DgYMWF4NSUFBQUGBAUWEBf5GQYQnMVltgAGBAUYCDA4FgAIZa8ZFQUD2AYACBFGEBvFdgQFGRUGAfGWA/PQEWggFgQFI9glI9YABgIIQBPmEBwVZbYGCRUFtQkVCRUIFhAdJXYBVhAedWW4CAYCABkFGBAZBhAeaRkGEKHFZbW2ADC5JQUFCRkFBWW2AAgGAAYQFnc///////////////////////////FmMYmlVMYOAbhWBAUWAkAWECKpGQYQ1PVltgQFFgIIGDAwOBUpBgQFKQe/////////////////////////////////////8ZFmAgggGAUXv/////////////////////////////////////g4GDFheDUlBQUFBgQFFhApSRkGEJzFZbYABgQFGAgwOBYACGWvGRUFA9gGAAgRRhAtFXYEBRkVBgHxlgPz0BFoIBYEBSPYJSPWAAYCCEAT5hAtZWW2BgkVBbUJFQ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VltgAIFgAwuQUJGQUFZbYQn5gWEJ41ZbgRRhCgRXYACA/VtQVltgAIFRkFBhChaBYQnwVluSkVBQVltgAGAggoQDEhVhCjJXYQoxYQMSVltbYABhCkCEgoUBYQoHVluRUFCSkVBQVltgAIFRkFCRkFBWW2AAgoJSYCCCAZBQkpFQUFZbYACBkFBgIIIBkFCRkFBWW2EKfoFhBAhWW4JSUFBWW2AAgVGQUJGQUFZbYACCglJgIIIBkFCSkVBQVltgAIGQUGAgggGQUJGQUFZbYQq5gWEEclZbglJQUFZbYECCAWAAggFRYQrVYACFAYJhCnVWW1BgIIIBUWEK6GAghQGCYQqwVltQUFBQVltgAGEK+oODYQq/VltgQIMBkFCSkVBQVltgAGAgggGQUJGQUFZbYABhCx6CYQqEVlthCyiBhWEKj1Zbk1BhCzODYQqgVluAYABbg4EQFWELZFeBUWELS4iCYQruVluXUGELVoNhCwZWW5JQUGABgQGQUGELN1ZbUIWTUFBQUJKRUFBWW2AAgVGQUJGQUFZbYACCglJgIIIBkFCSkVBQVltgAIGQUGAgggGQUJGQUFZbYGCCAWAAggFRYQuzYACFAYJhCnVWW1BgIIIBUWELxmAghQGCYQp1VltQYECCAVFhC9lgQIUBgmEKsFZbUFBQUFZbYABhC+uDg2ELnVZbYGCDAZBQkpFQUFZbYABgIIIBkFCRkFBWW2AAYQwPgmELcVZbYQwZgYVhC3xWW5NQYQwkg2ELjVZbgGAAW4OBEBVhDFVXgVFhDDyIgmEL31Zbl1BhDEeDYQv3VluSUFBgAYEBkFBhDChWW1CFk1BQUFCSkVBQVltgAGBggwFgAIMBUWEMemAAhgGCYQp1VltQYCCDAVGEggNgIIYBUmEMkoKCYQsTVluRUFBgQIMBUYSCA2BAhgFSYQysgoJhDARWW5FQUICRUFCSkVBQVltgAGEMxYODYQxiVluQUJKRUFBWW2AAYCCCAZBQkZBQVltgAGEM5YJhCklWW2EM74GFYQpUVluTUINgIIIChQFhDQGFYQplVluAYABbhYEQFWENPVeEhAOJUoFRYQ0ehYJhDLlWW5RQYQ0pg2EMzVZbklBgIIoBmVBQYAGBAZBQYQ0FVltQgpdQh5VQUFBQUFCSkVBQVltgAGAgggGQUIGBA2AAgwFSYQ1pgYRhDNpWW5BQkpFQUFb+omRpcGZzWCISIBgpHo8Gv348N3iiDgaK70QCgYXSjtXSrnMxQ7WI92FgZHNvbGNDAAgQADMigAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKMCaDDoDGIoIShYKFAAAAAAAAAAAAAAAAAAAAAAAAAQKcgcKAxiKCBABUhYKCQoCGAIQ/7LFDQoJCgIYYhCAs8UN"},{"b64Body":"Cg8KCQiCmduqBhC8CBICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxiCCBoxKi8IARIrCiISICeGG15eGUqp8KpKQXm+EpObZSTlbPjfGBDRrBjV8gk+CgVCAxiKCA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwjcjrf1/lEk7LrbR7AGpFhJkSF/NUceXdvkmtNLvjRx+/UyS8tO3Ti2fC3k1T9sJVGgwIvpnbqgYQo/yrjgEiDwoJCIKZ26oGELwIEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiCmduqBhDCCBICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxiECBoxKi8IARIrCiISICeGG15eGUqp8KpKQXm+EpObZSTlbPjfGBDRrBjV8gk+CgVCAxiKCA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwbLvO/B/U6P/t+FfcbjStWvsbM0qApQ27cFxOelgd+S6eB1OmOF+VGcXyJVqLQ3oWGgwIvpnbqgYQy9fA/wIiDwoJCIKZ26oGEMIIEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiDmduqBhDICBICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxiDCBoxKi8IARIrCiISICeGG15eGUqp8KpKQXm+EpObZSTlbPjfGBDRrBjV8gk+CgVCAxiKCA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwtY6Q5l5u1JP3TZW2r4tMRNL0eP092WlXLZ4O1GKe7qLlrfNKOtvUg56cQuOZr867GgwIv5nbqgYQk+3+lQEiDwoJCIOZ26oGEMgIEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiDmduqBhDOCBICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxiFCBoxKi8IARIrCiISICeGG15eGUqp8KpKQXm+EpObZSTlbPjfGBDRrBjV8gk+CgVCAxiKCA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwQvbCk6kD4PGA3DF1zaGImIeihM98CxqQW3XWbfoaVZEe9P589O7ZHMnL788G1gfCGgwIv5nbqgYQu9aCmQMiDwoJCIOZ26oGEM4IEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiEmduqBhDQCBICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46sQUKAxiKCBCAkvQBIqQFDtBydgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAv/////////////////////////////////////////TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ==","b64Record":"CiUIFiIDGIoIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCJM6nbqhLSK9buuOtRr+wyazkIgdmXz+5pGacXdmSXWryTZhr/3DLykCWwuOL65xIaDAjAmduqBhDbifysASIPCgkIhJnbqgYQ0AgSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCAmKtsOo0CCgMYiggigAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKICowwFSGAoKCgIYAhD/r9bYAQoKCgIYYhCAsNbYAQ=="},{"b64Body":"ChEKCQiEmduqBhDQCBICGAIgAXIuEhcKAxiHCBIHCgMYgggQWRIHCgMYgwgQWhITCgMYiAgaDAoDGIQIEgMYhQgYAQ==","b64Record":"CgIIFhIwCK6tDGaDdwHT/YZStA8WKgiZPYtiWl3Unl7gf4n+Qp01ocSEDNSlYL9fEesJROobGgwIwJnbqgYQ3In8rAEiEQoJCISZ26oGENAIEgIYAiABOtwFCgMY5wISIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWKLfyAlDXiu4BYqQFGJpVTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAv/////////////////////////////////////////TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWoDGIoIUgBaFwoDGIcIEgcKAxiCCBBZEgcKAxiDCBBaWhMKAxiICBoMCgMYhAgSAxiFCBgBegwIwJnbqgYQ24n8rAE="}]},"NonNestedCryptoTransferForFungibleTokenWithMultipleSendersAndReceiversAndNonFungibleTokens":{"placeholderNum":1035,"encodedItems":[{"b64Body":"Cg8KCQiImduqBhCECRICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloyCiISIEi4UuBGE4ueZnBpZv5s7NAouCyBs8aU7bZLf8Rtnv4rEIDQ28P0AkoFCIDO2gM=","b64Record":"CiUIFhIDGIwIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjA7HJA8cqT1KBaJIAhHIphH0FuPhSJEWsXBj/JsmY/KmTPaQLeGmQJlCvrNmiz7NjEaDAjEmduqBhCDwPi6AiIPCgkIiJnbqgYQhAkSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIbCgsKAhgCEP+ft4fpBQoMCgMYjAgQgKC3h+kF"},{"b64Body":"Cg8KCQiJmduqBhCGCRICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISIIoo0gzcUwpo9zIcgHH0BYe2a9Ml0DDRMU4UmSaZoMe8EICU69wDQAFKBQiAztoD","b64Record":"CiUIFhIDGI0IKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjBwYbU7G86TdsK5aLAZxaLV3qttLJfnqZUdF4cVSM94iMXqk+RHJFdJWb/Xz/TlOQ8aCwjFmduqBhD7paZMIg8KCQiJmduqBhCGCRICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUhkKCgoCGAIQ/6fWuQcKCwoDGI0IEICo1rkH"},{"b64Body":"Cg8KCQiJmduqBhCICRICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloyCiISIAN5yixpimOnqxUJ2GsEzSQI4tGZRBkiU2T2UOdHnN7bEIDo7aG6AUoFCIDO2gM=","b64Record":"CiUIFhIDGI4IKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjC9Idu7BpS4KUsfK7YUypuQu+5roUlK9q54vk4W/iq91ymzRds0+0guDFBbyFuhjkYaDAjFmduqBhDzoeW7AiIPCgkIiZnbqgYQiAkSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIbCgsKAhgCEP/P28P0AgoMCgMYjggQgNDbw/QC"},{"b64Body":"Cg8KCQiKmduqBhCKCRICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISICgb7zoB+STETjj5namvHM5fOQqL6xHkgI5V6OdhfZgLEICU69wDQAFKBQiAztoD","b64Record":"CiUIFhIDGI8IKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAiLqeBibv8xIbfv7aYQds5AzuweioKWeUu/i9llbZmqDKFjnKMDA2CpXSptnwKFvwaCwjGmduqBhCjj4NiIg8KCQiKmduqBhCKCRICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUhkKCgoCGAIQ/6fWuQcKCwoDGI8IEICo1rkH"},{"b64Body":"Cg8KCQiKmduqBhCMCRICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIIemT5r5R2zfgk4AoZTJzsyfs5h/bYWw0TEkCko0oCN7EICU69wDSgUIgM7aAw==","b64Record":"CiUIFhIDGJAIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjBIjlfiXeanZ/fSxIDTckZNbKv8noVwb0+RDSwmjH5++1oCzRKSNK09ebPJ5oDFpt4aDAjGmduqBhCbiLrUAiIPCgkIipnbqgYQjAkSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxiQCBCAqNa5Bw=="},{"b64Body":"Cg8KCQiLmduqBhCOCRICGAISAhgDGKWr3ugCIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAScKBlRva2VuQRIITEZSUEVSSUMg6AcqAxiQCGoLCMfnta4GEMjl7Fk=","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGJEIEjCI7Fvp8zWOfXxfrGvsNOiqB4g0TNyfda0ff4/iF75D8JB3Sj7c9cEeRaLZrr11EuwaCwjHmduqBhCDvvVdIg8KCQiLmduqBhCOCRICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUgBaDwoDGJEIEggKAxiQCBDQD3IKCgMYkQgSAxiQCA=="},{"b64Body":"Cg8KCQiLmduqBhCQCRICGAISAhgDGN6ApvsCIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAXMKCVRva2VuX05GVBIIRlRBWERPS0YqAxiQCDIiEiBjCR3p6w1nM3kzJZyIXa5GheGfyQD83T40ceAhiAo81lIiEiBjCR3p6w1nM3kzJZyIXa5GheGfyQD83T40ceAhiAo81moMCMfnta4GELD028oCiAEB","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGJIIEjDSG7/aKcmwf5tO7wlmYwVaT84+HiZVAtrBAwfWyp6g8JgSBZzWe+VKwnQBQhXfQOsaDAjHmduqBhDLkr3eAiIPCgkIi5nbqgYQkAkSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAcgoKAxiSCBIDGJAI"},{"b64Body":"Cg8KCQiMmduqBhCWCRICGAISAhgDGP2NkRAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjqoCHAoDGJIIGglmaXJzdE1lbW8aCnNlY29uZE1lbW8=","b64Record":"CiYIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1gCcgIBAhIwo36lQHBJInqLQ2pTAr/7TKkkmdle84UPmzpQ+NtsbUfEjkXEWAmtFMD2KeJXwkr8GgsIyJnbqgYQy4qKaCIPCgkIjJnbqgYQlgkSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWh8KAxiSCBoLCgIYABIDGJAIGAEaCwoCGAASAxiQCBgC"},{"b64Body":"Cg8KCQiMmduqBhCeCRICGAISAhgDGMHw7CAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICDwoDGIwIEgMYkQgSAxiSCA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwvO3SHmwbrpTyCPNEKJ6SF0Ac1Xz4fXFjyLprXNRx+cnkq5tKouqC+EnH6UJpS81mGgwIyJnbqgYQ46WW6AIiDwoJCIyZ26oGEJ4JEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiNmduqBhCkCRICGAISAhgDGMHw7CAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICDwoDGI4IEgMYkQgSAxiSCA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwzs5toxtyFp/QHMHq6BBdToKGEUGkBVhh7eyicEVXeE9PdRIC1DJTpGBTN6lu+ovkGgsIyZnbqgYQs9KtcSIPCgkIjZnbqgYQpAkSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQiNmduqBhCqCRICGAISAhgDGMHw7CAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICDwoDGI0IEgMYkQgSAxiSCA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw7xrxYoYyBd6xKKYzdq3SMQvtzqMgiQn4ky/9msPg5yLvHvblp2Mqxr2+NcXT4U53GgwIyZnbqgYQ6++Z8QIiDwoJCI2Z26oGEKoJEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiOmduqBhCwCRICGAISAhgDGMHw7CAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICDwoDGI8IEgMYkQgSAxiSCA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwfUGsKMyB8ZA6NW4fAEv54yyb1og9m5rWaUv9XNl513NayHztnixazIjsM1lfIcQxGgwIypnbqgYQk6rHkwEiDwoJCI6Z26oGELAJEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"ChAKCQiOmduqBhCyCRIDGIwIEgIYAxjrnzYiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjnIbEhkKAxiRCBIICgMYkAgQjwMSCAoDGIwIEJAD","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw5mK2yGWxnno2AAgQ4IFm9h4m78GodzlDlBfwxVenGicFtD+5Ybzycy5OP9dGaAypGgwIypnbqgYQs6uK+wIiEAoJCI6Z26oGELIJEgMYjAgqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMOufNlIqCggKAhgDEPDjBAoICgIYYhCcrF0KCQoDGKAGEMqvCgoJCgMYjAgQ1b9sWhkKAxiRCBIICgMYjAgQkAMSCAoDGJAIEI8D"},{"b64Body":"ChAKCQiPmduqBhC0CRIDGI4IEgIYAxjrnzYiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjnIbEhkKAxiRCBIICgMYkAgQxwESCAoDGI4IEMgB","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwoQkMRsv5c/dVzSl/Vbprzlny3Nx0IcMal7YHxbqTio8hzIBsO1lhzecqBT9iO7QgGgwIy5nbqgYQ072jiAEiEAoJCI+Z26oGELQJEgMYjggqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMOufNlIqCggKAhgDEPDjBAoICgIYYhCcrF0KCQoDGKAGEMqvCgoJCgMYjggQ1b9sWhkKAxiRCBIICgMYjggQyAESCAoDGJAIEMcB"},{"b64Body":"ChAKCQiPmduqBhC2CRIDGIwIEgIYAxiNxjwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjnIVEhMKAxiSCBoMCgMYkAgSAxiMCBgB","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw11xmUGR0KkwCEkW/nlD95WyOXuZMzmNbuP0MnJA9lkLUmraKbwRiLDh0TLtGDLMZGgwIy5nbqgYQ4/fiiwMiEAoJCI+Z26oGELYJEgMYjAgqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMI3GPFIqCggKAhgDEOLUBAoICgIYYhCM5WgKCQoDGKAGEKzSCwoJCgMYjAgQmYx5WhMKAxiSCBoMCgMYkAgSAxiMCBgB"},{"b64Body":"ChAKCQiQmduqBhC4CRIDGI4IEgIYAxiNxjwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjnIVEhMKAxiSCBoMCgMYkAgSAxiOCBgC","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwAz1nVhU77dapacQSTLTEo9a4syIK7MmCwuUEGAUylzN1wXIZ50SfeTePqyTbn4fYGgwIzJnbqgYQk9/KmgEiEAoJCJCZ26oGELgJEgMYjggqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMI3GPFIqCggKAhgDEOLUBAoICgIYYhCM5WgKCQoDGKAGEKzSCwoJCgMYjggQmYx5WhMKAxiSCBoMCgMYkAgSAxiOCBgC"},{"b64Body":"Cg8KCQiQmduqBhC6CRICGAISAhgDGP7LzSwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjooBjwESDAjM57WuBhCg1In8AhptCiISIOPH0wrz5pssUR0urwwmDwitOvx0MQficWXkMlvlUhADCiM6IQKNoxDHVLQT+aJRRUdkjF/LC6o6qQzk6A5ZcuTuYdoYLQoiEiCAkRkBCRNHkxWmkp3dqwoV16n2aDGFizdpJhS/YEkzWiIMSGVsbG8gV29ybGQhKgAyAA==","b64Record":"CiUIFhoDGJMIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDAwyFJcu6IX1T7ne1GHY+H9+5shZL1lHPN8UbC2A6fCVq25M02V+fW3Krxw8yYgB0aDAjMmduqBhCj7baGAyIPCgkIkJnbqgYQugkSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQiRmduqBhC+CRICGAISAhgDGIudjj4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjpoBiCAKAxiTCCKAIDYwODA2MDQwNTIzNDgwMTU2MTAwMTA1NzYwMDA4MGZkNWI1MDYxMGRhNzgwNjEwMDIwNjAwMDM5NjAwMGYzZmU2MDgwNjA0MDUyMzQ4MDE1NjEwMDEwNTc2MDAwODBmZDViNTA2MDA0MzYxMDYxMDAzNjU3NjAwMDM1NjBlMDFjODA2MzBlZDA3Mjc2MTQ2MTAwM2I1NzgwNjM3YzQxYWQyYzE0NjEwMDU3NTc1YjYwMDA4MGZkNWI2MTAwNTU2MDA0ODAzNjAzODEwMTkwNjEwMDUwOTE5MDYxMDgwYTU2NWI2MTAwODc1NjViMDA1YjYxMDA3MTYwMDQ4MDM2MDM4MTAxOTA2MTAwNmM5MTkwNjEwODUzNTY1YjYxMDBkZTU2NWI2MDQwNTE2MTAwN2U5MTkwNjEwODk5NTY1YjYwNDA1MTgwOTEwMzkwZjM1YjYwMDA2MTAwOTI4MjYxMDFmMzU2NWI5MDUwNjAxNjYwMDMwYjgxMTQ2MTAwZGE1NzYwNDA1MTdmMDhjMzc5YTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgxNTI2MDA0MDE2MTAwZDE5MDYxMDkxMTU2NWI2MDQwNTE4MDkxMDM5MGZkNWI1MDUwNTY1YjYwMDA4MDYwMDA2MTAxNjc3M2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxNjYzN2M0MWFkMmM2MGUwMWI4NTYwNDA1MTYwMjQwMTYxMDExNTkxOTA2MTA5NDA1NjViNjA0MDUxNjAyMDgxODMwMzAzODE1MjkwNjA0MDUyOTA3YmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTkxNjYwMjA4MjAxODA1MTdiZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY4MzgxODMxNjE3ODM1MjUwNTA1MDUwNjA0MDUxNjEwMTdmOTE5MDYxMDljYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwMWJjNTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwMWMxNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTAxZDI1NzYwMTU2MTAxZTc1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTAxZTY5MTkwNjEwYTFjNTY1YjViNjAwMzBiOTI1MDUwNTA5MTkwNTA1NjViNjAwMDgwNjAwMDYxMDE2NzczZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE2NjMxODlhNTU0YzYwZTAxYjg1NjA0MDUxNjAyNDAxNjEwMjJhOTE5MDYxMGQ0ZjU2NWI2MDQwNTE2MDIwODE4MzAzMDM4MTUyOTA2MDQwNTI5MDdiZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxOTE2NjAyMDgyMDE4MDUxN2JmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjgzODE4MzE2MTc4MzUyNTA1MDUwNTA2MDQwNTE2MTAyOTQ5MTkwNjEwOWNjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTAyZDE1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTAyZDY1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA4MTYxMDJlNzU3NjAxNTYxMDJmYzU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDJmYjkxOTA2MTBhMWM1NjViNWI2MDAzMGI5MjUwNTA1MDkxOTA1MDU2NWI2MDAwNjA0MDUxOTA1MDkwNTY1YjYwMDA4MGZkNWI2MDAwODBmZDViNjAwMDgwZmQ1YjYwMDA2MDFmMTk2MDFmODMwMTE2OTA1MDkxOTA1MDU2NWI3ZjRlNDg3YjcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MDAwNTI2MDQxNjAwNDUyNjAyNDYwMDBmZDViNjEwMzZhODI2MTAzMjE1NjViODEwMTgxODExMDY3ZmZmZmZmZmZmZmZmZmZmZjgyMTExNzE1NjEwMzg5NTc2MTAzODg2MTAzMzI1NjViNWI4MDYwNDA1MjUwNTA1MDU2NWI2MDAwNjEwMzljNjEwMzA4NTY1YjkwNTA2MTAzYTg4MjgyNjEwMzYxNTY1YjkxOTA1MDU2NWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwM2M4NTc2MTAzYzc2MTAzMzI1NjViNWI2MDIwODIwMjkwNTA2MDIwODEwMTkwNTA5MTkwNTA1NjViNjAwMDgwZmQ1YjYwMDA4MGZkNWI2MDAwODBmZDViNjAwMDczZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjgyMTY5MDUwOTE5MDUwNTY1YjYwMDA2MTA0MTM4MjYxMDNlODU2NWI5MDUwOTE5MDUwNTY1YjYxMDQyMzgxNjEwNDA4NTY1YjgxMTQ2MTA0MmU1NzYwMDA4MGZkNWI1MDU2NWI2MDAwODEzNTkwNTA2MTA0NDA4MTYxMDQxYTU2NWI5MjkxNTA1MDU2NWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwNDYxNTc2MTA0NjA2MTAzMzI1NjViNWI2MDIwODIwMjkwNTA2MDIwODEwMTkwNTA5MTkwNTA1NjViNjAwMDgxNjAwNzBiOTA1MDkxOTA1MDU2NWI2MTA0ODg4MTYxMDQ3MjU2NWI4MTE0NjEwNDkzNTc2MDAwODBmZDViNTA1NjViNjAwMDgxMzU5MDUwNjEwNGE1ODE2MTA0N2Y1NjViOTI5MTUwNTA1NjViNjAwMDYwNDA4Mjg0MDMxMjE1NjEwNGMxNTc2MTA0YzA2MTAzZGU1NjViNWI2MTA0Y2I2MDQwNjEwMzkyNTY1YjkwNTA2MDAwNjEwNGRiODQ4Mjg1MDE2MTA0MzE1NjViNjAwMDgzMDE1MjUwNjAyMDYxMDRlZjg0ODI4NTAxNjEwNDk2NTY1YjYwMjA4MzAxNTI1MDkyOTE1MDUwNTY1YjYwMDA2MTA1MGU2MTA1MDk4NDYxMDQ0NjU2NWI2MTAzOTI1NjViOTA1MDgwODM4MjUyNjAyMDgyMDE5MDUwNjA0MDg0MDI4MzAxODU4MTExMTU2MTA1MzE1NzYxMDUzMDYxMDNkOTU2NWI1YjgzNWI4MTgxMTAxNTYxMDU1YTU3ODA2MTA1NDY4ODgyNjEwNGFiNTY1Yjg0NTI2MDIwODQwMTkzNTA1MDYwNDA4MTAxOTA1MDYxMDUzMzU2NWI1MDUwNTA5MzkyNTA1MDUwNTY1YjYwMDA4MjYwMWY4MzAxMTI2MTA1Nzk1NzYxMDU3ODYxMDMxYzU2NWI1YjgxMzU2MTA1ODk4NDgyNjAyMDg2MDE2MTA0ZmI1NjViOTE1MDUwOTI5MTUwNTA1NjViNjAwMDY3ZmZmZmZmZmZmZmZmZmZmZjgyMTExNTYxMDVhZDU3NjEwNWFjNjEwMzMyNTY1YjViNjAyMDgyMDI5MDUwNjAyMDgxMDE5MDUwOTE5MDUwNTY1YjYwMDA2MDYwODI4NDAzMTIxNTYxMDVkNDU3NjEwNWQzNjEwM2RlNTY1YjViNjEwNWRlNjA2MDYxMDM5MjU2NWI5MDUwNjAwMDYxMDVlZTg0ODI4NTAxNjEwNDMxNTY1YjYwMDA4MzAxNTI1MDYwMjA2MTA2MDI4NDgyODUwMTYxMDQzMTU2NWI2MDIwODMwMTUyNTA2MDQwNjEwNjE2ODQ4Mjg1MDE2MTA0OTY1NjViNjA0MDgzMDE1MjUwOTI5MTUwNTA1NjViNjAwMDYxMDYzNTYxMDYzMDg0NjEwNTkyNTY1YjYxMDM5MjU2NWI5MDUwODA4MzgyNTI2MDIwODIwMTkwNTA2MDYwODQwMjgzMDE4NTgxMTExNTYxMDY1ODU3NjEwNjU3NjEwM2Q5NTY1YjViODM1YjgxODExMDE1NjEwNjgxNTc4MDYxMDY2ZDg4ODI2MTA1YmU1NjViODQ1MjYwMjA4NDAxOTM1MDUwNjA2MDgxMDE5MDUwNjEwNjVhNTY1YjUwNTA1MDkzOTI1MDUwNTA1NjViNjAwMDgyNjAxZjgzMDExMjYxMDZhMDU3NjEwNjlmNjEwMzFjNTY1YjViODEzNTYxMDZiMDg0ODI2MDIwODYwMTYxMDYyMjU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwNjA2MDgyODQwMzEyMTU2MTA2Y2Y1NzYxMDZjZTYxMDNkZTU2NWI1YjYxMDZkOTYwNjA2MTAzOTI1NjViOTA1MDYwMDA2MTA2ZTk4NDgyODUwMTYxMDQzMTU2NWI2MDAwODMwMTUyNTA2MDIwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwNzBkNTc2MTA3MGM2MTAzZTM1NjViNWI2MTA3MTk4NDgyODUwMTYxMDU2NDU2NWI2MDIwODMwMTUyNTA2MDQwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwNzNkNTc2MTA3M2M2MTAzZTM1NjViNWI2MTA3NDk4NDgyODUwMTYxMDY4YjU2NWI2MDQwODMwMTUyNTA5MjkxNTA1MDU2NWI2MDAwNjEwNzY4NjEwNzYzODQ2MTAzYWQ1NjViNjEwMzkyNTY1YjkwNTA4MDgzODI1MjYwMjA4MjAxOTA1MDYwMjA4NDAyODMwMTg1ODExMTE1NjEwNzhiNTc2MTA3OGE2MTAzZDk1NjViNWI4MzViODE4MTEwMTU2MTA3ZDI1NzgwMzU2N2ZmZmZmZmZmZmZmZmZmZmY4MTExMTU2MTA3YjA1NzYxMDdhZjYxMDMxYzU2NWI1YjgwODYwMTYxMDdiZDg5ODI2MTA2Yjk1NjViODU1MjYwMjA4NTAxOTQ1MDUwNTA2MDIwODEwMTkwNTA2MTA3OGQ1NjViNTA1MDUwOTM5MjUwNTA1MDU2NWI2MDAwODI=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwracrhG4UGwkY9biWhmQL+1uTpB8mSI2/LnLkBXv8dOmdOLitBpru9nhTwHXsA0LgGgwIzZnbqgYQw/P/rgEiDwoJCJGZ26oGEL4JEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiRmduqBhDECRICGAISAhgDGKPY6zkiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBlhcSAxiTCCKOFzYwMWY4MzAxMTI2MTA3ZjE1NzYxMDdmMDYxMDMxYzU2NWI1YjgxMzU2MTA4MDE4NDgyNjAyMDg2MDE2MTA3NTU1NjViOTE1MDUwOTI5MTUwNTA1NjViNjAwMDYwMjA4Mjg0MDMxMjE1NjEwODIwNTc2MTA4MWY2MTAzMTI1NjViNWI2MDAwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwODNlNTc2MTA4M2Q2MTAzMTc1NjViNWI2MTA4NGE4NDgyODUwMTYxMDdkYzU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwNjAyMDgyODQwMzEyMTU2MTA4Njk1NzYxMDg2ODYxMDMxMjU2NWI1YjYwMDA2MTA4Nzc4NDgyODUwMTYxMDQzMTU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwODE5MDUwOTE5MDUwNTY1YjYxMDg5MzgxNjEwODgwNTY1YjgyNTI1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA2MTA4YWU2MDAwODMwMTg0NjEwODhhNTY1YjkyOTE1MDUwNTY1YjYwMDA4MjgyNTI2MDIwODIwMTkwNTA5MjkxNTA1MDU2NWI3ZjQzNzI3OTcwNzQ2ZjIwNTQ3MjYxNmU3MzY2NjU3MjIwNDY2MTY5NmM2NTY0MDAwMDAwMDAwMDAwMDAwMDAwMDA2MDAwODIwMTUyNTA1NjViNjAwMDYxMDhmYjYwMTY4MzYxMDhiNDU2NWI5MTUwNjEwOTA2ODI2MTA4YzU1NjViNjAyMDgyMDE5MDUwOTE5MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA4MTgxMDM2MDAwODMwMTUyNjEwOTJhODE2MTA4ZWU1NjViOTA1MDkxOTA1MDU2NWI2MTA5M2E4MTYxMDQwODU2NWI4MjUyNTA1MDU2NWI2MDAwNjAyMDgyMDE5MDUwNjEwOTU1NjAwMDgzMDE4NDYxMDkzMTU2NWI5MjkxNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgxOTA1MDkyOTE1MDUwNTY1YjYwMDA1YjgzODExMDE1NjEwOThmNTc4MDgyMDE1MTgxODQwMTUyNjAyMDgxMDE5MDUwNjEwOTc0NTY1YjYwMDA4NDg0MDE1MjUwNTA1MDUwNTY1YjYwMDA2MTA5YTY4MjYxMDk1YjU2NWI2MTA5YjA4MTg1NjEwOTY2NTY1YjkzNTA2MTA5YzA4MTg1NjAyMDg2MDE2MTA5NzE1NjViODA4NDAxOTE1MDUwOTI5MTUwNTA1NjViNjAwMDYxMDlkODgyODQ2MTA5OWI1NjViOTE1MDgxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTYwMDMwYjkwNTA5MTkwNTA1NjViNjEwOWY5ODE2MTA5ZTM1NjViODExNDYxMGEwNDU3NjAwMDgwZmQ1YjUwNTY1YjYwMDA4MTUxOTA1MDYxMGExNjgxNjEwOWYwNTY1YjkyOTE1MDUwNTY1YjYwMDA2MDIwODI4NDAzMTIxNTYxMGEzMjU3NjEwYTMxNjEwMzEyNTY1YjViNjAwMDYxMGE0MDg0ODI4NTAxNjEwYTA3NTY1YjkxNTA1MDkyOTE1MDUwNTY1YjYwMDA4MTUxOTA1MDkxOTA1MDU2NWI2MDAwODI4MjUyNjAyMDgyMDE5MDUwOTI5MTUwNTA1NjViNjAwMDgxOTA1MDYwMjA4MjAxOTA1MDkxOTA1MDU2NWI2MTBhN2U4MTYxMDQwODU2NWI4MjUyNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgyODI1MjYwMjA4MjAxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTkwNTA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjEwYWI5ODE2MTA0NzI1NjViODI1MjUwNTA1NjViNjA0MDgyMDE2MDAwODIwMTUxNjEwYWQ1NjAwMDg1MDE4MjYxMGE3NTU2NWI1MDYwMjA4MjAxNTE2MTBhZTg2MDIwODUwMTgyNjEwYWIwNTY1YjUwNTA1MDUwNTY1YjYwMDA2MTBhZmE4MzgzNjEwYWJmNTY1YjYwNDA4MzAxOTA1MDkyOTE1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjAwMDYxMGIxZTgyNjEwYTg0NTY1YjYxMGIyODgxODU2MTBhOGY1NjViOTM1MDYxMGIzMzgzNjEwYWEwNTY1YjgwNjAwMDViODM4MTEwMTU2MTBiNjQ1NzgxNTE2MTBiNGI4ODgyNjEwYWVlNTY1Yjk3NTA2MTBiNTY4MzYxMGIwNjU2NWI5MjUwNTA2MDAxODEwMTkwNTA2MTBiMzc1NjViNTA4NTkzNTA1MDUwNTA5MjkxNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgyODI1MjYwMjA4MjAxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTkwNTA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjA2MDgyMDE2MDAwODIwMTUxNjEwYmIzNjAwMDg1MDE4MjYxMGE3NTU2NWI1MDYwMjA4MjAxNTE2MTBiYzY2MDIwODUwMTgyNjEwYTc1NTY1YjUwNjA0MDgyMDE1MTYxMGJkOTYwNDA4NTAxODI2MTBhYjA1NjViNTA1MDUwNTA1NjViNjAwMDYxMGJlYjgzODM2MTBiOWQ1NjViNjA2MDgzMDE5MDUwOTI5MTUwNTA1NjViNjAwMDYwMjA4MjAxOTA1MDkxOTA1MDU2NWI2MDAwNjEwYzBmODI2MTBiNzE1NjViNjEwYzE5ODE4NTYxMGI3YzU2NWI5MzUwNjEwYzI0ODM2MTBiOGQ1NjViODA2MDAwNWI4MzgxMTAxNTYxMGM1NTU3ODE1MTYxMGMzYzg4ODI2MTBiZGY1NjViOTc1MDYxMGM0NzgzNjEwYmY3NTY1YjkyNTA1MDYwMDE4MTAxOTA1MDYxMGMyODU2NWI1MDg1OTM1MDUwNTA1MDkyOTE1MDUwNTY1YjYwMDA2MDYwODMwMTYwMDA4MzAxNTE2MTBjN2E2MDAwODYwMTgyNjEwYTc1NTY1YjUwNjAyMDgzMDE1MTg0ODIwMzYwMjA4NjAxNTI2MTBjOTI4MjgyNjEwYjEzNTY1YjkxNTA1MDYwNDA4MzAxNTE4NDgyMDM2MDQwODYwMTUyNjEwY2FjODI4MjYxMGMwNDU2NWI5MTUwNTA4MDkxNTA1MDkyOTE1MDUwNTY1YjYwMDA2MTBjYzU4MzgzNjEwYzYyNTY1YjkwNTA5MjkxNTA1MDU2NWI2MDAwNjAyMDgyMDE5MDUwOTE5MDUwNTY1YjYwMDA2MTBjZTU4MjYxMGE0OTU2NWI2MTBjZWY4MTg1NjEwYTU0NTY1YjkzNTA4MzYwMjA4MjAyODUwMTYxMGQwMTg1NjEwYTY1NTY1YjgwNjAwMDViODU4MTEwMTU2MTBkM2Q1Nzg0ODQwMzg5NTI4MTUxNjEwZDFlODU4MjYxMGNiOTU2NWI5NDUwNjEwZDI5ODM2MTBjY2Q1NjViOTI1MDYwMjA4YTAxOTk1MDUwNjAwMTgxMDE5MDUwNjEwZDA1NTY1YjUwODI5NzUwODc5NTUwNTA1MDUwNTA1MDkyOTE1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA4MTgxMDM2MDAwODMwMTUyNjEwZDY5ODE4NDYxMGNkYTU2NWI5MDUwOTI5MTUwNTA1NmZlYTI2NDY5NzA2NjczNTgyMjEyMjAxODI5MWU4ZjA2YmY3ZTNjMzc3OGEyMGUwNjhhZWY0NDAyODE4NWQyOGVkNWQyYWU3MzMxNDNiNTg4Zjc2MTYwNjQ3MzZmNmM2MzQzMDAwODEwMDAzMw==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwYO6fdcZlc53XjdVksuhu/iHUhUavzfw8ktsok+whlCpcDU/gAwj7nVIUm7+7zNZoGgwIzZnbqgYQ27TomgMiDwoJCJGZ26oGEMQJEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiSmduqBhDGCRICGAISAhgDGJb7rp0CIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5CRQoDGJMIGiISIGcMqPddkbh1NXpM6Y4bxUDpevM/OpGVbCUbMaGJBsHpIJChD0IFCIDO2gNSAFoAagtjZWxsYXIgZG9vcg==","b64Record":"CiUIFiIDGJQIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjBWC9rIbU0IAiik2lpnfdAOPBlx9TKmjKuMDB+zaOAIGpuuT3MEAmXbnw7WcAHRql0aDAjOmduqBhCb/8+nASIPCgkIkpnbqgYQxgkSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjDA2eIGQtwdCgMYlAgSpxtggGBAUjSAFWEAEFdgAID9W1BgBDYQYQA2V2AANWDgHIBjDtBydhRhADtXgGN8Qa0sFGEAV1dbYACA/VthAFVgBIA2A4EBkGEAUJGQYQgKVlthAIdWWwBbYQBxYASANgOBAZBhAGyRkGEIU1ZbYQDeVltgQFFhAH6RkGEImVZbYEBRgJEDkPNbYABhAJKCYQHzVluQUGAWYAMLgRRhANpXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhANGQYQkRVltgQFGAkQOQ/VtQUFZbYACAYABhAWdz//////////////////////////8WY3xBrSxg4BuFYEBRYCQBYQEVkZBhCUBWW2BAUWAggYMDA4FSkGBAUpB7/////////////////////////////////////xkWYCCCAYBRe/////////////////////////////////////+DgYMWF4NSUFBQUGBAUWEBf5GQYQnMVltgAGBAUYCDA4FgAIZa8ZFQUD2AYACBFGEBvFdgQFGRUGAfGWA/PQEWggFgQFI9glI9YABgIIQBPmEBwVZbYGCRUFtQkVCRUIFhAdJXYBVhAedWW4CAYCABkFGBAZBhAeaRkGEKHFZbW2ADC5JQUFCRkFBWW2AAgGAAYQFnc///////////////////////////FmMYmlVMYOAbhWBAUWAkAWECKpGQYQ1PVltgQFFgIIGDAwOBUpBgQFKQe/////////////////////////////////////8ZFmAgggGAUXv/////////////////////////////////////g4GDFheDUlBQUFBgQFFhApSRkGEJzFZbYABgQFGAgwOBYACGWvGRUFA9gGAAgRRhAtFXYEBRkVBgHxlgPz0BFoIBYEBSPYJSPWAAYCCEAT5hAtZWW2BgkVBbUJFQ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VltgAIFgAwuQUJGQUFZbYQn5gWEJ41ZbgRRhCgRXYACA/VtQVltgAIFRkFBhChaBYQnwVluSkVBQVltgAGAggoQDEhVhCjJXYQoxYQMSVltbYABhCkCEgoUBYQoHVluRUFCSkVBQVltgAIFRkFCRkFBWW2AAgoJSYCCCAZBQkpFQUFZbYACBkFBgIIIBkFCRkFBWW2EKfoFhBAhWW4JSUFBWW2AAgVGQUJGQUFZbYACCglJgIIIBkFCSkVBQVltgAIGQUGAgggGQUJGQUFZbYQq5gWEEclZbglJQUFZbYECCAWAAggFRYQrVYACFAYJhCnVWW1BgIIIBUWEK6GAghQGCYQqwVltQUFBQVltgAGEK+oODYQq/VltgQIMBkFCSkVBQVltgAGAgggGQUJGQUFZbYABhCx6CYQqEVlthCyiBhWEKj1Zbk1BhCzODYQqgVluAYABbg4EQFWELZFeBUWELS4iCYQruVluXUGELVoNhCwZWW5JQUGABgQGQUGELN1ZbUIWTUFBQUJKRUFBWW2AAgVGQUJGQUFZbYACCglJgIIIBkFCSkVBQVltgAIGQUGAgggGQUJGQUFZbYGCCAWAAggFRYQuzYACFAYJhCnVWW1BgIIIBUWELxmAghQGCYQp1VltQYECCAVFhC9lgQIUBgmEKsFZbUFBQUFZbYABhC+uDg2ELnVZbYGCDAZBQkpFQUFZbYABgIIIBkFCRkFBWW2AAYQwPgmELcVZbYQwZgYVhC3xWW5NQYQwkg2ELjVZbgGAAW4OBEBVhDFVXgVFhDDyIgmEL31Zbl1BhDEeDYQv3VluSUFBgAYEBkFBhDChWW1CFk1BQUFCSkVBQVltgAGBggwFgAIMBUWEMemAAhgGCYQp1VltQYCCDAVGEggNgIIYBUmEMkoKCYQsTVluRUFBgQIMBUYSCA2BAhgFSYQysgoJhDARWW5FQUICRUFCSkVBQVltgAGEMxYODYQxiVluQUJKRUFBWW2AAYCCCAZBQkZBQVltgAGEM5YJhCklWW2EM74GFYQpUVluTUINgIIIChQFhDQGFYQplVluAYABbhYEQFWENPVeEhAOJUoFRYQ0ehYJhDLlWW5RQYQ0pg2EMzVZbklBgIIoBmVBQYAGBAZBQYQ0FVltQgpdQh5VQUFBQUFCSkVBQVltgAGAgggGQUIGBA2AAgwFSYQ1pgYRhDNpWW5BQkpFQUFb+omRpcGZzWCISIBgpHo8Gv348N3iiDgaK70QCgYXSjtXSrnMxQ7WI92FgZHNvbGNDAAgQADMigAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKMCaDDoDGJQIShYKFAAAAAAAAAAAAAAAAAAAAAAAAAQUcgcKAxiUCBABUhYKCQoCGAIQ/7LFDQoJCgIYYhCAs8UN"},{"b64Body":"Cg8KCQiSmduqBhDMCRICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxiMCBoxKi8IARIrCiISIKwyeN2fWTShZO1fziZ277pL35QObBrjKXT+yB643hIaCgVCAxiUCA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwA3qC09Xgew7NFWqSxyjF3vEVsP0gUeQFgTM3WmNqVr6vXRzLDmRD+jnBCFz08sPkGgwIzpnbqgYQk9WvrAMiDwoJCJKZ26oGEMwJEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiTmduqBhDSCRICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxiOCBoxKi8IARIrCiISIKwyeN2fWTShZO1fziZ277pL35QObBrjKXT+yB643hIaCgVCAxiUCA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwHGMLXH23Jlmhm3ALC04sTaUqmer3yM4s6tYglpBbzAyEF4mG2Y5IEHT5RvyOxoD+GgwIz5nbqgYQm6rWvAEiDwoJCJOZ26oGENIJEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiTmduqBhDYCRICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxiNCBoxKi8IARIrCiISIKwyeN2fWTShZO1fziZ277pL35QObBrjKXT+yB643hIaCgVCAxiUCA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwYDBFwxhLqW8ijVfUFspoRhGTZHLMCsAxF3EdS/abdy+WmckhwnnD4WbPpyLhG0X5GgwIz5nbqgYQk46spwMiDwoJCJOZ26oGENgJEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiUmduqBhDeCRICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxiPCBoxKi8IARIrCiISIKwyeN2fWTShZO1fziZ277pL35QObBrjKXT+yB643hIaCgVCAxiUCA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwWts7dhzMvl5Rqwa4pWbtCcsLn/jkEQIrZzn/EMqXfCCHXpbEn6RZkIpUKynFXUI4GgwI0JnbqgYQ47aXzQEiDwoJCJSZ26oGEN4JEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiUmduqBhDgCRICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kQcKAxiUCBCAkvQBIoQHDtBydgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDP/////////////////////////////////////////TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQO/////////////////////////////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC","b64Record":"CiUIFiIDGJQIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjA8lGnuyf+XBfHs9oXW4CWB20d5N9QLy/E2s07zN+HlozaM3ZUJWV7fVeVIASnpiFIaDAjQmduqBhCzx5q4AyIPCgkIlJnbqgYQ4AkSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCAmKtsOo0CCgMYlAgigAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKICowwFSGAoKCgIYAhD/r9bYAQoKCgIYYhCAsNbYAQ=="},{"b64Body":"ChEKCQiUmduqBhDgCRICGAIgAXJOEikKAxiRCBIHCgMYjAgQWRIHCgMYjQgQWhIHCgMYjggQPxIHCgMYjwgQQBIhCgMYkggaDAoDGIwIEgMYjQgYARoMCgMYjggSAxiPCBgC","b64Record":"CgIIFhIwhutK+69rBuPbf1BY3qDx5shAn3/gRIVYoa/fFW/SX/j6Tsb5KLiCrouC9gIzMPuCGgwI0JnbqgYQtMeauAMiEQoJCJSZ26oGEOAJEgIYAiABOrwHCgMY5wISIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWKIfABFDE5e0BYoQHGJpVTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDP/////////////////////////////////////////TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQO/////////////////////////////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACagMYlAhSAFopCgMYkQgSBwoDGIwIEFkSBwoDGI0IEFoSBwoDGI4IED8SBwoDGI8IEEBaIQoDGJIIGgwKAxiMCBIDGI0IGAEaDAoDGI4IEgMYjwgYAnoMCNCZ26oGELPHmrgD"}]},"RepeatedTokenIdsAreAutomaticallyConsolidated":{"placeholderNum":1045,"encodedItems":[{"b64Body":"Cg8KCQiZmduqBhCcChICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloyCiISIC58RwAILtVp56Rqx9aSOywqwBRxsWajou2nMF3Qr9GAEIDQ28P0AkoFCIDO2gM=","b64Record":"CiUIFhIDGJYIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAU2+KsebPiBIzYMAb9n8mb1fJkSwgCoIchVC8/9BNK51m/7iQjheuPVxLc35iGvacaDAjVmduqBhCTktiQASIPCgkImZnbqgYQnAoSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIbCgsKAhgCEP+ft4fpBQoMCgMYlggQgKC3h+kF"},{"b64Body":"Cg8KCQiZmduqBhCeChICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISIKWS+SYWXlz9cStfPJ7uj8kNfF25V/euiPZQpiHMvhnkEICQ38BKQAFKBQiAztoD","b64Record":"CiUIFhIDGJcIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAZoK/1BXNdcUoPq/vZioX9VWWVlvU/1yvFsL9u8zLQ2ecgbQkPeWNMKycuQ88qCqcaDAjVmduqBhCzytD8AiIPCgkImZnbqgYQngoSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIbCgsKAhgCEP+fvoGVAQoMCgMYlwgQgKC+gZUB"},{"b64Body":"Cg8KCQiamduqBhCgChICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIBJ/ZqFHSHL8Psx3ynX4rp2VZptvtIEPjoLaiRoIeTn0EICU69wDSgUIgM7aAw==","b64Record":"CiUIFhIDGJgIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCdu52ilAiUbtRe2Qk8URaYNKk1/dvAdrsUWz8lqCkR/5m7gWvNUba6JBBU6scHynYaDAjWmduqBhCDj7mSASIPCgkImpnbqgYQoAoSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxiYCBCAqNa5Bw=="},{"b64Body":"Cg8KCQiamduqBhCiChICGAISAhgDGKWr3ugCIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qASgKBlRva2VuQRIITE1aS1JCRUIg6AcqAxiYCGoMCNbnta4GEODHk4ED","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGJkIEjAXgfU3W5xdytXM90aqeX6nHnRwg94Knf6LHD5euE4FSAi8P+fksI/Ng7dLv86SWikaDAjWmduqBhDDx46bAyIPCgkImpnbqgYQogoSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWg8KAxiZCBIICgMYmAgQ0A9yCgoDGJkIEgMYmAg="},{"b64Body":"Cg8KCQibmduqBhCoChICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGJYIEgMYmQg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwaJ7h89BV5Az+6l83VsGjSnLxOekxWuwDKbm/GOpGviiVGFcVNhWB07GuxqASTWDMGgwI15nbqgYQg52EsAEiDwoJCJuZ26oGEKgKEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQibmduqBhCuChICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGJcIEgMYmQg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw2isXuS/vDRLOx1NpOyxWSTvMkaTXAsvHiwt9WMsdJVKqF7Rrk24039PCwI/OSR5aGgwI15nbqgYQq+ylngMiDwoJCJuZ26oGEK4KEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQicmduqBhCwChICGAISAhgDGOufNiICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchsSGQoDGJkIEggKAxiYCBCPAxIICgMYlggQkAM=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwXIvi4sCQU8SrlvU1bCdHPU39ZQQCGoYCWDoZTscip0vxH5NZ2+tmJkeIkLCdDx0fGgwI2JnbqgYQg6mDrwEiDwoJCJyZ26oGELAKEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFoZCgMYmQgSCAoDGJYIEJADEggKAxiYCBCPAw=="},{"b64Body":"Cg8KCQicmduqBhCyChICGAISAhgDGP7LzSwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjooBjwESDAjY57WuBhDgwOucAxptCiISIISvDV/8vfp1b3eFcoQgLS82iW4MtrsklyLu8N5OzO5PCiM6IQMWnZvp07kEwQnYiu1yl37tDono+WvkdVDy3ldR2zFZWQoiEiDKoreDgIWJF22iXv8LXav7vGCrfbzqJoQFHrjtZV9DAiIMSGVsbG8gV29ybGQhKgAyAA==","b64Record":"CiUIFhoDGJoIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjBeY9G0Jkv9x6FRycxIAthIVnHPdDbvMi7m6FjWy3NsyLKSgZoBGVVT8Fd3/PmE5T4aDAjYmduqBhDz6eivAyIPCgkInJnbqgYQsgoSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQidmduqBhC2ChICGAISAhgDGIudjj4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjpoBiCAKAxiaCCKAIDYwODA2MDQwNTIzNDgwMTU2MTAwMTA1NzYwMDA4MGZkNWI1MDYxMGRhNzgwNjEwMDIwNjAwMDM5NjAwMGYzZmU2MDgwNjA0MDUyMzQ4MDE1NjEwMDEwNTc2MDAwODBmZDViNTA2MDA0MzYxMDYxMDAzNjU3NjAwMDM1NjBlMDFjODA2MzBlZDA3Mjc2MTQ2MTAwM2I1NzgwNjM3YzQxYWQyYzE0NjEwMDU3NTc1YjYwMDA4MGZkNWI2MTAwNTU2MDA0ODAzNjAzODEwMTkwNjEwMDUwOTE5MDYxMDgwYTU2NWI2MTAwODc1NjViMDA1YjYxMDA3MTYwMDQ4MDM2MDM4MTAxOTA2MTAwNmM5MTkwNjEwODUzNTY1YjYxMDBkZTU2NWI2MDQwNTE2MTAwN2U5MTkwNjEwODk5NTY1YjYwNDA1MTgwOTEwMzkwZjM1YjYwMDA2MTAwOTI4MjYxMDFmMzU2NWI5MDUwNjAxNjYwMDMwYjgxMTQ2MTAwZGE1NzYwNDA1MTdmMDhjMzc5YTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgxNTI2MDA0MDE2MTAwZDE5MDYxMDkxMTU2NWI2MDQwNTE4MDkxMDM5MGZkNWI1MDUwNTY1YjYwMDA4MDYwMDA2MTAxNjc3M2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxNjYzN2M0MWFkMmM2MGUwMWI4NTYwNDA1MTYwMjQwMTYxMDExNTkxOTA2MTA5NDA1NjViNjA0MDUxNjAyMDgxODMwMzAzODE1MjkwNjA0MDUyOTA3YmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTkxNjYwMjA4MjAxODA1MTdiZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY4MzgxODMxNjE3ODM1MjUwNTA1MDUwNjA0MDUxNjEwMTdmOTE5MDYxMDljYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwMWJjNTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwMWMxNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTAxZDI1NzYwMTU2MTAxZTc1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTAxZTY5MTkwNjEwYTFjNTY1YjViNjAwMzBiOTI1MDUwNTA5MTkwNTA1NjViNjAwMDgwNjAwMDYxMDE2NzczZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE2NjMxODlhNTU0YzYwZTAxYjg1NjA0MDUxNjAyNDAxNjEwMjJhOTE5MDYxMGQ0ZjU2NWI2MDQwNTE2MDIwODE4MzAzMDM4MTUyOTA2MDQwNTI5MDdiZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxOTE2NjAyMDgyMDE4MDUxN2JmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjgzODE4MzE2MTc4MzUyNTA1MDUwNTA2MDQwNTE2MTAyOTQ5MTkwNjEwOWNjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTAyZDE1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTAyZDY1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA4MTYxMDJlNzU3NjAxNTYxMDJmYzU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDJmYjkxOTA2MTBhMWM1NjViNWI2MDAzMGI5MjUwNTA1MDkxOTA1MDU2NWI2MDAwNjA0MDUxOTA1MDkwNTY1YjYwMDA4MGZkNWI2MDAwODBmZDViNjAwMDgwZmQ1YjYwMDA2MDFmMTk2MDFmODMwMTE2OTA1MDkxOTA1MDU2NWI3ZjRlNDg3YjcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MDAwNTI2MDQxNjAwNDUyNjAyNDYwMDBmZDViNjEwMzZhODI2MTAzMjE1NjViODEwMTgxODExMDY3ZmZmZmZmZmZmZmZmZmZmZjgyMTExNzE1NjEwMzg5NTc2MTAzODg2MTAzMzI1NjViNWI4MDYwNDA1MjUwNTA1MDU2NWI2MDAwNjEwMzljNjEwMzA4NTY1YjkwNTA2MTAzYTg4MjgyNjEwMzYxNTY1YjkxOTA1MDU2NWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwM2M4NTc2MTAzYzc2MTAzMzI1NjViNWI2MDIwODIwMjkwNTA2MDIwODEwMTkwNTA5MTkwNTA1NjViNjAwMDgwZmQ1YjYwMDA4MGZkNWI2MDAwODBmZDViNjAwMDczZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjgyMTY5MDUwOTE5MDUwNTY1YjYwMDA2MTA0MTM4MjYxMDNlODU2NWI5MDUwOTE5MDUwNTY1YjYxMDQyMzgxNjEwNDA4NTY1YjgxMTQ2MTA0MmU1NzYwMDA4MGZkNWI1MDU2NWI2MDAwODEzNTkwNTA2MTA0NDA4MTYxMDQxYTU2NWI5MjkxNTA1MDU2NWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwNDYxNTc2MTA0NjA2MTAzMzI1NjViNWI2MDIwODIwMjkwNTA2MDIwODEwMTkwNTA5MTkwNTA1NjViNjAwMDgxNjAwNzBiOTA1MDkxOTA1MDU2NWI2MTA0ODg4MTYxMDQ3MjU2NWI4MTE0NjEwNDkzNTc2MDAwODBmZDViNTA1NjViNjAwMDgxMzU5MDUwNjEwNGE1ODE2MTA0N2Y1NjViOTI5MTUwNTA1NjViNjAwMDYwNDA4Mjg0MDMxMjE1NjEwNGMxNTc2MTA0YzA2MTAzZGU1NjViNWI2MTA0Y2I2MDQwNjEwMzkyNTY1YjkwNTA2MDAwNjEwNGRiODQ4Mjg1MDE2MTA0MzE1NjViNjAwMDgzMDE1MjUwNjAyMDYxMDRlZjg0ODI4NTAxNjEwNDk2NTY1YjYwMjA4MzAxNTI1MDkyOTE1MDUwNTY1YjYwMDA2MTA1MGU2MTA1MDk4NDYxMDQ0NjU2NWI2MTAzOTI1NjViOTA1MDgwODM4MjUyNjAyMDgyMDE5MDUwNjA0MDg0MDI4MzAxODU4MTExMTU2MTA1MzE1NzYxMDUzMDYxMDNkOTU2NWI1YjgzNWI4MTgxMTAxNTYxMDU1YTU3ODA2MTA1NDY4ODgyNjEwNGFiNTY1Yjg0NTI2MDIwODQwMTkzNTA1MDYwNDA4MTAxOTA1MDYxMDUzMzU2NWI1MDUwNTA5MzkyNTA1MDUwNTY1YjYwMDA4MjYwMWY4MzAxMTI2MTA1Nzk1NzYxMDU3ODYxMDMxYzU2NWI1YjgxMzU2MTA1ODk4NDgyNjAyMDg2MDE2MTA0ZmI1NjViOTE1MDUwOTI5MTUwNTA1NjViNjAwMDY3ZmZmZmZmZmZmZmZmZmZmZjgyMTExNTYxMDVhZDU3NjEwNWFjNjEwMzMyNTY1YjViNjAyMDgyMDI5MDUwNjAyMDgxMDE5MDUwOTE5MDUwNTY1YjYwMDA2MDYwODI4NDAzMTIxNTYxMDVkNDU3NjEwNWQzNjEwM2RlNTY1YjViNjEwNWRlNjA2MDYxMDM5MjU2NWI5MDUwNjAwMDYxMDVlZTg0ODI4NTAxNjEwNDMxNTY1YjYwMDA4MzAxNTI1MDYwMjA2MTA2MDI4NDgyODUwMTYxMDQzMTU2NWI2MDIwODMwMTUyNTA2MDQwNjEwNjE2ODQ4Mjg1MDE2MTA0OTY1NjViNjA0MDgzMDE1MjUwOTI5MTUwNTA1NjViNjAwMDYxMDYzNTYxMDYzMDg0NjEwNTkyNTY1YjYxMDM5MjU2NWI5MDUwODA4MzgyNTI2MDIwODIwMTkwNTA2MDYwODQwMjgzMDE4NTgxMTExNTYxMDY1ODU3NjEwNjU3NjEwM2Q5NTY1YjViODM1YjgxODExMDE1NjEwNjgxNTc4MDYxMDY2ZDg4ODI2MTA1YmU1NjViODQ1MjYwMjA4NDAxOTM1MDUwNjA2MDgxMDE5MDUwNjEwNjVhNTY1YjUwNTA1MDkzOTI1MDUwNTA1NjViNjAwMDgyNjAxZjgzMDExMjYxMDZhMDU3NjEwNjlmNjEwMzFjNTY1YjViODEzNTYxMDZiMDg0ODI2MDIwODYwMTYxMDYyMjU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwNjA2MDgyODQwMzEyMTU2MTA2Y2Y1NzYxMDZjZTYxMDNkZTU2NWI1YjYxMDZkOTYwNjA2MTAzOTI1NjViOTA1MDYwMDA2MTA2ZTk4NDgyODUwMTYxMDQzMTU2NWI2MDAwODMwMTUyNTA2MDIwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwNzBkNTc2MTA3MGM2MTAzZTM1NjViNWI2MTA3MTk4NDgyODUwMTYxMDU2NDU2NWI2MDIwODMwMTUyNTA2MDQwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwNzNkNTc2MTA3M2M2MTAzZTM1NjViNWI2MTA3NDk4NDgyODUwMTYxMDY4YjU2NWI2MDQwODMwMTUyNTA5MjkxNTA1MDU2NWI2MDAwNjEwNzY4NjEwNzYzODQ2MTAzYWQ1NjViNjEwMzkyNTY1YjkwNTA4MDgzODI1MjYwMjA4MjAxOTA1MDYwMjA4NDAyODMwMTg1ODExMTE1NjEwNzhiNTc2MTA3OGE2MTAzZDk1NjViNWI4MzViODE4MTEwMTU2MTA3ZDI1NzgwMzU2N2ZmZmZmZmZmZmZmZmZmZmY4MTExMTU2MTA3YjA1NzYxMDdhZjYxMDMxYzU2NWI1YjgwODYwMTYxMDdiZDg5ODI2MTA2Yjk1NjViODU1MjYwMjA4NTAxOTQ1MDUwNTA2MDIwODEwMTkwNTA2MTA3OGQ1NjViNTA1MDUwOTM5MjUwNTA1MDU2NWI2MDAwODI=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwonMQNH/8oQwpmBjipZVnItBbMKcjsvfYjheyN5ZSJy6p8BNDcAN1D6kT2E8J6FyNGgwI2ZnbqgYQs8bQugEiDwoJCJ2Z26oGELYKEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQidmduqBhC8ChICGAISAhgDGKPY6zkiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBlhcSAxiaCCKOFzYwMWY4MzAxMTI2MTA3ZjE1NzYxMDdmMDYxMDMxYzU2NWI1YjgxMzU2MTA4MDE4NDgyNjAyMDg2MDE2MTA3NTU1NjViOTE1MDUwOTI5MTUwNTA1NjViNjAwMDYwMjA4Mjg0MDMxMjE1NjEwODIwNTc2MTA4MWY2MTAzMTI1NjViNWI2MDAwODIwMTM1NjdmZmZmZmZmZmZmZmZmZmZmODExMTE1NjEwODNlNTc2MTA4M2Q2MTAzMTc1NjViNWI2MTA4NGE4NDgyODUwMTYxMDdkYzU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwNjAyMDgyODQwMzEyMTU2MTA4Njk1NzYxMDg2ODYxMDMxMjU2NWI1YjYwMDA2MTA4Nzc4NDgyODUwMTYxMDQzMTU2NWI5MTUwNTA5MjkxNTA1MDU2NWI2MDAwODE5MDUwOTE5MDUwNTY1YjYxMDg5MzgxNjEwODgwNTY1YjgyNTI1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA2MTA4YWU2MDAwODMwMTg0NjEwODhhNTY1YjkyOTE1MDUwNTY1YjYwMDA4MjgyNTI2MDIwODIwMTkwNTA5MjkxNTA1MDU2NWI3ZjQzNzI3OTcwNzQ2ZjIwNTQ3MjYxNmU3MzY2NjU3MjIwNDY2MTY5NmM2NTY0MDAwMDAwMDAwMDAwMDAwMDAwMDA2MDAwODIwMTUyNTA1NjViNjAwMDYxMDhmYjYwMTY4MzYxMDhiNDU2NWI5MTUwNjEwOTA2ODI2MTA4YzU1NjViNjAyMDgyMDE5MDUwOTE5MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA4MTgxMDM2MDAwODMwMTUyNjEwOTJhODE2MTA4ZWU1NjViOTA1MDkxOTA1MDU2NWI2MTA5M2E4MTYxMDQwODU2NWI4MjUyNTA1MDU2NWI2MDAwNjAyMDgyMDE5MDUwNjEwOTU1NjAwMDgzMDE4NDYxMDkzMTU2NWI5MjkxNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgxOTA1MDkyOTE1MDUwNTY1YjYwMDA1YjgzODExMDE1NjEwOThmNTc4MDgyMDE1MTgxODQwMTUyNjAyMDgxMDE5MDUwNjEwOTc0NTY1YjYwMDA4NDg0MDE1MjUwNTA1MDUwNTY1YjYwMDA2MTA5YTY4MjYxMDk1YjU2NWI2MTA5YjA4MTg1NjEwOTY2NTY1YjkzNTA2MTA5YzA4MTg1NjAyMDg2MDE2MTA5NzE1NjViODA4NDAxOTE1MDUwOTI5MTUwNTA1NjViNjAwMDYxMDlkODgyODQ2MTA5OWI1NjViOTE1MDgxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTYwMDMwYjkwNTA5MTkwNTA1NjViNjEwOWY5ODE2MTA5ZTM1NjViODExNDYxMGEwNDU3NjAwMDgwZmQ1YjUwNTY1YjYwMDA4MTUxOTA1MDYxMGExNjgxNjEwOWYwNTY1YjkyOTE1MDUwNTY1YjYwMDA2MDIwODI4NDAzMTIxNTYxMGEzMjU3NjEwYTMxNjEwMzEyNTY1YjViNjAwMDYxMGE0MDg0ODI4NTAxNjEwYTA3NTY1YjkxNTA1MDkyOTE1MDUwNTY1YjYwMDA4MTUxOTA1MDkxOTA1MDU2NWI2MDAwODI4MjUyNjAyMDgyMDE5MDUwOTI5MTUwNTA1NjViNjAwMDgxOTA1MDYwMjA4MjAxOTA1MDkxOTA1MDU2NWI2MTBhN2U4MTYxMDQwODU2NWI4MjUyNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgyODI1MjYwMjA4MjAxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTkwNTA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjEwYWI5ODE2MTA0NzI1NjViODI1MjUwNTA1NjViNjA0MDgyMDE2MDAwODIwMTUxNjEwYWQ1NjAwMDg1MDE4MjYxMGE3NTU2NWI1MDYwMjA4MjAxNTE2MTBhZTg2MDIwODUwMTgyNjEwYWIwNTY1YjUwNTA1MDUwNTY1YjYwMDA2MTBhZmE4MzgzNjEwYWJmNTY1YjYwNDA4MzAxOTA1MDkyOTE1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjAwMDYxMGIxZTgyNjEwYTg0NTY1YjYxMGIyODgxODU2MTBhOGY1NjViOTM1MDYxMGIzMzgzNjEwYWEwNTY1YjgwNjAwMDViODM4MTEwMTU2MTBiNjQ1NzgxNTE2MTBiNGI4ODgyNjEwYWVlNTY1Yjk3NTA2MTBiNTY4MzYxMGIwNjU2NWI5MjUwNTA2MDAxODEwMTkwNTA2MTBiMzc1NjViNTA4NTkzNTA1MDUwNTA5MjkxNTA1MDU2NWI2MDAwODE1MTkwNTA5MTkwNTA1NjViNjAwMDgyODI1MjYwMjA4MjAxOTA1MDkyOTE1MDUwNTY1YjYwMDA4MTkwNTA2MDIwODIwMTkwNTA5MTkwNTA1NjViNjA2MDgyMDE2MDAwODIwMTUxNjEwYmIzNjAwMDg1MDE4MjYxMGE3NTU2NWI1MDYwMjA4MjAxNTE2MTBiYzY2MDIwODUwMTgyNjEwYTc1NTY1YjUwNjA0MDgyMDE1MTYxMGJkOTYwNDA4NTAxODI2MTBhYjA1NjViNTA1MDUwNTA1NjViNjAwMDYxMGJlYjgzODM2MTBiOWQ1NjViNjA2MDgzMDE5MDUwOTI5MTUwNTA1NjViNjAwMDYwMjA4MjAxOTA1MDkxOTA1MDU2NWI2MDAwNjEwYzBmODI2MTBiNzE1NjViNjEwYzE5ODE4NTYxMGI3YzU2NWI5MzUwNjEwYzI0ODM2MTBiOGQ1NjViODA2MDAwNWI4MzgxMTAxNTYxMGM1NTU3ODE1MTYxMGMzYzg4ODI2MTBiZGY1NjViOTc1MDYxMGM0NzgzNjEwYmY3NTY1YjkyNTA1MDYwMDE4MTAxOTA1MDYxMGMyODU2NWI1MDg1OTM1MDUwNTA1MDkyOTE1MDUwNTY1YjYwMDA2MDYwODMwMTYwMDA4MzAxNTE2MTBjN2E2MDAwODYwMTgyNjEwYTc1NTY1YjUwNjAyMDgzMDE1MTg0ODIwMzYwMjA4NjAxNTI2MTBjOTI4MjgyNjEwYjEzNTY1YjkxNTA1MDYwNDA4MzAxNTE4NDgyMDM2MDQwODYwMTUyNjEwY2FjODI4MjYxMGMwNDU2NWI5MTUwNTA4MDkxNTA1MDkyOTE1MDUwNTY1YjYwMDA2MTBjYzU4MzgzNjEwYzYyNTY1YjkwNTA5MjkxNTA1MDU2NWI2MDAwNjAyMDgyMDE5MDUwOTE5MDUwNTY1YjYwMDA2MTBjZTU4MjYxMGE0OTU2NWI2MTBjZWY4MTg1NjEwYTU0NTY1YjkzNTA4MzYwMjA4MjAyODUwMTYxMGQwMTg1NjEwYTY1NTY1YjgwNjAwMDViODU4MTEwMTU2MTBkM2Q1Nzg0ODQwMzg5NTI4MTUxNjEwZDFlODU4MjYxMGNiOTU2NWI5NDUwNjEwZDI5ODM2MTBjY2Q1NjViOTI1MDYwMjA4YTAxOTk1MDUwNjAwMTgxMDE5MDUwNjEwZDA1NTY1YjUwODI5NzUwODc5NTUwNTA1MDUwNTA1MDkyOTE1MDUwNTY1YjYwMDA2MDIwODIwMTkwNTA4MTgxMDM2MDAwODMwMTUyNjEwZDY5ODE4NDYxMGNkYTU2NWI5MDUwOTI5MTUwNTA1NmZlYTI2NDY5NzA2NjczNTgyMjEyMjAxODI5MWU4ZjA2YmY3ZTNjMzc3OGEyMGUwNjhhZWY0NDAyODE4NWQyOGVkNWQyYWU3MzMxNDNiNTg4Zjc2MTYwNjQ3MzZmNmM2MzQzMDAwODEwMDAzMw==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwzdJ2ougcrL/DojEv9MOoVTT9oEfrfrrT4W7eO8zcDNlU6/QEm7V77z1fSkP0rat7GgwI2ZnbqgYQi9LzuwMiDwoJCJ2Z26oGELwKEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiemduqBhC+ChICGAISAhgDGJb7rp0CIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5CRQoDGJoIGiISIBUp/S1oU8d4lLZeZdJGlSuyyQP698zLCyq4pgnBiFFNIJChD0IFCIDO2gNSAFoAagtjZWxsYXIgZG9vcg==","b64Record":"CiUIFiIDGJsIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCwZfeLrbajAyTl+7xsOGsCJfu7o1NZyRvJoy0mvAbDfIT6v+lewMJiycYvmg7JcgwaDAjamduqBhDr3vDLASIPCgkInpnbqgYQvgoSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjDA2eIGQtwdCgMYmwgSpxtggGBAUjSAFWEAEFdgAID9W1BgBDYQYQA2V2AANWDgHIBjDtBydhRhADtXgGN8Qa0sFGEAV1dbYACA/VthAFVgBIA2A4EBkGEAUJGQYQgKVlthAIdWWwBbYQBxYASANgOBAZBhAGyRkGEIU1ZbYQDeVltgQFFhAH6RkGEImVZbYEBRgJEDkPNbYABhAJKCYQHzVluQUGAWYAMLgRRhANpXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhANGQYQkRVltgQFGAkQOQ/VtQUFZbYACAYABhAWdz//////////////////////////8WY3xBrSxg4BuFYEBRYCQBYQEVkZBhCUBWW2BAUWAggYMDA4FSkGBAUpB7/////////////////////////////////////xkWYCCCAYBRe/////////////////////////////////////+DgYMWF4NSUFBQUGBAUWEBf5GQYQnMVltgAGBAUYCDA4FgAIZa8ZFQUD2AYACBFGEBvFdgQFGRUGAfGWA/PQEWggFgQFI9glI9YABgIIQBPmEBwVZbYGCRUFtQkVCRUIFhAdJXYBVhAedWW4CAYCABkFGBAZBhAeaRkGEKHFZbW2ADC5JQUFCRkFBWW2AAgGAAYQFnc///////////////////////////FmMYmlVMYOAbhWBAUWAkAWECKpGQYQ1PVltgQFFgIIGDAwOBUpBgQFKQe/////////////////////////////////////8ZFmAgggGAUXv/////////////////////////////////////g4GDFheDUlBQUFBgQFFhApSRkGEJzFZbYABgQFGAgwOBYACGWvGRUFA9gGAAgRRhAtFXYEBRkVBgHxlgPz0BFoIBYEBSPYJSPWAAYCCEAT5hAtZWW2BgkVBbUJFQ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VltgAIFgAwuQUJGQUFZbYQn5gWEJ41ZbgRRhCgRXYACA/VtQVltgAIFRkFBhChaBYQnwVluSkVBQVltgAGAggoQDEhVhCjJXYQoxYQMSVltbYABhCkCEgoUBYQoHVluRUFCSkVBQVltgAIFRkFCRkFBWW2AAgoJSYCCCAZBQkpFQUFZbYACBkFBgIIIBkFCRkFBWW2EKfoFhBAhWW4JSUFBWW2AAgVGQUJGQUFZbYACCglJgIIIBkFCSkVBQVltgAIGQUGAgggGQUJGQUFZbYQq5gWEEclZbglJQUFZbYECCAWAAggFRYQrVYACFAYJhCnVWW1BgIIIBUWEK6GAghQGCYQqwVltQUFBQVltgAGEK+oODYQq/VltgQIMBkFCSkVBQVltgAGAgggGQUJGQUFZbYABhCx6CYQqEVlthCyiBhWEKj1Zbk1BhCzODYQqgVluAYABbg4EQFWELZFeBUWELS4iCYQruVluXUGELVoNhCwZWW5JQUGABgQGQUGELN1ZbUIWTUFBQUJKRUFBWW2AAgVGQUJGQUFZbYACCglJgIIIBkFCSkVBQVltgAIGQUGAgggGQUJGQUFZbYGCCAWAAggFRYQuzYACFAYJhCnVWW1BgIIIBUWELxmAghQGCYQp1VltQYECCAVFhC9lgQIUBgmEKsFZbUFBQUFZbYABhC+uDg2ELnVZbYGCDAZBQkpFQUFZbYABgIIIBkFCRkFBWW2AAYQwPgmELcVZbYQwZgYVhC3xWW5NQYQwkg2ELjVZbgGAAW4OBEBVhDFVXgVFhDDyIgmEL31Zbl1BhDEeDYQv3VluSUFBgAYEBkFBhDChWW1CFk1BQUFCSkVBQVltgAGBggwFgAIMBUWEMemAAhgGCYQp1VltQYCCDAVGEggNgIIYBUmEMkoKCYQsTVluRUFBgQIMBUYSCA2BAhgFSYQysgoJhDARWW5FQUICRUFCSkVBQVltgAGEMxYODYQxiVluQUJKRUFBWW2AAYCCCAZBQkZBQVltgAGEM5YJhCklWW2EM74GFYQpUVluTUINgIIIChQFhDQGFYQplVluAYABbhYEQFWENPVeEhAOJUoFRYQ0ehYJhDLlWW5RQYQ0pg2EMzVZbklBgIIoBmVBQYAGBAZBQYQ0FVltQgpdQh5VQUFBQUFCSkVBQVltgAGAgggGQUIGBA2AAgwFSYQ1pgYRhDNpWW5BQkpFQUFb+omRpcGZzWCISIBgpHo8Gv348N3iiDgaK70QCgYXSjtXSrnMxQ7WI92FgZHNvbGNDAAgQADMigAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKMCaDDoDGJsIShYKFAAAAAAAAAAAAAAAAAAAAAAAAAQbcgcKAxibCBABUhYKCQoCGAIQ/7LFDQoJCgIYYhCAs8UN"},{"b64Body":"Cg8KCQiemduqBhDEChICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxiWCBoxKi8IARIrCiISIFE9JQCut3tV/l0f0xzEmB0BYpZVWqIg3CuVsEC6FZqCCgVCAxibCA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwWvG8Bvsh+gNg/FWCvGbwmOQWD8/o1ww7kfF0ArsvLbap4AWlDY1p3Of2HvRXBJKxGgwI2pnbqgYQy9mmvwMiDwoJCJ6Z26oGEMQKEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQifmduqBhDKChICGAISAhgDGMrzGCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOejgSAxiXCBoxKi8IARIrCiISIFE9JQCut3tV/l0f0xzEmB0BYpZVWqIg3CuVsEC6FZqCCgVCAxibCA==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwcFEqOZXbwVS2eTbzWAOMT+OvZM94KqZerp3/33UCmYOkJ8gQLIpE4A4eSt9j0HNVGgwI25nbqgYQs/ih0gEiDwoJCJ+Z26oGEMoKEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQifmduqBhDMChICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo460QUKAxibCBCAkvQBIsQFDtBydgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFv/////////////////////////////////////////OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFv/////////////////////////////////////////OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA","b64Record":"CiUIFiIDGJsIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjBNiWk46LhRAVale3FYWRIMOgHRwoUe17ydOCslHoYCjkIG9a2158s3lS1qbKlU6bAaDAjbmduqBhCz0YfZAyIPCgkIn5nbqgYQzAoSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCAmKtsOo0CCgMYmwgigAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKICowwFSGAoKCgIYAhD/r9bYAQoKCgIYYhCAsNbYAQ=="},{"b64Body":"ChEKCQifmduqBhDMChICGAIgAXIbEhkKAxiZCBIICgMYlggQxwESCAoDGJcIEMgB","b64Record":"CgIIFhIwxf6OcfTlru7059xAuYdT8f8+Ghv51TEmVhL1kRlIqG+3Mhnhrv58xbQSw0ja41GGGgwI25nbqgYQtNGH2QMiEQoJCJ+Z26oGEMwKEgIYAiABOvwFCgMY5wISIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWKIrcAVCDg+4BYsQFGJpVTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFv/////////////////////////////////////////OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFv/////////////////////////////////////////OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAagMYmwhSAFoZCgMYmQgSCAoDGJYIEMcBEggKAxiXCBDIAXoMCNuZ26oGELPRh9kD"}]},"hapiTransferFromForFungibleToken":{"placeholderNum":1052,"encodedItems":[{"b64Body":"Cg8KCQikmduqBhDoChICGAISAhgDGOy4wBgiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlo0CiISINnrvUu1u9h66ahfzDA0eUgfwuQ18d6c4lc++WClfJ3lEICglKWNHUoFCIDO2gNwBQ==","b64Record":"CiUIFhIDGJ0IKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjD6FBDG5OQJhT/BmI7670K39expFvV+VdId6gPZ7ZyHvP2zF66cqIpz/RT2G+AdWckaDAjgmduqBhCLrc22ASIPCgkIpJnbqgYQ6AoSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIbCgsKAhgCEP+/qMqaOgoMCgMYnQgQgMCoypo6"},{"b64Body":"Cg8KCQikmduqBhDqChICGAISAhgDGOy4wBgiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISIIP5dtqQkLcbxCuxkG8Ao9f5hRY35RjDfgeE9trlWsqqEICU69wDSgUIgM7aA3AF","b64Record":"CiUIFhIDGJ4IKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCdnvvjIpTtM2Qd17ArlMTiDAyGGD1zJAdiU7V+fkD7ggG/dHCg/BZznJVLRSG6mSwaDAjgmduqBhDzoM6kAyIPCgkIpJnbqgYQ6goSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxieCBCAqNa5Bw=="},{"b64Body":"Cg8KCQilmduqBhDsChICGAISAhgDGOy4wBgiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISINXlbAdcHXyqeDQxNORYFEhP09qrjcNrlwMEGwH8QcmUEICU69wDSgUIgM7aA3AF","b64Record":"CiUIFhIDGJ8IKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjABRed0eXytnrh9ycK0C77fsS6KQrzzhJH0tuNDTDiaBbf8Edi/3Dg5YFvWkk+czg0aDAjhmduqBhCL3/KyASIPCgkIpZnbqgYQ7AoSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxifCBCAqNa5Bw=="},{"b64Body":"Cg8KCQilmduqBhDuChICGAISAhgDGIWupekCIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAVIKBlRva2VuQRIIQk5OWldZRkEgCioDGJ0IUiISIMBAG9sQaFZXOo641u/cHA/TvoWqERYIYwNDtOWlZmm9agwI4ee1rgYQkNmxnQOQAQGYAegH","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGKAIEjDfs08IKz9DY2CWG7pNV8LykSH+w6usmdMBWXs2SX9K9rzx9tRKtdlkrs5/3SpncIEaDAjhmduqBhDzoOCeAyIPCgkIpZnbqgYQ7goSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWg4KAxigCBIHCgMYnQgQFHIKCgMYoAgSAxidCA=="},{"b64Body":"Cg8KCQimmduqBhDwChICGAISAhgDGP7LzSwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjooBjwESDAji57WuBhDg49O0ARptCiISILHcLkK8jimdzr58LTjR5EPwxXbdw0kggAG/ga9JpL+RCiM6IQKDUvwYGdOoT2NvsMLuWWt45JXFDgw84peG0a+BCcd14QoiEiDxTpNhA4qvowU6ekGCnw9SMrZ0nIeh0HN739573g4BeSIMSGVsbG8gV29ybGQhKgAyAA==","b64Record":"CiUIFhoDGKEIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDcr1cAFm7NkdvJ4iFUalrNw/FGBcl4BuusxmzKKTToGtIVncvYe4VJI7vb9cGI9ZoaDAjimduqBhCTyInOASIPCgkIppnbqgYQ8AoSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQimmduqBhD0ChICGAISAhgDGIydjj4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjpoBiCAKAxihCCKAIDYwODA2MDQwNTIzNDgwMTU2MTAwMTA1NzYwMDA4MGZkNWI1MDYxMTFlODgwNjEwMDIwNjAwMDM5NjAwMGYzZmU2MDgwNjA0MDUyMzQ4MDE1NjEwMDEwNTc2MDAwODBmZDViNTA2MDA0MzYxMDYxMDBhOTU3NjAwMDM1NjBlMDFjODA2MzZmYzNjYmFmMTE2MTAwNzE1NzgwNjM2ZmMzY2JhZjE0NjEwMTMwNTc4MDYzN2M0MWFkMmMxNDYxMDE1NjU3ODA2MzhmOGQ3Zjk5MTQ2MTAxNjk1NzgwNjNhZjk5YzYzMzE0NjEwMTdjNTc4MDYzZDYxNGNkYjgxNDYxMDE4ZjU3ODA2M2YyYzMxZmY0MTQ2MTAxYjA1NzYwMDA4MGZkNWI4MDYzMTNhOGVkNTMxNDYxMDBhZTU3ODA2MzNiM2JmZjBmMTQ2MTAwYzM1NzgwNjMzYzRkZDMyZTE0NjEwMGU5NTc4MDYzNTA4MWRlZDMxNDYxMDEwYTU3ODA2MzU5M2Q2ZTgyMTQ2MTAxMWQ1NzViNjAwMDgwZmQ1YjYxMDBjMTYxMDBiYzM2NjAwNDYxMDkyYjU2NWI2MTAxZGQ1NjViMDA1YjYxMDBkNjYxMDBkMTM2NjAwNDYxMDk3YzU2NWI2MTAyNDM1NjViNjA0MDUxOTA4MTUyNjAyMDAxNWI2MDQwNTE4MDkxMDM5MGYzNWI2MTAwZmM2MTAwZjczNjYwMDQ2MTA5YTA1NjViNjEwMzFkNTY1YjYwNDA1MTYxMDBlMDkyOTE5MDYxMGE5MzU2NWI2MTAwYzE2MTAxMTgzNjYwMDQ2MTA5MmI1NjViNjEwNDA0NTY1YjYxMDBkNjYxMDEyYjM2NjAwNDYxMGI3ZjU2NWI2MTA0MTI1NjViNjEwMTQzNjEwMTNlMzY2MDA0NjEwYzg4NTY1YjYxMDRlZjU2NWI2MDQwNTE2MDA3OTE5MDkxMGI4MTUyNjAyMDAxNjEwMGUwNTY1YjYxMDBkNjYxMDE2NDM2NjAwNDYxMDk3YzU2NWI2MTA1MWI1NjViNjEwMTQzNjEwMTc3MzY2MDA0NjEwZTQ5NTY1YjYxMDU0OTU2NWI2MTAxNDM2MTAxOGEzNjYwMDQ2MTBlNDk1NjViNjEwNTdmNTY1YjYxMDFhMjYxMDE5ZDM2NjAwNDYxMDk3YzU2NWI2MTA1YjU1NjViNjA0MDUxNjEwMGUwOTI5MTkwNjEwZTgyNTY1YjYxMDFjMzYxMDFiZTM2NjAwNDYxMGU0OTU2NWI2MTA2YmY1NjViNjA0MDgwNTE2MDA3OTM5MDkzMGI4MzUyOTAxNTE1NjAyMDgzMDE1MjAxNjEwMGUwNTY1YjYwMDA2MTAxZWI4NTg1ODU4NTYxMDc4YTU2NWI2MDA3MGI5MDUwNjAxNjgxMTQ2MTAyM2M1NzYwNDA1MTYyNDYxYmNkNjBlNTFiODE1MjYwMjA2MDA0ODIwMTUyNjAxNTYwMjQ4MjAxNTI3NDU0NzI2MTZlNzM2NjY1NzIyMDY2NzI2ZjZkMjA2NjYxNjk2YzY1NjQyMTYwNTgxYjYwNDQ4MjAxNTI2MDY0MDE2MDQwNTE4MDkxMDM5MGZkNWI1MDUwNTA1MDUwNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MjE2NjAyNDgyMDE1MjYwMDA5MDgxOTA4MTkwNjEwMTY3OTA2MzNiM2JmZjBmNjBlMDFiOTA2MDQ0MDE1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE4MDUxNjAwMTYwMDE2MGUwMWIwMzE2NjAwMTYwMDE2MGUwMWIwMzE5OTA5NDE2OTM5MDkzMTc5MDkyNTI5MDUxNjEwMmFiOTE5MDYxMGViYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwMmU4NTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwMmVkNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTAyZmU1NzYwMTU2MTAzMTI1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTAzMTI5MTkwNjEwZWVhNTY1YjYwMDMwYjk0OTM1MDUwNTA1MDU2NWI2MDAwNjEwMzI3NjEwOGMwNTY1YjYwNDA4MDUxNjAwMTYwMDE2MGEwMWIwMzg2MTY2MDI0ODIwMTUyNjA0NDgwODIwMTg2OTA1MjgyNTE4MDgzMDM5MDkxMDE4MTUyNjA2NDkwOTEwMTgyNTI2MDIwODEwMTgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MzFlMjZlOTk3NjBlMTFiMTc5MDUyOTA1MTYwMDA5MTgyOTE2MTAxNjc5MTYxMDM4MTkxNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTAzYmU1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTAzYzM1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA2MTAzZDA2MTA4YzA1NjViODI2MTAzZGQ1NzYwMTU4MTYxMDNmMTU2NWI4MTgwNjAyMDAxOTA1MTgxMDE5MDYxMDNmMTkxOTA2MTBmNTU1NjViNjAwMzkxOTA5MTBiOTg5MDk3NTA5NTUwNTA1MDUwNTA1MDU2NWI2MDAwNjEwMWViODU4NTg1ODU2MTA4N2I1NjViNjAwMDgwNjAwMDYxMDE2NzYwMDE2MDAxNjBhMDFiMDMxNjYzNTkzZDZlODI2MGUwMWI4Njg2NjA0MDUxNjAyNDAxNjEwNDNlOTI5MTkwNjExMDMwNTY1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE4MDUxNjAwMTYwMDE2MGUwMWIwMzE2NjAwMTYwMDE2MGUwMWIwMzE5OTA5NDE2OTM5MDkzMTc5MDkyNTI5MDUxNjEwNDdjOTE5MDYxMGViYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwNGI5NTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwNGJlNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTA0Y2Y1NzYwMTU2MTA0ZTM1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTA0ZTM5MTkwNjEwZWVhNTY1YjYwMDMwYjk1OTQ1MDUwNTA1MDUwNTY1YjYwMDA4MDYwMDA2MTAxNjc2MDAxNjAwMTYwYTAxYjAzMTY2MzZmYzNjYmFmNjBlMDFiODY4NjYwNDA1MTYwMjQwMTYxMDQzZTkyOTE5MDYxMTA3MzU2NWI2MDQwNTE2MDAxNjAwMTYwYTAxYjAzODIxNjYwMjQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjMxZjEwNmI0YjYwZTIxYjkwNjA0NDAxNjEwMjZkNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MzgxMTY2MDI0ODMwMTUyODIxNjYwNDQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjM4ZjhkN2Y5OTYwZTAxYjkwNjA2NDAxNjEwNDNlNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MzgxMTY2MDI0ODMwMTUyODIxNjYwNDQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjNhZjk5YzYzMzYwZTAxYjkwNjA2NDAxNjEwNDNlNTY1YjYwNDA4MDUxNjA2MDgxMDE4MjUyNjAwMDgwODI1MjYwMjA4MDgzMDE4MjkwNTI4Mjg0MDE4MjkwNTI4MzUxNjAwMTYwMDE2MGEwMWIwMzg2MTY2MDI0ODA4MzAxOTE5MDkxNTI4NTUxODA4MzAzOTA5MTAxODE1MjYwNDQ5MDkxMDE4NTUyOTA4MTAxODA1MTYwMDE2MDAxNjBlMDFiMDMxNjYzMWFjMjk5Yjc2MGUzMWIxNzkwNTI5MjUxOTA5MjgzOTE4MjkxNjEwMTY3OTE2MTA2Mjc5MTkwNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTA2NjQ1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTA2Njk1NjViNjA2MDkxNTA1YjUwNjA0MDgwNTE2MDYwODEwMTgyNTI2MDAwODA4MjUyNjAyMDgyMDE4MTkwNTI5MTgxMDE5MTkwOTE1MjkxOTM1MDkxNTA4MjYxMDY5OTU3NjAxNTgxNjEwNmFkNTY1YjgxODA2MDIwMDE5MDUxODEwMTkwNjEwNmFkOTE5MDYxMTBmODU2NWI2MDAzOTE5MDkxMGI5NzkwOTY1MDk0NTA1MDUwNTA1MDU2NWI2MDQwODA1MTYwMDE2MDAxNjBhMDFiMDM4NDgxMTY2MDI0ODMwMTUyODMxNjYwNDQ4MDgzMDE5MTkwOTE1MjgyNTE4MDgzMDM5MDkxMDE4MTUyNjA2NDkwOTEwMTgyNTI2MDIwODEwMTgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MzNjYjBjN2ZkNjBlMjFiMTc5MDUyOTA1MTYwMDA5MTgyOTE4MjkxODI5MTYxMDE2NzkxNjEwNzIxOTE2MTBlYmM1NjViNjAwMDYwNDA1MTgwODMwMzgxNjAwMDg2NWFmMTkxNTA1MDNkODA2MDAwODExNDYxMDc1ZTU3NjA0MDUxOTE1MDYwMWYxOTYwM2YzZDAxMTY4MjAxNjA0MDUyM2Q4MjUyM2Q2MDAwNjAyMDg0MDEzZTYxMDc2MzU2NWI2MDYwOTE1MDViNTA5MTUwOTE1MDgxNjEwNzc2NTc2MDE1NjAwMDYxMDZhZDU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDZhZDkxOTA2MTExNjM1NjViNjA0MDUxNjAwMTYwMDE2MGEwMWIwMzg1ODExNjYwMjQ4MzAxNTI4NDgxMTY2MDQ0ODMwMTUyODMxNjYwNjQ4MjAxNTI2MDg0ODEwMTgyOTA1MjYwMDA5MDgxOTA4MTkwNjEwMTY3OTA2MzBhZWQ2NWY1NjBlMTFiOTA2MGE0MDE1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwUznIfLWKMwN39wt1eI2O58NncWEhxOqX8UotTIilxVVEH8GDhaF5WUVuVNlLYO/NGgwI4pnbqgYQ6/3RvgMiDwoJCKaZ26oGEPQKEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQinmduqBhD6ChICGAISAhgDGPjR6j4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBiCASAxihCCKAIDgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MDAxNjAwMTYwZTAxYjAzMTk5MDk0MTY5MzkwOTMxNzkwOTI1MjkwNTE2MTA4MDk5MTkwNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTA4NDY1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTA4NGI1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA4MTYxMDg1YzU3NjAxNTYxMDg3MDU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDg3MDkxOTA2MTExOGY1NjViOTc5NjUwNTA1MDUwNTA1MDUwNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4NTgxMTY2MDI0ODMwMTUyODQ4MTE2NjA0NDgzMDE1MjgzMTY2MDY0ODIwMTUyNjA4NDgxMDE4MjkwNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjM5YjIzZDNkOTYwZTAxYjkwNjBhNDAxNjEwN2NiNTY1YjYwNDA1MTgwNjBhMDAxNjA0MDUyODA2MDAwMTUxNTgxNTI2MDIwMDE2MDAwNjAwMTYwMDE2MGEwMWIwMzE2ODE1MjYwMjAwMTYwNjA4MTUyNjAyMDAxNjA2MDgxNTI2MDIwMDE2MDAwNjAwMTYwMDE2MGEwMWIwMzE2ODE1MjUwOTA1NjViNjAwMTYwMDE2MGEwMWIwMzgxMTY4MTE0NjEwOTE4NTc2MDAwODBmZDViNTA1NjViODAzNTYxMDkyNjgxNjEwOTAzNTY1YjkxOTA1MDU2NWI2MDAwODA2MDAwODA2MDgwODU4NzAzMTIxNTYxMDk0MTU3NjAwMDgwZmQ1Yjg0MzU2MTA5NGM4MTYxMDkwMzU2NWI5MzUwNjAyMDg1MDEzNTYxMDk1YzgxNjEwOTAzNTY1YjkyNTA2MDQwODUwMTM1NjEwOTZjODE2MTA5MDM1NjViOTM5NjkyOTU1MDkyOTM2MDYwMDEzNTkyNTA1MDU2NWI2MDAwNjAyMDgyODQwMzEyMTU2MTA5OGU1NzYwMDA4MGZkNWI4MTM1NjEwOTk5ODE2MTA5MDM1NjViOTM5MjUwNTA1MDU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMDliMzU3NjAwMDgwZmQ1YjgyMzU2MTA5YmU4MTYxMDkwMzU2NWI5NDYwMjA5MzkwOTMwMTM1OTM1MDUwNTA1NjViNjAwMDViODM4MTEwMTU2MTA5ZTc1NzgxODEwMTUxODM4MjAxNTI2MDIwMDE2MTA5Y2Y1NjViODM4MTExMTU2MTA5ZjY1NzYwMDA4NDg0MDE1MjViNTA1MDUwNTA1NjViNjAwMDgxNTE4MDg0NTI2MTBhMTQ4MTYwMjA4NjAxNjAyMDg2MDE2MTA5Y2M1NjViNjAxZjAxNjAxZjE5MTY5MjkwOTIwMTYwMjAwMTkyOTE1MDUwNTY1YjgwNTExNTE1ODI1MjYwMDA2MDIwODIwMTUxNjAwMTYwMDE2MGEwMWIwMzgwODIxNjYwMjA4NjAxNTI2MDQwODQwMTUxOTE1MDYwYTA2MDQwODYwMTUyNjEwYTYwNjBhMDg2MDE4MzYxMDlmYzU2NWI5MTUwNjA2MDg0MDE1MTg1ODMwMzYwNjA4NzAxNTI2MTBhNzk4MzgyNjEwOWZjNTY1YjkyNTA1MDgwNjA4MDg1MDE1MTE2NjA4MDg2MDE1MjUwODA5MTUwNTA5MjkxNTA1MDU2NWI4MjYwMDcwYjgxNTI2MDQwNjAyMDgyMDE1MjYwMDA2MTBhYWY2MDQwODMwMTg0NjEwYTI4NTY1Yjk0OTM1MDUwNTA1MDU2NWI2MzRlNDg3YjcxNjBlMDFiNjAwMDUyNjA0MTYwMDQ1MjYwMjQ2MDAwZmQ1YjYwNDA1MTYwNjA4MTAxNjdmZmZmZmZmZmZmZmZmZmZmODExMTgyODIxMDE3MTU2MTBhZjA1NzYxMGFmMDYxMGFiNzU2NWI2MDQwNTI5MDU2NWI2MDQwODA1MTkwODEwMTY3ZmZmZmZmZmZmZmZmZmZmZjgxMTE4MjgyMTAxNzE1NjEwYWYwNTc2MTBhZjA2MTBhYjc1NjViNjA0MDUxNjBhMDgxMDE2N2ZmZmZmZmZmZmZmZmZmZmY4MTExODI4MjEwMTcxNTYxMGFmMDU3NjEwYWYwNjEwYWI3NTY1YjYwNDA1MTYwMWY4MjAxNjAxZjE5MTY4MTAxNjdmZmZmZmZmZmZmZmZmZmZmODExMTgyODIxMDE3MTU2MTBiNjU1NzYxMGI2NTYxMGFiNzU2NWI2MDQwNTI5MTkwNTA1NjViNjNmZmZmZmZmZjgxMTY4MTE0NjEwOTE4NTc2MDAwODBmZDViNjAwMDgwODI4NDAzNjA4MDgxMTIxNTYxMGI5MzU3NjAwMDgwZmQ1YjgzMzU2MTBiOWU4MTYxMDkwMzU2NWI5MjUwNjA2MDYwMWYxOTgyMDExMjE1NjEwYmIyNTc2MDAwODBmZDViNTA2MTBiYmI2MTBhY2Q1NjViNjAyMDg0MDEzNTYxMGJjOTgxNjEwYjZkNTY1YjgxNTI2MDQwODQwMTM1NjEwYmQ5ODE2MTA5MDM1NjViNjAyMDgyMDE1MjYwNjA4NDAxMzU2MTBiZWM4MTYxMGI2ZDU2NWI2MDQwODIwMTUyOTE5NDkxOTM1MDkwOTE1MDUwNTY1YjgwMTUxNTgxMTQ2MTA5MTg1NzYwMDA4MGZkNWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwYzI0NTc2MTBjMjQ2MTBhYjc1NjViNTA2MDFmMDE2MDFmMTkxNjYwMjAwMTkwNTY1YjYwMDA4MjYwMWY4MzAxMTI2MTBjNDM1NzYwMDA4MGZkNWI4MTM1NjEwYzU2NjEwYzUxODI2MTBjMGE1NjViNjEwYjNjNTY1YjgxODE1Mjg0NjAyMDgzODYwMTAxMTExNTYxMGM2YjU3NjAwMDgwZmQ1YjgxNjAyMDg1MDE2MDIwODMwMTM3NjAwMDkxODEwMTYwMjAwMTkxOTA5MTUyOTM5MjUwNTA1MDU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMGM5YjU3NjAwMDgwZmQ1YjYxMGNhNTgzMzU2MTA5MDM1NjViODIzNTkxNTA2N2ZmZmZmZmZmZmZmZmZmZmY4MDYwMjA4NTAxMzUxMTE1NjEwY2MzNTc2MDAwODBmZDViNjAyMDg0MDEzNTg0MDE4NTYwMWY4MjAxMTI2MTBjZDk1NzYwMDA4MGZkNWI4MTgxMzUxMTE1NjEwY2VhNTc2MTBjZWE2MTBhYjc1NjViNjEwY2ZhNjAyMDgyMzU2MDA1MWIwMTYxMGIzYzU2NWI4MTM1ODA4MjUyNjAyMDgwODMwMTkyOTE2MDA1MWI4NDAxMDE4ODgxMTExNTYxMGQxOTU3NjAwMDgwZmQ1YjYwMjA4NDAxNWI4MTgxMTAxNTYxMGUzYTU3ODU4MTM1MTExNTYxMGQzNDU3NjAwMDgwZmQ1YjgwMzU4NTAxNjAxZjE5NjA0MDgyOGQwMzgyMDExMjE1NjEwZDRkNTc2MDAwODBmZDViNjEwZDU1NjEwYWY2NTY1YjYwMjA4MzAxMzU4MTUyODg2MDQwODQwMTM1MTExNTYxMGQ2ZDU3NjAwMDgwZmQ1YjYwNDA4MzAxMzU4MzAxOTI1MDYwYTA4Mjg0OGYwMzAxMTIxNTYxMGQ4ODU3NjAwMDgwZmQ1YjYxMGQ5MDYxMGIxOTU2NWI5MTUwNjEwZDlmNjAyMDg0MDEzNTYxMGJmYzU2NWI2MDIwODMwMTM1ODI1MjYxMGRiMzYwNDA4NDAxMzU2MTA5MDM1NjViNjA0MDgzMDEzNTYwMjA4MzAxNTI4ODYwNjA4NDAxMzUxMTE1NjEwZGNlNTc2MDAwODBmZDViNjEwZGUxOGQ2MDIwNjA2MDg2MDEzNTg2MDEwMTYxMGMzMjU2NWI2MDQwODMwMTUyODg2MDgwODQwMTM1MTExNTYxMGRmNzU3NjAwMDgwZmQ1YjYxMGUwYThkNjAyMDYwODA4NjAxMzU4NjAxMDE2MTBjMzI1NjViNjA2MDgzMDE1MjYxMGUxYjYwYTA4NDAxNjEwOTFiNTY1YjYwODA4MzAxNTI2MDIwODE4MTAxOTI5MDkyNTI4NjUyOTQ4NTAxOTQ5MTkwOTEwMTkwNTA2MTBkMWU1NjViNTA5NTk4OTA5NzUwOTU1MDUwNTA1MDUwNTA1NjViNjAwMDgwNjA0MDgzODUwMzEyMTU2MTBlNWM1NzYwMDA4MGZkNWI4MjM1NjEwZTY3ODE2MTA5MDM1NjViOTE1MDYwMjA4MzAxMzU2MTBlNzc4MTYxMDkwMzU2NWI4MDkxNTA1MDkyNTA5MjkwNTA1NjViODI4MTUyNjA4MDgxMDE2MTA5OTk2MDIwODMwMTg0ODA1MTYzZmZmZmZmZmY5MDgxMTY4MzUyNjAyMDgwODMwMTUxNjAwMTYwMDE2MGEwMWIwMzE2OTA4NDAxNTI2MDQwOTE4MjAxNTExNjkxMDE1MjU2NWI2MDAwODI1MTYxMGVjZTgxODQ2MDIwODcwMTYxMDljYzU2NWI5MTkwOTEwMTkyOTE1MDUwNTY1YjgwNTE2MDAzODE5MDBiODExNDYxMDkyNjU3NjAwMDgwZmQ1YjYwMDA2MDIwODI4NDAzMTIxNTYxMGVmYzU3NjAwMDgwZmQ1YjYxMDk5OTgyNjEwZWQ4NTY1YjgwNTE2MTA5MjY4MTYxMDkwMzU2NWI2MDAwODI2MDFmODMwMTEyNjEwZjIxNTc2MDAwODBmZDViODE1MTYxMGYyZjYxMGM1MTgyNjEwYzBhNTY1YjgxODE1Mjg0NjAyMDgzODYwMTAxMTExNTYxMGY0NDU3NjAwMDgwZmQ1YjYxMGFhZjgyNjAyMDgzMDE2MDIwODcwMTYxMDljYzU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMGY2ODU3NjAwMDgwZmQ1YjYxMGY3MTgzNjEwZWQ4NTY1YjkxNTA2MDIwODMwMTUxNjdmZmZmZmZmZmZmZmZmZmZmODA4MjExMTU2MTBmOGU1NzYwMDA4MGZkNWI5MDg0MDE5MDYwYTA4Mjg3MDMxMjE1NjEwZmEyNTc2MDAwODBmZDViNjEwZmFhNjEwYjE5NTY1YjgyNTE2MTBmYjU4MTYxMGJmYzU2NWI4MTUyNjAyMDgzMDE1MTYxMGZjNTgxNjEwOTAzNTY1YjYwMjA4MjAxNTI2MDQwODMwMTUxODI4MTExMTU2MTBmZGM1NzYwMDA4MGZkNWI2MTBmZTg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwkfAJ7dMlaOvEmt9K13LzfvQfXU4dzuAmvFyTmZT6gOc0gAVGgYpQhBhpag2B9cR7GgwI45nbqgYQg4fbzQEiDwoJCKeZ26oGEPoKEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQinmduqBhCACxICGAISAhgDGNPltjEiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBmAgSAxihCCKQCDg4ODI4NjAxNjEwZjEwNTY1YjYwNDA4MzAxNTI1MDYwNjA4MzAxNTE4MjgxMTExNTYxMTAwMDU3NjAwMDgwZmQ1YjYxMTAwYzg4ODI4NjAxNjEwZjEwNTY1YjYwNjA4MzAxNTI1MDYxMTAxZTYwODA4NDAxNjEwZjA1NTY1YjYwODA4MjAxNTI4MDkzNTA1MDUwNTA5MjUwOTI5MDUwNTY1YjYwMDE2MDAxNjBhMDFiMDM4MzE2ODE1MjYwODA4MTAxNjEwOTk5NjAyMDgzMDE4NDgwNTE2M2ZmZmZmZmZmOTA4MTE2ODM1MjYwMjA4MDgzMDE1MTYwMDE2MDAxNjBhMDFiMDMxNjkwODQwMTUyNjA0MDkxODIwMTUxMTY5MTAxNTI1NjViNjAwMDYwNDA4MDgzMDE2MDAxNjAwMTYwYTAxYjAzODYxNjg0NTI2MDIwODI4MTg2MDE1MjgxODY1MTgwODQ1MjYwNjA4NzAxOTE1MDYwNjA4MTYwMDUxYjg4MDEwMTkzNTA4Mjg4MDE2MDAwNWI4MjgxMTAxNTYxMTBlOTU3ODg4NjAzNjA1ZjE5MDE4NDUyODE1MTgwNTE4NzUyODUwMTUxODU4NzAxODg5MDUyNjExMGQ2ODg4ODAxODI2MTBhMjg1NjViOTY1MDUwOTI4NDAxOTI5MDg0MDE5MDYwMDEwMTYxMTBhYTU2NWI1MDkzOTk5ODUwNTA1MDUwNTA1MDUwNTA1MDU2NWI2MDAwODA4Mjg0MDM2MDgwODExMjE1NjExMTBjNTc2MDAwODBmZDViNjExMTE1ODQ2MTBlZDg1NjViOTI1MDYwNjA2MDFmMTk4MjAxMTIxNTYxMTEyOTU3NjAwMDgwZmQ1YjUwNjExMTMyNjEwYWNkNTY1YjYwMjA4NDAxNTE2MTExNDA4MTYxMGI2ZDU2NWI4MTUyNjA0MDg0MDE1MTYxMTE1MDgxNjEwOTAzNTY1YjYwMjA4MjAxNTI2MDYwODQwMTUxNjEwYmVjODE2MTBiNmQ1NjViNjAwMDgwNjA0MDgzODUwMzEyMTU2MTExNzY1NzYwMDA4MGZkNWI2MTExN2Y4MzYxMGVkODU2NWI5MTUwNjAyMDgzMDE1MTYxMGU3NzgxNjEwYmZjNTY1YjYwMDA2MDIwODI4NDAzMTIxNTYxMTFhMTU3NjAwMDgwZmQ1YjgxNTE4MDYwMDcwYjgxMTQ2MTA5OTk1NzYwMDA4MGZkZmVhMjY0Njk3MDY2NzM1ODIyMTIyMDkxZDY1YzY1ZWVhOTljOWFhMTYwOGYxODEyODA3NDMzOWQ0OWI0NmQ5ZjY2YWY5MTA4ZmEwYzRlN2Q2MmQyYTU2NDczNmY2YzYzNDMwMDA4MGIwMDMz","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwz6Tz64PW6uxb0AcPo4qtrCnAqc6UDw1/M4W+nnIlT38Tek6WyVxUvK114luGqSP6GgwI45nbqgYQ4++ivQMiDwoJCKeZ26oGEIALEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQiomduqBhCCCxICGAISAhgDGJb7rp0CIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5CRQoDGKEIGiISINc9d/7KU79HYAeZP9uHKPInlBs3biTR73ZLXmcRvZ24IJChD0IFCIDO2gNSAFoAagtjZWxsYXIgZG9vcg==","b64Record":"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"},{"b64Body":"Cg8KCQiomduqBhCDCxICGAISAhgDGIDC1y8iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIDExoRCgMYoAgSAxidCBoDGKIIIAo=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwKUonkU0wJlokEJG9o3+84vsC75j2rhkAoYNYTwHkHiMdOW7/8419tUwwcDjbwbZZGgsI5ZnbqgYQ6/DLBSIPCgkIqJnbqgYQgwsSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQipmduqBhCHCxICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxiiCBCgjQYihAETqO1TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs=","b64Record":"CiUIISIDGKIIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDCn+xBFWTQsgqGboXvnHb7BCG4DFg318KuQnh/6p/J7tMSFTLPp8Bs/6572ml4JN0aDAjlmduqBhDLiY3yASIPCgkIqZnbqgYQhwsSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCA19oCOtEBGsoBMHgwOGMzNzlhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE1NTQ3MjYxNmU3MzY2NjU3MjIwNjY3MjZmNmQyMDY2NjE2OTZjNjU2NDIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCiA8QRSFgoJCgIYAhD/rbUFCgkKAhhiEICutQU="},{"b64Body":"ChEKCQipmduqBhCHCxICGAIgAXIbEhkKAxigCBIHCgMYnwgQFhIJCgMYnQgQFRgB","b64Record":"CgMIpQISMKUaWoZyfiab6WdYcbAWn4kk8cnwh+w2odzWYukQSdnX/g1e4Ih6hJJJkoiLomGSOhoMCOWZ26oGEMyJjfIBIhEKCQipmduqBhCHCxICGAIgATrUAQoDGOcCEiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJRoYQU1PVU5UX0VYQ0VFRFNfQUxMT1dBTkNFKIVuUP3ABGKEARXay+oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2oDGKIIUgB6DAjlmduqBhDLiY3yAQ=="},{"b64Body":"Cg8KCQipmduqBhCJCxICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxiiCBCgjQYihAETqO1TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU=","b64Record":"CiUIFiIDGKIIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCYPjyCslsT0Cn/h5+qFU6vS94YSorfu9+gbFQ8mHKTsXQ6kDpeh8eV8PMJY0xUI/oaCwjmmduqBhDrsewBIg8KCQipmduqBhCJCxICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMIDX2gI6nwUKAxiiCCKAAgAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAogPEEMpADCgMYoAgSgAIAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAEAAAAAAAIAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiDd8lKtG+LIm2nCsGj8N42qlSun8WPEoRYo9VpN9SOz7xogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB0aIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQfIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVIWCgkKAhgCEP+ttQUKCQoCGGIQgK61BQ=="},{"b64Body":"ChEKCQipmduqBhCJCxICGAIgAXIbEhkKAxigCBIHCgMYnwgQChIJCgMYnQgQCRgB","b64Record":"CgIIFhIwV7pamJ+IDQea+X5g+AQzsFH4kmfbz+weo2gO1mxO9Zs1os84IqOSSn9/EuHc7iGJGgsI5pnbqgYQ7LHsASIRCgkIqZnbqgYQiQsSAhgCIAE6ugEKAxjnAhIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYohW5Q/cAEYoQBFdrL6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFagMYoghSAFoXCgMYoAgSBwoDGJ0IEAkSBwoDGJ8IEApyCgoDGKAIEgMYnwh6CwjmmduqBhDrsewB"},{"b64Body":"Cg8KCQiqmduqBhCLCxICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxiiCBCgjQYihAETqO1TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU=","b64Record":"CiUIFiIDGKIIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCKreAbKr34Rc2VjvkKOI6/DJJIiQ5Zwrl0hmyu4GKaXi6IhFzteX2tBwUfG7n93jUaDAjmmduqBhDjj+SLAiIPCgkIqpnbqgYQiwsSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCA19oCOp8FCgMYoggigAIAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAEAAAAAAAIAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKIDxBDKQAwoDGKAIEoACAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAABAAAAAAACAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABog3fJSrRviyJtpwrBo/DeNqpUrp/FjxKEWKPVaTfUjs+8aIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQdGiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHyIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSFgoJCgIYAhD/rbUFCgkKAhhiEICutQU="},{"b64Body":"ChEKCQiqmduqBhCLCxICGAIgAXIbEhkKAxigCBIHCgMYnwgQChIJCgMYnQgQCRgB","b64Record":"CgIIFhIwOkB3d2xP+b9UsoyGaDGHgokvPpxfLHmYC1+kKVjaKwQoDg7IIjw8KwYt3fi5MkqwGgwI5pnbqgYQ5I/kiwIiEQoJCKqZ26oGEIsLEgIYAiABOroBCgMY5wISIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWKIVuUP3ABGKEARXay+oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWoDGKIIUgBaFwoDGKAIEgcKAxidCBAJEgcKAxifCBAKegwI5pnbqgYQ44/kiwI="},{"b64Body":"Cg8KCQirmduqBhCPCxICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxiiCBCgjQYihAETqO1TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=","b64Record":"CiUIISIDGKIIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCTDSaEyGFB7peC/rBqTkGvLkOse5Y/KVSNJdjSTtsima/7Zqz6HyDfVUduAke0FCgaCwjnmduqBhCTqpolIg8KCQirmduqBhCPCxICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMIDX2gI60QEaygEweDA4YzM3OWEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTU1NDcyNjE2ZTczNjY2NTcyMjA2NjcyNmY2ZDIwNjY2MTY5NmM2NTY0MjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwKIDxBFIWCgkKAhgCEP+ttQUKCQoCGGIQgK61BQ=="},{"b64Body":"ChEKCQirmduqBhCPCxICGAIgAXIbEhkKAxigCBIHCgMYnwgQAhIJCgMYnQgQARgB","b64Record":"CgMIpAISMEfw4XU+9JJEYsOK3hr+QVU1pm5CqaabHw1yNLFMAiUL/CQt3ksxBtZvV/LvJQtxIBoLCOeZ26oGEJSqmiUiEQoJCKuZ26oGEI8LEgIYAiABOtsBCgMY5wISIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEkGh9TUEVOREVSX0RPRVNfTk9UX0hBVkVfQUxMT1dBTkNFKIVuUP3ABGKEARXay+oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWoDGKIIUgB6CwjnmduqBhCTqpol"}]},"hapiTransferFromForFungibleTokenToSystemAccountsFails":{"placeholderNum":1059,"encodedItems":[{"b64Body":"Cg8KCQivmduqBhDHCxICGAISAhgDGOy4wBgiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlo0CiISIDu9n6Ue/Qba68mVdJs/B0KNEnJ3Iijzv6z7pklTeqT8EICglKWNHUoFCIDO2gNwBQ==","b64Record":"CiUIFhIDGKQIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjB4VjAT/vp2gl7drTPDrn+Jgs1YbW4h48xz51+WdkZsjaz9kdml2Zqle3bIKk0PoIsaDAjrmduqBhCLj/HXASIPCgkIr5nbqgYQxwsSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIbCgsKAhgCEP+/qMqaOgoMCgMYpAgQgMCoypo6"},{"b64Body":"Cg8KCQivmduqBhDJCxICGAISAhgDGOy4wBgiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISIJQ8DOV/PVmjgXbNHZJ1Xd5GE6V5K2kv5N8DtvJ/QeLqEICU69wDSgUIgM7aA3AF","b64Record":"CiUIFhIDGKUIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjANRioFhb7GXHmtS42yG0cgVZ91zHmFiVhVVfjRXW66B0R+ZK6rrJ49IHKaAbyickkaDAjrmduqBhCDnonEAyIPCgkIr5nbqgYQyQsSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxilCBCAqNa5Bw=="},{"b64Body":"Cg8KCQiwmduqBhDLCxICGAISAhgDGOy4wBgiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISINwPbKL5ek+U/89B4B0iBGsBNWExzKLXpgFchr69DkLhEICU69wDSgUIgM7aA3AF","b64Record":"CiUIFhIDGKYIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAvdCSlPhXR2pCHrRsJ0Hw+HjGMkZOO8aK2wFrp8jFAatDXLXyuy1uKEYP5aD95HfgaDAjsmduqBhCb8LXbASIPCgkIsJnbqgYQywsSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAximCBCAqNa5Bw=="},{"b64Body":"Cg8KCQiwmduqBhDNCxICGAISAhgDGIWupekCIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAVIKBlRva2VuQRIISERYVFVXSUYgCioDGKQIUiISIA3Ve3XSfA9UQ15ZFhrc4WL3yOPJbAO559P3qCL8Sr/qagwI7Oe1rgYQ2IH7wwOQAQGYAegH","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGKcIEjCEsWWrXtg9SmbL2R1n3NJ/AH5btsHVIcUSUFIBFCJiK8tBMYAlnDew9paYw21n1TwaDAjsmduqBhCb2OHJAyIPCgkIsJnbqgYQzQsSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWg4KAxinCBIHCgMYpAgQFHIKCgMYpwgSAxikCA=="},{"b64Body":"Cg8KCQixmduqBhDPCxICGAISAhgDGP7LzSwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjooBjwESDAjt57WuBhDwkb3bARptCiISIBnQbEU8mwxBXsiSAgleld9QaSshMcZ9bpNZWFjCHwkQCiM6IQP6SPCb4tzZnkLfUPk6JBTXsxVWM5kNcJ5Gy2lr8odNwAoiEiBiyT4UxdfcHLuPu9lGA5GhRskm7uaJu0QzqH5Mtbm7EiIMSGVsbG8gV29ybGQhKgAyAA==","b64Record":"CiUIFhoDGKgIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAe0hcQ+EjYUxYBfEBwEELClfPs2qmEx61o4Isq5dOJksKUW38hGq2emGYwWFOK/pQaDAjtmduqBhCj1J74ASIPCgkIsZnbqgYQzwsSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQixmduqBhDTCxICGAISAhgDGIydjj4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjpoBiCAKAxioCCKAIDYwODA2MDQwNTIzNDgwMTU2MTAwMTA1NzYwMDA4MGZkNWI1MDYxMTFlODgwNjEwMDIwNjAwMDM5NjAwMGYzZmU2MDgwNjA0MDUyMzQ4MDE1NjEwMDEwNTc2MDAwODBmZDViNTA2MDA0MzYxMDYxMDBhOTU3NjAwMDM1NjBlMDFjODA2MzZmYzNjYmFmMTE2MTAwNzE1NzgwNjM2ZmMzY2JhZjE0NjEwMTMwNTc4MDYzN2M0MWFkMmMxNDYxMDE1NjU3ODA2MzhmOGQ3Zjk5MTQ2MTAxNjk1NzgwNjNhZjk5YzYzMzE0NjEwMTdjNTc4MDYzZDYxNGNkYjgxNDYxMDE4ZjU3ODA2M2YyYzMxZmY0MTQ2MTAxYjA1NzYwMDA4MGZkNWI4MDYzMTNhOGVkNTMxNDYxMDBhZTU3ODA2MzNiM2JmZjBmMTQ2MTAwYzM1NzgwNjMzYzRkZDMyZTE0NjEwMGU5NTc4MDYzNTA4MWRlZDMxNDYxMDEwYTU3ODA2MzU5M2Q2ZTgyMTQ2MTAxMWQ1NzViNjAwMDgwZmQ1YjYxMDBjMTYxMDBiYzM2NjAwNDYxMDkyYjU2NWI2MTAxZGQ1NjViMDA1YjYxMDBkNjYxMDBkMTM2NjAwNDYxMDk3YzU2NWI2MTAyNDM1NjViNjA0MDUxOTA4MTUyNjAyMDAxNWI2MDQwNTE4MDkxMDM5MGYzNWI2MTAwZmM2MTAwZjczNjYwMDQ2MTA5YTA1NjViNjEwMzFkNTY1YjYwNDA1MTYxMDBlMDkyOTE5MDYxMGE5MzU2NWI2MTAwYzE2MTAxMTgzNjYwMDQ2MTA5MmI1NjViNjEwNDA0NTY1YjYxMDBkNjYxMDEyYjM2NjAwNDYxMGI3ZjU2NWI2MTA0MTI1NjViNjEwMTQzNjEwMTNlMzY2MDA0NjEwYzg4NTY1YjYxMDRlZjU2NWI2MDQwNTE2MDA3OTE5MDkxMGI4MTUyNjAyMDAxNjEwMGUwNTY1YjYxMDBkNjYxMDE2NDM2NjAwNDYxMDk3YzU2NWI2MTA1MWI1NjViNjEwMTQzNjEwMTc3MzY2MDA0NjEwZTQ5NTY1YjYxMDU0OTU2NWI2MTAxNDM2MTAxOGEzNjYwMDQ2MTBlNDk1NjViNjEwNTdmNTY1YjYxMDFhMjYxMDE5ZDM2NjAwNDYxMDk3YzU2NWI2MTA1YjU1NjViNjA0MDUxNjEwMGUwOTI5MTkwNjEwZTgyNTY1YjYxMDFjMzYxMDFiZTM2NjAwNDYxMGU0OTU2NWI2MTA2YmY1NjViNjA0MDgwNTE2MDA3OTM5MDkzMGI4MzUyOTAxNTE1NjAyMDgzMDE1MjAxNjEwMGUwNTY1YjYwMDA2MTAxZWI4NTg1ODU4NTYxMDc4YTU2NWI2MDA3MGI5MDUwNjAxNjgxMTQ2MTAyM2M1NzYwNDA1MTYyNDYxYmNkNjBlNTFiODE1MjYwMjA2MDA0ODIwMTUyNjAxNTYwMjQ4MjAxNTI3NDU0NzI2MTZlNzM2NjY1NzIyMDY2NzI2ZjZkMjA2NjYxNjk2YzY1NjQyMTYwNTgxYjYwNDQ4MjAxNTI2MDY0MDE2MDQwNTE4MDkxMDM5MGZkNWI1MDUwNTA1MDUwNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MjE2NjAyNDgyMDE1MjYwMDA5MDgxOTA4MTkwNjEwMTY3OTA2MzNiM2JmZjBmNjBlMDFiOTA2MDQ0MDE1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE4MDUxNjAwMTYwMDE2MGUwMWIwMzE2NjAwMTYwMDE2MGUwMWIwMzE5OTA5NDE2OTM5MDkzMTc5MDkyNTI5MDUxNjEwMmFiOTE5MDYxMGViYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwMmU4NTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwMmVkNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTAyZmU1NzYwMTU2MTAzMTI1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTAzMTI5MTkwNjEwZWVhNTY1YjYwMDMwYjk0OTM1MDUwNTA1MDU2NWI2MDAwNjEwMzI3NjEwOGMwNTY1YjYwNDA4MDUxNjAwMTYwMDE2MGEwMWIwMzg2MTY2MDI0ODIwMTUyNjA0NDgwODIwMTg2OTA1MjgyNTE4MDgzMDM5MDkxMDE4MTUyNjA2NDkwOTEwMTgyNTI2MDIwODEwMTgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MzFlMjZlOTk3NjBlMTFiMTc5MDUyOTA1MTYwMDA5MTgyOTE2MTAxNjc5MTYxMDM4MTkxNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTAzYmU1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTAzYzM1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA2MTAzZDA2MTA4YzA1NjViODI2MTAzZGQ1NzYwMTU4MTYxMDNmMTU2NWI4MTgwNjAyMDAxOTA1MTgxMDE5MDYxMDNmMTkxOTA2MTBmNTU1NjViNjAwMzkxOTA5MTBiOTg5MDk3NTA5NTUwNTA1MDUwNTA1MDU2NWI2MDAwNjEwMWViODU4NTg1ODU2MTA4N2I1NjViNjAwMDgwNjAwMDYxMDE2NzYwMDE2MDAxNjBhMDFiMDMxNjYzNTkzZDZlODI2MGUwMWI4Njg2NjA0MDUxNjAyNDAxNjEwNDNlOTI5MTkwNjExMDMwNTY1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE4MDUxNjAwMTYwMDE2MGUwMWIwMzE2NjAwMTYwMDE2MGUwMWIwMzE5OTA5NDE2OTM5MDkzMTc5MDkyNTI5MDUxNjEwNDdjOTE5MDYxMGViYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwNGI5NTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwNGJlNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTA0Y2Y1NzYwMTU2MTA0ZTM1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTA0ZTM5MTkwNjEwZWVhNTY1YjYwMDMwYjk1OTQ1MDUwNTA1MDUwNTY1YjYwMDA4MDYwMDA2MTAxNjc2MDAxNjAwMTYwYTAxYjAzMTY2MzZmYzNjYmFmNjBlMDFiODY4NjYwNDA1MTYwMjQwMTYxMDQzZTkyOTE5MDYxMTA3MzU2NWI2MDQwNTE2MDAxNjAwMTYwYTAxYjAzODIxNjYwMjQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjMxZjEwNmI0YjYwZTIxYjkwNjA0NDAxNjEwMjZkNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MzgxMTY2MDI0ODMwMTUyODIxNjYwNDQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjM4ZjhkN2Y5OTYwZTAxYjkwNjA2NDAxNjEwNDNlNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MzgxMTY2MDI0ODMwMTUyODIxNjYwNDQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjNhZjk5YzYzMzYwZTAxYjkwNjA2NDAxNjEwNDNlNTY1YjYwNDA4MDUxNjA2MDgxMDE4MjUyNjAwMDgwODI1MjYwMjA4MDgzMDE4MjkwNTI4Mjg0MDE4MjkwNTI4MzUxNjAwMTYwMDE2MGEwMWIwMzg2MTY2MDI0ODA4MzAxOTE5MDkxNTI4NTUxODA4MzAzOTA5MTAxODE1MjYwNDQ5MDkxMDE4NTUyOTA4MTAxODA1MTYwMDE2MDAxNjBlMDFiMDMxNjYzMWFjMjk5Yjc2MGUzMWIxNzkwNTI5MjUxOTA5MjgzOTE4MjkxNjEwMTY3OTE2MTA2Mjc5MTkwNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTA2NjQ1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTA2Njk1NjViNjA2MDkxNTA1YjUwNjA0MDgwNTE2MDYwODEwMTgyNTI2MDAwODA4MjUyNjAyMDgyMDE4MTkwNTI5MTgxMDE5MTkwOTE1MjkxOTM1MDkxNTA4MjYxMDY5OTU3NjAxNTgxNjEwNmFkNTY1YjgxODA2MDIwMDE5MDUxODEwMTkwNjEwNmFkOTE5MDYxMTBmODU2NWI2MDAzOTE5MDkxMGI5NzkwOTY1MDk0NTA1MDUwNTA1MDU2NWI2MDQwODA1MTYwMDE2MDAxNjBhMDFiMDM4NDgxMTY2MDI0ODMwMTUyODMxNjYwNDQ4MDgzMDE5MTkwOTE1MjgyNTE4MDgzMDM5MDkxMDE4MTUyNjA2NDkwOTEwMTgyNTI2MDIwODEwMTgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MzNjYjBjN2ZkNjBlMjFiMTc5MDUyOTA1MTYwMDA5MTgyOTE4MjkxODI5MTYxMDE2NzkxNjEwNzIxOTE2MTBlYmM1NjViNjAwMDYwNDA1MTgwODMwMzgxNjAwMDg2NWFmMTkxNTA1MDNkODA2MDAwODExNDYxMDc1ZTU3NjA0MDUxOTE1MDYwMWYxOTYwM2YzZDAxMTY4MjAxNjA0MDUyM2Q4MjUyM2Q2MDAwNjAyMDg0MDEzZTYxMDc2MzU2NWI2MDYwOTE1MDViNTA5MTUwOTE1MDgxNjEwNzc2NTc2MDE1NjAwMDYxMDZhZDU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDZhZDkxOTA2MTExNjM1NjViNjA0MDUxNjAwMTYwMDE2MGEwMWIwMzg1ODExNjYwMjQ4MzAxNTI4NDgxMTY2MDQ0ODMwMTUyODMxNjYwNjQ4MjAxNTI2MDg0ODEwMTgyOTA1MjYwMDA5MDgxOTA4MTkwNjEwMTY3OTA2MzBhZWQ2NWY1NjBlMTFiOTA2MGE0MDE1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwOpAxnSNyh4L6twxwPwwcVIUhZP5VFTxkVG86D66IbTwNvQrpu2TIvdFeFJoeDC7yGgsI7pnbqgYQ2+DjBCIPCgkIsZnbqgYQ0wsSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQiymduqBhDZCxICGAISAhgDGPjR6j4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBiCASAxioCCKAIDgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MDAxNjAwMTYwZTAxYjAzMTk5MDk0MTY5MzkwOTMxNzkwOTI1MjkwNTE2MTA4MDk5MTkwNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTA4NDY1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTA4NGI1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA4MTYxMDg1YzU3NjAxNTYxMDg3MDU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDg3MDkxOTA2MTExOGY1NjViOTc5NjUwNTA1MDUwNTA1MDUwNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4NTgxMTY2MDI0ODMwMTUyODQ4MTE2NjA0NDgzMDE1MjgzMTY2MDY0ODIwMTUyNjA4NDgxMDE4MjkwNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjM5YjIzZDNkOTYwZTAxYjkwNjBhNDAxNjEwN2NiNTY1YjYwNDA1MTgwNjBhMDAxNjA0MDUyODA2MDAwMTUxNTgxNTI2MDIwMDE2MDAwNjAwMTYwMDE2MGEwMWIwMzE2ODE1MjYwMjAwMTYwNjA4MTUyNjAyMDAxNjA2MDgxNTI2MDIwMDE2MDAwNjAwMTYwMDE2MGEwMWIwMzE2ODE1MjUwOTA1NjViNjAwMTYwMDE2MGEwMWIwMzgxMTY4MTE0NjEwOTE4NTc2MDAwODBmZDViNTA1NjViODAzNTYxMDkyNjgxNjEwOTAzNTY1YjkxOTA1MDU2NWI2MDAwODA2MDAwODA2MDgwODU4NzAzMTIxNTYxMDk0MTU3NjAwMDgwZmQ1Yjg0MzU2MTA5NGM4MTYxMDkwMzU2NWI5MzUwNjAyMDg1MDEzNTYxMDk1YzgxNjEwOTAzNTY1YjkyNTA2MDQwODUwMTM1NjEwOTZjODE2MTA5MDM1NjViOTM5NjkyOTU1MDkyOTM2MDYwMDEzNTkyNTA1MDU2NWI2MDAwNjAyMDgyODQwMzEyMTU2MTA5OGU1NzYwMDA4MGZkNWI4MTM1NjEwOTk5ODE2MTA5MDM1NjViOTM5MjUwNTA1MDU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMDliMzU3NjAwMDgwZmQ1YjgyMzU2MTA5YmU4MTYxMDkwMzU2NWI5NDYwMjA5MzkwOTMwMTM1OTM1MDUwNTA1NjViNjAwMDViODM4MTEwMTU2MTA5ZTc1NzgxODEwMTUxODM4MjAxNTI2MDIwMDE2MTA5Y2Y1NjViODM4MTExMTU2MTA5ZjY1NzYwMDA4NDg0MDE1MjViNTA1MDUwNTA1NjViNjAwMDgxNTE4MDg0NTI2MTBhMTQ4MTYwMjA4NjAxNjAyMDg2MDE2MTA5Y2M1NjViNjAxZjAxNjAxZjE5MTY5MjkwOTIwMTYwMjAwMTkyOTE1MDUwNTY1YjgwNTExNTE1ODI1MjYwMDA2MDIwODIwMTUxNjAwMTYwMDE2MGEwMWIwMzgwODIxNjYwMjA4NjAxNTI2MDQwODQwMTUxOTE1MDYwYTA2MDQwODYwMTUyNjEwYTYwNjBhMDg2MDE4MzYxMDlmYzU2NWI5MTUwNjA2MDg0MDE1MTg1ODMwMzYwNjA4NzAxNTI2MTBhNzk4MzgyNjEwOWZjNTY1YjkyNTA1MDgwNjA4MDg1MDE1MTE2NjA4MDg2MDE1MjUwODA5MTUwNTA5MjkxNTA1MDU2NWI4MjYwMDcwYjgxNTI2MDQwNjAyMDgyMDE1MjYwMDA2MTBhYWY2MDQwODMwMTg0NjEwYTI4NTY1Yjk0OTM1MDUwNTA1MDU2NWI2MzRlNDg3YjcxNjBlMDFiNjAwMDUyNjA0MTYwMDQ1MjYwMjQ2MDAwZmQ1YjYwNDA1MTYwNjA4MTAxNjdmZmZmZmZmZmZmZmZmZmZmODExMTgyODIxMDE3MTU2MTBhZjA1NzYxMGFmMDYxMGFiNzU2NWI2MDQwNTI5MDU2NWI2MDQwODA1MTkwODEwMTY3ZmZmZmZmZmZmZmZmZmZmZjgxMTE4MjgyMTAxNzE1NjEwYWYwNTc2MTBhZjA2MTBhYjc1NjViNjA0MDUxNjBhMDgxMDE2N2ZmZmZmZmZmZmZmZmZmZmY4MTExODI4MjEwMTcxNTYxMGFmMDU3NjEwYWYwNjEwYWI3NTY1YjYwNDA1MTYwMWY4MjAxNjAxZjE5MTY4MTAxNjdmZmZmZmZmZmZmZmZmZmZmODExMTgyODIxMDE3MTU2MTBiNjU1NzYxMGI2NTYxMGFiNzU2NWI2MDQwNTI5MTkwNTA1NjViNjNmZmZmZmZmZjgxMTY4MTE0NjEwOTE4NTc2MDAwODBmZDViNjAwMDgwODI4NDAzNjA4MDgxMTIxNTYxMGI5MzU3NjAwMDgwZmQ1YjgzMzU2MTBiOWU4MTYxMDkwMzU2NWI5MjUwNjA2MDYwMWYxOTgyMDExMjE1NjEwYmIyNTc2MDAwODBmZDViNTA2MTBiYmI2MTBhY2Q1NjViNjAyMDg0MDEzNTYxMGJjOTgxNjEwYjZkNTY1YjgxNTI2MDQwODQwMTM1NjEwYmQ5ODE2MTA5MDM1NjViNjAyMDgyMDE1MjYwNjA4NDAxMzU2MTBiZWM4MTYxMGI2ZDU2NWI2MDQwODIwMTUyOTE5NDkxOTM1MDkwOTE1MDUwNTY1YjgwMTUxNTgxMTQ2MTA5MTg1NzYwMDA4MGZkNWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwYzI0NTc2MTBjMjQ2MTBhYjc1NjViNTA2MDFmMDE2MDFmMTkxNjYwMjAwMTkwNTY1YjYwMDA4MjYwMWY4MzAxMTI2MTBjNDM1NzYwMDA4MGZkNWI4MTM1NjEwYzU2NjEwYzUxODI2MTBjMGE1NjViNjEwYjNjNTY1YjgxODE1Mjg0NjAyMDgzODYwMTAxMTExNTYxMGM2YjU3NjAwMDgwZmQ1YjgxNjAyMDg1MDE2MDIwODMwMTM3NjAwMDkxODEwMTYwMjAwMTkxOTA5MTUyOTM5MjUwNTA1MDU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMGM5YjU3NjAwMDgwZmQ1YjYxMGNhNTgzMzU2MTA5MDM1NjViODIzNTkxNTA2N2ZmZmZmZmZmZmZmZmZmZmY4MDYwMjA4NTAxMzUxMTE1NjEwY2MzNTc2MDAwODBmZDViNjAyMDg0MDEzNTg0MDE4NTYwMWY4MjAxMTI2MTBjZDk1NzYwMDA4MGZkNWI4MTgxMzUxMTE1NjEwY2VhNTc2MTBjZWE2MTBhYjc1NjViNjEwY2ZhNjAyMDgyMzU2MDA1MWIwMTYxMGIzYzU2NWI4MTM1ODA4MjUyNjAyMDgwODMwMTkyOTE2MDA1MWI4NDAxMDE4ODgxMTExNTYxMGQxOTU3NjAwMDgwZmQ1YjYwMjA4NDAxNWI4MTgxMTAxNTYxMGUzYTU3ODU4MTM1MTExNTYxMGQzNDU3NjAwMDgwZmQ1YjgwMzU4NTAxNjAxZjE5NjA0MDgyOGQwMzgyMDExMjE1NjEwZDRkNTc2MDAwODBmZDViNjEwZDU1NjEwYWY2NTY1YjYwMjA4MzAxMzU4MTUyODg2MDQwODQwMTM1MTExNTYxMGQ2ZDU3NjAwMDgwZmQ1YjYwNDA4MzAxMzU4MzAxOTI1MDYwYTA4Mjg0OGYwMzAxMTIxNTYxMGQ4ODU3NjAwMDgwZmQ1YjYxMGQ5MDYxMGIxOTU2NWI5MTUwNjEwZDlmNjAyMDg0MDEzNTYxMGJmYzU2NWI2MDIwODMwMTM1ODI1MjYxMGRiMzYwNDA4NDAxMzU2MTA5MDM1NjViNjA0MDgzMDEzNTYwMjA4MzAxNTI4ODYwNjA4NDAxMzUxMTE1NjEwZGNlNTc2MDAwODBmZDViNjEwZGUxOGQ2MDIwNjA2MDg2MDEzNTg2MDEwMTYxMGMzMjU2NWI2MDQwODMwMTUyODg2MDgwODQwMTM1MTExNTYxMGRmNzU3NjAwMDgwZmQ1YjYxMGUwYThkNjAyMDYwODA4NjAxMzU4NjAxMDE2MTBjMzI1NjViNjA2MDgzMDE1MjYxMGUxYjYwYTA4NDAxNjEwOTFiNTY1YjYwODA4MzAxNTI2MDIwODE4MTAxOTI5MDkyNTI4NjUyOTQ4NTAxOTQ5MTkwOTEwMTkwNTA2MTBkMWU1NjViNTA5NTk4OTA5NzUwOTU1MDUwNTA1MDUwNTA1NjViNjAwMDgwNjA0MDgzODUwMzEyMTU2MTBlNWM1NzYwMDA4MGZkNWI4MjM1NjEwZTY3ODE2MTA5MDM1NjViOTE1MDYwMjA4MzAxMzU2MTBlNzc4MTYxMDkwMzU2NWI4MDkxNTA1MDkyNTA5MjkwNTA1NjViODI4MTUyNjA4MDgxMDE2MTA5OTk2MDIwODMwMTg0ODA1MTYzZmZmZmZmZmY5MDgxMTY4MzUyNjAyMDgwODMwMTUxNjAwMTYwMDE2MGEwMWIwMzE2OTA4NDAxNTI2MDQwOTE4MjAxNTExNjkxMDE1MjU2NWI2MDAwODI1MTYxMGVjZTgxODQ2MDIwODcwMTYxMDljYzU2NWI5MTkwOTEwMTkyOTE1MDUwNTY1YjgwNTE2MDAzODE5MDBiODExNDYxMDkyNjU3NjAwMDgwZmQ1YjYwMDA2MDIwODI4NDAzMTIxNTYxMGVmYzU3NjAwMDgwZmQ1YjYxMDk5OTgyNjEwZWQ4NTY1YjgwNTE2MTA5MjY4MTYxMDkwMzU2NWI2MDAwODI2MDFmODMwMTEyNjEwZjIxNTc2MDAwODBmZDViODE1MTYxMGYyZjYxMGM1MTgyNjEwYzBhNTY1YjgxODE1Mjg0NjAyMDgzODYwMTAxMTExNTYxMGY0NDU3NjAwMDgwZmQ1YjYxMGFhZjgyNjAyMDgzMDE2MDIwODcwMTYxMDljYzU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMGY2ODU3NjAwMDgwZmQ1YjYxMGY3MTgzNjEwZWQ4NTY1YjkxNTA2MDIwODMwMTUxNjdmZmZmZmZmZmZmZmZmZmZmODA4MjExMTU2MTBmOGU1NzYwMDA4MGZkNWI5MDg0MDE5MDYwYTA4Mjg3MDMxMjE1NjEwZmEyNTc2MDAwODBmZDViNjEwZmFhNjEwYjE5NTY1YjgyNTE2MTBmYjU4MTYxMGJmYzU2NWI4MTUyNjAyMDgzMDE1MTYxMGZjNTgxNjEwOTAzNTY1YjYwMjA4MjAxNTI2MDQwODMwMTUxODI4MTExMTU2MTBmZGM1NzYwMDA4MGZkNWI2MTBmZTg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwG3KByN6WIU+5pxX3UCrKir9U+TDjZOpN8YyXw0GmXKTDGDuvzIKdm8oVwq+tciexGgwI7pnbqgYQy4CZ7wEiDwoJCLKZ26oGENkLEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQizmduqBhDfCxICGAISAhgDGNPltjEiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBmAgSAxioCCKQCDg4ODI4NjAxNjEwZjEwNTY1YjYwNDA4MzAxNTI1MDYwNjA4MzAxNTE4MjgxMTExNTYxMTAwMDU3NjAwMDgwZmQ1YjYxMTAwYzg4ODI4NjAxNjEwZjEwNTY1YjYwNjA4MzAxNTI1MDYxMTAxZTYwODA4NDAxNjEwZjA1NTY1YjYwODA4MjAxNTI4MDkzNTA1MDUwNTA5MjUwOTI5MDUwNTY1YjYwMDE2MDAxNjBhMDFiMDM4MzE2ODE1MjYwODA4MTAxNjEwOTk5NjAyMDgzMDE4NDgwNTE2M2ZmZmZmZmZmOTA4MTE2ODM1MjYwMjA4MDgzMDE1MTYwMDE2MDAxNjBhMDFiMDMxNjkwODQwMTUyNjA0MDkxODIwMTUxMTY5MTAxNTI1NjViNjAwMDYwNDA4MDgzMDE2MDAxNjAwMTYwYTAxYjAzODYxNjg0NTI2MDIwODI4MTg2MDE1MjgxODY1MTgwODQ1MjYwNjA4NzAxOTE1MDYwNjA4MTYwMDUxYjg4MDEwMTkzNTA4Mjg4MDE2MDAwNWI4MjgxMTAxNTYxMTBlOTU3ODg4NjAzNjA1ZjE5MDE4NDUyODE1MTgwNTE4NzUyODUwMTUxODU4NzAxODg5MDUyNjExMGQ2ODg4ODAxODI2MTBhMjg1NjViOTY1MDUwOTI4NDAxOTI5MDg0MDE5MDYwMDEwMTYxMTBhYTU2NWI1MDkzOTk5ODUwNTA1MDUwNTA1MDUwNTA1MDU2NWI2MDAwODA4Mjg0MDM2MDgwODExMjE1NjExMTBjNTc2MDAwODBmZDViNjExMTE1ODQ2MTBlZDg1NjViOTI1MDYwNjA2MDFmMTk4MjAxMTIxNTYxMTEyOTU3NjAwMDgwZmQ1YjUwNjExMTMyNjEwYWNkNTY1YjYwMjA4NDAxNTE2MTExNDA4MTYxMGI2ZDU2NWI4MTUyNjA0MDg0MDE1MTYxMTE1MDgxNjEwOTAzNTY1YjYwMjA4MjAxNTI2MDYwODQwMTUxNjEwYmVjODE2MTBiNmQ1NjViNjAwMDgwNjA0MDgzODUwMzEyMTU2MTExNzY1NzYwMDA4MGZkNWI2MTExN2Y4MzYxMGVkODU2NWI5MTUwNjAyMDgzMDE1MTYxMGU3NzgxNjEwYmZjNTY1YjYwMDA2MDIwODI4NDAzMTIxNTYxMTFhMTU3NjAwMDgwZmQ1YjgxNTE4MDYwMDcwYjgxMTQ2MTA5OTk1NzYwMDA4MGZkZmVhMjY0Njk3MDY2NzM1ODIyMTIyMDkxZDY1YzY1ZWVhOTljOWFhMTYwOGYxODEyODA3NDMzOWQ0OWI0NmQ5ZjY2YWY5MTA4ZmEwYzRlN2Q2MmQyYTU2NDczNmY2YzYzNDMwMDA4MGIwMDMz","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwZSzJHc15FS4YWSDSsNMOz7+GSORSozRi5EYXWviOOWfQWlKEX7uJTOjVfvlqUefcGgsI75nbqgYQs5/SFyIPCgkIs5nbqgYQ3wsSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQizmduqBhDhCxICGAISAhgDGJb7rp0CIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5CRQoDGKgIGiISIJyiWLy75Iw554ktPnAUwDx2c4883Y9b/SrdyJjIPX5JIJChD0IFCIDO2gNSAFoAagtjZWxsYXIgZG9vcg==","b64Record":"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"},{"b64Body":"Cg8KCQi0mduqBhDiCxICGAISAhgDGIDC1y8iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIDExoRCgMYpwgSAxikCBoDGKkIIAo=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw7foDWbljWG2tNQa1nEvte7UnxgHGzF4UBARQSw04msYQ26c7oEyujxgHOBCaFq9VGgsI8JnbqgYQg67nHiIPCgkItJnbqgYQ4gsSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQi0mduqBhDmCxICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kQEKAxipCBCAreIEIoQBE6jtUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF","b64Record":"CiUIISIDGKkIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjA2osk0IVn0c/A9ZnSxEcajja2AC2N+keVlk9Yy9jQi/ufD7zF1iHLC9LgSCj0xFQAaDAjwmduqBhDb2+2XAiIPCgkItJnbqgYQ5gsSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCA/OuOAjrSARrKATB4MDhjMzc5YTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxNTU0NzI2MTZlNzM2NjY1NzIyMDY2NzI2ZjZkMjA2NjYxNjk2YzY1NjQyMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAogKToA1IYCgoKAhgCEP/3150ECgoKAhhiEID4150E"},{"b64Body":"ChEKCQi0mduqBhDmCxICGAIgAXIbEhkKAxinCBIHCgMY7gUQChIJCgMYpAgQCRgB","b64Record":"CgIIIxIw/qZ6SucoKfMhC4aH7255MD4AcSBYGVNVZH0v2faXMp78rLhujvqh9rbvZwC2Kp6LGgwI8JnbqgYQ3NvtlwIiEQoJCLSZ26oGEOYLEgIYAiABOtsBCgMY5wISIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjGh5JTlZBTElEX1JFQ0VJVklOR19OT0RFX0FDQ09VTlQohW5QnqjXBGKEARXay+oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWoDGKkIUgB6DAjwmduqBhDb2+2XAg=="},{"b64Body":"Cg8KCQi1mduqBhDoCxICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kQEKAxipCBCAreIEIoQBE6jtUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF","b64Record":"CiUIISIDGKkIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDoQIH/87NuG3zerwK1s2b6DLkBEmzzk2b9IUkh/bC/p+LpCb5NPhEjGm+2gW3XjI8aCwjxmduqBhCLnpElIg8KCQi1mduqBhDoCxICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMID8644COtIBGsoBMHgwOGMzNzlhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE1NTQ3MjYxNmU3MzY2NjU3MjIwNjY3MjZmNmQyMDY2NjE2OTZjNjU2NDIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCiApOgDUhgKCgoCGAIQ//fXnQQKCgoCGGIQgPjXnQQ="},{"b64Body":"ChEKCQi1mduqBhDoCxICGAIgAXIbEhkKAxinCBIHCgMY2QIQChIJCgMYpAgQCRgB","b64Record":"CgIIIxIweAiXQLCotEo/SqL/MS5yXku/Ko1uMXTgMm0A+vJX5rQsJKcHtzf9jn9q+mk9smKuGgsI8ZnbqgYQjJ6RJSIRCgkItZnbqgYQ6AsSAhgCIAE62wEKAxjnAhIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMaHklOVkFMSURfUkVDRUlWSU5HX05PREVfQUNDT1VOVCiFblCeqNcEYoQBFdrL6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFagMYqQhSAHoLCPGZ26oGEIuekSU="},{"b64Body":"Cg8KCQi1mduqBhDqCxICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kQEKAxipCBCAreIEIoQBE6jtUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF","b64Record":"CiUIISIDGKkIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAWP+WiIbWTuPZydGxcU7kYIGBQulINkCn4hDIOx3mGqtuzuIIdPyVnAuh5wx1x9WoaDAjxmduqBhCrvbWTAiIPCgkItZnbqgYQ6gsSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCA/OuOAjrSARrKATB4MDhjMzc5YTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxNTU0NzI2MTZlNzM2NjY1NzIyMDY2NzI2ZjZkMjA2NjYxNjk2YzY1NjQyMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAogKToA1IYCgoKAhgCEP/3150ECgoKAhhiEID4150E"},{"b64Body":"ChEKCQi1mduqBhDqCxICGAIgAXIaEhgKAxinCBIGCgIYARAKEgkKAxikCBAJGAE=","b64Record":"CgIIIxIwn9OuUcDgR0Kd9Y/UbadeQUgCru7gFqB+9ruCPEMrv9khnjReXZtkbvOBzFNWOEi+GgwI8ZnbqgYQrL21kwIiEQoJCLWZ26oGEOoLEgIYAiABOtsBCgMY5wISIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjGh5JTlZBTElEX1JFQ0VJVklOR19OT0RFX0FDQ09VTlQohW5QnqjXBGKEARXay+oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWoDGKkIUgB6DAjxmduqBhCrvbWTAg=="}]},"hapiTransferFromForNFT":{"placeholderNum":1066,"encodedItems":[{"b64Body":"Cg8KCQi6mduqBhCSDBICGAISAhgDGOy4wBgiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlo0CiISIO0ha/Iwf2Auog6lehbU9UzBg2upWSa9avnjJWfXrKUeEICglKWNHUoFCIDO2gNwBQ==","b64Record":"CiUIFhIDGKsIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjA84lbCeBtc/FQ2r2jknUqIi8sVTR+9FOS7O19SBkspnzjJ5FQbAKzfeVCRFn5L6xYaCwj2mduqBhDTwqQYIg8KCQi6mduqBhCSDBICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUhsKCwoCGAIQ/7+oypo6CgwKAxirCBCAwKjKmjo="},{"b64Body":"Cg8KCQi6mduqBhCUDBICGAISAhgDGOy4wBgiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISIEx74VADXu7NZ4gXcWtNmgl0dA812VS22MyCSOR/YDCJEICU69wDSgUIgM7aA3AF","b64Record":"CiUIFhIDGKwIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjB8xE0ZV2ZtTqd04MTR3Xg/sZ3sHmxbj5KTwGNy0vOZJfqBf5QKL/yTSaYl3fQz02IaDAj2mduqBhDT3oCNAiIPCgkIupnbqgYQlAwSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxisCBCAqNa5Bw=="},{"b64Body":"Cg8KCQi7mduqBhCWDBICGAISAhgDGOy4wBgiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISIBEUMx+Q038sEp8lYTm3xqfOWYPchC8n9Fa5Qv/wRhBjEICU69wDSgUIgM7aA3AF","b64Record":"CiUIFhIDGK0IKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjBYcHidKXiZG+zeIaf00CFxzm0Gwr3PEa9K41Mb3ruTahW43cOYlzZY5LpONcunozYaCwj3mduqBhCT658qIg8KCQi7mduqBhCWDBICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUhkKCgoCGAIQ/6fWuQcKCwoDGK0IEICo1rkH"},{"b64Body":"Cg8KCQi7mduqBhCYDBICGAISAhgDGIXD6+gCIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAU8KCVRva2VuX05GVBIIVFpETFhEV0kqAxirCFIiEiCVJ3bKOFR9sGQp9TOBVsDiZPJwjdPJZB+EEqGh56Cj7WoMCPfnta4GEIjE/4QCiAEB","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGK4IEjBdy39+FgxysjJspQjZBPwzrgMwsQs8JGRxgFpAy5XebePpb3k2u2nkqUnzv4FV3SAaDAj3mduqBhCT55uKAiIPCgkIu5nbqgYQmAwSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAcgoKAxiuCBIDGKsI"},{"b64Body":"Cg8KCQi8mduqBhCaDBICGAISAhgDGP7LzSwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjooBjgESCwj457WuBhC41+EeGm0KIhIg2ITwaLNpIzTOZ9Sp1YR08cWsKdtFbPuaPaw1Eis9LOcKIzohAz+MYdCMSMwYYYnNxUbOi4CGKFN7Ww1wOL8M09kg7cdWCiISIDD++iP9CWnjUPM4XawxMH5v9FpGg1r9g04tbjTf3U1YIgxIZWxsbyBXb3JsZCEqADIA","b64Record":"CiUIFhoDGK8IKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDt455Z2UzFoxVF+zFYQqqAAVA1HqewzoKk+kHkwHeKftPVzHmbU6DEE15J0jhpjA8aCwj4mduqBhDrlbkjIg8KCQi8mduqBhCaDBICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUgA="},{"b64Body":"Cg8KCQi8mduqBhCeDBICGAISAhgDGIydjj4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjpoBiCAKAxivCCKAIDYwODA2MDQwNTIzNDgwMTU2MTAwMTA1NzYwMDA4MGZkNWI1MDYxMTFlODgwNjEwMDIwNjAwMDM5NjAwMGYzZmU2MDgwNjA0MDUyMzQ4MDE1NjEwMDEwNTc2MDAwODBmZDViNTA2MDA0MzYxMDYxMDBhOTU3NjAwMDM1NjBlMDFjODA2MzZmYzNjYmFmMTE2MTAwNzE1NzgwNjM2ZmMzY2JhZjE0NjEwMTMwNTc4MDYzN2M0MWFkMmMxNDYxMDE1NjU3ODA2MzhmOGQ3Zjk5MTQ2MTAxNjk1NzgwNjNhZjk5YzYzMzE0NjEwMTdjNTc4MDYzZDYxNGNkYjgxNDYxMDE4ZjU3ODA2M2YyYzMxZmY0MTQ2MTAxYjA1NzYwMDA4MGZkNWI4MDYzMTNhOGVkNTMxNDYxMDBhZTU3ODA2MzNiM2JmZjBmMTQ2MTAwYzM1NzgwNjMzYzRkZDMyZTE0NjEwMGU5NTc4MDYzNTA4MWRlZDMxNDYxMDEwYTU3ODA2MzU5M2Q2ZTgyMTQ2MTAxMWQ1NzViNjAwMDgwZmQ1YjYxMDBjMTYxMDBiYzM2NjAwNDYxMDkyYjU2NWI2MTAxZGQ1NjViMDA1YjYxMDBkNjYxMDBkMTM2NjAwNDYxMDk3YzU2NWI2MTAyNDM1NjViNjA0MDUxOTA4MTUyNjAyMDAxNWI2MDQwNTE4MDkxMDM5MGYzNWI2MTAwZmM2MTAwZjczNjYwMDQ2MTA5YTA1NjViNjEwMzFkNTY1YjYwNDA1MTYxMDBlMDkyOTE5MDYxMGE5MzU2NWI2MTAwYzE2MTAxMTgzNjYwMDQ2MTA5MmI1NjViNjEwNDA0NTY1YjYxMDBkNjYxMDEyYjM2NjAwNDYxMGI3ZjU2NWI2MTA0MTI1NjViNjEwMTQzNjEwMTNlMzY2MDA0NjEwYzg4NTY1YjYxMDRlZjU2NWI2MDQwNTE2MDA3OTE5MDkxMGI4MTUyNjAyMDAxNjEwMGUwNTY1YjYxMDBkNjYxMDE2NDM2NjAwNDYxMDk3YzU2NWI2MTA1MWI1NjViNjEwMTQzNjEwMTc3MzY2MDA0NjEwZTQ5NTY1YjYxMDU0OTU2NWI2MTAxNDM2MTAxOGEzNjYwMDQ2MTBlNDk1NjViNjEwNTdmNTY1YjYxMDFhMjYxMDE5ZDM2NjAwNDYxMDk3YzU2NWI2MTA1YjU1NjViNjA0MDUxNjEwMGUwOTI5MTkwNjEwZTgyNTY1YjYxMDFjMzYxMDFiZTM2NjAwNDYxMGU0OTU2NWI2MTA2YmY1NjViNjA0MDgwNTE2MDA3OTM5MDkzMGI4MzUyOTAxNTE1NjAyMDgzMDE1MjAxNjEwMGUwNTY1YjYwMDA2MTAxZWI4NTg1ODU4NTYxMDc4YTU2NWI2MDA3MGI5MDUwNjAxNjgxMTQ2MTAyM2M1NzYwNDA1MTYyNDYxYmNkNjBlNTFiODE1MjYwMjA2MDA0ODIwMTUyNjAxNTYwMjQ4MjAxNTI3NDU0NzI2MTZlNzM2NjY1NzIyMDY2NzI2ZjZkMjA2NjYxNjk2YzY1NjQyMTYwNTgxYjYwNDQ4MjAxNTI2MDY0MDE2MDQwNTE4MDkxMDM5MGZkNWI1MDUwNTA1MDUwNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MjE2NjAyNDgyMDE1MjYwMDA5MDgxOTA4MTkwNjEwMTY3OTA2MzNiM2JmZjBmNjBlMDFiOTA2MDQ0MDE1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE4MDUxNjAwMTYwMDE2MGUwMWIwMzE2NjAwMTYwMDE2MGUwMWIwMzE5OTA5NDE2OTM5MDkzMTc5MDkyNTI5MDUxNjEwMmFiOTE5MDYxMGViYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwMmU4NTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwMmVkNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTAyZmU1NzYwMTU2MTAzMTI1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTAzMTI5MTkwNjEwZWVhNTY1YjYwMDMwYjk0OTM1MDUwNTA1MDU2NWI2MDAwNjEwMzI3NjEwOGMwNTY1YjYwNDA4MDUxNjAwMTYwMDE2MGEwMWIwMzg2MTY2MDI0ODIwMTUyNjA0NDgwODIwMTg2OTA1MjgyNTE4MDgzMDM5MDkxMDE4MTUyNjA2NDkwOTEwMTgyNTI2MDIwODEwMTgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MzFlMjZlOTk3NjBlMTFiMTc5MDUyOTA1MTYwMDA5MTgyOTE2MTAxNjc5MTYxMDM4MTkxNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTAzYmU1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTAzYzM1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA2MTAzZDA2MTA4YzA1NjViODI2MTAzZGQ1NzYwMTU4MTYxMDNmMTU2NWI4MTgwNjAyMDAxOTA1MTgxMDE5MDYxMDNmMTkxOTA2MTBmNTU1NjViNjAwMzkxOTA5MTBiOTg5MDk3NTA5NTUwNTA1MDUwNTA1MDU2NWI2MDAwNjEwMWViODU4NTg1ODU2MTA4N2I1NjViNjAwMDgwNjAwMDYxMDE2NzYwMDE2MDAxNjBhMDFiMDMxNjYzNTkzZDZlODI2MGUwMWI4Njg2NjA0MDUxNjAyNDAxNjEwNDNlOTI5MTkwNjExMDMwNTY1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE4MDUxNjAwMTYwMDE2MGUwMWIwMzE2NjAwMTYwMDE2MGUwMWIwMzE5OTA5NDE2OTM5MDkzMTc5MDkyNTI5MDUxNjEwNDdjOTE5MDYxMGViYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwNGI5NTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwNGJlNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTA0Y2Y1NzYwMTU2MTA0ZTM1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTA0ZTM5MTkwNjEwZWVhNTY1YjYwMDMwYjk1OTQ1MDUwNTA1MDUwNTY1YjYwMDA4MDYwMDA2MTAxNjc2MDAxNjAwMTYwYTAxYjAzMTY2MzZmYzNjYmFmNjBlMDFiODY4NjYwNDA1MTYwMjQwMTYxMDQzZTkyOTE5MDYxMTA3MzU2NWI2MDQwNTE2MDAxNjAwMTYwYTAxYjAzODIxNjYwMjQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjMxZjEwNmI0YjYwZTIxYjkwNjA0NDAxNjEwMjZkNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MzgxMTY2MDI0ODMwMTUyODIxNjYwNDQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjM4ZjhkN2Y5OTYwZTAxYjkwNjA2NDAxNjEwNDNlNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MzgxMTY2MDI0ODMwMTUyODIxNjYwNDQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjNhZjk5YzYzMzYwZTAxYjkwNjA2NDAxNjEwNDNlNTY1YjYwNDA4MDUxNjA2MDgxMDE4MjUyNjAwMDgwODI1MjYwMjA4MDgzMDE4MjkwNTI4Mjg0MDE4MjkwNTI4MzUxNjAwMTYwMDE2MGEwMWIwMzg2MTY2MDI0ODA4MzAxOTE5MDkxNTI4NTUxODA4MzAzOTA5MTAxODE1MjYwNDQ5MDkxMDE4NTUyOTA4MTAxODA1MTYwMDE2MDAxNjBlMDFiMDMxNjYzMWFjMjk5Yjc2MGUzMWIxNzkwNTI5MjUxOTA5MjgzOTE4MjkxNjEwMTY3OTE2MTA2Mjc5MTkwNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTA2NjQ1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTA2Njk1NjViNjA2MDkxNTA1YjUwNjA0MDgwNTE2MDYwODEwMTgyNTI2MDAwODA4MjUyNjAyMDgyMDE4MTkwNTI5MTgxMDE5MTkwOTE1MjkxOTM1MDkxNTA4MjYxMDY5OTU3NjAxNTgxNjEwNmFkNTY1YjgxODA2MDIwMDE5MDUxODEwMTkwNjEwNmFkOTE5MDYxMTBmODU2NWI2MDAzOTE5MDkxMGI5NzkwOTY1MDk0NTA1MDUwNTA1MDU2NWI2MDQwODA1MTYwMDE2MDAxNjBhMDFiMDM4NDgxMTY2MDI0ODMwMTUyODMxNjYwNDQ4MDgzMDE5MTkwOTE1MjgyNTE4MDgzMDM5MDkxMDE4MTUyNjA2NDkwOTEwMTgyNTI2MDIwODEwMTgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MzNjYjBjN2ZkNjBlMjFiMTc5MDUyOTA1MTYwMDA5MTgyOTE4MjkxODI5MTYxMDE2NzkxNjEwNzIxOTE2MTBlYmM1NjViNjAwMDYwNDA1MTgwODMwMzgxNjAwMDg2NWFmMTkxNTA1MDNkODA2MDAwODExNDYxMDc1ZTU3NjA0MDUxOTE1MDYwMWYxOTYwM2YzZDAxMTY4MjAxNjA0MDUyM2Q4MjUyM2Q2MDAwNjAyMDg0MDEzZTYxMDc2MzU2NWI2MDYwOTE1MDViNTA5MTUwOTE1MDgxNjEwNzc2NTc2MDE1NjAwMDYxMDZhZDU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDZhZDkxOTA2MTExNjM1NjViNjA0MDUxNjAwMTYwMDE2MGEwMWIwMzg1ODExNjYwMjQ4MzAxNTI4NDgxMTY2MDQ0ODMwMTUyODMxNjYwNjQ4MjAxNTI2MDg0ODEwMTgyOTA1MjYwMDA5MDgxOTA4MTkwNjEwMTY3OTA2MzBhZWQ2NWY1NjBlMTFiOTA2MGE0MDE1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwS3o+HGVUSuiQ8WwwF9rjZpMuHOZeThzKIWqj5IrUWrZWiTQj0zzGeVoAekzODNTpGgwI+JnbqgYQ25PArgIiDwoJCLyZ26oGEJ4MEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQi9mduqBhCkDBICGAISAhgDGPjR6j4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBiCASAxivCCKAIDgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MDAxNjAwMTYwZTAxYjAzMTk5MDk0MTY5MzkwOTMxNzkwOTI1MjkwNTE2MTA4MDk5MTkwNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTA4NDY1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTA4NGI1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA4MTYxMDg1YzU3NjAxNTYxMDg3MDU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDg3MDkxOTA2MTExOGY1NjViOTc5NjUwNTA1MDUwNTA1MDUwNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4NTgxMTY2MDI0ODMwMTUyODQ4MTE2NjA0NDgzMDE1MjgzMTY2MDY0ODIwMTUyNjA4NDgxMDE4MjkwNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjM5YjIzZDNkOTYwZTAxYjkwNjBhNDAxNjEwN2NiNTY1YjYwNDA1MTgwNjBhMDAxNjA0MDUyODA2MDAwMTUxNTgxNTI2MDIwMDE2MDAwNjAwMTYwMDE2MGEwMWIwMzE2ODE1MjYwMjAwMTYwNjA4MTUyNjAyMDAxNjA2MDgxNTI2MDIwMDE2MDAwNjAwMTYwMDE2MGEwMWIwMzE2ODE1MjUwOTA1NjViNjAwMTYwMDE2MGEwMWIwMzgxMTY4MTE0NjEwOTE4NTc2MDAwODBmZDViNTA1NjViODAzNTYxMDkyNjgxNjEwOTAzNTY1YjkxOTA1MDU2NWI2MDAwODA2MDAwODA2MDgwODU4NzAzMTIxNTYxMDk0MTU3NjAwMDgwZmQ1Yjg0MzU2MTA5NGM4MTYxMDkwMzU2NWI5MzUwNjAyMDg1MDEzNTYxMDk1YzgxNjEwOTAzNTY1YjkyNTA2MDQwODUwMTM1NjEwOTZjODE2MTA5MDM1NjViOTM5NjkyOTU1MDkyOTM2MDYwMDEzNTkyNTA1MDU2NWI2MDAwNjAyMDgyODQwMzEyMTU2MTA5OGU1NzYwMDA4MGZkNWI4MTM1NjEwOTk5ODE2MTA5MDM1NjViOTM5MjUwNTA1MDU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMDliMzU3NjAwMDgwZmQ1YjgyMzU2MTA5YmU4MTYxMDkwMzU2NWI5NDYwMjA5MzkwOTMwMTM1OTM1MDUwNTA1NjViNjAwMDViODM4MTEwMTU2MTA5ZTc1NzgxODEwMTUxODM4MjAxNTI2MDIwMDE2MTA5Y2Y1NjViODM4MTExMTU2MTA5ZjY1NzYwMDA4NDg0MDE1MjViNTA1MDUwNTA1NjViNjAwMDgxNTE4MDg0NTI2MTBhMTQ4MTYwMjA4NjAxNjAyMDg2MDE2MTA5Y2M1NjViNjAxZjAxNjAxZjE5MTY5MjkwOTIwMTYwMjAwMTkyOTE1MDUwNTY1YjgwNTExNTE1ODI1MjYwMDA2MDIwODIwMTUxNjAwMTYwMDE2MGEwMWIwMzgwODIxNjYwMjA4NjAxNTI2MDQwODQwMTUxOTE1MDYwYTA2MDQwODYwMTUyNjEwYTYwNjBhMDg2MDE4MzYxMDlmYzU2NWI5MTUwNjA2MDg0MDE1MTg1ODMwMzYwNjA4NzAxNTI2MTBhNzk4MzgyNjEwOWZjNTY1YjkyNTA1MDgwNjA4MDg1MDE1MTE2NjA4MDg2MDE1MjUwODA5MTUwNTA5MjkxNTA1MDU2NWI4MjYwMDcwYjgxNTI2MDQwNjAyMDgyMDE1MjYwMDA2MTBhYWY2MDQwODMwMTg0NjEwYTI4NTY1Yjk0OTM1MDUwNTA1MDU2NWI2MzRlNDg3YjcxNjBlMDFiNjAwMDUyNjA0MTYwMDQ1MjYwMjQ2MDAwZmQ1YjYwNDA1MTYwNjA4MTAxNjdmZmZmZmZmZmZmZmZmZmZmODExMTgyODIxMDE3MTU2MTBhZjA1NzYxMGFmMDYxMGFiNzU2NWI2MDQwNTI5MDU2NWI2MDQwODA1MTkwODEwMTY3ZmZmZmZmZmZmZmZmZmZmZjgxMTE4MjgyMTAxNzE1NjEwYWYwNTc2MTBhZjA2MTBhYjc1NjViNjA0MDUxNjBhMDgxMDE2N2ZmZmZmZmZmZmZmZmZmZmY4MTExODI4MjEwMTcxNTYxMGFmMDU3NjEwYWYwNjEwYWI3NTY1YjYwNDA1MTYwMWY4MjAxNjAxZjE5MTY4MTAxNjdmZmZmZmZmZmZmZmZmZmZmODExMTgyODIxMDE3MTU2MTBiNjU1NzYxMGI2NTYxMGFiNzU2NWI2MDQwNTI5MTkwNTA1NjViNjNmZmZmZmZmZjgxMTY4MTE0NjEwOTE4NTc2MDAwODBmZDViNjAwMDgwODI4NDAzNjA4MDgxMTIxNTYxMGI5MzU3NjAwMDgwZmQ1YjgzMzU2MTBiOWU4MTYxMDkwMzU2NWI5MjUwNjA2MDYwMWYxOTgyMDExMjE1NjEwYmIyNTc2MDAwODBmZDViNTA2MTBiYmI2MTBhY2Q1NjViNjAyMDg0MDEzNTYxMGJjOTgxNjEwYjZkNTY1YjgxNTI2MDQwODQwMTM1NjEwYmQ5ODE2MTA5MDM1NjViNjAyMDgyMDE1MjYwNjA4NDAxMzU2MTBiZWM4MTYxMGI2ZDU2NWI2MDQwODIwMTUyOTE5NDkxOTM1MDkwOTE1MDUwNTY1YjgwMTUxNTgxMTQ2MTA5MTg1NzYwMDA4MGZkNWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwYzI0NTc2MTBjMjQ2MTBhYjc1NjViNTA2MDFmMDE2MDFmMTkxNjYwMjAwMTkwNTY1YjYwMDA4MjYwMWY4MzAxMTI2MTBjNDM1NzYwMDA4MGZkNWI4MTM1NjEwYzU2NjEwYzUxODI2MTBjMGE1NjViNjEwYjNjNTY1YjgxODE1Mjg0NjAyMDgzODYwMTAxMTExNTYxMGM2YjU3NjAwMDgwZmQ1YjgxNjAyMDg1MDE2MDIwODMwMTM3NjAwMDkxODEwMTYwMjAwMTkxOTA5MTUyOTM5MjUwNTA1MDU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMGM5YjU3NjAwMDgwZmQ1YjYxMGNhNTgzMzU2MTA5MDM1NjViODIzNTkxNTA2N2ZmZmZmZmZmZmZmZmZmZmY4MDYwMjA4NTAxMzUxMTE1NjEwY2MzNTc2MDAwODBmZDViNjAyMDg0MDEzNTg0MDE4NTYwMWY4MjAxMTI2MTBjZDk1NzYwMDA4MGZkNWI4MTgxMzUxMTE1NjEwY2VhNTc2MTBjZWE2MTBhYjc1NjViNjEwY2ZhNjAyMDgyMzU2MDA1MWIwMTYxMGIzYzU2NWI4MTM1ODA4MjUyNjAyMDgwODMwMTkyOTE2MDA1MWI4NDAxMDE4ODgxMTExNTYxMGQxOTU3NjAwMDgwZmQ1YjYwMjA4NDAxNWI4MTgxMTAxNTYxMGUzYTU3ODU4MTM1MTExNTYxMGQzNDU3NjAwMDgwZmQ1YjgwMzU4NTAxNjAxZjE5NjA0MDgyOGQwMzgyMDExMjE1NjEwZDRkNTc2MDAwODBmZDViNjEwZDU1NjEwYWY2NTY1YjYwMjA4MzAxMzU4MTUyODg2MDQwODQwMTM1MTExNTYxMGQ2ZDU3NjAwMDgwZmQ1YjYwNDA4MzAxMzU4MzAxOTI1MDYwYTA4Mjg0OGYwMzAxMTIxNTYxMGQ4ODU3NjAwMDgwZmQ1YjYxMGQ5MDYxMGIxOTU2NWI5MTUwNjEwZDlmNjAyMDg0MDEzNTYxMGJmYzU2NWI2MDIwODMwMTM1ODI1MjYxMGRiMzYwNDA4NDAxMzU2MTA5MDM1NjViNjA0MDgzMDEzNTYwMjA4MzAxNTI4ODYwNjA4NDAxMzUxMTE1NjEwZGNlNTc2MDAwODBmZDViNjEwZGUxOGQ2MDIwNjA2MDg2MDEzNTg2MDEwMTYxMGMzMjU2NWI2MDQwODMwMTUyODg2MDgwODQwMTM1MTExNTYxMGRmNzU3NjAwMDgwZmQ1YjYxMGUwYThkNjAyMDYwODA4NjAxMzU4NjAxMDE2MTBjMzI1NjViNjA2MDgzMDE1MjYxMGUxYjYwYTA4NDAxNjEwOTFiNTY1YjYwODA4MzAxNTI2MDIwODE4MTAxOTI5MDkyNTI4NjUyOTQ4NTAxOTQ5MTkwOTEwMTkwNTA2MTBkMWU1NjViNTA5NTk4OTA5NzUwOTU1MDUwNTA1MDUwNTA1NjViNjAwMDgwNjA0MDgzODUwMzEyMTU2MTBlNWM1NzYwMDA4MGZkNWI4MjM1NjEwZTY3ODE2MTA5MDM1NjViOTE1MDYwMjA4MzAxMzU2MTBlNzc4MTYxMDkwMzU2NWI4MDkxNTA1MDkyNTA5MjkwNTA1NjViODI4MTUyNjA4MDgxMDE2MTA5OTk2MDIwODMwMTg0ODA1MTYzZmZmZmZmZmY5MDgxMTY4MzUyNjAyMDgwODMwMTUxNjAwMTYwMDE2MGEwMWIwMzE2OTA4NDAxNTI2MDQwOTE4MjAxNTExNjkxMDE1MjU2NWI2MDAwODI1MTYxMGVjZTgxODQ2MDIwODcwMTYxMDljYzU2NWI5MTkwOTEwMTkyOTE1MDUwNTY1YjgwNTE2MDAzODE5MDBiODExNDYxMDkyNjU3NjAwMDgwZmQ1YjYwMDA2MDIwODI4NDAzMTIxNTYxMGVmYzU3NjAwMDgwZmQ1YjYxMDk5OTgyNjEwZWQ4NTY1YjgwNTE2MTA5MjY4MTYxMDkwMzU2NWI2MDAwODI2MDFmODMwMTEyNjEwZjIxNTc2MDAwODBmZDViODE1MTYxMGYyZjYxMGM1MTgyNjEwYzBhNTY1YjgxODE1Mjg0NjAyMDgzODYwMTAxMTExNTYxMGY0NDU3NjAwMDgwZmQ1YjYxMGFhZjgyNjAyMDgzMDE2MDIwODcwMTYxMDljYzU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMGY2ODU3NjAwMDgwZmQ1YjYxMGY3MTgzNjEwZWQ4NTY1YjkxNTA2MDIwODMwMTUxNjdmZmZmZmZmZmZmZmZmZmZmODA4MjExMTU2MTBmOGU1NzYwMDA4MGZkNWI5MDg0MDE5MDYwYTA4Mjg3MDMxMjE1NjEwZmEyNTc2MDAwODBmZDViNjEwZmFhNjEwYjE5NTY1YjgyNTE2MTBmYjU4MTYxMGJmYzU2NWI4MTUyNjAyMDgzMDE1MTYxMGZjNTgxNjEwOTAzNTY1YjYwMjA4MjAxNTI2MDQwODMwMTUxODI4MTExMTU2MTBmZGM1NzYwMDA4MGZkNWI2MTBmZTg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw6JKrzAJ5DlbIWrgcvTE4H/U6B642i72zWb7t+9Og/aV21c007FF47DPWy9lAwb6lGgsI+ZnbqgYQi7ykRSIPCgkIvZnbqgYQpAwSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQi9mduqBhCqDBICGAISAhgDGNPltjEiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBmAgSAxivCCKQCDg4ODI4NjAxNjEwZjEwNTY1YjYwNDA4MzAxNTI1MDYwNjA4MzAxNTE4MjgxMTExNTYxMTAwMDU3NjAwMDgwZmQ1YjYxMTAwYzg4ODI4NjAxNjEwZjEwNTY1YjYwNjA4MzAxNTI1MDYxMTAxZTYwODA4NDAxNjEwZjA1NTY1YjYwODA4MjAxNTI4MDkzNTA1MDUwNTA5MjUwOTI5MDUwNTY1YjYwMDE2MDAxNjBhMDFiMDM4MzE2ODE1MjYwODA4MTAxNjEwOTk5NjAyMDgzMDE4NDgwNTE2M2ZmZmZmZmZmOTA4MTE2ODM1MjYwMjA4MDgzMDE1MTYwMDE2MDAxNjBhMDFiMDMxNjkwODQwMTUyNjA0MDkxODIwMTUxMTY5MTAxNTI1NjViNjAwMDYwNDA4MDgzMDE2MDAxNjAwMTYwYTAxYjAzODYxNjg0NTI2MDIwODI4MTg2MDE1MjgxODY1MTgwODQ1MjYwNjA4NzAxOTE1MDYwNjA4MTYwMDUxYjg4MDEwMTkzNTA4Mjg4MDE2MDAwNWI4MjgxMTAxNTYxMTBlOTU3ODg4NjAzNjA1ZjE5MDE4NDUyODE1MTgwNTE4NzUyODUwMTUxODU4NzAxODg5MDUyNjExMGQ2ODg4ODAxODI2MTBhMjg1NjViOTY1MDUwOTI4NDAxOTI5MDg0MDE5MDYwMDEwMTYxMTBhYTU2NWI1MDkzOTk5ODUwNTA1MDUwNTA1MDUwNTA1MDU2NWI2MDAwODA4Mjg0MDM2MDgwODExMjE1NjExMTBjNTc2MDAwODBmZDViNjExMTE1ODQ2MTBlZDg1NjViOTI1MDYwNjA2MDFmMTk4MjAxMTIxNTYxMTEyOTU3NjAwMDgwZmQ1YjUwNjExMTMyNjEwYWNkNTY1YjYwMjA4NDAxNTE2MTExNDA4MTYxMGI2ZDU2NWI4MTUyNjA0MDg0MDE1MTYxMTE1MDgxNjEwOTAzNTY1YjYwMjA4MjAxNTI2MDYwODQwMTUxNjEwYmVjODE2MTBiNmQ1NjViNjAwMDgwNjA0MDgzODUwMzEyMTU2MTExNzY1NzYwMDA4MGZkNWI2MTExN2Y4MzYxMGVkODU2NWI5MTUwNjAyMDgzMDE1MTYxMGU3NzgxNjEwYmZjNTY1YjYwMDA2MDIwODI4NDAzMTIxNTYxMTFhMTU3NjAwMDgwZmQ1YjgxNTE4MDYwMDcwYjgxMTQ2MTA5OTk1NzYwMDA4MGZkZmVhMjY0Njk3MDY2NzM1ODIyMTIyMDkxZDY1YzY1ZWVhOTljOWFhMTYwOGYxODEyODA3NDMzOWQ0OWI0NmQ5ZjY2YWY5MTA4ZmEwYzRlN2Q2MmQyYTU2NDczNmY2YzYzNDMwMDA4MGIwMDMz","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwCD+W7xemmPK0XwTwkD6iBA8U0us4Z24KQzHYZRH9BOri2UuP8/sOGHri2vf+hhESGgwI+ZnbqgYQi57DuAIiDwoJCL2Z26oGEKoMEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQi+mduqBhCsDBICGAISAhgDGJb7rp0CIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5CRQoDGK8IGiISIMjdl2PN6CFygzRg+TDHPDdg3SzviCauWfrnwV/6GYEVIJChD0IFCIDO2gNSAFoAagtjZWxsYXIgZG9vcg==","b64Record":"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YQnPVluDgREVYQn2V2AAhIQBUltQUFBQVltgAIFRgIRSYQoUgWAghgFgIIYBYQnMVltgHwFgHxkWkpCSAWAgAZKRUFBWW4BRFRWCUmAAYCCCAVFgAWABYKAbA4CCFmAghgFSYECEAVGRUGCgYECGAVJhCmBgoIYBg2EJ/FZbkVBgYIQBUYWDA2BghwFSYQp5g4JhCfxWW5JQUIBggIUBURZggIYBUlCAkVBQkpFQUFZbgmAHC4FSYEBgIIIBUmAAYQqvYECDAYRhCihWW5STUFBQUFZbY05Ie3Fg4BtgAFJgQWAEUmAkYAD9W2BAUWBggQFn//////////+BEYKCEBcVYQrwV2EK8GEKt1ZbYEBSkFZbYECAUZCBAWf//////////4ERgoIQFxVhCvBXYQrwYQq3VltgQFFgoIEBZ///////////gRGCghAXFWEK8FdhCvBhCrdWW2BAUWAfggFgHxkWgQFn//////////+BEYKCEBcVYQtlV2ELZWEKt1ZbYEBSkZBQVltj/////4EWgRRhCRhXYACA/VtgAICChANggIESFWELk1dgAID9W4M1YQuegWEJA1ZbklBgYGAfGYIBEhVhC7JXYACA/VtQYQu7YQrNVltgIIQBNWELyYFhC21WW4FSYECEATVhC9mBYQkDVltgIIIBUmBghAE1YQvsgWELbVZbYECCAVKRlJGTUJCRUFBWW4AVFYEUYQkYV2AAgP1bYABn//////////+CERVhDCRXYQwkYQq3VltQYB8BYB8ZFmAgAZBWW2AAgmAfgwESYQxDV2AAgP1bgTVhDFZhDFGCYQwKVlthCzxWW4GBUoRgIIOGAQERFWEMa1dgAID9W4FgIIUBYCCDATdgAJGBAWAgAZGQkVKTklBQUFZbYACAYECDhQMSFWEMm1dgAID9W2EMpYM1YQkDVluCNZFQZ///////////gGAghQE1ERVhDMNXYACA/VtgIIQBNYQBhWAfggESYQzZV2AAgP1bgYE1ERVhDOpXYQzqYQq3VlthDPpgIII1YAUbAWELPFZbgTWAglJgIICDAZKRYAUbhAEBiIERFWENGVdgAID9W2AghAFbgYEQFWEOOleFgTURFWENNFdgAID9W4A1hQFgHxlgQIKNA4IBEhVhDU1XYACA/VthDVVhCvZWW2AggwE1gVKIYECEATURFWENbVdgAID9W2BAgwE1gwGSUGCggoSPAwESFWENiFdgAID9W2ENkGELGVZbkVBhDZ9gIIQBNWEL/FZbYCCDATWCUmENs2BAhAE1YQkDVltgQIMBNWAggwFSiGBghAE1ERVhDc5XYACA/VthDeGNYCBgYIYBNYYBAWEMMlZbYECDAVKIYICEATURFWEN91dgAID9W2EOCo1gIGCAhgE1hgEBYQwyVltgYIMBUmEOG2CghAFhCRtWW2CAgwFSYCCBgQGSkJJShlKUhQGUkZCRAZBQYQ0eVltQlZiQl1CVUFBQUFBQVltgAIBgQIOFAxIVYQ5cV2AAgP1bgjVhDmeBYQkDVluRUGAggwE1YQ53gWEJA1ZbgJFQUJJQkpBQVluCgVJggIEBYQmZYCCDAYSAUWP/////kIEWg1JgIICDAVFgAWABYKAbAxaQhAFSYECRggFRFpEBUlZbYACCUWEOzoGEYCCHAWEJzFZbkZCRAZKRUFBWW4BRYAOBkAuBFGEJJldgAID9W2AAYCCChAMSFWEO/FdgAID9W2EJmYJhDthWW4BRYQkmgWEJA1ZbYACCYB+DARJhDyFXYACA/VuBUWEPL2EMUYJhDApWW4GBUoRgIIOGAQERFWEPRFdgAID9W2EKr4JgIIMBYCCHAWEJzFZbYACAYECDhQMSFWEPaFdgAID9W2EPcYNhDthWW5FQYCCDAVFn//////////+AghEVYQ+OV2AAgP1bkIQBkGCggocDEhVhD6JXYACA/VthD6phCxlWW4JRYQ+1gWEL/FZbgVJgIIMBUWEPxYFhCQNWW2AgggFSYECDAVGCgREVYQ/cV2AAgP1bYQ/oiIKGAWEPEFZbYECDAVJQYGCDAVGCgREVYRAAV2AAgP1bYRAMiIKGAWEPEFZbYGCDAVJQYRAeYICEAWEPBVZbYICCAVKAk1BQUFCSUJKQUFZbYAFgAWCgGwODFoFSYICBAWEJmWAggwGEgFFj/////5CBFoNSYCCAgwFRYAFgAWCgGwMWkIQBUmBAkYIBURaRAVJWW2AAYECAgwFgAWABYKAbA4YWhFJgIIKBhgFSgYZRgIRSYGCHAZFQYGCBYAUbiAEBk1CCiAFgAFuCgRAVYRDpV4iGA2BfGQGEUoFRgFGHUoUBUYWHAYiQUmEQ1oiIAYJhCihWW5ZQUJKEAZKQhAGQYAEBYRCqVltQk5mYUFBQUFBQUFBQVltgAICChANggIESFWERDFdgAID9W2ERFYRhDthWW5JQYGBgHxmCARIVYREpV2AAgP1bUGERMmEKzVZbYCCEAVFhEUCBYQttVluBUmBAhAFRYRFQgWEJA1ZbYCCCAVJgYIQBUWEL7IFhC21WW2AAgGBAg4UDEhVhEXZXYACA/VthEX+DYQ7YVluRUGAggwFRYQ53gWEL/FZbYABgIIKEAxIVYRGhV2AAgP1bgVGAYAcLgRRhCZlXYACA/f6iZGlwZnNYIhIgkdZcZe6pnJqhYI8YEoB0M51JtG2fZq+RCPoMTn1i0qVkc29sY0MACAsAMyKAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAowJoMOgMYsAhKFgoUAAAAAAAAAAAAAAAAAAAAAAAABDByBwoDGLAIEAFSFgoJCgIYAhD/ssUNCgkKAhhiEICzxQ0="},{"b64Body":"Cg8KCQi+mduqBhCyDBICGAISAhgDGP2NkRAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjqoCEwoDGK4IGgVtZXRhMRoFbWV0YTI=","b64Record":"CiYIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1gCcgIBAhIwDch93UV5230xlkHjJp03OUMpHKW9DmRKcj17J0GQ3iPankVaRUpTPQ+xqsJiygNLGgwI+pnbqgYQi92ExgIiDwoJCL6Z26oGELIMEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFofCgMYrggaCwoCGAASAxirCBgBGgsKAhgAEgMYqwgYAg=="},{"b64Body":"Cg8KCQi/mduqBhC1DBICGAISAhgDGIDC1y8iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIDFhIUCgMYrggSAxirCBoDGLAIIgECKgA=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw0wyFLGUlhvUIvRCMxHfvL3rKJxN8RXC7SWiFoHa1zG5BM6CyXwB8OiUVW8/2Yqn8GgsI+5nbqgYQi7DaXiIPCgkIv5nbqgYQtQwSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQi/mduqBhC3DBICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxiwCBCgjQYihAFQgd7TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=","b64Record":"CiUIISIDGLAIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjBUvHE1UA/L1XcX20FBPa6RXHb6x6gsmzVpxwXkDNNBPUstrSdVK5cZ6nBSH6TDOasaDAj7mduqBhDD5r7QAiIPCgkIv5nbqgYQtwwSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCA19oCOtEBGsoBMHgwOGMzNzlhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE1NTQ3MjYxNmU3MzY2NjU3MjIwNjY3MjZmNmQyMDY2NjE2OTZjNjU2NDIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCiA8QRSFgoJCgIYAhD/rbUFCgkKAhhiEICutQU="},{"b64Body":"ChEKCQi/mduqBhC3DBICGAIgAXIXEhUKAxiuCBoOCgMYqwgSAxitCBgBIAE=","b64Record":"CgMIpAISMCyI7XbBF316XAseMGOEC11YhSJiKwB74nc4OL70Ms6hgVitw4uescFiI7E8J80YwhoMCPuZ26oGEMTmvtACIhEKCQi/mduqBhC3DBICGAIgATrbAQoDGOcCEiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJBofU1BFTkRFUl9ET0VTX05PVF9IQVZFX0FMTE9XQU5DRSiFblCxwARihAGbI9PZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFqAxiwCFIAegwI+5nbqgYQw+a+0AI="},{"b64Body":"Cg8KCQjAmduqBhC5DBICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxiwCBCgjQYihAFQgd7TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI=","b64Record":"CiUIFiIDGLAIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDzhCTZloxt0uFLVXRJ07+IEzcDcdJsj2/5wtPlrU0crTHaI5PBtB6h+EAmwSOq+IYaCwj8mduqBhDjoIllIg8KCQjAmduqBhC5DBICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMIDX2gI6nwUKAxiwCCKAAgQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAACAAAAACgAAAAAAAAAAAAAAogPEEMpADCgMYrggSgAIEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAACAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAgAAAAAoAAAAAAAAAAAAAAGiDd8lKtG+LIm2nCsGj8N42qlSun8WPEoRYo9VpN9SOz7xogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCsaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQtGiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlIWCgkKAhgCEP+ttQUKCQoCGGIQgK61BQ=="},{"b64Body":"ChEKCQjAmduqBhC5DBICGAIgAXIXEhUKAxiuCBoOCgMYqwgSAxitCBgCIAE=","b64Record":"CgIIFhIw1tkOL58y0sZp+XH1/64D7mMhWJ5TWs2PK2jw89diJxpawqD+QgCk4EysM5nUmNgoGgsI/JnbqgYQ5KCJZSIRCgkIwJnbqgYQuQwSAhgCIAE6ugEKAxjnAhIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYohW5QscAEYoQBmyPT2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAELQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACagMYsAhSAFoTCgMYrggaDAoDGKsIEgMYrQgYAnIKCgMYrggSAxitCHoLCPyZ26oGEOOgiWU="}]},"HapiTransferFromForNFTWithCustomFeesWithoutApproveFails":{"placeholderNum":1073,"encodedItems":[{"b64Body":"Cg8KCQjEmduqBhDdDBICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIB0FghDi7oKy8BA/s1wbmAXIuq0EUygc1R6ezTz13GJwEICU69wDSgUIgM7aAw==","b64Record":"CiUIFhIDGLIIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCU4hC6/ZbM2P+zoJKpfKU8CfIzCj9QGRHqUZGkSNleNU00TI93u6Qk0B8zi8Z/yS4aDAiAmtuqBhDrkeecAiIPCgkIxJnbqgYQ3QwSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxiyCBCAqNa5Bw=="},{"b64Body":"Cg8KCQjFmduqBhDfDBICGAISAhgDGOy4wBgiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlozCiISIFvj3M06ycDtfxu5h+hr9I8LCxa7QNlh5eGoTZU8AyY4EIDIr6AlSgUIgM7aA3AF","b64Record":"CiUIFhIDGLMIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDHGl9Tc0fWS9WbzKXegIVDv8ECEm06vGR7+N5xWZyGtmFaxfnADQA0vRrTE/aLBR0aCwiBmtuqBhDb3utHIg8KCQjFmduqBhDfDBICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUhkKCgoCGAIQ/4/fwEoKCwoDGLMIEICQ38BK"},{"b64Body":"Cg8KCQjFmduqBhDhDBICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIL4x0JnS14iKhKwhLZpTltDk0VE7eliUalOooqVzIVgyEIDIr6AlSgUIgM7aAw==","b64Record":"CiUIFhIDGLQIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjBPHfzj5e6A7nYboHnbCM15DH+xfqvZqLkqcDnU2sHLKlxEB5xp3C4ejJk3S0+xpSQaDAiBmtuqBhC7lO6pAiIPCgkIxZnbqgYQ4QwSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+P38BKCgsKAxi0CBCAkN/ASg=="},{"b64Body":"Cg8KCQjGmduqBhDjDBICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIITAmOQgGOyjEnSSkMx4MuFnmI0yO58rSw2yniqESwEEEIDIr6AlSgUIgM7aAw==","b64Record":"CiUIFhIDGLUIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjBrWCxYK+nsANccV50ENkJ4DbhBxp3BbraqQJdSNVDAWXdnLegjwMtOdLrGv19FMSUaCwiCmtuqBhCrsdM6Ig8KCQjGmduqBhDjDBICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUhkKCgoCGAIQ/4/fwEoKCwoDGLUIEICQ38BK"},{"b64Body":"Cg8KCQjGmduqBhDlDBICGAISAhgDGKv2rdIFIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAY4BChhuZnRUb2tlbldpdGhGaXhlZEhiYXJGZWUSCFFPTVhNWldEKgMYswgyIhIgW+PczTrJwO1/G7mH6Gv0jwsLFrtA2WHl4ahNlTwDJjhSIhIgW+PczTrJwO1/G7mH6Gv0jwsLFrtA2WHl4ahNlTwDJjhqDAiC6LWuBhDgvqeoAogBAaoBCQoCCAEaAxizCA==","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGLYIEjAATQCsBtqhpn/jE91pugMwDQuJQFKL/ETNvEBZ/PGYn4Gvo1MOmr3AxAo8GRwjimIaDAiCmtuqBhDj8OzDAiIPCgkIxpnbqgYQ5QwSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAcgoKAxi2CBIDGLMI"},{"b64Body":"Cg8KCQjHmduqBhDnDBICGAISAhgDGJHE9OgCIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qATEKEGZ1bmdpYmxlVG9rZW5GZWUSCEVOWEVJVURNIOgHKgMYsghqCwiD6LWuBhDAvqhG","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGLcIEjBENri993zThOgm9CJCNu+rUSgZuD6a8dXgiZ+CjYI6g1JcJ1rKTVx+NEqZXDf5MVMaCwiDmtuqBhCjtqBUIg8KCQjHmduqBhDnDBICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUgBaDwoDGLcIEggKAxiyCBDQD3IKCgMYtwgSAxiyCA=="},{"b64Body":"Cg8KCQjHmduqBhDtDBICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGLQIEgMYtwg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw5ENJED8C1m01la8xjyg7vkyhuGbqnXEL+q0ZHqTx2z4Lt/bu29Ecr1819G68rQFuGgwIg5rbqgYQu6+OxgIiDwoJCMeZ26oGEO0MEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjImduqBhDzDBICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGLMIEgMYtwg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwaUPhRFR/8n12gPn0rbqnJ+9ucD07rpO0Z2+7k6oizcVYkTuGmfdJQ6BTt1ClVMdSGgsIhJrbqgYQi9n/WyIPCgkIyJnbqgYQ8wwSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjImduqBhD5DBICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGLUIEgMYtwg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwJa08SznCiBtHabHacCM54lMGlZXXdD0NvsK/IXiaVqsKQtUdFZiPduBGTFMA1oiCGgwIhJrbqgYQi5LA5AIiDwoJCMiZ26oGEPkMEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjJmduqBhD7DBICGAISAhgDGITe79IFIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAZMBChluZnRUb2tlbldpdGhGaXhlZFRva2VuRmVlEghSVExaRUhGRyoDGLMIMiISIFvj3M06ycDtfxu5h+hr9I8LCxa7QNlh5eGoTZU8AyY4UiISIFvj3M06ycDtfxu5h+hr9I8LCxa7QNlh5eGoTZU8AyY4agsIhei1rgYQoPPBXogBAaoBDgoHCAESAxi3CBoDGLMI","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGLgIEjAI3FhYK+22bUY3WM780HCYXePNnElFvyCVi6kDRLYQuBTAwCm4ObQxB5c9LjHx81YaCwiFmtuqBhCjpZZ1Ig8KCQjJmduqBhD7DBICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUgByCgoDGLgIEgMYswg="},{"b64Body":"Cg8KCQjJmduqBhD9DBICGAISAhgDGL/ilNMFIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAaQBCiZuZnRUb2tlbldpdGhSb3lhbHR5RmVlV2l0aEhiYXJGYWxsYmFjaxIIUk5MSk5BQkwqAxizCDIiEiBb49zNOsnA7X8buYfoa/SPCwsWu0DZYeXhqE2VPAMmOFIiEiBb49zNOsnA7X8buYfoa/SPCwsWu0DZYeXhqE2VPAMmOGoMCIXota4GEJjQqNICiAEBqgERGgMYswgiCgoECAEQAhICCAE=","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGLkIEjDLkDbtYEhfKk5ur2mr+hJJvAv3co7djvOTIIICxWCF1uEMclbEFdvuSeCULsnj2M4aDAiFmtuqBhCT8P7lAiIPCgkIyZnbqgYQ/QwSAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAcgoKAxi5CBIDGLMI"},{"b64Body":"Cg8KCQjKmduqBhD/DBICGAISAhgDGJnK1tMFIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAakBCiduZnRUb2tlbldpdGhSb3lhbHR5RmVlV2l0aFRva2VuRmFsbGJhY2sSCEJaT0VIS0NBKgMYswgyIhIgW+PczTrJwO1/G7mH6Gv0jwsLFrtA2WHl4ahNlTwDJjhSIhIgW+PczTrJwO1/G7mH6Gv0jwsLFrtA2WHl4ahNlTwDJjhqCwiG6LWuBhCAioxqiAEBqgEWGgMYswgiDwoECAEQAhIHCAESAxi3CA==","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGLoIEjCH5asOiarP8keqhe9LupY5amUgWUDoPpd8tzIxK+VOPE4nEu8+bDXXi0tHrmXZAwYaCwiGmtuqBhCjwd12Ig8KCQjKmduqBhD/DBICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUgByCgoDGLoIEgMYswg="},{"b64Body":"Cg8KCQjKmduqBhCFDRICGAISAhgDGP3jryIiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICGQoDGLQIEgMYtggSAxi4CBIDGLkIEgMYugg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwm2W0qX/lc+kuUPa4hZTFjNR+ATYOhtN2XOqPqk+u6zsGjtU1jMtehY3uOLwmXQjiGgwIhprbqgYQm8z87gIiDwoJCMqZ26oGEIUNEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjLmduqBhCLDRICGAISAhgDGP3jryIiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICGQoDGLUIEgMYtggSAxi4CBIDGLkIEgMYugg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwIXE+x8cBwR5j1q3gNPZv5JMx9/Dc74g1T1gNIB52ad8X8YAPqpcMMYgRzAyYc+CvGgwIh5rbqgYQ0/HuhQEiDwoJCMuZ26oGEIsNEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjLmduqBhCRDRICGAISAhgDGP2NkRAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjqoCEwoDGLYIGgVtZXRhMRoFbWV0YTI=","b64Record":"CiYIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1gCcgIBAhIwhVLWR34RZ2M30FdZd+XaUnWB57WC0tsbz8jv29dbSGqe5BSB/O285BmYTZz/qvdYGgwIh5rbqgYQ+7eH+AIiDwoJCMuZ26oGEJENEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFofCgMYtggaCwoCGAASAxizCBgBGgsKAhgAEgMYswgYAg=="},{"b64Body":"Cg8KCQjMmduqBhCZDRICGAISAhgDGP2NkRAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjqoCEwoDGLgIGgVtZXRhMxoFbWV0YTQ=","b64Record":"CiYIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1gCcgIBAhIwfITayaB/a3Y8sPlM0WnfuaSa/vMOV1pAAvRXDJAG8J/qcChO+56t4zu0q6VCMongGgwIiJrbqgYQo+XNoQEiDwoJCMyZ26oGEJkNEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFofCgMYuAgaCwoCGAASAxizCBgBGgsKAhgAEgMYswgYAg=="},{"b64Body":"Cg8KCQjMmduqBhChDRICGAISAhgDGP2NkRAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjqoCEwoDGLkIGgVtZXRhNRoFbWV0YTY=","b64Record":"CiYIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1gCcgIBAhIwUdap5cUn8z8ZRxyhcPjan8KfYVCz9LmdkUSHzRgfTqPM2GZk1XmVjr2CdCVU9dY0GgwIiJrbqgYQ672gkAMiDwoJCMyZ26oGEKENEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFofCgMYuQgaCwoCGAASAxizCBgBGgsKAhgAEgMYswgYAg=="},{"b64Body":"Cg8KCQjNmduqBhCpDRICGAISAhgDGP2NkRAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjqoCEwoDGLoIGgVtZXRhNxoFbWV0YTg=","b64Record":"CiYIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1gCcgIBAhIwWSwmZgRl7NLwmB6UtPdqFB9XD4EEI0cma7lIerXYndKcxPVc+lvTnzyAyMzYVcZfGgwIiZrbqgYQ+7bLnwEiDwoJCM2Z26oGEKkNEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFofCgMYuggaCwoCGAASAxizCBgBGgsKAhgAEgMYswgYAg=="},{"b64Body":"Cg8KCQjNmduqBhCtDRICGAISAhgDGI3GPCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchUSEwoDGLYIGgwKAxizCBIDGLQIGAE=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwFzqn2M58+ZEiuo5xiWVn5hSLLL8AWhkjjoh4H94uK5xSbJNbW8sbf40etH3l+O//GgwIiZrbqgYQm5qvqQMiDwoJCM2Z26oGEK0NEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFoTCgMYtggaDAoDGLMIEgMYtAgYAQ=="},{"b64Body":"Cg8KCQjOmduqBhCvDRICGAISAhgDGI3GPCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchUSEwoDGLgIGgwKAxizCBIDGLQIGAE=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw6IioVqhdKkD/ZItt02htoD5ju5FDOxxPIgisIGYbLNtxPd7eCd705fpPWWC5VwwYGgwIiprbqgYQk4/SvAEiDwoJCM6Z26oGEK8NEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFoTCgMYuAgaDAoDGLMIEgMYtAgYAQ=="},{"b64Body":"Cg8KCQjOmduqBhCxDRICGAISAhgDGI3GPCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchUSEwoDGLkIGgwKAxizCBIDGLQIGAE=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwTtFOauReeNK7ibjmx250tda6u/vvCw9jD6mHqSqx4Z5D/PqPWpIDPknkz78bTLXIGgwIiprbqgYQ86fyswMiDwoJCM6Z26oGELENEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFoTCgMYuQgaDAoDGLMIEgMYtAgYAQ=="},{"b64Body":"Cg8KCQjPmduqBhCzDRICGAISAhgDGI3GPCICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchUSEwoDGLoIGgwKAxizCBIDGLQIGAE=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwDNcOG7GmbNxhnJVmQojAhmL3DKylqdVdR2oyy+Zbej93SvPDRwm4oyi1UVSKpuEtGgwIi5rbqgYQk6jzygEiDwoJCM+Z26oGELMNEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFoTCgMYuggaDAoDGLMIEgMYtAgYAQ=="},{"b64Body":"Cg8KCQjPmduqBhC1DRICGAISAhgDGP7LzSwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjooBjwESDAiL6LWuBhDYx5elAxptCiISIB0i7m9toVmvbOdrgmO9XboO+pP29u0iBqAVHOuYQ60gCiM6IQJh76+8qeP6ylYq8BhXVrcE+b1atTI4wMNPebLaDF5gMwoiEiDhyMMSMSM3+3v+kzpdZ9qmKsCZXG5lnBe3hv55utcMOyIMSGVsbG8gV29ybGQhKgAyAA==","b64Record":"CiUIFhoDGLsIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjBrTHIk9gzyw/7V4UMgetRkVDFx0nOmh2E+o5RWt2bpYwFRx6+Pk1a+6mI1vMrhBfoaDAiLmtuqBhDT7ei5AyIPCgkIz5nbqgYQtQ0SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjQmduqBhC5DRICGAISAhgDGIudjj4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjpoBiCAKAxi7CCKAIDYwODA2MDQwNTIzNDgwMTU2MTAwMTA1NzYwMDA4MGZkNWI1MDYxMTFlODgwNjEwMDIwNjAwMDM5NjAwMGYzZmU2MDgwNjA0MDUyMzQ4MDE1NjEwMDEwNTc2MDAwODBmZDViNTA2MDA0MzYxMDYxMDBhOTU3NjAwMDM1NjBlMDFjODA2MzZmYzNjYmFmMTE2MTAwNzE1NzgwNjM2ZmMzY2JhZjE0NjEwMTMwNTc4MDYzN2M0MWFkMmMxNDYxMDE1NjU3ODA2MzhmOGQ3Zjk5MTQ2MTAxNjk1NzgwNjNhZjk5YzYzMzE0NjEwMTdjNTc4MDYzZDYxNGNkYjgxNDYxMDE4ZjU3ODA2M2YyYzMxZmY0MTQ2MTAxYjA1NzYwMDA4MGZkNWI4MDYzMTNhOGVkNTMxNDYxMDBhZTU3ODA2MzNiM2JmZjBmMTQ2MTAwYzM1NzgwNjMzYzRkZDMyZTE0NjEwMGU5NTc4MDYzNTA4MWRlZDMxNDYxMDEwYTU3ODA2MzU5M2Q2ZTgyMTQ2MTAxMWQ1NzViNjAwMDgwZmQ1YjYxMDBjMTYxMDBiYzM2NjAwNDYxMDkyYjU2NWI2MTAxZGQ1NjViMDA1YjYxMDBkNjYxMDBkMTM2NjAwNDYxMDk3YzU2NWI2MTAyNDM1NjViNjA0MDUxOTA4MTUyNjAyMDAxNWI2MDQwNTE4MDkxMDM5MGYzNWI2MTAwZmM2MTAwZjczNjYwMDQ2MTA5YTA1NjViNjEwMzFkNTY1YjYwNDA1MTYxMDBlMDkyOTE5MDYxMGE5MzU2NWI2MTAwYzE2MTAxMTgzNjYwMDQ2MTA5MmI1NjViNjEwNDA0NTY1YjYxMDBkNjYxMDEyYjM2NjAwNDYxMGI3ZjU2NWI2MTA0MTI1NjViNjEwMTQzNjEwMTNlMzY2MDA0NjEwYzg4NTY1YjYxMDRlZjU2NWI2MDQwNTE2MDA3OTE5MDkxMGI4MTUyNjAyMDAxNjEwMGUwNTY1YjYxMDBkNjYxMDE2NDM2NjAwNDYxMDk3YzU2NWI2MTA1MWI1NjViNjEwMTQzNjEwMTc3MzY2MDA0NjEwZTQ5NTY1YjYxMDU0OTU2NWI2MTAxNDM2MTAxOGEzNjYwMDQ2MTBlNDk1NjViNjEwNTdmNTY1YjYxMDFhMjYxMDE5ZDM2NjAwNDYxMDk3YzU2NWI2MTA1YjU1NjViNjA0MDUxNjEwMGUwOTI5MTkwNjEwZTgyNTY1YjYxMDFjMzYxMDFiZTM2NjAwNDYxMGU0OTU2NWI2MTA2YmY1NjViNjA0MDgwNTE2MDA3OTM5MDkzMGI4MzUyOTAxNTE1NjAyMDgzMDE1MjAxNjEwMGUwNTY1YjYwMDA2MTAxZWI4NTg1ODU4NTYxMDc4YTU2NWI2MDA3MGI5MDUwNjAxNjgxMTQ2MTAyM2M1NzYwNDA1MTYyNDYxYmNkNjBlNTFiODE1MjYwMjA2MDA0ODIwMTUyNjAxNTYwMjQ4MjAxNTI3NDU0NzI2MTZlNzM2NjY1NzIyMDY2NzI2ZjZkMjA2NjYxNjk2YzY1NjQyMTYwNTgxYjYwNDQ4MjAxNTI2MDY0MDE2MDQwNTE4MDkxMDM5MGZkNWI1MDUwNTA1MDUwNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MjE2NjAyNDgyMDE1MjYwMDA5MDgxOTA4MTkwNjEwMTY3OTA2MzNiM2JmZjBmNjBlMDFiOTA2MDQ0MDE1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE4MDUxNjAwMTYwMDE2MGUwMWIwMzE2NjAwMTYwMDE2MGUwMWIwMzE5OTA5NDE2OTM5MDkzMTc5MDkyNTI5MDUxNjEwMmFiOTE5MDYxMGViYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwMmU4NTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwMmVkNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTAyZmU1NzYwMTU2MTAzMTI1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTAzMTI5MTkwNjEwZWVhNTY1YjYwMDMwYjk0OTM1MDUwNTA1MDU2NWI2MDAwNjEwMzI3NjEwOGMwNTY1YjYwNDA4MDUxNjAwMTYwMDE2MGEwMWIwMzg2MTY2MDI0ODIwMTUyNjA0NDgwODIwMTg2OTA1MjgyNTE4MDgzMDM5MDkxMDE4MTUyNjA2NDkwOTEwMTgyNTI2MDIwODEwMTgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MzFlMjZlOTk3NjBlMTFiMTc5MDUyOTA1MTYwMDA5MTgyOTE2MTAxNjc5MTYxMDM4MTkxNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTAzYmU1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTAzYzM1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA2MTAzZDA2MTA4YzA1NjViODI2MTAzZGQ1NzYwMTU4MTYxMDNmMTU2NWI4MTgwNjAyMDAxOTA1MTgxMDE5MDYxMDNmMTkxOTA2MTBmNTU1NjViNjAwMzkxOTA5MTBiOTg5MDk3NTA5NTUwNTA1MDUwNTA1MDU2NWI2MDAwNjEwMWViODU4NTg1ODU2MTA4N2I1NjViNjAwMDgwNjAwMDYxMDE2NzYwMDE2MDAxNjBhMDFiMDMxNjYzNTkzZDZlODI2MGUwMWI4Njg2NjA0MDUxNjAyNDAxNjEwNDNlOTI5MTkwNjExMDMwNTY1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE4MDUxNjAwMTYwMDE2MGUwMWIwMzE2NjAwMTYwMDE2MGUwMWIwMzE5OTA5NDE2OTM5MDkzMTc5MDkyNTI5MDUxNjEwNDdjOTE5MDYxMGViYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwNGI5NTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwNGJlNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTA0Y2Y1NzYwMTU2MTA0ZTM1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTA0ZTM5MTkwNjEwZWVhNTY1YjYwMDMwYjk1OTQ1MDUwNTA1MDUwNTY1YjYwMDA4MDYwMDA2MTAxNjc2MDAxNjAwMTYwYTAxYjAzMTY2MzZmYzNjYmFmNjBlMDFiODY4NjYwNDA1MTYwMjQwMTYxMDQzZTkyOTE5MDYxMTA3MzU2NWI2MDQwNTE2MDAxNjAwMTYwYTAxYjAzODIxNjYwMjQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjMxZjEwNmI0YjYwZTIxYjkwNjA0NDAxNjEwMjZkNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MzgxMTY2MDI0ODMwMTUyODIxNjYwNDQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjM4ZjhkN2Y5OTYwZTAxYjkwNjA2NDAxNjEwNDNlNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MzgxMTY2MDI0ODMwMTUyODIxNjYwNDQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjNhZjk5YzYzMzYwZTAxYjkwNjA2NDAxNjEwNDNlNTY1YjYwNDA4MDUxNjA2MDgxMDE4MjUyNjAwMDgwODI1MjYwMjA4MDgzMDE4MjkwNTI4Mjg0MDE4MjkwNTI4MzUxNjAwMTYwMDE2MGEwMWIwMzg2MTY2MDI0ODA4MzAxOTE5MDkxNTI4NTUxODA4MzAzOTA5MTAxODE1MjYwNDQ5MDkxMDE4NTUyOTA4MTAxODA1MTYwMDE2MDAxNjBlMDFiMDMxNjYzMWFjMjk5Yjc2MGUzMWIxNzkwNTI5MjUxOTA5MjgzOTE4MjkxNjEwMTY3OTE2MTA2Mjc5MTkwNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTA2NjQ1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTA2Njk1NjViNjA2MDkxNTA1YjUwNjA0MDgwNTE2MDYwODEwMTgyNTI2MDAwODA4MjUyNjAyMDgyMDE4MTkwNTI5MTgxMDE5MTkwOTE1MjkxOTM1MDkxNTA4MjYxMDY5OTU3NjAxNTgxNjEwNmFkNTY1YjgxODA2MDIwMDE5MDUxODEwMTkwNjEwNmFkOTE5MDYxMTBmODU2NWI2MDAzOTE5MDkxMGI5NzkwOTY1MDk0NTA1MDUwNTA1MDU2NWI2MDQwODA1MTYwMDE2MDAxNjBhMDFiMDM4NDgxMTY2MDI0ODMwMTUyODMxNjYwNDQ4MDgzMDE5MTkwOTE1MjgyNTE4MDgzMDM5MDkxMDE4MTUyNjA2NDkwOTEwMTgyNTI2MDIwODEwMTgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MzNjYjBjN2ZkNjBlMjFiMTc5MDUyOTA1MTYwMDA5MTgyOTE4MjkxODI5MTYxMDE2NzkxNjEwNzIxOTE2MTBlYmM1NjViNjAwMDYwNDA1MTgwODMwMzgxNjAwMDg2NWFmMTkxNTA1MDNkODA2MDAwODExNDYxMDc1ZTU3NjA0MDUxOTE1MDYwMWYxOTYwM2YzZDAxMTY4MjAxNjA0MDUyM2Q4MjUyM2Q2MDAwNjAyMDg0MDEzZTYxMDc2MzU2NWI2MDYwOTE1MDViNTA5MTUwOTE1MDgxNjEwNzc2NTc2MDE1NjAwMDYxMDZhZDU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDZhZDkxOTA2MTExNjM1NjViNjA0MDUxNjAwMTYwMDE2MGEwMWIwMzg1ODExNjYwMjQ4MzAxNTI4NDgxMTY2MDQ0ODMwMTUyODMxNjYwNjQ4MjAxNTI2MDg0ODEwMTgyOTA1MjYwMDA5MDgxOTA4MTkwNjEwMTY3OTA2MzBhZWQ2NWY1NjBlMTFiOTA2MGE0MDE1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwZOdAtlXcjBPlMCZKFsVDdGLtJBwOgvQDVoSqsHGv4LMKOuuzVYe+8o89v2zurqwWGgwIjJrbqgYQu46HzwEiDwoJCNCZ26oGELkNEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjQmduqBhC/DRICGAISAhgDGPjR6j4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBiCASAxi7CCKAIDgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MDAxNjAwMTYwZTAxYjAzMTk5MDk0MTY5MzkwOTMxNzkwOTI1MjkwNTE2MTA4MDk5MTkwNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTA4NDY1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTA4NGI1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA4MTYxMDg1YzU3NjAxNTYxMDg3MDU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDg3MDkxOTA2MTExOGY1NjViOTc5NjUwNTA1MDUwNTA1MDUwNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4NTgxMTY2MDI0ODMwMTUyODQ4MTE2NjA0NDgzMDE1MjgzMTY2MDY0ODIwMTUyNjA4NDgxMDE4MjkwNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjM5YjIzZDNkOTYwZTAxYjkwNjBhNDAxNjEwN2NiNTY1YjYwNDA1MTgwNjBhMDAxNjA0MDUyODA2MDAwMTUxNTgxNTI2MDIwMDE2MDAwNjAwMTYwMDE2MGEwMWIwMzE2ODE1MjYwMjAwMTYwNjA4MTUyNjAyMDAxNjA2MDgxNTI2MDIwMDE2MDAwNjAwMTYwMDE2MGEwMWIwMzE2ODE1MjUwOTA1NjViNjAwMTYwMDE2MGEwMWIwMzgxMTY4MTE0NjEwOTE4NTc2MDAwODBmZDViNTA1NjViODAzNTYxMDkyNjgxNjEwOTAzNTY1YjkxOTA1MDU2NWI2MDAwODA2MDAwODA2MDgwODU4NzAzMTIxNTYxMDk0MTU3NjAwMDgwZmQ1Yjg0MzU2MTA5NGM4MTYxMDkwMzU2NWI5MzUwNjAyMDg1MDEzNTYxMDk1YzgxNjEwOTAzNTY1YjkyNTA2MDQwODUwMTM1NjEwOTZjODE2MTA5MDM1NjViOTM5NjkyOTU1MDkyOTM2MDYwMDEzNTkyNTA1MDU2NWI2MDAwNjAyMDgyODQwMzEyMTU2MTA5OGU1NzYwMDA4MGZkNWI4MTM1NjEwOTk5ODE2MTA5MDM1NjViOTM5MjUwNTA1MDU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMDliMzU3NjAwMDgwZmQ1YjgyMzU2MTA5YmU4MTYxMDkwMzU2NWI5NDYwMjA5MzkwOTMwMTM1OTM1MDUwNTA1NjViNjAwMDViODM4MTEwMTU2MTA5ZTc1NzgxODEwMTUxODM4MjAxNTI2MDIwMDE2MTA5Y2Y1NjViODM4MTExMTU2MTA5ZjY1NzYwMDA4NDg0MDE1MjViNTA1MDUwNTA1NjViNjAwMDgxNTE4MDg0NTI2MTBhMTQ4MTYwMjA4NjAxNjAyMDg2MDE2MTA5Y2M1NjViNjAxZjAxNjAxZjE5MTY5MjkwOTIwMTYwMjAwMTkyOTE1MDUwNTY1YjgwNTExNTE1ODI1MjYwMDA2MDIwODIwMTUxNjAwMTYwMDE2MGEwMWIwMzgwODIxNjYwMjA4NjAxNTI2MDQwODQwMTUxOTE1MDYwYTA2MDQwODYwMTUyNjEwYTYwNjBhMDg2MDE4MzYxMDlmYzU2NWI5MTUwNjA2MDg0MDE1MTg1ODMwMzYwNjA4NzAxNTI2MTBhNzk4MzgyNjEwOWZjNTY1YjkyNTA1MDgwNjA4MDg1MDE1MTE2NjA4MDg2MDE1MjUwODA5MTUwNTA5MjkxNTA1MDU2NWI4MjYwMDcwYjgxNTI2MDQwNjAyMDgyMDE1MjYwMDA2MTBhYWY2MDQwODMwMTg0NjEwYTI4NTY1Yjk0OTM1MDUwNTA1MDU2NWI2MzRlNDg3YjcxNjBlMDFiNjAwMDUyNjA0MTYwMDQ1MjYwMjQ2MDAwZmQ1YjYwNDA1MTYwNjA4MTAxNjdmZmZmZmZmZmZmZmZmZmZmODExMTgyODIxMDE3MTU2MTBhZjA1NzYxMGFmMDYxMGFiNzU2NWI2MDQwNTI5MDU2NWI2MDQwODA1MTkwODEwMTY3ZmZmZmZmZmZmZmZmZmZmZjgxMTE4MjgyMTAxNzE1NjEwYWYwNTc2MTBhZjA2MTBhYjc1NjViNjA0MDUxNjBhMDgxMDE2N2ZmZmZmZmZmZmZmZmZmZmY4MTExODI4MjEwMTcxNTYxMGFmMDU3NjEwYWYwNjEwYWI3NTY1YjYwNDA1MTYwMWY4MjAxNjAxZjE5MTY4MTAxNjdmZmZmZmZmZmZmZmZmZmZmODExMTgyODIxMDE3MTU2MTBiNjU1NzYxMGI2NTYxMGFiNzU2NWI2MDQwNTI5MTkwNTA1NjViNjNmZmZmZmZmZjgxMTY4MTE0NjEwOTE4NTc2MDAwODBmZDViNjAwMDgwODI4NDAzNjA4MDgxMTIxNTYxMGI5MzU3NjAwMDgwZmQ1YjgzMzU2MTBiOWU4MTYxMDkwMzU2NWI5MjUwNjA2MDYwMWYxOTgyMDExMjE1NjEwYmIyNTc2MDAwODBmZDViNTA2MTBiYmI2MTBhY2Q1NjViNjAyMDg0MDEzNTYxMGJjOTgxNjEwYjZkNTY1YjgxNTI2MDQwODQwMTM1NjEwYmQ5ODE2MTA5MDM1NjViNjAyMDgyMDE1MjYwNjA4NDAxMzU2MTBiZWM4MTYxMGI2ZDU2NWI2MDQwODIwMTUyOTE5NDkxOTM1MDkwOTE1MDUwNTY1YjgwMTUxNTgxMTQ2MTA5MTg1NzYwMDA4MGZkNWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwYzI0NTc2MTBjMjQ2MTBhYjc1NjViNTA2MDFmMDE2MDFmMTkxNjYwMjAwMTkwNTY1YjYwMDA4MjYwMWY4MzAxMTI2MTBjNDM1NzYwMDA4MGZkNWI4MTM1NjEwYzU2NjEwYzUxODI2MTBjMGE1NjViNjEwYjNjNTY1YjgxODE1Mjg0NjAyMDgzODYwMTAxMTExNTYxMGM2YjU3NjAwMDgwZmQ1YjgxNjAyMDg1MDE2MDIwODMwMTM3NjAwMDkxODEwMTYwMjAwMTkxOTA5MTUyOTM5MjUwNTA1MDU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMGM5YjU3NjAwMDgwZmQ1YjYxMGNhNTgzMzU2MTA5MDM1NjViODIzNTkxNTA2N2ZmZmZmZmZmZmZmZmZmZmY4MDYwMjA4NTAxMzUxMTE1NjEwY2MzNTc2MDAwODBmZDViNjAyMDg0MDEzNTg0MDE4NTYwMWY4MjAxMTI2MTBjZDk1NzYwMDA4MGZkNWI4MTgxMzUxMTE1NjEwY2VhNTc2MTBjZWE2MTBhYjc1NjViNjEwY2ZhNjAyMDgyMzU2MDA1MWIwMTYxMGIzYzU2NWI4MTM1ODA4MjUyNjAyMDgwODMwMTkyOTE2MDA1MWI4NDAxMDE4ODgxMTExNTYxMGQxOTU3NjAwMDgwZmQ1YjYwMjA4NDAxNWI4MTgxMTAxNTYxMGUzYTU3ODU4MTM1MTExNTYxMGQzNDU3NjAwMDgwZmQ1YjgwMzU4NTAxNjAxZjE5NjA0MDgyOGQwMzgyMDExMjE1NjEwZDRkNTc2MDAwODBmZDViNjEwZDU1NjEwYWY2NTY1YjYwMjA4MzAxMzU4MTUyODg2MDQwODQwMTM1MTExNTYxMGQ2ZDU3NjAwMDgwZmQ1YjYwNDA4MzAxMzU4MzAxOTI1MDYwYTA4Mjg0OGYwMzAxMTIxNTYxMGQ4ODU3NjAwMDgwZmQ1YjYxMGQ5MDYxMGIxOTU2NWI5MTUwNjEwZDlmNjAyMDg0MDEzNTYxMGJmYzU2NWI2MDIwODMwMTM1ODI1MjYxMGRiMzYwNDA4NDAxMzU2MTA5MDM1NjViNjA0MDgzMDEzNTYwMjA4MzAxNTI4ODYwNjA4NDAxMzUxMTE1NjEwZGNlNTc2MDAwODBmZDViNjEwZGUxOGQ2MDIwNjA2MDg2MDEzNTg2MDEwMTYxMGMzMjU2NWI2MDQwODMwMTUyODg2MDgwODQwMTM1MTExNTYxMGRmNzU3NjAwMDgwZmQ1YjYxMGUwYThkNjAyMDYwODA4NjAxMzU4NjAxMDE2MTBjMzI1NjViNjA2MDgzMDE1MjYxMGUxYjYwYTA4NDAxNjEwOTFiNTY1YjYwODA4MzAxNTI2MDIwODE4MTAxOTI5MDkyNTI4NjUyOTQ4NTAxOTQ5MTkwOTEwMTkwNTA2MTBkMWU1NjViNTA5NTk4OTA5NzUwOTU1MDUwNTA1MDUwNTA1NjViNjAwMDgwNjA0MDgzODUwMzEyMTU2MTBlNWM1NzYwMDA4MGZkNWI4MjM1NjEwZTY3ODE2MTA5MDM1NjViOTE1MDYwMjA4MzAxMzU2MTBlNzc4MTYxMDkwMzU2NWI4MDkxNTA1MDkyNTA5MjkwNTA1NjViODI4MTUyNjA4MDgxMDE2MTA5OTk2MDIwODMwMTg0ODA1MTYzZmZmZmZmZmY5MDgxMTY4MzUyNjAyMDgwODMwMTUxNjAwMTYwMDE2MGEwMWIwMzE2OTA4NDAxNTI2MDQwOTE4MjAxNTExNjkxMDE1MjU2NWI2MDAwODI1MTYxMGVjZTgxODQ2MDIwODcwMTYxMDljYzU2NWI5MTkwOTEwMTkyOTE1MDUwNTY1YjgwNTE2MDAzODE5MDBiODExNDYxMDkyNjU3NjAwMDgwZmQ1YjYwMDA2MDIwODI4NDAzMTIxNTYxMGVmYzU3NjAwMDgwZmQ1YjYxMDk5OTgyNjEwZWQ4NTY1YjgwNTE2MTA5MjY4MTYxMDkwMzU2NWI2MDAwODI2MDFmODMwMTEyNjEwZjIxNTc2MDAwODBmZDViODE1MTYxMGYyZjYxMGM1MTgyNjEwYzBhNTY1YjgxODE1Mjg0NjAyMDgzODYwMTAxMTExNTYxMGY0NDU3NjAwMDgwZmQ1YjYxMGFhZjgyNjAyMDgzMDE2MDIwODcwMTYxMDljYzU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMGY2ODU3NjAwMDgwZmQ1YjYxMGY3MTgzNjEwZWQ4NTY1YjkxNTA2MDIwODMwMTUxNjdmZmZmZmZmZmZmZmZmZmZmODA4MjExMTU2MTBmOGU1NzYwMDA4MGZkNWI5MDg0MDE5MDYwYTA4Mjg3MDMxMjE1NjEwZmEyNTc2MDAwODBmZDViNjEwZmFhNjEwYjE5NTY1YjgyNTE2MTBmYjU4MTYxMGJmYzU2NWI4MTUyNjAyMDgzMDE1MTYxMGZjNTgxNjEwOTAzNTY1YjYwMjA4MjAxNTI2MDQwODMwMTUxODI4MTExMTU2MTBmZGM1NzYwMDA4MGZkNWI2MTBmZTg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwu5vnuI9iqViAHSvi7tX4bKuT8T8KLOkySOaJQv/zunEKGP5rpIx1MxqVg0N3LZNeGgwIjJrbqgYQ2/PzuQMiDwoJCNCZ26oGEL8NEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjRmduqBhDFDRICGAISAhgDGNPltjEiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBmAgSAxi7CCKQCDg4ODI4NjAxNjEwZjEwNTY1YjYwNDA4MzAxNTI1MDYwNjA4MzAxNTE4MjgxMTExNTYxMTAwMDU3NjAwMDgwZmQ1YjYxMTAwYzg4ODI4NjAxNjEwZjEwNTY1YjYwNjA4MzAxNTI1MDYxMTAxZTYwODA4NDAxNjEwZjA1NTY1YjYwODA4MjAxNTI4MDkzNTA1MDUwNTA5MjUwOTI5MDUwNTY1YjYwMDE2MDAxNjBhMDFiMDM4MzE2ODE1MjYwODA4MTAxNjEwOTk5NjAyMDgzMDE4NDgwNTE2M2ZmZmZmZmZmOTA4MTE2ODM1MjYwMjA4MDgzMDE1MTYwMDE2MDAxNjBhMDFiMDMxNjkwODQwMTUyNjA0MDkxODIwMTUxMTY5MTAxNTI1NjViNjAwMDYwNDA4MDgzMDE2MDAxNjAwMTYwYTAxYjAzODYxNjg0NTI2MDIwODI4MTg2MDE1MjgxODY1MTgwODQ1MjYwNjA4NzAxOTE1MDYwNjA4MTYwMDUxYjg4MDEwMTkzNTA4Mjg4MDE2MDAwNWI4MjgxMTAxNTYxMTBlOTU3ODg4NjAzNjA1ZjE5MDE4NDUyODE1MTgwNTE4NzUyODUwMTUxODU4NzAxODg5MDUyNjExMGQ2ODg4ODAxODI2MTBhMjg1NjViOTY1MDUwOTI4NDAxOTI5MDg0MDE5MDYwMDEwMTYxMTBhYTU2NWI1MDkzOTk5ODUwNTA1MDUwNTA1MDUwNTA1MDU2NWI2MDAwODA4Mjg0MDM2MDgwODExMjE1NjExMTBjNTc2MDAwODBmZDViNjExMTE1ODQ2MTBlZDg1NjViOTI1MDYwNjA2MDFmMTk4MjAxMTIxNTYxMTEyOTU3NjAwMDgwZmQ1YjUwNjExMTMyNjEwYWNkNTY1YjYwMjA4NDAxNTE2MTExNDA4MTYxMGI2ZDU2NWI4MTUyNjA0MDg0MDE1MTYxMTE1MDgxNjEwOTAzNTY1YjYwMjA4MjAxNTI2MDYwODQwMTUxNjEwYmVjODE2MTBiNmQ1NjViNjAwMDgwNjA0MDgzODUwMzEyMTU2MTExNzY1NzYwMDA4MGZkNWI2MTExN2Y4MzYxMGVkODU2NWI5MTUwNjAyMDgzMDE1MTYxMGU3NzgxNjEwYmZjNTY1YjYwMDA2MDIwODI4NDAzMTIxNTYxMTFhMTU3NjAwMDgwZmQ1YjgxNTE4MDYwMDcwYjgxMTQ2MTA5OTk1NzYwMDA4MGZkZmVhMjY0Njk3MDY2NzM1ODIyMTIyMDkxZDY1YzY1ZWVhOTljOWFhMTYwOGYxODEyODA3NDMzOWQ0OWI0NmQ5ZjY2YWY5MTA4ZmEwYzRlN2Q2MmQyYTU2NDczNmY2YzYzNDMwMDA4MGIwMDMz","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwA3rdhDgAQ04EAFQvQlul7SEV3vqxwqntTwrLuF7luz0V0RtmyjekWUlVBVTJGGUzGgwIjZrbqgYQy8vI1wEiDwoJCNGZ26oGEMUNEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjRmduqBhDHDRICGAISAhgDGJb7rp0CIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5CRQoDGLsIGiISIFAY5DNe/3dAyB+zmJV2MpTZaYonTlevNE2CKD10GdASIJChD0IFCIDO2gNSAFoAagtjZWxsYXIgZG9vcg==","b64Record":"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"},{"b64Body":"Cg8KCQjSmduqBhDJDRICGAISAhgDGOufNiICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchkSFwoDGLcIEgcKAxiyCBABEgcKAxi0CBAC","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwpyexpyJ2cf/H9HqCMOtg4wJYNe4uo+OVe46zXNBXlVhZgWVoFPD0OdEv7lb1D5NwGgwIjprbqgYQ29iW4QEiDwoJCNKZ26oGEMkNEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFoXCgMYtwgSBwoDGLIIEAESBwoDGLQIEAI="},{"b64Body":"Cg8KCQjSmduqBhDLDRICGAISAhgDGOufNiICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchkSFwoDGLcIEgcKAxiyCBABEgcKAxi1CBAC","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwSeAtNSPerYSkK4jBHnntLm3GTjcsJzf53vG/xhqOhxEYpOzDng07jhWjlfTtSoNxGgwIjprbqgYQy4nY0wMiDwoJCNKZ26oGEMsNEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFoXCgMYtwgSBwoDGLIIEAESBwoDGLUIEAI="},{"b64Body":"Cg8KCQjTmduqBhDNDRICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxi8CBCgjQYihAFQgd7TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=","b64Record":"CiUIISIDGLwIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjB4D7antguLYCbWDL7y1DDchVBryR4Fe68BKd9bFl/D3hgDHClHkJpXDbnp3YK3edwaDAiPmtuqBhCz0tHiASIPCgkI05nbqgYQzQ0SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCA19oCOtEBGsoBMHgwOGMzNzlhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE1NTQ3MjYxNmU3MzY2NjU3MjIwNjY3MjZmNmQyMDY2NjE2OTZjNjU2NDIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCiA8QRSFgoJCgIYAhD/rbUFCgkKAhhiEICutQU="},{"b64Body":"ChEKCQjTmduqBhDNDRICGAIgAXIXEhUKAxi2CBoOCgMYtAgSAxi1CBgBIAE=","b64Record":"CgMIpAISMI/4rlHLVZpyhq3fQSlYZiAPjKvIhlt79gcXH7+C59rxhY2IZ1qzFxl/gWU3/KQpGhoMCI+a26oGELTS0eIBIhEKCQjTmduqBhDNDRICGAIgATrcAQoDGOcCEiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJBofU1BFTkRFUl9ET0VTX05PVF9IQVZFX0FMTE9XQU5DRSiK3AFQscAEYoQBmyPT2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABagMYvAhSAHoMCI+a26oGELPS0eIB"},{"b64Body":"Cg8KCQjTmduqBhDPDRICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxi8CBCgjQYihAFQgd7TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=","b64Record":"CiUIISIDGLwIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjD5OOf6+5tM9HZSEMDJu125I56JCwwkmKTDUZulKagjt+OKwir6Fdil42K3ZojxUq0aDAiPmtuqBhCDi4/SAyIPCgkI05nbqgYQzw0SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCA19oCOtEBGsoBMHgwOGMzNzlhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE1NTQ3MjYxNmU3MzY2NjU3MjIwNjY3MjZmNmQyMDY2NjE2OTZjNjU2NDIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCiA8QRSFgoJCgIYAhD/rbUFCgkKAhhiEICutQU="},{"b64Body":"ChEKCQjTmduqBhDPDRICGAIgAXIXEhUKAxi4CBoOCgMYtAgSAxi1CBgBIAE=","b64Record":"CgMIpAISMBCZLM98Vg7U3DTVwhWXiDAnmCPqU7U8ZFp+rlSdYbHWXxFJIQIYTecYbmPyBdTtThoMCI+a26oGEISLj9IDIhEKCQjTmduqBhDPDRICGAIgATrcAQoDGOcCEiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJBofU1BFTkRFUl9ET0VTX05PVF9IQVZFX0FMTE9XQU5DRSiK3AFQscAEYoQBmyPT2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABagMYvAhSAHoMCI+a26oGEIOLj9ID"},{"b64Body":"Cg8KCQjUmduqBhDRDRICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxi8CBCgjQYihAFQgd7TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=","b64Record":"CiUIISIDGLwIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDii8nvHtao2+T96n8BrsLRgbeXWgBjkOw0WFICYtD1xxGBCOjf1f21NSw1dmKW/fAaDAiQmtuqBhDr3uD6ASIPCgkI1JnbqgYQ0Q0SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCA19oCOtEBGsoBMHgwOGMzNzlhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE1NTQ3MjYxNmU3MzY2NjU3MjIwNjY3MjZmNmQyMDY2NjE2OTZjNjU2NDIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCiA8QRSFgoJCgIYAhD/rbUFCgkKAhhiEICutQU="},{"b64Body":"ChEKCQjUmduqBhDRDRICGAIgAXIXEhUKAxi5CBoOCgMYtAgSAxi1CBgBIAE=","b64Record":"CgMIxgISMI9tZmSgl2IXXUMz5XFuufokYnVzQdMIF04pHZY5EDPOG/dJt8jdjsLoqJjnkT4ABBoMCJCa26oGEOze4PoBIhEKCQjUmduqBhDRDRICGAIgATrpAQoDGOcCEiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRhosSU5WQUxJRF9GVUxMX1BSRUZJWF9TSUdOQVRVUkVfRk9SX1BSRUNPTVBJTEUoitwBULHABGKEAZsj09kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWoDGLwIUgB6DAiQmtuqBhDr3uD6AQ=="},{"b64Body":"Cg8KCQjUmduqBhDTDRICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxi8CBCgjQYihAFQgd7TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=","b64Record":"CiUIISIDGLwIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAtnCmwb8TWHAZfcMeEquNoehZH9CLFQOVl0vv7DbIucSk4ITiySiY0EB+2AX/hUl4aDAiQmtuqBhDb/sLWAyIPCgkI1JnbqgYQ0w0SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCA19oCOtEBGsoBMHgwOGMzNzlhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE1NTQ3MjYxNmU3MzY2NjU3MjIwNjY3MjZmNmQyMDY2NjE2OTZjNjU2NDIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCiA8QRSFgoJCgIYAhD/rbUFCgkKAhhiEICutQU="},{"b64Body":"ChEKCQjUmduqBhDTDRICGAIgAXIXEhUKAxi6CBoOCgMYtAgSAxi1CBgBIAE=","b64Record":"CgMIxgISMHr8u650AHLofmkDo/2nbGfjxFtB6wIX5cisGj43Wl9L54ArRoADUHQNN5EyCuYAFhoMCJCa26oGENz+wtYDIhEKCQjUmduqBhDTDRICGAIgATrpAQoDGOcCEiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRhosSU5WQUxJRF9GVUxMX1BSRUZJWF9TSUdOQVRVUkVfRk9SX1BSRUNPTVBJTEUoitwBULHABGKEAZsj09kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWoDGLwIUgB6DAiQmtuqBhDb/sLWAw=="}]},"HapiTransferFromForFungibleTokenWithCustomFeesWithoutApproveFails":{"placeholderNum":1085,"encodedItems":[{"b64Body":"Cg8KCQjZmduqBhDjDRICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIKRY4HS1VQkqTIV/Xpsuesk3WzcyYcPPJ4eMOz3/5biYEICU69wDSgUIgM7aAw==","b64Record":"CiUIFhIDGL4IKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjBUc53xKjNitB1EP5Zvos/eFp19a+WkT5m6hj66FQbheyMNpHUuWCRPYJ95+/8E37MaDAiVmtuqBhCr7pmMASIPCgkI2ZnbqgYQ4w0SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxi+CBCAqNa5Bw=="},{"b64Body":"Cg8KCQjZmduqBhDlDRICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIO+SG6Wy9joR1Bdxs0qnAKbag3LYM2s75FLdoihKCYpxEIDIr6AlSgUIgM7aAw==","b64Record":"CiUIFhIDGL8IKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCTbT3zPNpelRSMvMhOWeA3SzELabbOhq8TQEjtiQOGVhWSA9ed1BeP8ZOtby7678QaDAiVmtuqBhC7lcj7AiIPCgkI2ZnbqgYQ5Q0SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+P38BKCgsKAxi/CBCAkN/ASg=="},{"b64Body":"Cg8KCQjamduqBhDnDRICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISILde9/Mh7SqcvOfPFqrWnSsuIgAaxYcAfQILD1f5cA3REIDIr6AlSgUIgM7aAw==","b64Record":"CiUIFhIDGMAIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjBAikxDuhlZ3V0TjcZtVWbBFkjajoiAuvvyxnrL4VBhyf7u8006gYgqu79NDBS9K5EaDAiWmtuqBhDLqeGNASIPCgkI2pnbqgYQ5w0SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+P38BKCgsKAxjACBCAkN/ASg=="},{"b64Body":"Cg8KCQjamduqBhDpDRICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIFdfY66Kq0LGmmfa7zW//+g4ZorKt2aAlOQDTZHssti5EIDIr6AlSgUIgM7aAw==","b64Record":"CiUIFhIDGMEIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjA+5g2J+DpZaeF9BwpRupsrHbbaGsqm4Vu24QU3CkjbWhBVMEKBqSu0cQrI1kcg7FkaDAiWmtuqBhDL3+39AiIPCgkI2pnbqgYQ6Q0SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+P38BKCgsKAxjBCBCAkN/ASg=="},{"b64Body":"Cg8KCQjbmduqBhDrDRICGAISAhgDGJHE9OgCIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qATIKEGZ1bmdpYmxlVG9rZW5GZWUSCFRXR09DS01SIOgHKgMYvghqDAiX6LWuBhDooe6NAQ==","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGMIIEjClPsHiL1iDPYU8e9fouJPB12F1w0cUH5UrNwzzRFHMxVX3MzZhNn3pcwUzh4Zfpf4aDAiXmtuqBhDTmcmpASIPCgkI25nbqgYQ6w0SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWg8KAxjCCBIICgMYvggQ0A9yCgoDGMIIEgMYvgg="},{"b64Body":"Cg8KCQjbmduqBhDxDRICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGMAIEgMYwgg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwv1ZokG0H2cpxhoLUjbNWJGJl+uJhiwuwQehu1ctAwpuw/OETRf5MUo1CKclEWf5fGgwIl5rbqgYQo4LxmgMiDwoJCNuZ26oGEPENEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjcmduqBhD3DRICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGL8IEgMYwgg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwLSZBYLG5yVZ205JwhXPsK/qkJalOOGwqf3XhKyGZgSmVC8LTtgazqAgQdT4uYO9gGgwImJrbqgYQy+PHqwEiDwoJCNyZ26oGEPcNEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjcmduqBhD9DRICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGMEIEgMYwgg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwiDiXvGjKtCQH8iR6LEoiL40LKZI6HmqlvSIxQTT6lhehnL7JafS4U9VKjp1feXJOGgwImJrbqgYQ67LTnAMiDwoJCNyZ26oGEP0NEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjdmduqBhD/DRICGAISAhgDGOC3qdEFIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAUsKHWZ1bmdpYmxlVG9rZW5XaXRoRml4ZWRIYmFyRmVlEghISUJXRFlESCDoByoDGL8IagwImei1rgYQ8I2TpAGqAQkKAggBGgMYvwg=","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGMMIEjBxhH3GjnVv4/5pZT2ssVVZ8YDXOeYf/5GMtQhtIezLuDZPmf4zvzLfcQdxCp+BV/MaDAiZmtuqBhCTzZetASIPCgkI3ZnbqgYQ/w0SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWg8KAxjDCBIICgMYvwgQ0A9yCgoDGMMIEgMYvwg="},{"b64Body":"Cg8KCQjdmduqBhCBDhICGAISAhgDGK2r69EFIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAVEKHmZ1bmdpYmxlVG9rZW5XaXRoRml4ZWRUb2tlbkZlZRIIRUtCV09PV1Qg6AcqAxi/CGoMCJnota4GEPCv85YDqgEOCgcIARIDGMIIGgMYvwg=","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGMQIEjBqc7sW3Jg3gQcFZjV43ZPlQ6zppz2ZFMltK46uOqdnJengTcIMhB4xYLmFMbVnEbYaDAiZmtuqBhCLtoCfAyIPCgkI3ZnbqgYQgQ4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWg8KAxjECBIICgMYvwgQ0A9yCgoDGMQIEgMYvwg="},{"b64Body":"Cg8KCQjemduqBhCDDhICGAISAhgDGPm9gdIFIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAVkKI2Z1bmdpYmxlVG9rZW5XaXRoRnJhY3Rpb25hbFRva2VuRmVlEghTRUNEU1BOWCDoByoDGL8IagwImui1rgYQuM+HrAGqARESCgoECAEQAhABGAoaAxi/CA==","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGMUIEjDkZFUMRFGKSMCwY+C17gyZ45AUBzccQveo9F0Y31BL2izNJTbHIvBTmz3BP2qdZa4aDAiamtuqBhDDsuivASIPCgkI3pnbqgYQgw4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWg8KAxjFCBIICgMYvwgQ0A9yCgoDGMUIEgMYvwg="},{"b64Body":"Cg8KCQjemduqBhCJDhICGAISAhgDGJuqziEiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICFAoDGMAIEgMYwwgSAxjECBIDGMUI","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw2w+jXNp/dzmqcZCXi56jUjQPiyUvk8OPKQyaFUFTLEcRg0OC3OysWJ/8t8DoDMMiGgwImprbqgYQg6DQugMiDwoJCN6Z26oGEIkOEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjfmduqBhCPDhICGAISAhgDGJuqziEiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICFAoDGMEIEgMYwwgSAxjECBIDGMUI","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwIMO5lVGXlpatx1SkN9FsWWCi2xSNOuBYYOxIaPWsvGmJK3UoU/xAfw6ZcLRROPNkGgwIm5rbqgYQq+f2zwEiDwoJCN+Z26oGEI8OEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjfmduqBhCRDhICGAISAhgDGOufNiICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchkSFwoDGMIIEgcKAxi+CBABEgcKAxjACBAC","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwvCwUTdTrDXTt2Zb1G+3hzponnZSqw/YnLrpueWKIiuy9Ddki+7M3Qz2SQxRCvkusGgwIm5rbqgYQo8iywwMiDwoJCN+Z26oGEJEOEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFoXCgMYwggSBwoDGL4IEAESBwoDGMAIEAI="},{"b64Body":"Cg8KCQjgmduqBhCTDhICGAISAhgDGOufNiICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchkSFwoDGMMIEgcKAxi/CBABEgcKAxjACBAC","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwUL4gXd8Df471RIl2fzk0Dr0kOaBsoRvk3H+rekdo7EGnKoH7vhgPipCzyuZOmxjrGgwInJrbqgYQu/TT1AEiDwoJCOCZ26oGEJMOEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFoXCgMYwwgSBwoDGL8IEAESBwoDGMAIEAI="},{"b64Body":"Cg8KCQjgmduqBhCVDhICGAISAhgDGOufNiICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchkSFwoDGMQIEgcKAxi/CBABEgcKAxjACBAC","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwHUehooyh+hXBwtTPn05SDlj79tvWvIshbgOWn12fSPimTstUuviZvI9j7fHOiHISGgwInJrbqgYQy8/KwgMiDwoJCOCZ26oGEJUOEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFoXCgMYxAgSBwoDGL8IEAESBwoDGMAIEAI="},{"b64Body":"Cg8KCQjhmduqBhCXDhICGAISAhgDGOufNiICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchkSFwoDGMUIEgcKAxi/CBADEgcKAxjACBAE","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwhuDtwzdgdT6uPI3lwvW2NScCClAl1n450peSBIART94uMgO+fGrtQkOP9bMT8vXDGgwInZrbqgYQk5iw8AEiDwoJCOGZ26oGEJcOEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFoXCgMYxQgSBwoDGL8IEAMSBwoDGMAIEAQ="},{"b64Body":"Cg8KCQjhmduqBhCZDhICGAISAhgDGP7LzSwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjooBjwESDAid6LWuBhDQ4bnKAxptCiISIEC75rQIN0heQyBGGzl/tZdbhgPX2ipL2sBMLkGasDABCiM6IQKlhglSGfWG+nQxd0pgjdgMBSaw4DJ0HvrDB+hTSLlwBAoiEiAwfH9tQirE1L0yAPMOLh4fTEM/Keg4efKBWdQ1Xn5nSCIMSGVsbG8gV29ybGQhKgAyAA==","b64Record":"CiUIFhoDGMYIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjBJOjH+mVb80aInf9vW49bn7QkyuOC12Sxd/0JGppulaXWqqLo+UnMd9hTbISKbva4aCwiemtuqBhCz3aMEIg8KCQjhmduqBhCZDhICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUgA="},{"b64Body":"Cg8KCQjimduqBhCdDhICGAISAhgDGIudjj4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjpoBiCAKAxjGCCKAIDYwODA2MDQwNTIzNDgwMTU2MTAwMTA1NzYwMDA4MGZkNWI1MDYxMTFlODgwNjEwMDIwNjAwMDM5NjAwMGYzZmU2MDgwNjA0MDUyMzQ4MDE1NjEwMDEwNTc2MDAwODBmZDViNTA2MDA0MzYxMDYxMDBhOTU3NjAwMDM1NjBlMDFjODA2MzZmYzNjYmFmMTE2MTAwNzE1NzgwNjM2ZmMzY2JhZjE0NjEwMTMwNTc4MDYzN2M0MWFkMmMxNDYxMDE1NjU3ODA2MzhmOGQ3Zjk5MTQ2MTAxNjk1NzgwNjNhZjk5YzYzMzE0NjEwMTdjNTc4MDYzZDYxNGNkYjgxNDYxMDE4ZjU3ODA2M2YyYzMxZmY0MTQ2MTAxYjA1NzYwMDA4MGZkNWI4MDYzMTNhOGVkNTMxNDYxMDBhZTU3ODA2MzNiM2JmZjBmMTQ2MTAwYzM1NzgwNjMzYzRkZDMyZTE0NjEwMGU5NTc4MDYzNTA4MWRlZDMxNDYxMDEwYTU3ODA2MzU5M2Q2ZTgyMTQ2MTAxMWQ1NzViNjAwMDgwZmQ1YjYxMDBjMTYxMDBiYzM2NjAwNDYxMDkyYjU2NWI2MTAxZGQ1NjViMDA1YjYxMDBkNjYxMDBkMTM2NjAwNDYxMDk3YzU2NWI2MTAyNDM1NjViNjA0MDUxOTA4MTUyNjAyMDAxNWI2MDQwNTE4MDkxMDM5MGYzNWI2MTAwZmM2MTAwZjczNjYwMDQ2MTA5YTA1NjViNjEwMzFkNTY1YjYwNDA1MTYxMDBlMDkyOTE5MDYxMGE5MzU2NWI2MTAwYzE2MTAxMTgzNjYwMDQ2MTA5MmI1NjViNjEwNDA0NTY1YjYxMDBkNjYxMDEyYjM2NjAwNDYxMGI3ZjU2NWI2MTA0MTI1NjViNjEwMTQzNjEwMTNlMzY2MDA0NjEwYzg4NTY1YjYxMDRlZjU2NWI2MDQwNTE2MDA3OTE5MDkxMGI4MTUyNjAyMDAxNjEwMGUwNTY1YjYxMDBkNjYxMDE2NDM2NjAwNDYxMDk3YzU2NWI2MTA1MWI1NjViNjEwMTQzNjEwMTc3MzY2MDA0NjEwZTQ5NTY1YjYxMDU0OTU2NWI2MTAxNDM2MTAxOGEzNjYwMDQ2MTBlNDk1NjViNjEwNTdmNTY1YjYxMDFhMjYxMDE5ZDM2NjAwNDYxMDk3YzU2NWI2MTA1YjU1NjViNjA0MDUxNjEwMGUwOTI5MTkwNjEwZTgyNTY1YjYxMDFjMzYxMDFiZTM2NjAwNDYxMGU0OTU2NWI2MTA2YmY1NjViNjA0MDgwNTE2MDA3OTM5MDkzMGI4MzUyOTAxNTE1NjAyMDgzMDE1MjAxNjEwMGUwNTY1YjYwMDA2MTAxZWI4NTg1ODU4NTYxMDc4YTU2NWI2MDA3MGI5MDUwNjAxNjgxMTQ2MTAyM2M1NzYwNDA1MTYyNDYxYmNkNjBlNTFiODE1MjYwMjA2MDA0ODIwMTUyNjAxNTYwMjQ4MjAxNTI3NDU0NzI2MTZlNzM2NjY1NzIyMDY2NzI2ZjZkMjA2NjYxNjk2YzY1NjQyMTYwNTgxYjYwNDQ4MjAxNTI2MDY0MDE2MDQwNTE4MDkxMDM5MGZkNWI1MDUwNTA1MDUwNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MjE2NjAyNDgyMDE1MjYwMDA5MDgxOTA4MTkwNjEwMTY3OTA2MzNiM2JmZjBmNjBlMDFiOTA2MDQ0MDE1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE4MDUxNjAwMTYwMDE2MGUwMWIwMzE2NjAwMTYwMDE2MGUwMWIwMzE5OTA5NDE2OTM5MDkzMTc5MDkyNTI5MDUxNjEwMmFiOTE5MDYxMGViYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwMmU4NTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwMmVkNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTAyZmU1NzYwMTU2MTAzMTI1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTAzMTI5MTkwNjEwZWVhNTY1YjYwMDMwYjk0OTM1MDUwNTA1MDU2NWI2MDAwNjEwMzI3NjEwOGMwNTY1YjYwNDA4MDUxNjAwMTYwMDE2MGEwMWIwMzg2MTY2MDI0ODIwMTUyNjA0NDgwODIwMTg2OTA1MjgyNTE4MDgzMDM5MDkxMDE4MTUyNjA2NDkwOTEwMTgyNTI2MDIwODEwMTgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MzFlMjZlOTk3NjBlMTFiMTc5MDUyOTA1MTYwMDA5MTgyOTE2MTAxNjc5MTYxMDM4MTkxNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTAzYmU1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTAzYzM1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA2MTAzZDA2MTA4YzA1NjViODI2MTAzZGQ1NzYwMTU4MTYxMDNmMTU2NWI4MTgwNjAyMDAxOTA1MTgxMDE5MDYxMDNmMTkxOTA2MTBmNTU1NjViNjAwMzkxOTA5MTBiOTg5MDk3NTA5NTUwNTA1MDUwNTA1MDU2NWI2MDAwNjEwMWViODU4NTg1ODU2MTA4N2I1NjViNjAwMDgwNjAwMDYxMDE2NzYwMDE2MDAxNjBhMDFiMDMxNjYzNTkzZDZlODI2MGUwMWI4Njg2NjA0MDUxNjAyNDAxNjEwNDNlOTI5MTkwNjExMDMwNTY1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE4MDUxNjAwMTYwMDE2MGUwMWIwMzE2NjAwMTYwMDE2MGUwMWIwMzE5OTA5NDE2OTM5MDkzMTc5MDkyNTI5MDUxNjEwNDdjOTE5MDYxMGViYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwNGI5NTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwNGJlNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTA0Y2Y1NzYwMTU2MTA0ZTM1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTA0ZTM5MTkwNjEwZWVhNTY1YjYwMDMwYjk1OTQ1MDUwNTA1MDUwNTY1YjYwMDA4MDYwMDA2MTAxNjc2MDAxNjAwMTYwYTAxYjAzMTY2MzZmYzNjYmFmNjBlMDFiODY4NjYwNDA1MTYwMjQwMTYxMDQzZTkyOTE5MDYxMTA3MzU2NWI2MDQwNTE2MDAxNjAwMTYwYTAxYjAzODIxNjYwMjQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjMxZjEwNmI0YjYwZTIxYjkwNjA0NDAxNjEwMjZkNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MzgxMTY2MDI0ODMwMTUyODIxNjYwNDQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjM4ZjhkN2Y5OTYwZTAxYjkwNjA2NDAxNjEwNDNlNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MzgxMTY2MDI0ODMwMTUyODIxNjYwNDQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjNhZjk5YzYzMzYwZTAxYjkwNjA2NDAxNjEwNDNlNTY1YjYwNDA4MDUxNjA2MDgxMDE4MjUyNjAwMDgwODI1MjYwMjA4MDgzMDE4MjkwNTI4Mjg0MDE4MjkwNTI4MzUxNjAwMTYwMDE2MGEwMWIwMzg2MTY2MDI0ODA4MzAxOTE5MDkxNTI4NTUxODA4MzAzOTA5MTAxODE1MjYwNDQ5MDkxMDE4NTUyOTA4MTAxODA1MTYwMDE2MDAxNjBlMDFiMDMxNjYzMWFjMjk5Yjc2MGUzMWIxNzkwNTI5MjUxOTA5MjgzOTE4MjkxNjEwMTY3OTE2MTA2Mjc5MTkwNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTA2NjQ1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTA2Njk1NjViNjA2MDkxNTA1YjUwNjA0MDgwNTE2MDYwODEwMTgyNTI2MDAwODA4MjUyNjAyMDgyMDE4MTkwNTI5MTgxMDE5MTkwOTE1MjkxOTM1MDkxNTA4MjYxMDY5OTU3NjAxNTgxNjEwNmFkNTY1YjgxODA2MDIwMDE5MDUxODEwMTkwNjEwNmFkOTE5MDYxMTBmODU2NWI2MDAzOTE5MDkxMGI5NzkwOTY1MDk0NTA1MDUwNTA1MDU2NWI2MDQwODA1MTYwMDE2MDAxNjBhMDFiMDM4NDgxMTY2MDI0ODMwMTUyODMxNjYwNDQ4MDgzMDE5MTkwOTE1MjgyNTE4MDgzMDM5MDkxMDE4MTUyNjA2NDkwOTEwMTgyNTI2MDIwODEwMTgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MzNjYjBjN2ZkNjBlMjFiMTc5MDUyOTA1MTYwMDA5MTgyOTE4MjkxODI5MTYxMDE2NzkxNjEwNzIxOTE2MTBlYmM1NjViNjAwMDYwNDA1MTgwODMwMzgxNjAwMDg2NWFmMTkxNTA1MDNkODA2MDAwODExNDYxMDc1ZTU3NjA0MDUxOTE1MDYwMWYxOTYwM2YzZDAxMTY4MjAxNjA0MDUyM2Q4MjUyM2Q2MDAwNjAyMDg0MDEzZTYxMDc2MzU2NWI2MDYwOTE1MDViNTA5MTUwOTE1MDgxNjEwNzc2NTc2MDE1NjAwMDYxMDZhZDU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDZhZDkxOTA2MTExNjM1NjViNjA0MDUxNjAwMTYwMDE2MGEwMWIwMzg1ODExNjYwMjQ4MzAxNTI4NDgxMTY2MDQ0ODMwMTUyODMxNjYwNjQ4MjAxNTI2MDg0ODEwMTgyOTA1MjYwMDA5MDgxOTA4MTkwNjEwMTY3OTA2MzBhZWQ2NWY1NjBlMTFiOTA2MGE0MDE1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwINQPvO8lDGojFKPPs150lamzAZo8OnxJZ3HBPbB+RXYFwiLSLFtq8FnX3GKL9MvrGgwInprbqgYQ67LX9AEiDwoJCOKZ26oGEJ0OEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjimduqBhCjDhICGAISAhgDGPjR6j4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBiCASAxjGCCKAIDgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MDAxNjAwMTYwZTAxYjAzMTk5MDk0MTY5MzkwOTMxNzkwOTI1MjkwNTE2MTA4MDk5MTkwNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTA4NDY1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTA4NGI1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA4MTYxMDg1YzU3NjAxNTYxMDg3MDU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDg3MDkxOTA2MTExOGY1NjViOTc5NjUwNTA1MDUwNTA1MDUwNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4NTgxMTY2MDI0ODMwMTUyODQ4MTE2NjA0NDgzMDE1MjgzMTY2MDY0ODIwMTUyNjA4NDgxMDE4MjkwNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjM5YjIzZDNkOTYwZTAxYjkwNjBhNDAxNjEwN2NiNTY1YjYwNDA1MTgwNjBhMDAxNjA0MDUyODA2MDAwMTUxNTgxNTI2MDIwMDE2MDAwNjAwMTYwMDE2MGEwMWIwMzE2ODE1MjYwMjAwMTYwNjA4MTUyNjAyMDAxNjA2MDgxNTI2MDIwMDE2MDAwNjAwMTYwMDE2MGEwMWIwMzE2ODE1MjUwOTA1NjViNjAwMTYwMDE2MGEwMWIwMzgxMTY4MTE0NjEwOTE4NTc2MDAwODBmZDViNTA1NjViODAzNTYxMDkyNjgxNjEwOTAzNTY1YjkxOTA1MDU2NWI2MDAwODA2MDAwODA2MDgwODU4NzAzMTIxNTYxMDk0MTU3NjAwMDgwZmQ1Yjg0MzU2MTA5NGM4MTYxMDkwMzU2NWI5MzUwNjAyMDg1MDEzNTYxMDk1YzgxNjEwOTAzNTY1YjkyNTA2MDQwODUwMTM1NjEwOTZjODE2MTA5MDM1NjViOTM5NjkyOTU1MDkyOTM2MDYwMDEzNTkyNTA1MDU2NWI2MDAwNjAyMDgyODQwMzEyMTU2MTA5OGU1NzYwMDA4MGZkNWI4MTM1NjEwOTk5ODE2MTA5MDM1NjViOTM5MjUwNTA1MDU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMDliMzU3NjAwMDgwZmQ1YjgyMzU2MTA5YmU4MTYxMDkwMzU2NWI5NDYwMjA5MzkwOTMwMTM1OTM1MDUwNTA1NjViNjAwMDViODM4MTEwMTU2MTA5ZTc1NzgxODEwMTUxODM4MjAxNTI2MDIwMDE2MTA5Y2Y1NjViODM4MTExMTU2MTA5ZjY1NzYwMDA4NDg0MDE1MjViNTA1MDUwNTA1NjViNjAwMDgxNTE4MDg0NTI2MTBhMTQ4MTYwMjA4NjAxNjAyMDg2MDE2MTA5Y2M1NjViNjAxZjAxNjAxZjE5MTY5MjkwOTIwMTYwMjAwMTkyOTE1MDUwNTY1YjgwNTExNTE1ODI1MjYwMDA2MDIwODIwMTUxNjAwMTYwMDE2MGEwMWIwMzgwODIxNjYwMjA4NjAxNTI2MDQwODQwMTUxOTE1MDYwYTA2MDQwODYwMTUyNjEwYTYwNjBhMDg2MDE4MzYxMDlmYzU2NWI5MTUwNjA2MDg0MDE1MTg1ODMwMzYwNjA4NzAxNTI2MTBhNzk4MzgyNjEwOWZjNTY1YjkyNTA1MDgwNjA4MDg1MDE1MTE2NjA4MDg2MDE1MjUwODA5MTUwNTA5MjkxNTA1MDU2NWI4MjYwMDcwYjgxNTI2MDQwNjAyMDgyMDE1MjYwMDA2MTBhYWY2MDQwODMwMTg0NjEwYTI4NTY1Yjk0OTM1MDUwNTA1MDU2NWI2MzRlNDg3YjcxNjBlMDFiNjAwMDUyNjA0MTYwMDQ1MjYwMjQ2MDAwZmQ1YjYwNDA1MTYwNjA4MTAxNjdmZmZmZmZmZmZmZmZmZmZmODExMTgyODIxMDE3MTU2MTBhZjA1NzYxMGFmMDYxMGFiNzU2NWI2MDQwNTI5MDU2NWI2MDQwODA1MTkwODEwMTY3ZmZmZmZmZmZmZmZmZmZmZjgxMTE4MjgyMTAxNzE1NjEwYWYwNTc2MTBhZjA2MTBhYjc1NjViNjA0MDUxNjBhMDgxMDE2N2ZmZmZmZmZmZmZmZmZmZmY4MTExODI4MjEwMTcxNTYxMGFmMDU3NjEwYWYwNjEwYWI3NTY1YjYwNDA1MTYwMWY4MjAxNjAxZjE5MTY4MTAxNjdmZmZmZmZmZmZmZmZmZmZmODExMTgyODIxMDE3MTU2MTBiNjU1NzYxMGI2NTYxMGFiNzU2NWI2MDQwNTI5MTkwNTA1NjViNjNmZmZmZmZmZjgxMTY4MTE0NjEwOTE4NTc2MDAwODBmZDViNjAwMDgwODI4NDAzNjA4MDgxMTIxNTYxMGI5MzU3NjAwMDgwZmQ1YjgzMzU2MTBiOWU4MTYxMDkwMzU2NWI5MjUwNjA2MDYwMWYxOTgyMDExMjE1NjEwYmIyNTc2MDAwODBmZDViNTA2MTBiYmI2MTBhY2Q1NjViNjAyMDg0MDEzNTYxMGJjOTgxNjEwYjZkNTY1YjgxNTI2MDQwODQwMTM1NjEwYmQ5ODE2MTA5MDM1NjViNjAyMDgyMDE1MjYwNjA4NDAxMzU2MTBiZWM4MTYxMGI2ZDU2NWI2MDQwODIwMTUyOTE5NDkxOTM1MDkwOTE1MDUwNTY1YjgwMTUxNTgxMTQ2MTA5MTg1NzYwMDA4MGZkNWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwYzI0NTc2MTBjMjQ2MTBhYjc1NjViNTA2MDFmMDE2MDFmMTkxNjYwMjAwMTkwNTY1YjYwMDA4MjYwMWY4MzAxMTI2MTBjNDM1NzYwMDA4MGZkNWI4MTM1NjEwYzU2NjEwYzUxODI2MTBjMGE1NjViNjEwYjNjNTY1YjgxODE1Mjg0NjAyMDgzODYwMTAxMTExNTYxMGM2YjU3NjAwMDgwZmQ1YjgxNjAyMDg1MDE2MDIwODMwMTM3NjAwMDkxODEwMTYwMjAwMTkxOTA5MTUyOTM5MjUwNTA1MDU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMGM5YjU3NjAwMDgwZmQ1YjYxMGNhNTgzMzU2MTA5MDM1NjViODIzNTkxNTA2N2ZmZmZmZmZmZmZmZmZmZmY4MDYwMjA4NTAxMzUxMTE1NjEwY2MzNTc2MDAwODBmZDViNjAyMDg0MDEzNTg0MDE4NTYwMWY4MjAxMTI2MTBjZDk1NzYwMDA4MGZkNWI4MTgxMzUxMTE1NjEwY2VhNTc2MTBjZWE2MTBhYjc1NjViNjEwY2ZhNjAyMDgyMzU2MDA1MWIwMTYxMGIzYzU2NWI4MTM1ODA4MjUyNjAyMDgwODMwMTkyOTE2MDA1MWI4NDAxMDE4ODgxMTExNTYxMGQxOTU3NjAwMDgwZmQ1YjYwMjA4NDAxNWI4MTgxMTAxNTYxMGUzYTU3ODU4MTM1MTExNTYxMGQzNDU3NjAwMDgwZmQ1YjgwMzU4NTAxNjAxZjE5NjA0MDgyOGQwMzgyMDExMjE1NjEwZDRkNTc2MDAwODBmZDViNjEwZDU1NjEwYWY2NTY1YjYwMjA4MzAxMzU4MTUyODg2MDQwODQwMTM1MTExNTYxMGQ2ZDU3NjAwMDgwZmQ1YjYwNDA4MzAxMzU4MzAxOTI1MDYwYTA4Mjg0OGYwMzAxMTIxNTYxMGQ4ODU3NjAwMDgwZmQ1YjYxMGQ5MDYxMGIxOTU2NWI5MTUwNjEwZDlmNjAyMDg0MDEzNTYxMGJmYzU2NWI2MDIwODMwMTM1ODI1MjYxMGRiMzYwNDA4NDAxMzU2MTA5MDM1NjViNjA0MDgzMDEzNTYwMjA4MzAxNTI4ODYwNjA4NDAxMzUxMTE1NjEwZGNlNTc2MDAwODBmZDViNjEwZGUxOGQ2MDIwNjA2MDg2MDEzNTg2MDEwMTYxMGMzMjU2NWI2MDQwODMwMTUyODg2MDgwODQwMTM1MTExNTYxMGRmNzU3NjAwMDgwZmQ1YjYxMGUwYThkNjAyMDYwODA4NjAxMzU4NjAxMDE2MTBjMzI1NjViNjA2MDgzMDE1MjYxMGUxYjYwYTA4NDAxNjEwOTFiNTY1YjYwODA4MzAxNTI2MDIwODE4MTAxOTI5MDkyNTI4NjUyOTQ4NTAxOTQ5MTkwOTEwMTkwNTA2MTBkMWU1NjViNTA5NTk4OTA5NzUwOTU1MDUwNTA1MDUwNTA1NjViNjAwMDgwNjA0MDgzODUwMzEyMTU2MTBlNWM1NzYwMDA4MGZkNWI4MjM1NjEwZTY3ODE2MTA5MDM1NjViOTE1MDYwMjA4MzAxMzU2MTBlNzc4MTYxMDkwMzU2NWI4MDkxNTA1MDkyNTA5MjkwNTA1NjViODI4MTUyNjA4MDgxMDE2MTA5OTk2MDIwODMwMTg0ODA1MTYzZmZmZmZmZmY5MDgxMTY4MzUyNjAyMDgwODMwMTUxNjAwMTYwMDE2MGEwMWIwMzE2OTA4NDAxNTI2MDQwOTE4MjAxNTExNjkxMDE1MjU2NWI2MDAwODI1MTYxMGVjZTgxODQ2MDIwODcwMTYxMDljYzU2NWI5MTkwOTEwMTkyOTE1MDUwNTY1YjgwNTE2MDAzODE5MDBiODExNDYxMDkyNjU3NjAwMDgwZmQ1YjYwMDA2MDIwODI4NDAzMTIxNTYxMGVmYzU3NjAwMDgwZmQ1YjYxMDk5OTgyNjEwZWQ4NTY1YjgwNTE2MTA5MjY4MTYxMDkwMzU2NWI2MDAwODI2MDFmODMwMTEyNjEwZjIxNTc2MDAwODBmZDViODE1MTYxMGYyZjYxMGM1MTgyNjEwYzBhNTY1YjgxODE1Mjg0NjAyMDgzODYwMTAxMTExNTYxMGY0NDU3NjAwMDgwZmQ1YjYxMGFhZjgyNjAyMDgzMDE2MDIwODcwMTYxMDljYzU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMGY2ODU3NjAwMDgwZmQ1YjYxMGY3MTgzNjEwZWQ4NTY1YjkxNTA2MDIwODMwMTUxNjdmZmZmZmZmZmZmZmZmZmZmODA4MjExMTU2MTBmOGU1NzYwMDA4MGZkNWI5MDg0MDE5MDYwYTA4Mjg3MDMxMjE1NjEwZmEyNTc2MDAwODBmZDViNjEwZmFhNjEwYjE5NTY1YjgyNTE2MTBmYjU4MTYxMGJmYzU2NWI4MTUyNjAyMDgzMDE1MTYxMGZjNTgxNjEwOTAzNTY1YjYwMjA4MjAxNTI2MDQwODMwMTUxODI4MTExMTU2MTBmZGM1NzYwMDA4MGZkNWI2MTBmZTg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw9TIpaY9cB415OF8oHC5YqvXLVinVEuw8vqTP5+vk2gmQ++/OmcZCj0yzLX5bGgoQGgsIn5rbqgYQg538CyIPCgkI4pnbqgYQow4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjjmduqBhCpDhICGAISAhgDGNPltjEiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBmAgSAxjGCCKQCDg4ODI4NjAxNjEwZjEwNTY1YjYwNDA4MzAxNTI1MDYwNjA4MzAxNTE4MjgxMTExNTYxMTAwMDU3NjAwMDgwZmQ1YjYxMTAwYzg4ODI4NjAxNjEwZjEwNTY1YjYwNjA4MzAxNTI1MDYxMTAxZTYwODA4NDAxNjEwZjA1NTY1YjYwODA4MjAxNTI4MDkzNTA1MDUwNTA5MjUwOTI5MDUwNTY1YjYwMDE2MDAxNjBhMDFiMDM4MzE2ODE1MjYwODA4MTAxNjEwOTk5NjAyMDgzMDE4NDgwNTE2M2ZmZmZmZmZmOTA4MTE2ODM1MjYwMjA4MDgzMDE1MTYwMDE2MDAxNjBhMDFiMDMxNjkwODQwMTUyNjA0MDkxODIwMTUxMTY5MTAxNTI1NjViNjAwMDYwNDA4MDgzMDE2MDAxNjAwMTYwYTAxYjAzODYxNjg0NTI2MDIwODI4MTg2MDE1MjgxODY1MTgwODQ1MjYwNjA4NzAxOTE1MDYwNjA4MTYwMDUxYjg4MDEwMTkzNTA4Mjg4MDE2MDAwNWI4MjgxMTAxNTYxMTBlOTU3ODg4NjAzNjA1ZjE5MDE4NDUyODE1MTgwNTE4NzUyODUwMTUxODU4NzAxODg5MDUyNjExMGQ2ODg4ODAxODI2MTBhMjg1NjViOTY1MDUwOTI4NDAxOTI5MDg0MDE5MDYwMDEwMTYxMTBhYTU2NWI1MDkzOTk5ODUwNTA1MDUwNTA1MDUwNTA1MDU2NWI2MDAwODA4Mjg0MDM2MDgwODExMjE1NjExMTBjNTc2MDAwODBmZDViNjExMTE1ODQ2MTBlZDg1NjViOTI1MDYwNjA2MDFmMTk4MjAxMTIxNTYxMTEyOTU3NjAwMDgwZmQ1YjUwNjExMTMyNjEwYWNkNTY1YjYwMjA4NDAxNTE2MTExNDA4MTYxMGI2ZDU2NWI4MTUyNjA0MDg0MDE1MTYxMTE1MDgxNjEwOTAzNTY1YjYwMjA4MjAxNTI2MDYwODQwMTUxNjEwYmVjODE2MTBiNmQ1NjViNjAwMDgwNjA0MDgzODUwMzEyMTU2MTExNzY1NzYwMDA4MGZkNWI2MTExN2Y4MzYxMGVkODU2NWI5MTUwNjAyMDgzMDE1MTYxMGU3NzgxNjEwYmZjNTY1YjYwMDA2MDIwODI4NDAzMTIxNTYxMTFhMTU3NjAwMDgwZmQ1YjgxNTE4MDYwMDcwYjgxMTQ2MTA5OTk1NzYwMDA4MGZkZmVhMjY0Njk3MDY2NzM1ODIyMTIyMDkxZDY1YzY1ZWVhOTljOWFhMTYwOGYxODEyODA3NDMzOWQ0OWI0NmQ5ZjY2YWY5MTA4ZmEwYzRlN2Q2MmQyYTU2NDczNmY2YzYzNDMwMDA4MGIwMDMz","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwn1Cguczj5OfdOzho2v+wkpUheGtDPouh0GYGb+pNRFV8gYa+yPRHhJis1lIhr84LGgwIn5rbqgYQ+4mogwIiDwoJCOOZ26oGEKkOEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjkmduqBhCrDhICGAISAhgDGJb7rp0CIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5CRQoDGMYIGiISIAawndzz+x4pvIw8voIrOa9bCkJOiBKEOzLVYvx0A5a4IJChD0IFCIDO2gNSAFoAagtjZWxsYXIgZG9vcg==","b64Record":"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YQnPVluDgREVYQn2V2AAhIQBUltQUFBQVltgAIFRgIRSYQoUgWAghgFgIIYBYQnMVltgHwFgHxkWkpCSAWAgAZKRUFBWW4BRFRWCUmAAYCCCAVFgAWABYKAbA4CCFmAghgFSYECEAVGRUGCgYECGAVJhCmBgoIYBg2EJ/FZbkVBgYIQBUYWDA2BghwFSYQp5g4JhCfxWW5JQUIBggIUBURZggIYBUlCAkVBQkpFQUFZbgmAHC4FSYEBgIIIBUmAAYQqvYECDAYRhCihWW5STUFBQUFZbY05Ie3Fg4BtgAFJgQWAEUmAkYAD9W2BAUWBggQFn//////////+BEYKCEBcVYQrwV2EK8GEKt1ZbYEBSkFZbYECAUZCBAWf//////////4ERgoIQFxVhCvBXYQrwYQq3VltgQFFgoIEBZ///////////gRGCghAXFWEK8FdhCvBhCrdWW2BAUWAfggFgHxkWgQFn//////////+BEYKCEBcVYQtlV2ELZWEKt1ZbYEBSkZBQVltj/////4EWgRRhCRhXYACA/VtgAICChANggIESFWELk1dgAID9W4M1YQuegWEJA1ZbklBgYGAfGYIBEhVhC7JXYACA/VtQYQu7YQrNVltgIIQBNWELyYFhC21WW4FSYECEATVhC9mBYQkDVltgIIIBUmBghAE1YQvsgWELbVZbYECCAVKRlJGTUJCRUFBWW4AVFYEUYQkYV2AAgP1bYABn//////////+CERVhDCRXYQwkYQq3VltQYB8BYB8ZFmAgAZBWW2AAgmAfgwESYQxDV2AAgP1bgTVhDFZhDFGCYQwKVlthCzxWW4GBUoRgIIOGAQERFWEMa1dgAID9W4FgIIUBYCCDATdgAJGBAWAgAZGQkVKTklBQUFZbYACAYECDhQMSFWEMm1dgAID9W2EMpYM1YQkDVluCNZFQZ///////////gGAghQE1ERVhDMNXYACA/VtgIIQBNYQBhWAfggESYQzZV2AAgP1bgYE1ERVhDOpXYQzqYQq3VlthDPpgIII1YAUbAWELPFZbgTWAglJgIICDAZKRYAUbhAEBiIERFWENGVdgAID9W2AghAFbgYEQFWEOOleFgTURFWENNFdgAID9W4A1hQFgHxlgQIKNA4IBEhVhDU1XYACA/VthDVVhCvZWW2AggwE1gVKIYECEATURFWENbVdgAID9W2BAgwE1gwGSUGCggoSPAwESFWENiFdgAID9W2ENkGELGVZbkVBhDZ9gIIQBNWEL/FZbYCCDATWCUmENs2BAhAE1YQkDVltgQIMBNWAggwFSiGBghAE1ERVhDc5XYACA/VthDeGNYCBgYIYBNYYBAWEMMlZbYECDAVKIYICEATURFWEN91dgAID9W2EOCo1gIGCAhgE1hgEBYQwyVltgYIMBUmEOG2CghAFhCRtWW2CAgwFSYCCBgQGSkJJShlKUhQGUkZCRAZBQYQ0eVltQlZiQl1CVUFBQUFBQVltgAIBgQIOFAxIVYQ5cV2AAgP1bgjVhDmeBYQkDVluRUGAggwE1YQ53gWEJA1ZbgJFQUJJQkpBQVluCgVJggIEBYQmZYCCDAYSAUWP/////kIEWg1JgIICDAVFgAWABYKAbAxaQhAFSYECRggFRFpEBUlZbYACCUWEOzoGEYCCHAWEJzFZbkZCRAZKRUFBWW4BRYAOBkAuBFGEJJldgAID9W2AAYCCChAMSFWEO/FdgAID9W2EJmYJhDthWW4BRYQkmgWEJA1ZbYACCYB+DARJhDyFXYACA/VuBUWEPL2EMUYJhDApWW4GBUoRgIIOGAQERFWEPRFdgAID9W2EKr4JgIIMBYCCHAWEJzFZbYACAYECDhQMSFWEPaFdgAID9W2EPcYNhDthWW5FQYCCDAVFn//////////+AghEVYQ+OV2AAgP1bkIQBkGCggocDEhVhD6JXYACA/VthD6phCxlWW4JRYQ+1gWEL/FZbgVJgIIMBUWEPxYFhCQNWW2AgggFSYECDAVGCgREVYQ/cV2AAgP1bYQ/oiIKGAWEPEFZbYECDAVJQYGCDAVGCgREVYRAAV2AAgP1bYRAMiIKGAWEPEFZbYGCDAVJQYRAeYICEAWEPBVZbYICCAVKAk1BQUFCSUJKQUFZbYAFgAWCgGwODFoFSYICBAWEJmWAggwGEgFFj/////5CBFoNSYCCAgwFRYAFgAWCgGwMWkIQBUmBAkYIBURaRAVJWW2AAYECAgwFgAWABYKAbA4YWhFJgIIKBhgFSgYZRgIRSYGCHAZFQYGCBYAUbiAEBk1CCiAFgAFuCgRAVYRDpV4iGA2BfGQGEUoFRgFGHUoUBUYWHAYiQUmEQ1oiIAYJhCihWW5ZQUJKEAZKQhAGQYAEBYRCqVltQk5mYUFBQUFBQUFBQVltgAICChANggIESFWERDFdgAID9W2ERFYRhDthWW5JQYGBgHxmCARIVYREpV2AAgP1bUGERMmEKzVZbYCCEAVFhEUCBYQttVluBUmBAhAFRYRFQgWEJA1ZbYCCCAVJgYIQBUWEL7IFhC21WW2AAgGBAg4UDEhVhEXZXYACA/VthEX+DYQ7YVluRUGAggwFRYQ53gWEL/FZbYABgIIKEAxIVYRGhV2AAgP1bgVGAYAcLgRRhCZlXYACA/f6iZGlwZnNYIhIgkdZcZe6pnJqhYI8YEoB0M51JtG2fZq+RCPoMTn1i0qVkc29sY0MACAsAMyKAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAowJoMOgMYxwhKFgoUAAAAAAAAAAAAAAAAAAAAAAAABEdyBwoDGMcIEAFSFgoJCgIYAhD/ssUNCgkKAhhiEICzxQ0="},{"b64Body":"Cg8KCQjkmduqBhCtDhICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxjHCBCgjQYihAETqO1TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=","b64Record":"CiUIISIDGMcIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDnp0NxCTnFgKpr4pIxL0P3WX1NGlDcHM3RJBnJS90srEB3Enb/2oK38qBQY62oBogaDAigmtuqBhCrrK+JAiIPCgkI5JnbqgYQrQ4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCA19oCOtEBGsoBMHgwOGMzNzlhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE1NTQ3MjYxNmU3MzY2NjU3MjIwNjY3MjZmNmQyMDY2NjE2OTZjNjU2NDIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCiA8QRSFgoJCgIYAhD/rbUFCgkKAhhiEICutQU="},{"b64Body":"ChEKCQjkmduqBhCtDhICGAIgAXIbEhkKAxjDCBIHCgMYwQgQAhIJCgMYwAgQARgB","b64Record":"CgMIpAISMFRBRdakeGlyFZk7n06Z/9BpNmDFwRYWOrUipZ1ejOd/GpaR77jSJDUKKykEcyAaUBoMCKCa26oGEKysr4kCIhEKCQjkmduqBhCtDhICGAIgATrcAQoDGOcCEiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJBofU1BFTkRFUl9ET0VTX05PVF9IQVZFX0FMTE9XQU5DRSiK3AFQ/cAEYoQBFdrL6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABagMYxwhSAHoMCKCa26oGEKusr4kC"},{"b64Body":"Cg8KCQjlmduqBhCvDhICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxjHCBCgjQYihAETqO1TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=","b64Record":"CiUIISIDGMcIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjB7u2F8EAyp040GEzfWKY3Qa7Gl3NJ/TLaQJksKdYaSXJS37xpS4CWEGV7OuHp4eS0aCwihmtuqBhDTz/AZIg8KCQjlmduqBhCvDhICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMIDX2gI60QEaygEweDA4YzM3OWEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTU1NDcyNjE2ZTczNjY2NTcyMjA2NjcyNmY2ZDIwNjY2MTY5NmM2NTY0MjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwKIDxBFIWCgkKAhgCEP+ttQUKCQoCGGIQgK61BQ=="},{"b64Body":"ChEKCQjlmduqBhCvDhICGAIgAXIbEhkKAxjECBIHCgMYwQgQAhIJCgMYwAgQARgB","b64Record":"CgMIpAISMJdsuEvRWlR2pLZTtuNp1MJx3NecYpGLpHTsGPne+vjiUqBlIrGNAnKaoD9X2mv6iRoLCKGa26oGENTP8BkiEQoJCOWZ26oGEK8OEgIYAiABOtwBCgMY5wISIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEkGh9TUEVOREVSX0RPRVNfTk9UX0hBVkVfQUxMT1dBTkNFKIrcAVD9wARihAEV2svqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFqAxjHCFIAegsIoZrbqgYQ08/wGQ=="},{"b64Body":"Cg8KCQjlmduqBhCxDhICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxjHCBCgjQYihAETqO1TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=","b64Record":"CiUIISIDGMcIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjB/sw4uclSomRyjOcqMHovewlihGoq6KGO2tCmxtBSNNqM2LJNqU3fE5fFDZm4uibQaDAihmtuqBhCjkoqGAiIPCgkI5ZnbqgYQsQ4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCA19oCOtEBGsoBMHgwOGMzNzlhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE1NTQ3MjYxNmU3MzY2NjU3MjIwNjY3MjZmNmQyMDY2NjE2OTZjNjU2NDIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCiA8QRSFgoJCgIYAhD/rbUFCgkKAhhiEICutQU="},{"b64Body":"ChEKCQjlmduqBhCxDhICGAIgAXIbEhkKAxjFCBIHCgMYwQgQAhIJCgMYwAgQARgB","b64Record":"CgMIpAISMMHmZutCa0Wq6fNnuqlrrOt/KhRmWPCBi9Do3mWYq3kGKNFqS7uxMmxbmFwcGHiowhoMCKGa26oGEKSSioYCIhEKCQjlmduqBhCxDhICGAIgATrcAQoDGOcCEiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJBofU1BFTkRFUl9ET0VTX05PVF9IQVZFX0FMTE9XQU5DRSiK3AFQ/cAEYoQBFdrL6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABagMYxwhSAHoMCKGa26oGEKOSioYC"}]},"HapiTransferFromForFungibleTokenWithCustomFeesWithBothApproveForAllAndAssignedSpender":{"placeholderNum":1096,"encodedItems":[{"b64Body":"Cg8KCQjpmduqBhDBDhICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIHgA5Ne/1GSUyZKv4c6vGCILcaEk/kuO1NSAPztHzcAHEICU69wDSgUIgM7aAw==","b64Record":"CiUIFhIDGMkIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCIz1+PW9xU33QXZAzRTa7RRW0o69SK3lBuIePWX/NV22ZU39feH1l7Ybu8ROyfT7UaDAilmtuqBhCL+563AyIPCgkI6ZnbqgYQwQ4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+n1rkHCgsKAxjJCBCAqNa5Bw=="},{"b64Body":"Cg8KCQjqmduqBhDDDhICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIA+qaksseTnEny43YXHG2WnntdX+oOMoa89acaoz5FBhEIDIr6AlSgUIgM7aAw==","b64Record":"CiUIFhIDGMoIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAaUownBh3LoG+PeXd/y4Q9FsunkGcbiXN/ZZWUG7bWsmYZXglerFNIiXsIn0TUEjMaDAimmtuqBhDzv73IASIPCgkI6pnbqgYQww4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+P38BKCgsKAxjKCBCAkN/ASg=="},{"b64Body":"Cg8KCQjqmduqBhDFDhICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIJ0JQ2UF4cHxQ4PgXdDGyFMBrb7lJ8xvmJ3W3NcqyE9zEIDIr6AlSgUIgM7aAw==","b64Record":"CiUIFhIDGMsIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAstdBsSHfFVAVIHkJcJUZ+QGvSAGHB17D0E/pwXOzRUJTVDopfl0svvyC33uF3+G0aDAimmtuqBhDbo+22AyIPCgkI6pnbqgYQxQ4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+P38BKCgsKAxjLCBCAkN/ASg=="},{"b64Body":"Cg8KCQjrmduqBhDHDhICGAISAhgDGPuV9hQiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjloxCiISIMlUNkEs+TCYPTIM8LRfiPpTiCoJjWptlgxViPS5HCbLEIDIr6AlSgUIgM7aAw==","b64Record":"CiUIFhIDGMwIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCVfoZA6mshOJI9zJm2SCF8o+ZNssqDj1lXJHzTw0tw+EKNPPuMYmiOLTNCycoYYYAaDAinmtuqBhCDhOXKASIPCgkI65nbqgYQxw4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIZCgoKAhgCEP+P38BKCgsKAxjMCBCAkN/ASg=="},{"b64Body":"Cg8KCQjrmduqBhDJDhICGAISAhgDGJHE9OgCIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qATIKEGZ1bmdpYmxlVG9rZW5GZWUSCElSQVBRTEpKIOgHKgMYyQhqDAin6LWuBhCgzMauAw==","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGM0IEjB4lipACMvf49ZxixPkaS72SalS7UZvLGbTPoEdxgy9VAryAfCmjWqDWFdolSavRbMaDAinmtuqBhCbwJO8AyIPCgkI65nbqgYQyQ4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWg8KAxjNCBIICgMYyQgQ0A9yCgoDGM0IEgMYyQg="},{"b64Body":"Cg8KCQjsmduqBhDPDhICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGMsIEgMYzQg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwhtjoEX83zUMKZyj8wlFfH3vAgdHrMj3oKOksztArimvVy8og5JlXWC6818NhC2fCGgwIqJrbqgYQg9bG5wEiDwoJCOyZ26oGEM8OEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjsmduqBhDVDhICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGMoIEgMYzQg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwGkuzNB1whtBWQk3r7uZFoede3xEnrVVd089WYxwEvg9YMEXLHBVf1foGeI1+y9DKGgsIqZrbqgYQg5bGAiIPCgkI7JnbqgYQ1Q4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjtmduqBhDbDhICGAISAhgDGOC2iyAiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICCgoDGMwIEgMYzQg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwtRpqVwnVLU15dZzrNXB5VHwZsnwFNtmha6Ovx3/25OHHsUyKEi9amTjemtkEKnF1GgwIqZrbqgYQ65XA8QEiDwoJCO2Z26oGENsOEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjtmduqBhDdDhICGAISAhgDGOC3qdEFIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAUsKHWZ1bmdpYmxlVG9rZW5XaXRoRml4ZWRIYmFyRmVlEghIWUJCQlRJVyDoByoDGMoIagwIqei1rgYQ2OPgzwOqAQkKAggBGgMYygg=","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGM4IEjDdnutDQTYKxfbzZ8V8D4cmnDELEIpj3ydC0+vkG3X3wKgTV15C9nveYfoz8p5nJncaCwiqmtuqBhCD19oCIg8KCQjtmduqBhDdDhICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUgBaDwoDGM4IEggKAxjKCBDQD3IKCgMYzggSAxjKCA=="},{"b64Body":"Cg8KCQjumduqBhDfDhICGAISAhgDGK2r69EFIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAVEKHmZ1bmdpYmxlVG9rZW5XaXRoRml4ZWRUb2tlbkZlZRIIWkRXUVNCTlkg6AcqAxjKCGoMCKrota4GEJjF0uQBqgEOCgcIARIDGM0IGgMYygg=","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGM8IEjC/mdh7C1x6oafYF0C1mkyJiQu2pN/vLGOY+TxZODvlBcUxE5AxdfAYeDEefOodJu0aDAiqmtuqBhD77uDzASIPCgkI7pnbqgYQ3w4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWg8KAxjPCBIICgMYyggQ0A9yCgoDGM8IEgMYygg="},{"b64Body":"Cg8KCQjumduqBhDhDhICGAISAhgDGPm9gdIFIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo7qAVkKI2Z1bmdpYmxlVG9rZW5XaXRoRnJhY3Rpb25hbFRva2VuRmVlEghQQ0NYS0hRUyDoByoDGMoIagwIqui1rgYQsJnz1wOqARESCgoECAEQAhABGAoaAxjKCA==","b64Record":"CiUIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkD1IDGNAIEjA9ydcekZpAxdSXnGYULnHtxWIi8LzqvKx6Yd6X5gmC75820YSCM92FzvtNcuAYekYaCwirmtuqBhDjk84KIg8KCQjumduqBhDhDhICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOUgBaDwoDGNAIEggKAxjKCBDQD3IKCgMY0AgSAxjKCA=="},{"b64Body":"Cg8KCQjvmduqBhDnDhICGAISAhgDGJuqziEiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICFAoDGMsIEgMYzggSAxjPCBIDGNAI","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw/m1ghwlS+4FOaZvUb/NBNVD45k4Wnu4rGc9gOn1ZUrppHfr7k55NQJJEAoAe6PhmGgwIq5rbqgYQo9O8/AEiDwoJCO+Z26oGEOcOEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQjwmduqBhDtDhICGAISAhgDGJuqziEiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjsICFAoDGMwIEgMYzggSAxjPCBIDGNAI","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwFflLi0l6tpXK0vabrQM6rh3og3SHRHy+NMQtnxdYPiB4Q/sduoJOTJCyjkZYU3PnGgsIrJrbqgYQq+CDCiIPCgkI8JnbqgYQ7Q4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjwmduqBhDvDhICGAISAhgDGOufNiICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchkSFwoDGM0IEgcKAxjJCBABEgcKAxjLCBAC","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw9/SYkZpOb6h3M/apXTFm3tIjJtrtoVNlzWWVHtBCAq5sGmDVImkvEWp1Sl+pw63NGgwIrJrbqgYQi5rdlAIiDwoJCPCZ26oGEO8OEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFoXCgMYzQgSBwoDGMkIEAESBwoDGMsIEAI="},{"b64Body":"Cg8KCQjxmduqBhDxDhICGAISAhgDGOufNiICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchkSFwoDGM4IEgcKAxjKCBABEgcKAxjLCBAC","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw+fUh7wCJCfzx/HZ9BfmGQ0eaW22H2YyxksGy6eFMh73zfrLhx02JA2mhaiuJEh3pGgsIrZrbqgYQw96YLCIPCgkI8ZnbqgYQ8Q4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWhcKAxjOCBIHCgMYyggQARIHCgMYywgQAg=="},{"b64Body":"Cg8KCQjxmduqBhDzDhICGAISAhgDGOufNiICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchkSFwoDGM8IEgcKAxjKCBABEgcKAxjLCBAC","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwuhgpp0yjGkh0TAoRyVmJ7qC1z3TO27Wjwc+GTgUX2+0JdjxPr7J9G+CbdgMQtsyOGgwIrZrbqgYQy4/PhQIiDwoJCPGZ26oGEPMOEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAFoXCgMYzwgSBwoDGMoIEAESBwoDGMsIEAI="},{"b64Body":"Cg8KCQjymduqBhD1DhICGAISAhgDGOufNiICCHgyIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOchkSFwoDGNAIEgcKAxjKCBADEgcKAxjLCBAE","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw5qpwVJlwlduVQ8MrapV+dkgbkUFZ2dsMdf+BnO8pOs41+e0TBDoJBgbXDF2+edODGgsIrprbqgYQg6iYOSIPCgkI8pnbqgYQ9Q4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIAWhcKAxjQCBIHCgMYyggQAxIHCgMYywgQBA=="},{"b64Body":"Cg8KCQjymduqBhD3DhICGAISAhgDGP7LzSwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjooBjwESDAiu6LWuBhDw0/OVAhptCiISIK8KbbyIThHHz4XIlyRnYlkf9gDB2eSwdYj+klNB+fGuCiM6IQNRYW5XV1BabBW6wPCaYjSOgEdRDY80cPFWQDO6LYgFhAoiEiB0bKFmZp7D8aRLOYBkouGP1XDoftw4xhwro4RKaaAyQyIMSGVsbG8gV29ybGQhKgAyAA==","b64Record":"CiUIFhoDGNEIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjCc4PtFfFSnDCpt5ibv1mGdeDNIA7nq+N4esJZtQIDRZk0PAPkLkazevOfLXX2w+/0aDAiumtuqBhCjvIesAiIPCgkI8pnbqgYQ9w4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjzmduqBhD7DhICGAISAhgDGIudjj4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjpoBiCAKAxjRCCKAIDYwODA2MDQwNTIzNDgwMTU2MTAwMTA1NzYwMDA4MGZkNWI1MDYxMTFlODgwNjEwMDIwNjAwMDM5NjAwMGYzZmU2MDgwNjA0MDUyMzQ4MDE1NjEwMDEwNTc2MDAwODBmZDViNTA2MDA0MzYxMDYxMDBhOTU3NjAwMDM1NjBlMDFjODA2MzZmYzNjYmFmMTE2MTAwNzE1NzgwNjM2ZmMzY2JhZjE0NjEwMTMwNTc4MDYzN2M0MWFkMmMxNDYxMDE1NjU3ODA2MzhmOGQ3Zjk5MTQ2MTAxNjk1NzgwNjNhZjk5YzYzMzE0NjEwMTdjNTc4MDYzZDYxNGNkYjgxNDYxMDE4ZjU3ODA2M2YyYzMxZmY0MTQ2MTAxYjA1NzYwMDA4MGZkNWI4MDYzMTNhOGVkNTMxNDYxMDBhZTU3ODA2MzNiM2JmZjBmMTQ2MTAwYzM1NzgwNjMzYzRkZDMyZTE0NjEwMGU5NTc4MDYzNTA4MWRlZDMxNDYxMDEwYTU3ODA2MzU5M2Q2ZTgyMTQ2MTAxMWQ1NzViNjAwMDgwZmQ1YjYxMDBjMTYxMDBiYzM2NjAwNDYxMDkyYjU2NWI2MTAxZGQ1NjViMDA1YjYxMDBkNjYxMDBkMTM2NjAwNDYxMDk3YzU2NWI2MTAyNDM1NjViNjA0MDUxOTA4MTUyNjAyMDAxNWI2MDQwNTE4MDkxMDM5MGYzNWI2MTAwZmM2MTAwZjczNjYwMDQ2MTA5YTA1NjViNjEwMzFkNTY1YjYwNDA1MTYxMDBlMDkyOTE5MDYxMGE5MzU2NWI2MTAwYzE2MTAxMTgzNjYwMDQ2MTA5MmI1NjViNjEwNDA0NTY1YjYxMDBkNjYxMDEyYjM2NjAwNDYxMGI3ZjU2NWI2MTA0MTI1NjViNjEwMTQzNjEwMTNlMzY2MDA0NjEwYzg4NTY1YjYxMDRlZjU2NWI2MDQwNTE2MDA3OTE5MDkxMGI4MTUyNjAyMDAxNjEwMGUwNTY1YjYxMDBkNjYxMDE2NDM2NjAwNDYxMDk3YzU2NWI2MTA1MWI1NjViNjEwMTQzNjEwMTc3MzY2MDA0NjEwZTQ5NTY1YjYxMDU0OTU2NWI2MTAxNDM2MTAxOGEzNjYwMDQ2MTBlNDk1NjViNjEwNTdmNTY1YjYxMDFhMjYxMDE5ZDM2NjAwNDYxMDk3YzU2NWI2MTA1YjU1NjViNjA0MDUxNjEwMGUwOTI5MTkwNjEwZTgyNTY1YjYxMDFjMzYxMDFiZTM2NjAwNDYxMGU0OTU2NWI2MTA2YmY1NjViNjA0MDgwNTE2MDA3OTM5MDkzMGI4MzUyOTAxNTE1NjAyMDgzMDE1MjAxNjEwMGUwNTY1YjYwMDA2MTAxZWI4NTg1ODU4NTYxMDc4YTU2NWI2MDA3MGI5MDUwNjAxNjgxMTQ2MTAyM2M1NzYwNDA1MTYyNDYxYmNkNjBlNTFiODE1MjYwMjA2MDA0ODIwMTUyNjAxNTYwMjQ4MjAxNTI3NDU0NzI2MTZlNzM2NjY1NzIyMDY2NzI2ZjZkMjA2NjYxNjk2YzY1NjQyMTYwNTgxYjYwNDQ4MjAxNTI2MDY0MDE2MDQwNTE4MDkxMDM5MGZkNWI1MDUwNTA1MDUwNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MjE2NjAyNDgyMDE1MjYwMDA5MDgxOTA4MTkwNjEwMTY3OTA2MzNiM2JmZjBmNjBlMDFiOTA2MDQ0MDE1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE4MDUxNjAwMTYwMDE2MGUwMWIwMzE2NjAwMTYwMDE2MGUwMWIwMzE5OTA5NDE2OTM5MDkzMTc5MDkyNTI5MDUxNjEwMmFiOTE5MDYxMGViYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwMmU4NTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwMmVkNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTAyZmU1NzYwMTU2MTAzMTI1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTAzMTI5MTkwNjEwZWVhNTY1YjYwMDMwYjk0OTM1MDUwNTA1MDU2NWI2MDAwNjEwMzI3NjEwOGMwNTY1YjYwNDA4MDUxNjAwMTYwMDE2MGEwMWIwMzg2MTY2MDI0ODIwMTUyNjA0NDgwODIwMTg2OTA1MjgyNTE4MDgzMDM5MDkxMDE4MTUyNjA2NDkwOTEwMTgyNTI2MDIwODEwMTgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MzFlMjZlOTk3NjBlMTFiMTc5MDUyOTA1MTYwMDA5MTgyOTE2MTAxNjc5MTYxMDM4MTkxNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTAzYmU1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTAzYzM1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA2MTAzZDA2MTA4YzA1NjViODI2MTAzZGQ1NzYwMTU4MTYxMDNmMTU2NWI4MTgwNjAyMDAxOTA1MTgxMDE5MDYxMDNmMTkxOTA2MTBmNTU1NjViNjAwMzkxOTA5MTBiOTg5MDk3NTA5NTUwNTA1MDUwNTA1MDU2NWI2MDAwNjEwMWViODU4NTg1ODU2MTA4N2I1NjViNjAwMDgwNjAwMDYxMDE2NzYwMDE2MDAxNjBhMDFiMDMxNjYzNTkzZDZlODI2MGUwMWI4Njg2NjA0MDUxNjAyNDAxNjEwNDNlOTI5MTkwNjExMDMwNTY1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE4MDUxNjAwMTYwMDE2MGUwMWIwMzE2NjAwMTYwMDE2MGUwMWIwMzE5OTA5NDE2OTM5MDkzMTc5MDkyNTI5MDUxNjEwNDdjOTE5MDYxMGViYzU2NWI2MDAwNjA0MDUxODA4MzAzODE2MDAwODY1YWYxOTE1MDUwM2Q4MDYwMDA4MTE0NjEwNGI5NTc2MDQwNTE5MTUwNjAxZjE5NjAzZjNkMDExNjgyMDE2MDQwNTIzZDgyNTIzZDYwMDA2MDIwODQwMTNlNjEwNGJlNTY1YjYwNjA5MTUwNWI1MDkxNTA5MTUwODE2MTA0Y2Y1NzYwMTU2MTA0ZTM1NjViODA4MDYwMjAwMTkwNTE4MTAxOTA2MTA0ZTM5MTkwNjEwZWVhNTY1YjYwMDMwYjk1OTQ1MDUwNTA1MDUwNTY1YjYwMDA4MDYwMDA2MTAxNjc2MDAxNjAwMTYwYTAxYjAzMTY2MzZmYzNjYmFmNjBlMDFiODY4NjYwNDA1MTYwMjQwMTYxMDQzZTkyOTE5MDYxMTA3MzU2NWI2MDQwNTE2MDAxNjAwMTYwYTAxYjAzODIxNjYwMjQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjMxZjEwNmI0YjYwZTIxYjkwNjA0NDAxNjEwMjZkNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MzgxMTY2MDI0ODMwMTUyODIxNjYwNDQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjM4ZjhkN2Y5OTYwZTAxYjkwNjA2NDAxNjEwNDNlNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4MzgxMTY2MDI0ODMwMTUyODIxNjYwNDQ4MjAxNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjNhZjk5YzYzMzYwZTAxYjkwNjA2NDAxNjEwNDNlNTY1YjYwNDA4MDUxNjA2MDgxMDE4MjUyNjAwMDgwODI1MjYwMjA4MDgzMDE4MjkwNTI4Mjg0MDE4MjkwNTI4MzUxNjAwMTYwMDE2MGEwMWIwMzg2MTY2MDI0ODA4MzAxOTE5MDkxNTI4NTUxODA4MzAzOTA5MTAxODE1MjYwNDQ5MDkxMDE4NTUyOTA4MTAxODA1MTYwMDE2MDAxNjBlMDFiMDMxNjYzMWFjMjk5Yjc2MGUzMWIxNzkwNTI5MjUxOTA5MjgzOTE4MjkxNjEwMTY3OTE2MTA2Mjc5MTkwNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTA2NjQ1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTA2Njk1NjViNjA2MDkxNTA1YjUwNjA0MDgwNTE2MDYwODEwMTgyNTI2MDAwODA4MjUyNjAyMDgyMDE4MTkwNTI5MTgxMDE5MTkwOTE1MjkxOTM1MDkxNTA4MjYxMDY5OTU3NjAxNTgxNjEwNmFkNTY1YjgxODA2MDIwMDE5MDUxODEwMTkwNjEwNmFkOTE5MDYxMTBmODU2NWI2MDAzOTE5MDkxMGI5NzkwOTY1MDk0NTA1MDUwNTA1MDU2NWI2MDQwODA1MTYwMDE2MDAxNjBhMDFiMDM4NDgxMTY2MDI0ODMwMTUyODMxNjYwNDQ4MDgzMDE5MTkwOTE1MjgyNTE4MDgzMDM5MDkxMDE4MTUyNjA2NDkwOTEwMTgyNTI2MDIwODEwMTgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MzNjYjBjN2ZkNjBlMjFiMTc5MDUyOTA1MTYwMDA5MTgyOTE4MjkxODI5MTYxMDE2NzkxNjEwNzIxOTE2MTBlYmM1NjViNjAwMDYwNDA1MTgwODMwMzgxNjAwMDg2NWFmMTkxNTA1MDNkODA2MDAwODExNDYxMDc1ZTU3NjA0MDUxOTE1MDYwMWYxOTYwM2YzZDAxMTY4MjAxNjA0MDUyM2Q4MjUyM2Q2MDAwNjAyMDg0MDEzZTYxMDc2MzU2NWI2MDYwOTE1MDViNTA5MTUwOTE1MDgxNjEwNzc2NTc2MDE1NjAwMDYxMDZhZDU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDZhZDkxOTA2MTExNjM1NjViNjA0MDUxNjAwMTYwMDE2MGEwMWIwMzg1ODExNjYwMjQ4MzAxNTI4NDgxMTY2MDQ0ODMwMTUyODMxNjYwNjQ4MjAxNTI2MDg0ODEwMTgyOTA1MjYwMDA5MDgxOTA4MTkwNjEwMTY3OTA2MzBhZWQ2NWY1NjBlMTFiOTA2MGE0MDE1YjYwNDA4MDUxNjAxZjE5ODE4NDAzMDE4MTUyOTE4MTUyNjAyMDgyMDE=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIw+jBbUESkZO0JI6sxiKY1FyS48NvO2X752lkkLtfyLlfEkz4oQfLMbASifYaH5HSeGgsIr5rbqgYQs9OTQiIPCgkI85nbqgYQ+w4SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQjzmduqBhCBDxICGAISAhgDGPjR6j4iAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBiCASAxjRCCKAIDgwNTE2MDAxNjAwMTYwZTAxYjAzMTY2MDAxNjAwMTYwZTAxYjAzMTk5MDk0MTY5MzkwOTMxNzkwOTI1MjkwNTE2MTA4MDk5MTkwNjEwZWJjNTY1YjYwMDA2MDQwNTE4MDgzMDM4MTYwMDA4NjVhZjE5MTUwNTAzZDgwNjAwMDgxMTQ2MTA4NDY1NzYwNDA1MTkxNTA2MDFmMTk2MDNmM2QwMTE2ODIwMTYwNDA1MjNkODI1MjNkNjAwMDYwMjA4NDAxM2U2MTA4NGI1NjViNjA2MDkxNTA1YjUwOTE1MDkxNTA4MTYxMDg1YzU3NjAxNTYxMDg3MDU2NWI4MDgwNjAyMDAxOTA1MTgxMDE5MDYxMDg3MDkxOTA2MTExOGY1NjViOTc5NjUwNTA1MDUwNTA1MDUwNTY1YjYwNDA1MTYwMDE2MDAxNjBhMDFiMDM4NTgxMTY2MDI0ODMwMTUyODQ4MTE2NjA0NDgzMDE1MjgzMTY2MDY0ODIwMTUyNjA4NDgxMDE4MjkwNTI2MDAwOTA4MTkwODE5MDYxMDE2NzkwNjM5YjIzZDNkOTYwZTAxYjkwNjBhNDAxNjEwN2NiNTY1YjYwNDA1MTgwNjBhMDAxNjA0MDUyODA2MDAwMTUxNTgxNTI2MDIwMDE2MDAwNjAwMTYwMDE2MGEwMWIwMzE2ODE1MjYwMjAwMTYwNjA4MTUyNjAyMDAxNjA2MDgxNTI2MDIwMDE2MDAwNjAwMTYwMDE2MGEwMWIwMzE2ODE1MjUwOTA1NjViNjAwMTYwMDE2MGEwMWIwMzgxMTY4MTE0NjEwOTE4NTc2MDAwODBmZDViNTA1NjViODAzNTYxMDkyNjgxNjEwOTAzNTY1YjkxOTA1MDU2NWI2MDAwODA2MDAwODA2MDgwODU4NzAzMTIxNTYxMDk0MTU3NjAwMDgwZmQ1Yjg0MzU2MTA5NGM4MTYxMDkwMzU2NWI5MzUwNjAyMDg1MDEzNTYxMDk1YzgxNjEwOTAzNTY1YjkyNTA2MDQwODUwMTM1NjEwOTZjODE2MTA5MDM1NjViOTM5NjkyOTU1MDkyOTM2MDYwMDEzNTkyNTA1MDU2NWI2MDAwNjAyMDgyODQwMzEyMTU2MTA5OGU1NzYwMDA4MGZkNWI4MTM1NjEwOTk5ODE2MTA5MDM1NjViOTM5MjUwNTA1MDU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMDliMzU3NjAwMDgwZmQ1YjgyMzU2MTA5YmU4MTYxMDkwMzU2NWI5NDYwMjA5MzkwOTMwMTM1OTM1MDUwNTA1NjViNjAwMDViODM4MTEwMTU2MTA5ZTc1NzgxODEwMTUxODM4MjAxNTI2MDIwMDE2MTA5Y2Y1NjViODM4MTExMTU2MTA5ZjY1NzYwMDA4NDg0MDE1MjViNTA1MDUwNTA1NjViNjAwMDgxNTE4MDg0NTI2MTBhMTQ4MTYwMjA4NjAxNjAyMDg2MDE2MTA5Y2M1NjViNjAxZjAxNjAxZjE5MTY5MjkwOTIwMTYwMjAwMTkyOTE1MDUwNTY1YjgwNTExNTE1ODI1MjYwMDA2MDIwODIwMTUxNjAwMTYwMDE2MGEwMWIwMzgwODIxNjYwMjA4NjAxNTI2MDQwODQwMTUxOTE1MDYwYTA2MDQwODYwMTUyNjEwYTYwNjBhMDg2MDE4MzYxMDlmYzU2NWI5MTUwNjA2MDg0MDE1MTg1ODMwMzYwNjA4NzAxNTI2MTBhNzk4MzgyNjEwOWZjNTY1YjkyNTA1MDgwNjA4MDg1MDE1MTE2NjA4MDg2MDE1MjUwODA5MTUwNTA5MjkxNTA1MDU2NWI4MjYwMDcwYjgxNTI2MDQwNjAyMDgyMDE1MjYwMDA2MTBhYWY2MDQwODMwMTg0NjEwYTI4NTY1Yjk0OTM1MDUwNTA1MDU2NWI2MzRlNDg3YjcxNjBlMDFiNjAwMDUyNjA0MTYwMDQ1MjYwMjQ2MDAwZmQ1YjYwNDA1MTYwNjA4MTAxNjdmZmZmZmZmZmZmZmZmZmZmODExMTgyODIxMDE3MTU2MTBhZjA1NzYxMGFmMDYxMGFiNzU2NWI2MDQwNTI5MDU2NWI2MDQwODA1MTkwODEwMTY3ZmZmZmZmZmZmZmZmZmZmZjgxMTE4MjgyMTAxNzE1NjEwYWYwNTc2MTBhZjA2MTBhYjc1NjViNjA0MDUxNjBhMDgxMDE2N2ZmZmZmZmZmZmZmZmZmZmY4MTExODI4MjEwMTcxNTYxMGFmMDU3NjEwYWYwNjEwYWI3NTY1YjYwNDA1MTYwMWY4MjAxNjAxZjE5MTY4MTAxNjdmZmZmZmZmZmZmZmZmZmZmODExMTgyODIxMDE3MTU2MTBiNjU1NzYxMGI2NTYxMGFiNzU2NWI2MDQwNTI5MTkwNTA1NjViNjNmZmZmZmZmZjgxMTY4MTE0NjEwOTE4NTc2MDAwODBmZDViNjAwMDgwODI4NDAzNjA4MDgxMTIxNTYxMGI5MzU3NjAwMDgwZmQ1YjgzMzU2MTBiOWU4MTYxMDkwMzU2NWI5MjUwNjA2MDYwMWYxOTgyMDExMjE1NjEwYmIyNTc2MDAwODBmZDViNTA2MTBiYmI2MTBhY2Q1NjViNjAyMDg0MDEzNTYxMGJjOTgxNjEwYjZkNTY1YjgxNTI2MDQwODQwMTM1NjEwYmQ5ODE2MTA5MDM1NjViNjAyMDgyMDE1MjYwNjA4NDAxMzU2MTBiZWM4MTYxMGI2ZDU2NWI2MDQwODIwMTUyOTE5NDkxOTM1MDkwOTE1MDUwNTY1YjgwMTUxNTgxMTQ2MTA5MTg1NzYwMDA4MGZkNWI2MDAwNjdmZmZmZmZmZmZmZmZmZmZmODIxMTE1NjEwYzI0NTc2MTBjMjQ2MTBhYjc1NjViNTA2MDFmMDE2MDFmMTkxNjYwMjAwMTkwNTY1YjYwMDA4MjYwMWY4MzAxMTI2MTBjNDM1NzYwMDA4MGZkNWI4MTM1NjEwYzU2NjEwYzUxODI2MTBjMGE1NjViNjEwYjNjNTY1YjgxODE1Mjg0NjAyMDgzODYwMTAxMTExNTYxMGM2YjU3NjAwMDgwZmQ1YjgxNjAyMDg1MDE2MDIwODMwMTM3NjAwMDkxODEwMTYwMjAwMTkxOTA5MTUyOTM5MjUwNTA1MDU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMGM5YjU3NjAwMDgwZmQ1YjYxMGNhNTgzMzU2MTA5MDM1NjViODIzNTkxNTA2N2ZmZmZmZmZmZmZmZmZmZmY4MDYwMjA4NTAxMzUxMTE1NjEwY2MzNTc2MDAwODBmZDViNjAyMDg0MDEzNTg0MDE4NTYwMWY4MjAxMTI2MTBjZDk1NzYwMDA4MGZkNWI4MTgxMzUxMTE1NjEwY2VhNTc2MTBjZWE2MTBhYjc1NjViNjEwY2ZhNjAyMDgyMzU2MDA1MWIwMTYxMGIzYzU2NWI4MTM1ODA4MjUyNjAyMDgwODMwMTkyOTE2MDA1MWI4NDAxMDE4ODgxMTExNTYxMGQxOTU3NjAwMDgwZmQ1YjYwMjA4NDAxNWI4MTgxMTAxNTYxMGUzYTU3ODU4MTM1MTExNTYxMGQzNDU3NjAwMDgwZmQ1YjgwMzU4NTAxNjAxZjE5NjA0MDgyOGQwMzgyMDExMjE1NjEwZDRkNTc2MDAwODBmZDViNjEwZDU1NjEwYWY2NTY1YjYwMjA4MzAxMzU4MTUyODg2MDQwODQwMTM1MTExNTYxMGQ2ZDU3NjAwMDgwZmQ1YjYwNDA4MzAxMzU4MzAxOTI1MDYwYTA4Mjg0OGYwMzAxMTIxNTYxMGQ4ODU3NjAwMDgwZmQ1YjYxMGQ5MDYxMGIxOTU2NWI5MTUwNjEwZDlmNjAyMDg0MDEzNTYxMGJmYzU2NWI2MDIwODMwMTM1ODI1MjYxMGRiMzYwNDA4NDAxMzU2MTA5MDM1NjViNjA0MDgzMDEzNTYwMjA4MzAxNTI4ODYwNjA4NDAxMzUxMTE1NjEwZGNlNTc2MDAwODBmZDViNjEwZGUxOGQ2MDIwNjA2MDg2MDEzNTg2MDEwMTYxMGMzMjU2NWI2MDQwODMwMTUyODg2MDgwODQwMTM1MTExNTYxMGRmNzU3NjAwMDgwZmQ1YjYxMGUwYThkNjAyMDYwODA4NjAxMzU4NjAxMDE2MTBjMzI1NjViNjA2MDgzMDE1MjYxMGUxYjYwYTA4NDAxNjEwOTFiNTY1YjYwODA4MzAxNTI2MDIwODE4MTAxOTI5MDkyNTI4NjUyOTQ4NTAxOTQ5MTkwOTEwMTkwNTA2MTBkMWU1NjViNTA5NTk4OTA5NzUwOTU1MDUwNTA1MDUwNTA1NjViNjAwMDgwNjA0MDgzODUwMzEyMTU2MTBlNWM1NzYwMDA4MGZkNWI4MjM1NjEwZTY3ODE2MTA5MDM1NjViOTE1MDYwMjA4MzAxMzU2MTBlNzc4MTYxMDkwMzU2NWI4MDkxNTA1MDkyNTA5MjkwNTA1NjViODI4MTUyNjA4MDgxMDE2MTA5OTk2MDIwODMwMTg0ODA1MTYzZmZmZmZmZmY5MDgxMTY4MzUyNjAyMDgwODMwMTUxNjAwMTYwMDE2MGEwMWIwMzE2OTA4NDAxNTI2MDQwOTE4MjAxNTExNjkxMDE1MjU2NWI2MDAwODI1MTYxMGVjZTgxODQ2MDIwODcwMTYxMDljYzU2NWI5MTkwOTEwMTkyOTE1MDUwNTY1YjgwNTE2MDAzODE5MDBiODExNDYxMDkyNjU3NjAwMDgwZmQ1YjYwMDA2MDIwODI4NDAzMTIxNTYxMGVmYzU3NjAwMDgwZmQ1YjYxMDk5OTgyNjEwZWQ4NTY1YjgwNTE2MTA5MjY4MTYxMDkwMzU2NWI2MDAwODI2MDFmODMwMTEyNjEwZjIxNTc2MDAwODBmZDViODE1MTYxMGYyZjYxMGM1MTgyNjEwYzBhNTY1YjgxODE1Mjg0NjAyMDgzODYwMTAxMTExNTYxMGY0NDU3NjAwMDgwZmQ1YjYxMGFhZjgyNjAyMDgzMDE2MDIwODcwMTYxMDljYzU2NWI2MDAwODA2MDQwODM4NTAzMTIxNTYxMGY2ODU3NjAwMDgwZmQ1YjYxMGY3MTgzNjEwZWQ4NTY1YjkxNTA2MDIwODMwMTUxNjdmZmZmZmZmZmZmZmZmZmZmODA4MjExMTU2MTBmOGU1NzYwMDA4MGZkNWI5MDg0MDE5MDYwYTA4Mjg3MDMxMjE1NjEwZmEyNTc2MDAwODBmZDViNjEwZmFhNjEwYjE5NTY1YjgyNTE2MTBmYjU4MTYxMGJmYzU2NWI4MTUyNjAyMDgzMDE1MTYxMGZjNTgxNjEwOTAzNTY1YjYwMjA4MjAxNTI2MDQwODMwMTUxODI4MTExMTU2MTBmZGM1NzYwMDA4MGZkNWI2MTBmZTg=","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwtIN9syNYXDjyZ/pQFbsPwtwzC4Mj0gNkvp34Qd32T+KujRuSRPnx5XhTKrtGWIt5GgwIr5rbqgYQs/bJtAIiDwoJCPOZ26oGEIEPEgIYAiogw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5SAA=="},{"b64Body":"Cg8KCQj0mduqBhCHDxICGAISAhgDGNPltjEiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIBmAgSAxjRCCKQCDg4ODI4NjAxNjEwZjEwNTY1YjYwNDA4MzAxNTI1MDYwNjA4MzAxNTE4MjgxMTExNTYxMTAwMDU3NjAwMDgwZmQ1YjYxMTAwYzg4ODI4NjAxNjEwZjEwNTY1YjYwNjA4MzAxNTI1MDYxMTAxZTYwODA4NDAxNjEwZjA1NTY1YjYwODA4MjAxNTI4MDkzNTA1MDUwNTA5MjUwOTI5MDUwNTY1YjYwMDE2MDAxNjBhMDFiMDM4MzE2ODE1MjYwODA4MTAxNjEwOTk5NjAyMDgzMDE4NDgwNTE2M2ZmZmZmZmZmOTA4MTE2ODM1MjYwMjA4MDgzMDE1MTYwMDE2MDAxNjBhMDFiMDMxNjkwODQwMTUyNjA0MDkxODIwMTUxMTY5MTAxNTI1NjViNjAwMDYwNDA4MDgzMDE2MDAxNjAwMTYwYTAxYjAzODYxNjg0NTI2MDIwODI4MTg2MDE1MjgxODY1MTgwODQ1MjYwNjA4NzAxOTE1MDYwNjA4MTYwMDUxYjg4MDEwMTkzNTA4Mjg4MDE2MDAwNWI4MjgxMTAxNTYxMTBlOTU3ODg4NjAzNjA1ZjE5MDE4NDUyODE1MTgwNTE4NzUyODUwMTUxODU4NzAxODg5MDUyNjExMGQ2ODg4ODAxODI2MTBhMjg1NjViOTY1MDUwOTI4NDAxOTI5MDg0MDE5MDYwMDEwMTYxMTBhYTU2NWI1MDkzOTk5ODUwNTA1MDUwNTA1MDUwNTA1MDU2NWI2MDAwODA4Mjg0MDM2MDgwODExMjE1NjExMTBjNTc2MDAwODBmZDViNjExMTE1ODQ2MTBlZDg1NjViOTI1MDYwNjA2MDFmMTk4MjAxMTIxNTYxMTEyOTU3NjAwMDgwZmQ1YjUwNjExMTMyNjEwYWNkNTY1YjYwMjA4NDAxNTE2MTExNDA4MTYxMGI2ZDU2NWI4MTUyNjA0MDg0MDE1MTYxMTE1MDgxNjEwOTAzNTY1YjYwMjA4MjAxNTI2MDYwODQwMTUxNjEwYmVjODE2MTBiNmQ1NjViNjAwMDgwNjA0MDgzODUwMzEyMTU2MTExNzY1NzYwMDA4MGZkNWI2MTExN2Y4MzYxMGVkODU2NWI5MTUwNjAyMDgzMDE1MTYxMGU3NzgxNjEwYmZjNTY1YjYwMDA2MDIwODI4NDAzMTIxNTYxMTFhMTU3NjAwMDgwZmQ1YjgxNTE4MDYwMDcwYjgxMTQ2MTA5OTk1NzYwMDA4MGZkZmVhMjY0Njk3MDY2NzM1ODIyMTIyMDkxZDY1YzY1ZWVhOTljOWFhMTYwOGYxODEyODA3NDMzOWQ0OWI0NmQ5ZjY2YWY5MTA4ZmEwYzRlN2Q2MmQyYTU2NDczNmY2YzYzNDMwMDA4MGIwMDMz","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwMZ/r+M6XwAG/y0XIb6u54qwtsym+NA3Ud1aIr8Bcwz72rOdiK7i33fUAywxmzz/dGgsIsJrbqgYQi97XTCIPCgkI9JnbqgYQhw8SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQj0mduqBhCJDxICGAISAhgDGJb7rp0CIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo5CRQoDGNEIGiISIKPxJha8E6aPgW9bAVluOWDSsU1LYvFI5vRLR1UxvbySIJChD0IFCIDO2gNSAFoAagtjZWxsYXIgZG9vcg==","b64Record":"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"},{"b64Body":"Cg8KCQj1mduqBhCPDxICGAISAhgDGPrzvSwiAgh4MiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjoIDORoRCgMYzggSAxjLCBoDGNIIIAEaEQoDGM8IEgMYywgaAxjSCCABGhEKAxjQCBIDGMsIGgMY0gggAg==","b64Record":"CiAIFiocCgwIARAMGgYIgK6ZpA8SDAgBEA8aBgiArpmkDxIwHJScmXEZS7WWeh50pM+f/+YcEg1E42F89Xs+LM52V0AZ/RxaO9N/mpa8w6EgiYz9GgsIsZrbqgYQ28iBUSIPCgkI9ZnbqgYQjw8SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjlIA"},{"b64Body":"Cg8KCQj1mduqBhCRDxICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxjSCBCgjQYihAETqO1TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABE4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAESwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=","b64Record":"CiUIFiIDGNIIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDkCjJVBkM48yXDiksjOSa1Y+uhnnHFa9xkGgNBlGv9qOtx4XrBJ3ez3D7GyTJDGUsaDAixmtuqBhCb4f/BAiIPCgkI9ZnbqgYQkQ8SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCA19oCOp8FCgMY0ggigAIAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAQAAAAAAAAAAAAAAAAAAEAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAKIDxBDKQAwoDGM4IEoACAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAEAAAAAAAAAAAAAAAAAABAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAABog3fJSrRviyJtpwrBo/DeNqpUrp/FjxKEWKPVaTfUjs+8aIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARLGiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAETCIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFSFgoJCgIYAhD/rbUFCgkKAhhiEICutQU="},{"b64Body":"ChEKCQj1mduqBhCRDxICGAIgAXIbEhkKAxjOCBIHCgMYzAgQAhIJCgMYywgQARgB","b64Record":"CgIIFhIwxhAuDpi9ovosG0dMUBA0vNasVhK4hfyty4jh6UZwRg2uT0YOBRXKgRMtmchUblQYGgwIsZrbqgYQnOH/wQIiEQoJCPWZ26oGEJEPEgIYAiABOrsBCgMY5wISIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWKIrcAVD9wARihAEV2svqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABE4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAESwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFqAxjSCFISCgcKAxjKCBACCgcKAxjLCBABWhcKAxjOCBIHCgMYywgQARIHCgMYzAgQAmoMCAEaAxjKCCIDGMsIegwIsZrbqgYQm+H/wQI="},{"b64Body":"Cg8KCQj2mduqBhCTDxICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxjSCBCgjQYihAETqO1TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABE8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAESwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=","b64Record":"CiUIFiIDGNIIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjAw4hwQrlVEcnVMLSO/IuAZF9ozynIC5V3nJ5XZX9IzOrRJOS73hMI0FgPprfETWqAaCwiymtuqBhCDlohqIg8KCQj2mduqBhCTDxICGAIqIMODwq7DgsK3w4PCuXRGOMOCwq5Kw4PCi8ODwpDDg8KOMIDX2gI6nwUKAxjSCCKAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAgAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAAAAAAABAAAAAAAAAAAAAAAAAAAQAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAogPEEMpADCgMYzwgSgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAIAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAAAAAAAAQAAAAAAAAAAAAAAAAAAEAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiDd8lKtG+LIm2nCsGj8N42qlSun8WPEoRYo9VpN9SOz7xogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEsaIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARMIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVIWCgkKAhgCEP+ttQUKCQoCGGIQgK61BQ=="},{"b64Body":"ChEKCQj2mduqBhCTDxICGAIgAXIbEhkKAxjPCBIHCgMYzAgQAhIJCgMYywgQARgB","b64Record":"CgIIFhIw27JrtEYvft5T2hoZRAr/lNIM1Ak1iIUohEmwhUbageKw0qQAL/o/dDyKf4fsjXdfGgsIsprbqgYQhJaIaiIRCgkI9pnbqgYQkw8SAhgCIAE6uwEKAxjnAhIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYoitwBUP3ABGKEARXay+oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAETwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWoDGNIIUgBaFwoDGM0IEgcKAxjKCBACEgcKAxjLCBABWhcKAxjPCBIHCgMYywgQARIHCgMYzAgQAmoRCAESAxjNCBoDGMoIIgMYywh6CwiymtuqBhCDlohq"},{"b64Body":"Cg8KCQj2mduqBhCVDxICGAISAhgDIgIIeDIgw4PCrsOCwrfDg8K5dEY4w4LCrkrDg8KLw4PCkMODwo46kAEKAxjSCBCgjQYihAETqO1TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAESwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=","b64Record":"CiUIFiIDGNIIKhwKDAgBEAwaBgiArpmkDxIMCAEQDxoGCICumaQPEjDD6Xp+XUl2z7DLUPk86cXwmwmEq6v1KFrjuiR94vBkC5ZKHxwpaxbfYqo8TcxOGFIaDAiymtuqBhDT55DaAiIPCgkI9pnbqgYQlQ8SAhgCKiDDg8Kuw4LCt8ODwrl0RjjDgsKuSsODwovDg8KQw4PCjjCA19oCOp8FCgMY0ggigAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAABAAAAAAAAQAAAAAAAAAAAAAAAAAAEAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKIDxBDKQAwoDGNAIEoACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAQAAAAAAAEAAAAAAAAAAAAAAAAAABAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABog3fJSrRviyJtpwrBo/DeNqpUrp/FjxKEWKPVaTfUjs+8aIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARLGiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAETCIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFSFgoJCgIYAhD/rbUFCgkKAhhiEICutQU="},{"b64Body":"ChEKCQj2mduqBhCVDxICGAIgAXIbEhkKAxjQCBIHCgMYzAgQAhIJCgMYywgQARgB","b64Record":"CgIIFhIwb3hXQzXbRa6aa3n1JS2BsAnm5ZsoFqvSA2gDpV/nTptgFeXzLQ0QucOx/GDcXEOKGgwIsprbqgYQ1OeQ2gIiEQoJCPaZ26oGEJUPEgIYAiABOrsBCgMY5wISIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWKIrcAVD9wARihAEV2svqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAESwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFqAxjSCFIAWhcKAxjQCBIHCgMYyggQAhIHCgMYywgQAWoRCAESAxjQCBoDGMoIIgMYzAh6DAiymtuqBhDT55DaAg=="}]}}} \ No newline at end of file diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/assertions/ContractFnResultAsserts.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/assertions/ContractFnResultAsserts.java index c787bef8e599..160fb46516c6 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/assertions/ContractFnResultAsserts.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/assertions/ContractFnResultAsserts.java @@ -19,6 +19,7 @@ import static com.hedera.services.bdd.spec.queries.QueryVerbs.getContractInfo; import static com.hedera.services.bdd.suites.contract.Utils.FunctionType.FUNCTION; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import com.esaulpaugh.headlong.abi.Address; import com.google.protobuf.ByteString; @@ -32,6 +33,7 @@ import com.hederahashgraph.api.proto.java.ContractID; import com.hederahashgraph.api.proto.java.ContractLoginfo; import com.swirlds.common.utility.CommonUtils; +import edu.umd.cs.findbugs.annotations.NonNull; import java.math.BigInteger; import java.util.Arrays; import java.util.HashMap; @@ -91,8 +93,7 @@ public static Function>> isOneO return ignore -> actualObjs -> { try { assertEquals(1, actualObjs.length, "Expected a single object"); - Assertions.assertTrue( - values.contains(actualObjs[0]), "Expected one of " + values + " but was " + actualObjs[0]); + assertTrue(values.contains(actualObjs[0]), "Expected one of " + values + " but was " + actualObjs[0]); } catch (Exception e) { return Optional.of(e); } @@ -141,7 +142,7 @@ private static Optional validateRandomResult(final Object[] expecteds // reject all zero result as not random Assertions.assertFalse(Arrays.equals(new byte[expectedLength], (byte[]) actual)); } else if (expected instanceof Integer expectedInt) { - Assertions.assertTrue(((BigInteger) actual).intValue() >= 0 + assertTrue(((BigInteger) actual).intValue() >= 0 && ((BigInteger) actual).intValue() < expectedInt.intValue()); } else { throw new Exception( // NOSONAR @@ -199,7 +200,7 @@ public ContractFnResultAsserts hexedEvmAddress(String expected) { public ContractFnResultAsserts evmAddress(ByteString expected) { registerProvider((spec, o) -> { final var result = (ContractFunctionResult) o; - Assertions.assertTrue(result.hasEvmAddress(), "Missing EVM address, expected " + expected); + assertTrue(result.hasEvmAddress(), "Missing EVM address, expected " + expected); final var actual = result.getEvmAddress().getValue(); assertEquals(expected, actual, "Bad EVM address"); }); @@ -212,7 +213,7 @@ public ContractFnResultAsserts create1EvmAddress(final ByteString senderAddress, final var expectedContractAddress = org.hyperledger.besu.datatypes.Address.contractAddress( org.hyperledger.besu.datatypes.Address.wrap(Bytes.wrap(senderAddress.toByteArray())), nonce); final var expectedAddress = ByteString.copyFrom(expectedContractAddress.toArray()); - Assertions.assertTrue(result.hasEvmAddress(), "Missing EVM address, expected " + expectedAddress); + assertTrue(result.hasEvmAddress(), "Missing EVM address, expected " + expectedAddress); final var actual = result.getEvmAddress().getValue(); assertEquals(expectedAddress, actual, "Bad EVM address"); }); @@ -267,6 +268,22 @@ public ContractFnResultAsserts contractCallResult(ContractCallResult contractCal return this; } + public ContractFnResultAsserts contractCallResultFrom(@NonNull final ContractCallResult... contractCallResults) { + registerProvider((spec, o) -> { + ContractFunctionResult result = (ContractFunctionResult) o; + final var actual = result.getContractCallResult(); + var someMatch = false; + for (final var expected : contractCallResults) { + if (ByteString.copyFrom(expected.getBytes().toArrayUnsafe()).equals(actual)) { + someMatch = true; + break; + } + } + assertTrue(someMatch, "Contract call result matched none of the expected values"); + }); + return this; + } + public ContractFnResultAsserts gas(long gas) { registerProvider((spec, o) -> { ContractFunctionResult result = (ContractFunctionResult) o; diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/assertions/TransactionRecordAsserts.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/assertions/TransactionRecordAsserts.java index 5c5491f01ca8..b222cce24025 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/assertions/TransactionRecordAsserts.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/assertions/TransactionRecordAsserts.java @@ -37,6 +37,7 @@ import com.hederahashgraph.api.proto.java.TransactionID; import com.hederahashgraph.api.proto.java.TransactionReceipt; import com.hederahashgraph.api.proto.java.TransactionRecord; +import edu.umd.cs.findbugs.annotations.NonNull; import java.lang.reflect.Method; import java.util.Collections; import java.util.List; @@ -44,6 +45,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Assertions; +import org.opentest4j.AssertionFailedError; public class TransactionRecordAsserts extends BaseErroringAssertsProvider { @@ -180,6 +182,24 @@ public TransactionRecordAsserts assessedCustomFeeCount(final int n) { return this; } + public TransactionRecordAsserts statusFrom(@NonNull final ResponseCodeEnum... expectedStatuses) { + this.registerTypedProvider(RECEIPT, spec -> receipt -> { + final var actual = receipt.getStatus(); + try { + for (final var expected : expectedStatuses) { + if (actual == expected) { + return Collections.emptyList(); + } + } + throw new AssertionFailedError( + "Expected status in " + List.of(expectedStatuses) + " but was " + actual); + } catch (Throwable t) { + return List.of(t); + } + }); + return this; + } + public TransactionRecordAsserts status(ResponseCodeEnum expectedStatus) { this.registerTypedProvider(RECEIPT, spec -> receipt -> { try { diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/utilops/records/SnapshotMatchMode.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/utilops/records/SnapshotMatchMode.java index 03cea1c9b4b5..4209d8e58094 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/utilops/records/SnapshotMatchMode.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/utilops/records/SnapshotMatchMode.java @@ -20,6 +20,10 @@ * Enumerates non-default matching modes in which {@link SnapshotModeOp} fuzzy-matching can be run. */ public enum SnapshotMatchMode { + /** + * Allows for gas calculations to differ from the snapshot. + */ + ACCEPTED_MONO_GAS_CALCULATION_DIFFERENCE, /** * Allows for non-deterministic contract call results. */ diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/utilops/records/SnapshotModeOp.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/utilops/records/SnapshotModeOp.java index 9c17e5b13a5f..66e48c818527 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/utilops/records/SnapshotModeOp.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/utilops/records/SnapshotModeOp.java @@ -21,6 +21,7 @@ import static com.hedera.services.bdd.spec.queries.QueryVerbs.getTxnRecord; import static com.hedera.services.bdd.spec.transactions.TxnVerbs.cryptoCreate; import static com.hedera.services.bdd.spec.utilops.CustomSpecAssert.allRunFor; +import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.ACCEPTED_MONO_GAS_CALCULATION_DIFFERENCE; import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.ALLOW_SKIPPED_ENTITY_IDS; import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.EXPECT_STREAMLINED_INGEST_RECORDS; import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.FULLY_NONDETERMINISTIC; @@ -34,6 +35,7 @@ import static java.util.stream.Collectors.toSet; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.protobuf.ByteString; import com.google.protobuf.Descriptors; import com.google.protobuf.GeneratedMessageV3; import com.hedera.services.bdd.junit.HapiTestEnv; @@ -169,8 +171,8 @@ public class SnapshotModeOp extends UtilOp implements SnapshotOp { public static void main(String... args) throws IOException { // Helper to review the snapshot saved for a particular HapiSuite-HapiSpec combination - final var snapshotFileMeta = new SnapshotFileMeta( - "HollowAccountFinalization", "txnWith2CompletionsAndAnother2PrecedingChildRecords"); + final var snapshotFileMeta = + new SnapshotFileMeta("CryptoTransferHTS", "hapiTransferFromForFungibleTokenToSystemAccountsFails"); final var maybeSnapshot = suiteSnapshotsFrom( resourceLocOf(PROJECT_ROOT_SNAPSHOT_RESOURCES_LOC, snapshotFileMeta.suiteName())) .flatMap( @@ -179,16 +181,7 @@ public static void main(String... args) throws IOException { throw new IllegalStateException("No such snapshot"); } final var snapshot = maybeSnapshot.get(); - final var items = snapshot.parsedItems(); - try (var dumpLoc = Files.newBufferedWriter(Paths.get(snapshotFileMeta + ".txt"))) { - for (int i = 0, n = items.size(); i < n; i++) { - final var item = items.get(i); - dumpLoc.write("--- Item #" + i + " ---\n"); - dumpLoc.write(item.itemBody() + "\n\n"); - dumpLoc.write("➡️\n\n"); - dumpLoc.write(item.itemRecord() + "\n\n"); - } - } + writeReadableItemsToTxt(snapshotFileMeta.toString(), snapshot.parsedItems()); } /** @@ -342,6 +335,15 @@ private void fuzzyMatchAgainstSnapshot(@NonNull final List postPlace final var itemsFromSnapshot = snapshotToMatchAgainst.parsedItems(); final var minItems = Math.min(postPlaceholderItems.size(), itemsFromSnapshot.size()); final var snapshotPlaceholderNum = snapshotToMatchAgainst.getPlaceholderNum(); + if (postPlaceholderItems.size() != itemsFromSnapshot.size()) { + log.warn( + "Mismatched item counts between snapshot and post-placeholder records - " + + "snapshot had {} items, but post-placeholder had {} items", + itemsFromSnapshot.size(), + postPlaceholderItems.size()); + writeReadableItemsToTxt("expected", itemsFromSnapshot); + writeReadableItemsToTxt("actual", postPlaceholderItems); + } for (int i = 0; i < minItems; i++) { final var fromSnapshot = itemsFromSnapshot.get(i); final var fromStream = postPlaceholderItems.get(i); @@ -419,9 +421,11 @@ private void fuzzyMatch( "Mismatched field names ('" + expectedName + "' vs '" + actualName + "' between expected " + expectedMessage + " and " + actualMessage + " - " + mismatchContext.get()); } - if (shouldSkip(expectedName)) { + if (shouldSkip(expectedName, expectedField.getValue().getClass())) { + // System.out.println("YES"); continue; } + // System.out.println("NO"); matchValues( expectedName, expectedField.getValue(), @@ -560,7 +564,6 @@ private void matchSingleValues( // Transaction fees can vary by based on the size of the sig map final var maxVariation = feeVariation(matchModes); if ("transactionFee".equals(fieldName)) { - ; Assertions.assertTrue( Math.abs((long) expected - (long) actual) <= maxVariation, "Transaction fees '" + expected + "' and '" + actual @@ -689,15 +692,6 @@ private static Optional suiteSnapshotsFrom(@NonNull final Path p return Optional.empty(); } - private static RecordSnapshot loadSnapshotFor( - @NonNull final String snapshotLoc, @NonNull final SnapshotFileMeta snapshotFileMeta) throws IOException { - final var om = new ObjectMapper(); - final var inputLoc = resourceLocOf(snapshotLoc, snapshotFileMeta.suiteName()); - final var fin = Files.newInputStream(inputLoc); - log.info("Loading snapshot of {} post-placeholder records from {}", snapshotFileMeta.specName(), inputLoc); - return om.reader().readValue(fin, RecordSnapshot.class); - } - private void computePlaceholderNum( @NonNull final List recordLocs, @NonNull final String snapshotLoc, @NonNull final HapiSpec spec) { this.recordLocs = recordLocs; @@ -731,14 +725,38 @@ private List hapiTestStreamLocs() { return locs; } - private boolean shouldSkip(@NonNull final String expectedName) { + private boolean shouldSkip(@NonNull final String expectedName, @NonNull final Class expectedType) { requireNonNull(expectedName); - if ("contractCallResult".equals(expectedName)) { + requireNonNull(expectedType); + // System.out.println("Should skip? " + expectedName + " " + expectedType); + if ("contractCallResult".equals(expectedName) && ByteString.class.isAssignableFrom(expectedType)) { + // if ("contractCallResult".equals(expectedName) && ByteString.class.equals(expectedType)) { return matchModes.contains(NONDETERMINISTIC_CONTRACT_CALL_RESULTS); } else if ("functionParameters".equals(expectedName)) { return matchModes.contains(NONDETERMINISTIC_FUNCTION_PARAMETERS); + } else if ("topic".equals(expectedName)) { + // It is unlikely we have _any_ tests with nondeterministic logs but deterministic + // call results, so we just use the same match mode for both + return matchModes.contains(NONDETERMINISTIC_CONTRACT_CALL_RESULTS); + } else if ("gas".equals(expectedName) || "gasUsed".equals(expectedName)) { + return matchModes.contains(ACCEPTED_MONO_GAS_CALCULATION_DIFFERENCE); } else { return FIELDS_TO_SKIP_IN_FUZZY_MATCH.contains(expectedName); } } + + private static void writeReadableItemsToTxt(@NonNull final String name, @NonNull final List items) { + try (final var fout = Files.newBufferedWriter(Paths.get(name + ".txt"))) { + for (int i = 0, n = items.size(); i < n; i++) { + final var item = items.get(i); + fout.write("--- Item #" + i + " ---\n"); + fout.write(item.itemBody() + "\n\n"); + fout.write("➡️\n\n"); + fout.write(item.itemRecord() + "\n\n"); + } + } catch (IOException e) { + log.error("Could not write readable items to txt", e); + throw new UncheckedIOException(e); + } + } } diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractDeleteSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractDeleteSuite.java index 590ea33d0ef1..311c1b475ef4 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractDeleteSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/hapi/ContractDeleteSuite.java @@ -157,6 +157,7 @@ private HapiSpec cannotUseMoreThanChildContractLimit() { .hasChildRecords()); } + @HapiTest private HapiSpec cannotSendValueToTokenAccount() { final var multiKey = "multiKey"; final var nonFungibleToken = "NFT"; diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/AssociatePrecompileSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/AssociatePrecompileSuite.java index 6494c0e1b88a..52337dd4d20f 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/AssociatePrecompileSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/AssociatePrecompileSuite.java @@ -162,6 +162,7 @@ private HapiSpec nonSupportedAbiCallGracefullyFailsWithinSingleContractCall() { } /* -- HSCS-PREC-26 from HTS Precompile Test Plan -- */ + @HapiTest private HapiSpec nonSupportedAbiCallGracefullyFailsWithMultipleContractCalls() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference vanillaTokenID = new AtomicReference<>(); @@ -210,6 +211,7 @@ private HapiSpec nonSupportedAbiCallGracefullyFailsWithMultipleContractCalls() { } /* -- HSCS-PREC-27 from HTS Precompile Test Plan -- */ + @HapiTest private HapiSpec invalidlyFormattedAbiCallGracefullyFailsWithMultipleContractCalls() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference vanillaTokenID = new AtomicReference<>(); diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractKeysHTSSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractKeysHTSSuite.java index ca5c6d63f581..28d852110178 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractKeysHTSSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractKeysHTSSuite.java @@ -70,6 +70,7 @@ import static com.hederahashgraph.api.proto.java.TokenType.NON_FUNGIBLE_UNIQUE; import com.hedera.node.app.hapi.utils.contracts.ParsingConstants.FunctionType; +import com.hedera.services.bdd.junit.HapiTest; import com.hedera.services.bdd.junit.HapiTestSuite; import com.hedera.services.bdd.spec.HapiSpec; import com.hedera.services.bdd.spec.assertions.NonFungibleTransfers; @@ -216,6 +217,7 @@ List hscsKey6() { return List.of(burnWithKeyAsPartOf1OfXThreshold()); } + @HapiTest private HapiSpec burnWithKeyAsPartOf1OfXThreshold() { final var delegateContractKeyShape = KeyShape.threshOf(1, SIMPLE, DELEGATE_CONTRACT); final var contractKeyShape = KeyShape.threshOf(1, SIMPLE, KeyShape.CONTRACT); @@ -278,6 +280,7 @@ private HapiSpec burnWithKeyAsPartOf1OfXThreshold() { .including(TOKEN_USAGE, TOKEN_TREASURY, -1)))); } + @HapiTest private HapiSpec delegateCallForBurnWithContractKey() { final AtomicReference vanillaTokenTokenID = new AtomicReference<>(); @@ -325,6 +328,7 @@ OUTER_CONTRACT, asHeadlongAddress(getNestedContractAddress(NESTED_CONTRACT, spec getAccountBalance(TOKEN_TREASURY).hasTokenBalance(VANILLA_TOKEN, 2)); } + @HapiTest private HapiSpec delegateCallForMintWithContractKey() { final AtomicReference vanillaTokenTokenID = new AtomicReference<>(); @@ -370,6 +374,7 @@ OUTER_CONTRACT, asHeadlongAddress(getNestedContractAddress(NESTED_CONTRACT, spec getAccountBalance(TOKEN_TREASURY).hasTokenBalance(VANILLA_TOKEN, 50)); } + @HapiTest private HapiSpec staticCallForDissociatePrecompileFails() { final var outerContract = NESTED_ASSOCIATE_DISSOCIATE; final var nestedContract = ASSOCIATE_DISSOCIATE_CONTRACT; @@ -405,6 +410,7 @@ outerContract, asHeadlongAddress(getNestedContractAddress(nestedContract, spec)) getAccountInfo(ACCOUNT).hasToken(relationshipWith(VANILLA_TOKEN))); } + @HapiTest private HapiSpec staticCallForTransferWithContractKey() { final var outerContract = STATIC_CONTRACT; final AtomicReference accountID = new AtomicReference<>(); @@ -452,6 +458,7 @@ outerContract, asHeadlongAddress(getNestedContractAddress(NESTED_CONTRACT, spec) .then(emptyChildRecordsCheck("staticTransferCallWithContractKeyTxn", CONTRACT_REVERT_EXECUTED)); } + @HapiTest private HapiSpec staticCallForBurnWithContractKey() { final var outerContract = STATIC_CONTRACT; final AtomicReference vanillaTokenTokenID = new AtomicReference<>(); @@ -490,6 +497,7 @@ outerContract, asHeadlongAddress(getNestedContractAddress(NESTED_CONTRACT, spec) .then(emptyChildRecordsCheck(STATIC_BURN_CALL_WITH_CONTRACT_KEY_TXN, CONTRACT_REVERT_EXECUTED)); } + @HapiTest private HapiSpec staticCallForMintWithContractKey() { final var outerContract = STATIC_CONTRACT; final AtomicReference vanillaTokenTokenID = new AtomicReference<>(); @@ -525,6 +533,7 @@ outerContract, asHeadlongAddress(getNestedContractAddress(NESTED_CONTRACT, spec) .then(emptyChildRecordsCheck(STATIC_BURN_CALL_WITH_CONTRACT_KEY_TXN, CONTRACT_REVERT_EXECUTED)); } + @HapiTest private HapiSpec staticCallForTransferWithDelegateContractKey() { final var outerContract = STATIC_CONTRACT; final AtomicReference accountID = new AtomicReference<>(); @@ -573,6 +582,7 @@ outerContract, asHeadlongAddress(getNestedContractAddress(NESTED_CONTRACT, spec) .then(emptyChildRecordsCheck("staticTransferCallWithDelegateContractKeyTxn", CONTRACT_REVERT_EXECUTED)); } + @HapiTest private HapiSpec staticCallForBurnWithDelegateContractKey() { final var outerContract = STATIC_CONTRACT; final AtomicReference vanillaTokenTokenID = new AtomicReference<>(); @@ -613,6 +623,7 @@ outerContract, asHeadlongAddress(getNestedContractAddress(NESTED_CONTRACT, spec) STATIC_BURN_CALL_WITH_DELEGATE_CONTRACT_KEY_TXN, CONTRACT_REVERT_EXECUTED)); } + @HapiTest private HapiSpec staticCallForMintWithDelegateContractKey() { final var outerContract = STATIC_CONTRACT; final AtomicReference vanillaTokenTokenID = new AtomicReference<>(); @@ -650,6 +661,7 @@ outerContract, asHeadlongAddress(getNestedContractAddress(NESTED_CONTRACT, spec) STATIC_BURN_CALL_WITH_DELEGATE_CONTRACT_KEY_TXN, CONTRACT_REVERT_EXECUTED)); } + @HapiTest private HapiSpec staticCallForAssociatePrecompileFails() { final var outerContract = NESTED_ASSOCIATE_DISSOCIATE; final var nestedContract = ASSOCIATE_DISSOCIATE_CONTRACT; @@ -687,6 +699,7 @@ outerContract, asHeadlongAddress(getNestedContractAddress(nestedContract, spec)) getAccountInfo(ACCOUNT).hasNoTokenRelationship(VANILLA_TOKEN)); } + @HapiTest private HapiSpec callForMintWithContractKey() { final var firstMintTxn = "firstMintTxn"; final var amount = 10L; @@ -740,6 +753,7 @@ private HapiSpec callForMintWithContractKey() { getAccountBalance(TOKEN_TREASURY).hasTokenBalance(TYPE_OF_TOKEN, amount)); } + @HapiTest private HapiSpec callForMintWithDelegateContractKey() { final var firstMintTxn = "firstMintTxn"; final var amount = 10L; @@ -793,6 +807,7 @@ private HapiSpec callForMintWithDelegateContractKey() { getAccountBalance(TOKEN_TREASURY).hasTokenBalance(TYPE_OF_TOKEN, amount)); } + @HapiTest private HapiSpec callForTransferWithContractKey() { return defaultHapiSpec("callForTransferWithContractKey") .given( @@ -851,6 +866,7 @@ private HapiSpec callForTransferWithContractKey() { .including(NFT, ACCOUNT, RECEIVER, 1L)))); } + @HapiTest private HapiSpec callForTransferWithDelegateContractKey() { return defaultHapiSpec("callForTransferWithDelegateContractKey") .given( @@ -909,6 +925,7 @@ private HapiSpec callForTransferWithDelegateContractKey() { .including(NFT, ACCOUNT, RECEIVER, 1L)))); } + @HapiTest private HapiSpec callForAssociateWithDelegateContractKey() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference vanillaTokenID = new AtomicReference<>(); @@ -949,6 +966,7 @@ private HapiSpec callForAssociateWithDelegateContractKey() { getAccountInfo(ACCOUNT).hasToken(relationshipWith(VANILLA_TOKEN))); } + @HapiTest private HapiSpec callForAssociateWithContractKey() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference vanillaTokenID = new AtomicReference<>(); @@ -989,6 +1007,7 @@ private HapiSpec callForAssociateWithContractKey() { getAccountInfo(ACCOUNT).hasToken(relationshipWith(VANILLA_TOKEN))); } + @HapiTest public HapiSpec callForDissociateWithDelegateContractKey() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference treasuryID = new AtomicReference<>(); @@ -1053,6 +1072,7 @@ public HapiSpec callForDissociateWithDelegateContractKey() { getAccountInfo(ACCOUNT).hasNoTokenRelationship(VANILLA_TOKEN)); } + @HapiTest public HapiSpec callForDissociateWithContractKey() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference treasuryID = new AtomicReference<>(); @@ -1117,6 +1137,7 @@ public HapiSpec callForDissociateWithContractKey() { getAccountInfo(ACCOUNT).hasNoTokenRelationship(VANILLA_TOKEN)); } + @HapiTest private HapiSpec callForBurnWithDelegateContractKey() { return defaultHapiSpec("callForBurnWithDelegateContractKey") .given( @@ -1158,6 +1179,7 @@ private HapiSpec callForBurnWithDelegateContractKey() { .then(getAccountBalance(TOKEN_TREASURY).hasTokenBalance(TOKEN_USAGE, 49)); } + @HapiTest private HapiSpec delegateCallForAssociatePrecompileSignedWithDelegateContractKeyWorks() { final var outerContract = NESTED_ASSOCIATE_DISSOCIATE; final var nestedContract = ASSOCIATE_DISSOCIATE_CONTRACT; @@ -1202,6 +1224,7 @@ outerContract, asHeadlongAddress(getNestedContractAddress(nestedContract, spec)) getAccountInfo(ACCOUNT).hasToken(relationshipWith(VANILLA_TOKEN))); } + @HapiTest private HapiSpec delegateCallForDissociatePrecompileSignedWithDelegateContractKeyWorks() { final var outerContract = NESTED_ASSOCIATE_DISSOCIATE; final var nestedContract = ASSOCIATE_DISSOCIATE_CONTRACT; @@ -1247,6 +1270,7 @@ outerContract, asHeadlongAddress(getNestedContractAddress(nestedContract, spec)) getAccountInfo(ACCOUNT).hasNoTokenRelationship(VANILLA_TOKEN)); } + @HapiTest private HapiSpec associatePrecompileWithDelegateContractKeyForNonFungibleWithKYC() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference kycTokenID = new AtomicReference<>(); @@ -1326,6 +1350,7 @@ private HapiSpec associatePrecompileWithDelegateContractKeyForNonFungibleWithKYC .hasToken(relationshipWith(KYC_TOKEN).kyc(Revoked))); } + @HapiTest public HapiSpec dissociatePrecompileWithDelegateContractKeyForFungibleVanilla() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference treasuryID = new AtomicReference<>(); @@ -1423,6 +1448,7 @@ public HapiSpec dissociatePrecompileWithDelegateContractKeyForFungibleVanilla() getAccountInfo(ACCOUNT).hasNoTokenRelationship(VANILLA_TOKEN)); } + @HapiTest public HapiSpec dissociatePrecompileWithDelegateContractKeyForFungibleFrozen() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference treasuryID = new AtomicReference<>(); @@ -1486,6 +1512,7 @@ public HapiSpec dissociatePrecompileWithDelegateContractKeyForFungibleFrozen() { getAccountInfo(ACCOUNT).hasNoTokenRelationship(FROZEN_TOKEN)); } + @HapiTest public HapiSpec dissociatePrecompileWithDelegateContractKeyForFungibleWithKYC() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference treasuryID = new AtomicReference<>(); @@ -1547,6 +1574,7 @@ public HapiSpec dissociatePrecompileWithDelegateContractKeyForFungibleWithKYC() getAccountInfo(ACCOUNT).hasNoTokenRelationship(KYC_TOKEN)); } + @HapiTest public HapiSpec dissociatePrecompileWithDelegateContractKeyForNonFungibleVanilla() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference treasuryID = new AtomicReference<>(); @@ -1647,6 +1675,7 @@ public HapiSpec dissociatePrecompileWithDelegateContractKeyForNonFungibleVanilla getAccountInfo(ACCOUNT).hasNoTokenRelationship(VANILLA_TOKEN)); } + @HapiTest public HapiSpec dissociatePrecompileWithDelegateContractKeyForNonFungibleFrozen() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference treasuryID = new AtomicReference<>(); @@ -1712,6 +1741,7 @@ public HapiSpec dissociatePrecompileWithDelegateContractKeyForNonFungibleFrozen( getAccountInfo(ACCOUNT).hasNoTokenRelationship(FROZEN_TOKEN)); } + @HapiTest public HapiSpec dissociatePrecompileWithDelegateContractKeyForNonFungibleWithKYC() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference treasuryID = new AtomicReference<>(); @@ -1775,6 +1805,7 @@ public HapiSpec dissociatePrecompileWithDelegateContractKeyForNonFungibleWithKYC getAccountInfo(ACCOUNT).hasNoTokenRelationship(KYC_TOKEN)); } + @HapiTest private HapiSpec associatePrecompileWithDelegateContractKeyForNonFungibleFrozen() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference frozenTokenID = new AtomicReference<>(); @@ -1855,6 +1886,7 @@ private HapiSpec associatePrecompileWithDelegateContractKeyForNonFungibleFrozen( .hasToken(relationshipWith(FROZEN_TOKEN).freeze(Frozen))); } + @HapiTest private HapiSpec associatePrecompileWithDelegateContractKeyForNonFungibleVanilla() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference vanillaTokenID = new AtomicReference<>(); @@ -1931,6 +1963,7 @@ private HapiSpec associatePrecompileWithDelegateContractKeyForNonFungibleVanilla getAccountInfo(ACCOUNT).hasToken(relationshipWith(VANILLA_TOKEN))); } + @HapiTest private HapiSpec associatePrecompileWithDelegateContractKeyForFungibleWithKYC() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference kycTokenID = new AtomicReference<>(); @@ -2008,6 +2041,7 @@ private HapiSpec associatePrecompileWithDelegateContractKeyForFungibleWithKYC() .hasToken(relationshipWith(KYC_TOKEN).kyc(Revoked))); } + @HapiTest private HapiSpec associatePrecompileWithDelegateContractKeyForFungibleFrozen() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference frozenTokenID = new AtomicReference<>(); @@ -2087,6 +2121,7 @@ private HapiSpec associatePrecompileWithDelegateContractKeyForFungibleFrozen() { .hasToken(relationshipWith(FROZEN_TOKEN).freeze(Frozen))); } + @HapiTest private HapiSpec associatePrecompileWithDelegateContractKeyForFungibleVanilla() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference vanillaTokenID = new AtomicReference<>(); @@ -2161,6 +2196,7 @@ private HapiSpec associatePrecompileWithDelegateContractKeyForFungibleVanilla() getAccountInfo(ACCOUNT).hasToken(relationshipWith(VANILLA_TOKEN))); } + @HapiTest private HapiSpec delegateCallForAssociatePrecompileSignedWithContractKeyFails() { final var outerContract = NESTED_ASSOCIATE_DISSOCIATE; final var nestedContract = ASSOCIATE_DISSOCIATE_CONTRACT; @@ -2204,6 +2240,7 @@ outerContract, asHeadlongAddress(getNestedContractAddress(nestedContract, spec)) getAccountInfo(ACCOUNT).hasNoTokenRelationship(VANILLA_TOKEN)); } + @HapiTest private HapiSpec delegateCallForDissociatePrecompileSignedWithContractKeyFails() { final var outerContract = NESTED_ASSOCIATE_DISSOCIATE; final var nestedContract = ASSOCIATE_DISSOCIATE_CONTRACT; @@ -2248,6 +2285,7 @@ outerContract, asHeadlongAddress(getNestedContractAddress(nestedContract, spec)) getAccountInfo(ACCOUNT).hasToken(relationshipWith(VANILLA_TOKEN))); } + @HapiTest private HapiSpec callForBurnWithContractKey() { return defaultHapiSpec("callForBurnWithContractKey") .given( diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractMintHTSSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractMintHTSSuite.java index e95d0518e03e..4d775e599fe6 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractMintHTSSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ContractMintHTSSuite.java @@ -50,6 +50,7 @@ import static com.hederahashgraph.api.proto.java.SubType.TOKEN_NON_FUNGIBLE_UNIQUE; import com.hedera.node.app.hapi.utils.contracts.ParsingConstants.FunctionType; +import com.hedera.services.bdd.junit.HapiTest; import com.hedera.services.bdd.junit.HapiTestSuite; import com.hedera.services.bdd.spec.HapiSpec; import com.hedera.services.bdd.spec.assertions.NonFungibleTransfers; @@ -109,6 +110,7 @@ List positiveSpecs() { return List.of(transferNftAfterNestedMint()); } + @HapiTest private HapiSpec transferNftAfterNestedMint() { final var nestedTransferTxn = "nestedTransferTxn"; @@ -207,6 +209,7 @@ private HapiSpec transferNftAfterNestedMint() { } @SuppressWarnings("java:S5669") + @HapiTest private HapiSpec rollbackOnFailedMintAfterFungibleTransfer() { final var failedMintTxn = "failedMintTxn"; diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/CreatePrecompileSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/CreatePrecompileSuite.java index 1c1ae342ec02..8d14b44d1ed6 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/CreatePrecompileSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/CreatePrecompileSuite.java @@ -41,6 +41,7 @@ import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_EXPIRATION_TIME; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.MISSING_TOKEN_SYMBOL; +import com.hedera.services.bdd.junit.HapiTest; import com.hedera.services.bdd.junit.HapiTestSuite; import com.hedera.services.bdd.spec.HapiSpec; import com.hedera.services.bdd.spec.assertions.ContractFnResultAsserts; @@ -120,6 +121,7 @@ List negativeSpecs() { } // TEST-007 & TEST-016 + // Should fail on insufficient value sent private HapiSpec tokenCreateWithEmptyKeysReverts() { return defaultHapiSpec("tokenCreateWithEmptyKeysReverts") .given( @@ -165,6 +167,7 @@ private HapiSpec tokenCreateWithEmptyKeysReverts() { } // TEST-008 + @HapiTest private HapiSpec tokenCreateWithKeyWithMultipleKeyValuesReverts() { return defaultHapiSpec("tokenCreateWithKeyWithMultipleKeyValuesReverts") .given( @@ -193,6 +196,7 @@ private HapiSpec tokenCreateWithKeyWithMultipleKeyValuesReverts() { } // TEST-009 + @HapiTest private HapiSpec tokenCreateWithFixedFeeWithMultiplePaymentsReverts() { return defaultHapiSpec("tokenCreateWithFixedFeeWithMultiplePaymentsReverts") .given( @@ -228,6 +232,7 @@ private HapiSpec tokenCreateWithFixedFeeWithMultiplePaymentsReverts() { } // TEST-010 & TEST-017 + // Should fail on insufficient value sent private HapiSpec createTokenWithEmptyTokenStruct() { return defaultHapiSpec("createTokenWithEmptyTokenStruct") .given(cryptoCreate(ACCOUNT).balance(ONE_MILLION_HBARS), uploadInitCode(TOKEN_CREATE_CONTRACT)) @@ -275,6 +280,7 @@ private HapiSpec createTokenWithEmptyTokenStruct() { } // TEST-011 + @HapiTest private HapiSpec createTokenWithInvalidExpiry() { return defaultHapiSpec("createTokenWithInvalidExpiry") .given( @@ -310,6 +316,7 @@ private HapiSpec createTokenWithInvalidExpiry() { } // TEST-013 + @HapiTest private HapiSpec createTokenWithInvalidTreasury() { return defaultHapiSpec("createTokenWithInvalidTreasury") .given( @@ -351,6 +358,7 @@ private HapiSpec createTokenWithInvalidTreasury() { } // TEST-018 + // Should fail on insufficient value sent private HapiSpec createTokenWithInsufficientValueSent() { return defaultHapiSpec("createTokenWithInsufficientValueSent") .given( @@ -409,6 +417,7 @@ private HapiSpec createTokenWithInsufficientValueSent() { } // TEST-020 + @HapiTest private HapiSpec delegateCallTokenCreateFails() { return defaultHapiSpec("delegateCallTokenCreateFails") .given( diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/CryptoTransferHTSSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/CryptoTransferHTSSuite.java index d2dafd5743f6..35f4bb9c4620 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/CryptoTransferHTSSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/CryptoTransferHTSSuite.java @@ -56,6 +56,10 @@ import static com.hedera.services.bdd.spec.utilops.UtilVerbs.tokenTransferList; import static com.hedera.services.bdd.spec.utilops.UtilVerbs.tokenTransferLists; import static com.hedera.services.bdd.spec.utilops.UtilVerbs.withOpContext; +import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.ACCEPTED_MONO_GAS_CALCULATION_DIFFERENCE; +import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.NONDETERMINISTIC_CONTRACT_CALL_RESULTS; +import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.NONDETERMINISTIC_FUNCTION_PARAMETERS; +import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.NONDETERMINISTIC_TRANSACTION_FEES; import static com.hedera.services.bdd.suites.contract.Utils.asAddress; import static com.hedera.services.bdd.suites.contract.Utils.eventSignatureOf; import static com.hedera.services.bdd.suites.contract.Utils.parsedToByteString; @@ -161,13 +165,17 @@ public List getSpecsInSuite() { hapiTransferFromForFungibleTokenWithCustomFeesWithBothApproveForAllAndAssignedSpender()); } + @HapiTest private HapiSpec hapiTransferFromForFungibleToken() { final var allowance = 10L; final var successfulTransferFromTxn = "txn"; final var successfulTransferFromTxn2 = "txn2"; final var revertingTransferFromTxn = "revertWhenMoreThanAllowance"; final var revertingTransferFromTxn2 = "revertingTxn"; - return defaultHapiSpec("hapiTransferFromForFungibleToken") + return defaultHapiSpec( + "hapiTransferFromForFungibleToken", + NONDETERMINISTIC_FUNCTION_PARAMETERS, + NONDETERMINISTIC_CONTRACT_CALL_RESULTS) .given( newKeyNamed(MULTI_KEY), cryptoCreate(OWNER).balance(100 * ONE_HUNDRED_HBARS).maxAutomaticTokenAssociations(5), @@ -340,6 +348,7 @@ private HapiSpec hapiTransferFromForFungibleToken() { .withStatus(SPENDER_DOES_NOT_HAVE_ALLOWANCE))))); } + @HapiTest private HapiSpec hapiTransferFromForFungibleTokenToSystemAccountsFails() { final var UPPER_BOUND_SYSTEM_ADDRESS = 750L; final var ADDRESS_ONE = 1L; @@ -349,7 +358,10 @@ private HapiSpec hapiTransferFromForFungibleTokenToSystemAccountsFails() { final var TXN_TO_UPPER_BOUND_ADDRESS = "TXN_TO_UPPER_BOUND_ADDRESS"; final var allowance = 10L; - return defaultHapiSpec("hapiTransferFromForFungibleTokenToSystemAccountsFails") + return defaultHapiSpec( + "hapiTransferFromForFungibleTokenToSystemAccountsFails", + NONDETERMINISTIC_FUNCTION_PARAMETERS, + NONDETERMINISTIC_CONTRACT_CALL_RESULTS) .given( newKeyNamed(MULTI_KEY), cryptoCreate(OWNER).balance(100 * ONE_HUNDRED_HBARS).maxAutomaticTokenAssociations(5), @@ -437,10 +449,15 @@ private HapiSpec hapiTransferFromForFungibleTokenToSystemAccountsFails() { recordWith().status(INVALID_RECEIVING_NODE_ACCOUNT))); } + @HapiTest private HapiSpec hapiTransferFromForNFT() { final var successfulTransferFromTxn = "txn"; final var revertingTransferFromTxn = "revertWhenMoreThanAllowance"; - return defaultHapiSpec("hapiTransferFromForNFT") + return defaultHapiSpec( + "hapiTransferFromForNFT", + NONDETERMINISTIC_FUNCTION_PARAMETERS, + NONDETERMINISTIC_CONTRACT_CALL_RESULTS, + NONDETERMINISTIC_TRANSACTION_FEES) .given( newKeyNamed(MULTI_KEY), cryptoCreate(OWNER).balance(100 * ONE_HUNDRED_HBARS).maxAutomaticTokenAssociations(5), @@ -532,13 +549,21 @@ private HapiSpec hapiTransferFromForNFT() { })); } + @HapiTest private HapiSpec repeatedTokenIdsAreAutomaticallyConsolidated() { final var repeatedIdsPrecompileXferTxn = "repeatedIdsPrecompileXfer"; final var senderStartBalance = 200L; final var receiverStartBalance = 0L; final var toSendEachTuple = 50L; - return defaultHapiSpec("RepeatedTokenIdsAreAutomaticallyConsolidated") + return defaultHapiSpec( + "RepeatedTokenIdsAreAutomaticallyConsolidated", + NONDETERMINISTIC_FUNCTION_PARAMETERS, + NONDETERMINISTIC_CONTRACT_CALL_RESULTS, + NONDETERMINISTIC_TRANSACTION_FEES, + // For some reason mono-service calculates gas based on the unconsolidated + // transfer lists, but we have no reason to keep doing that in mod-service + ACCEPTED_MONO_GAS_CALCULATION_DIFFERENCE) .given( cryptoCreate(SENDER).balance(10 * ONE_HUNDRED_HBARS), cryptoCreate(RECEIVER).balance(2 * ONE_HUNDRED_HBARS).receiverSigRequired(true), @@ -604,10 +629,15 @@ private HapiSpec repeatedTokenIdsAreAutomaticallyConsolidated() { .including(FUNGIBLE_TOKEN, RECEIVER, 2 * toSendEachTuple)))); } + @HapiTest private HapiSpec nonNestedCryptoTransferForFungibleTokenWithMultipleReceivers() { final var cryptoTransferTxn = CRYPTO_TRANSFER_TXN; - return defaultHapiSpec("NonNestedCryptoTransferForFungibleTokenWithMultipleReceivers") + return defaultHapiSpec( + "NonNestedCryptoTransferForFungibleTokenWithMultipleReceivers", + NONDETERMINISTIC_FUNCTION_PARAMETERS, + NONDETERMINISTIC_CONTRACT_CALL_RESULTS, + NONDETERMINISTIC_TRANSACTION_FEES) .given( cryptoCreate(SENDER).balance(10 * ONE_HUNDRED_HBARS), cryptoCreate(RECEIVER).balance(2 * ONE_HUNDRED_HBARS).receiverSigRequired(true), @@ -672,10 +702,15 @@ private HapiSpec nonNestedCryptoTransferForFungibleTokenWithMultipleReceivers() .including(FUNGIBLE_TOKEN, RECEIVER2, 20)))); } + @HapiTest private HapiSpec nonNestedCryptoTransferForNonFungibleToken() { final var cryptoTransferTxn = CRYPTO_TRANSFER_TXN; - return defaultHapiSpec("NonNestedCryptoTransferForNonFungibleToken") + return defaultHapiSpec( + "NonNestedCryptoTransferForNonFungibleToken", + NONDETERMINISTIC_FUNCTION_PARAMETERS, + NONDETERMINISTIC_CONTRACT_CALL_RESULTS, + NONDETERMINISTIC_TRANSACTION_FEES) .given( newKeyNamed(MULTI_KEY), cryptoCreate(SENDER).balance(10 * ONE_HUNDRED_HBARS), @@ -737,10 +772,15 @@ private HapiSpec nonNestedCryptoTransferForNonFungibleToken() { .including(NFT_TOKEN, SENDER, RECEIVER, 1L)))); } + @HapiTest private HapiSpec nonNestedCryptoTransferForMultipleNonFungibleTokens() { final var cryptoTransferTxn = CRYPTO_TRANSFER_TXN; - return defaultHapiSpec("NonNestedCryptoTransferForMultipleNonFungibleTokens") + return defaultHapiSpec( + "NonNestedCryptoTransferForMultipleNonFungibleTokens", + NONDETERMINISTIC_FUNCTION_PARAMETERS, + NONDETERMINISTIC_CONTRACT_CALL_RESULTS, + NONDETERMINISTIC_TRANSACTION_FEES) .given( newKeyNamed(MULTI_KEY), cryptoCreate(SENDER).balance(10 * ONE_HUNDRED_HBARS), @@ -819,10 +859,14 @@ private HapiSpec nonNestedCryptoTransferForMultipleNonFungibleTokens() { .including(NFT_TOKEN, SENDER2, RECEIVER2, 2L)))); } + @HapiTest private HapiSpec nonNestedCryptoTransferForFungibleAndNonFungibleToken() { final var cryptoTransferTxn = CRYPTO_TRANSFER_TXN; - return defaultHapiSpec("NonNestedCryptoTransferForFungibleAndNonFungibleToken") + return defaultHapiSpec( + "NonNestedCryptoTransferForFungibleAndNonFungibleToken", + NONDETERMINISTIC_FUNCTION_PARAMETERS, + NONDETERMINISTIC_CONTRACT_CALL_RESULTS) .given( newKeyNamed(MULTI_KEY), cryptoCreate(SENDER).balance(10 * ONE_HUNDRED_HBARS), @@ -922,11 +966,14 @@ private HapiSpec nonNestedCryptoTransferForFungibleAndNonFungibleToken() { .including(NFT_TOKEN, SENDER2, RECEIVER2, 1L)))); } + @HapiTest private HapiSpec nonNestedCryptoTransferForFungibleTokenWithMultipleSendersAndReceiversAndNonFungibleTokens() { final var cryptoTransferTxn = CRYPTO_TRANSFER_TXN; return defaultHapiSpec( - "NonNestedCryptoTransferForFungibleTokenWithMultipleSendersAndReceiversAndNonFungibleTokens") + "NonNestedCryptoTransferForFungibleTokenWithMultipleSendersAndReceiversAndNonFungibleTokens", + NONDETERMINISTIC_FUNCTION_PARAMETERS, + NONDETERMINISTIC_CONTRACT_CALL_RESULTS) .given( newKeyNamed(MULTI_KEY), cryptoCreate(SENDER).balance(10 * ONE_HUNDRED_HBARS), @@ -1045,7 +1092,11 @@ private HapiSpec nonNestedCryptoTransferForFungibleTokenWithMultipleSendersAndRe @HapiTest private HapiSpec hapiTransferFromForNFTWithCustomFeesWithoutApproveFails() { - return defaultHapiSpec("HapiTransferFromForNFTWithCustomFeesWithoutApproveFails") + return defaultHapiSpec( + "HapiTransferFromForNFTWithCustomFeesWithoutApproveFails", + NONDETERMINISTIC_FUNCTION_PARAMETERS, + NONDETERMINISTIC_CONTRACT_CALL_RESULTS, + NONDETERMINISTIC_TRANSACTION_FEES) .given( newKeyNamed(MULTI_KEY), newKeyNamed(RECEIVER_SIGNATURE), @@ -1191,7 +1242,10 @@ private HapiSpec hapiTransferFromForFungibleTokenWithCustomFeesWithoutApproveFai final var FUNGIBLE_TOKEN_WITH_FIXED_HBAR_FEE = "fungibleTokenWithFixedHbarFee"; final var FUNGIBLE_TOKEN_WITH_FIXED_TOKEN_FEE = "fungibleTokenWithFixedTokenFee"; final var FUNGIBLE_TOKEN_WITH_FRACTIONAL_FEE = "fungibleTokenWithFractionalTokenFee"; - return defaultHapiSpec("HapiTransferFromForFungibleTokenWithCustomFeesWithoutApproveFails") + return defaultHapiSpec( + "HapiTransferFromForFungibleTokenWithCustomFeesWithoutApproveFails", + NONDETERMINISTIC_FUNCTION_PARAMETERS, + NONDETERMINISTIC_CONTRACT_CALL_RESULTS) .given( newKeyNamed(RECEIVER_SIGNATURE), cryptoCreate(TOKEN_TREASURY), @@ -1288,7 +1342,11 @@ private HapiSpec hapiTransferFromForFungibleTokenWithCustomFeesWithBothApproveFo final var FUNGIBLE_TOKEN_WITH_FIXED_HBAR_FEE = "fungibleTokenWithFixedHbarFee"; final var FUNGIBLE_TOKEN_WITH_FIXED_TOKEN_FEE = "fungibleTokenWithFixedTokenFee"; final var FUNGIBLE_TOKEN_WITH_FRACTIONAL_FEE = "fungibleTokenWithFractionalTokenFee"; - return defaultHapiSpec("HapiTransferFromForFungibleTokenWithCustomFeesWithBothApproveForAllAndAssignedSpender") + return defaultHapiSpec( + "HapiTransferFromForFungibleTokenWithCustomFeesWithBothApproveForAllAndAssignedSpender", + NONDETERMINISTIC_FUNCTION_PARAMETERS, + NONDETERMINISTIC_CONTRACT_CALL_RESULTS, + NONDETERMINISTIC_TRANSACTION_FEES) .given( newKeyNamed(RECEIVER_SIGNATURE), cryptoCreate(TOKEN_TREASURY), diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ERCPrecompileSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ERCPrecompileSuite.java index c748fc7befa7..2bd81e90a309 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ERCPrecompileSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/ERCPrecompileSuite.java @@ -1250,7 +1250,7 @@ ERC_721_CONTRACT, OWNER_OF, asHeadlongAddress(tokenAddr.get()), BigInteger.ONE) .gas(GAS_TO_OFFER))); } - @HapiTest + // Expects revert private HapiSpec getErc721TokenURIFromErc20TokenFails() { final var invalidTokenURITxn = "tokenURITxnFromErc20"; diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/GrantRevokeKycSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/GrantRevokeKycSuite.java index ad97796b7d4e..77534392e073 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/GrantRevokeKycSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/GrantRevokeKycSuite.java @@ -99,6 +99,7 @@ List positiveSpecs() { return List.of(grantRevokeKycSpecWithAliasLocalCall()); } + @HapiTest private HapiSpec grantRevokeKycFail() { final AtomicReference vanillaTokenID = new AtomicReference<>(); final AtomicReference accountID = new AtomicReference<>(); diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/LazyCreateThroughPrecompileSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/LazyCreateThroughPrecompileSuite.java index c8e7920c1614..3146ee94b0de 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/LazyCreateThroughPrecompileSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/LazyCreateThroughPrecompileSuite.java @@ -314,6 +314,7 @@ private HapiSpec erc20TransferLazyCreate() { .then(); } + // Expected INSUFFICIENT_GAS but was REVERTED_SUCCESS private HapiSpec erc20TransferFromLazyCreate() { return defaultHapiSpec("erc20TransferFromLazyCreate") .given( diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/PauseUnpauseTokenAccountPrecompileSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/PauseUnpauseTokenAccountPrecompileSuite.java index 901638f9df85..b8152076a1b3 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/PauseUnpauseTokenAccountPrecompileSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/PauseUnpauseTokenAccountPrecompileSuite.java @@ -130,6 +130,7 @@ PAUSE_TX, CONTRACT_REVERT_EXECUTED, recordWith().status(INVALID_TOKEN_ID)), recordWith().status(INVALID_TOKEN_ID))); } + @HapiTest private HapiSpec noAccountKeyReverts() { final AtomicReference accountID = new AtomicReference<>(); final AtomicReference vanillaTokenID = new AtomicReference<>(); diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/TokenAndTypeCheckSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/TokenAndTypeCheckSuite.java index 28661d0636f7..ee3aea1ae616 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/TokenAndTypeCheckSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/precompile/TokenAndTypeCheckSuite.java @@ -122,7 +122,7 @@ private HapiSpec checkTokenAndTypeStandardCases() { .then(); } - @HapiTest + // Should just return false on isToken() check for missing token type private HapiSpec checkTokenAndTypeNegativeCases() { final AtomicReference vanillaTokenID = new AtomicReference<>(); final var notAnAddress = new byte[20]; diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/regression/AddressAliasIdFuzzing.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/regression/AddressAliasIdFuzzing.java index 6c88984f78ba..6ca964ce4180 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/regression/AddressAliasIdFuzzing.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/regression/AddressAliasIdFuzzing.java @@ -20,16 +20,20 @@ import static com.hedera.services.bdd.spec.HapiSpec.propertyPreservingHapiSpec; import static com.hedera.services.bdd.spec.infrastructure.OpProvider.UNIQUE_PAYER_ACCOUNT; import static com.hedera.services.bdd.spec.infrastructure.OpProvider.UNIQUE_PAYER_ACCOUNT_INITIAL_BALANCE; +import static com.hedera.services.bdd.spec.queries.QueryVerbs.getFileContents; import static com.hedera.services.bdd.spec.transactions.TxnVerbs.cryptoCreate; import static com.hedera.services.bdd.spec.utilops.UtilVerbs.*; import static com.hedera.services.bdd.suites.leaky.LeakyCryptoTestsSuite.*; import static com.hedera.services.bdd.suites.regression.factories.IdFuzzingProviderFactory.*; +import static java.util.stream.Collectors.joining; import com.hedera.services.bdd.junit.HapiTest; import com.hedera.services.bdd.junit.HapiTestSuite; import com.hedera.services.bdd.spec.HapiSpec; import com.hedera.services.bdd.suites.HapiSuite; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import org.apache.logging.log4j.LogManager; @@ -60,13 +64,20 @@ public List getSpecsInSuite() { return List.of(addressAliasIdFuzzing(), transferToKeyFuzzing()); } - @HapiTest + // FileUpdate resolves to UNKNOWN private HapiSpec addressAliasIdFuzzing() { + final Map existingProps = new LinkedHashMap<>(); return propertyPreservingHapiSpec("AddressAliasIdFuzzing") .preserving( CHAIN_ID_PROP, LAZY_CREATE_PROPERTY_NAME, CONTRACTS_EVM_VERSION_PROP, ATOMIC_CRYPTO_TRANSFER) - .given(initOperations()) - .when() + .given( + getFileContents(APP_PROPERTIES).addingConfigListTo(existingProps), + withOpContext((spec, opLog) -> log.info( + "Before initOperations() properties are\n\t{}", + existingProps.entrySet().stream() + .map(e -> e.getKey() + "=" + e.getValue()) + .collect(joining("\n\t"))))) + .when(initOperations()) .then(runWithProvider(idFuzzingWith(PROPERTIES)) .lasting(10L, TimeUnit.SECONDS) .maxOpsPerSec(maxOpsPerSec::get)