diff --git a/.github/workflows/gateway-contracts-upgrade-tests.yml b/.github/workflows/gateway-contracts-upgrade-tests.yml index bea3f64b94..d9a2b89bd1 100644 --- a/.github/workflows/gateway-contracts-upgrade-tests.yml +++ b/.github/workflows/gateway-contracts-upgrade-tests.yml @@ -33,10 +33,7 @@ jobs: sc-upgrade: name: gateway-contracts-upgrade-tests/sc-upgrade (bpr) needs: check-changes - # if: ${{ needs.check-changes.outputs.changes-gw-contracts == 'true' }} - # TODO: Re-enable the upgrade tests once fhevm 0.9 is released - # See https://github.com/zama-ai/fhevm-internal/issues/439 - if: false + if: ${{ needs.check-changes.outputs.changes-gw-contracts == 'true' }} permissions: contents: 'read' # Required to checkout repository code checks: 'write' # Required to create GitHub checks for test results @@ -48,7 +45,7 @@ jobs: with: # This version should be updated whenever we release new contract versions or # touch a contract upgrade path. - ref: v0.8.0-6 + ref: v0.9.1-1 path: previous-fhevm persist-credentials: 'false' @@ -209,15 +206,17 @@ jobs: # See https://github.com/zama-ai/fhevm-internal/issues/379 - name: Upgrade KMSGeneration contract working-directory: current-fhevm/gateway-contracts + # TODO: Re-enable the upgrade tests once the contract needs an upgrade + if: false env: DOTENV_CONFIG_PATH: .env HARDHAT_NETWORK: staging CHAIN_ID_GATEWAY: 54321 RPC_URL: http://localhost:8546 run: | - npx hardhat task:upgradeKmsGeneration \ - --current-implementation previous-contracts/KmsGeneration.sol:KmsGeneration \ - --new-implementation contracts/KmsGeneration.sol:KmsGeneration \ + npx hardhat task:upgradeKMSGeneration \ + --current-implementation previous-contracts/KMSGeneration.sol:KMSGeneration \ + --new-implementation contracts/KMSGeneration.sol:KMSGeneration \ --use-internal-proxy-address true \ --verify-contract false diff --git a/gateway-contracts/.env.example b/gateway-contracts/.env.example index ed6716d569..7c38d38c91 100644 --- a/gateway-contracts/.env.example +++ b/gateway-contracts/.env.example @@ -55,24 +55,30 @@ KMS_SIGNER_ADDRESS_3="0xDb216ECeC4cEd51CdfD9609b6Ce7653aB04f6cAd" # accounts[10] KMS_NODE_IP_ADDRESS_3="127.0.0.4" # (string) KMS_NODE_STORAGE_URL_3="s3://kms-bucket-4" # (string) +# Coprocessor blob +COPROCESSORS_BLOB="0x54c4e861e4036812a7d137acfbf134758045b3e8feec003d838082fbd4ae6f2192ea668d9bb73abedd159ffa9d09d3d5846d9c4ac19c40aa16e894ae491f3cc3" # (bytes) + # Coprocessors # The number of coprocessors must be lower or equal to the number of coprocessors' metadata defined below NUM_COPROCESSORS="3" # (number) # Coprocessor 1 +COPROCESSOR_NAME_0="Coprocessor 1" # (string) COPROCESSOR_TX_SENDER_ADDRESS_0="0x6518D50aDc9036Df37119eA465a8159E34417E2E" # accounts[11] (address) COPROCESSOR_SIGNER_ADDRESS_0="0xa5eE8292dA52d8234248709F3E217ffEBA5E8312" # accounts[12] (address) -COPROCESSOR_S3_BUCKET_URL_0="s3://coprocessor-bucket-1" # (string) +COPROCESSOR_STORAGE_URL_0="s3://coprocessor-bucket-1" # (string) # Coprocessor 2 +COPROCESSOR_NAME_1="Coprocessor 2" # (string) COPROCESSOR_TX_SENDER_ADDRESS_1="0xCFbF539CB91c92ace0343c5B0487149Ad0b82078" # accounts[13] (address) COPROCESSOR_SIGNER_ADDRESS_1="0xA951F315d5FD35Cac111dFB5250DF231FB8eF905" # accounts[14] (address) -COPROCESSOR_S3_BUCKET_URL_1="s3://coprocessor-bucket-2" # (string) +COPROCESSOR_STORAGE_URL_1="s3://coprocessor-bucket-2" # (string) # Coprocessor 3 +COPROCESSOR_NAME_2="Coprocessor 3" # (string) COPROCESSOR_TX_SENDER_ADDRESS_2="0x3C0033584da3A0f61AA5C7bde50eAF3642875a21" # accounts[15] (address) COPROCESSOR_SIGNER_ADDRESS_2="0x420AF5A5BBfAd922aE5a501d9a8Bf70a55F52E03" # accounts[16] (address) -COPROCESSOR_S3_BUCKET_URL_2="s3://coprocessor-bucket-3" # (string) +COPROCESSOR_STORAGE_URL_2="s3://coprocessor-bucket-3" # (string) # Custodians # The number of custodians must be lower or equal to the number of custodians' metadata defined below diff --git a/gateway-contracts/Makefile b/gateway-contracts/Makefile index d71d17fdaa..29c8c44db9 100644 --- a/gateway-contracts/Makefile +++ b/gateway-contracts/Makefile @@ -130,3 +130,15 @@ prerelease: # Get the size of the contracts get-contracts-sized: forge build --sizes + +# Get the list of coprocessor signers from the active coprocessor context registered in the gateway +get-coprocessor-signers: + DOTENV_CONFIG_PATH=$(ENV_PATH) npx hardhat task:getCoprocessorSigners --use-internal-proxy-address true --network localGateway + +# Get the list of KMS signers registered in the gateway +get-kms-signers: + DOTENV_CONFIG_PATH=$(ENV_PATH) npx hardhat task:getKmsSigners --use-internal-proxy-address true --network localGateway + +# Get the list of host chains registered in the gateway +get-host-chains: + DOTENV_CONFIG_PATH=$(ENV_PATH) npx hardhat task:getHostChains --use-internal-proxy-address true --network localGateway \ No newline at end of file diff --git a/gateway-contracts/contracts/CiphertextCommits.sol b/gateway-contracts/contracts/CiphertextCommits.sol index cea82dcf5e..1b66c7f0ff 100644 --- a/gateway-contracts/contracts/CiphertextCommits.sol +++ b/gateway-contracts/contracts/CiphertextCommits.sol @@ -1,20 +1,33 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear pragma solidity ^0.8.24; -import { gatewayConfigAddress, kmsGenerationAddress } from "../addresses/GatewayAddresses.sol"; +import { + gatewayConfigAddress, + kmsGenerationAddress, + coprocessorContextsAddress +} from "../addresses/GatewayAddresses.sol"; import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; import { ICiphertextCommits } from "./interfaces/ICiphertextCommits.sol"; import { IGatewayConfig } from "./interfaces/IGatewayConfig.sol"; import { IKMSGeneration } from "./interfaces/IKMSGeneration.sol"; +import { ICoprocessorContexts } from "./interfaces/ICoprocessorContexts.sol"; import { UUPSUpgradeableEmptyProxy } from "./shared/UUPSUpgradeableEmptyProxy.sol"; import { GatewayConfigChecks } from "./shared/GatewayConfigChecks.sol"; import { GatewayOwnable } from "./shared/GatewayOwnable.sol"; import { CiphertextMaterial, SnsCiphertextMaterial } from "./shared/Structs.sol"; +import { ContextStatus } from "./shared/Enums.sol"; +import { ContextChecks } from "./shared/ContextChecks.sol"; /** * @title CiphertextCommits smart contract * @notice See {ICiphertextCommits}. */ -contract CiphertextCommits is ICiphertextCommits, UUPSUpgradeableEmptyProxy, GatewayOwnable, GatewayConfigChecks { +contract CiphertextCommits is + ICiphertextCommits, + UUPSUpgradeableEmptyProxy, + GatewayOwnable, + GatewayConfigChecks, + ContextChecks +{ /** * @notice The address of the GatewayConfig contract, used for fetching information about coprocessors. */ @@ -25,6 +38,9 @@ contract CiphertextCommits is ICiphertextCommits, UUPSUpgradeableEmptyProxy, Gat */ IKMSGeneration private constant KMS_GENERATION = IKMSGeneration(kmsGenerationAddress); + /// @notice The address of the CoprocessorContexts contract, used for fetching information about coprocessors. + ICoprocessorContexts private constant COPROCESSOR_CONTEXTS = ICoprocessorContexts(coprocessorContextsAddress); + /** * @dev The following constants are used for versioning the contract. They are made private * in order to force derived contracts to consider a different version. Note that @@ -32,7 +48,7 @@ contract CiphertextCommits is ICiphertextCommits, UUPSUpgradeableEmptyProxy, Gat */ string private constant CONTRACT_NAME = "CiphertextCommits"; uint256 private constant MAJOR_VERSION = 0; - uint256 private constant MINOR_VERSION = 1; + uint256 private constant MINOR_VERSION = 2; uint256 private constant PATCH_VERSION = 0; /** @@ -41,7 +57,7 @@ contract CiphertextCommits is ICiphertextCommits, UUPSUpgradeableEmptyProxy, Gat * This constant does not represent the number of time a specific contract have been upgraded, * as a contract deployed from version VX will have a REINITIALIZER_VERSION > 2. */ - uint64 private constant REINITIALIZER_VERSION = 2; + uint64 private constant REINITIALIZER_VERSION = 3; /** * @notice The contract's variable storage struct (@dev see ERC-7201) @@ -104,44 +120,57 @@ contract CiphertextCommits is ICiphertextCommits, UUPSUpgradeableEmptyProxy, Gat /** * @notice Re-initializes the contract from V1. - * @dev Define a `reinitializeVX` function once the contract needs to be upgraded. */ /// @custom:oz-upgrades-unsafe-allow missing-initializer-call /// @custom:oz-upgrades-validate-as-initializer - // function reinitializeV2() public virtual reinitializer(REINITIALIZER_VERSION) {} + function reinitializeV2() public virtual reinitializer(REINITIALIZER_VERSION) {} - /** - * @notice See {ICiphertextCommits-addCiphertextMaterial}. - */ + /// @notice See {ICiphertextCommits-addCiphertextMaterial}. function addCiphertextMaterial( bytes32 ctHandle, uint256 keyId, bytes32 ciphertextDigest, bytes32 snsCiphertextDigest - ) external virtual onlyCoprocessorTxSender onlyHandleFromRegisteredHostChain(ctHandle) { - CiphertextCommitsStorage storage $ = _getCiphertextCommitsStorage(); - - // Check if the coprocessor transaction sender has already added the ciphertext handle. - if ($.alreadyAddedCoprocessorTxSenders[ctHandle][msg.sender]) { - revert CoprocessorAlreadyAdded(ctHandle, msg.sender); - } - + ) external virtual onlyHandleFromRegisteredHostChain(ctHandle) refreshCoprocessorContextStatuses { // The addCiphertextHash is the hash of all received input arguments which means that multiple // Coprocessors can only have a consensus on a ciphertext material with the same information. // This hash is used to differentiate different calls to the function, in particular when // tracking the consensus on the received ciphertext material. // Note that chainId is not included in the hash because it is already contained in the ctHandle. bytes32 addCiphertextHash = keccak256(abi.encode(ctHandle, keyId, ciphertextDigest, snsCiphertextDigest)); - $.addCiphertextHashCounters[addCiphertextHash]++; - // Associate the handle to coprocessor context ID 1 to anticipate their introduction in V2. - // Only set the context ID if it hasn't been set yet to avoid multiple identical SSTOREs. - if ($.addCiphertextContextId[addCiphertextHash] == 0) { - $.addCiphertextContextId[addCiphertextHash] = 1; + CiphertextCommitsStorage storage $ = _getCiphertextCommitsStorage(); + + // Get the context ID from the input verification context ID mapping + // This ID may be 0 (invalid) if this is the first addCiphertextMaterial call for this + // addCiphertextHash (see right below) + uint256 contextId = $.addCiphertextContextId[addCiphertextHash]; + + // If the context ID is null, get the active coprocessor context's ID and associate it to + // this ciphertext material addition + if (contextId == 0) { + contextId = COPROCESSOR_CONTEXTS.getActiveCoprocessorContextId(); + $.addCiphertextContextId[addCiphertextHash] = contextId; + + // Else, that means a coprocessor already started to add the ciphertext material + // and we need to check that the context is active or suspended + // If it is not, that means the context is no longer valid for this operation and we revert + } else if (!COPROCESSOR_CONTEXTS.isCoprocessorContextOperating(contextId)) { + ContextStatus contextStatus = COPROCESSOR_CONTEXTS.getCoprocessorContextStatus(contextId); + revert InvalidCoprocessorContextAddCiphertext(ctHandle, contextId, contextStatus); } - // It is ok to only the handle can be considered here as a handle should only be added once - // in the contract anyway + // Only accept coprocessor transaction senders from the same context + _checkIsCoprocessorTxSender(contextId, msg.sender); + + // Check if the coprocessor transaction sender has already added the ciphertext handle. + if ($.alreadyAddedCoprocessorTxSenders[ctHandle][msg.sender]) { + revert CoprocessorAlreadyAdded(ctHandle, msg.sender); + } + + $.addCiphertextHashCounters[addCiphertextHash]++; + + // It is ok to only consider the handle here as it is only added once in the contract anyway $.alreadyAddedCoprocessorTxSenders[ctHandle][msg.sender] = true; // Store the coprocessor transaction sender address for the ciphertext material addition @@ -154,9 +183,10 @@ contract CiphertextCommits is ICiphertextCommits, UUPSUpgradeableEmptyProxy, Gat // Send the event if and only if the consensus is reached in the current response call. // This means a "late" response will not be reverted, just ignored and no event will be emitted + // Besides, consensus only considers the coprocessors of the same context if ( !$.isCiphertextMaterialAdded[ctHandle] && - _isConsensusReached($.addCiphertextHashCounters[addCiphertextHash]) + _isConsensusReached(contextId, $.addCiphertextHashCounters[addCiphertextHash]) ) { $.ciphertextDigests[ctHandle] = ciphertextDigest; $.snsCiphertextDigests[ctHandle] = snsCiphertextDigest; @@ -170,12 +200,7 @@ contract CiphertextCommits is ICiphertextCommits, UUPSUpgradeableEmptyProxy, Gat // by only knowing the handle, since a consensus can only happen once per handle $.ctHandleConsensusHash[ctHandle] = addCiphertextHash; - emit AddCiphertextMaterial( - ctHandle, - ciphertextDigest, - snsCiphertextDigest, - $.coprocessorTxSenderAddresses[addCiphertextHash] - ); + emit AddCiphertextMaterial(ctHandle, ciphertextDigest, snsCiphertextDigest, contextId); } } @@ -205,13 +230,13 @@ contract CiphertextCommits is ICiphertextCommits, UUPSUpgradeableEmptyProxy, Gat // Get the unique hash associated to the handle and use it to get the list of coprocessor // transaction sender address that were involved in the consensus bytes32 addCiphertextHash = $.ctHandleConsensusHash[ctHandles[i]]; - address[] memory coprocessorTxSenderAddresses = $.coprocessorTxSenderAddresses[addCiphertextHash]; ctMaterials[i] = CiphertextMaterial( ctHandles[i], $.keyIds[ctHandles[i]], $.ciphertextDigests[ctHandles[i]], - coprocessorTxSenderAddresses + $.coprocessorTxSenderAddresses[addCiphertextHash], + $.addCiphertextContextId[addCiphertextHash] ); } @@ -236,13 +261,13 @@ contract CiphertextCommits is ICiphertextCommits, UUPSUpgradeableEmptyProxy, Gat // Get the unique hash associated to the handle and use it to get the list of coprocessor // transaction sender address that were involved in the consensus bytes32 addCiphertextHash = $.ctHandleConsensusHash[ctHandles[i]]; - address[] memory coprocessorTxSenderAddresses = $.coprocessorTxSenderAddresses[addCiphertextHash]; snsCtMaterials[i] = SnsCiphertextMaterial( ctHandles[i], $.keyIds[ctHandles[i]], $.snsCiphertextDigests[ctHandles[i]], - coprocessorTxSenderAddresses + $.coprocessorTxSenderAddresses[addCiphertextHash], + $.addCiphertextContextId[addCiphertextHash] ); } @@ -250,20 +275,26 @@ contract CiphertextCommits is ICiphertextCommits, UUPSUpgradeableEmptyProxy, Gat } /** - * @notice See {ICiphertextCommits-getAddCiphertextMaterialConsensusTxSenders}. - * The list remains empty until the consensus is reached. + * @notice See {ICiphertextCommits-getConsensusCoprocessorTxSenders}. + * The list remains empty and the contextId is 0 until the consensus is reached. */ - function getAddCiphertextMaterialConsensusTxSenders( + function getConsensusCoprocessorTxSenders( bytes32 ctHandle - ) external view virtual returns (address[] memory) { + ) external view virtual returns (address[] memory, uint256, bool) { CiphertextCommitsStorage storage $ = _getCiphertextCommitsStorage(); + bool ciphertextMaterialAdded = $.isCiphertextMaterialAdded[ctHandle]; + // Get the unique hash associated to the handle in order to retrieve the list of transaction // sender address that participated in the consensus // This digest remains the default value (0x0) until the consensus is reached. bytes32 addCiphertextHash = $.ctHandleConsensusHash[ctHandle]; - return $.coprocessorTxSenderAddresses[addCiphertextHash]; + return ( + $.coprocessorTxSenderAddresses[addCiphertextHash], + $.addCiphertextContextId[addCiphertextHash], + ciphertextMaterialAdded + ); } /** @@ -291,12 +322,13 @@ contract CiphertextCommits is ICiphertextCommits, UUPSUpgradeableEmptyProxy, Gat function _authorizeUpgrade(address _newImplementation) internal virtual override onlyGatewayOwner {} /** - * @notice Checks if the consensus is reached among the Coprocessors. + * @notice Checks if the consensus is reached among the coprocessors from the same context. + * @param contextId The coprocessor context ID * @param coprocessorCounter The number of coprocessors that agreed * @return Whether the consensus is reached */ - function _isConsensusReached(uint256 coprocessorCounter) internal view virtual returns (bool) { - uint256 consensusThreshold = GATEWAY_CONFIG.getCoprocessorMajorityThreshold(); + function _isConsensusReached(uint256 contextId, uint256 coprocessorCounter) internal view virtual returns (bool) { + uint256 consensusThreshold = COPROCESSOR_CONTEXTS.getCoprocessorMajorityThreshold(contextId); return coprocessorCounter >= consensusThreshold; } diff --git a/gateway-contracts/contracts/CoprocessorContexts.sol b/gateway-contracts/contracts/CoprocessorContexts.sol new file mode 100644 index 0000000000..8e1ac99c3e --- /dev/null +++ b/gateway-contracts/contracts/CoprocessorContexts.sol @@ -0,0 +1,538 @@ +// SPDX-License-Identifier: BSD-3-Clause-Clear +pragma solidity ^0.8.24; + +import { ICoprocessorContexts } from "./interfaces/ICoprocessorContexts.sol"; +import { Ownable2StepUpgradeable } from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; +import { ContextLifecycle } from "./libraries/ContextLifecycle.sol"; +import { GatewayOwnable } from "./shared/GatewayOwnable.sol"; +import { GatewayConfigChecks } from "./shared/GatewayConfigChecks.sol"; +import { CoprocessorV2, CoprocessorContext, CoprocessorContextTimePeriods } from "./shared/Structs.sol"; +import { ContextStatus } from "./shared/Enums.sol"; +import { UUPSUpgradeableEmptyProxy } from "./shared/UUPSUpgradeableEmptyProxy.sol"; + +/** + * @title CoprocessorContexts contract + * @notice See {ICoprocessorContexts}. + */ +contract CoprocessorContexts is ICoprocessorContexts, UUPSUpgradeableEmptyProxy, GatewayOwnable, GatewayConfigChecks { + // The following constants are used for versioning the contract. They are made private + // in order to force derived contracts to consider a different version. Note that + // they can still define their own private constants with the same name. + string private constant CONTRACT_NAME = "CoprocessorContexts"; + uint256 private constant MAJOR_VERSION = 0; + uint256 private constant MINOR_VERSION = 1; + uint256 private constant PATCH_VERSION = 0; + + /// Constant used for making sure the version number using in the `reinitializer` modifier is + /// identical between `initializeFromEmptyProxy` and the reinitializeVX` method + uint64 private constant REINITIALIZER_VERSION = 2; + + /** + * @notice The contract's variable storage struct (@dev see ERC-7201) + */ + /// @custom:storage-location erc7201:fhevm_gateway.storage.CoprocessorContexts + struct CoprocessorContextsStorage { + /// @notice The coprocessor context lifecycle library storage + ContextLifecycle.ContextLifecycleStorage coprocessorContextLifecycle; + /// @notice The coprocessor contexts + mapping(uint256 contextId => CoprocessorContext coprocessorContext) coprocessorContexts; + /// @notice The number of coprocessor contexts + uint256 coprocessorContextCount; + /// @notice The coprocessors' metadata per context + mapping(uint256 contextId => mapping(address coprocessorTxSenderAddress => CoprocessorV2 coprocessor)) coprocessors; + /// @notice Whether a coprocessor is a transaction sender in a context + mapping(uint256 contextId => mapping(address coprocessorTxSenderAddress => bool isCoprocessorTxSender)) isCoprocessorTxSender; + /// @notice The coprocessors' transaction sender address list per context + mapping(uint256 contextId => address[] coprocessorTxSenderAddresses) coprocessorTxSenderAddresses; + /// @notice Whether a coprocessor is a signer in a context + mapping(uint256 contextId => mapping(address coprocessorSignerAddress => bool isCoprocessorSigner)) isCoprocessorSigner; + /// @notice The coprocessors' signer address list per context + mapping(uint256 contextId => address[] coprocessorSignerAddresses) coprocessorSignerAddresses; + /// @notice The block timestamp at which the coprocessor context is activated + mapping(uint256 contextId => uint256 activationBlockTimestamp) coprocessorContextActivationBlockTimestamp; + /// @notice The block timestamp at which the coprocessor context is deactivated + mapping(uint256 contextId => uint256 deactivatedBlockTimestamp) coprocessorContextDeactivatedBlockTimestamp; + /// @notice The suspended time period for the coprocessor context + mapping(uint256 contextId => uint256 suspendedTimePeriod) coprocessorContextSuspendedTimePeriod; + } + + // Storage location has been computed using the following command: + // keccak256(abi.encode(uint256(keccak256("fhevm_gateway.storage.CoprocessorContexts")) - 1)) + // & ~bytes32(uint256(0xff)) + bytes32 private constant COPROCESSOR_CONTEXTS_STORAGE_LOCATION = + 0x1da8a9a065a2f0a895c457065eddd3cf4a4d0d5340aaa0ca54d3cd5b4a6aaf00; + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /** + * @notice Modifier to ensure that a coprocessor context is initialized. + * @param contextId The coprocessor context ID. + */ + modifier ensureContextInitialized(uint256 contextId) { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + if ($.coprocessorContexts[contextId].contextId == 0) { + revert CoprocessorContextNotInitialized(contextId); + } + _; + } + + /** + * @notice Initializes the contract + * @dev This function needs to be public in order to be called by the UUPS proxy. + * @param initialBlob The blob of the initial coprocessor context + * @param initialCoprocessors The coprocessors of the initial coprocessor context + */ + /// @custom:oz-upgrades-validate-as-initializer + function initializeFromEmptyProxy( + bytes calldata initialBlob, + CoprocessorV2[] calldata initialCoprocessors + ) public virtual onlyFromEmptyProxy reinitializer(REINITIALIZER_VERSION) { + // The first coprocessor context is the initial coprocessor context and thus does not have a + // previous context (indicated by a null context ID) + CoprocessorContext memory newCoprocessorContext = _addCoprocessorContext(0, initialBlob, initialCoprocessors); + + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + + // It is exceptionally allowed to set the active context directly at initialization. In other + // cases, the context must go through the pre-activation state first. + ContextLifecycle.initializeActive($.coprocessorContextLifecycle, newCoprocessorContext.contextId); + + emit InitializeCoprocessorContexts(initialBlob, initialCoprocessors); + } + + /** + * @notice See {ICoprocessorContexts-getPreActivationCoprocessorContextId}. + */ + function getPreActivationCoprocessorContextId() public view virtual returns (uint256) { + uint256 preActivationContextId = _getPreActivationCoprocessorContextId(); + + // A null context ID indicates that there is no pre-activation coprocessor context + if (preActivationContextId == 0) { + revert NoPreActivationCoprocessorContext(); + } + return preActivationContextId; + } + + /** + * @notice See {ICoprocessorContexts-getSuspendedCoprocessorContextId}. + */ + function getSuspendedCoprocessorContextId() public view virtual returns (uint256) { + uint256 suspendedContextId = _getSuspendedCoprocessorContextId(); + + // A null context ID indicates that there is no suspended coprocessor context + if (suspendedContextId == 0) { + revert NoSuspendedCoprocessorContext(); + } + return suspendedContextId; + } + + /** + * @notice See {ICoprocessorContexts-getActiveCoprocessorContextId}. + */ + function getActiveCoprocessorContextId() public view virtual returns (uint256) { + uint256 activeContextId = _getActiveCoprocessorContextId(); + + // A null context ID indicates that there is no active coprocessor context + if (activeContextId == 0) { + revert NoActiveCoprocessorContext(); + } + return activeContextId; + } + + /** + * @notice See {ICoprocessorContexts-getActiveCoprocessorContext}. + */ + function getActiveCoprocessorContext() public view virtual returns (CoprocessorContext memory) { + uint256 activeContextId = getActiveCoprocessorContextId(); + + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + return $.coprocessorContexts[activeContextId]; + } + + /** + * @notice See {ICoprocessorContexts-addCoprocessorContext}. + */ + function addCoprocessorContext( + bytes calldata blob, + CoprocessorV2[] calldata coprocessors, + CoprocessorContextTimePeriods calldata timePeriods + ) external virtual onlyGatewayOwner { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + // This will revert if there is no active coprocessor context. Although this should never + // happen, it acts as a safeguard to prevent any unexpected behaviors. If such scenario + // ever happens, this means no new contexts could be added. Instead, the gateway will need to be + // paused and upgraded to a new version which puts back a working active coprocessor context + // manually. + CoprocessorContext memory activeCoprocessorContext = getActiveCoprocessorContext(); + + // Add the new coprocessor context, if valid + // The previous context ID is the active coprocessor context ID + CoprocessorContext memory newCoprocessorContext = _addCoprocessorContext( + activeCoprocessorContext.contextId, + blob, + coprocessors + ); + + // Emit the event that indicates that a valid coprocessor context has been suggested to be added. + emit NewCoprocessorContext(activeCoprocessorContext, newCoprocessorContext, timePeriods); + + // Set the coprocessor context to the generating state + // This currently has no implications on the coprocessor contexts, except that it will check + // that there is no pre-activation or suspended coprocessor context ongoing, as it is + // forbidden to generate a new context if there is already one in one of these states. + // Still, we need to follow the general notion of context lifecycle states, which requires + // that a context goes through the generating state before being pre-activated + ContextLifecycle.setGenerating($.coprocessorContextLifecycle, newCoprocessorContext.contextId); + + // Directly pre-activate the coprocessor context + ContextLifecycle.setPreActivation($.coprocessorContextLifecycle, newCoprocessorContext.contextId); + + // Define the activation block timestamp for the new coprocessor context + uint256 activationBlockTimestamp = block.timestamp + timePeriods.preActivationTimePeriod; + $.coprocessorContextActivationBlockTimestamp[newCoprocessorContext.contextId] = activationBlockTimestamp; + + // Store the suspended time period for the previous coprocessor context + // This value will be considered once the new coprocessor context is activated and the old one + // is suspended + $.coprocessorContextSuspendedTimePeriod[activeCoprocessorContext.contextId] = timePeriods.suspendedTimePeriod; + + // Emit the event that indicates that the new coprocessor context has been pre-activated + emit PreActivateCoprocessorContext(newCoprocessorContext, activationBlockTimestamp); + } + + /** + * @notice See {ICoprocessorContexts-refreshCoprocessorContextStatuses}. + */ + function refreshCoprocessorContextStatuses() external virtual { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + + // Check if there is a pre-activation coprocessor context and if it is time to activate it + // and thus suspend the current active coprocessor context + uint256 preActivationContextId = $.coprocessorContextLifecycle.preActivationContextId; + if ( + preActivationContextId != 0 && + block.timestamp >= $.coprocessorContextActivationBlockTimestamp[preActivationContextId] + ) { + uint256 activeContextId = getActiveCoprocessorContextId(); + + // Define the deactivation block timestamp for the current active coprocessor context + uint256 deactivatedBlockTimestamp = block.timestamp + + $.coprocessorContextSuspendedTimePeriod[activeContextId]; + $.coprocessorContextDeactivatedBlockTimestamp[activeContextId] = deactivatedBlockTimestamp; + + // Set the new context as active and the current active context as suspended + ContextLifecycle.setActiveAndSuspended( + $.coprocessorContextLifecycle, + preActivationContextId, + activeContextId + ); + emit SuspendCoprocessorContext(activeContextId, deactivatedBlockTimestamp); + emit ActivateCoprocessorContext(preActivationContextId); + } + + // Check if there is a suspended coprocessor context and if it is time to deactivate it + uint256 suspendedContextId = _getSuspendedCoprocessorContextId(); + if ( + suspendedContextId != 0 && + block.timestamp >= $.coprocessorContextDeactivatedBlockTimestamp[suspendedContextId] + ) { + ContextLifecycle.setDeactivated($.coprocessorContextLifecycle, suspendedContextId); + emit DeactivateCoprocessorContext(suspendedContextId); + } + } + + /** + * @notice See {ICoprocessorContexts-forceUpdateCoprocessorContextToStatus}. + */ + function forceUpdateCoprocessorContextToStatus( + uint256 contextId, + ContextStatus status + ) external virtual onlyGatewayOwner ensureContextInitialized(contextId) { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + if (status == ContextStatus.Active) { + // Get the current active context ID + uint256 activeContextId = getActiveCoprocessorContextId(); + + // Set the new context as active and the current active context as suspended + ContextLifecycle.setActiveAndSuspended($.coprocessorContextLifecycle, contextId, activeContextId); + emit SuspendCoprocessorContext(activeContextId, block.timestamp); + emit ActivateCoprocessorContext(contextId); + } else if (status == ContextStatus.Deactivated) { + ContextLifecycle.setDeactivated($.coprocessorContextLifecycle, contextId); + emit DeactivateCoprocessorContext(contextId); + } else if (status == ContextStatus.Compromised) { + ContextLifecycle.setCompromised($.coprocessorContextLifecycle, contextId); + emit CompromiseCoprocessorContext(contextId); + } else if (status == ContextStatus.Destroyed) { + ContextLifecycle.setDestroyed($.coprocessorContextLifecycle, contextId); + emit DestroyCoprocessorContext(contextId); + } else { + revert InvalidContextStatusForceUpdate(contextId, status); + } + } + + /** + * @notice See {ICoprocessorContexts-swapSuspendedCoprocessorContextWithActive}. + */ + function swapSuspendedCoprocessorContextWithActive(uint256 suspendedTimePeriod) external virtual onlyGatewayOwner { + // This will revert if there is no suspended coprocessor context + uint256 suspendedContextId = getSuspendedCoprocessorContextId(); + + // This will NOT revert if there is no active coprocessor context. Although this should + // never happen, we want to avoid blocking the execution of the function in case of emergency + // or unexpected behaviors + uint256 activeContextId = _getActiveCoprocessorContextId(); + + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + + // Re-activate the suspended coprocessor context and suspend the (problematic) active context + ContextLifecycle.setActiveAndSuspended($.coprocessorContextLifecycle, suspendedContextId, activeContextId); + + // Define the deactivation block timestamp for the current active coprocessor context + uint256 deactivatedBlockTimestamp = block.timestamp + suspendedTimePeriod; + $.coprocessorContextDeactivatedBlockTimestamp[activeContextId] = deactivatedBlockTimestamp; + + emit SuspendCoprocessorContext(activeContextId, deactivatedBlockTimestamp); + emit ActivateCoprocessorContext(suspendedContextId); + } + + /** + * @notice See {ICoprocessorContexts-isCoprocessorTxSender}. + */ + function isCoprocessorTxSender( + uint256 contextId, + address txSenderAddress + ) external view virtual ensureContextInitialized(contextId) returns (bool) { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + return $.isCoprocessorTxSender[contextId][txSenderAddress]; + } + + /** + * @notice See {ICoprocessorContexts-isCoprocessorSigner}. + */ + function isCoprocessorSigner( + uint256 contextId, + address signerAddress + ) external view virtual ensureContextInitialized(contextId) returns (bool) { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + return $.isCoprocessorSigner[contextId][signerAddress]; + } + + /** + * @notice See {ICoprocessorContexts-isCoprocessorContextOperating}. + */ + function isCoprocessorContextOperating( + uint256 contextId + ) external view virtual ensureContextInitialized(contextId) returns (bool) { + return (contextId == getActiveCoprocessorContextId() || contextId == _getSuspendedCoprocessorContextId()); + } + + /** + * @notice See {ICoprocessorContexts-getCoprocessorActivationBlockTimestamp}. + */ + function getCoprocessorActivationBlockTimestamp( + uint256 contextId + ) external view virtual ensureContextInitialized(contextId) returns (uint256) { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + return $.coprocessorContextActivationBlockTimestamp[contextId]; + } + + /** + * @notice See {ICoprocessorContexts-getCoprocessorDeactivatedBlockTimestamp}. + */ + function getCoprocessorDeactivatedBlockTimestamp( + uint256 contextId + ) external view virtual ensureContextInitialized(contextId) returns (uint256) { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + return $.coprocessorContextDeactivatedBlockTimestamp[contextId]; + } + + /** + * @notice See {IGatewayConfig-getCoprocessorMajorityThreshold}. + */ + function getCoprocessorMajorityThreshold( + uint256 contextId + ) external view virtual ensureContextInitialized(contextId) returns (uint256) { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + + // The majority threshold is the number of coprocessors that is required to validate consensus + // in the fhevm Gateway + // It is currently defined as a strict majority within the coprocessor context (50% + 1) + return ($.coprocessorTxSenderAddresses[contextId].length >> 1) + 1; + } + + /** + * @notice See {ICoprocessorContexts-getCoprocessor}. + */ + function getCoprocessor( + uint256 contextId, + address coprocessorTxSenderAddress + ) public view virtual ensureContextInitialized(contextId) returns (CoprocessorV2 memory) { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + CoprocessorV2 memory coprocessor = $.coprocessors[contextId][coprocessorTxSenderAddress]; + + // A null address for the transaction sender address indicates that the coprocessor is not part + // of the coprocessor context + if (coprocessor.txSenderAddress == address(0)) { + revert NotCoprocessorFromContext(contextId, coprocessorTxSenderAddress); + } + + return coprocessor; + } + + /** + * @notice See {ICoprocessorContexts-getCoprocessorTxSenders}. + */ + function getCoprocessorTxSenders(uint256 contextId) external view virtual returns (address[] memory) { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + return $.coprocessorTxSenderAddresses[contextId]; + } + + /** + * @notice See {ICoprocessorContexts-getCoprocessorSigners}. + */ + function getCoprocessorSigners(uint256 contextId) external view virtual returns (address[] memory) { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + return $.coprocessorSignerAddresses[contextId]; + } + + /** + * @notice See {ICoprocessorContexts-getCoprocessorContextStatus}. + */ + function getCoprocessorContextStatus(uint256 contextId) external view virtual returns (ContextStatus) { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + return ContextLifecycle.getContextStatus($.coprocessorContextLifecycle, contextId); + } + + /** + * @notice See {ICoprocessorContexts-getVersion}. + */ + function getVersion() external pure virtual returns (string memory) { + return + string( + abi.encodePacked( + CONTRACT_NAME, + " v", + Strings.toString(MAJOR_VERSION), + ".", + Strings.toString(MINOR_VERSION), + ".", + Strings.toString(PATCH_VERSION) + ) + ); + } + + /** + * @dev Add a new coprocessor context to the state. + * @param previousContextId The ID of the previous coprocessor context. + * @param blob The blob. + * @param coprocessors The coprocessors. + * @return The new coprocessor context. + */ + function _addCoprocessorContext( + uint256 previousContextId, + bytes calldata blob, + CoprocessorV2[] calldata coprocessors + ) internal virtual returns (CoprocessorContext memory) { + // A coprocessor context must contain at least one coprocessor + if (coprocessors.length == 0) { + revert EmptyCoprocessors(); + } + + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + + // A coprocessor context ID starts at 1 and should never be null + $.coprocessorContextCount++; + uint256 contextId = $.coprocessorContextCount; + + // Solidity doesn't support directly copying complex data structures like `coprocessors` + // (array of structs), so we need to instead create the struct field by field. + // The coprocessors themselves are copied in the loop below + $.coprocessorContexts[contextId].contextId = contextId; + $.coprocessorContexts[contextId].previousContextId = previousContextId; + $.coprocessorContexts[contextId].blob = blob; + + for (uint256 i = 0; i < coprocessors.length; i++) { + if (coprocessors[i].txSenderAddress == address(0)) { + revert NullCoprocessorTxSenderAddress(i, coprocessors); + } + + if (coprocessors[i].signerAddress == address(0)) { + revert NullCoprocessorSignerAddress(i, coprocessors); + } + + // All coprocessors must have a unique transaction sender address + if ($.isCoprocessorTxSender[contextId][coprocessors[i].txSenderAddress]) { + revert CoprocessorTxSenderAddressesNotUnique(coprocessors[i].txSenderAddress, i, coprocessors); + } + + // All coprocessors must have a unique signer address + if ($.isCoprocessorSigner[contextId][coprocessors[i].signerAddress]) { + revert CoprocessorSignerAddressesNotUnique(coprocessors[i].signerAddress, i, coprocessors); + } + + // Store the coprocessor struct in the context struct + $.coprocessorContexts[contextId].coprocessors.push(coprocessors[i]); + + // Register several additional mappings for faster lookups (in getters and checks) + $.coprocessors[contextId][coprocessors[i].txSenderAddress] = coprocessors[i]; + $.isCoprocessorTxSender[contextId][coprocessors[i].txSenderAddress] = true; + $.coprocessorTxSenderAddresses[contextId].push(coprocessors[i].txSenderAddress); + $.isCoprocessorSigner[contextId][coprocessors[i].signerAddress] = true; + $.coprocessorSignerAddresses[contextId].push(coprocessors[i].signerAddress); + } + + return $.coprocessorContexts[contextId]; + } + + /** + * @dev Should revert when `msg.sender` is not authorized to upgrade the contract. + */ + // solhint-disable-next-line no-empty-blocks + function _authorizeUpgrade(address _newImplementation) internal virtual override onlyGatewayOwner {} + + /** + * @dev Get the ID of the pre-activation coprocessor context, without reverting if it does not exist. + * @return The ID of the pre-activation coprocessor context. + */ + function _getPreActivationCoprocessorContextId() internal view virtual returns (uint256) { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + return $.coprocessorContextLifecycle.preActivationContextId; + } + + /** + * @dev Get the ID of the suspended coprocessor context, without reverting if it does not exist. + * @return The ID of the suspended coprocessor context. + */ + function _getSuspendedCoprocessorContextId() internal view virtual returns (uint256) { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + return $.coprocessorContextLifecycle.suspendedContextId; + } + + /** + * @dev Get the ID of the active coprocessor context, without reverting if it does not exist. + * @return The ID of the active coprocessor context. + */ + function _getActiveCoprocessorContextId() internal view virtual returns (uint256) { + CoprocessorContextsStorage storage $ = _getCoprocessorContextsStorage(); + return $.coprocessorContextLifecycle.activeContextId; + } + + /** + * @dev Returns the CoprocessorContexts storage location. + * Note that this function is internal but not virtual: derived contracts should be able to + * access it, but if the underlying storage struct version changes, we force them to define a new + * getter function and use that one instead in order to avoid overriding the storage location. + */ + function _getCoprocessorContextsStorage() internal pure returns (CoprocessorContextsStorage storage $) { + // solhint-disable-next-line no-inline-assembly + assembly { + $.slot := COPROCESSOR_CONTEXTS_STORAGE_LOCATION + } + } +} diff --git a/gateway-contracts/contracts/Decryption.sol b/gateway-contracts/contracts/Decryption.sol index e73b40e4a0..1b99a2dae2 100644 --- a/gateway-contracts/contracts/Decryption.sol +++ b/gateway-contracts/contracts/Decryption.sol @@ -16,6 +16,7 @@ import { ICiphertextCommits } from "./interfaces/ICiphertextCommits.sol"; import { UUPSUpgradeableEmptyProxy } from "./shared/UUPSUpgradeableEmptyProxy.sol"; import { GatewayConfigChecks } from "./shared/GatewayConfigChecks.sol"; import { MultichainACLChecks } from "./shared/MultichainACLChecks.sol"; +import { CiphertextCommitsUtils } from "./shared/CiphertextCommitsUtils.sol"; import { FheType } from "./shared/FheType.sol"; import { Pausable } from "./shared/Pausable.sol"; import { FHETypeBitSizes } from "./libraries/FHETypeBitSizes.sol"; @@ -35,63 +36,16 @@ contract Decryption is GatewayOwnable, GatewayConfigChecks, MultichainACLChecks, + CiphertextCommitsUtils, Pausable { - /** - * @notice The typed data structure for the EIP712 signature to validate in public decryption responses. - * @dev The name of this struct is not relevant for the signature validation, only the one defined - * EIP712_PUBLIC_DECRYPT_TYPE is, but we keep it the same for clarity. - */ - struct PublicDecryptVerification { - /// @notice The handles of the ciphertexts that have been decrypted. - bytes32[] ctHandles; - /// @notice The decrypted result of the public decryption. - bytes decryptedResult; - /// @notice Generic bytes metadata for versioned payloads. First byte is for the version. - bytes extraData; - } - - /** - * @notice The typed data structure for the EIP712 signature to validate in user decryption requests. - * @dev The name of this struct is not relevant for the signature validation, only the one defined - * EIP712_USER_DECRYPT_REQUEST_TYPE is, but we keep it the same for clarity. - */ - struct UserDecryptRequestVerification { - /// @notice The user's public key to be used for reencryption. - bytes publicKey; - /// @notice The contract addresses that verification is requested for. - address[] contractAddresses; - /// @notice The start timestamp of the user decryption request. - uint256 startTimestamp; - /// @notice The duration in days of the user decryption request after the start timestamp. - uint256 durationDays; - /// @notice Generic bytes metadata for versioned payloads. First byte is for the version. - bytes extraData; - } - - /** - * @notice The typed data structure for the EIP712 signature to validate in user decryption responses. - * @dev The name of this struct is not relevant for the signature validation, only the one defined - * EIP712_USER_DECRYPT_RESPONSE_TYPE is, but we keep it the same for clarity. - */ - struct UserDecryptResponseVerification { - /// @notice The user's public key used for the reencryption. - bytes publicKey; - /// @notice The handles of the ciphertexts that have been decrypted. - bytes32[] ctHandles; - /// @notice The partial decryption share reencrypted with the user's public key. - bytes userDecryptedShare; - /// @notice Generic bytes metadata for versioned payloads. First byte is for the version. - bytes extraData; - } - /** * @notice The publicKey and ctHandles from user decryption requests used for validations during responses. */ struct UserDecryptionPayload { /// @notice The user's public key to be used for reencryption. bytes publicKey; - /// @notice The handles of the ciphertexts requested for a user decryption + /// @notice The handles of the ciphertexts requested for a user decryption. bytes32[] ctHandles; } @@ -105,11 +59,6 @@ contract Decryption is */ IMultichainACL private constant MULTICHAIN_ACL = IMultichainACL(multichainACLAddress); - /** - * @notice The address of the CiphertextCommits contract for getting ciphertext materials. - */ - ICiphertextCommits private constant CIPHERTEXT_COMMITS = ICiphertextCommits(ciphertextCommitsAddress); - /** * @notice The maximum number of duration days that can be requested for a user decryption. */ @@ -132,7 +81,11 @@ contract Decryption is keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); /** - * @notice The definition of the PublicDecryptVerification structure typed data. + * @notice The typed data structure for the EIP712 signature to validate in public decryption responses. + * @dev The following fields are used for the PublicDecryptVerification struct: + * - ctHandles: The handles of the ciphertexts to be decrypted. + * - decryptedResult: The decrypted result. + * - extraData: Generic bytes metadata for versioned payloads. First byte is for the version. */ string private constant EIP712_PUBLIC_DECRYPT_TYPE = "PublicDecryptVerification(bytes32[] ctHandles,bytes decryptedResult,bytes extraData)"; @@ -144,7 +97,14 @@ contract Decryption is bytes32 private constant EIP712_PUBLIC_DECRYPT_TYPE_HASH = keccak256(bytes(EIP712_PUBLIC_DECRYPT_TYPE)); /** - * @notice The definition of the UserDecryptRequestVerification structure typed data. + * @notice The typed data structure for the EIP712 signature to validate in user decryption requests. + * @dev The following fields are used for the UserDecryptRequestVerification struct: + * - publicKey: The user's public key to be used for reencryption. + * - contractAddresses: The contract addresses that verification is requested for. + * - contractsChainId: The chain ID of the contract addresses. + * - startTimestamp: The start timestamp of the user decryption request. + * - durationDays: The duration in days of the user decryption request after the start timestamp. + * - extraData: Generic bytes metadata for versioned payloads. First byte is for the version. */ string private constant EIP712_USER_DECRYPT_REQUEST_TYPE = "UserDecryptRequestVerification(bytes publicKey,address[] contractAddresses,uint256 startTimestamp," @@ -157,7 +117,12 @@ contract Decryption is bytes32 private constant EIP712_USER_DECRYPT_REQUEST_TYPE_HASH = keccak256(bytes(EIP712_USER_DECRYPT_REQUEST_TYPE)); /** - * @notice The definition of the UserDecryptResponseVerification structure typed data. + * @notice The typed data structure for the EIP712 signature to validate in user decryption responses. + * @dev The following fields are used for the UserDecryptResponseVerification struct: + * - publicKey: The user's public key used for the reencryption. + * - ctHandles: The handles of the ciphertexts that have been decrypted. + * - userDecryptedShare: The partial decryption share reencrypted with the user's public key. + * - extraData: Generic bytes metadata for versioned payloads. First byte is for the version. */ string private constant EIP712_USER_DECRYPT_RESPONSE_TYPE = "UserDecryptResponseVerification(bytes publicKey,bytes32[] ctHandles,bytes userDecryptedShare,bytes extraData)"; @@ -176,7 +141,7 @@ contract Decryption is */ string private constant CONTRACT_NAME = "Decryption"; uint256 private constant MAJOR_VERSION = 0; - uint256 private constant MINOR_VERSION = 1; + uint256 private constant MINOR_VERSION = 2; uint256 private constant PATCH_VERSION = 0; /** @@ -185,7 +150,7 @@ contract Decryption is * This constant does not represent the number of time a specific contract have been upgraded, * as a contract deployed from version VX will have a REINITIALIZER_VERSION > 2. */ - uint64 private constant REINITIALIZER_VERSION = 2; + uint64 private constant REINITIALIZER_VERSION = 3; /** * @notice The contract's variable storage struct (@dev see ERC-7201) @@ -266,11 +231,10 @@ contract Decryption is /** * @notice Re-initializes the contract from V1. - * @dev Define a `reinitializeVX` function once the contract needs to be upgraded. */ /// @custom:oz-upgrades-unsafe-allow missing-initializer-call /// @custom:oz-upgrades-validate-as-initializer - // function reinitializeV2() public virtual reinitializer(REINITIALIZER_VERSION) {} + function reinitializeV2() public virtual reinitializer(REINITIALIZER_VERSION) {} /** * @notice See {IDecryption-publicDecryptionRequest}. @@ -336,15 +300,8 @@ contract Decryption is revert DecryptionNotRequested(decryptionId); } - // Initialize the PublicDecryptVerification structure for the signature validation. - PublicDecryptVerification memory publicDecryptVerification = PublicDecryptVerification( - $.publicCtHandles[decryptionId], - decryptedResult, - extraData - ); - // Compute the digest of the PublicDecryptVerification structure. - bytes32 digest = _hashPublicDecryptVerification(publicDecryptVerification); + bytes32 digest = _hashPublicDecryptVerification($.publicCtHandles[decryptionId], decryptedResult, extraData); // Recover the signer address from the signature and validate that corresponds to a // KMS node that has not already signed. @@ -408,31 +365,24 @@ contract Decryption is revert UserAddressInContractAddresses(userAddress, contractsInfo.addresses); } - // - Extract the handles and check their conformance + // Extract the handles and check their conformance bytes32[] memory ctHandles = _extractCtHandlesCheckConformanceUser( ctHandleContractPairs, contractsInfo.addresses, userAddress ); - // Initialize the UserDecryptRequestVerification structure for the signature validation. - UserDecryptRequestVerification memory userDecryptRequestVerification = UserDecryptRequestVerification( - publicKey, - contractsInfo.addresses, - requestValidity.startTimestamp, - requestValidity.durationDays, - extraData - ); - // Validate the received EIP712 signature on the user decryption request. _validateUserDecryptRequestEIP712Signature( - userDecryptRequestVerification, + requestValidity, + contractsInfo, userAddress, + publicKey, signature, - contractsInfo.chainId + extraData ); - // Fetch the ciphertexts from the CiphertextCommits contract + // Fetch the SNS ciphertexts from the CiphertextCommits contract // This call is reverted if any of the ciphertexts are not found in the contract, but // this should not happen for now as a ciphertext cannot be allowed for decryption // without being added to the contract first (and we currently have no ways of deleting @@ -482,20 +432,14 @@ contract Decryption is revert DecryptionNotRequested(decryptionId); } - UserDecryptionPayload memory userDecryptionPayload = $.userDecryptionPayloads[decryptionId]; - // Initialize the UserDecryptResponseVerification structure for the signature validation. - UserDecryptResponseVerification memory userDecryptResponseVerification = UserDecryptResponseVerification( - userDecryptionPayload.publicKey, - userDecryptionPayload.ctHandles, + // Compute the digest of the UserDecryptResponseVerification structure. + bytes32 digest = _hashUserDecryptResponseVerification( + $.userDecryptionPayloads[decryptionId], userDecryptedShare, extraData ); - // Compute the digest of the UserDecryptResponseVerification structure. - bytes32 digest = _hashUserDecryptResponseVerification(userDecryptResponseVerification); - - // Recover the signer address from the signature and validate that it corresponds to a - // KMS node that has not already signed. + // Validate the received EIP712 signature on the user decryption response. _validateDecryptionResponseEIP712Signature(decryptionId, digest, signature); // Store the KMS transaction sender address for the public decryption response @@ -539,10 +483,7 @@ contract Decryption is // For each handle, check that it is allowed for public decryption and that the ciphertext // material represented by it has been added. for (uint256 i = 0; i < ctHandles.length; i++) { - if ( - !MULTICHAIN_ACL.isPublicDecryptAllowed(ctHandles[i]) || - !CIPHERTEXT_COMMITS.isCiphertextMaterialAdded(ctHandles[i]) - ) { + if (!MULTICHAIN_ACL.isPublicDecryptAllowed(ctHandles[i]) || !_isCiphertextMaterialAdded(ctHandles[i])) { return false; } } @@ -566,7 +507,7 @@ contract Decryption is ctHandleContractPairs[i].ctHandle, ctHandleContractPairs[i].contractAddress ) || - !CIPHERTEXT_COMMITS.isCiphertextMaterialAdded(ctHandleContractPairs[i].ctHandle) + !_isCiphertextMaterialAdded(ctHandleContractPairs[i].ctHandle) ) { return false; } @@ -650,18 +591,22 @@ contract Decryption is /** * @notice Validates the EIP712 signature for a given user decryption request * @dev This function checks that the signer address is the same as the user address. - * @param userDecryptRequestVerification The signed UserDecryptRequestVerification structure - * @param userAddress The address of the user. + * @param requestValidity The validity period of the user decryption request. + * @param contractsInfo The chain ID and contract addresses to be used in the decryption. + * @param userAddress The user's address. + * @param publicKey The user's public key to be used for reencryption. + * @param extraData Generic bytes metadata for versioned payloads. First byte is for the version. * @param signature The signature to be validated - * @param contractsChainId The chain ID of the contracts. */ function _validateUserDecryptRequestEIP712Signature( - UserDecryptRequestVerification memory userDecryptRequestVerification, + RequestValidity memory requestValidity, + ContractsInfo memory contractsInfo, address userAddress, + bytes memory publicKey, bytes calldata signature, - uint256 contractsChainId + bytes memory extraData ) internal view virtual { - bytes32 digest = _hashUserDecryptRequestVerification(userDecryptRequestVerification, contractsChainId); + bytes32 digest = _hashUserDecryptRequestVerification(requestValidity, contractsInfo, publicKey, extraData); address signer = ECDSA.recover(digest, signature); if (signer != userAddress) { revert InvalidUserSignature(signature); @@ -669,21 +614,24 @@ contract Decryption is } /** - * @notice Computes the hash of a given PublicDecryptVerification structured data - * @param publicDecryptVerification The PublicDecryptVerification structure - * @return The hash of the PublicDecryptVerification structure + * @notice Computes the hash of a PublicDecryptVerification structured data + * @param ctHandles The handles of the ciphertexts to be decrypted. + * @param decryptedResult The decrypted result. + * @param extraData Generic bytes metadata for versioned payloads. First byte is for the version. */ function _hashPublicDecryptVerification( - PublicDecryptVerification memory publicDecryptVerification + bytes32[] memory ctHandles, + bytes memory decryptedResult, + bytes memory extraData ) internal view virtual returns (bytes32) { return _hashTypedDataV4( keccak256( abi.encode( EIP712_PUBLIC_DECRYPT_TYPE_HASH, - keccak256(abi.encodePacked(publicDecryptVerification.ctHandles)), - keccak256(publicDecryptVerification.decryptedResult), - keccak256(abi.encodePacked(publicDecryptVerification.extraData)) + keccak256(abi.encodePacked(ctHandles)), + keccak256(decryptedResult), + keccak256(abi.encodePacked(extraData)) ) ) ); @@ -706,45 +654,53 @@ contract Decryption is } /** - * @notice Computes the hash of a given UserDecryptRequestVerification structured data. - * @param userDecryptRequestVerification The UserDecryptRequestVerification structure to hash. - * @param contractsChainId The chain ID of the contracts. + * @notice Computes the hash of a UserDecryptRequestVerification structured data. + * @param requestValidity The validity period of the user decryption request. + * @param contractsInfo The chain ID and contract addresses to be used in the decryption. + * @param publicKey The user's public key to be used for reencryption. + * @param extraData Generic bytes metadata for versioned payloads. First byte is for the version. * @return The hash of the UserDecryptRequestVerification structure. */ function _hashUserDecryptRequestVerification( - UserDecryptRequestVerification memory userDecryptRequestVerification, - uint256 contractsChainId + RequestValidity memory requestValidity, + ContractsInfo memory contractsInfo, + bytes memory publicKey, + bytes memory extraData ) internal view virtual returns (bytes32) { bytes32 structHash = keccak256( abi.encode( EIP712_USER_DECRYPT_REQUEST_TYPE_HASH, - keccak256(userDecryptRequestVerification.publicKey), - keccak256(abi.encodePacked(userDecryptRequestVerification.contractAddresses)), - userDecryptRequestVerification.startTimestamp, - userDecryptRequestVerification.durationDays, - keccak256(abi.encodePacked(userDecryptRequestVerification.extraData)) + keccak256(publicKey), + keccak256(abi.encodePacked(contractsInfo.addresses)), + requestValidity.startTimestamp, + requestValidity.durationDays, + keccak256(abi.encodePacked(extraData)) ) ); - return _hashTypedDataV4CustomChainId(contractsChainId, structHash); + return _hashTypedDataV4CustomChainId(contractsInfo.chainId, structHash); } /** - * @notice Computes the hash of a given UserDecryptResponseVerification structured data. - * @param userDecryptResponseVerification The UserDecryptResponseVerification structure to hash. + * @notice Computes the hash of a UserDecryptResponseVerification structured data. + * @param userDecryptionPayload The UserDecryptionPayload structure to hash. + * @param userDecryptedShare The user decrypted share. + * @param extraData The extra data. * @return The hash of the UserDecryptResponseVerification structure. */ function _hashUserDecryptResponseVerification( - UserDecryptResponseVerification memory userDecryptResponseVerification + UserDecryptionPayload memory userDecryptionPayload, + bytes memory userDecryptedShare, + bytes memory extraData ) internal view virtual returns (bytes32) { return _hashTypedDataV4( keccak256( abi.encode( EIP712_USER_DECRYPT_RESPONSE_TYPE_HASH, - keccak256(userDecryptResponseVerification.publicKey), - keccak256(abi.encodePacked(userDecryptResponseVerification.ctHandles)), - keccak256(userDecryptResponseVerification.userDecryptedShare), - keccak256(abi.encodePacked(userDecryptResponseVerification.extraData)) + keccak256(userDecryptionPayload.publicKey), + keccak256(abi.encodePacked(userDecryptionPayload.ctHandles)), + keccak256(userDecryptedShare), + keccak256(abi.encodePacked(extraData)) ) ) ); diff --git a/gateway-contracts/contracts/GatewayConfig.sol b/gateway-contracts/contracts/GatewayConfig.sol index 1d997ea01a..3383f63ff4 100644 --- a/gateway-contracts/contracts/GatewayConfig.sol +++ b/gateway-contracts/contracts/GatewayConfig.sol @@ -10,12 +10,12 @@ import { Decryption } from "./Decryption.sol"; import { InputVerification } from "./InputVerification.sol"; import { UUPSUpgradeableEmptyProxy } from "./shared/UUPSUpgradeableEmptyProxy.sol"; import { Pausable } from "./shared/Pausable.sol"; -import { ProtocolMetadata, HostChain, Coprocessor, Custodian, KmsNode } from "./shared/Structs.sol"; +import { ProtocolMetadata, HostChain, CoprocessorV1, Custodian, KmsNode } from "./shared/Structs.sol"; /** * @title GatewayConfig contract * @notice See {IGatewayConfig}. - * @dev Add/remove methods will be added in the future for KMS nodes, coprocessors and host chains. + * @dev Add/remove methods will be added in the future for KMS nodes, host chains. * See https://github.com/zama-ai/fhevm-gateway/issues/98 for more details. */ contract GatewayConfig is IGatewayConfig, Ownable2StepUpgradeable, UUPSUpgradeableEmptyProxy { @@ -35,7 +35,7 @@ contract GatewayConfig is IGatewayConfig, Ownable2StepUpgradeable, UUPSUpgradeab */ string private constant CONTRACT_NAME = "GatewayConfig"; uint256 private constant MAJOR_VERSION = 0; - uint256 private constant MINOR_VERSION = 1; + uint256 private constant MINOR_VERSION = 2; uint256 private constant PATCH_VERSION = 0; /** @@ -44,7 +44,7 @@ contract GatewayConfig is IGatewayConfig, Ownable2StepUpgradeable, UUPSUpgradeab * This constant does not represent the number of time a specific contract have been upgraded, * as a contract deployed from version VX will have a REINITIALIZER_VERSION > 2. */ - uint64 private constant REINITIALIZER_VERSION = 2; + uint64 private constant REINITIALIZER_VERSION = 3; /** * @notice The address of the all gateway contracts @@ -83,18 +83,18 @@ contract GatewayConfig is IGatewayConfig, Ownable2StepUpgradeable, UUPSUpgradeab /// @notice The threshold to consider for user decryption consensus uint256 userDecryptionThreshold; // ---------------------------------------------------------------------------------------------- - // Coprocessors state variables: + // Coprocessors state variables (DEPRECATED): // ---------------------------------------------------------------------------------------------- - /// @notice The coprocessors' transaction sender addresses - mapping(address coprocessorTxSenderAddress => bool isTxSender) isCoprocessorTxSender; - /// @notice The coprocessors' signer addresses - mapping(address coprocessorSignerAddress => bool isSigner) isCoprocessorSigner; - /// @notice The coprocessors' metadata - mapping(address coprocessorTxSenderAddress => Coprocessor coprocessor) coprocessors; - /// @notice The coprocessors' transaction sender address list - address[] coprocessorTxSenderAddresses; - /// @notice The coprocessors' signer address list - address[] coprocessorSignerAddresses; + /// @notice DEPRECATED: coprocessors are stored in `CoprocessorContexts` contract + mapping(address coprocessorTxSenderAddress => bool isTxSender) isCoprocessorTxSender; // DEPRECATED + /// @notice DEPRECATED: coprocessors are stored in `CoprocessorContexts` contract + mapping(address coprocessorSignerAddress => bool isSigner) isCoprocessorSigner; // DEPRECATED + /// @notice DEPRECATED: coprocessors are stored in `CoprocessorContexts` contract + mapping(address coprocessorTxSenderAddress => CoprocessorV1 coprocessor) coprocessors; // DEPRECATED + /// @notice DEPRECATED: coprocessors are stored in `CoprocessorContexts` contract + address[] coprocessorTxSenderAddresses; // DEPRECATED + /// @notice DEPRECATED: coprocessors are stored in `CoprocessorContexts` contract + address[] coprocessorSignerAddresses; // DEPRECATED // ---------------------------------------------------------------------------------------------- // Host chain state variables: // ---------------------------------------------------------------------------------------------- @@ -148,7 +148,6 @@ contract GatewayConfig is IGatewayConfig, Ownable2StepUpgradeable, UUPSUpgradeab * @param initialUserDecryptionThreshold The user decryption threshold * @param initialKmsGenThreshold The KMS generation threshold * @param initialKmsNodes List of KMS nodes - * @param initialCoprocessors List of coprocessors * @param initialCustodians List of custodians */ /// @custom:oz-upgrades-validate-as-initializer @@ -159,7 +158,6 @@ contract GatewayConfig is IGatewayConfig, Ownable2StepUpgradeable, UUPSUpgradeab uint256 initialUserDecryptionThreshold, uint256 initialKmsGenThreshold, KmsNode[] memory initialKmsNodes, - Coprocessor[] memory initialCoprocessors, Custodian[] memory initialCustodians ) public virtual onlyFromEmptyProxy reinitializer(REINITIALIZER_VERSION) { __Ownable_init(owner()); @@ -168,10 +166,6 @@ contract GatewayConfig is IGatewayConfig, Ownable2StepUpgradeable, UUPSUpgradeab revert EmptyKmsNodes(); } - if (initialCoprocessors.length == 0) { - revert EmptyCoprocessors(); - } - if (initialCustodians.length == 0) { revert EmptyCustodians(); } @@ -195,15 +189,6 @@ contract GatewayConfig is IGatewayConfig, Ownable2StepUpgradeable, UUPSUpgradeab _setUserDecryptionThreshold(initialUserDecryptionThreshold); _setKmsGenThreshold(initialKmsGenThreshold); - // Register the coprocessors - for (uint256 i = 0; i < initialCoprocessors.length; i++) { - $.isCoprocessorTxSender[initialCoprocessors[i].txSenderAddress] = true; - $.coprocessors[initialCoprocessors[i].txSenderAddress] = initialCoprocessors[i]; - $.coprocessorTxSenderAddresses.push(initialCoprocessors[i].txSenderAddress); - $.isCoprocessorSigner[initialCoprocessors[i].signerAddress] = true; - $.coprocessorSignerAddresses.push(initialCoprocessors[i].signerAddress); - } - // Register the custodians for (uint256 i = 0; i < initialCustodians.length; i++) { $.custodians[initialCustodians[i].txSenderAddress] = initialCustodians[i]; @@ -213,22 +198,15 @@ contract GatewayConfig is IGatewayConfig, Ownable2StepUpgradeable, UUPSUpgradeab $.isCustodianSigner[initialCustodians[i].signerAddress] = true; } - emit InitializeGatewayConfig( - initialMetadata, - initialMpcThreshold, - initialKmsNodes, - initialCoprocessors, - initialCustodians - ); + emit InitializeGatewayConfig(initialMetadata, initialMpcThreshold, initialKmsNodes, initialCustodians); } /** * @notice Re-initializes the contract from V1. - * @dev Define a `reinitializeVX` function once the contract needs to be upgraded. */ /// @custom:oz-upgrades-unsafe-allow missing-initializer-call /// @custom:oz-upgrades-validate-as-initializer - // function reinitializeV2() public virtual reinitializer(REINITIALIZER_VERSION) {} + function reinitializeV2() public virtual reinitializer(REINITIALIZER_VERSION) {} /** * @notice See {IGatewayConfig-isPauser}. @@ -327,22 +305,6 @@ contract GatewayConfig is IGatewayConfig, Ownable2StepUpgradeable, UUPSUpgradeab return $.isKmsSigner[signerAddress]; } - /** - * @notice See {IGatewayConfig-isCoprocessorTxSender}. - */ - function isCoprocessorTxSender(address txSenderAddress) external view virtual returns (bool) { - GatewayConfigStorage storage $ = _getGatewayConfigStorage(); - return $.isCoprocessorTxSender[txSenderAddress]; - } - - /** - * @notice See {IGatewayConfig-isCoprocessorSigner}. - */ - function isCoprocessorSigner(address signerAddress) external view virtual returns (bool) { - GatewayConfigStorage storage $ = _getGatewayConfigStorage(); - return $.isCoprocessorSigner[signerAddress]; - } - /** * @notice See {IGatewayConfig-isCustodianTxSender}. */ @@ -407,14 +369,6 @@ contract GatewayConfig is IGatewayConfig, Ownable2StepUpgradeable, UUPSUpgradeab return $.kmsGenThreshold; } - /** - * @notice See {IGatewayConfig-getCoprocessorMajorityThreshold}. - */ - function getCoprocessorMajorityThreshold() external view virtual returns (uint256) { - GatewayConfigStorage storage $ = _getGatewayConfigStorage(); - return $.coprocessorTxSenderAddresses.length / 2 + 1; - } - /** * @notice See {IGatewayConfig-getKmsNode}. */ @@ -439,30 +393,6 @@ contract GatewayConfig is IGatewayConfig, Ownable2StepUpgradeable, UUPSUpgradeab return $.kmsSignerAddresses; } - /** - * @notice See {IGatewayConfig-getCoprocessor}. - */ - function getCoprocessor(address coprocessorTxSenderAddress) external view virtual returns (Coprocessor memory) { - GatewayConfigStorage storage $ = _getGatewayConfigStorage(); - return $.coprocessors[coprocessorTxSenderAddress]; - } - - /** - * @notice See {IGatewayConfig-getCoprocessorTxSenders}. - */ - function getCoprocessorTxSenders() external view virtual returns (address[] memory) { - GatewayConfigStorage storage $ = _getGatewayConfigStorage(); - return $.coprocessorTxSenderAddresses; - } - - /** - * @notice See {IGatewayConfig-getCoprocessorSigners}. - */ - function getCoprocessorSigners() external view virtual returns (address[] memory) { - GatewayConfigStorage storage $ = _getGatewayConfigStorage(); - return $.coprocessorSignerAddresses; - } - /** * @notice See {IGatewayConfig-getHostChain}. */ diff --git a/gateway-contracts/contracts/InputVerification.sol b/gateway-contracts/contracts/InputVerification.sol index d8b2e7a4db..b277ccd2af 100644 --- a/gateway-contracts/contracts/InputVerification.sol +++ b/gateway-contracts/contracts/InputVerification.sol @@ -1,17 +1,20 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear pragma solidity ^0.8.24; -import { gatewayConfigAddress } from "../addresses/GatewayAddresses.sol"; +import { gatewayConfigAddress, coprocessorContextsAddress } from "../addresses/GatewayAddresses.sol"; import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import { EIP712Upgradeable } from "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol"; import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; import { IInputVerification } from "./interfaces/IInputVerification.sol"; import { IGatewayConfig } from "./interfaces/IGatewayConfig.sol"; +import { ICoprocessorContexts } from "./interfaces/ICoprocessorContexts.sol"; import { UUPSUpgradeableEmptyProxy } from "./shared/UUPSUpgradeableEmptyProxy.sol"; import { GatewayConfigChecks } from "./shared/GatewayConfigChecks.sol"; import { Pausable } from "./shared/Pausable.sol"; import { GatewayOwnable } from "./shared/GatewayOwnable.sol"; -import { Coprocessor } from "./shared/Structs.sol"; +import { CoprocessorV2 } from "./shared/Structs.sol"; +import { ContextStatus } from "./shared/Enums.sol"; +import { ContextChecks } from "./shared/ContextChecks.sol"; /** * @title InputVerification smart contract @@ -23,26 +26,9 @@ contract InputVerification is UUPSUpgradeableEmptyProxy, GatewayOwnable, GatewayConfigChecks, - Pausable + Pausable, + ContextChecks { - /** - * @notice The typed data structure for the EIP712 signature to validate in ZK Proof verification responses. - * @dev The name of this struct is not relevant for the signature validation, only the one defined - * EIP712_ZKPOK_TYPE is, but we keep it the same for clarity. - */ - struct CiphertextVerification { - /// @notice The coprocessor's computed ciphertext handles. - bytes32[] ctHandles; - /// @notice The address of the user that has provided the input in the ZK Proof verification request. - address userAddress; - /// @notice The address of the dapp requiring the ZK Proof verification. - address contractAddress; - /// @notice The host chain's chain ID of the contract requiring the ZK Proof verification. - uint256 contractChainId; - /// @notice Generic bytes metadata for versioned payloads. First byte is for the version. - bytes extraData; - } - /** * @notice The stored structure for the received ZK Proof verification request inputs. */ @@ -56,15 +42,22 @@ contract InputVerification is } /** - * @notice The address of the GatewayConfig contract for protocol state calls. + * @notice The address of the CoprocessorContexts contract, used for fetching information about coprocessors. */ - IGatewayConfig private constant GATEWAY_CONFIG = IGatewayConfig(gatewayConfigAddress); + ICoprocessorContexts private constant COPROCESSOR_CONTEXTS = ICoprocessorContexts(coprocessorContextsAddress); /** - * @notice The definition of the CiphertextVerification structure typed data. + * @notice The typed data structure for the EIP712 signature to validate in ZK Proof verification responses. + * @dev The following fields are used for the CiphertextVerification struct: + * - ctHandles: The coprocessor's computed ciphertext handles. + * - userAddress: The address of the user that has provided the input in the ZK Proof verification request. + * - contractAddress: The address of the dapp requiring the ZK Proof verification. + * - contractChainId: The host chain's chain ID of the contract requiring the ZK Proof verification. + * - coprocessorContextId: The coprocessor context ID associated to the input verification request. + * - extraData: Generic bytes metadata for versioned payloads. First byte is for the version. */ string private constant EIP712_ZKPOK_TYPE = - "CiphertextVerification(bytes32[] ctHandles,address userAddress,address contractAddress,uint256 contractChainId,bytes extraData)"; + "CiphertextVerification(bytes32[] ctHandles,address userAddress,address contractAddress,uint256 contractChainId,uint256 coprocessorContextId,bytes extraData)"; /** * @notice The hash of the CiphertextVerification structure typed data definition used for signature validation. @@ -78,7 +71,7 @@ contract InputVerification is */ string private constant CONTRACT_NAME = "InputVerification"; uint256 private constant MAJOR_VERSION = 0; - uint256 private constant MINOR_VERSION = 1; + uint256 private constant MINOR_VERSION = 2; uint256 private constant PATCH_VERSION = 0; /** @@ -87,7 +80,7 @@ contract InputVerification is * This constant does not represent the number of time a specific contract have been upgraded, * as a contract deployed from version VX will have a REINITIALIZER_VERSION > 2. */ - uint64 private constant REINITIALIZER_VERSION = 2; + uint64 private constant REINITIALIZER_VERSION = 3; /** * @notice The contract's variable storage struct (@dev see ERC-7201) @@ -161,13 +154,10 @@ contract InputVerification is /** * @notice Re-initializes the contract from V1. - * @dev Define a `reinitializeVX` function once the contract needs to be upgraded. - /// @dev The following stored inputs are used during response calls for the EIP712 signature validation. - $.zkProofInputs[zkProofId] = ZKProofInput(contractChainId, contractAddress, userAddress); */ /// @custom:oz-upgrades-unsafe-allow missing-initializer-call /// @custom:oz-upgrades-validate-as-initializer - // function reinitializeV2() public virtual reinitializer(REINITIALIZER_VERSION) {} + function reinitializeV2() public virtual reinitializer(REINITIALIZER_VERSION) {} /** * @notice See {IInputVerification-verifyProofRequest}. @@ -178,7 +168,7 @@ contract InputVerification is address userAddress, bytes calldata ciphertextWithZKProof, bytes calldata extraData - ) external virtual onlyRegisteredHostChain(contractChainId) whenNotPaused { + ) external virtual onlyRegisteredHostChain(contractChainId) whenNotPaused refreshCoprocessorContextStatuses { InputVerificationStorage storage $ = _getInputVerificationStorage(); $.zkProofIdCounter++; @@ -187,12 +177,13 @@ contract InputVerification is // The following stored inputs are used during response calls for the EIP712 signature validation. $.zkProofInputs[zkProofId] = ZKProofInput(contractChainId, contractAddress, userAddress); - // Associate the request to coprocessor context ID 1 to anticipate their introduction in V2. - $.inputVerificationContextId[zkProofId] = 1; + // Get the current active coprocessor context's ID and associate it to this request + uint256 contextId = COPROCESSOR_CONTEXTS.getActiveCoprocessorContextId(); + $.inputVerificationContextId[zkProofId] = contextId; emit VerifyProofRequest( zkProofId, - 0, // TODO: coprocessorContextId is not used for now + contextId, contractChainId, contractAddress, userAddress, @@ -211,7 +202,7 @@ contract InputVerification is bytes32[] calldata ctHandles, bytes calldata signature, bytes calldata extraData - ) external virtual onlyCoprocessorTxSender { + ) external virtual refreshCoprocessorContextStatuses { InputVerificationStorage storage $ = _getInputVerificationStorage(); // Make sure the zkProofId corresponds to a generated ZK Proof verification request. @@ -219,28 +210,30 @@ contract InputVerification is revert VerifyProofNotRequested(zkProofId); } - // Retrieve stored ZK Proof verification request inputs. - ZKProofInput memory zkProofInput = $.zkProofInputs[zkProofId]; + // Get the coprocessor context ID associated with the input verification request + uint256 contextId = $.inputVerificationContextId[zkProofId]; - // Initialize the CiphertextVerification structure for the signature validation. - CiphertextVerification memory ciphertextVerification = CiphertextVerification( - ctHandles, - zkProofInput.userAddress, - zkProofInput.contractAddress, - zkProofInput.contractChainId, - extraData - ); + // Only accept coprocessor transaction senders from this context + _checkIsCoprocessorTxSender(contextId, msg.sender); - // Compute the digest of the CiphertextVerification structure. - bytes32 digest = _hashCiphertextVerification(ciphertextVerification); + // Check that the context is still valid (active or suspended) + if (!COPROCESSOR_CONTEXTS.isCoprocessorContextOperating(contextId)) { + ContextStatus contextStatus = COPROCESSOR_CONTEXTS.getCoprocessorContextStatus(contextId); + revert InvalidCoprocessorContextProofVerification(zkProofId, contextId, contextStatus); + } + + // Compute the digest of the CiphertextVerification struct. + bytes32 digest = _hashCiphertextVerification(zkProofId, ctHandles, contextId, extraData); // Recover the signer address from the signature, address signerAddress = ECDSA.recover(digest, signature); - // Check that the signer is a coprocessor signer. - _checkIsCoprocessorSigner(signerAddress); + // Check that the signer address is a coprocessor of the context + _checkIsCoprocessorSigner(contextId, signerAddress); // Check that the coprocessor has not already responded to the ZKPoK verification request. + // There is no need to consider the contextId here because there is only one associated to + // each zkProofId (through the `inputVerificationContextId` mapping) _checkCoprocessorAlreadyResponded(zkProofId, msg.sender, signerAddress); bytes[] storage currentSignatures = $.zkProofSignatures[zkProofId][digest]; @@ -254,7 +247,8 @@ contract InputVerification is // Send the event if and only if the consensus is reached in the current response call. // This means a "late" response will not be reverted, just ignored and no event will be emitted - if (!$.verifiedZKProofs[zkProofId] && _isConsensusReached(currentSignatures.length)) { + // Besides, consensus only considers the coprocessors of the same context + if (!$.verifiedZKProofs[zkProofId] && _isConsensusReached(contextId, currentSignatures.length)) { $.verifiedZKProofs[zkProofId] = true; // A "late" valid coprocessor could still see its transaction sender address be added to @@ -263,7 +257,7 @@ contract InputVerification is // verification request. $.verifyProofConsensusDigest[zkProofId] = digest; - emit VerifyProofResponse(zkProofId, ctHandles, currentSignatures); + emit VerifyProofResponse(zkProofId, contextId, ctHandles, currentSignatures, extraData); } } @@ -272,8 +266,8 @@ contract InputVerification is */ function rejectProofResponse( uint256 zkProofId, - bytes calldata /* extraData */ - ) external virtual onlyCoprocessorTxSender { + bytes calldata extraData + ) external virtual refreshCoprocessorContextStatuses { InputVerificationStorage storage $ = _getInputVerificationStorage(); // Make sure the zkProofId corresponds to a generated ZK Proof verification request. @@ -281,17 +275,31 @@ contract InputVerification is revert VerifyProofNotRequested(zkProofId); } + // Get the coprocessor context ID associated with the input verification request + uint256 contextId = $.inputVerificationContextId[zkProofId]; + + // Only accept coprocessor transaction senders from this context + _checkIsCoprocessorTxSender(contextId, msg.sender); + + // Check that the context is still valid (active or suspended) + if (!COPROCESSOR_CONTEXTS.isCoprocessorContextOperating(contextId)) { + ContextStatus contextStatus = COPROCESSOR_CONTEXTS.getCoprocessorContextStatus(contextId); + revert InvalidCoprocessorContextProofRejection(zkProofId, contextId, contextStatus); + } + /** - * @dev Retrieve the coprocessor signer address from the GatewayConfig contract using the - * coprocessor transaction sender address. + * @dev Retrieve the coprocessor signer address from the context using the coprocessor + * transaction sender address. * Extracting the signer address is important in order to prevent potential issues with re-org, as this could * lead to situations where a coprocessor can both verify and reject a proof, which is forbidden. This check * is directly done within `_checkCoprocessorAlreadyResponded` below. */ - Coprocessor memory coprocessor = GATEWAY_CONFIG.getCoprocessor(msg.sender); + CoprocessorV2 memory coprocessor = COPROCESSOR_CONTEXTS.getCoprocessor(contextId, msg.sender); address coprocessorSignerAddress = coprocessor.signerAddress; // Check that the coprocessor has not already responded to the ZKPoK verification request. + // There is no need to consider the contextId here because there is only one associated to + // zkProofId _checkCoprocessorAlreadyResponded(zkProofId, msg.sender, coprocessorSignerAddress); $.rejectedProofResponseCounter[zkProofId]++; @@ -304,10 +312,13 @@ contract InputVerification is // Send the event if and only if the consensus is reached in the current response call. // This means a "late" response will not be reverted, just ignored and no event will be emitted - if (!$.rejectedZKProofs[zkProofId] && _isConsensusReached($.rejectedProofResponseCounter[zkProofId])) { + // Besides, consensus only considers the coprocessors of the same context + if ( + !$.rejectedZKProofs[zkProofId] && _isConsensusReached(contextId, $.rejectedProofResponseCounter[zkProofId]) + ) { $.rejectedZKProofs[zkProofId] = true; - emit RejectProofResponse(zkProofId); + emit RejectProofResponse(zkProofId, extraData); } } @@ -400,34 +411,46 @@ contract InputVerification is /** * @notice Computes the hash of a given CiphertextVerification structured data - * @param ctVerification The CiphertextVerification structure + * @param zkProofId The ID of the ZK Proof. + * @param ctHandles The coprocessor's computed ciphertext handles. + * @param extraData Generic bytes metadata for versioned payloads. First byte is for the version. * @return The hash of the CiphertextVerification structure */ function _hashCiphertextVerification( - CiphertextVerification memory ctVerification + uint256 zkProofId, + bytes32[] memory ctHandles, + uint256 contextId, + bytes memory extraData ) internal view virtual returns (bytes32) { + InputVerificationStorage storage $ = _getInputVerificationStorage(); + + // Retrieve stored ZK Proof verification request inputs. + ZKProofInput memory zkProofInput = $.zkProofInputs[zkProofId]; + return _hashTypedDataV4( keccak256( abi.encode( EIP712_ZKPOK_TYPE_HASH, - keccak256(abi.encodePacked(ctVerification.ctHandles)), - ctVerification.userAddress, - ctVerification.contractAddress, - ctVerification.contractChainId, - keccak256(abi.encodePacked(ctVerification.extraData)) + keccak256(abi.encodePacked(ctHandles)), + zkProofInput.userAddress, + zkProofInput.contractAddress, + zkProofInput.contractChainId, + contextId, + keccak256(abi.encodePacked(extraData)) ) ) ); } /** - * @notice Checks if the consensus is reached among the coprocessors. + * @notice Checks if the consensus is reached among the coprocessors from the same context. + * @param contextId The coprocessor context ID * @param coprocessorCounter The number of coprocessors that agreed * @return Whether the consensus is reached */ - function _isConsensusReached(uint256 coprocessorCounter) internal view virtual returns (bool) { - uint256 consensusThreshold = GATEWAY_CONFIG.getCoprocessorMajorityThreshold(); + function _isConsensusReached(uint256 contextId, uint256 coprocessorCounter) internal view virtual returns (bool) { + uint256 consensusThreshold = COPROCESSOR_CONTEXTS.getCoprocessorMajorityThreshold(contextId); return coprocessorCounter >= consensusThreshold; } diff --git a/gateway-contracts/contracts/MultichainACL.sol b/gateway-contracts/contracts/MultichainACL.sol index 17a11aaacf..7cb30147f6 100644 --- a/gateway-contracts/contracts/MultichainACL.sol +++ b/gateway-contracts/contracts/MultichainACL.sol @@ -1,24 +1,33 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear pragma solidity ^0.8.24; -import { gatewayConfigAddress } from "../addresses/GatewayAddresses.sol"; +import { gatewayConfigAddress, coprocessorContextsAddress } from "../addresses/GatewayAddresses.sol"; import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; import { IMultichainACL } from "./interfaces/IMultichainACL.sol"; import { ICiphertextCommits } from "./interfaces/ICiphertextCommits.sol"; +import { ICoprocessorContexts } from "./interfaces/ICoprocessorContexts.sol"; import { IGatewayConfig } from "./interfaces/IGatewayConfig.sol"; import { UUPSUpgradeableEmptyProxy } from "./shared/UUPSUpgradeableEmptyProxy.sol"; import { GatewayConfigChecks } from "./shared/GatewayConfigChecks.sol"; import { GatewayOwnable } from "./shared/GatewayOwnable.sol"; +import { ContextStatus } from "./shared/Enums.sol"; +import { ContextChecks } from "./shared/ContextChecks.sol"; /** * @title MultichainACL smart contract * @notice See {IMultichainACL} */ -contract MultichainACL is IMultichainACL, UUPSUpgradeableEmptyProxy, GatewayOwnable, GatewayConfigChecks { +contract MultichainACL is + IMultichainACL, + UUPSUpgradeableEmptyProxy, + GatewayOwnable, + GatewayConfigChecks, + ContextChecks +{ /** - * @notice The address of the GatewayConfig contract for protocol state calls. + * @notice The address of the CoprocessorContexts contract, used for fetching information about coprocessors. */ - IGatewayConfig private constant GATEWAY_CONFIG = IGatewayConfig(gatewayConfigAddress); + ICoprocessorContexts private constant COPROCESSOR_CONTEXTS = ICoprocessorContexts(coprocessorContextsAddress); /** * @dev The following constants are used for versioning the contract. They are made private @@ -27,7 +36,7 @@ contract MultichainACL is IMultichainACL, UUPSUpgradeableEmptyProxy, GatewayOwna */ string private constant CONTRACT_NAME = "MultichainACL"; uint256 private constant MAJOR_VERSION = 0; - uint256 private constant MINOR_VERSION = 1; + uint256 private constant MINOR_VERSION = 2; uint256 private constant PATCH_VERSION = 0; /** @@ -36,7 +45,7 @@ contract MultichainACL is IMultichainACL, UUPSUpgradeableEmptyProxy, GatewayOwna * This constant does not represent the number of time a specific contract have been upgraded, * as a contract deployed from version VX will have a REINITIALIZER_VERSION > 2. */ - uint64 private constant REINITIALIZER_VERSION = 2; + uint64 private constant REINITIALIZER_VERSION = 3; /** * @notice The contract's variable storage struct (@dev see ERC-7201) @@ -85,11 +94,10 @@ contract MultichainACL is IMultichainACL, UUPSUpgradeableEmptyProxy, GatewayOwna /** * @notice Re-initializes the contract from V1. - * @dev Define a `reinitializeVX` function once the contract needs to be upgraded. */ /// @custom:oz-upgrades-unsafe-allow missing-initializer-call /// @custom:oz-upgrades-validate-as-initializer - // function reinitializeV2() public virtual reinitializer(REINITIALIZER_VERSION) {} + function reinitializeV2() external reinitializer(REINITIALIZER_VERSION) {} /** * @notice See {IMultichainACL-allowPublicDecrypt}. @@ -97,15 +105,31 @@ contract MultichainACL is IMultichainACL, UUPSUpgradeableEmptyProxy, GatewayOwna function allowPublicDecrypt( bytes32 ctHandle, bytes calldata /* extraData */ - ) external virtual onlyCoprocessorTxSender onlyHandleFromRegisteredHostChain(ctHandle) { + ) external virtual onlyHandleFromRegisteredHostChain(ctHandle) refreshCoprocessorContextStatuses { MultichainACLStorage storage $ = _getMultichainACLStorage(); - // Associate the ctHandle to coprocessor context ID 1 to anticipate their introduction in V2. - // Only set the context ID if it hasn't been set yet to avoid multiple identical SSTOREs. - if ($.allowContextId[ctHandle] == 0) { - $.allowContextId[ctHandle] = 1; + // Get the context ID from the allow public decryption context ID mapping + // This ID may be 0 (invalid) if this is the first allowPublicDecrypt call for this + // addCiphertextHash (see right below) + uint256 contextId = $.allowContextId[ctHandle]; + + // If the context ID is null, get the active coprocessor context's ID and associate it to + // this public decryption allow + if (contextId == 0) { + contextId = COPROCESSOR_CONTEXTS.getActiveCoprocessorContextId(); + $.allowContextId[ctHandle] = contextId; + + // Else, that means a coprocessor already started to allow the public decryption and we need + // to check that the context is active or suspended + // If it is not, that means the context is no longer valid for this operation and we revert + } else if (!COPROCESSOR_CONTEXTS.isCoprocessorContextOperating(contextId)) { + ContextStatus contextStatus = COPROCESSOR_CONTEXTS.getCoprocessorContextStatus(contextId); + revert InvalidCoprocessorContextAllowPublicDecrypt(ctHandle, contextId, contextStatus); } + // Only accept coprocessor transaction senders from the same context + _checkIsCoprocessorTxSender(contextId, msg.sender); + // Check if the coprocessor has already allowed the ciphertext handle for public decryption. // A Coprocessor can only allow once for a given ctHandle, so it's not possible for it to allow // the same ctHandle for different host chains, hence the chain ID is not included in the mapping. @@ -122,7 +146,8 @@ contract MultichainACL is IMultichainACL, UUPSUpgradeableEmptyProxy, GatewayOwna // Send the event if and only if the consensus is reached in the current response call. // This means a "late" response will not be reverted, just ignored and no event will be emitted - if (!$.isAllowed[ctHandle] && _isConsensusReached($.allowCounters[ctHandle])) { + // Besides, consensus only considers the coprocessors of the same context + if (!$.isAllowed[ctHandle] && _isConsensusReached(contextId, $.allowCounters[ctHandle])) { $.isAllowed[ctHandle] = true; emit AllowPublicDecrypt(ctHandle); } @@ -135,18 +160,34 @@ contract MultichainACL is IMultichainACL, UUPSUpgradeableEmptyProxy, GatewayOwna bytes32 ctHandle, address accountAddress, bytes calldata /* extraData */ - ) external virtual onlyCoprocessorTxSender onlyHandleFromRegisteredHostChain(ctHandle) { + ) external virtual onlyHandleFromRegisteredHostChain(ctHandle) refreshCoprocessorContextStatuses { MultichainACLStorage storage $ = _getMultichainACLStorage(); // Compute the hash of the allow call, unique across all types of allow calls. bytes32 allowHash = _getAllowAccountHash(ctHandle, accountAddress); - // Associate the allowHash to coprocessor context ID 1 to anticipate their introduction in V2. - // Only set the context ID if it hasn't been set yet to avoid multiple identical SSTOREs. - if ($.allowContextId[allowHash] == 0) { - $.allowContextId[allowHash] = 1; + // Get the context ID from the allow account context ID mapping + // This ID may be 0 (invalid) if this is the first allowAccount call for this + // addCiphertextHash (see right below) + uint256 contextId = $.allowContextId[allowHash]; + + // If the context ID is null, get the active coprocessor context's ID and associate it to + // this account allow + if (contextId == 0) { + contextId = COPROCESSOR_CONTEXTS.getActiveCoprocessorContextId(); + $.allowContextId[allowHash] = contextId; + + // Else, that means a coprocessor already started to allow the account and we need to check + // that the context is active or suspended + // If it is not, that means the context is no longer valid for this operation and we revert + } else if (!COPROCESSOR_CONTEXTS.isCoprocessorContextOperating(contextId)) { + ContextStatus contextStatus = COPROCESSOR_CONTEXTS.getCoprocessorContextStatus(contextId); + revert InvalidCoprocessorContextAllowAccount(ctHandle, accountAddress, contextId, contextStatus); } + // Only accept coprocessor transaction senders from the same context + _checkIsCoprocessorTxSender(contextId, msg.sender); + // Check if the coprocessor has already allowed the account to use the ciphertext handle. // A Coprocessor can only allow once for a given ctHandle, so it's not possible for it to allow // the same ctHandle for different host chains, hence the chain ID is not included in the mapping. @@ -163,7 +204,7 @@ contract MultichainACL is IMultichainACL, UUPSUpgradeableEmptyProxy, GatewayOwna // Send the event if and only if the consensus is reached in the current response call. // This means a "late" response will not be reverted, just ignored and no event will be emitted - if (!$.isAllowed[allowHash] && _isConsensusReached($.allowCounters[allowHash])) { + if (!$.isAllowed[allowHash] && _isConsensusReached(contextId, $.allowCounters[allowHash])) { $.isAllowed[allowHash] = true; emit AllowAccount(ctHandle, accountAddress); } @@ -237,12 +278,13 @@ contract MultichainACL is IMultichainACL, UUPSUpgradeableEmptyProxy, GatewayOwna function _authorizeUpgrade(address _newImplementation) internal virtual override onlyGatewayOwner {} /** - * @notice Checks if the consensus is reached among the Coprocessors. + * @notice Checks if the consensus is reached among the coprocessors from the same context. + * @param contextId The coprocessor context ID * @param coprocessorCounter The number of coprocessors that agreed * @return Whether the consensus is reached */ - function _isConsensusReached(uint256 coprocessorCounter) internal view virtual returns (bool) { - uint256 consensusThreshold = GATEWAY_CONFIG.getCoprocessorMajorityThreshold(); + function _isConsensusReached(uint256 contextId, uint256 coprocessorCounter) internal view virtual returns (bool) { + uint256 consensusThreshold = COPROCESSOR_CONTEXTS.getCoprocessorMajorityThreshold(contextId); return coprocessorCounter >= consensusThreshold; } diff --git a/gateway-contracts/contracts/examples/CoprocessorContextsV2Example.sol b/gateway-contracts/contracts/examples/CoprocessorContextsV2Example.sol new file mode 100644 index 0000000000..28ba9e8b12 --- /dev/null +++ b/gateway-contracts/contracts/examples/CoprocessorContextsV2Example.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: BSD-3-Clause-Clear + +pragma solidity ^0.8.24; + +import "../CoprocessorContexts.sol"; + +contract CoprocessorContextsV2Example is CoprocessorContexts { + /// @notice Name of the contract + string private constant CONTRACT_NAME = "CoprocessorContexts"; + + /// @notice Version of the contract + uint256 private constant MAJOR_VERSION = 1000; + uint256 private constant MINOR_VERSION = 0; + uint256 private constant PATCH_VERSION = 0; + + /// @notice Getter for the name and version of the contract + /// @return string representing the name and the version of the contract + function getVersion() external pure virtual override returns (string memory) { + return + string( + abi.encodePacked( + CONTRACT_NAME, + " v", + Strings.toString(MAJOR_VERSION), + ".", + Strings.toString(MINOR_VERSION), + ".", + Strings.toString(PATCH_VERSION) + ) + ); + } +} diff --git a/gateway-contracts/contracts/interfaces/ICiphertextCommits.sol b/gateway-contracts/contracts/interfaces/ICiphertextCommits.sol index d564b7c97e..692bea7e0e 100644 --- a/gateway-contracts/contracts/interfaces/ICiphertextCommits.sol +++ b/gateway-contracts/contracts/interfaces/ICiphertextCommits.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.24; import "../shared/Structs.sol"; +import { ContextStatus } from "../shared/Enums.sol"; /** * @title Interface for the CiphertextCommits contract. @@ -13,16 +14,24 @@ interface ICiphertextCommits { * @param ctHandle The handle of the added ciphertext material. * @param ciphertextDigest The digest of the regular ciphertext. * @param snsCiphertextDigest The digest of the SNS ciphertext. - * @param coprocessorTxSenders The list of coprocessor transaction sender addresses - * that were part of the consensus when adding the ciphertext material. + * @param coprocessorContextId The context ID of the coprocessor that was part of the consensus. */ event AddCiphertextMaterial( bytes32 indexed ctHandle, bytes32 ciphertextDigest, bytes32 snsCiphertextDigest, - address[] coprocessorTxSenders + uint256 coprocessorContextId ); + /** + * @notice Error indicating that the coprocessor context is no longer valid for adding the ciphertext material. + * A context is valid if it is active or suspended. + * @param ctHandle The handle of the ciphertext. + * @param contextId The context ID of the coprocessor. + * @param contextStatus The status of the coprocessor context. + */ + error InvalidCoprocessorContextAddCiphertext(bytes32 ctHandle, uint256 contextId, ContextStatus contextStatus); + /** * @notice Error indicating that the given coprocessor transaction sender has already added the handle. * @param ctHandle The handle of the already added ciphertext. @@ -53,14 +62,14 @@ interface ICiphertextCommits { ) external; /** - * @notice Retrieves the list of regular ciphertext materials for the given handles. + * @notice Retrieves the list of regular ciphertext materials associated to the handles. * @param ctHandles The list of handles to retrieve. * @return The list of regular ciphertext digests, its handles and its key IDs. */ function getCiphertextMaterials(bytes32[] calldata ctHandles) external view returns (CiphertextMaterial[] memory); /** - * @notice Retrieves the list of Switch and Squash (SNS) ciphertext materials for the given handles. + * @notice Retrieves the list of Switch and Squash (SNS) ciphertext materials associated to the handles. * @param ctHandles The list of handles to retrieve. * @return The list of SNS ciphertext digests, its handles and its key IDs. */ @@ -76,11 +85,14 @@ interface ICiphertextCommits { /** * @notice Returns the coprocessor transaction sender addresses that were involved in the consensus - * for an add ciphertext material. + * for an add ciphertext material and a contextId. Also indicates if the consensus has been reached. * @param ctHandle The handle to retrieve the coprocessor transaction sender addresses for. - * @return The list of coprocessor transaction sender addresses. + * @return The list of coprocessor transaction sender addresses, the context ID associated to the + * consensus and whether the consensus has been reached. */ - function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external view returns (address[] memory); + function getConsensusCoprocessorTxSenders( + bytes32 ctHandle + ) external view returns (address[] memory, uint256 contextId, bool); /** * @notice Returns the versions of the CiphertextCommits contract in SemVer format. diff --git a/gateway-contracts/contracts/interfaces/ICoprocessorContexts.sol b/gateway-contracts/contracts/interfaces/ICoprocessorContexts.sol new file mode 100644 index 0000000000..7a315af824 --- /dev/null +++ b/gateway-contracts/contracts/interfaces/ICoprocessorContexts.sol @@ -0,0 +1,320 @@ +// SPDX-License-Identifier: BSD-3-Clause-Clear +pragma solidity ^0.8.24; + +import { CoprocessorV2, CoprocessorContextTimePeriods, CoprocessorContext } from "../shared/Structs.sol"; +import { ContextStatus } from "../shared/Enums.sol"; + +/** + * @title Interface for the CoprocessorContexts contract. + * @notice The CoprocessorContexts contract is responsible for being a point of truth for all contracts + * regarding coprocessors to consider in the protocol. + * + * The CoprocessorContexts contract has an owner. + * The owner can call some restricted functions, such as adding coprocessor contexts. + * Some view functions are accessible to everyone (ex: getting the active coprocessors). + */ +interface ICoprocessorContexts { + /** + * @notice Emitted when the CoprocessorContexts initialization is completed. + * @param blob The blob. + * @param coprocessors The coprocessors. + */ + event InitializeCoprocessorContexts(bytes blob, CoprocessorV2[] coprocessors); + + /** + * @notice Emitted when a new coprocessor context has been suggested to be added. + * This does not mean that the new coprocessor context is already active, it is mostly to better + * track coprocessor context updates. + * @param activeCoprocessorContext The current active coprocessor context. + * @param newCoprocessorContext The new coprocessor context. + * @param timePeriods The time periods for the new coprocessor context. + */ + event NewCoprocessorContext( + CoprocessorContext activeCoprocessorContext, + CoprocessorContext newCoprocessorContext, + CoprocessorContextTimePeriods timePeriods + ); + + /** + * @notice Emitted when a new coprocessor context gets pre-activated. + * @param newCoprocessorContext The new coprocessor context. + * @param activationBlockTimestamp The block timestamp at which the coprocessor context will be activated. + */ + event PreActivateCoprocessorContext(CoprocessorContext newCoprocessorContext, uint256 activationBlockTimestamp); + + /** + * @notice Emitted when a coprocessor context gets suspended. + * @param contextId The ID of the coprocessor context. + * @param deactivatedBlockTimestamp The block timestamp at which the coprocessor context will be deactivated. + */ + event SuspendCoprocessorContext(uint256 contextId, uint256 deactivatedBlockTimestamp); + + /** + * @notice Emitted when a coprocessor context gets activated. + * @param contextId The ID of the coprocessor context. + */ + event ActivateCoprocessorContext(uint256 contextId); + + /** + * @notice Emitted when a coprocessor context gets deactivated. + * @param contextId The ID of the coprocessor context. + */ + event DeactivateCoprocessorContext(uint256 contextId); + + /** + * @notice Emitted when a coprocessor context gets compromised. + * @param contextId The ID of the coprocessor context. + */ + event CompromiseCoprocessorContext(uint256 contextId); + + /** + * @notice Emitted when a coprocessor context gets destroyed. + * @param contextId The ID of the coprocessor context. + */ + event DestroyCoprocessorContext(uint256 contextId); + + /** + * @notice Error indicating that the coprocessor context is not initialized. + * @param contextId The ID of the coprocessor context. + */ + error CoprocessorContextNotInitialized(uint256 contextId); + + /** + * @notice Error indicating that the list of coprocessors to register in the context is empty. + */ + error EmptyCoprocessors(); + + /** + * @notice Error indicating that the list of coprocessors in the context to register has at + * least one coprocessor with a null transaction sender address. + * @param coprocessorIndex The index of the coprocessor in the coprocessors list. + * @param coprocessors The list of coprocessors to register in the context. + */ + error NullCoprocessorTxSenderAddress(uint256 coprocessorIndex, CoprocessorV2[] coprocessors); + + /** + * @notice Error indicating that the list of coprocessors in the context to register has at + * least one coprocessor with a null signer address. + * @param coprocessorIndex The index of the coprocessor in the coprocessors list. + * @param coprocessors The list of coprocessors to register in the context. + */ + error NullCoprocessorSignerAddress(uint256 coprocessorIndex, CoprocessorV2[] coprocessors); + + /** + * @notice Error indicating that the list of coprocessors in the context to register has at + * least two coprocessors with the same transaction sender address. + * @param txSenderAddress The first transaction sender address that is not unique. + * @param coprocessorIndex The index of the first coprocessor with the same transaction sender address as another one. + * @param coprocessors The list of coprocessors to register in the context. + */ + error CoprocessorTxSenderAddressesNotUnique( + address txSenderAddress, + uint256 coprocessorIndex, + CoprocessorV2[] coprocessors + ); + + /** + * @notice Error indicating that the list of coprocessors in the context to register has at + * least two coprocessors with the same signer address. + * @param signerAddress The first signer address that is not unique. + * @param coprocessorIndex The index of the first coprocessor with the same signer address as another one. + * @param coprocessors The list of coprocessors to register in the context. + */ + error CoprocessorSignerAddressesNotUnique( + address signerAddress, + uint256 coprocessorIndex, + CoprocessorV2[] coprocessors + ); + + /** + * @notice Error indicating that there is no pre-activation coprocessor context. + */ + error NoPreActivationCoprocessorContext(); + + /** + * @notice Error indicating that there is no suspended coprocessor context. + */ + error NoSuspendedCoprocessorContext(); + + /** + * @notice Error indicating that there is no active coprocessor context. + * There should always be a single active coprocessor context defined in the gateway, as we do not + * allow manually setting active coprocessor contexts to `Compromised` or `Destroyed` states. + * We still consider some reverts to prevent any unexpected behaviors that could cause the protocol + * to behave in an unexpected manner (ex: by considering a null contextId). + */ + error NoActiveCoprocessorContext(); + + /** + * @notice Emitted when a coprocessor context status targeted for a forced update is invalid. + * This means that the status does not reflect that the context has already been added + * (ex: `NotInitialized`, `Generating`, `PreActivation`). + * @param contextId The ID of the coprocessor context. + * @param status The status that was attempted to be updated. + */ + error InvalidContextStatusForceUpdate(uint256 contextId, ContextStatus status); + + /** + * @notice Error indicating that a transaction sender address is not associated with a registered + * coprocessor within the context. + * @param contextId The coprocessor context ID. + * @param coprocessorTxSenderAddress The transaction sender address that is not associated with a registered coprocessor. + */ + error NotCoprocessorFromContext(uint256 contextId, address coprocessorTxSenderAddress); + + /** + * @notice Get the ID of the pre-activation coprocessor context. + * This function reverts if there is no pre-activation coprocessor context. + * @return The ID of the pre-activation coprocessor context. + */ + function getPreActivationCoprocessorContextId() external view returns (uint256); + + /** + * @notice Get the ID of the suspended coprocessor context. + * This function reverts if there is no suspended coprocessor context. + * @return The ID of the suspended coprocessor context. + */ + function getSuspendedCoprocessorContextId() external view returns (uint256); + + /** + * @notice Get the ID of the active coprocessor context. + * This function reverts if there is no active coprocessor context. + * @return The ID of the active coprocessor context. + */ + function getActiveCoprocessorContextId() external view returns (uint256); + + /** + * @notice Get the metadata of the active coprocessor context. + * This function reverts if there is no active coprocessor context. + * There should always be a single active coprocessor context defined in the gateway, as we do not + * allow manually setting active coprocessor contexts to `Compromised` or `Destroyed` states. + * We still consider some reverts to prevent any unexpected behaviors that could cause the protocol + * to behave in an unexpected manner (ex: by considering a null contextId). + * @return The metadata of the active coprocessor context. + */ + function getActiveCoprocessorContext() external view returns (CoprocessorContext memory); + + /** + * @notice Add a new coprocessor context. + * @param blob The blob. + * @param coprocessors The set of coprocessors representing the coprocessor context. + * @param timePeriods The time periods. + */ + function addCoprocessorContext( + bytes calldata blob, + CoprocessorV2[] calldata coprocessors, + CoprocessorContextTimePeriods calldata timePeriods + ) external; + + /** + * @notice Refresh the statuses of all coprocessor contexts. + * More precisely, this function: + * - checks if there is a pre-activation coprocessor context that should be activated (by + * checking if the pre-activation period has ended) + * - checks if there is a suspended coprocessor context that should be deactivated (by checking + * if the suspended period has ended) + */ + function refreshCoprocessorContextStatuses() external; + + /** + * @notice Manually force the status update of a coprocessor context. + * This function reverts if + * - the status update is against any of the lifecycle's rules + * - the context has not been added yet + * The following context status updates are only possible through this function: + * - Compromised + * - Destroyed + * Additionally, if a status update needs to be associated to a block timestamp, the current + * block timestamp is used (i.e., the status update is immediate) + * @param contextId The ID of the coprocessor context to update. + * @param status The status to update the coprocessor context to. + */ + function forceUpdateCoprocessorContextToStatus(uint256 contextId, ContextStatus status) external; + + /** + * @notice Swap a suspended coprocessor context with the current active one. + * This function is provided in case of emergency (ex: if a software update failed) + * @param suspendedTimePeriod The suspended time period for the active coprocessor context + */ + function swapSuspendedCoprocessorContextWithActive(uint256 suspendedTimePeriod) external; + + /** + * @notice Indicates if an address is a registered coprocessor transaction sender from a context. + * @param contextId The coprocessor context ID. + * @param txSenderAddress The address to check. + */ + function isCoprocessorTxSender(uint256 contextId, address txSenderAddress) external view returns (bool); + + /** + * @notice Indicates if an address is a registered coprocessor signer from a context. + * @param contextId The coprocessor context ID. + * @param signerAddress The address to check. + */ + function isCoprocessorSigner(uint256 contextId, address signerAddress) external view returns (bool); + + /** + * @notice Indicates if a coprocessor context is operating, i.e. it is either active or suspended. + * @param contextId The coprocessor context ID. + * @return True if the coprocessor context is active or suspended, false otherwise. + */ + function isCoprocessorContextOperating(uint256 contextId) external view returns (bool); + + /** + * @notice Get the block timestamp at which the coprocessor context is activated. + * @param contextId The coprocessor context ID. + * @return The activation block timestamp. + */ + function getCoprocessorActivationBlockTimestamp(uint256 contextId) external view returns (uint256); + + /** + * @notice Get the block timestamp at which the coprocessor context is deactivated. + * @param contextId The coprocessor context ID. + * @return The deactivation block timestamp. + */ + function getCoprocessorDeactivatedBlockTimestamp(uint256 contextId) external view returns (uint256); + + /** + * @notice Get the coprocessor majority threshold for a coprocessor context. + * @param contextId The coprocessor context ID. + * @return The coprocessor majority threshold. + */ + function getCoprocessorMajorityThreshold(uint256 contextId) external view returns (uint256); + + /** + * @notice Get the metadata of the coprocessor associated to the transaction sender within a coprocessor context. + * @param contextId The coprocessor context ID. + * @param coprocessorTxSenderAddress The signer address of the coprocessor to get. + * @return The coprocessor's metadata. + */ + function getCoprocessor( + uint256 contextId, + address coprocessorTxSenderAddress + ) external view returns (CoprocessorV2 memory); + + /** + * @notice Get the list of all coprocessors' transaction sender addresses from a context. + * @param contextId The coprocessor context ID. + * @return The list of coprocessors' transaction sender addresses from a context. + */ + function getCoprocessorTxSenders(uint256 contextId) external view returns (address[] memory); + + /** + * @notice Get the list of all coprocessors' signer addresses from a context. + * @param contextId The coprocessor context ID. + * @return The list of coprocessors' signer addresses from a context. + */ + function getCoprocessorSigners(uint256 contextId) external view returns (address[] memory); + + /** + * @notice Get the context status of a coprocessor context. + * @param contextId The coprocessor context ID. + * @return The status of the coprocessor context. + */ + function getCoprocessorContextStatus(uint256 contextId) external view returns (ContextStatus); + + /** + * @notice Returns the versions of the CoprocessorContexts contract in SemVer format. + * @dev This is conventionally used for upgrade features. + */ + function getVersion() external pure returns (string memory); +} diff --git a/gateway-contracts/contracts/interfaces/IDecryption.sol b/gateway-contracts/contracts/interfaces/IDecryption.sol index 4e09f67857..0c39a60e9e 100644 --- a/gateway-contracts/contracts/interfaces/IDecryption.sol +++ b/gateway-contracts/contracts/interfaces/IDecryption.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear pragma solidity ^0.8.24; -import "../shared/Structs.sol"; +import { CtHandleContractPair, SnsCiphertextMaterial } from "../shared/Structs.sol"; /** * @title Interface for the Decryption contract. diff --git a/gateway-contracts/contracts/interfaces/IGatewayConfig.sol b/gateway-contracts/contracts/interfaces/IGatewayConfig.sol index 8ebe07e87a..dc798d5c3e 100644 --- a/gateway-contracts/contracts/interfaces/IGatewayConfig.sol +++ b/gateway-contracts/contracts/interfaces/IGatewayConfig.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear pragma solidity ^0.8.24; -import { ProtocolMetadata, KmsNode, Coprocessor, Custodian, HostChain } from "../shared/Structs.sol"; +import { ProtocolMetadata, KmsNode, Custodian, HostChain } from "../shared/Structs.sol"; /** * @title Interface for the GatewayConfig contract. @@ -9,11 +9,10 @@ import { ProtocolMetadata, KmsNode, Coprocessor, Custodian, HostChain } from ".. * components from the fhevm Gateway. * @dev In particular, the GatewayConfig contract contains: * - the list of KMS nodes used exclusively by this fhevm Gateway - * - the list of coprocessors used exclusively by this fhevm Gateway * - the list of host chains using this fhevm Gateway * * The GatewayConfig contract has an owner and a pauser. - * The owner can call some restricted functions, such as adding or removing KMS nodes, coprocessors + * The owner can call some restricted functions, such as adding or removing KMS nodes * and host chains. * The pauser can pause all contracts. * Some view functions are accessible to everyone (ex: getting the number of KMS nodes). @@ -24,14 +23,12 @@ interface IGatewayConfig { * @param metadata Metadata of the protocol. * @param mpcThreshold The MPC threshold. * @param kmsNodes List of KMS nodes. - * @param coprocessors List of coprocessors. * @param custodians List of custodians. */ event InitializeGatewayConfig( ProtocolMetadata metadata, uint256 mpcThreshold, KmsNode[] kmsNodes, - Coprocessor[] coprocessors, Custodian[] custodians ); @@ -76,11 +73,6 @@ interface IGatewayConfig { */ error EmptyKmsNodes(); - /** - * @notice Error emitted when the coprocessors list is empty. - */ - error EmptyCoprocessors(); - /** * @notice Error emitted when the custodians list is empty. */ @@ -213,18 +205,6 @@ interface IGatewayConfig { */ function isKmsSigner(address signerAddress) external view returns (bool); - /** - * @notice Indicates if an address is a registered coprocessor transaction sender. - * @param coprocessorTxSenderAddress The address to check. - */ - function isCoprocessorTxSender(address coprocessorTxSenderAddress) external view returns (bool); - - /** - * @notice Indicates if an address is a registered coprocessor signer. - * @param signerAddress The address to check. - */ - function isCoprocessorSigner(address signerAddress) external view returns (bool); - /** * @notice Indicates if an address is a registered custodian transaction sender. * @param txSenderAddress The address to check. @@ -279,12 +259,6 @@ interface IGatewayConfig { */ function getKmsGenThreshold() external view returns (uint256); - /** - * @notice Get the coprocessor majority threshold - * @return The coprocessor majority threshold. - */ - function getCoprocessorMajorityThreshold() external view returns (uint256); - /** * @notice Get the metadata of the KMS node with the given transaction sender address. * @return The KMS node's metadata. @@ -303,24 +277,6 @@ interface IGatewayConfig { */ function getKmsSigners() external view returns (address[] memory); - /** - * @notice Get the metadata of the coprocessor with the given transaction sender address. - * @return The coprocessor's metadata. - */ - function getCoprocessor(address coprocessorTxSenderAddress) external view returns (Coprocessor memory); - - /** - * @notice Get the list of all coprocessors' transaction sender addresses currently registered. - * @return The list of coprocessors' transaction sender addresses. - */ - function getCoprocessorTxSenders() external view returns (address[] memory); - - /** - * @notice Get the list of all coprocessors' signer addresses currently registered. - * @return The list of coprocessors' signer addresses. - */ - function getCoprocessorSigners() external view returns (address[] memory); - /** * @notice Get the metadata of the host chain with the given index. * @return The host chain's metadata. diff --git a/gateway-contracts/contracts/interfaces/IInputVerification.sol b/gateway-contracts/contracts/interfaces/IInputVerification.sol index 98f3341436..6728161398 100644 --- a/gateway-contracts/contracts/interfaces/IInputVerification.sol +++ b/gateway-contracts/contracts/interfaces/IInputVerification.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear pragma solidity ^0.8.24; +import { ContextStatus } from "../shared/Enums.sol"; + /** * @title Interface for the InputVerification contract. * @notice The InputVerification contract handles Zero-Knowledge Proof of Knowledge (ZKPoK) @@ -30,16 +32,43 @@ interface IInputVerification { /** * @notice Emitted once a correct ZK Proof verification is completed. * @param zkProofId The ID of the ZK Proof. + * @param coprocessorContextId The ID of the coprocessor context. * @param ctHandles The coprocessor's computed ciphertext handles. * @param signatures The coprocessor's signature. + * @param extraData Generic bytes metadata for versioned payloads. First byte is for the version. */ - event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[] signatures); + event VerifyProofResponse( + uint256 indexed zkProofId, + uint256 indexed coprocessorContextId, + bytes32[] ctHandles, + bytes[] signatures, + bytes extraData + ); /** * @notice Emitted once an ZK Proof verification is rejected. * @param zkProofId The ID of the ZK Proof. + * @param extraData Generic bytes metadata for versioned payloads. First byte is for the version. + */ + event RejectProofResponse(uint256 indexed zkProofId, bytes extraData); + + /** + * @notice Error indicating that the coprocessor context is no longer valid for verifying the ZK Proof. + * A context is valid if it is active or suspended. + * @param zkProofId The ID of the ZK Proof. + * @param contextId The context ID of the coprocessor. + * @param contextStatus The status of the coprocessor context. + */ + error InvalidCoprocessorContextProofVerification(uint256 zkProofId, uint256 contextId, ContextStatus contextStatus); + + /** + * @notice Error indicating that the coprocessor context is no longer valid for rejecting the ZK Proof. + * A context is valid if it is active or suspended. + * @param zkProofId The ID of the ZK Proof. + * @param contextId The context ID of the coprocessor. + * @param contextStatus The status of the coprocessor context. */ - event RejectProofResponse(uint256 indexed zkProofId); + error InvalidCoprocessorContextProofRejection(uint256 zkProofId, uint256 contextId, ContextStatus contextStatus); /** * @notice Error indicating that the coprocessor has already verified the ZKPoK. diff --git a/gateway-contracts/contracts/interfaces/IMultichainACL.sol b/gateway-contracts/contracts/interfaces/IMultichainACL.sol index a651651ad8..6f9bbd9def 100644 --- a/gateway-contracts/contracts/interfaces/IMultichainACL.sol +++ b/gateway-contracts/contracts/interfaces/IMultichainACL.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.24; import "../shared/Structs.sol"; +import { ContextStatus } from "../shared/Enums.sol"; /** * @title Interface for the MultichainACL contract. @@ -21,6 +22,15 @@ interface IMultichainACL { */ event AllowPublicDecrypt(bytes32 indexed ctHandle); + /** + * @notice Error indicating that the coprocessor context is no longer valid for allowing public decryption. + * A context is valid if it is active or suspended. + * @param ctHandle The ciphertext handle that the coprocessor has already allowed access to. + * @param contextId The context ID of the coprocessor. + * @param contextStatus The status of the coprocessor context. + */ + error InvalidCoprocessorContextAllowPublicDecrypt(bytes32 ctHandle, uint256 contextId, ContextStatus contextStatus); + /** * @notice Error indicating that the coprocessor has already allowed public decryption to the ciphertext. * @param ctHandle The ciphertext handle that the coprocessor has already allowed access to. @@ -28,6 +38,22 @@ interface IMultichainACL { */ error CoprocessorAlreadyAllowedPublicDecrypt(bytes32 ctHandle, address txSender); + /** + * @notice Error indicating that the coprocessor context is no longer valid for allowing the + * account to use the ciphertext handle. + * A context is valid if it is active or suspended. + * @param ctHandle The ciphertext handle that the coprocessor has already allowed access to. + * @param accountAddress The address of the account that has already been allowed access. + * @param contextId The context ID of the coprocessor. + * @param contextStatus The status of the coprocessor context. + */ + error InvalidCoprocessorContextAllowAccount( + bytes32 ctHandle, + address accountAddress, + uint256 contextId, + ContextStatus contextStatus + ); + /** * @notice Error indicating that the coprocessor has already allowed the account to use the ciphertext handle. * @param ctHandle The ciphertext handle that the coprocessor has already allowed access to. diff --git a/gateway-contracts/contracts/libraries/ContextLifecycle.sol b/gateway-contracts/contracts/libraries/ContextLifecycle.sol new file mode 100644 index 0000000000..ccc8e21474 --- /dev/null +++ b/gateway-contracts/contracts/libraries/ContextLifecycle.sol @@ -0,0 +1,398 @@ +// SPDX-License-Identifier: BSD-3-Clause-Clear +pragma solidity ^0.8.24; + +import { ContextStatus } from "../shared/Enums.sol"; + +/** + * @title ContextLifecycle library + * @notice This library is used to manage the lifecycle of a context (of any kind). + * It implements the full logic and checks around lifecycle status updates. + */ +library ContextLifecycle { + /** + * @notice The storage struct for the context lifecycle. + * This struct keeps track of all context statuses, as well as some of the IDs per status + */ + struct ContextLifecycleStorage { + /// @notice The status of each context + mapping(uint256 => ContextStatus) contextStatuses; + /// @notice The ID of the context that is generating (at most one) + uint256 generatingContextId; + /// @notice The ID of the context that is pre-activated (at most one) + uint256 preActivationContextId; + /// @notice The ID of the context that is active (at most one) + uint256 activeContextId; + /// @notice The ID of the context that is suspended (at most one) + uint256 suspendedContextId; + /// @notice Whether the context lifecycle is initialized with a first active context + bool initialized; + } + + /** + * @notice Error indicating that the context ID is null. + */ + error InvalidNullContextId(); + + /** + * @notice Error indicating that the context ID does not exist. + */ + error ContextDoesNotExist(uint256 contextId); + + /** + * @notice Error indicating that the context ID already exists. + */ + error ContextAlreadyExists(uint256 contextId); + + /** + * @notice Error indicating that a pre-activation context is ongoing. + */ + error PreActivationContextOngoing(uint256 preActivationContextId); + + /** + * @notice Error indicating that an active context is ongoing. + */ + error ActiveContextOngoing(uint256 activeContextId); + + /** + * @notice Error indicating that a suspended context is ongoing. + */ + error SuspendedContextOngoing(uint256 suspendedContextId); + + /** + * @notice Error indicating that the context has not been generated. + */ + error ContextNotGenerated(uint256 contextId); + + /** + * @notice Error indicating that the context is not pre-activated or suspended. + */ + error ContextNotPreActivatedOrSuspended(uint256 contextId); + + /** + * @notice Error indicating that the context is not active. + */ + error ContextNotActive(uint256 contextId); + + /** + * @notice Error indicating that the context is not suspended. + */ + error ContextNotSuspended(uint256 contextId); + + /** + * @notice Error indicating that the context is generating. + */ + error ContextIsGenerating(uint256 contextId); + + /** + * @notice Error indicating that the context is active. + */ + error ContextIsActive(uint256 contextId); + + /** + * @notice Modifier to ensure that the context ID is not null (not initialized). + * @param contextId The context ID to check. + */ + modifier onlyNonNullContextId(uint256 contextId) { + if (contextId == 0) { + revert InvalidNullContextId(); + } + _; + } + + /** + * @notice Modifier to ensure that the context ID is not null (not initialized). + * @param contextId The context ID to check. + */ + modifier onlyExistingContextId(ContextLifecycleStorage storage $, uint256 contextId) { + if (isNotInitialized($, contextId)) { + revert ContextDoesNotExist(contextId); + } + _; + } + + /** + * @notice Sets the context as generating. + * @dev There can only be one generating context at a time. + * @param contextId The ID of the context to set as generating. + */ + function setGenerating( + ContextLifecycleStorage storage $, + uint256 contextId + ) internal onlyNonNullContextId(contextId) { + // Only a new context ID can be set as generating + if (!isNotInitialized($, contextId)) { + revert ContextAlreadyExists(contextId); + } + + // It is not possible to generate a new context if there is already one in pre-activation + // The union of contexts in status Generating and Pre-Activation should have size at most 1 + if ($.preActivationContextId != 0) { + revert PreActivationContextOngoing($.preActivationContextId); + } + + // It is not possible to generate a new context if there is already one suspended + if ($.suspendedContextId != 0) { + revert SuspendedContextOngoing($.suspendedContextId); + } + + $.contextStatuses[contextId] = ContextStatus.Generating; + + $.generatingContextId = contextId; + } + + /** + * @notice Sets the context as pre-activated. + * @dev There can only be one pre-activated context at a time. + * @param contextId The ID of the context to set as pre-activated. + */ + function setPreActivation( + ContextLifecycleStorage storage $, + uint256 contextId + ) internal onlyNonNullContextId(contextId) { + // Only a generating context ID can be set as pre-activated + if (!isGenerating($, contextId)) { + revert ContextNotGenerated(contextId); + } + + $.contextStatuses[contextId] = ContextStatus.PreActivation; + $.preActivationContextId = contextId; + + // Reset the generating context ID as it is now pre-activated + // The union of contexts in status Generating and Pre-Activation should have size at most 1 + $.generatingContextId = 0; + } + + /** + * @notice Initializes the context as active. + * If the active context is not set, it means that it is the very first context to be initialized. + * In this very specific case, we allow the context to be set as active directly for convenience. + * @dev There should only be one active context at a time. + * @param contextId The ID of the context to set as active. + */ + function initializeActive( + ContextLifecycleStorage storage $, + uint256 contextId + ) internal onlyNonNullContextId(contextId) { + // This function should only be called if there is no active context yet + if ($.activeContextId != 0) { + revert ActiveContextOngoing($.activeContextId); + } + + $.contextStatuses[contextId] = ContextStatus.Active; + $.activeContextId = contextId; + } + + /** + * @notice Sets the context as active. + * @dev There should only be one active context at a time. + * @param contextId The ID of the context to set as active. + */ + function _setActive(ContextLifecycleStorage storage $, uint256 contextId) internal onlyNonNullContextId(contextId) { + // Only a pre-activated or suspended context can be set as active + if (!isPreActivation($, contextId) && !isSuspended($, contextId)) { + revert ContextNotPreActivatedOrSuspended(contextId); + } + + // There should only be one active context at a time. The old active context must be suspended + // first before a new active context can be set. + if ($.activeContextId != 0) { + revert ActiveContextOngoing($.activeContextId); + } + + $.contextStatuses[contextId] = ContextStatus.Active; + $.activeContextId = contextId; + + // Reset the pre-activation context ID if it is the one being activated + if ($.preActivationContextId == contextId) { + $.preActivationContextId = 0; + } + + // Reset the suspended context ID if it is the one being activated + if ($.suspendedContextId == contextId) { + $.suspendedContextId = 0; + } + } + + /** + * @notice Sets the context as suspended. + * ⚠️ This function should be used with caution as it can lead to unexpected behaviors if not + * used correctly. Use `setActiveAndSuspended` instead. ⚠️ + * A suspended context is expected to always be followed by a context activation in order to + * avoid having a state where no active context is available, which should never happen. + * @dev There can only be one suspended context at a time. + * @param contextId The ID of the context to set as suspended. + */ + function _setSuspended( + ContextLifecycleStorage storage $, + uint256 contextId + ) internal onlyNonNullContextId(contextId) { + // Only an active context ID can be set as suspended + if (!isActive($, contextId)) { + revert ContextNotActive(contextId); + } + + $.contextStatuses[contextId] = ContextStatus.Suspended; + $.suspendedContextId = contextId; + + // Reset the active context ID as it is now suspended + $.activeContextId = 0; + } + + /** + * @notice Sets the contexts as active and suspended. + * @dev This function should be favored over setting the contexts separately as it ensures that + * there is always a (single) active context. + * @param contextIdToActivate The ID of the context to set as active. + * @param contextIdToSuspend The ID of the context to set as suspended. + */ + function setActiveAndSuspended( + ContextLifecycleStorage storage $, + uint256 contextIdToActivate, + uint256 contextIdToSuspend + ) internal { + _setSuspended($, contextIdToSuspend); + _setActive($, contextIdToActivate); + } + + /** + * @notice Sets the context as deactivated. + * @dev There can be multiple deactivated contexts at the same time. + * @param contextId The ID of the context to set as deactivated. + */ + function setDeactivated( + ContextLifecycleStorage storage $, + uint256 contextId + ) internal onlyNonNullContextId(contextId) { + // Only a suspended context ID can be deactivated + if (!isSuspended($, contextId)) { + revert ContextNotSuspended(contextId); + } + + $.contextStatuses[contextId] = ContextStatus.Deactivated; + + // Reset the suspended context ID as it is now deactivated + $.suspendedContextId = 0; + } + + /** + * @notice Sets the context as compromised. + * @dev There can be multiple compromised contexts at the same time. + * @param contextId The ID of the context to set as compromised. + */ + function setCompromised( + ContextLifecycleStorage storage $, + uint256 contextId + ) internal onlyNonNullContextId(contextId) onlyExistingContextId($, contextId) { + // Generating contexts cannot be set as compromised + if (isGenerating($, contextId)) { + revert ContextIsGenerating(contextId); + } + + // Active contexts cannot be set as compromised + if (isActive($, contextId)) { + revert ContextIsActive(contextId); + } + + $.contextStatuses[contextId] = ContextStatus.Compromised; + + // Reset the pre-activation context ID if it is the one being compromised + if ($.preActivationContextId == contextId) { + $.preActivationContextId = 0; + } + + // Reset the suspended context ID if it is the one being compromised + if ($.suspendedContextId == contextId) { + $.suspendedContextId = 0; + } + } + + /** + * @notice Sets the context as destroyed. + * @dev There can be multiple destroyed contexts at the same time. + * @dev Any existing context can be set as destroyed. + * @param contextId The ID of the context to set as destroyed. + */ + function setDestroyed( + ContextLifecycleStorage storage $, + uint256 contextId + ) internal onlyNonNullContextId(contextId) onlyExistingContextId($, contextId) { + // Active contexts cannot be set as destroyed + if (isActive($, contextId)) { + revert ContextIsActive(contextId); + } + + $.contextStatuses[contextId] = ContextStatus.Destroyed; + + // Reset the generating context ID if it is the one being destroyed + if ($.generatingContextId == contextId) { + $.generatingContextId = 0; + } + + // Reset the pre-activation context ID if it is the one being destroyed + if ($.preActivationContextId == contextId) { + $.preActivationContextId = 0; + } + + // Reset the suspended context ID if it is the one being destroyed + if ($.suspendedContextId == contextId) { + $.suspendedContextId = 0; + } + } + + /** + * @notice Returns the status of a context. + * @param contextId The ID of the context to get the status of. + * @return The status of the context. + */ + function getContextStatus( + ContextLifecycleStorage storage $, + uint256 contextId + ) internal view returns (ContextStatus) { + return $.contextStatuses[contextId]; + } + + /** + * @notice Indicates whether a context is not initialized (i.e. does not exist). + * @param contextId The ID of the context to check. + * @return Whether the context is not initialized. + */ + function isNotInitialized(ContextLifecycleStorage storage $, uint256 contextId) internal view returns (bool) { + return $.contextStatuses[contextId] == ContextStatus.NotInitialized; + } + + /** + * @notice Indicates whether a context is generating. + * @param contextId The ID of the context to check. + * @return Whether the context is generating. + */ + function isGenerating(ContextLifecycleStorage storage $, uint256 contextId) internal view returns (bool) { + return $.contextStatuses[contextId] == ContextStatus.Generating; + } + + /** + * @notice Indicates whether a context is pre-activated. + * @param contextId The ID of the context to check. + * @return Whether the context is pre-activated. + */ + function isPreActivation(ContextLifecycleStorage storage $, uint256 contextId) internal view returns (bool) { + return $.contextStatuses[contextId] == ContextStatus.PreActivation; + } + + /** + * @notice Indicates whether a context is active. + * @param contextId The ID of the context to check. + * @return Whether the context is active. + */ + function isActive(ContextLifecycleStorage storage $, uint256 contextId) internal view returns (bool) { + return $.contextStatuses[contextId] == ContextStatus.Active; + } + + /** + * @notice Indicates whether a context is suspended. + * @param contextId The ID of the context to check. + * @return Whether the context is suspended. + */ + function isSuspended(ContextLifecycleStorage storage $, uint256 contextId) internal view returns (bool) { + return $.contextStatuses[contextId] == ContextStatus.Suspended; + } +} diff --git a/gateway-contracts/contracts/mocks/CiphertextCommitsMock.sol b/gateway-contracts/contracts/mocks/CiphertextCommitsMock.sol index 11b19395e5..6875822135 100644 --- a/gateway-contracts/contracts/mocks/CiphertextCommitsMock.sol +++ b/gateway-contracts/contracts/mocks/CiphertextCommitsMock.sol @@ -1,13 +1,14 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear pragma solidity ^0.8.24; import "../shared/Structs.sol"; +import "../shared/Enums.sol"; contract CiphertextCommitsMock { event AddCiphertextMaterial( bytes32 indexed ctHandle, bytes32 ciphertextDigest, bytes32 snsCiphertextDigest, - address[] coprocessorTxSenders + uint256 coprocessorContextId ); function addCiphertextMaterial( @@ -16,8 +17,8 @@ contract CiphertextCommitsMock { bytes32 ciphertextDigest, bytes32 snsCiphertextDigest ) external { - address[] memory coprocessorTxSenders = new address[](1); + uint256 coprocessorContextId; - emit AddCiphertextMaterial(ctHandle, ciphertextDigest, snsCiphertextDigest, coprocessorTxSenders); + emit AddCiphertextMaterial(ctHandle, ciphertextDigest, snsCiphertextDigest, coprocessorContextId); } } diff --git a/gateway-contracts/contracts/mocks/CoprocessorContextsMock.sol b/gateway-contracts/contracts/mocks/CoprocessorContextsMock.sol new file mode 100644 index 0000000000..1740d59710 --- /dev/null +++ b/gateway-contracts/contracts/mocks/CoprocessorContextsMock.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: BSD-3-Clause-Clear +pragma solidity ^0.8.24; +import "../shared/Structs.sol"; +import "../shared/Enums.sol"; + +contract CoprocessorContextsMock { + event InitializeCoprocessorContexts(bytes blob, CoprocessorV2[] coprocessors); + + event NewCoprocessorContext( + CoprocessorContext activeCoprocessorContext, + CoprocessorContext newCoprocessorContext, + CoprocessorContextTimePeriods timePeriods + ); + + event PreActivateCoprocessorContext(CoprocessorContext newCoprocessorContext, uint256 activationBlockTimestamp); + + event SuspendCoprocessorContext(uint256 contextId, uint256 deactivatedBlockTimestamp); + + event ActivateCoprocessorContext(uint256 contextId); + + event DeactivateCoprocessorContext(uint256 contextId); + + event CompromiseCoprocessorContext(uint256 contextId); + + event DestroyCoprocessorContext(uint256 contextId); + + uint256 coprocessorContextCount = 0; + + function initializeFromEmptyProxy(bytes calldata initialBlob, CoprocessorV2[] calldata initialCoprocessors) public { + bytes memory blob; + CoprocessorV2[] memory coprocessors = new CoprocessorV2[](1); + + emit InitializeCoprocessorContexts(blob, coprocessors); + } + + function addCoprocessorContext( + bytes calldata blob, + CoprocessorV2[] calldata coprocessors, + CoprocessorContextTimePeriods calldata timePeriods + ) external { + CoprocessorContext memory activeCoprocessorContext; + CoprocessorContext memory newCoprocessorContext; + uint256 activationBlockTimestamp; + + emit NewCoprocessorContext(activeCoprocessorContext, newCoprocessorContext, timePeriods); + + emit PreActivateCoprocessorContext(newCoprocessorContext, activationBlockTimestamp); + } + + function refreshCoprocessorContextStatuses() external { + uint256 contextId; + uint256 deactivatedBlockTimestamp; + + emit SuspendCoprocessorContext(contextId, deactivatedBlockTimestamp); + + emit ActivateCoprocessorContext(contextId); + + emit DeactivateCoprocessorContext(contextId); + } + + function forceUpdateCoprocessorContextToStatus(uint256 contextId, ContextStatus status) external { + uint256 deactivatedBlockTimestamp; + + emit SuspendCoprocessorContext(contextId, deactivatedBlockTimestamp); + + emit ActivateCoprocessorContext(contextId); + + emit DeactivateCoprocessorContext(contextId); + + emit CompromiseCoprocessorContext(contextId); + + emit DestroyCoprocessorContext(contextId); + } + + function swapSuspendedCoprocessorContextWithActive(uint256 suspendedTimePeriod) external { + uint256 contextId; + uint256 deactivatedBlockTimestamp; + + emit SuspendCoprocessorContext(contextId, deactivatedBlockTimestamp); + + emit ActivateCoprocessorContext(contextId); + } +} diff --git a/gateway-contracts/contracts/mocks/DecryptionMock.sol b/gateway-contracts/contracts/mocks/DecryptionMock.sol index 05625023f6..dd72b9dd9a 100644 --- a/gateway-contracts/contracts/mocks/DecryptionMock.sol +++ b/gateway-contracts/contracts/mocks/DecryptionMock.sol @@ -13,27 +13,6 @@ contract DecryptionMock { uint256 durationDays; } - struct PublicDecryptVerification { - bytes32[] ctHandles; - bytes decryptedResult; - bytes extraData; - } - - struct UserDecryptRequestVerification { - bytes publicKey; - address[] contractAddresses; - uint256 startTimestamp; - uint256 durationDays; - bytes extraData; - } - - struct UserDecryptResponseVerification { - bytes publicKey; - bytes32[] ctHandles; - bytes userDecryptedShare; - bytes extraData; - } - struct UserDecryptionPayload { bytes publicKey; bytes32[] ctHandles; diff --git a/gateway-contracts/contracts/mocks/GatewayConfigMock.sol b/gateway-contracts/contracts/mocks/GatewayConfigMock.sol index 3cfc428d65..5d0d8d829c 100644 --- a/gateway-contracts/contracts/mocks/GatewayConfigMock.sol +++ b/gateway-contracts/contracts/mocks/GatewayConfigMock.sol @@ -7,7 +7,6 @@ contract GatewayConfigMock { ProtocolMetadata metadata, uint256 mpcThreshold, KmsNode[] kmsNodes, - Coprocessor[] coprocessors, Custodian[] custodians ); @@ -32,16 +31,14 @@ contract GatewayConfigMock { uint256 initialUserDecryptionThreshold, uint256 initialKmsGenThreshold, KmsNode[] memory initialKmsNodes, - Coprocessor[] memory initialCoprocessors, Custodian[] memory initialCustodians ) public { ProtocolMetadata memory metadata; uint256 mpcThreshold; KmsNode[] memory kmsNodes = new KmsNode[](1); - Coprocessor[] memory coprocessors = new Coprocessor[](1); Custodian[] memory custodians = new Custodian[](1); - emit InitializeGatewayConfig(metadata, mpcThreshold, kmsNodes, coprocessors, custodians); + emit InitializeGatewayConfig(metadata, mpcThreshold, kmsNodes, custodians); } function updateMpcThreshold(uint256 newMpcThreshold) external { diff --git a/gateway-contracts/contracts/mocks/InputVerificationMock.sol b/gateway-contracts/contracts/mocks/InputVerificationMock.sol index c53c284122..9b7d27273b 100644 --- a/gateway-contracts/contracts/mocks/InputVerificationMock.sol +++ b/gateway-contracts/contracts/mocks/InputVerificationMock.sol @@ -1,15 +1,8 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear pragma solidity ^0.8.24; +import "../shared/Enums.sol"; contract InputVerificationMock { - struct CiphertextVerification { - bytes32[] ctHandles; - address userAddress; - address contractAddress; - uint256 contractChainId; - bytes extraData; - } - struct ZKProofInput { uint256 contractChainId; address contractAddress; @@ -26,9 +19,15 @@ contract InputVerificationMock { bytes extraData ); - event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[] signatures); + event VerifyProofResponse( + uint256 indexed zkProofId, + uint256 indexed coprocessorContextId, + bytes32[] ctHandles, + bytes[] signatures, + bytes extraData + ); - event RejectProofResponse(uint256 indexed zkProofId); + event RejectProofResponse(uint256 indexed zkProofId, bytes extraData); uint256 zkProofIdCounter = 0; @@ -60,12 +59,13 @@ contract InputVerificationMock { bytes calldata signature, bytes calldata extraData ) external { + uint256 coprocessorContextId; bytes[] memory signatures = new bytes[](1); - emit VerifyProofResponse(zkProofId, ctHandles, signatures); + emit VerifyProofResponse(zkProofId, coprocessorContextId, ctHandles, signatures, extraData); } - function rejectProofResponse(uint256 zkProofId, bytes calldata /* unusedVariable */) external { - emit RejectProofResponse(zkProofId); + function rejectProofResponse(uint256 zkProofId, bytes calldata extraData) external { + emit RejectProofResponse(zkProofId, extraData); } } diff --git a/gateway-contracts/contracts/mocks/KMSGenerationMock.sol b/gateway-contracts/contracts/mocks/KMSGenerationMock.sol index f5a602677f..4650702e24 100644 --- a/gateway-contracts/contracts/mocks/KMSGenerationMock.sol +++ b/gateway-contracts/contracts/mocks/KMSGenerationMock.sol @@ -40,8 +40,7 @@ contract KMSGenerationMock { } function prepKeygenResponse(uint256 prepKeygenId, bytes calldata signature) external { - keyCounter++; - uint256 keyId = keyCounter; + uint256 keyId; emit KeygenRequest(prepKeygenId, keyId); } diff --git a/gateway-contracts/contracts/mocks/MultichainACLMock.sol b/gateway-contracts/contracts/mocks/MultichainACLMock.sol index 47731c7e7b..ee447dc424 100644 --- a/gateway-contracts/contracts/mocks/MultichainACLMock.sol +++ b/gateway-contracts/contracts/mocks/MultichainACLMock.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear pragma solidity ^0.8.24; import "../shared/Structs.sol"; +import "../shared/Enums.sol"; contract MultichainACLMock { event AllowAccount(bytes32 indexed ctHandle, address accountAddress); diff --git a/gateway-contracts/contracts/shared/CiphertextCommitsUtils.sol b/gateway-contracts/contracts/shared/CiphertextCommitsUtils.sol new file mode 100644 index 0000000000..fa18753018 --- /dev/null +++ b/gateway-contracts/contracts/shared/CiphertextCommitsUtils.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: BSD-3-Clause-Clear +pragma solidity ^0.8.24; + +import { ciphertextCommitsAddress } from "../../addresses/GatewayAddresses.sol"; +import { ICiphertextCommits } from "../interfaces/ICiphertextCommits.sol"; +import { SnsCiphertextMaterial } from "./Structs.sol"; + +/** + * @title CiphertextCommits utils + * @dev Contract that provides utilities on top of the CiphertextCommits contract + */ +abstract contract CiphertextCommitsUtils { + /** + * @notice The address of the CiphertextCommits contract. + */ + ICiphertextCommits internal constant CIPHERTEXT_COMMITS = ICiphertextCommits(ciphertextCommitsAddress); + + /** + * @notice Error indicating that the ciphertext material has not been added to the contract. + * @param ctHandle The handle representing the ciphertext material. + */ + error CiphertextMaterialNotAdded(bytes32 ctHandle); + + function _isCiphertextMaterialAdded(bytes32 ctHandle) internal view returns (bool) { + return CIPHERTEXT_COMMITS.isCiphertextMaterialAdded(ctHandle); + } + + /** + * @notice Checks if the ciphertext material has been added to the contract. + * @param ctHandle The ciphertext handle to check. + */ + function _checkIsCiphertextMaterialAdded(bytes32 ctHandle) internal view { + if (!CIPHERTEXT_COMMITS.isCiphertextMaterialAdded(ctHandle)) { + revert CiphertextMaterialNotAdded(ctHandle); + } + } +} diff --git a/gateway-contracts/contracts/shared/ContextChecks.sol b/gateway-contracts/contracts/shared/ContextChecks.sol new file mode 100644 index 0000000000..78ac42c002 --- /dev/null +++ b/gateway-contracts/contracts/shared/ContextChecks.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: BSD-3-Clause-Clear +pragma solidity ^0.8.24; + +import { coprocessorContextsAddress } from "../../addresses/GatewayAddresses.sol"; +import { ICoprocessorContexts } from "../interfaces/ICoprocessorContexts.sol"; + +/** + * @title Context Checks + * @notice Base contract that provides modifiers associated with context checks + */ +abstract contract ContextChecks { + /** + * @notice The address of the CoprocessorContexts contract + */ + ICoprocessorContexts private constant COPROCESSOR_CONTEXTS = ICoprocessorContexts(coprocessorContextsAddress); + + /** + * @notice Error indicating that an address is not a coprocessor transaction sender from a context. + * @param contextId The coprocessor context ID. + * @param txSenderAddress The address to check. + */ + error NotCoprocessorTxSenderFromContext(uint256 contextId, address txSenderAddress); + + /** + * @notice Error indicating that an address is not a coprocessor signer from a context. + * @param contextId The coprocessor context ID. + * @param signerAddress The address to check. + */ + error NotCoprocessorSignerFromContext(uint256 contextId, address signerAddress); + + /** + * @notice Refresh the coprocessor context statuses. + */ + modifier refreshCoprocessorContextStatuses() { + COPROCESSOR_CONTEXTS.refreshCoprocessorContextStatuses(); + _; + } + + /** + * @notice Checks if the address is a coprocessor transaction sender. + * @param txSenderAddress The address to check. + */ + function _checkIsCoprocessorTxSender(uint256 contextId, address txSenderAddress) internal view { + if (!COPROCESSOR_CONTEXTS.isCoprocessorTxSender(contextId, txSenderAddress)) { + revert NotCoprocessorTxSenderFromContext(contextId, txSenderAddress); + } + } + + /** + * @notice Checks if the address is a coprocessor signer. + * @param signerAddress The address to check. + */ + function _checkIsCoprocessorSigner(uint256 contextId, address signerAddress) internal view { + if (!COPROCESSOR_CONTEXTS.isCoprocessorSigner(contextId, signerAddress)) { + revert NotCoprocessorSignerFromContext(contextId, signerAddress); + } + } +} diff --git a/gateway-contracts/contracts/shared/Enums.sol b/gateway-contracts/contracts/shared/Enums.sol new file mode 100644 index 0000000000..8e4fb2dd28 --- /dev/null +++ b/gateway-contracts/contracts/shared/Enums.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: BSD-3-Clause-Clear +pragma solidity ^0.8.24; + +/** + * @notice Context statuses + */ +enum ContextStatus { + NotInitialized, + Generating, + PreActivation, + Active, + Suspended, + Deactivated, + Compromised, + Destroyed +} diff --git a/gateway-contracts/contracts/shared/GatewayConfigChecks.sol b/gateway-contracts/contracts/shared/GatewayConfigChecks.sol index 441680000f..fab0694c1c 100644 --- a/gateway-contracts/contracts/shared/GatewayConfigChecks.sol +++ b/gateway-contracts/contracts/shared/GatewayConfigChecks.sol @@ -27,18 +27,6 @@ abstract contract GatewayConfigChecks { */ error NotKmsSigner(address signerAddress); - /** - * @notice Error emitted when an address is not a coprocessor transaction sender. - * @param txSenderAddress The address that is not a coprocessor transaction sender. - */ - error NotCoprocessorTxSender(address txSenderAddress); - - /** - * @notice Error emitted when an address is not a coprocessor signer. - * @param signerAddress The address that is not a coprocessor signer. - */ - error NotCoprocessorSigner(address signerAddress); - /** * @notice Error emitted when an address is not a custodian transaction sender. * @param txSenderAddress The address that is not a custodian transaction sender. @@ -67,16 +55,6 @@ abstract contract GatewayConfigChecks { _; } - /** - * @notice Checks if the sender is a coprocessor transaction sender. - */ - modifier onlyCoprocessorTxSender() { - if (!GATEWAY_CONFIG.isCoprocessorTxSender(msg.sender)) { - revert NotCoprocessorTxSender(msg.sender); - } - _; - } - /** * @notice Checks if the chain ID corresponds to a registered host chain. */ @@ -107,14 +85,4 @@ abstract contract GatewayConfigChecks { revert NotKmsSigner(signerAddress); } } - - /** - * @notice Checks if the address is a coprocessor signer. - * @param signerAddress The address to check. - */ - function _checkIsCoprocessorSigner(address signerAddress) internal view { - if (!GATEWAY_CONFIG.isCoprocessorSigner(signerAddress)) { - revert NotCoprocessorSigner(signerAddress); - } - } } diff --git a/gateway-contracts/contracts/shared/Structs.sol b/gateway-contracts/contracts/shared/Structs.sol index 226058b62d..565905363e 100644 --- a/gateway-contracts/contracts/shared/Structs.sol +++ b/gateway-contracts/contracts/shared/Structs.sol @@ -28,13 +28,35 @@ struct KmsNode { /** * @notice Struct that represents a coprocessor. */ -struct Coprocessor { +struct CoprocessorV2 { + /// @notice Name of the coprocessor, as a human-readable identifier + string name; /// @notice Address of the coprocessor's transaction sender address txSenderAddress; /// @notice Address of the coprocessor's signer (used for signing inputs with EIP712 signatures) address signerAddress; - /// @notice URL address of the coprocessor's S3 bucket where ciphertexts are stored - string s3BucketUrl; + /// @notice URL address of the coprocessor's storage where ciphertexts are stored + string storageUrl; +} + +/// @notice Struct that represents a coprocessor context +struct CoprocessorContext { + /// @notice The ID of the coprocessor context + uint256 contextId; + /// @notice The ID of the previous (active)coprocessor context + uint256 previousContextId; + /// @notice Blob containing data like version, feature set, etc. + bytes blob; + /// @notice The coprocessors in the coprocessor context + CoprocessorV2[] coprocessors; +} + +/// @notice Struct that represents the time periods for a coprocessor context +struct CoprocessorContextTimePeriods { + /// @notice The time period for the pre-activation period (before activating the coprocessor context) + uint256 preActivationTimePeriod; + /// @notice The time period for the suspended period (before deactivating the previous coprocessor context) + uint256 suspendedTimePeriod; } /** @@ -70,10 +92,16 @@ struct HostChain { * the Gateway contracts. */ struct SnsCiphertextMaterial { + /// @notice The handle of the ciphertext bytes32 ctHandle; + /// @notice The key ID that was used to generate the ciphertext uint256 keyId; + /// @notice The digest of the SNS ciphertext bytes32 snsCiphertextDigest; + /// @notice The list of coprocessor transaction sender addresses that were involved in the consensus address[] coprocessorTxSenderAddresses; + /// @notice The coprocessor context ID + uint256 contextId; } /** @@ -81,10 +109,16 @@ struct SnsCiphertextMaterial { * the Gateway contracts. */ struct CiphertextMaterial { + /// @notice The handle of the ciphertext bytes32 ctHandle; + /// @notice The key ID that was used to generate the ciphertext uint256 keyId; + /// @notice The digest of the regular ciphertext bytes32 ciphertextDigest; + /// @notice The list of coprocessor transaction sender addresses that were involved in the consensus address[] coprocessorTxSenderAddresses; + /// @notice The coprocessor context ID + uint256 contextId; } /** @@ -97,3 +131,13 @@ struct CtHandleContractPair { /// @notice The address of the contract address contractAddress; } + +// ---------------------------------------------------------------------------------------------- +// DEPRECATED +// ---------------------------------------------------------------------------------------------- + +struct CoprocessorV1 { + address txSenderAddress; + address signerAddress; + string s3BucketUrl; +} diff --git a/gateway-contracts/docker-compose.yml b/gateway-contracts/docker-compose.yml index 83d06ff80a..20d42383c3 100644 --- a/gateway-contracts/docker-compose.yml +++ b/gateway-contracts/docker-compose.yml @@ -134,6 +134,29 @@ services: volumes: - addresses-volume:/app/addresses + getters: + container_name: getters + build: + context: . + dockerfile: Dockerfile + env_file: + - ./.env + environment: + - HARDHAT_NETWORK=staging + - CHAIN_ID_GATEWAY=54321 + - RPC_URL=http://anvil-node:8546 + command: + - npx hardhat task:getAllRegisteredEntities --use-internal-proxy-address true + depends_on: + anvil-node: + condition: service_started + add-host-chains: + condition: service_completed_successfully + # Addresses needs to be mounted even though we don't use them in the task because all contracts + # are compiled, and most of them import these addresses. + volumes: + - addresses-volume:/app/addresses + deploy-gateway-mock-contracts: container_name: deploy-gateway-mock-contracts build: diff --git a/gateway-contracts/docs/.assets/lifecycle_contexts.png b/gateway-contracts/docs/.assets/lifecycle_contexts.png new file mode 100644 index 0000000000..3fee33ea5f Binary files /dev/null and b/gateway-contracts/docs/.assets/lifecycle_contexts.png differ diff --git a/gateway-contracts/docs/README.md b/gateway-contracts/docs/README.md index 76d5125544..4992abab1c 100644 --- a/gateway-contracts/docs/README.md +++ b/gateway-contracts/docs/README.md @@ -21,8 +21,12 @@ layout: Learn the basics of fhevm Gateway, set it up, and make it run with ease. +- [Summary](SUMMARY.md) + ### References +- [Selectors](references/selectors.md) + ### Supports Ask technical questions and discuss with the community. Our team of experts usually answers within 24 hours in working days. diff --git a/gateway-contracts/docs/getting-started/contracts/coprocessor_contexts.md b/gateway-contracts/docs/getting-started/contracts/coprocessor_contexts.md new file mode 100644 index 0000000000..08b0e8ee2e --- /dev/null +++ b/gateway-contracts/docs/getting-started/contracts/coprocessor_contexts.md @@ -0,0 +1,128 @@ +# CoprocessorContexts contract + +This section describes the `CoprocessorContexts` contract. It is used to manage the lifecycle of coprocessors for the fhevm Gateway protocol. + +Several settings are stored in the contract, which can be separated in several categories: + +- [Coprocessor](#coprocessor) +- [Coprocessor context](#coprocessor-context) +- [Owner](#owner) + +## Coprocessor + +A coprocessor is part of a set of multiple coprocessors, called a coprocessor [context](#coprocessor-context). They are used to : + +- perform FHE computations on ciphertexts +- verify inputs' zero-knowledge proof of knowledge (ZKPoK) based on requests from the `InputVerification` contract +- handle access controls to ciphertexts for all registered [host chains](./gateway_config.md#host-chains), which are centralized in the `MultichainAcl` contract + +Several metadata are stored for each coprocessor: + +- `name` : name of the coprocessor (indicative) +- `txSenderAddress` : see [Sender and signer](#sender-and-signer) below. +- `signerAddress` : see [Sender and signer](#sender-and-signer) below. +- `storageUrl` : URL of the storage where the ciphertexts are stored. In the fhevm protocol, this URL is fetched by the KMS connector in order to download the ciphertexts needed for decryption requests. + +### Sender and signer + +A coprocessor has both a transaction sender and a signer assigned to it: + +- `txSenderAddress` : address of the account that will send transactions to the fhevm Gateway. +- `signerAddress` : address associated to the public key used to sign results sent to the fhevm Gateway. + +The list of coprocessors' transaction senders and signers from a context can be retrieved using the following view functions: + +- `getCoprocessorTxSenders(uint256 contextId)`: get all the active coprocessors' transaction senders from a context. +- `getCoprocessorSigners(uint256 contextId)`: get all the active coprocessors' signers from a context. + +The transaction sender and signer addresses are allowed to be the same for a given coprocessor. + +Additionally, the transaction sender address is used for identifying a coprocessor and may be referred to its "identity". In particular, these addresses can be used as inputs to the following view function: + +- `getCoprocessor(uint256 contextId, address coprocessorTxSenderAddress)`: get an active coprocessor's metadata from a context. + +The above functions can be combined with the `getActiveCoprocessorContextId()` function to get information about the coprocessors from the current [`active`](#lifecycle) context. + +## Coprocessor context + +A set of coprocessors is called a coprocessor context and must be constituted of at least 1 coprocessor. It stores the following metadata: + +- `contextId`: unique non-zero identifier of the coprocessor context, defined using an incremental counter within the `CoprocessorContexts` contract. +- `previousContextId`: identifier of the previous coprocessor context. +- `blob`: blob of the coprocessor context, containing data like version, feature set, etc. +- `coprocessors`: list of coprocessors in the coprocessor context. + +It is possible to get information about the current [`active`](#lifecycle) coprocessor context using the following view functions: + +- `getActiveCoprocessorContext()`: get the current active coprocessor context. +- `getActiveCoprocessorContextId()`: get the current active coprocessor context ID. + +Currently, the initial coprocessor context is set at deployment of the `CoprocessorContexts` contract and put directly in the [`active`](#lifecycle) state. In this particular case, the `previousContextId` is set to 0 since there is no previous coprocessor context to refer to. + +Coprocessor contexts can be updated over time by the owner for the following reasons: + +- adding one or more coprocessors +- removing one or more coprocessors +- replacing one or more coprocessors with a new one +- updating one or more coprocessors' metadata (ex: feature set for software updates) + +### Lifecycle + +Coprocessor context updates follow a lifecycle approach, a general concept applied to other parts of the fhevm Gateway (ex: KMS nodes, Custodians, FHE keys). It is used to ensure a linear history of contexts and that there is no disruption in the protocol when updating them. + +The lifecycle of a context is defined by the following states, although some of them are not currently used in practice for coprocessor contexts: + +- `generating`: currently not used. +- `pre-activation`: the coprocessor context will be activated in a certain amount of blocks. +- `active`: the coprocessor context can be used for new requests, for example: + - input verification requests + - adding new ciphertext materials + - new allows or delegations +- `suspended`: the coprocessor context cannot be used for new requests and will be deactivated after a certain amount of blocks. However, it can still be considered for on-going consensus phases, for example: + - proof verification/rejection responses + - on-going additions of ciphertext materials + - on-going allows or delegations +- `deactivated`: the coprocessor context is deactivated and cannot be used for any purpose anymore. +- `compromised`: the coprocessor context is compromised and cannot be used for any purpose anymore. +- `destroyed`: currently not used. + +Additionally: + +- in case of emergency (ex: bad software update), the owner can directly move a context from `suspended` back to `active`, which deactivates the context with issues. +- an `active` context cannot be set to `compromised`,`deactivated` or `destroyed`, in order to ensure that the fhevm Gateway always has one active context. + +The complete lifecycle of a coprocessor context is represented in the following diagram, with the following legend: + +- _Red_: Automated status update +- _Black_: Manual only status update + +![Context lifecycle](../../.assets/lifecycle_contexts.png) + +### Automatic status refresh + +Coprocessor context statuses that need to be updated based on the current block timestamp are refreshed using the `refreshCoprocessorContextStatuses` function. This function can be called by anyone, but most importantly, it is called by any of the following functions as a pre-hook modifier: + +- in `CiphertextCommits` contract: + - `addCiphertextMaterial` +- in `MultichainAcl` contract: + - `allowPublicDecrypt` + - `allowAccount` + - `delegateAccount` +- in `InputVerification` contract: + - `verifyProofRequest` + - `verifyProofResponse` + - `rejectProofResponse` + +This ensures that the statuses are always up to date when performing the above actions. + +## Owner + +Similarly to other contracts, the `CoprocessorContexts` contract is ownable. The `owner` account is allowed to perform several restricted actions: + +- upgrade the contract +- add a new coprocessor context +- compromise a coprocessor context +- destroy a coprocessor context +- move a suspended coprocessor context back to active (in case of emergency) + +More information about the owner can be found in the [GatewayConfig](./gateway_config.md#governance-accounts) section. diff --git a/gateway-contracts/docs/getting-started/contracts/gateway_config.md b/gateway-contracts/docs/getting-started/contracts/gateway_config.md index 186a817bf7..7a326bc81b 100644 --- a/gateway-contracts/docs/getting-started/contracts/gateway_config.md +++ b/gateway-contracts/docs/getting-started/contracts/gateway_config.md @@ -5,7 +5,7 @@ This section describes the `GatewayConfig` contract. It is used to configure set Several settings are stored in the contract, which can be separated in several categories: - [Protocol metadata](#protocol-metadata) -- [Operators](#operators) +- [KMS Nodes](#kms-nodes) - [Governance](#governance) - [Host chains](#host-chains) @@ -93,7 +93,7 @@ Several metadata are stored for each coprocessor: - `txSenderAddress` : see [Sender and signer](#sender-and-signer) below. - `signerAddress` : see [Sender and signer](#sender-and-signer) below. -- `s3BucketUrl` : URL of the S3 bucket where the ciphertexts are stored. In the fhevm protocol, this URL is fetched by the KMS connector in order to download the ciphertexts needed for decryption requests. +- `storageUrl` : URL of the storage where the ciphertexts are stored. In the fhevm protocol, this URL is fetched by the KMS connector in order to download the ciphertexts needed for decryption requests. The fhevm Gateway has a single set of coprocessors, which must be constituted of at least 1 coprocessor. @@ -101,7 +101,7 @@ Currently, they are set at deployment and it is currently _not_ possible to add ### Sender and signer -Despite the above differences, each operator has both a transaction sender and a signer assigned to it: +A KMS node has both a transaction sender and a signer assigned to it: - `txSenderAddress` : address of the account that will send transactions to the fhevm Gateway. - `signerAddress` : address associated to the public key used to sign results sent to the fhevm Gateway. @@ -110,15 +110,12 @@ The current list of transaction senders and signers can be retrieved using the f - `getKmsTxSenders()`: get all the KMS nodes' transaction senders. - `getKmsSigners()`: get all the KMS nodes' signers. -- `getCoprocessorTxSenders()`: get all the coprocessors' transaction senders. -- `getCoprocessorSigners()`: get all the coprocessors' signers. -The transaction sender and signer addresses are allowed to be the same for a given operator. +The transaction sender and signer addresses are allowed to be the same for a given KMS node. Additionally, the transaction sender address is used for identifying an operator and may be referred to its "identity". In particular, these addresses can be used as inputs to following view functions in the `GatewayConfig` contract: - `getKmsNode(address kmsTxSenderAddress)`: get a KMS node's metadata. -- `getCoprocessor(address coprocessorTxSenderAddress)`: get a coprocessor's metadata. ## Governance diff --git a/gateway-contracts/docs/getting-started/deployment/env_variables.md b/gateway-contracts/docs/getting-started/deployment/env_variables.md index 9002de359c..4e7d92e148 100644 --- a/gateway-contracts/docs/getting-started/deployment/env_variables.md +++ b/gateway-contracts/docs/getting-started/deployment/env_variables.md @@ -2,9 +2,10 @@ This section describes the environment variables used for deployment. A complete example of an expected `.env` file is given in the [`.env.example`](../../../.env.example) file. -Environment variables can be separated in 3 categories: +Environment variables can be separated in 4 categories: - [`GatewayConfig` values](./env_variables.md#gatewayconfig-values) +- [`CoprocessorContexts` values](./env_variables.md#coprocessorcontexts-values) - [Deployment settings](./env_variables.md#deployment-settings) Except for deployment settings, the values are then stored in the deployed contracts and are not always allowed to be updated after. In the following, the values are given as examples. Most of them are from the `.env.example` file and are used for local testing. The expected types are also given as comments and should be respected, else the deployment is expected to fail. @@ -33,7 +34,7 @@ Here's the complete list of environment variables used for deploying the FHEVM g | `NUM_COPROCESSORS` | Number of coprocessors to register | - | - | Must be at least the number of coprocessors registered below | | `COPROCESSOR_TX_SENDER_ADDRESS_{j}` | Address of the coprocessor `j` | address | - | If `j` >= `NUM_COPROCESSORS`, the variable is ignored | | `COPROCESSOR_SIGNER_ADDRESS_{j}` | Signer address of the coprocessor `j` | address | - | If `j` >= `NUM_COPROCESSORS`, the variable is ignored | -| `COPROCESSOR_S3_BUCKET_URL_{j}` | S3 bucket URL of the coprocessor `j` | string | - | If `j` >= `NUM_COPROCESSORS`, the variable is ignored | +| `COPROCESSOR_STORAGE_URL_{j}` | Storage URL of the coprocessor `j` | string | - | If `j` >= `NUM_COPROCESSORS`, the variable is ignored | | `NUM_HOST_CHAINS` | Number of host chains to register | - | - | Must be at least the number of host chains registered below | | `HOST_CHAIN_CHAIN_ID_{k}` | Chain ID of the host chain `k` | uint256 | - | If `k` >= `NUM_HOST_CHAINS`, the variable is ignored | | `HOST_CHAIN_FHEVM_EXECUTOR_{k}` | FHEVM executor of the host chain `k` | address | - | If `k` >= `NUM_HOST_CHAINS`, the variable is ignored | @@ -48,6 +49,8 @@ Here's the complete list of environment variables used for deploying the FHEVM g | `MNEMONIC` | "Mnemonic phrase for address generation | string | "adapt mosquito move limb mobile illegal tree voyage juice mosquito burger raise father hope layer" | - | | `RPC_URL` | URL of the RPC node | string | "http://127.0.0.1:8757" | - | | `GATEWAY_CONFIG_ADDRESS` | Address of the GatewayConfig contract | address | - | Only for production settings | +| `PAUSER_SET_ADDRESS` | Address of the PauserSet contract | address | - | Only for production settings | +| `KMS_GENERATION_ADDRESS` | Address of the KMSGeneration contract | address | - | Only for production settings | ## In details @@ -122,7 +125,7 @@ NUM_COPROCESSORS="3" # (number) ```bash COPROCESSOR_TX_SENDER_ADDRESS_0="0x6518D50aDc9036Df37119eA465a8159E34417E2E" # (address) COPROCESSOR_SIGNER_ADDRESS_0="0xa5eE8292dA52d8234248709F3E217ffEBA5E8312" # (address) -COPROCESSOR_S3_BUCKET_URL_0="s3://coprocessor-bucket-1" # (string) +COPROCESSOR_STORAGE_URL_0="s3://coprocessor-bucket-1" # (string) ``` #### After deployment @@ -147,13 +150,17 @@ HOST_CHAIN_WEBSITE_0="https://host-chain-2025.com" # (string) `HOST_CHAIN_CHAIN_ID` must be different for all host chains, else the script will fail. -- Pausers: +### PauserSet values + +PauserSet is used for managing addresses that are able to pause some contracts. No environment variables are needed at deployment. + +### After deployment ```bash NUM_PAUSERS="1" # (number) ``` -`NUM_PAUSERS` is the number of pausers to register in the `GatewayConfig` contract. It it not stored in it and is only used within the deployment script. The following metadata variables must be set for each pauser, indexed by a pauser number starting from 0. If not enough variables are set, the script will fail. If, on the contrary, too many variables are set, the script will succeed but the extra ones will be ignored. +`NUM_PAUSERS` is the number of pausers to register in the `PauserSet` contract. It it not stored in it and is only used within the deployment script. The following metadata variables must be set for each pauser, indexed by a pauser number starting from 0. If not enough variables are set, the script will fail. If, on the contrary, too many variables are set, the script will succeed but the extra ones will be ignored. The number of pausers should correspond to the total number of registered operators (the number of KMS nodes + coprocessors registered in the protocol). @@ -161,7 +168,38 @@ The number of pausers should correspond to the total number of registered operat PAUSER_ADDRESS_0="0x6591319B97979Acc59b7191A8B4Ec381375bFc92" # (address) ``` -### Deployment settings +### CoprocessorContexts values + +These values are crucial for the fhevm Gateway protocol and are set in the `CoprocessorContexts` contract at deployment. To understand what each value is used for, please refer to the [CoprocessorContexts](../contracts/coprocessor_contexts.md) documentation. + +#### At deployment + +The following values are set at deployment. + +- Coprocessors feature set: + +```bash +COPROCESSORS_FEATURE_SET="1" # (uint256) +``` + +This integer is used to identify the feature set of the coprocessors for software upgrades. + +- Coprocessors: + +```bash +NUM_COPROCESSORS="3" # (number) +``` + +`NUM_COPROCESSORS` is the number of coprocessors to register in the `CoprocessorContexts` contract. It it not stored in it and is only used within the deployment script. The following metadata variables must be set for each coprocessor, indexed by a coprocessor number starting from 0. If not enough variables are set, the deployment will fail. If, on the contrary, too many variables are set, the deployment will succeed but the extra ones will be ignored. + +```bash +COPROCESSOR_NAME_0="Coprocessor 1" # (string) +COPROCESSOR_TX_SENDER_ADDRESS_0="0x6518D50aDc9036Df37119eA465a8159E34417E2E" # (address) +COPROCESSOR_SIGNER_ADDRESS_0="0xa5eE8292dA52d8234248709F3E217ffEBA5E8312" # (address) +COPROCESSOR_STORAGE_URL_0="s3://bucket-1" # (string) +``` + +### General deployment settings The following settings are required for deploying the contracts through hardhat: diff --git a/gateway-contracts/rust_bindings/src/ciphertext_commits.rs b/gateway-contracts/rust_bindings/src/ciphertext_commits.rs index 0ae854cb2c..244f711435 100644 --- a/gateway-contracts/rust_bindings/src/ciphertext_commits.rs +++ b/gateway-contracts/rust_bindings/src/ciphertext_commits.rs @@ -3,17 +3,20 @@ Generated by the following Solidity interface... ```solidity interface CiphertextCommits { + type ContextStatus is uint8; struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextDigest; address[] coprocessorTxSenderAddresses; + uint256 contextId; } struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphertextDigest; address[] coprocessorTxSenderAddresses; + uint256 contextId; } error AddressEmptyCode(address target); @@ -23,9 +26,10 @@ interface CiphertextCommits { error ERC1967NonPayable(); error FailedCall(); error HostChainNotRegistered(uint256 chainId); + error InvalidCoprocessorContextAddCiphertext(bytes32 ctHandle, uint256 contextId, ContextStatus contextStatus); error InvalidInitialization(); - error NotCoprocessorSigner(address signerAddress); - error NotCoprocessorTxSender(address txSenderAddress); + error NotCoprocessorSignerFromContext(uint256 contextId, address signerAddress); + error NotCoprocessorTxSenderFromContext(uint256 contextId, address txSenderAddress); error NotCustodianSigner(address signerAddress); error NotCustodianTxSender(address txSenderAddress); error NotGatewayOwner(address sender); @@ -36,7 +40,7 @@ interface CiphertextCommits { error UUPSUnauthorizedCallContext(); error UUPSUnsupportedProxiableUUID(bytes32 slot); - event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, bytes32 snsCiphertextDigest, address[] coprocessorTxSenders); + event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, bytes32 snsCiphertextDigest, uint256 coprocessorContextId); event Initialized(uint64 version); event Upgraded(address indexed implementation); @@ -44,13 +48,14 @@ interface CiphertextCommits { function UPGRADE_INTERFACE_VERSION() external view returns (string memory); function addCiphertextMaterial(bytes32 ctHandle, uint256 keyId, bytes32 ciphertextDigest, bytes32 snsCiphertextDigest) external; - function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external view returns (address[] memory); function getCiphertextMaterials(bytes32[] memory ctHandles) external view returns (CiphertextMaterial[] memory ctMaterials); + function getConsensusCoprocessorTxSenders(bytes32 ctHandle) external view returns (address[] memory, uint256, bool); function getSnsCiphertextMaterials(bytes32[] memory ctHandles) external view returns (SnsCiphertextMaterial[] memory snsCtMaterials); function getVersion() external pure returns (string memory); function initializeFromEmptyProxy() external; function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool); function proxiableUUID() external view returns (bytes32); + function reinitializeV2() external; function upgradeToAndCall(address newImplementation, bytes memory data) external payable; } ``` @@ -104,25 +109,6 @@ interface CiphertextCommits { "outputs": [], "stateMutability": "nonpayable" }, - { - "type": "function", - "name": "getAddCiphertextMaterialConsensusTxSenders", - "inputs": [ - { - "name": "ctHandle", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "address[]", - "internalType": "address[]" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "getCiphertextMaterials", @@ -158,12 +144,46 @@ interface CiphertextCommits { "name": "coprocessorTxSenderAddresses", "type": "address[]", "internalType": "address[]" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" } ] } ], "stateMutability": "view" }, + { + "type": "function", + "name": "getConsensusCoprocessorTxSenders", + "inputs": [ + { + "name": "ctHandle", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "getSnsCiphertextMaterials", @@ -199,6 +219,11 @@ interface CiphertextCommits { "name": "coprocessorTxSenderAddresses", "type": "address[]", "internalType": "address[]" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" } ] } @@ -257,6 +282,13 @@ interface CiphertextCommits { ], "stateMutability": "view" }, + { + "type": "function", + "name": "reinitializeV2", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "upgradeToAndCall", @@ -298,10 +330,10 @@ interface CiphertextCommits { "internalType": "bytes32" }, { - "name": "coprocessorTxSenders", - "type": "address[]", + "name": "coprocessorContextId", + "type": "uint256", "indexed": false, - "internalType": "address[]" + "internalType": "uint256" } ], "anonymous": false @@ -402,6 +434,27 @@ interface CiphertextCommits { } ] }, + { + "type": "error", + "name": "InvalidCoprocessorContextAddCiphertext", + "inputs": [ + { + "name": "ctHandle", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contextStatus", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ] + }, { "type": "error", "name": "InvalidInitialization", @@ -409,8 +462,13 @@ interface CiphertextCommits { }, { "type": "error", - "name": "NotCoprocessorSigner", + "name": "NotCoprocessorSignerFromContext", "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, { "name": "signerAddress", "type": "address", @@ -420,8 +478,13 @@ interface CiphertextCommits { }, { "type": "error", - "name": "NotCoprocessorTxSender", + "name": "NotCoprocessorTxSenderFromContext", "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, { "name": "txSenderAddress", "type": "address", @@ -525,27 +588,165 @@ pub mod CiphertextCommits { /// The creation / init bytecode of the contract. /// /// ```text - ///0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000043575f80fd5b50620000546200005a60201b60201c565b620001c4565b5f6200006b6200015e60201b60201c565b9050805f0160089054906101000a900460ff1615620000b6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146200015b5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051620001529190620001a9565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b620001a38162000185565b82525050565b5f602082019050620001be5f83018462000198565b92915050565b6080516127b1620001eb5f395f81816110df0152818161113401526113d601526127b15ff3fe608060405260043610610090575f3560e01c806355c4d9971161005857806355c4d9971461015657806390f3035414610192578063a14f8971146101ba578063ad3cb1cc146101f6578063e6f6ab941461022057610090565b80630d8e6e2c146100945780632ddc9a6f146100be57806339f73810146100fa5780634f1ef2861461011057806352d1902d1461012c575b5f80fd5b34801561009f575f80fd5b506100a861025c565b6040516100b59190611a5a565b60405180910390f35b3480156100c9575f80fd5b506100e460048036038101906100df9190611abe565b6102d7565b6040516100f19190611b03565b60405180910390f35b348015610105575f80fd5b5061010e61030b565b005b61012a60048036038101906101259190611ca2565b61047b565b005b348015610137575f80fd5b5061014061049a565b60405161014d9190611d0b565b60405180910390f35b348015610161575f80fd5b5061017c60048036038101906101779190611d81565b6104cb565b6040516101899190611fc5565b60405180910390f35b34801561019d575f80fd5b506101b860048036038101906101b3919061200f565b610748565b005b3480156101c5575f80fd5b506101e060048036038101906101db9190611d81565b610c29565b6040516101ed919061218e565b60405180910390f35b348015610201575f80fd5b5061020a610ea6565b6040516102179190611a5a565b60405180910390f35b34801561022b575f80fd5b5061024660048036038101906102419190611abe565b610edf565b604051610253919061221a565b60405180910390f35b60606040518060400160405280601181526020017f43697068657274657874436f6d6d69747300000000000000000000000000000081525061029d5f610fa1565b6102a76001610fa1565b6102b05f610fa1565b6040516020016102c39493929190612308565b604051602081830303815290604052905090565b5f806102e161106b565b9050806003015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b6001610315611092565b67ffffffffffffffff1614610356576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f6103616110b6565b9050805f0160089054906101000a900460ff16806103a957508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b156103e0576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d28260405161046f9190612388565b60405180910390a15050565b6104836110dd565b61048c826111c3565b61049682826112b6565b5050565b5f6104a36113d4565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b60605f6104d661106b565b90508383905067ffffffffffffffff8111156104f5576104f4611b7e565b5b60405190808252806020026020018201604052801561052e57816020015b61051b61197a565b8152602001906001900390816105135790505b5091505f5b8484905081101561074057610560858583818110610554576105536123a1565b5b905060200201356102d7565b6105ba57848482818110610577576105766123a1565b5b905060200201356040517f0666cbdf0000000000000000000000000000000000000000000000000000000081526004016105b19190611d0b565b60405180910390fd5b5f826005015f8787858181106105d3576105d26123a1565b5b9050602002013581526020019081526020015f205490505f836007015f8381526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561067b57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610632575b5050505050905060405180608001604052808888868181106106a05761069f6123a1565b5b905060200201358152602001855f015f8a8a888181106106c3576106c26123a1565b5b9050602002013581526020019081526020015f20548152602001856001015f8a8a888181106106f5576106f46123a1565b5b9050602002013581526020019081526020015f2054815260200182815250858481518110610726576107256123a1565b5b602002602001018190525050508080600101915050610533565b505092915050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16632dd3edfe336040518263ffffffff1660e01b815260040161079591906123dd565b602060405180830381865afa1580156107b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d49190612420565b61081557336040517f52d725f500000000000000000000000000000000000000000000000000000000815260040161080c91906123dd565b60405180910390fd5b835f6108208261145b565b905073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663bff3aaba826040518263ffffffff1660e01b815260040161086f919061245a565b602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612420565b6108ef57806040517fb6679c3b0000000000000000000000000000000000000000000000000000000081526004016108e6919061245a565b60405180910390fd5b5f6108f861106b565b9050806006015f8881526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156109995786336040517f1dd7250c000000000000000000000000000000000000000000000000000000008152600401610990929190612473565b60405180910390fd5b5f878787876040516020016109b1949392919061249a565b604051602081830303815290604052805190602001209050816004015f8281526020019081526020015f205f8154809291906109ec9061250a565b91905055505f826008015f8381526020019081526020015f205403610a25576001826008015f8381526020019081526020015f20819055505b6001826006015f8a81526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550816007015f8281526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816003015f8981526020019081526020015f205f9054906101000a900460ff16158015610b415750610b40826004015f8381526020019081526020015f2054611474565b5b15610c1f5785826001015f8a81526020019081526020015f208190555084826002015f8a81526020019081526020015f208190555086825f015f8a81526020019081526020015f20819055506001826003015f8a81526020019081526020015f205f6101000a81548160ff02191690831515021790555080826005015f8a81526020019081526020015f2081905550877fcb89ccb347018d7f282bb4c048e135e19bc1d13660fa0f2850e10518422536de8787856007015f8681526020019081526020015f20604051610c1693929190612631565b60405180910390a25b5050505050505050565b60605f610c3461106b565b90508383905067ffffffffffffffff811115610c5357610c52611b7e565b5b604051908082528060200260200182016040528015610c8c57816020015b610c796119a5565b815260200190600190039081610c715790505b5091505f5b84849050811015610e9e57610cbe858583818110610cb257610cb16123a1565b5b905060200201356102d7565b610d1857848482818110610cd557610cd46123a1565b5b905060200201356040517f0666cbdf000000000000000000000000000000000000000000000000000000008152600401610d0f9190611d0b565b60405180910390fd5b5f826005015f878785818110610d3157610d306123a1565b5b9050602002013581526020019081526020015f205490505f836007015f8381526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015610dd957602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610d90575b505050505090506040518060800160405280888886818110610dfe57610dfd6123a1565b5b905060200201358152602001855f015f8a8a88818110610e2157610e206123a1565b5b9050602002013581526020019081526020015f20548152602001856002015f8a8a88818110610e5357610e526123a1565b5b9050602002013581526020019081526020015f2054815260200182815250858481518110610e8457610e836123a1565b5b602002602001018190525050508080600101915050610c91565b505092915050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60605f610eea61106b565b90505f816005015f8581526020019081526020015f20549050816007015f8281526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015610f9357602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610f4a575b505050505092505050919050565b60605f6001610faf84611505565b0190505f8167ffffffffffffffff811115610fcd57610fcc611b7e565b5b6040519080825280601f01601f191660200182016040528015610fff5781602001600182028036833780820191505090505b5090505f82602001820190505b600115611060578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816110555761105461266d565b5b0494505f850361100c575b819350505050919050565b5f7ff41c60ea5b83c8f19b663613ffdd3fa441a59933b8a4fdf4da891b38433d1a00905090565b5f61109b6110b6565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148061118a57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611171611656565b73ffffffffffffffffffffffffffffffffffffffff1614155b156111c1576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611220573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124491906126ae565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112b357336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016112aa91906123dd565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561131e57506040513d601f19601f8201168201806040525081019061131b91906126ed565b60015b61135f57816040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815260040161135691906123dd565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b81146113c557806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016113bc9190611d0b565b60405180910390fd5b6113cf83836116a9565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611459576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f67ffffffffffffffff6010835f1c901c169050919050565b5f8073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16636799ef526040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f7919061272c565b905080831015915050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611561577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816115575761155661266d565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061159e576d04ee2d6d415b85acef810000000083816115945761159361266d565b5b0492506020810190505b662386f26fc1000083106115cd57662386f26fc1000083816115c3576115c261266d565b5b0492506010810190505b6305f5e10083106115f6576305f5e10083816115ec576115eb61266d565b5b0492506008810190505b612710831061161b5761271083816116115761161061266d565b5b0492506004810190505b6064831061163e57606483816116345761163361266d565b5b0492506002810190505b600a831061164d576001810190505b80915050919050565b5f6116827f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61171b565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116b282611724565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f8151111561170e5761170882826117ed565b50611717565b61171661186d565b5b5050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361177f57806040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815260040161177691906123dd565b60405180910390fd5b806117ab7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61171b565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051611816919061279b565b5f60405180830381855af49150503d805f811461184e576040519150601f19603f3d011682016040523d82523d5f602084013e611853565b606091505b50915091506118638583836118a9565b9250505092915050565b5f3411156118a7576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6060826118be576118b982611936565b61192e565b5f82511480156118e457505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561192657836040517f9996b31500000000000000000000000000000000000000000000000000000000815260040161191d91906123dd565b60405180910390fd5b81905061192f565b5b9392505050565b5f815111156119485780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180608001604052805f80191681526020015f81526020015f8019168152602001606081525090565b60405180608001604052805f80191681526020015f81526020015f8019168152602001606081525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611a075780820151818401526020810190506119ec565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611a2c826119d0565b611a3681856119da565b9350611a468185602086016119ea565b611a4f81611a12565b840191505092915050565b5f6020820190508181035f830152611a728184611a22565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b611a9d81611a8b565b8114611aa7575f80fd5b50565b5f81359050611ab881611a94565b92915050565b5f60208284031215611ad357611ad2611a83565b5b5f611ae084828501611aaa565b91505092915050565b5f8115159050919050565b611afd81611ae9565b82525050565b5f602082019050611b165f830184611af4565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611b4582611b1c565b9050919050565b611b5581611b3b565b8114611b5f575f80fd5b50565b5f81359050611b7081611b4c565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611bb482611a12565b810181811067ffffffffffffffff82111715611bd357611bd2611b7e565b5b80604052505050565b5f611be5611a7a565b9050611bf18282611bab565b919050565b5f67ffffffffffffffff821115611c1057611c0f611b7e565b5b611c1982611a12565b9050602081019050919050565b828183375f83830152505050565b5f611c46611c4184611bf6565b611bdc565b905082815260208101848484011115611c6257611c61611b7a565b5b611c6d848285611c26565b509392505050565b5f82601f830112611c8957611c88611b76565b5b8135611c99848260208601611c34565b91505092915050565b5f8060408385031215611cb857611cb7611a83565b5b5f611cc585828601611b62565b925050602083013567ffffffffffffffff811115611ce657611ce5611a87565b5b611cf285828601611c75565b9150509250929050565b611d0581611a8b565b82525050565b5f602082019050611d1e5f830184611cfc565b92915050565b5f80fd5b5f80fd5b5f8083601f840112611d4157611d40611b76565b5b8235905067ffffffffffffffff811115611d5e57611d5d611d24565b5b602083019150836020820283011115611d7a57611d79611d28565b5b9250929050565b5f8060208385031215611d9757611d96611a83565b5b5f83013567ffffffffffffffff811115611db457611db3611a87565b5b611dc085828601611d2c565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611dfe81611a8b565b82525050565b5f819050919050565b611e1681611e04565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611e4e81611b3b565b82525050565b5f611e5f8383611e45565b60208301905092915050565b5f602082019050919050565b5f611e8182611e1c565b611e8b8185611e26565b9350611e9683611e36565b805f5b83811015611ec6578151611ead8882611e54565b9750611eb883611e6b565b925050600181019050611e99565b5085935050505092915050565b5f608083015f830151611ee85f860182611df5565b506020830151611efb6020860182611e0d565b506040830151611f0e6040860182611df5565b5060608301518482036060860152611f268282611e77565b9150508091505092915050565b5f611f3e8383611ed3565b905092915050565b5f602082019050919050565b5f611f5c82611dcc565b611f668185611dd6565b935083602082028501611f7885611de6565b805f5b85811015611fb35784840389528151611f948582611f33565b9450611f9f83611f46565b925060208a01995050600181019050611f7b565b50829750879550505050505092915050565b5f6020820190508181035f830152611fdd8184611f52565b905092915050565b611fee81611e04565b8114611ff8575f80fd5b50565b5f8135905061200981611fe5565b92915050565b5f805f806080858703121561202757612026611a83565b5b5f61203487828801611aaa565b945050602061204587828801611ffb565b935050604061205687828801611aaa565b925050606061206787828801611aaa565b91505092959194509250565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f608083015f8301516120b15f860182611df5565b5060208301516120c46020860182611e0d565b5060408301516120d76040860182611df5565b50606083015184820360608601526120ef8282611e77565b9150508091505092915050565b5f612107838361209c565b905092915050565b5f602082019050919050565b5f61212582612073565b61212f818561207d565b9350836020820285016121418561208d565b805f5b8581101561217c578484038952815161215d85826120fc565b94506121688361210f565b925060208a01995050600181019050612144565b50829750879550505050505092915050565b5f6020820190508181035f8301526121a6818461211b565b905092915050565b5f82825260208201905092915050565b5f6121c882611e1c565b6121d281856121ae565b93506121dd83611e36565b805f5b8381101561220d5781516121f48882611e54565b97506121ff83611e6b565b9250506001810190506121e0565b5085935050505092915050565b5f6020820190508181035f83015261223281846121be565b905092915050565b5f81905092915050565b5f61224e826119d0565b612258818561223a565b93506122688185602086016119ea565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f6122a860028361223a565b91506122b382612274565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6122f260018361223a565b91506122fd826122be565b600182019050919050565b5f6123138287612244565b915061231e8261229c565b915061232a8286612244565b9150612335826122e6565b91506123418285612244565b915061234c826122e6565b91506123588284612244565b915081905095945050505050565b5f67ffffffffffffffff82169050919050565b61238281612366565b82525050565b5f60208201905061239b5f830184612379565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6123d781611b3b565b82525050565b5f6020820190506123f05f8301846123ce565b92915050565b6123ff81611ae9565b8114612409575f80fd5b50565b5f8151905061241a816123f6565b92915050565b5f6020828403121561243557612434611a83565b5b5f6124428482850161240c565b91505092915050565b61245481611e04565b82525050565b5f60208201905061246d5f83018461244b565b92915050565b5f6040820190506124865f830185611cfc565b61249360208301846123ce565b9392505050565b5f6080820190506124ad5f830187611cfc565b6124ba602083018661244b565b6124c76040830185611cfc565b6124d46060830184611cfc565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61251482611e04565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612546576125456124dd565b5b600182019050919050565b5f81549050919050565b5f819050815f5260205f209050919050565b5f815f1c9050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6125a96125a48361256d565b612578565b9050919050565b5f6125bb8254612597565b9050919050565b5f600182019050919050565b5f6125d882612551565b6125e281856121ae565b93506125ed8361255b565b805f5b8381101561262457612601826125b0565b61260b8882611e54565b9750612616836125c2565b9250506001810190506125f0565b5085935050505092915050565b5f6060820190506126445f830186611cfc565b6126516020830185611cfc565b818103604083015261266381846125ce565b9050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f815190506126a881611b4c565b92915050565b5f602082840312156126c3576126c2611a83565b5b5f6126d08482850161269a565b91505092915050565b5f815190506126e781611a94565b92915050565b5f6020828403121561270257612701611a83565b5b5f61270f848285016126d9565b91505092915050565b5f8151905061272681611fe5565b92915050565b5f6020828403121561274157612740611a83565b5b5f61274e84828501612718565b91505092915050565b5f81519050919050565b5f81905092915050565b5f61277582612757565b61277f8185612761565b935061278f8185602086016119ea565b80840191505092915050565b5f6127a6828461276b565b91508190509291505056 + ///0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000043575f80fd5b50620000546200005a60201b60201c565b620001c4565b5f6200006b6200015e60201b60201c565b9050805f0160089054906101000a900460ff1615620000b6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146200015b5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051620001529190620001a9565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b620001a38162000185565b82525050565b5f602082019050620001be5f83018462000198565b92915050565b608051612c51620001eb5f395f818161141a0152818161146f01526117110152612c515ff3fe60806040526004361061009b575f3560e01c806355c4d9971161006357806355c4d9971461016157806390f303541461019d578063a14f8971146101c5578063ad3cb1cc14610201578063c41158741461022b578063e4bb288c146102415761009b565b80630d8e6e2c1461009f5780632ddc9a6f146100c957806339f73810146101055780634f1ef2861461011b57806352d1902d14610137575b5f80fd5b3480156100aa575f80fd5b506100b361027f565b6040516100c09190611e82565b60405180910390f35b3480156100d4575f80fd5b506100ef60048036038101906100ea9190611ee6565b6102fa565b6040516100fc9190611f2b565b60405180910390f35b348015610110575f80fd5b5061011961032e565b005b610135600480360381019061013091906120ca565b61049e565b005b348015610142575f80fd5b5061014b6104bd565b6040516101589190612133565b60405180910390f35b34801561016c575f80fd5b50610187600480360381019061018291906121a9565b6104ee565b6040516101949190612400565b60405180910390f35b3480156101a8575f80fd5b506101c360048036038101906101be919061244a565b61077f565b005b3480156101d0575f80fd5b506101eb60048036038101906101e691906121a9565b610de7565b6040516101f891906125dc565b60405180910390f35b34801561020c575f80fd5b50610215611078565b6040516102229190611e82565b60405180910390f35b348015610236575f80fd5b5061023f6110b1565b005b34801561024c575f80fd5b5061026760048036038101906102629190611ee6565b6111d6565b60405161027693929190612677565b60405180910390f35b60606040518060400160405280601181526020017f43697068657274657874436f6d6d6974730000000000000000000000000000008152506102c05f6112dc565b6102ca60026112dc565b6102d35f6112dc565b6040516020016102e69493929190612781565b604051602081830303815290604052905090565b5f806103046113a6565b9050806003015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b60016103386113cd565b67ffffffffffffffff1614610379576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f6103846113f1565b9050805f0160089054906101000a900460ff16806103cc57508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15610403576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2826040516104929190612801565b60405180910390a15050565b6104a6611418565b6104af826114fe565b6104b982826115f1565b5050565b5f6104c661170f565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b60605f6104f96113a6565b90508383905067ffffffffffffffff81111561051857610517611fa6565b5b60405190808252806020026020018201604052801561055157816020015b61053e611d96565b8152602001906001900390816105365790505b5091505f5b84849050811015610777576105838585838181106105775761057661281a565b5b905060200201356102fa565b6105dd5784848281811061059a5761059961281a565b5b905060200201356040517f0666cbdf0000000000000000000000000000000000000000000000000000000081526004016105d49190612133565b60405180910390fd5b5f826005015f8787858181106105f6576105f561281a565b5b9050602002013581526020019081526020015f205490506040518060a0016040528087878581811061062b5761062a61281a565b5b905060200201358152602001845f015f89898781811061064e5761064d61281a565b5b9050602002013581526020019081526020015f20548152602001846001015f8989878181106106805761067f61281a565b5b9050602002013581526020019081526020015f20548152602001846007015f8481526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561072a57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116106e1575b50505050508152602001846008015f8481526020019081526020015f205481525084838151811061075e5761075d61281a565b5b6020026020010181905250508080600101915050610556565b505092915050565b835f61078a82611796565b905073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663bff3aaba826040518263ffffffff1660e01b81526004016107d99190612847565b602060405180830381865afa1580156107f4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610818919061288a565b61085957806040517fb6679c3b0000000000000000000000000000000000000000000000000000000081526004016108509190612847565b60405180910390fd5b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16633a5162e66040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156108b2575f80fd5b505af11580156108c4573d5f803e3d5ffd5b505050505f868686866040516020016108e094939291906128b5565b6040516020818303038152906040528051906020012090505f6109016113a6565b90505f816008015f8481526020019081526020015f205490505f81036109c1577333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663991dc36d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561097e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a2919061290c565b905080826008015f8581526020019081526020015f2081905550610b22565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663cd8e993c826040518263ffffffff1660e01b8152600401610a0e9190612847565b602060405180830381865afa158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d919061288a565b610b21575f7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663888b99e0836040518263ffffffff1660e01b8152600401610a9f9190612847565b602060405180830381865afa158015610aba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ade919061295a565b90508982826040517f96346431000000000000000000000000000000000000000000000000000000008152600401610b18939291906129f8565b60405180910390fd5b5b610b2c81336117af565b816006015f8a81526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615610bcb5788336040517f1dd7250c000000000000000000000000000000000000000000000000000000008152600401610bc2929190612a3c565b60405180910390fd5b816004015f8481526020019081526020015f205f815480929190610bee90612a90565b91905055506001826006015f8b81526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550816007015f8481526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816003015f8a81526020019081526020015f205f9054906101000a900460ff16158015610d105750610d0f81836004015f8681526020019081526020015f2054611884565b5b15610ddc5786826001015f8b81526020019081526020015f208190555085826002015f8b81526020019081526020015f208190555087825f015f8b81526020019081526020015f20819055506001826003015f8b81526020019081526020015f205f6101000a81548160ff02191690831515021790555082826005015f8b81526020019081526020015f2081905550887fc3113162bedb887e086a25724f966348968a75efd447615ebfd0f715939ad964888884604051610dd393929190612ad7565b60405180910390a25b505050505050505050565b60605f610df26113a6565b90508383905067ffffffffffffffff811115610e1157610e10611fa6565b5b604051908082528060200260200182016040528015610e4a57816020015b610e37611dc7565b815260200190600190039081610e2f5790505b5091505f5b8484905081101561107057610e7c858583818110610e7057610e6f61281a565b5b905060200201356102fa565b610ed657848482818110610e9357610e9261281a565b5b905060200201356040517f0666cbdf000000000000000000000000000000000000000000000000000000008152600401610ecd9190612133565b60405180910390fd5b5f826005015f878785818110610eef57610eee61281a565b5b9050602002013581526020019081526020015f205490506040518060a00160405280878785818110610f2457610f2361281a565b5b905060200201358152602001845f015f898987818110610f4757610f4661281a565b5b9050602002013581526020019081526020015f20548152602001846002015f898987818110610f7957610f7861281a565b5b9050602002013581526020019081526020015f20548152602001846007015f8481526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561102357602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610fda575b50505050508152602001846008015f8481526020019081526020015f20548152508483815181106110575761105661281a565b5b6020026020010181905250508080600101915050610e4f565b505092915050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60035f6110bc6113f1565b9050805f0160089054906101000a900460ff168061110457508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b1561113b576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2826040516111ca9190612801565b60405180910390a15050565b60605f805f6111e36113a6565b90505f816003015f8781526020019081526020015f205f9054906101000a900460ff1690505f826005015f8881526020019081526020015f20549050826007015f8281526020019081526020015f20836008015f8381526020019081526020015f205483828054806020026020016040519081016040528092919081815260200182805480156112c557602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161127c575b505050505092509550955095505050509193909250565b60605f60016112ea84611921565b0190505f8167ffffffffffffffff81111561130857611307611fa6565b5b6040519080825280601f01601f19166020018201604052801561133a5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561139b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816113905761138f612b0c565b5b0494505f8503611347575b819350505050919050565b5f7ff41c60ea5b83c8f19b663613ffdd3fa441a59933b8a4fdf4da891b38433d1a00905090565b5f6113d66113f1565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614806114c557507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166114ac611a72565b73ffffffffffffffffffffffffffffffffffffffff1614155b156114fc576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561155b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157f9190612b4d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115ee57336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016115e59190612b78565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561165957506040513d601f19601f820116820180604052508101906116569190612ba5565b60015b61169a57816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016116919190612b78565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b811461170057806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016116f79190612133565b60405180910390fd5b61170a8383611ac5565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611794576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f67ffffffffffffffff6010835f1c901c169050919050565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16638625e87683836040518363ffffffff1660e01b81526004016117fe929190612bd0565b602060405180830381865afa158015611819573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183d919061288a565b6118805781816040517f29a993c1000000000000000000000000000000000000000000000000000000008152600401611877929190612bd0565b60405180910390fd5b5050565b5f807333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663f88174ea856040518263ffffffff1660e01b81526004016118d39190612847565b602060405180830381865afa1580156118ee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611912919061290c565b90508083101591505092915050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061197d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161197357611972612b0c565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106119ba576d04ee2d6d415b85acef810000000083816119b0576119af612b0c565b5b0492506020810190505b662386f26fc1000083106119e957662386f26fc1000083816119df576119de612b0c565b5b0492506010810190505b6305f5e1008310611a12576305f5e1008381611a0857611a07612b0c565b5b0492506008810190505b6127108310611a37576127108381611a2d57611a2c612b0c565b5b0492506004810190505b60648310611a5a5760648381611a5057611a4f612b0c565b5b0492506002810190505b600a8310611a69576001810190505b80915050919050565b5f611a9e7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b611b37565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ace82611b40565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f81511115611b2a57611b248282611c09565b50611b33565b611b32611c89565b5b5050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03611b9b57806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401611b929190612b78565b60405180910390fd5b80611bc77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b611b37565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051611c329190612c3b565b5f60405180830381855af49150503d805f8114611c6a576040519150601f19603f3d011682016040523d82523d5f602084013e611c6f565b606091505b5091509150611c7f858383611cc5565b9250505092915050565b5f341115611cc3576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b606082611cda57611cd582611d52565b611d4a565b5f8251148015611d0057505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15611d4257836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401611d399190612b78565b60405180910390fd5b819050611d4b565b5b9392505050565b5f81511115611d645780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060a001604052805f80191681526020015f81526020015f8019168152602001606081526020015f81525090565b6040518060a001604052805f80191681526020015f81526020015f8019168152602001606081526020015f81525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611e2f578082015181840152602081019050611e14565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611e5482611df8565b611e5e8185611e02565b9350611e6e818560208601611e12565b611e7781611e3a565b840191505092915050565b5f6020820190508181035f830152611e9a8184611e4a565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b611ec581611eb3565b8114611ecf575f80fd5b50565b5f81359050611ee081611ebc565b92915050565b5f60208284031215611efb57611efa611eab565b5b5f611f0884828501611ed2565b91505092915050565b5f8115159050919050565b611f2581611f11565b82525050565b5f602082019050611f3e5f830184611f1c565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f6d82611f44565b9050919050565b611f7d81611f63565b8114611f87575f80fd5b50565b5f81359050611f9881611f74565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611fdc82611e3a565b810181811067ffffffffffffffff82111715611ffb57611ffa611fa6565b5b80604052505050565b5f61200d611ea2565b90506120198282611fd3565b919050565b5f67ffffffffffffffff82111561203857612037611fa6565b5b61204182611e3a565b9050602081019050919050565b828183375f83830152505050565b5f61206e6120698461201e565b612004565b90508281526020810184848401111561208a57612089611fa2565b5b61209584828561204e565b509392505050565b5f82601f8301126120b1576120b0611f9e565b5b81356120c184826020860161205c565b91505092915050565b5f80604083850312156120e0576120df611eab565b5b5f6120ed85828601611f8a565b925050602083013567ffffffffffffffff81111561210e5761210d611eaf565b5b61211a8582860161209d565b9150509250929050565b61212d81611eb3565b82525050565b5f6020820190506121465f830184612124565b92915050565b5f80fd5b5f80fd5b5f8083601f84011261216957612168611f9e565b5b8235905067ffffffffffffffff8111156121865761218561214c565b5b6020830191508360208202830111156121a2576121a1612150565b5b9250929050565b5f80602083850312156121bf576121be611eab565b5b5f83013567ffffffffffffffff8111156121dc576121db611eaf565b5b6121e885828601612154565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61222681611eb3565b82525050565b5f819050919050565b61223e8161222c565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61227681611f63565b82525050565b5f612287838361226d565b60208301905092915050565b5f602082019050919050565b5f6122a982612244565b6122b3818561224e565b93506122be8361225e565b805f5b838110156122ee5781516122d5888261227c565b97506122e083612293565b9250506001810190506122c1565b5085935050505092915050565b5f60a083015f8301516123105f86018261221d565b5060208301516123236020860182612235565b506040830151612336604086018261221d565b506060830151848203606086015261234e828261229f565b91505060808301516123636080860182612235565b508091505092915050565b5f61237983836122fb565b905092915050565b5f602082019050919050565b5f612397826121f4565b6123a181856121fe565b9350836020820285016123b38561220e565b805f5b858110156123ee57848403895281516123cf858261236e565b94506123da83612381565b925060208a019950506001810190506123b6565b50829750879550505050505092915050565b5f6020820190508181035f830152612418818461238d565b905092915050565b6124298161222c565b8114612433575f80fd5b50565b5f8135905061244481612420565b92915050565b5f805f806080858703121561246257612461611eab565b5b5f61246f87828801611ed2565b945050602061248087828801612436565b935050604061249187828801611ed2565b92505060606124a287828801611ed2565b91505092959194509250565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f60a083015f8301516124ec5f86018261221d565b5060208301516124ff6020860182612235565b506040830151612512604086018261221d565b506060830151848203606086015261252a828261229f565b915050608083015161253f6080860182612235565b508091505092915050565b5f61255583836124d7565b905092915050565b5f602082019050919050565b5f612573826124ae565b61257d81856124b8565b93508360208202850161258f856124c8565b805f5b858110156125ca57848403895281516125ab858261254a565b94506125b68361255d565b925060208a01995050600181019050612592565b50829750879550505050505092915050565b5f6020820190508181035f8301526125f48184612569565b905092915050565b5f82825260208201905092915050565b5f61261682612244565b61262081856125fc565b935061262b8361225e565b805f5b8381101561265b578151612642888261227c565b975061264d83612293565b92505060018101905061262e565b5085935050505092915050565b6126718161222c565b82525050565b5f6060820190508181035f83015261268f818661260c565b905061269e6020830185612668565b6126ab6040830184611f1c565b949350505050565b5f81905092915050565b5f6126c782611df8565b6126d181856126b3565b93506126e1818560208601611e12565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f6127216002836126b3565b915061272c826126ed565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61276b6001836126b3565b915061277682612737565b600182019050919050565b5f61278c82876126bd565b915061279782612715565b91506127a382866126bd565b91506127ae8261275f565b91506127ba82856126bd565b91506127c58261275f565b91506127d182846126bd565b915081905095945050505050565b5f67ffffffffffffffff82169050919050565b6127fb816127df565b82525050565b5f6020820190506128145f8301846127f2565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208201905061285a5f830184612668565b92915050565b61286981611f11565b8114612873575f80fd5b50565b5f8151905061288481612860565b92915050565b5f6020828403121561289f5761289e611eab565b5b5f6128ac84828501612876565b91505092915050565b5f6080820190506128c85f830187612124565b6128d56020830186612668565b6128e26040830185612124565b6128ef6060830184612124565b95945050505050565b5f8151905061290681612420565b92915050565b5f6020828403121561292157612920611eab565b5b5f61292e848285016128f8565b91505092915050565b60088110612943575f80fd5b50565b5f8151905061295481612937565b92915050565b5f6020828403121561296f5761296e611eab565b5b5f61297c84828501612946565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600881106129c3576129c2612985565b5b50565b5f8190506129d3826129b2565b919050565b5f6129e2826129c6565b9050919050565b6129f2816129d8565b82525050565b5f606082019050612a0b5f830186612124565b612a186020830185612668565b612a2560408301846129e9565b949350505050565b612a3681611f63565b82525050565b5f604082019050612a4f5f830185612124565b612a5c6020830184612a2d565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612a9a8261222c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612acc57612acb612a63565b5b600182019050919050565b5f606082019050612aea5f830186612124565b612af76020830185612124565b612b046040830184612668565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81519050612b4781611f74565b92915050565b5f60208284031215612b6257612b61611eab565b5b5f612b6f84828501612b39565b91505092915050565b5f602082019050612b8b5f830184612a2d565b92915050565b5f81519050612b9f81611ebc565b92915050565b5f60208284031215612bba57612bb9611eab565b5b5f612bc784828501612b91565b91505092915050565b5f604082019050612be35f830185612668565b612bf06020830184612a2d565b9392505050565b5f81519050919050565b5f81905092915050565b5f612c1582612bf7565b612c1f8185612c01565b9350612c2f818560208601611e12565b80840191505092915050565b5f612c468284612c0b565b91508190509291505056 /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\xA0`@R0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x80\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP4\x80\x15b\0\0CW_\x80\xFD[Pb\0\0Tb\0\0Z` \x1B` \x1CV[b\0\x01\xC4V[_b\0\0kb\0\x01^` \x1B` \x1CV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15b\0\0\xB6W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14b\0\x01[Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`@Qb\0\x01R\x91\x90b\0\x01\xA9V[`@Q\x80\x91\x03\x90\xA1[PV[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[b\0\x01\xA3\x81b\0\x01\x85V[\x82RPPV[_` \x82\x01\x90Pb\0\x01\xBE_\x83\x01\x84b\0\x01\x98V[\x92\x91PPV[`\x80Qa'\xB1b\0\x01\xEB_9_\x81\x81a\x10\xDF\x01R\x81\x81a\x114\x01Ra\x13\xD6\x01Ra'\xB1_\xF3\xFE`\x80`@R`\x046\x10a\0\x90W_5`\xE0\x1C\x80cU\xC4\xD9\x97\x11a\0XW\x80cU\xC4\xD9\x97\x14a\x01VW\x80c\x90\xF3\x03T\x14a\x01\x92W\x80c\xA1O\x89q\x14a\x01\xBAW\x80c\xAD<\xB1\xCC\x14a\x01\xF6W\x80c\xE6\xF6\xAB\x94\x14a\x02 Wa\0\x90V[\x80c\r\x8En,\x14a\0\x94W\x80c-\xDC\x9Ao\x14a\0\xBEW\x80c9\xF78\x10\x14a\0\xFAW\x80cO\x1E\xF2\x86\x14a\x01\x10W\x80cR\xD1\x90-\x14a\x01,W[_\x80\xFD[4\x80\x15a\0\x9FW_\x80\xFD[Pa\0\xA8a\x02\\V[`@Qa\0\xB5\x91\x90a\x1AZV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\0\xC9W_\x80\xFD[Pa\0\xE4`\x04\x806\x03\x81\x01\x90a\0\xDF\x91\x90a\x1A\xBEV[a\x02\xD7V[`@Qa\0\xF1\x91\x90a\x1B\x03V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x05W_\x80\xFD[Pa\x01\x0Ea\x03\x0BV[\0[a\x01*`\x04\x806\x03\x81\x01\x90a\x01%\x91\x90a\x1C\xA2V[a\x04{V[\0[4\x80\x15a\x017W_\x80\xFD[Pa\x01@a\x04\x9AV[`@Qa\x01M\x91\x90a\x1D\x0BV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01aW_\x80\xFD[Pa\x01|`\x04\x806\x03\x81\x01\x90a\x01w\x91\x90a\x1D\x81V[a\x04\xCBV[`@Qa\x01\x89\x91\x90a\x1F\xC5V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x9DW_\x80\xFD[Pa\x01\xB8`\x04\x806\x03\x81\x01\x90a\x01\xB3\x91\x90a \x0FV[a\x07HV[\0[4\x80\x15a\x01\xC5W_\x80\xFD[Pa\x01\xE0`\x04\x806\x03\x81\x01\x90a\x01\xDB\x91\x90a\x1D\x81V[a\x0C)V[`@Qa\x01\xED\x91\x90a!\x8EV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x01W_\x80\xFD[Pa\x02\na\x0E\xA6V[`@Qa\x02\x17\x91\x90a\x1AZV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02+W_\x80\xFD[Pa\x02F`\x04\x806\x03\x81\x01\x90a\x02A\x91\x90a\x1A\xBEV[a\x0E\xDFV[`@Qa\x02S\x91\x90a\"\x1AV[`@Q\x80\x91\x03\x90\xF3[```@Q\x80`@\x01`@R\x80`\x11\x81R` \x01\x7FCiphertextCommits\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x02\x9D_a\x0F\xA1V[a\x02\xA7`\x01a\x0F\xA1V[a\x02\xB0_a\x0F\xA1V[`@Q` \x01a\x02\xC3\x94\x93\x92\x91\x90a#\x08V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x90V[_\x80a\x02\xE1a\x10kV[\x90P\x80`\x03\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[`\x01a\x03\x15a\x10\x92V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x03VW`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02_a\x03aa\x10\xB6V[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x03\xA9WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x03\xE0W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x04o\x91\x90a#\x88V[`@Q\x80\x91\x03\x90\xA1PPV[a\x04\x83a\x10\xDDV[a\x04\x8C\x82a\x11\xC3V[a\x04\x96\x82\x82a\x12\xB6V[PPV[_a\x04\xA3a\x13\xD4V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[``_a\x04\xD6a\x10kV[\x90P\x83\x83\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x04\xF5Wa\x04\xF4a\x1B~V[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x05.W\x81` \x01[a\x05\x1Ba\x19zV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x05\x13W\x90P[P\x91P_[\x84\x84\x90P\x81\x10\x15a\x07@Wa\x05`\x85\x85\x83\x81\x81\x10a\x05TWa\x05Sa#\xA1V[[\x90P` \x02\x015a\x02\xD7V[a\x05\xBAW\x84\x84\x82\x81\x81\x10a\x05wWa\x05va#\xA1V[[\x90P` \x02\x015`@Q\x7F\x06f\xCB\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05\xB1\x91\x90a\x1D\x0BV[`@Q\x80\x91\x03\x90\xFD[_\x82`\x05\x01_\x87\x87\x85\x81\x81\x10a\x05\xD3Wa\x05\xD2a#\xA1V[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x90P_\x83`\x07\x01_\x83\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x06{W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x062W[PPPPP\x90P`@Q\x80`\x80\x01`@R\x80\x88\x88\x86\x81\x81\x10a\x06\xA0Wa\x06\x9Fa#\xA1V[[\x90P` \x02\x015\x81R` \x01\x85_\x01_\x8A\x8A\x88\x81\x81\x10a\x06\xC3Wa\x06\xC2a#\xA1V[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x81R` \x01\x85`\x01\x01_\x8A\x8A\x88\x81\x81\x10a\x06\xF5Wa\x06\xF4a#\xA1V[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x81R` \x01\x82\x81RP\x85\x84\x81Q\x81\x10a\x07&Wa\x07%a#\xA1V[[` \x02` \x01\x01\x81\x90RPPP\x80\x80`\x01\x01\x91PPa\x053V[PP\x92\x91PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xD3\xED\xFE3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x07\x95\x91\x90a#\xDDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\xB0W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xD4\x91\x90a$ V[a\x08\x15W3`@Q\x7FR\xD7%\xF5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x08\x0C\x91\x90a#\xDDV[`@Q\x80\x91\x03\x90\xFD[\x83_a\x08 \x82a\x14[V[\x90Ps\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x08o\x91\x90a$ZV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x08\x8AW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x08\xAE\x91\x90a$ V[a\x08\xEFW\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x08\xE6\x91\x90a$ZV[`@Q\x80\x91\x03\x90\xFD[_a\x08\xF8a\x10kV[\x90P\x80`\x06\x01_\x88\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\t\x99W\x863`@Q\x7F\x1D\xD7%\x0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\t\x90\x92\x91\x90a$sV[`@Q\x80\x91\x03\x90\xFD[_\x87\x87\x87\x87`@Q` \x01a\t\xB1\x94\x93\x92\x91\x90a$\x9AV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x81`\x04\x01_\x82\x81R` \x01\x90\x81R` \x01_ _\x81T\x80\x92\x91\x90a\t\xEC\x90a%\nV[\x91\x90PUP_\x82`\x08\x01_\x83\x81R` \x01\x90\x81R` \x01_ T\x03a\n%W`\x01\x82`\x08\x01_\x83\x81R` \x01\x90\x81R` \x01_ \x81\x90UP[`\x01\x82`\x06\x01_\x8A\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x07\x01_\x82\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x81`\x03\x01_\x89\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x0BAWPa\x0B@\x82`\x04\x01_\x83\x81R` \x01\x90\x81R` \x01_ Ta\x14tV[[\x15a\x0C\x1FW\x85\x82`\x01\x01_\x8A\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x84\x82`\x02\x01_\x8A\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x86\x82_\x01_\x8A\x81R` \x01\x90\x81R` \x01_ \x81\x90UP`\x01\x82`\x03\x01_\x8A\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x80\x82`\x05\x01_\x8A\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x87\x7F\xCB\x89\xCC\xB3G\x01\x8D\x7F(+\xB4\xC0H\xE15\xE1\x9B\xC1\xD16`\xFA\x0F(P\xE1\x05\x18B%6\xDE\x87\x87\x85`\x07\x01_\x86\x81R` \x01\x90\x81R` \x01_ `@Qa\x0C\x16\x93\x92\x91\x90a&1V[`@Q\x80\x91\x03\x90\xA2[PPPPPPPPV[``_a\x0C4a\x10kV[\x90P\x83\x83\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x0CSWa\x0CRa\x1B~V[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x0C\x8CW\x81` \x01[a\x0Cya\x19\xA5V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x0CqW\x90P[P\x91P_[\x84\x84\x90P\x81\x10\x15a\x0E\x9EWa\x0C\xBE\x85\x85\x83\x81\x81\x10a\x0C\xB2Wa\x0C\xB1a#\xA1V[[\x90P` \x02\x015a\x02\xD7V[a\r\x18W\x84\x84\x82\x81\x81\x10a\x0C\xD5Wa\x0C\xD4a#\xA1V[[\x90P` \x02\x015`@Q\x7F\x06f\xCB\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\r\x0F\x91\x90a\x1D\x0BV[`@Q\x80\x91\x03\x90\xFD[_\x82`\x05\x01_\x87\x87\x85\x81\x81\x10a\r1Wa\r0a#\xA1V[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x90P_\x83`\x07\x01_\x83\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\r\xD9W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\r\x90W[PPPPP\x90P`@Q\x80`\x80\x01`@R\x80\x88\x88\x86\x81\x81\x10a\r\xFEWa\r\xFDa#\xA1V[[\x90P` \x02\x015\x81R` \x01\x85_\x01_\x8A\x8A\x88\x81\x81\x10a\x0E!Wa\x0E a#\xA1V[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x81R` \x01\x85`\x02\x01_\x8A\x8A\x88\x81\x81\x10a\x0ESWa\x0ERa#\xA1V[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x81R` \x01\x82\x81RP\x85\x84\x81Q\x81\x10a\x0E\x84Wa\x0E\x83a#\xA1V[[` \x02` \x01\x01\x81\x90RPPP\x80\x80`\x01\x01\x91PPa\x0C\x91V[PP\x92\x91PPV[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[``_a\x0E\xEAa\x10kV[\x90P_\x81`\x05\x01_\x85\x81R` \x01\x90\x81R` \x01_ T\x90P\x81`\x07\x01_\x82\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x0F\x93W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x0FJW[PPPPP\x92PPP\x91\x90PV[``_`\x01a\x0F\xAF\x84a\x15\x05V[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x0F\xCDWa\x0F\xCCa\x1B~V[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0F\xFFW\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a\x10`W\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a\x10UWa\x10Ta&mV[[\x04\x94P_\x85\x03a\x10\x0CW[\x81\x93PPPP\x91\x90PV[_\x7F\xF4\x1C`\xEA[\x83\xC8\xF1\x9Bf6\x13\xFF\xDD?\xA4A\xA5\x993\xB8\xA4\xFD\xF4\xDA\x89\x1B8C=\x1A\0\x90P\x90V[_a\x10\x9Ba\x10\xB6V[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a\x11\x8AWP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x11qa\x16VV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x11\xC1W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x12 W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x12D\x91\x90a&\xAEV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x12\xB3W3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x12\xAA\x91\x90a#\xDDV[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x13\x1EWP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\x1B\x91\x90a&\xEDV[`\x01[a\x13_W\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x13V\x91\x90a#\xDDV[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a\x13\xC5W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x13\xBC\x91\x90a\x1D\x0BV[`@Q\x80\x91\x03\x90\xFD[a\x13\xCF\x83\x83a\x16\xA9V[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x14YW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x10\x83_\x1C\x90\x1C\x16\x90P\x91\x90PV[_\x80s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cg\x99\xEFR`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x14\xD3W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x14\xF7\x91\x90a',V[\x90P\x80\x83\x10\x15\x91PP\x91\x90PV[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a\x15aWz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a\x15WWa\x15Va&mV[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a\x15\x9EWm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a\x15\x94Wa\x15\x93a&mV[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a\x15\xCDWf#\x86\xF2o\xC1\0\0\x83\x81a\x15\xC3Wa\x15\xC2a&mV[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a\x15\xF6Wc\x05\xF5\xE1\0\x83\x81a\x15\xECWa\x15\xEBa&mV[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a\x16\x1BWa'\x10\x83\x81a\x16\x11Wa\x16\x10a&mV[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a\x16>W`d\x83\x81a\x164Wa\x163a&mV[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a\x16MW`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a\x16\x82\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x17\x1BV[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a\x16\xB2\x82a\x17$V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a\x17\x0EWa\x17\x08\x82\x82a\x17\xEDV[Pa\x17\x17V[a\x17\x16a\x18mV[[PPV[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a\x17\x7FW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x17v\x91\x90a#\xDDV[`@Q\x80\x91\x03\x90\xFD[\x80a\x17\xAB\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x17\x1BV[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa\x18\x16\x91\x90a'\x9BV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x18NW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x18SV[``\x91P[P\x91P\x91Pa\x18c\x85\x83\x83a\x18\xA9V[\x92PPP\x92\x91PPV[_4\x11\x15a\x18\xA7W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82a\x18\xBEWa\x18\xB9\x82a\x196V[a\x19.V[_\x82Q\x14\x80\x15a\x18\xE4WP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a\x19&W\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x19\x1D\x91\x90a#\xDDV[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa\x19/V[[\x93\x92PPPV[_\x81Q\x11\x15a\x19HW\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80`\x80\x01`@R\x80_\x80\x19\x16\x81R` \x01_\x81R` \x01_\x80\x19\x16\x81R` \x01``\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80_\x80\x19\x16\x81R` \x01_\x81R` \x01_\x80\x19\x16\x81R` \x01``\x81RP\x90V[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a\x1A\x07W\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa\x19\xECV[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a\x1A,\x82a\x19\xD0V[a\x1A6\x81\x85a\x19\xDAV[\x93Pa\x1AF\x81\x85` \x86\x01a\x19\xEAV[a\x1AO\x81a\x1A\x12V[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra\x1Ar\x81\x84a\x1A\"V[\x90P\x92\x91PPV[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[a\x1A\x9D\x81a\x1A\x8BV[\x81\x14a\x1A\xA7W_\x80\xFD[PV[_\x815\x90Pa\x1A\xB8\x81a\x1A\x94V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a\x1A\xD3Wa\x1A\xD2a\x1A\x83V[[_a\x1A\xE0\x84\x82\x85\x01a\x1A\xAAV[\x91PP\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[a\x1A\xFD\x81a\x1A\xE9V[\x82RPPV[_` \x82\x01\x90Pa\x1B\x16_\x83\x01\x84a\x1A\xF4V[\x92\x91PPV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a\x1BE\x82a\x1B\x1CV[\x90P\x91\x90PV[a\x1BU\x81a\x1B;V[\x81\x14a\x1B_W_\x80\xFD[PV[_\x815\x90Pa\x1Bp\x81a\x1BLV[\x92\x91PPV[_\x80\xFD[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a\x1B\xB4\x82a\x1A\x12V[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\x1B\xD3Wa\x1B\xD2a\x1B~V[[\x80`@RPPPV[_a\x1B\xE5a\x1AzV[\x90Pa\x1B\xF1\x82\x82a\x1B\xABV[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x1C\x10Wa\x1C\x0Fa\x1B~V[[a\x1C\x19\x82a\x1A\x12V[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_a\x1CFa\x1CA\x84a\x1B\xF6V[a\x1B\xDCV[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a\x1CbWa\x1Caa\x1BzV[[a\x1Cm\x84\x82\x85a\x1C&V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a\x1C\x89Wa\x1C\x88a\x1BvV[[\x815a\x1C\x99\x84\x82` \x86\x01a\x1C4V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a\x1C\xB8Wa\x1C\xB7a\x1A\x83V[[_a\x1C\xC5\x85\x82\x86\x01a\x1BbV[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1C\xE6Wa\x1C\xE5a\x1A\x87V[[a\x1C\xF2\x85\x82\x86\x01a\x1CuV[\x91PP\x92P\x92\x90PV[a\x1D\x05\x81a\x1A\x8BV[\x82RPPV[_` \x82\x01\x90Pa\x1D\x1E_\x83\x01\x84a\x1C\xFCV[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12a\x1DAWa\x1D@a\x1BvV[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1D^Wa\x1D]a\x1D$V[[` \x83\x01\x91P\x83` \x82\x02\x83\x01\x11\x15a\x1DzWa\x1Dya\x1D(V[[\x92P\x92\x90PV[_\x80` \x83\x85\x03\x12\x15a\x1D\x97Wa\x1D\x96a\x1A\x83V[[_\x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1D\xB4Wa\x1D\xB3a\x1A\x87V[[a\x1D\xC0\x85\x82\x86\x01a\x1D,V[\x92P\x92PP\x92P\x92\x90PV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a\x1D\xFE\x81a\x1A\x8BV[\x82RPPV[_\x81\x90P\x91\x90PV[a\x1E\x16\x81a\x1E\x04V[\x82RPPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a\x1EN\x81a\x1B;V[\x82RPPV[_a\x1E_\x83\x83a\x1EEV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a\x1E\x81\x82a\x1E\x1CV[a\x1E\x8B\x81\x85a\x1E&V[\x93Pa\x1E\x96\x83a\x1E6V[\x80_[\x83\x81\x10\x15a\x1E\xC6W\x81Qa\x1E\xAD\x88\x82a\x1ETV[\x97Pa\x1E\xB8\x83a\x1EkV[\x92PP`\x01\x81\x01\x90Pa\x1E\x99V[P\x85\x93PPPP\x92\x91PPV[_`\x80\x83\x01_\x83\x01Qa\x1E\xE8_\x86\x01\x82a\x1D\xF5V[P` \x83\x01Qa\x1E\xFB` \x86\x01\x82a\x1E\rV[P`@\x83\x01Qa\x1F\x0E`@\x86\x01\x82a\x1D\xF5V[P``\x83\x01Q\x84\x82\x03``\x86\x01Ra\x1F&\x82\x82a\x1EwV[\x91PP\x80\x91PP\x92\x91PPV[_a\x1F>\x83\x83a\x1E\xD3V[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a\x1F\\\x82a\x1D\xCCV[a\x1Ff\x81\x85a\x1D\xD6V[\x93P\x83` \x82\x02\x85\x01a\x1Fx\x85a\x1D\xE6V[\x80_[\x85\x81\x10\x15a\x1F\xB3W\x84\x84\x03\x89R\x81Qa\x1F\x94\x85\x82a\x1F3V[\x94Pa\x1F\x9F\x83a\x1FFV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90Pa\x1F{V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra\x1F\xDD\x81\x84a\x1FRV[\x90P\x92\x91PPV[a\x1F\xEE\x81a\x1E\x04V[\x81\x14a\x1F\xF8W_\x80\xFD[PV[_\x815\x90Pa \t\x81a\x1F\xE5V[\x92\x91PPV[_\x80_\x80`\x80\x85\x87\x03\x12\x15a 'Wa &a\x1A\x83V[[_a 4\x87\x82\x88\x01a\x1A\xAAV[\x94PP` a E\x87\x82\x88\x01a\x1F\xFBV[\x93PP`@a V\x87\x82\x88\x01a\x1A\xAAV[\x92PP``a g\x87\x82\x88\x01a\x1A\xAAV[\x91PP\x92\x95\x91\x94P\x92PV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_`\x80\x83\x01_\x83\x01Qa \xB1_\x86\x01\x82a\x1D\xF5V[P` \x83\x01Qa \xC4` \x86\x01\x82a\x1E\rV[P`@\x83\x01Qa \xD7`@\x86\x01\x82a\x1D\xF5V[P``\x83\x01Q\x84\x82\x03``\x86\x01Ra \xEF\x82\x82a\x1EwV[\x91PP\x80\x91PP\x92\x91PPV[_a!\x07\x83\x83a \x9CV[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a!%\x82a sV[a!/\x81\x85a }V[\x93P\x83` \x82\x02\x85\x01a!A\x85a \x8DV[\x80_[\x85\x81\x10\x15a!|W\x84\x84\x03\x89R\x81Qa!]\x85\x82a \xFCV[\x94Pa!h\x83a!\x0FV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90Pa!DV[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra!\xA6\x81\x84a!\x1BV[\x90P\x92\x91PPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_a!\xC8\x82a\x1E\x1CV[a!\xD2\x81\x85a!\xAEV[\x93Pa!\xDD\x83a\x1E6V[\x80_[\x83\x81\x10\x15a\"\rW\x81Qa!\xF4\x88\x82a\x1ETV[\x97Pa!\xFF\x83a\x1EkV[\x92PP`\x01\x81\x01\x90Pa!\xE0V[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra\"2\x81\x84a!\xBEV[\x90P\x92\x91PPV[_\x81\x90P\x92\x91PPV[_a\"N\x82a\x19\xD0V[a\"X\x81\x85a\":V[\x93Pa\"h\x81\x85` \x86\x01a\x19\xEAV[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a\"\xA8`\x02\x83a\":V[\x91Pa\"\xB3\x82a\"tV[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a\"\xF2`\x01\x83a\":V[\x91Pa\"\xFD\x82a\"\xBEV[`\x01\x82\x01\x90P\x91\x90PV[_a#\x13\x82\x87a\"DV[\x91Pa#\x1E\x82a\"\x9CV[\x91Pa#*\x82\x86a\"DV[\x91Pa#5\x82a\"\xE6V[\x91Pa#A\x82\x85a\"DV[\x91Pa#L\x82a\"\xE6V[\x91Pa#X\x82\x84a\"DV[\x91P\x81\x90P\x95\x94PPPPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[a#\x82\x81a#fV[\x82RPPV[_` \x82\x01\x90Pa#\x9B_\x83\x01\x84a#yV[\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`2`\x04R`$_\xFD[a#\xD7\x81a\x1B;V[\x82RPPV[_` \x82\x01\x90Pa#\xF0_\x83\x01\x84a#\xCEV[\x92\x91PPV[a#\xFF\x81a\x1A\xE9V[\x81\x14a$\tW_\x80\xFD[PV[_\x81Q\x90Pa$\x1A\x81a#\xF6V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a$5Wa$4a\x1A\x83V[[_a$B\x84\x82\x85\x01a$\x0CV[\x91PP\x92\x91PPV[a$T\x81a\x1E\x04V[\x82RPPV[_` \x82\x01\x90Pa$m_\x83\x01\x84a$KV[\x92\x91PPV[_`@\x82\x01\x90Pa$\x86_\x83\x01\x85a\x1C\xFCV[a$\x93` \x83\x01\x84a#\xCEV[\x93\x92PPPV[_`\x80\x82\x01\x90Pa$\xAD_\x83\x01\x87a\x1C\xFCV[a$\xBA` \x83\x01\x86a$KV[a$\xC7`@\x83\x01\x85a\x1C\xFCV[a$\xD4``\x83\x01\x84a\x1C\xFCV[\x95\x94PPPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_a%\x14\x82a\x1E\x04V[\x91P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x03a%FWa%Ea$\xDDV[[`\x01\x82\x01\x90P\x91\x90PV[_\x81T\x90P\x91\x90PV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_\x81_\x1C\x90P\x91\x90PV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a%\xA9a%\xA4\x83a%mV[a%xV[\x90P\x91\x90PV[_a%\xBB\x82Ta%\x97V[\x90P\x91\x90PV[_`\x01\x82\x01\x90P\x91\x90PV[_a%\xD8\x82a%QV[a%\xE2\x81\x85a!\xAEV[\x93Pa%\xED\x83a%[V[\x80_[\x83\x81\x10\x15a&$Wa&\x01\x82a%\xB0V[a&\x0B\x88\x82a\x1ETV[\x97Pa&\x16\x83a%\xC2V[\x92PP`\x01\x81\x01\x90Pa%\xF0V[P\x85\x93PPPP\x92\x91PPV[_``\x82\x01\x90Pa&D_\x83\x01\x86a\x1C\xFCV[a&Q` \x83\x01\x85a\x1C\xFCV[\x81\x81\x03`@\x83\x01Ra&c\x81\x84a%\xCEV[\x90P\x94\x93PPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[_\x81Q\x90Pa&\xA8\x81a\x1BLV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a&\xC3Wa&\xC2a\x1A\x83V[[_a&\xD0\x84\x82\x85\x01a&\x9AV[\x91PP\x92\x91PPV[_\x81Q\x90Pa&\xE7\x81a\x1A\x94V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a'\x02Wa'\x01a\x1A\x83V[[_a'\x0F\x84\x82\x85\x01a&\xD9V[\x91PP\x92\x91PPV[_\x81Q\x90Pa'&\x81a\x1F\xE5V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a'AWa'@a\x1A\x83V[[_a'N\x84\x82\x85\x01a'\x18V[\x91PP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x81\x90P\x92\x91PPV[_a'u\x82a'WV[a'\x7F\x81\x85a'aV[\x93Pa'\x8F\x81\x85` \x86\x01a\x19\xEAV[\x80\x84\x01\x91PP\x92\x91PPV[_a'\xA6\x82\x84a'kV[\x91P\x81\x90P\x92\x91PPV", + b"`\xA0`@R0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x80\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP4\x80\x15b\0\0CW_\x80\xFD[Pb\0\0Tb\0\0Z` \x1B` \x1CV[b\0\x01\xC4V[_b\0\0kb\0\x01^` \x1B` \x1CV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15b\0\0\xB6W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14b\0\x01[Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`@Qb\0\x01R\x91\x90b\0\x01\xA9V[`@Q\x80\x91\x03\x90\xA1[PV[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[b\0\x01\xA3\x81b\0\x01\x85V[\x82RPPV[_` \x82\x01\x90Pb\0\x01\xBE_\x83\x01\x84b\0\x01\x98V[\x92\x91PPV[`\x80Qa,Qb\0\x01\xEB_9_\x81\x81a\x14\x1A\x01R\x81\x81a\x14o\x01Ra\x17\x11\x01Ra,Q_\xF3\xFE`\x80`@R`\x046\x10a\0\x9BW_5`\xE0\x1C\x80cU\xC4\xD9\x97\x11a\0cW\x80cU\xC4\xD9\x97\x14a\x01aW\x80c\x90\xF3\x03T\x14a\x01\x9DW\x80c\xA1O\x89q\x14a\x01\xC5W\x80c\xAD<\xB1\xCC\x14a\x02\x01W\x80c\xC4\x11Xt\x14a\x02+W\x80c\xE4\xBB(\x8C\x14a\x02AWa\0\x9BV[\x80c\r\x8En,\x14a\0\x9FW\x80c-\xDC\x9Ao\x14a\0\xC9W\x80c9\xF78\x10\x14a\x01\x05W\x80cO\x1E\xF2\x86\x14a\x01\x1BW\x80cR\xD1\x90-\x14a\x017W[_\x80\xFD[4\x80\x15a\0\xAAW_\x80\xFD[Pa\0\xB3a\x02\x7FV[`@Qa\0\xC0\x91\x90a\x1E\x82V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\0\xD4W_\x80\xFD[Pa\0\xEF`\x04\x806\x03\x81\x01\x90a\0\xEA\x91\x90a\x1E\xE6V[a\x02\xFAV[`@Qa\0\xFC\x91\x90a\x1F+V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x10W_\x80\xFD[Pa\x01\x19a\x03.V[\0[a\x015`\x04\x806\x03\x81\x01\x90a\x010\x91\x90a \xCAV[a\x04\x9EV[\0[4\x80\x15a\x01BW_\x80\xFD[Pa\x01Ka\x04\xBDV[`@Qa\x01X\x91\x90a!3V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01lW_\x80\xFD[Pa\x01\x87`\x04\x806\x03\x81\x01\x90a\x01\x82\x91\x90a!\xA9V[a\x04\xEEV[`@Qa\x01\x94\x91\x90a$\0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xA8W_\x80\xFD[Pa\x01\xC3`\x04\x806\x03\x81\x01\x90a\x01\xBE\x91\x90a$JV[a\x07\x7FV[\0[4\x80\x15a\x01\xD0W_\x80\xFD[Pa\x01\xEB`\x04\x806\x03\x81\x01\x90a\x01\xE6\x91\x90a!\xA9V[a\r\xE7V[`@Qa\x01\xF8\x91\x90a%\xDCV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x0CW_\x80\xFD[Pa\x02\x15a\x10xV[`@Qa\x02\"\x91\x90a\x1E\x82V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x026W_\x80\xFD[Pa\x02?a\x10\xB1V[\0[4\x80\x15a\x02LW_\x80\xFD[Pa\x02g`\x04\x806\x03\x81\x01\x90a\x02b\x91\x90a\x1E\xE6V[a\x11\xD6V[`@Qa\x02v\x93\x92\x91\x90a&wV[`@Q\x80\x91\x03\x90\xF3[```@Q\x80`@\x01`@R\x80`\x11\x81R` \x01\x7FCiphertextCommits\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x02\xC0_a\x12\xDCV[a\x02\xCA`\x02a\x12\xDCV[a\x02\xD3_a\x12\xDCV[`@Q` \x01a\x02\xE6\x94\x93\x92\x91\x90a'\x81V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x90V[_\x80a\x03\x04a\x13\xA6V[\x90P\x80`\x03\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[`\x01a\x038a\x13\xCDV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x03yW`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03_a\x03\x84a\x13\xF1V[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x03\xCCWP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x04\x03W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x04\x92\x91\x90a(\x01V[`@Q\x80\x91\x03\x90\xA1PPV[a\x04\xA6a\x14\x18V[a\x04\xAF\x82a\x14\xFEV[a\x04\xB9\x82\x82a\x15\xF1V[PPV[_a\x04\xC6a\x17\x0FV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[``_a\x04\xF9a\x13\xA6V[\x90P\x83\x83\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x05\x18Wa\x05\x17a\x1F\xA6V[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x05QW\x81` \x01[a\x05>a\x1D\x96V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x056W\x90P[P\x91P_[\x84\x84\x90P\x81\x10\x15a\x07wWa\x05\x83\x85\x85\x83\x81\x81\x10a\x05wWa\x05va(\x1AV[[\x90P` \x02\x015a\x02\xFAV[a\x05\xDDW\x84\x84\x82\x81\x81\x10a\x05\x9AWa\x05\x99a(\x1AV[[\x90P` \x02\x015`@Q\x7F\x06f\xCB\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05\xD4\x91\x90a!3V[`@Q\x80\x91\x03\x90\xFD[_\x82`\x05\x01_\x87\x87\x85\x81\x81\x10a\x05\xF6Wa\x05\xF5a(\x1AV[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x90P`@Q\x80`\xA0\x01`@R\x80\x87\x87\x85\x81\x81\x10a\x06+Wa\x06*a(\x1AV[[\x90P` \x02\x015\x81R` \x01\x84_\x01_\x89\x89\x87\x81\x81\x10a\x06NWa\x06Ma(\x1AV[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x81R` \x01\x84`\x01\x01_\x89\x89\x87\x81\x81\x10a\x06\x80Wa\x06\x7Fa(\x1AV[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x81R` \x01\x84`\x07\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x07*W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x06\xE1W[PPPPP\x81R` \x01\x84`\x08\x01_\x84\x81R` \x01\x90\x81R` \x01_ T\x81RP\x84\x83\x81Q\x81\x10a\x07^Wa\x07]a(\x1AV[[` \x02` \x01\x01\x81\x90RPP\x80\x80`\x01\x01\x91PPa\x05VV[PP\x92\x91PPV[\x83_a\x07\x8A\x82a\x17\x96V[\x90Ps\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x07\xD9\x91\x90a(GV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\xF4W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x08\x18\x91\x90a(\x8AV[a\x08YW\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x08P\x91\x90a(GV[`@Q\x80\x91\x03\x90\xFD[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c:Qb\xE6`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x08\xB2W_\x80\xFD[PZ\xF1\x15\x80\x15a\x08\xC4W=_\x80>=_\xFD[PPPP_\x86\x86\x86\x86`@Q` \x01a\x08\xE0\x94\x93\x92\x91\x90a(\xB5V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P_a\t\x01a\x13\xA6V[\x90P_\x81`\x08\x01_\x84\x81R` \x01\x90\x81R` \x01_ T\x90P_\x81\x03a\t\xC1Ws3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x99\x1D\xC3m`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\t~W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\t\xA2\x91\x90a)\x0CV[\x90P\x80\x82`\x08\x01_\x85\x81R` \x01\x90\x81R` \x01_ \x81\x90UPa\x0B\"V[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xCD\x8E\x99<\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\n\x0E\x91\x90a(GV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\n)W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\nM\x91\x90a(\x8AV[a\x0B!W_s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x88\x8B\x99\xE0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\n\x9F\x91\x90a(GV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\n\xBAW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\n\xDE\x91\x90a)ZV[\x90P\x89\x82\x82`@Q\x7F\x964d1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0B\x18\x93\x92\x91\x90a)\xF8V[`@Q\x80\x91\x03\x90\xFD[[a\x0B,\x813a\x17\xAFV[\x81`\x06\x01_\x8A\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\x0B\xCBW\x883`@Q\x7F\x1D\xD7%\x0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0B\xC2\x92\x91\x90a*#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a\x14\xC5WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x14\xACa\x1ArV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x14\xFCW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x15[W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x15\x7F\x91\x90a+MV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x15\xEEW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x15\xE5\x91\x90a+xV[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x16YWP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x16V\x91\x90a+\xA5V[`\x01[a\x16\x9AW\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x16\x91\x91\x90a+xV[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a\x17\0W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x16\xF7\x91\x90a!3V[`@Q\x80\x91\x03\x90\xFD[a\x17\n\x83\x83a\x1A\xC5V[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x17\x94W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x10\x83_\x1C\x90\x1C\x16\x90P\x91\x90PV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x86%\xE8v\x83\x83`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\xFE\x92\x91\x90a+\xD0V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x18\x19W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x18=\x91\x90a(\x8AV[a\x18\x80W\x81\x81`@Q\x7F)\xA9\x93\xC1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x18w\x92\x91\x90a+\xD0V[`@Q\x80\x91\x03\x90\xFD[PPV[_\x80s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xF8\x81t\xEA\x85`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18\xD3\x91\x90a(GV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x18\xEEW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x19\x12\x91\x90a)\x0CV[\x90P\x80\x83\x10\x15\x91PP\x92\x91PPV[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a\x19}Wz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a\x19sWa\x19ra+\x0CV[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a\x19\xBAWm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a\x19\xB0Wa\x19\xAFa+\x0CV[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a\x19\xE9Wf#\x86\xF2o\xC1\0\0\x83\x81a\x19\xDFWa\x19\xDEa+\x0CV[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a\x1A\x12Wc\x05\xF5\xE1\0\x83\x81a\x1A\x08Wa\x1A\x07a+\x0CV[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a\x1A7Wa'\x10\x83\x81a\x1A-Wa\x1A,a+\x0CV[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a\x1AZW`d\x83\x81a\x1APWa\x1AOa+\x0CV[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a\x1AiW`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a\x1A\x9E\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x1B7V[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a\x1A\xCE\x82a\x1B@V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a\x1B*Wa\x1B$\x82\x82a\x1C\tV[Pa\x1B3V[a\x1B2a\x1C\x89V[[PPV[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a\x1B\x9BW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1B\x92\x91\x90a+xV[`@Q\x80\x91\x03\x90\xFD[\x80a\x1B\xC7\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x1B7V[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa\x1C2\x91\x90a,;V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x1CjW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x1CoV[``\x91P[P\x91P\x91Pa\x1C\x7F\x85\x83\x83a\x1C\xC5V[\x92PPP\x92\x91PPV[_4\x11\x15a\x1C\xC3W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82a\x1C\xDAWa\x1C\xD5\x82a\x1DRV[a\x1DJV[_\x82Q\x14\x80\x15a\x1D\0WP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a\x1DBW\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1D9\x91\x90a+xV[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa\x1DKV[[\x93\x92PPPV[_\x81Q\x11\x15a\x1DdW\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80`\xA0\x01`@R\x80_\x80\x19\x16\x81R` \x01_\x81R` \x01_\x80\x19\x16\x81R` \x01``\x81R` \x01_\x81RP\x90V[`@Q\x80`\xA0\x01`@R\x80_\x80\x19\x16\x81R` \x01_\x81R` \x01_\x80\x19\x16\x81R` \x01``\x81R` \x01_\x81RP\x90V[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a\x1E/W\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa\x1E\x14V[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a\x1ET\x82a\x1D\xF8V[a\x1E^\x81\x85a\x1E\x02V[\x93Pa\x1En\x81\x85` \x86\x01a\x1E\x12V[a\x1Ew\x81a\x1E:V[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra\x1E\x9A\x81\x84a\x1EJV[\x90P\x92\x91PPV[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[a\x1E\xC5\x81a\x1E\xB3V[\x81\x14a\x1E\xCFW_\x80\xFD[PV[_\x815\x90Pa\x1E\xE0\x81a\x1E\xBCV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a\x1E\xFBWa\x1E\xFAa\x1E\xABV[[_a\x1F\x08\x84\x82\x85\x01a\x1E\xD2V[\x91PP\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[a\x1F%\x81a\x1F\x11V[\x82RPPV[_` \x82\x01\x90Pa\x1F>_\x83\x01\x84a\x1F\x1CV[\x92\x91PPV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a\x1Fm\x82a\x1FDV[\x90P\x91\x90PV[a\x1F}\x81a\x1FcV[\x81\x14a\x1F\x87W_\x80\xFD[PV[_\x815\x90Pa\x1F\x98\x81a\x1FtV[\x92\x91PPV[_\x80\xFD[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a\x1F\xDC\x82a\x1E:V[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\x1F\xFBWa\x1F\xFAa\x1F\xA6V[[\x80`@RPPPV[_a \ra\x1E\xA2V[\x90Pa \x19\x82\x82a\x1F\xD3V[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a 8Wa 7a\x1F\xA6V[[a A\x82a\x1E:V[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_a na i\x84a \x1EV[a \x04V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a \x8AWa \x89a\x1F\xA2V[[a \x95\x84\x82\x85a NV[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a \xB1Wa \xB0a\x1F\x9EV[[\x815a \xC1\x84\x82` \x86\x01a \\V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a \xE0Wa \xDFa\x1E\xABV[[_a \xED\x85\x82\x86\x01a\x1F\x8AV[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!\x0EWa!\ra\x1E\xAFV[[a!\x1A\x85\x82\x86\x01a \x9DV[\x91PP\x92P\x92\x90PV[a!-\x81a\x1E\xB3V[\x82RPPV[_` \x82\x01\x90Pa!F_\x83\x01\x84a!$V[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12a!iWa!ha\x1F\x9EV[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!\x86Wa!\x85a!LV[[` \x83\x01\x91P\x83` \x82\x02\x83\x01\x11\x15a!\xA2Wa!\xA1a!PV[[\x92P\x92\x90PV[_\x80` \x83\x85\x03\x12\x15a!\xBFWa!\xBEa\x1E\xABV[[_\x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!\xDCWa!\xDBa\x1E\xAFV[[a!\xE8\x85\x82\x86\x01a!TV[\x92P\x92PP\x92P\x92\x90PV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a\"&\x81a\x1E\xB3V[\x82RPPV[_\x81\x90P\x91\x90PV[a\">\x81a\",V[\x82RPPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a\"v\x81a\x1FcV[\x82RPPV[_a\"\x87\x83\x83a\"mV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a\"\xA9\x82a\"DV[a\"\xB3\x81\x85a\"NV[\x93Pa\"\xBE\x83a\"^V[\x80_[\x83\x81\x10\x15a\"\xEEW\x81Qa\"\xD5\x88\x82a\"|V[\x97Pa\"\xE0\x83a\"\x93V[\x92PP`\x01\x81\x01\x90Pa\"\xC1V[P\x85\x93PPPP\x92\x91PPV[_`\xA0\x83\x01_\x83\x01Qa#\x10_\x86\x01\x82a\"\x1DV[P` \x83\x01Qa##` \x86\x01\x82a\"5V[P`@\x83\x01Qa#6`@\x86\x01\x82a\"\x1DV[P``\x83\x01Q\x84\x82\x03``\x86\x01Ra#N\x82\x82a\"\x9FV[\x91PP`\x80\x83\x01Qa#c`\x80\x86\x01\x82a\"5V[P\x80\x91PP\x92\x91PPV[_a#y\x83\x83a\"\xFBV[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a#\x97\x82a!\xF4V[a#\xA1\x81\x85a!\xFEV[\x93P\x83` \x82\x02\x85\x01a#\xB3\x85a\"\x0EV[\x80_[\x85\x81\x10\x15a#\xEEW\x84\x84\x03\x89R\x81Qa#\xCF\x85\x82a#nV[\x94Pa#\xDA\x83a#\x81V[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90Pa#\xB6V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra$\x18\x81\x84a#\x8DV[\x90P\x92\x91PPV[a$)\x81a\",V[\x81\x14a$3W_\x80\xFD[PV[_\x815\x90Pa$D\x81a$ V[\x92\x91PPV[_\x80_\x80`\x80\x85\x87\x03\x12\x15a$bWa$aa\x1E\xABV[[_a$o\x87\x82\x88\x01a\x1E\xD2V[\x94PP` a$\x80\x87\x82\x88\x01a$6V[\x93PP`@a$\x91\x87\x82\x88\x01a\x1E\xD2V[\x92PP``a$\xA2\x87\x82\x88\x01a\x1E\xD2V[\x91PP\x92\x95\x91\x94P\x92PV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_`\xA0\x83\x01_\x83\x01Qa$\xEC_\x86\x01\x82a\"\x1DV[P` \x83\x01Qa$\xFF` \x86\x01\x82a\"5V[P`@\x83\x01Qa%\x12`@\x86\x01\x82a\"\x1DV[P``\x83\x01Q\x84\x82\x03``\x86\x01Ra%*\x82\x82a\"\x9FV[\x91PP`\x80\x83\x01Qa%?`\x80\x86\x01\x82a\"5V[P\x80\x91PP\x92\x91PPV[_a%U\x83\x83a$\xD7V[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a%s\x82a$\xAEV[a%}\x81\x85a$\xB8V[\x93P\x83` \x82\x02\x85\x01a%\x8F\x85a$\xC8V[\x80_[\x85\x81\x10\x15a%\xCAW\x84\x84\x03\x89R\x81Qa%\xAB\x85\x82a%JV[\x94Pa%\xB6\x83a%]V[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90Pa%\x92V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra%\xF4\x81\x84a%iV[\x90P\x92\x91PPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_a&\x16\x82a\"DV[a& \x81\x85a%\xFCV[\x93Pa&+\x83a\"^V[\x80_[\x83\x81\x10\x15a&[W\x81Qa&B\x88\x82a\"|V[\x97Pa&M\x83a\"\x93V[\x92PP`\x01\x81\x01\x90Pa&.V[P\x85\x93PPPP\x92\x91PPV[a&q\x81a\",V[\x82RPPV[_``\x82\x01\x90P\x81\x81\x03_\x83\x01Ra&\x8F\x81\x86a&\x0CV[\x90Pa&\x9E` \x83\x01\x85a&hV[a&\xAB`@\x83\x01\x84a\x1F\x1CV[\x94\x93PPPPV[_\x81\x90P\x92\x91PPV[_a&\xC7\x82a\x1D\xF8V[a&\xD1\x81\x85a&\xB3V[\x93Pa&\xE1\x81\x85` \x86\x01a\x1E\x12V[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a'!`\x02\x83a&\xB3V[\x91Pa',\x82a&\xEDV[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a'k`\x01\x83a&\xB3V[\x91Pa'v\x82a'7V[`\x01\x82\x01\x90P\x91\x90PV[_a'\x8C\x82\x87a&\xBDV[\x91Pa'\x97\x82a'\x15V[\x91Pa'\xA3\x82\x86a&\xBDV[\x91Pa'\xAE\x82a'_V[\x91Pa'\xBA\x82\x85a&\xBDV[\x91Pa'\xC5\x82a'_V[\x91Pa'\xD1\x82\x84a&\xBDV[\x91P\x81\x90P\x95\x94PPPPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[a'\xFB\x81a'\xDFV[\x82RPPV[_` \x82\x01\x90Pa(\x14_\x83\x01\x84a'\xF2V[\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`2`\x04R`$_\xFD[_` \x82\x01\x90Pa(Z_\x83\x01\x84a&hV[\x92\x91PPV[a(i\x81a\x1F\x11V[\x81\x14a(sW_\x80\xFD[PV[_\x81Q\x90Pa(\x84\x81a(`V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a(\x9FWa(\x9Ea\x1E\xABV[[_a(\xAC\x84\x82\x85\x01a(vV[\x91PP\x92\x91PPV[_`\x80\x82\x01\x90Pa(\xC8_\x83\x01\x87a!$V[a(\xD5` \x83\x01\x86a&hV[a(\xE2`@\x83\x01\x85a!$V[a(\xEF``\x83\x01\x84a!$V[\x95\x94PPPPPV[_\x81Q\x90Pa)\x06\x81a$ V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a)!Wa) a\x1E\xABV[[_a).\x84\x82\x85\x01a(\xF8V[\x91PP\x92\x91PPV[`\x08\x81\x10a)CW_\x80\xFD[PV[_\x81Q\x90Pa)T\x81a)7V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a)oWa)na\x1E\xABV[[_a)|\x84\x82\x85\x01a)FV[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[`\x08\x81\x10a)\xC3Wa)\xC2a)\x85V[[PV[_\x81\x90Pa)\xD3\x82a)\xB2V[\x91\x90PV[_a)\xE2\x82a)\xC6V[\x90P\x91\x90PV[a)\xF2\x81a)\xD8V[\x82RPPV[_``\x82\x01\x90Pa*\x0B_\x83\x01\x86a!$V[a*\x18` \x83\x01\x85a&hV[a*%`@\x83\x01\x84a)\xE9V[\x94\x93PPPPV[a*6\x81a\x1FcV[\x82RPPV[_`@\x82\x01\x90Pa*O_\x83\x01\x85a!$V[a*\\` \x83\x01\x84a*-V[\x93\x92PPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_a*\x9A\x82a\",V[\x91P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x03a*\xCCWa*\xCBa*cV[[`\x01\x82\x01\x90P\x91\x90PV[_``\x82\x01\x90Pa*\xEA_\x83\x01\x86a!$V[a*\xF7` \x83\x01\x85a!$V[a+\x04`@\x83\x01\x84a&hV[\x94\x93PPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[_\x81Q\x90Pa+G\x81a\x1FtV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a+bWa+aa\x1E\xABV[[_a+o\x84\x82\x85\x01a+9V[\x91PP\x92\x91PPV[_` \x82\x01\x90Pa+\x8B_\x83\x01\x84a*-V[\x92\x91PPV[_\x81Q\x90Pa+\x9F\x81a\x1E\xBCV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a+\xBAWa+\xB9a\x1E\xABV[[_a+\xC7\x84\x82\x85\x01a+\x91V[\x91PP\x92\x91PPV[_`@\x82\x01\x90Pa+\xE3_\x83\x01\x85a&hV[a+\xF0` \x83\x01\x84a*-V[\x93\x92PPPV[_\x81Q\x90P\x91\x90PV[_\x81\x90P\x92\x91PPV[_a,\x15\x82a+\xF7V[a,\x1F\x81\x85a,\x01V[\x93Pa,/\x81\x85` \x86\x01a\x1E\x12V[\x80\x84\x01\x91PP\x92\x91PPV[_a,F\x82\x84a,\x0BV[\x91P\x81\x90P\x92\x91PPV", ); /// The runtime bytecode of the contract, as deployed on the network. /// /// ```text - ///0x608060405260043610610090575f3560e01c806355c4d9971161005857806355c4d9971461015657806390f3035414610192578063a14f8971146101ba578063ad3cb1cc146101f6578063e6f6ab941461022057610090565b80630d8e6e2c146100945780632ddc9a6f146100be57806339f73810146100fa5780634f1ef2861461011057806352d1902d1461012c575b5f80fd5b34801561009f575f80fd5b506100a861025c565b6040516100b59190611a5a565b60405180910390f35b3480156100c9575f80fd5b506100e460048036038101906100df9190611abe565b6102d7565b6040516100f19190611b03565b60405180910390f35b348015610105575f80fd5b5061010e61030b565b005b61012a60048036038101906101259190611ca2565b61047b565b005b348015610137575f80fd5b5061014061049a565b60405161014d9190611d0b565b60405180910390f35b348015610161575f80fd5b5061017c60048036038101906101779190611d81565b6104cb565b6040516101899190611fc5565b60405180910390f35b34801561019d575f80fd5b506101b860048036038101906101b3919061200f565b610748565b005b3480156101c5575f80fd5b506101e060048036038101906101db9190611d81565b610c29565b6040516101ed919061218e565b60405180910390f35b348015610201575f80fd5b5061020a610ea6565b6040516102179190611a5a565b60405180910390f35b34801561022b575f80fd5b5061024660048036038101906102419190611abe565b610edf565b604051610253919061221a565b60405180910390f35b60606040518060400160405280601181526020017f43697068657274657874436f6d6d69747300000000000000000000000000000081525061029d5f610fa1565b6102a76001610fa1565b6102b05f610fa1565b6040516020016102c39493929190612308565b604051602081830303815290604052905090565b5f806102e161106b565b9050806003015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b6001610315611092565b67ffffffffffffffff1614610356576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f6103616110b6565b9050805f0160089054906101000a900460ff16806103a957508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b156103e0576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d28260405161046f9190612388565b60405180910390a15050565b6104836110dd565b61048c826111c3565b61049682826112b6565b5050565b5f6104a36113d4565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b60605f6104d661106b565b90508383905067ffffffffffffffff8111156104f5576104f4611b7e565b5b60405190808252806020026020018201604052801561052e57816020015b61051b61197a565b8152602001906001900390816105135790505b5091505f5b8484905081101561074057610560858583818110610554576105536123a1565b5b905060200201356102d7565b6105ba57848482818110610577576105766123a1565b5b905060200201356040517f0666cbdf0000000000000000000000000000000000000000000000000000000081526004016105b19190611d0b565b60405180910390fd5b5f826005015f8787858181106105d3576105d26123a1565b5b9050602002013581526020019081526020015f205490505f836007015f8381526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561067b57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610632575b5050505050905060405180608001604052808888868181106106a05761069f6123a1565b5b905060200201358152602001855f015f8a8a888181106106c3576106c26123a1565b5b9050602002013581526020019081526020015f20548152602001856001015f8a8a888181106106f5576106f46123a1565b5b9050602002013581526020019081526020015f2054815260200182815250858481518110610726576107256123a1565b5b602002602001018190525050508080600101915050610533565b505092915050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16632dd3edfe336040518263ffffffff1660e01b815260040161079591906123dd565b602060405180830381865afa1580156107b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d49190612420565b61081557336040517f52d725f500000000000000000000000000000000000000000000000000000000815260040161080c91906123dd565b60405180910390fd5b835f6108208261145b565b905073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663bff3aaba826040518263ffffffff1660e01b815260040161086f919061245a565b602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612420565b6108ef57806040517fb6679c3b0000000000000000000000000000000000000000000000000000000081526004016108e6919061245a565b60405180910390fd5b5f6108f861106b565b9050806006015f8881526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156109995786336040517f1dd7250c000000000000000000000000000000000000000000000000000000008152600401610990929190612473565b60405180910390fd5b5f878787876040516020016109b1949392919061249a565b604051602081830303815290604052805190602001209050816004015f8281526020019081526020015f205f8154809291906109ec9061250a565b91905055505f826008015f8381526020019081526020015f205403610a25576001826008015f8381526020019081526020015f20819055505b6001826006015f8a81526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550816007015f8281526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816003015f8981526020019081526020015f205f9054906101000a900460ff16158015610b415750610b40826004015f8381526020019081526020015f2054611474565b5b15610c1f5785826001015f8a81526020019081526020015f208190555084826002015f8a81526020019081526020015f208190555086825f015f8a81526020019081526020015f20819055506001826003015f8a81526020019081526020015f205f6101000a81548160ff02191690831515021790555080826005015f8a81526020019081526020015f2081905550877fcb89ccb347018d7f282bb4c048e135e19bc1d13660fa0f2850e10518422536de8787856007015f8681526020019081526020015f20604051610c1693929190612631565b60405180910390a25b5050505050505050565b60605f610c3461106b565b90508383905067ffffffffffffffff811115610c5357610c52611b7e565b5b604051908082528060200260200182016040528015610c8c57816020015b610c796119a5565b815260200190600190039081610c715790505b5091505f5b84849050811015610e9e57610cbe858583818110610cb257610cb16123a1565b5b905060200201356102d7565b610d1857848482818110610cd557610cd46123a1565b5b905060200201356040517f0666cbdf000000000000000000000000000000000000000000000000000000008152600401610d0f9190611d0b565b60405180910390fd5b5f826005015f878785818110610d3157610d306123a1565b5b9050602002013581526020019081526020015f205490505f836007015f8381526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015610dd957602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610d90575b505050505090506040518060800160405280888886818110610dfe57610dfd6123a1565b5b905060200201358152602001855f015f8a8a88818110610e2157610e206123a1565b5b9050602002013581526020019081526020015f20548152602001856002015f8a8a88818110610e5357610e526123a1565b5b9050602002013581526020019081526020015f2054815260200182815250858481518110610e8457610e836123a1565b5b602002602001018190525050508080600101915050610c91565b505092915050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60605f610eea61106b565b90505f816005015f8581526020019081526020015f20549050816007015f8281526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015610f9357602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610f4a575b505050505092505050919050565b60605f6001610faf84611505565b0190505f8167ffffffffffffffff811115610fcd57610fcc611b7e565b5b6040519080825280601f01601f191660200182016040528015610fff5781602001600182028036833780820191505090505b5090505f82602001820190505b600115611060578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816110555761105461266d565b5b0494505f850361100c575b819350505050919050565b5f7ff41c60ea5b83c8f19b663613ffdd3fa441a59933b8a4fdf4da891b38433d1a00905090565b5f61109b6110b6565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148061118a57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611171611656565b73ffffffffffffffffffffffffffffffffffffffff1614155b156111c1576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611220573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124491906126ae565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112b357336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016112aa91906123dd565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561131e57506040513d601f19601f8201168201806040525081019061131b91906126ed565b60015b61135f57816040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815260040161135691906123dd565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b81146113c557806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016113bc9190611d0b565b60405180910390fd5b6113cf83836116a9565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611459576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f67ffffffffffffffff6010835f1c901c169050919050565b5f8073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16636799ef526040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f7919061272c565b905080831015915050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611561577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816115575761155661266d565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061159e576d04ee2d6d415b85acef810000000083816115945761159361266d565b5b0492506020810190505b662386f26fc1000083106115cd57662386f26fc1000083816115c3576115c261266d565b5b0492506010810190505b6305f5e10083106115f6576305f5e10083816115ec576115eb61266d565b5b0492506008810190505b612710831061161b5761271083816116115761161061266d565b5b0492506004810190505b6064831061163e57606483816116345761163361266d565b5b0492506002810190505b600a831061164d576001810190505b80915050919050565b5f6116827f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61171b565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116b282611724565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f8151111561170e5761170882826117ed565b50611717565b61171661186d565b5b5050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361177f57806040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815260040161177691906123dd565b60405180910390fd5b806117ab7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61171b565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051611816919061279b565b5f60405180830381855af49150503d805f811461184e576040519150601f19603f3d011682016040523d82523d5f602084013e611853565b606091505b50915091506118638583836118a9565b9250505092915050565b5f3411156118a7576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6060826118be576118b982611936565b61192e565b5f82511480156118e457505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561192657836040517f9996b31500000000000000000000000000000000000000000000000000000000815260040161191d91906123dd565b60405180910390fd5b81905061192f565b5b9392505050565b5f815111156119485780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180608001604052805f80191681526020015f81526020015f8019168152602001606081525090565b60405180608001604052805f80191681526020015f81526020015f8019168152602001606081525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611a075780820151818401526020810190506119ec565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611a2c826119d0565b611a3681856119da565b9350611a468185602086016119ea565b611a4f81611a12565b840191505092915050565b5f6020820190508181035f830152611a728184611a22565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b611a9d81611a8b565b8114611aa7575f80fd5b50565b5f81359050611ab881611a94565b92915050565b5f60208284031215611ad357611ad2611a83565b5b5f611ae084828501611aaa565b91505092915050565b5f8115159050919050565b611afd81611ae9565b82525050565b5f602082019050611b165f830184611af4565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611b4582611b1c565b9050919050565b611b5581611b3b565b8114611b5f575f80fd5b50565b5f81359050611b7081611b4c565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611bb482611a12565b810181811067ffffffffffffffff82111715611bd357611bd2611b7e565b5b80604052505050565b5f611be5611a7a565b9050611bf18282611bab565b919050565b5f67ffffffffffffffff821115611c1057611c0f611b7e565b5b611c1982611a12565b9050602081019050919050565b828183375f83830152505050565b5f611c46611c4184611bf6565b611bdc565b905082815260208101848484011115611c6257611c61611b7a565b5b611c6d848285611c26565b509392505050565b5f82601f830112611c8957611c88611b76565b5b8135611c99848260208601611c34565b91505092915050565b5f8060408385031215611cb857611cb7611a83565b5b5f611cc585828601611b62565b925050602083013567ffffffffffffffff811115611ce657611ce5611a87565b5b611cf285828601611c75565b9150509250929050565b611d0581611a8b565b82525050565b5f602082019050611d1e5f830184611cfc565b92915050565b5f80fd5b5f80fd5b5f8083601f840112611d4157611d40611b76565b5b8235905067ffffffffffffffff811115611d5e57611d5d611d24565b5b602083019150836020820283011115611d7a57611d79611d28565b5b9250929050565b5f8060208385031215611d9757611d96611a83565b5b5f83013567ffffffffffffffff811115611db457611db3611a87565b5b611dc085828601611d2c565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611dfe81611a8b565b82525050565b5f819050919050565b611e1681611e04565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611e4e81611b3b565b82525050565b5f611e5f8383611e45565b60208301905092915050565b5f602082019050919050565b5f611e8182611e1c565b611e8b8185611e26565b9350611e9683611e36565b805f5b83811015611ec6578151611ead8882611e54565b9750611eb883611e6b565b925050600181019050611e99565b5085935050505092915050565b5f608083015f830151611ee85f860182611df5565b506020830151611efb6020860182611e0d565b506040830151611f0e6040860182611df5565b5060608301518482036060860152611f268282611e77565b9150508091505092915050565b5f611f3e8383611ed3565b905092915050565b5f602082019050919050565b5f611f5c82611dcc565b611f668185611dd6565b935083602082028501611f7885611de6565b805f5b85811015611fb35784840389528151611f948582611f33565b9450611f9f83611f46565b925060208a01995050600181019050611f7b565b50829750879550505050505092915050565b5f6020820190508181035f830152611fdd8184611f52565b905092915050565b611fee81611e04565b8114611ff8575f80fd5b50565b5f8135905061200981611fe5565b92915050565b5f805f806080858703121561202757612026611a83565b5b5f61203487828801611aaa565b945050602061204587828801611ffb565b935050604061205687828801611aaa565b925050606061206787828801611aaa565b91505092959194509250565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f608083015f8301516120b15f860182611df5565b5060208301516120c46020860182611e0d565b5060408301516120d76040860182611df5565b50606083015184820360608601526120ef8282611e77565b9150508091505092915050565b5f612107838361209c565b905092915050565b5f602082019050919050565b5f61212582612073565b61212f818561207d565b9350836020820285016121418561208d565b805f5b8581101561217c578484038952815161215d85826120fc565b94506121688361210f565b925060208a01995050600181019050612144565b50829750879550505050505092915050565b5f6020820190508181035f8301526121a6818461211b565b905092915050565b5f82825260208201905092915050565b5f6121c882611e1c565b6121d281856121ae565b93506121dd83611e36565b805f5b8381101561220d5781516121f48882611e54565b97506121ff83611e6b565b9250506001810190506121e0565b5085935050505092915050565b5f6020820190508181035f83015261223281846121be565b905092915050565b5f81905092915050565b5f61224e826119d0565b612258818561223a565b93506122688185602086016119ea565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f6122a860028361223a565b91506122b382612274565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6122f260018361223a565b91506122fd826122be565b600182019050919050565b5f6123138287612244565b915061231e8261229c565b915061232a8286612244565b9150612335826122e6565b91506123418285612244565b915061234c826122e6565b91506123588284612244565b915081905095945050505050565b5f67ffffffffffffffff82169050919050565b61238281612366565b82525050565b5f60208201905061239b5f830184612379565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6123d781611b3b565b82525050565b5f6020820190506123f05f8301846123ce565b92915050565b6123ff81611ae9565b8114612409575f80fd5b50565b5f8151905061241a816123f6565b92915050565b5f6020828403121561243557612434611a83565b5b5f6124428482850161240c565b91505092915050565b61245481611e04565b82525050565b5f60208201905061246d5f83018461244b565b92915050565b5f6040820190506124865f830185611cfc565b61249360208301846123ce565b9392505050565b5f6080820190506124ad5f830187611cfc565b6124ba602083018661244b565b6124c76040830185611cfc565b6124d46060830184611cfc565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61251482611e04565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612546576125456124dd565b5b600182019050919050565b5f81549050919050565b5f819050815f5260205f209050919050565b5f815f1c9050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6125a96125a48361256d565b612578565b9050919050565b5f6125bb8254612597565b9050919050565b5f600182019050919050565b5f6125d882612551565b6125e281856121ae565b93506125ed8361255b565b805f5b8381101561262457612601826125b0565b61260b8882611e54565b9750612616836125c2565b9250506001810190506125f0565b5085935050505092915050565b5f6060820190506126445f830186611cfc565b6126516020830185611cfc565b818103604083015261266381846125ce565b9050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f815190506126a881611b4c565b92915050565b5f602082840312156126c3576126c2611a83565b5b5f6126d08482850161269a565b91505092915050565b5f815190506126e781611a94565b92915050565b5f6020828403121561270257612701611a83565b5b5f61270f848285016126d9565b91505092915050565b5f8151905061272681611fe5565b92915050565b5f6020828403121561274157612740611a83565b5b5f61274e84828501612718565b91505092915050565b5f81519050919050565b5f81905092915050565b5f61277582612757565b61277f8185612761565b935061278f8185602086016119ea565b80840191505092915050565b5f6127a6828461276b565b91508190509291505056 + ///0x60806040526004361061009b575f3560e01c806355c4d9971161006357806355c4d9971461016157806390f303541461019d578063a14f8971146101c5578063ad3cb1cc14610201578063c41158741461022b578063e4bb288c146102415761009b565b80630d8e6e2c1461009f5780632ddc9a6f146100c957806339f73810146101055780634f1ef2861461011b57806352d1902d14610137575b5f80fd5b3480156100aa575f80fd5b506100b361027f565b6040516100c09190611e82565b60405180910390f35b3480156100d4575f80fd5b506100ef60048036038101906100ea9190611ee6565b6102fa565b6040516100fc9190611f2b565b60405180910390f35b348015610110575f80fd5b5061011961032e565b005b610135600480360381019061013091906120ca565b61049e565b005b348015610142575f80fd5b5061014b6104bd565b6040516101589190612133565b60405180910390f35b34801561016c575f80fd5b50610187600480360381019061018291906121a9565b6104ee565b6040516101949190612400565b60405180910390f35b3480156101a8575f80fd5b506101c360048036038101906101be919061244a565b61077f565b005b3480156101d0575f80fd5b506101eb60048036038101906101e691906121a9565b610de7565b6040516101f891906125dc565b60405180910390f35b34801561020c575f80fd5b50610215611078565b6040516102229190611e82565b60405180910390f35b348015610236575f80fd5b5061023f6110b1565b005b34801561024c575f80fd5b5061026760048036038101906102629190611ee6565b6111d6565b60405161027693929190612677565b60405180910390f35b60606040518060400160405280601181526020017f43697068657274657874436f6d6d6974730000000000000000000000000000008152506102c05f6112dc565b6102ca60026112dc565b6102d35f6112dc565b6040516020016102e69493929190612781565b604051602081830303815290604052905090565b5f806103046113a6565b9050806003015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b60016103386113cd565b67ffffffffffffffff1614610379576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f6103846113f1565b9050805f0160089054906101000a900460ff16806103cc57508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15610403576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2826040516104929190612801565b60405180910390a15050565b6104a6611418565b6104af826114fe565b6104b982826115f1565b5050565b5f6104c661170f565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b60605f6104f96113a6565b90508383905067ffffffffffffffff81111561051857610517611fa6565b5b60405190808252806020026020018201604052801561055157816020015b61053e611d96565b8152602001906001900390816105365790505b5091505f5b84849050811015610777576105838585838181106105775761057661281a565b5b905060200201356102fa565b6105dd5784848281811061059a5761059961281a565b5b905060200201356040517f0666cbdf0000000000000000000000000000000000000000000000000000000081526004016105d49190612133565b60405180910390fd5b5f826005015f8787858181106105f6576105f561281a565b5b9050602002013581526020019081526020015f205490506040518060a0016040528087878581811061062b5761062a61281a565b5b905060200201358152602001845f015f89898781811061064e5761064d61281a565b5b9050602002013581526020019081526020015f20548152602001846001015f8989878181106106805761067f61281a565b5b9050602002013581526020019081526020015f20548152602001846007015f8481526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561072a57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116106e1575b50505050508152602001846008015f8481526020019081526020015f205481525084838151811061075e5761075d61281a565b5b6020026020010181905250508080600101915050610556565b505092915050565b835f61078a82611796565b905073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663bff3aaba826040518263ffffffff1660e01b81526004016107d99190612847565b602060405180830381865afa1580156107f4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610818919061288a565b61085957806040517fb6679c3b0000000000000000000000000000000000000000000000000000000081526004016108509190612847565b60405180910390fd5b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16633a5162e66040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156108b2575f80fd5b505af11580156108c4573d5f803e3d5ffd5b505050505f868686866040516020016108e094939291906128b5565b6040516020818303038152906040528051906020012090505f6109016113a6565b90505f816008015f8481526020019081526020015f205490505f81036109c1577333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663991dc36d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561097e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a2919061290c565b905080826008015f8581526020019081526020015f2081905550610b22565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663cd8e993c826040518263ffffffff1660e01b8152600401610a0e9190612847565b602060405180830381865afa158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d919061288a565b610b21575f7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663888b99e0836040518263ffffffff1660e01b8152600401610a9f9190612847565b602060405180830381865afa158015610aba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ade919061295a565b90508982826040517f96346431000000000000000000000000000000000000000000000000000000008152600401610b18939291906129f8565b60405180910390fd5b5b610b2c81336117af565b816006015f8a81526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615610bcb5788336040517f1dd7250c000000000000000000000000000000000000000000000000000000008152600401610bc2929190612a3c565b60405180910390fd5b816004015f8481526020019081526020015f205f815480929190610bee90612a90565b91905055506001826006015f8b81526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550816007015f8481526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816003015f8a81526020019081526020015f205f9054906101000a900460ff16158015610d105750610d0f81836004015f8681526020019081526020015f2054611884565b5b15610ddc5786826001015f8b81526020019081526020015f208190555085826002015f8b81526020019081526020015f208190555087825f015f8b81526020019081526020015f20819055506001826003015f8b81526020019081526020015f205f6101000a81548160ff02191690831515021790555082826005015f8b81526020019081526020015f2081905550887fc3113162bedb887e086a25724f966348968a75efd447615ebfd0f715939ad964888884604051610dd393929190612ad7565b60405180910390a25b505050505050505050565b60605f610df26113a6565b90508383905067ffffffffffffffff811115610e1157610e10611fa6565b5b604051908082528060200260200182016040528015610e4a57816020015b610e37611dc7565b815260200190600190039081610e2f5790505b5091505f5b8484905081101561107057610e7c858583818110610e7057610e6f61281a565b5b905060200201356102fa565b610ed657848482818110610e9357610e9261281a565b5b905060200201356040517f0666cbdf000000000000000000000000000000000000000000000000000000008152600401610ecd9190612133565b60405180910390fd5b5f826005015f878785818110610eef57610eee61281a565b5b9050602002013581526020019081526020015f205490506040518060a00160405280878785818110610f2457610f2361281a565b5b905060200201358152602001845f015f898987818110610f4757610f4661281a565b5b9050602002013581526020019081526020015f20548152602001846002015f898987818110610f7957610f7861281a565b5b9050602002013581526020019081526020015f20548152602001846007015f8481526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561102357602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610fda575b50505050508152602001846008015f8481526020019081526020015f20548152508483815181106110575761105661281a565b5b6020026020010181905250508080600101915050610e4f565b505092915050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60035f6110bc6113f1565b9050805f0160089054906101000a900460ff168061110457508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b1561113b576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2826040516111ca9190612801565b60405180910390a15050565b60605f805f6111e36113a6565b90505f816003015f8781526020019081526020015f205f9054906101000a900460ff1690505f826005015f8881526020019081526020015f20549050826007015f8281526020019081526020015f20836008015f8381526020019081526020015f205483828054806020026020016040519081016040528092919081815260200182805480156112c557602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161127c575b505050505092509550955095505050509193909250565b60605f60016112ea84611921565b0190505f8167ffffffffffffffff81111561130857611307611fa6565b5b6040519080825280601f01601f19166020018201604052801561133a5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561139b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816113905761138f612b0c565b5b0494505f8503611347575b819350505050919050565b5f7ff41c60ea5b83c8f19b663613ffdd3fa441a59933b8a4fdf4da891b38433d1a00905090565b5f6113d66113f1565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614806114c557507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166114ac611a72565b73ffffffffffffffffffffffffffffffffffffffff1614155b156114fc576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561155b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157f9190612b4d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115ee57336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016115e59190612b78565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561165957506040513d601f19601f820116820180604052508101906116569190612ba5565b60015b61169a57816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016116919190612b78565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b811461170057806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016116f79190612133565b60405180910390fd5b61170a8383611ac5565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611794576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f67ffffffffffffffff6010835f1c901c169050919050565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16638625e87683836040518363ffffffff1660e01b81526004016117fe929190612bd0565b602060405180830381865afa158015611819573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183d919061288a565b6118805781816040517f29a993c1000000000000000000000000000000000000000000000000000000008152600401611877929190612bd0565b60405180910390fd5b5050565b5f807333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663f88174ea856040518263ffffffff1660e01b81526004016118d39190612847565b602060405180830381865afa1580156118ee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611912919061290c565b90508083101591505092915050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061197d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161197357611972612b0c565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106119ba576d04ee2d6d415b85acef810000000083816119b0576119af612b0c565b5b0492506020810190505b662386f26fc1000083106119e957662386f26fc1000083816119df576119de612b0c565b5b0492506010810190505b6305f5e1008310611a12576305f5e1008381611a0857611a07612b0c565b5b0492506008810190505b6127108310611a37576127108381611a2d57611a2c612b0c565b5b0492506004810190505b60648310611a5a5760648381611a5057611a4f612b0c565b5b0492506002810190505b600a8310611a69576001810190505b80915050919050565b5f611a9e7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b611b37565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ace82611b40565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f81511115611b2a57611b248282611c09565b50611b33565b611b32611c89565b5b5050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03611b9b57806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401611b929190612b78565b60405180910390fd5b80611bc77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b611b37565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051611c329190612c3b565b5f60405180830381855af49150503d805f8114611c6a576040519150601f19603f3d011682016040523d82523d5f602084013e611c6f565b606091505b5091509150611c7f858383611cc5565b9250505092915050565b5f341115611cc3576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b606082611cda57611cd582611d52565b611d4a565b5f8251148015611d0057505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15611d4257836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401611d399190612b78565b60405180910390fd5b819050611d4b565b5b9392505050565b5f81511115611d645780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060a001604052805f80191681526020015f81526020015f8019168152602001606081526020015f81525090565b6040518060a001604052805f80191681526020015f81526020015f8019168152602001606081526020015f81525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611e2f578082015181840152602081019050611e14565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611e5482611df8565b611e5e8185611e02565b9350611e6e818560208601611e12565b611e7781611e3a565b840191505092915050565b5f6020820190508181035f830152611e9a8184611e4a565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b611ec581611eb3565b8114611ecf575f80fd5b50565b5f81359050611ee081611ebc565b92915050565b5f60208284031215611efb57611efa611eab565b5b5f611f0884828501611ed2565b91505092915050565b5f8115159050919050565b611f2581611f11565b82525050565b5f602082019050611f3e5f830184611f1c565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f6d82611f44565b9050919050565b611f7d81611f63565b8114611f87575f80fd5b50565b5f81359050611f9881611f74565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611fdc82611e3a565b810181811067ffffffffffffffff82111715611ffb57611ffa611fa6565b5b80604052505050565b5f61200d611ea2565b90506120198282611fd3565b919050565b5f67ffffffffffffffff82111561203857612037611fa6565b5b61204182611e3a565b9050602081019050919050565b828183375f83830152505050565b5f61206e6120698461201e565b612004565b90508281526020810184848401111561208a57612089611fa2565b5b61209584828561204e565b509392505050565b5f82601f8301126120b1576120b0611f9e565b5b81356120c184826020860161205c565b91505092915050565b5f80604083850312156120e0576120df611eab565b5b5f6120ed85828601611f8a565b925050602083013567ffffffffffffffff81111561210e5761210d611eaf565b5b61211a8582860161209d565b9150509250929050565b61212d81611eb3565b82525050565b5f6020820190506121465f830184612124565b92915050565b5f80fd5b5f80fd5b5f8083601f84011261216957612168611f9e565b5b8235905067ffffffffffffffff8111156121865761218561214c565b5b6020830191508360208202830111156121a2576121a1612150565b5b9250929050565b5f80602083850312156121bf576121be611eab565b5b5f83013567ffffffffffffffff8111156121dc576121db611eaf565b5b6121e885828601612154565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61222681611eb3565b82525050565b5f819050919050565b61223e8161222c565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61227681611f63565b82525050565b5f612287838361226d565b60208301905092915050565b5f602082019050919050565b5f6122a982612244565b6122b3818561224e565b93506122be8361225e565b805f5b838110156122ee5781516122d5888261227c565b97506122e083612293565b9250506001810190506122c1565b5085935050505092915050565b5f60a083015f8301516123105f86018261221d565b5060208301516123236020860182612235565b506040830151612336604086018261221d565b506060830151848203606086015261234e828261229f565b91505060808301516123636080860182612235565b508091505092915050565b5f61237983836122fb565b905092915050565b5f602082019050919050565b5f612397826121f4565b6123a181856121fe565b9350836020820285016123b38561220e565b805f5b858110156123ee57848403895281516123cf858261236e565b94506123da83612381565b925060208a019950506001810190506123b6565b50829750879550505050505092915050565b5f6020820190508181035f830152612418818461238d565b905092915050565b6124298161222c565b8114612433575f80fd5b50565b5f8135905061244481612420565b92915050565b5f805f806080858703121561246257612461611eab565b5b5f61246f87828801611ed2565b945050602061248087828801612436565b935050604061249187828801611ed2565b92505060606124a287828801611ed2565b91505092959194509250565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f60a083015f8301516124ec5f86018261221d565b5060208301516124ff6020860182612235565b506040830151612512604086018261221d565b506060830151848203606086015261252a828261229f565b915050608083015161253f6080860182612235565b508091505092915050565b5f61255583836124d7565b905092915050565b5f602082019050919050565b5f612573826124ae565b61257d81856124b8565b93508360208202850161258f856124c8565b805f5b858110156125ca57848403895281516125ab858261254a565b94506125b68361255d565b925060208a01995050600181019050612592565b50829750879550505050505092915050565b5f6020820190508181035f8301526125f48184612569565b905092915050565b5f82825260208201905092915050565b5f61261682612244565b61262081856125fc565b935061262b8361225e565b805f5b8381101561265b578151612642888261227c565b975061264d83612293565b92505060018101905061262e565b5085935050505092915050565b6126718161222c565b82525050565b5f6060820190508181035f83015261268f818661260c565b905061269e6020830185612668565b6126ab6040830184611f1c565b949350505050565b5f81905092915050565b5f6126c782611df8565b6126d181856126b3565b93506126e1818560208601611e12565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f6127216002836126b3565b915061272c826126ed565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61276b6001836126b3565b915061277682612737565b600182019050919050565b5f61278c82876126bd565b915061279782612715565b91506127a382866126bd565b91506127ae8261275f565b91506127ba82856126bd565b91506127c58261275f565b91506127d182846126bd565b915081905095945050505050565b5f67ffffffffffffffff82169050919050565b6127fb816127df565b82525050565b5f6020820190506128145f8301846127f2565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208201905061285a5f830184612668565b92915050565b61286981611f11565b8114612873575f80fd5b50565b5f8151905061288481612860565b92915050565b5f6020828403121561289f5761289e611eab565b5b5f6128ac84828501612876565b91505092915050565b5f6080820190506128c85f830187612124565b6128d56020830186612668565b6128e26040830185612124565b6128ef6060830184612124565b95945050505050565b5f8151905061290681612420565b92915050565b5f6020828403121561292157612920611eab565b5b5f61292e848285016128f8565b91505092915050565b60088110612943575f80fd5b50565b5f8151905061295481612937565b92915050565b5f6020828403121561296f5761296e611eab565b5b5f61297c84828501612946565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600881106129c3576129c2612985565b5b50565b5f8190506129d3826129b2565b919050565b5f6129e2826129c6565b9050919050565b6129f2816129d8565b82525050565b5f606082019050612a0b5f830186612124565b612a186020830185612668565b612a2560408301846129e9565b949350505050565b612a3681611f63565b82525050565b5f604082019050612a4f5f830185612124565b612a5c6020830184612a2d565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612a9a8261222c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612acc57612acb612a63565b5b600182019050919050565b5f606082019050612aea5f830186612124565b612af76020830185612124565b612b046040830184612668565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81519050612b4781611f74565b92915050565b5f60208284031215612b6257612b61611eab565b5b5f612b6f84828501612b39565b91505092915050565b5f602082019050612b8b5f830184612a2d565b92915050565b5f81519050612b9f81611ebc565b92915050565b5f60208284031215612bba57612bb9611eab565b5b5f612bc784828501612b91565b91505092915050565b5f604082019050612be35f830185612668565b612bf06020830184612a2d565b9392505050565b5f81519050919050565b5f81905092915050565b5f612c1582612bf7565b612c1f8185612c01565b9350612c2f818560208601611e12565b80840191505092915050565b5f612c468284612c0b565b91508190509291505056 /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\x80`@R`\x046\x10a\0\x90W_5`\xE0\x1C\x80cU\xC4\xD9\x97\x11a\0XW\x80cU\xC4\xD9\x97\x14a\x01VW\x80c\x90\xF3\x03T\x14a\x01\x92W\x80c\xA1O\x89q\x14a\x01\xBAW\x80c\xAD<\xB1\xCC\x14a\x01\xF6W\x80c\xE6\xF6\xAB\x94\x14a\x02 Wa\0\x90V[\x80c\r\x8En,\x14a\0\x94W\x80c-\xDC\x9Ao\x14a\0\xBEW\x80c9\xF78\x10\x14a\0\xFAW\x80cO\x1E\xF2\x86\x14a\x01\x10W\x80cR\xD1\x90-\x14a\x01,W[_\x80\xFD[4\x80\x15a\0\x9FW_\x80\xFD[Pa\0\xA8a\x02\\V[`@Qa\0\xB5\x91\x90a\x1AZV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\0\xC9W_\x80\xFD[Pa\0\xE4`\x04\x806\x03\x81\x01\x90a\0\xDF\x91\x90a\x1A\xBEV[a\x02\xD7V[`@Qa\0\xF1\x91\x90a\x1B\x03V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x05W_\x80\xFD[Pa\x01\x0Ea\x03\x0BV[\0[a\x01*`\x04\x806\x03\x81\x01\x90a\x01%\x91\x90a\x1C\xA2V[a\x04{V[\0[4\x80\x15a\x017W_\x80\xFD[Pa\x01@a\x04\x9AV[`@Qa\x01M\x91\x90a\x1D\x0BV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01aW_\x80\xFD[Pa\x01|`\x04\x806\x03\x81\x01\x90a\x01w\x91\x90a\x1D\x81V[a\x04\xCBV[`@Qa\x01\x89\x91\x90a\x1F\xC5V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x9DW_\x80\xFD[Pa\x01\xB8`\x04\x806\x03\x81\x01\x90a\x01\xB3\x91\x90a \x0FV[a\x07HV[\0[4\x80\x15a\x01\xC5W_\x80\xFD[Pa\x01\xE0`\x04\x806\x03\x81\x01\x90a\x01\xDB\x91\x90a\x1D\x81V[a\x0C)V[`@Qa\x01\xED\x91\x90a!\x8EV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x01W_\x80\xFD[Pa\x02\na\x0E\xA6V[`@Qa\x02\x17\x91\x90a\x1AZV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02+W_\x80\xFD[Pa\x02F`\x04\x806\x03\x81\x01\x90a\x02A\x91\x90a\x1A\xBEV[a\x0E\xDFV[`@Qa\x02S\x91\x90a\"\x1AV[`@Q\x80\x91\x03\x90\xF3[```@Q\x80`@\x01`@R\x80`\x11\x81R` \x01\x7FCiphertextCommits\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x02\x9D_a\x0F\xA1V[a\x02\xA7`\x01a\x0F\xA1V[a\x02\xB0_a\x0F\xA1V[`@Q` \x01a\x02\xC3\x94\x93\x92\x91\x90a#\x08V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x90V[_\x80a\x02\xE1a\x10kV[\x90P\x80`\x03\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[`\x01a\x03\x15a\x10\x92V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x03VW`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02_a\x03aa\x10\xB6V[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x03\xA9WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x03\xE0W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x04o\x91\x90a#\x88V[`@Q\x80\x91\x03\x90\xA1PPV[a\x04\x83a\x10\xDDV[a\x04\x8C\x82a\x11\xC3V[a\x04\x96\x82\x82a\x12\xB6V[PPV[_a\x04\xA3a\x13\xD4V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[``_a\x04\xD6a\x10kV[\x90P\x83\x83\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x04\xF5Wa\x04\xF4a\x1B~V[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x05.W\x81` \x01[a\x05\x1Ba\x19zV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x05\x13W\x90P[P\x91P_[\x84\x84\x90P\x81\x10\x15a\x07@Wa\x05`\x85\x85\x83\x81\x81\x10a\x05TWa\x05Sa#\xA1V[[\x90P` \x02\x015a\x02\xD7V[a\x05\xBAW\x84\x84\x82\x81\x81\x10a\x05wWa\x05va#\xA1V[[\x90P` \x02\x015`@Q\x7F\x06f\xCB\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05\xB1\x91\x90a\x1D\x0BV[`@Q\x80\x91\x03\x90\xFD[_\x82`\x05\x01_\x87\x87\x85\x81\x81\x10a\x05\xD3Wa\x05\xD2a#\xA1V[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x90P_\x83`\x07\x01_\x83\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x06{W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x062W[PPPPP\x90P`@Q\x80`\x80\x01`@R\x80\x88\x88\x86\x81\x81\x10a\x06\xA0Wa\x06\x9Fa#\xA1V[[\x90P` \x02\x015\x81R` \x01\x85_\x01_\x8A\x8A\x88\x81\x81\x10a\x06\xC3Wa\x06\xC2a#\xA1V[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x81R` \x01\x85`\x01\x01_\x8A\x8A\x88\x81\x81\x10a\x06\xF5Wa\x06\xF4a#\xA1V[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x81R` \x01\x82\x81RP\x85\x84\x81Q\x81\x10a\x07&Wa\x07%a#\xA1V[[` \x02` \x01\x01\x81\x90RPPP\x80\x80`\x01\x01\x91PPa\x053V[PP\x92\x91PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xD3\xED\xFE3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x07\x95\x91\x90a#\xDDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\xB0W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xD4\x91\x90a$ V[a\x08\x15W3`@Q\x7FR\xD7%\xF5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x08\x0C\x91\x90a#\xDDV[`@Q\x80\x91\x03\x90\xFD[\x83_a\x08 \x82a\x14[V[\x90Ps\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x08o\x91\x90a$ZV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x08\x8AW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x08\xAE\x91\x90a$ V[a\x08\xEFW\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x08\xE6\x91\x90a$ZV[`@Q\x80\x91\x03\x90\xFD[_a\x08\xF8a\x10kV[\x90P\x80`\x06\x01_\x88\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\t\x99W\x863`@Q\x7F\x1D\xD7%\x0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\t\x90\x92\x91\x90a$sV[`@Q\x80\x91\x03\x90\xFD[_\x87\x87\x87\x87`@Q` \x01a\t\xB1\x94\x93\x92\x91\x90a$\x9AV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x81`\x04\x01_\x82\x81R` \x01\x90\x81R` \x01_ _\x81T\x80\x92\x91\x90a\t\xEC\x90a%\nV[\x91\x90PUP_\x82`\x08\x01_\x83\x81R` \x01\x90\x81R` \x01_ T\x03a\n%W`\x01\x82`\x08\x01_\x83\x81R` \x01\x90\x81R` \x01_ \x81\x90UP[`\x01\x82`\x06\x01_\x8A\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x07\x01_\x82\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x81`\x03\x01_\x89\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x0BAWPa\x0B@\x82`\x04\x01_\x83\x81R` \x01\x90\x81R` \x01_ Ta\x14tV[[\x15a\x0C\x1FW\x85\x82`\x01\x01_\x8A\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x84\x82`\x02\x01_\x8A\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x86\x82_\x01_\x8A\x81R` \x01\x90\x81R` \x01_ \x81\x90UP`\x01\x82`\x03\x01_\x8A\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x80\x82`\x05\x01_\x8A\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x87\x7F\xCB\x89\xCC\xB3G\x01\x8D\x7F(+\xB4\xC0H\xE15\xE1\x9B\xC1\xD16`\xFA\x0F(P\xE1\x05\x18B%6\xDE\x87\x87\x85`\x07\x01_\x86\x81R` \x01\x90\x81R` \x01_ `@Qa\x0C\x16\x93\x92\x91\x90a&1V[`@Q\x80\x91\x03\x90\xA2[PPPPPPPPV[``_a\x0C4a\x10kV[\x90P\x83\x83\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x0CSWa\x0CRa\x1B~V[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x0C\x8CW\x81` \x01[a\x0Cya\x19\xA5V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x0CqW\x90P[P\x91P_[\x84\x84\x90P\x81\x10\x15a\x0E\x9EWa\x0C\xBE\x85\x85\x83\x81\x81\x10a\x0C\xB2Wa\x0C\xB1a#\xA1V[[\x90P` \x02\x015a\x02\xD7V[a\r\x18W\x84\x84\x82\x81\x81\x10a\x0C\xD5Wa\x0C\xD4a#\xA1V[[\x90P` \x02\x015`@Q\x7F\x06f\xCB\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\r\x0F\x91\x90a\x1D\x0BV[`@Q\x80\x91\x03\x90\xFD[_\x82`\x05\x01_\x87\x87\x85\x81\x81\x10a\r1Wa\r0a#\xA1V[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x90P_\x83`\x07\x01_\x83\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\r\xD9W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\r\x90W[PPPPP\x90P`@Q\x80`\x80\x01`@R\x80\x88\x88\x86\x81\x81\x10a\r\xFEWa\r\xFDa#\xA1V[[\x90P` \x02\x015\x81R` \x01\x85_\x01_\x8A\x8A\x88\x81\x81\x10a\x0E!Wa\x0E a#\xA1V[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x81R` \x01\x85`\x02\x01_\x8A\x8A\x88\x81\x81\x10a\x0ESWa\x0ERa#\xA1V[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x81R` \x01\x82\x81RP\x85\x84\x81Q\x81\x10a\x0E\x84Wa\x0E\x83a#\xA1V[[` \x02` \x01\x01\x81\x90RPPP\x80\x80`\x01\x01\x91PPa\x0C\x91V[PP\x92\x91PPV[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[``_a\x0E\xEAa\x10kV[\x90P_\x81`\x05\x01_\x85\x81R` \x01\x90\x81R` \x01_ T\x90P\x81`\x07\x01_\x82\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x0F\x93W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x0FJW[PPPPP\x92PPP\x91\x90PV[``_`\x01a\x0F\xAF\x84a\x15\x05V[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x0F\xCDWa\x0F\xCCa\x1B~V[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0F\xFFW\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a\x10`W\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a\x10UWa\x10Ta&mV[[\x04\x94P_\x85\x03a\x10\x0CW[\x81\x93PPPP\x91\x90PV[_\x7F\xF4\x1C`\xEA[\x83\xC8\xF1\x9Bf6\x13\xFF\xDD?\xA4A\xA5\x993\xB8\xA4\xFD\xF4\xDA\x89\x1B8C=\x1A\0\x90P\x90V[_a\x10\x9Ba\x10\xB6V[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a\x11\x8AWP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x11qa\x16VV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x11\xC1W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x12 W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x12D\x91\x90a&\xAEV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x12\xB3W3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x12\xAA\x91\x90a#\xDDV[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x13\x1EWP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\x1B\x91\x90a&\xEDV[`\x01[a\x13_W\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x13V\x91\x90a#\xDDV[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a\x13\xC5W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x13\xBC\x91\x90a\x1D\x0BV[`@Q\x80\x91\x03\x90\xFD[a\x13\xCF\x83\x83a\x16\xA9V[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x14YW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x10\x83_\x1C\x90\x1C\x16\x90P\x91\x90PV[_\x80s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cg\x99\xEFR`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x14\xD3W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x14\xF7\x91\x90a',V[\x90P\x80\x83\x10\x15\x91PP\x91\x90PV[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a\x15aWz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a\x15WWa\x15Va&mV[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a\x15\x9EWm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a\x15\x94Wa\x15\x93a&mV[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a\x15\xCDWf#\x86\xF2o\xC1\0\0\x83\x81a\x15\xC3Wa\x15\xC2a&mV[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a\x15\xF6Wc\x05\xF5\xE1\0\x83\x81a\x15\xECWa\x15\xEBa&mV[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a\x16\x1BWa'\x10\x83\x81a\x16\x11Wa\x16\x10a&mV[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a\x16>W`d\x83\x81a\x164Wa\x163a&mV[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a\x16MW`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a\x16\x82\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x17\x1BV[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a\x16\xB2\x82a\x17$V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a\x17\x0EWa\x17\x08\x82\x82a\x17\xEDV[Pa\x17\x17V[a\x17\x16a\x18mV[[PPV[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a\x17\x7FW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x17v\x91\x90a#\xDDV[`@Q\x80\x91\x03\x90\xFD[\x80a\x17\xAB\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x17\x1BV[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa\x18\x16\x91\x90a'\x9BV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x18NW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x18SV[``\x91P[P\x91P\x91Pa\x18c\x85\x83\x83a\x18\xA9V[\x92PPP\x92\x91PPV[_4\x11\x15a\x18\xA7W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82a\x18\xBEWa\x18\xB9\x82a\x196V[a\x19.V[_\x82Q\x14\x80\x15a\x18\xE4WP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a\x19&W\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x19\x1D\x91\x90a#\xDDV[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa\x19/V[[\x93\x92PPPV[_\x81Q\x11\x15a\x19HW\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80`\x80\x01`@R\x80_\x80\x19\x16\x81R` \x01_\x81R` \x01_\x80\x19\x16\x81R` \x01``\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80_\x80\x19\x16\x81R` \x01_\x81R` \x01_\x80\x19\x16\x81R` \x01``\x81RP\x90V[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a\x1A\x07W\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa\x19\xECV[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a\x1A,\x82a\x19\xD0V[a\x1A6\x81\x85a\x19\xDAV[\x93Pa\x1AF\x81\x85` \x86\x01a\x19\xEAV[a\x1AO\x81a\x1A\x12V[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra\x1Ar\x81\x84a\x1A\"V[\x90P\x92\x91PPV[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[a\x1A\x9D\x81a\x1A\x8BV[\x81\x14a\x1A\xA7W_\x80\xFD[PV[_\x815\x90Pa\x1A\xB8\x81a\x1A\x94V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a\x1A\xD3Wa\x1A\xD2a\x1A\x83V[[_a\x1A\xE0\x84\x82\x85\x01a\x1A\xAAV[\x91PP\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[a\x1A\xFD\x81a\x1A\xE9V[\x82RPPV[_` \x82\x01\x90Pa\x1B\x16_\x83\x01\x84a\x1A\xF4V[\x92\x91PPV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a\x1BE\x82a\x1B\x1CV[\x90P\x91\x90PV[a\x1BU\x81a\x1B;V[\x81\x14a\x1B_W_\x80\xFD[PV[_\x815\x90Pa\x1Bp\x81a\x1BLV[\x92\x91PPV[_\x80\xFD[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a\x1B\xB4\x82a\x1A\x12V[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\x1B\xD3Wa\x1B\xD2a\x1B~V[[\x80`@RPPPV[_a\x1B\xE5a\x1AzV[\x90Pa\x1B\xF1\x82\x82a\x1B\xABV[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x1C\x10Wa\x1C\x0Fa\x1B~V[[a\x1C\x19\x82a\x1A\x12V[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_a\x1CFa\x1CA\x84a\x1B\xF6V[a\x1B\xDCV[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a\x1CbWa\x1Caa\x1BzV[[a\x1Cm\x84\x82\x85a\x1C&V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a\x1C\x89Wa\x1C\x88a\x1BvV[[\x815a\x1C\x99\x84\x82` \x86\x01a\x1C4V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a\x1C\xB8Wa\x1C\xB7a\x1A\x83V[[_a\x1C\xC5\x85\x82\x86\x01a\x1BbV[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1C\xE6Wa\x1C\xE5a\x1A\x87V[[a\x1C\xF2\x85\x82\x86\x01a\x1CuV[\x91PP\x92P\x92\x90PV[a\x1D\x05\x81a\x1A\x8BV[\x82RPPV[_` \x82\x01\x90Pa\x1D\x1E_\x83\x01\x84a\x1C\xFCV[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12a\x1DAWa\x1D@a\x1BvV[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1D^Wa\x1D]a\x1D$V[[` \x83\x01\x91P\x83` \x82\x02\x83\x01\x11\x15a\x1DzWa\x1Dya\x1D(V[[\x92P\x92\x90PV[_\x80` \x83\x85\x03\x12\x15a\x1D\x97Wa\x1D\x96a\x1A\x83V[[_\x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1D\xB4Wa\x1D\xB3a\x1A\x87V[[a\x1D\xC0\x85\x82\x86\x01a\x1D,V[\x92P\x92PP\x92P\x92\x90PV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a\x1D\xFE\x81a\x1A\x8BV[\x82RPPV[_\x81\x90P\x91\x90PV[a\x1E\x16\x81a\x1E\x04V[\x82RPPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a\x1EN\x81a\x1B;V[\x82RPPV[_a\x1E_\x83\x83a\x1EEV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a\x1E\x81\x82a\x1E\x1CV[a\x1E\x8B\x81\x85a\x1E&V[\x93Pa\x1E\x96\x83a\x1E6V[\x80_[\x83\x81\x10\x15a\x1E\xC6W\x81Qa\x1E\xAD\x88\x82a\x1ETV[\x97Pa\x1E\xB8\x83a\x1EkV[\x92PP`\x01\x81\x01\x90Pa\x1E\x99V[P\x85\x93PPPP\x92\x91PPV[_`\x80\x83\x01_\x83\x01Qa\x1E\xE8_\x86\x01\x82a\x1D\xF5V[P` \x83\x01Qa\x1E\xFB` \x86\x01\x82a\x1E\rV[P`@\x83\x01Qa\x1F\x0E`@\x86\x01\x82a\x1D\xF5V[P``\x83\x01Q\x84\x82\x03``\x86\x01Ra\x1F&\x82\x82a\x1EwV[\x91PP\x80\x91PP\x92\x91PPV[_a\x1F>\x83\x83a\x1E\xD3V[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a\x1F\\\x82a\x1D\xCCV[a\x1Ff\x81\x85a\x1D\xD6V[\x93P\x83` \x82\x02\x85\x01a\x1Fx\x85a\x1D\xE6V[\x80_[\x85\x81\x10\x15a\x1F\xB3W\x84\x84\x03\x89R\x81Qa\x1F\x94\x85\x82a\x1F3V[\x94Pa\x1F\x9F\x83a\x1FFV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90Pa\x1F{V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra\x1F\xDD\x81\x84a\x1FRV[\x90P\x92\x91PPV[a\x1F\xEE\x81a\x1E\x04V[\x81\x14a\x1F\xF8W_\x80\xFD[PV[_\x815\x90Pa \t\x81a\x1F\xE5V[\x92\x91PPV[_\x80_\x80`\x80\x85\x87\x03\x12\x15a 'Wa &a\x1A\x83V[[_a 4\x87\x82\x88\x01a\x1A\xAAV[\x94PP` a E\x87\x82\x88\x01a\x1F\xFBV[\x93PP`@a V\x87\x82\x88\x01a\x1A\xAAV[\x92PP``a g\x87\x82\x88\x01a\x1A\xAAV[\x91PP\x92\x95\x91\x94P\x92PV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_`\x80\x83\x01_\x83\x01Qa \xB1_\x86\x01\x82a\x1D\xF5V[P` \x83\x01Qa \xC4` \x86\x01\x82a\x1E\rV[P`@\x83\x01Qa \xD7`@\x86\x01\x82a\x1D\xF5V[P``\x83\x01Q\x84\x82\x03``\x86\x01Ra \xEF\x82\x82a\x1EwV[\x91PP\x80\x91PP\x92\x91PPV[_a!\x07\x83\x83a \x9CV[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a!%\x82a sV[a!/\x81\x85a }V[\x93P\x83` \x82\x02\x85\x01a!A\x85a \x8DV[\x80_[\x85\x81\x10\x15a!|W\x84\x84\x03\x89R\x81Qa!]\x85\x82a \xFCV[\x94Pa!h\x83a!\x0FV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90Pa!DV[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra!\xA6\x81\x84a!\x1BV[\x90P\x92\x91PPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_a!\xC8\x82a\x1E\x1CV[a!\xD2\x81\x85a!\xAEV[\x93Pa!\xDD\x83a\x1E6V[\x80_[\x83\x81\x10\x15a\"\rW\x81Qa!\xF4\x88\x82a\x1ETV[\x97Pa!\xFF\x83a\x1EkV[\x92PP`\x01\x81\x01\x90Pa!\xE0V[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra\"2\x81\x84a!\xBEV[\x90P\x92\x91PPV[_\x81\x90P\x92\x91PPV[_a\"N\x82a\x19\xD0V[a\"X\x81\x85a\":V[\x93Pa\"h\x81\x85` \x86\x01a\x19\xEAV[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a\"\xA8`\x02\x83a\":V[\x91Pa\"\xB3\x82a\"tV[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a\"\xF2`\x01\x83a\":V[\x91Pa\"\xFD\x82a\"\xBEV[`\x01\x82\x01\x90P\x91\x90PV[_a#\x13\x82\x87a\"DV[\x91Pa#\x1E\x82a\"\x9CV[\x91Pa#*\x82\x86a\"DV[\x91Pa#5\x82a\"\xE6V[\x91Pa#A\x82\x85a\"DV[\x91Pa#L\x82a\"\xE6V[\x91Pa#X\x82\x84a\"DV[\x91P\x81\x90P\x95\x94PPPPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[a#\x82\x81a#fV[\x82RPPV[_` \x82\x01\x90Pa#\x9B_\x83\x01\x84a#yV[\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`2`\x04R`$_\xFD[a#\xD7\x81a\x1B;V[\x82RPPV[_` \x82\x01\x90Pa#\xF0_\x83\x01\x84a#\xCEV[\x92\x91PPV[a#\xFF\x81a\x1A\xE9V[\x81\x14a$\tW_\x80\xFD[PV[_\x81Q\x90Pa$\x1A\x81a#\xF6V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a$5Wa$4a\x1A\x83V[[_a$B\x84\x82\x85\x01a$\x0CV[\x91PP\x92\x91PPV[a$T\x81a\x1E\x04V[\x82RPPV[_` \x82\x01\x90Pa$m_\x83\x01\x84a$KV[\x92\x91PPV[_`@\x82\x01\x90Pa$\x86_\x83\x01\x85a\x1C\xFCV[a$\x93` \x83\x01\x84a#\xCEV[\x93\x92PPPV[_`\x80\x82\x01\x90Pa$\xAD_\x83\x01\x87a\x1C\xFCV[a$\xBA` \x83\x01\x86a$KV[a$\xC7`@\x83\x01\x85a\x1C\xFCV[a$\xD4``\x83\x01\x84a\x1C\xFCV[\x95\x94PPPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_a%\x14\x82a\x1E\x04V[\x91P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x03a%FWa%Ea$\xDDV[[`\x01\x82\x01\x90P\x91\x90PV[_\x81T\x90P\x91\x90PV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_\x81_\x1C\x90P\x91\x90PV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a%\xA9a%\xA4\x83a%mV[a%xV[\x90P\x91\x90PV[_a%\xBB\x82Ta%\x97V[\x90P\x91\x90PV[_`\x01\x82\x01\x90P\x91\x90PV[_a%\xD8\x82a%QV[a%\xE2\x81\x85a!\xAEV[\x93Pa%\xED\x83a%[V[\x80_[\x83\x81\x10\x15a&$Wa&\x01\x82a%\xB0V[a&\x0B\x88\x82a\x1ETV[\x97Pa&\x16\x83a%\xC2V[\x92PP`\x01\x81\x01\x90Pa%\xF0V[P\x85\x93PPPP\x92\x91PPV[_``\x82\x01\x90Pa&D_\x83\x01\x86a\x1C\xFCV[a&Q` \x83\x01\x85a\x1C\xFCV[\x81\x81\x03`@\x83\x01Ra&c\x81\x84a%\xCEV[\x90P\x94\x93PPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[_\x81Q\x90Pa&\xA8\x81a\x1BLV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a&\xC3Wa&\xC2a\x1A\x83V[[_a&\xD0\x84\x82\x85\x01a&\x9AV[\x91PP\x92\x91PPV[_\x81Q\x90Pa&\xE7\x81a\x1A\x94V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a'\x02Wa'\x01a\x1A\x83V[[_a'\x0F\x84\x82\x85\x01a&\xD9V[\x91PP\x92\x91PPV[_\x81Q\x90Pa'&\x81a\x1F\xE5V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a'AWa'@a\x1A\x83V[[_a'N\x84\x82\x85\x01a'\x18V[\x91PP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x81\x90P\x92\x91PPV[_a'u\x82a'WV[a'\x7F\x81\x85a'aV[\x93Pa'\x8F\x81\x85` \x86\x01a\x19\xEAV[\x80\x84\x01\x91PP\x92\x91PPV[_a'\xA6\x82\x84a'kV[\x91P\x81\x90P\x92\x91PPV", + b"`\x80`@R`\x046\x10a\0\x9BW_5`\xE0\x1C\x80cU\xC4\xD9\x97\x11a\0cW\x80cU\xC4\xD9\x97\x14a\x01aW\x80c\x90\xF3\x03T\x14a\x01\x9DW\x80c\xA1O\x89q\x14a\x01\xC5W\x80c\xAD<\xB1\xCC\x14a\x02\x01W\x80c\xC4\x11Xt\x14a\x02+W\x80c\xE4\xBB(\x8C\x14a\x02AWa\0\x9BV[\x80c\r\x8En,\x14a\0\x9FW\x80c-\xDC\x9Ao\x14a\0\xC9W\x80c9\xF78\x10\x14a\x01\x05W\x80cO\x1E\xF2\x86\x14a\x01\x1BW\x80cR\xD1\x90-\x14a\x017W[_\x80\xFD[4\x80\x15a\0\xAAW_\x80\xFD[Pa\0\xB3a\x02\x7FV[`@Qa\0\xC0\x91\x90a\x1E\x82V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\0\xD4W_\x80\xFD[Pa\0\xEF`\x04\x806\x03\x81\x01\x90a\0\xEA\x91\x90a\x1E\xE6V[a\x02\xFAV[`@Qa\0\xFC\x91\x90a\x1F+V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x10W_\x80\xFD[Pa\x01\x19a\x03.V[\0[a\x015`\x04\x806\x03\x81\x01\x90a\x010\x91\x90a \xCAV[a\x04\x9EV[\0[4\x80\x15a\x01BW_\x80\xFD[Pa\x01Ka\x04\xBDV[`@Qa\x01X\x91\x90a!3V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01lW_\x80\xFD[Pa\x01\x87`\x04\x806\x03\x81\x01\x90a\x01\x82\x91\x90a!\xA9V[a\x04\xEEV[`@Qa\x01\x94\x91\x90a$\0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xA8W_\x80\xFD[Pa\x01\xC3`\x04\x806\x03\x81\x01\x90a\x01\xBE\x91\x90a$JV[a\x07\x7FV[\0[4\x80\x15a\x01\xD0W_\x80\xFD[Pa\x01\xEB`\x04\x806\x03\x81\x01\x90a\x01\xE6\x91\x90a!\xA9V[a\r\xE7V[`@Qa\x01\xF8\x91\x90a%\xDCV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x0CW_\x80\xFD[Pa\x02\x15a\x10xV[`@Qa\x02\"\x91\x90a\x1E\x82V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x026W_\x80\xFD[Pa\x02?a\x10\xB1V[\0[4\x80\x15a\x02LW_\x80\xFD[Pa\x02g`\x04\x806\x03\x81\x01\x90a\x02b\x91\x90a\x1E\xE6V[a\x11\xD6V[`@Qa\x02v\x93\x92\x91\x90a&wV[`@Q\x80\x91\x03\x90\xF3[```@Q\x80`@\x01`@R\x80`\x11\x81R` \x01\x7FCiphertextCommits\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x02\xC0_a\x12\xDCV[a\x02\xCA`\x02a\x12\xDCV[a\x02\xD3_a\x12\xDCV[`@Q` \x01a\x02\xE6\x94\x93\x92\x91\x90a'\x81V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x90V[_\x80a\x03\x04a\x13\xA6V[\x90P\x80`\x03\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[`\x01a\x038a\x13\xCDV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x03yW`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03_a\x03\x84a\x13\xF1V[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x03\xCCWP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x04\x03W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x04\x92\x91\x90a(\x01V[`@Q\x80\x91\x03\x90\xA1PPV[a\x04\xA6a\x14\x18V[a\x04\xAF\x82a\x14\xFEV[a\x04\xB9\x82\x82a\x15\xF1V[PPV[_a\x04\xC6a\x17\x0FV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[``_a\x04\xF9a\x13\xA6V[\x90P\x83\x83\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x05\x18Wa\x05\x17a\x1F\xA6V[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x05QW\x81` \x01[a\x05>a\x1D\x96V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x056W\x90P[P\x91P_[\x84\x84\x90P\x81\x10\x15a\x07wWa\x05\x83\x85\x85\x83\x81\x81\x10a\x05wWa\x05va(\x1AV[[\x90P` \x02\x015a\x02\xFAV[a\x05\xDDW\x84\x84\x82\x81\x81\x10a\x05\x9AWa\x05\x99a(\x1AV[[\x90P` \x02\x015`@Q\x7F\x06f\xCB\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05\xD4\x91\x90a!3V[`@Q\x80\x91\x03\x90\xFD[_\x82`\x05\x01_\x87\x87\x85\x81\x81\x10a\x05\xF6Wa\x05\xF5a(\x1AV[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x90P`@Q\x80`\xA0\x01`@R\x80\x87\x87\x85\x81\x81\x10a\x06+Wa\x06*a(\x1AV[[\x90P` \x02\x015\x81R` \x01\x84_\x01_\x89\x89\x87\x81\x81\x10a\x06NWa\x06Ma(\x1AV[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x81R` \x01\x84`\x01\x01_\x89\x89\x87\x81\x81\x10a\x06\x80Wa\x06\x7Fa(\x1AV[[\x90P` \x02\x015\x81R` \x01\x90\x81R` \x01_ T\x81R` \x01\x84`\x07\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x07*W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x06\xE1W[PPPPP\x81R` \x01\x84`\x08\x01_\x84\x81R` \x01\x90\x81R` \x01_ T\x81RP\x84\x83\x81Q\x81\x10a\x07^Wa\x07]a(\x1AV[[` \x02` \x01\x01\x81\x90RPP\x80\x80`\x01\x01\x91PPa\x05VV[PP\x92\x91PPV[\x83_a\x07\x8A\x82a\x17\x96V[\x90Ps\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x07\xD9\x91\x90a(GV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\xF4W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x08\x18\x91\x90a(\x8AV[a\x08YW\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x08P\x91\x90a(GV[`@Q\x80\x91\x03\x90\xFD[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c:Qb\xE6`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x08\xB2W_\x80\xFD[PZ\xF1\x15\x80\x15a\x08\xC4W=_\x80>=_\xFD[PPPP_\x86\x86\x86\x86`@Q` \x01a\x08\xE0\x94\x93\x92\x91\x90a(\xB5V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P_a\t\x01a\x13\xA6V[\x90P_\x81`\x08\x01_\x84\x81R` \x01\x90\x81R` \x01_ T\x90P_\x81\x03a\t\xC1Ws3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x99\x1D\xC3m`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\t~W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\t\xA2\x91\x90a)\x0CV[\x90P\x80\x82`\x08\x01_\x85\x81R` \x01\x90\x81R` \x01_ \x81\x90UPa\x0B\"V[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xCD\x8E\x99<\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\n\x0E\x91\x90a(GV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\n)W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\nM\x91\x90a(\x8AV[a\x0B!W_s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x88\x8B\x99\xE0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\n\x9F\x91\x90a(GV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\n\xBAW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\n\xDE\x91\x90a)ZV[\x90P\x89\x82\x82`@Q\x7F\x964d1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0B\x18\x93\x92\x91\x90a)\xF8V[`@Q\x80\x91\x03\x90\xFD[[a\x0B,\x813a\x17\xAFV[\x81`\x06\x01_\x8A\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\x0B\xCBW\x883`@Q\x7F\x1D\xD7%\x0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0B\xC2\x92\x91\x90a*#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a\x14\xC5WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x14\xACa\x1ArV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x14\xFCW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x15[W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x15\x7F\x91\x90a+MV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x15\xEEW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x15\xE5\x91\x90a+xV[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x16YWP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x16V\x91\x90a+\xA5V[`\x01[a\x16\x9AW\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x16\x91\x91\x90a+xV[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a\x17\0W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x16\xF7\x91\x90a!3V[`@Q\x80\x91\x03\x90\xFD[a\x17\n\x83\x83a\x1A\xC5V[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x17\x94W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x10\x83_\x1C\x90\x1C\x16\x90P\x91\x90PV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x86%\xE8v\x83\x83`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\xFE\x92\x91\x90a+\xD0V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x18\x19W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x18=\x91\x90a(\x8AV[a\x18\x80W\x81\x81`@Q\x7F)\xA9\x93\xC1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x18w\x92\x91\x90a+\xD0V[`@Q\x80\x91\x03\x90\xFD[PPV[_\x80s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xF8\x81t\xEA\x85`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18\xD3\x91\x90a(GV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x18\xEEW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x19\x12\x91\x90a)\x0CV[\x90P\x80\x83\x10\x15\x91PP\x92\x91PPV[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a\x19}Wz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a\x19sWa\x19ra+\x0CV[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a\x19\xBAWm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a\x19\xB0Wa\x19\xAFa+\x0CV[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a\x19\xE9Wf#\x86\xF2o\xC1\0\0\x83\x81a\x19\xDFWa\x19\xDEa+\x0CV[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a\x1A\x12Wc\x05\xF5\xE1\0\x83\x81a\x1A\x08Wa\x1A\x07a+\x0CV[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a\x1A7Wa'\x10\x83\x81a\x1A-Wa\x1A,a+\x0CV[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a\x1AZW`d\x83\x81a\x1APWa\x1AOa+\x0CV[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a\x1AiW`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a\x1A\x9E\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x1B7V[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a\x1A\xCE\x82a\x1B@V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a\x1B*Wa\x1B$\x82\x82a\x1C\tV[Pa\x1B3V[a\x1B2a\x1C\x89V[[PPV[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a\x1B\x9BW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1B\x92\x91\x90a+xV[`@Q\x80\x91\x03\x90\xFD[\x80a\x1B\xC7\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x1B7V[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa\x1C2\x91\x90a,;V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x1CjW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x1CoV[``\x91P[P\x91P\x91Pa\x1C\x7F\x85\x83\x83a\x1C\xC5V[\x92PPP\x92\x91PPV[_4\x11\x15a\x1C\xC3W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82a\x1C\xDAWa\x1C\xD5\x82a\x1DRV[a\x1DJV[_\x82Q\x14\x80\x15a\x1D\0WP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a\x1DBW\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1D9\x91\x90a+xV[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa\x1DKV[[\x93\x92PPPV[_\x81Q\x11\x15a\x1DdW\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80`\xA0\x01`@R\x80_\x80\x19\x16\x81R` \x01_\x81R` \x01_\x80\x19\x16\x81R` \x01``\x81R` \x01_\x81RP\x90V[`@Q\x80`\xA0\x01`@R\x80_\x80\x19\x16\x81R` \x01_\x81R` \x01_\x80\x19\x16\x81R` \x01``\x81R` \x01_\x81RP\x90V[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a\x1E/W\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa\x1E\x14V[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a\x1ET\x82a\x1D\xF8V[a\x1E^\x81\x85a\x1E\x02V[\x93Pa\x1En\x81\x85` \x86\x01a\x1E\x12V[a\x1Ew\x81a\x1E:V[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra\x1E\x9A\x81\x84a\x1EJV[\x90P\x92\x91PPV[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[a\x1E\xC5\x81a\x1E\xB3V[\x81\x14a\x1E\xCFW_\x80\xFD[PV[_\x815\x90Pa\x1E\xE0\x81a\x1E\xBCV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a\x1E\xFBWa\x1E\xFAa\x1E\xABV[[_a\x1F\x08\x84\x82\x85\x01a\x1E\xD2V[\x91PP\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[a\x1F%\x81a\x1F\x11V[\x82RPPV[_` \x82\x01\x90Pa\x1F>_\x83\x01\x84a\x1F\x1CV[\x92\x91PPV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a\x1Fm\x82a\x1FDV[\x90P\x91\x90PV[a\x1F}\x81a\x1FcV[\x81\x14a\x1F\x87W_\x80\xFD[PV[_\x815\x90Pa\x1F\x98\x81a\x1FtV[\x92\x91PPV[_\x80\xFD[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a\x1F\xDC\x82a\x1E:V[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\x1F\xFBWa\x1F\xFAa\x1F\xA6V[[\x80`@RPPPV[_a \ra\x1E\xA2V[\x90Pa \x19\x82\x82a\x1F\xD3V[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a 8Wa 7a\x1F\xA6V[[a A\x82a\x1E:V[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_a na i\x84a \x1EV[a \x04V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a \x8AWa \x89a\x1F\xA2V[[a \x95\x84\x82\x85a NV[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a \xB1Wa \xB0a\x1F\x9EV[[\x815a \xC1\x84\x82` \x86\x01a \\V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a \xE0Wa \xDFa\x1E\xABV[[_a \xED\x85\x82\x86\x01a\x1F\x8AV[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!\x0EWa!\ra\x1E\xAFV[[a!\x1A\x85\x82\x86\x01a \x9DV[\x91PP\x92P\x92\x90PV[a!-\x81a\x1E\xB3V[\x82RPPV[_` \x82\x01\x90Pa!F_\x83\x01\x84a!$V[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12a!iWa!ha\x1F\x9EV[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!\x86Wa!\x85a!LV[[` \x83\x01\x91P\x83` \x82\x02\x83\x01\x11\x15a!\xA2Wa!\xA1a!PV[[\x92P\x92\x90PV[_\x80` \x83\x85\x03\x12\x15a!\xBFWa!\xBEa\x1E\xABV[[_\x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!\xDCWa!\xDBa\x1E\xAFV[[a!\xE8\x85\x82\x86\x01a!TV[\x92P\x92PP\x92P\x92\x90PV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a\"&\x81a\x1E\xB3V[\x82RPPV[_\x81\x90P\x91\x90PV[a\">\x81a\",V[\x82RPPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a\"v\x81a\x1FcV[\x82RPPV[_a\"\x87\x83\x83a\"mV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a\"\xA9\x82a\"DV[a\"\xB3\x81\x85a\"NV[\x93Pa\"\xBE\x83a\"^V[\x80_[\x83\x81\x10\x15a\"\xEEW\x81Qa\"\xD5\x88\x82a\"|V[\x97Pa\"\xE0\x83a\"\x93V[\x92PP`\x01\x81\x01\x90Pa\"\xC1V[P\x85\x93PPPP\x92\x91PPV[_`\xA0\x83\x01_\x83\x01Qa#\x10_\x86\x01\x82a\"\x1DV[P` \x83\x01Qa##` \x86\x01\x82a\"5V[P`@\x83\x01Qa#6`@\x86\x01\x82a\"\x1DV[P``\x83\x01Q\x84\x82\x03``\x86\x01Ra#N\x82\x82a\"\x9FV[\x91PP`\x80\x83\x01Qa#c`\x80\x86\x01\x82a\"5V[P\x80\x91PP\x92\x91PPV[_a#y\x83\x83a\"\xFBV[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a#\x97\x82a!\xF4V[a#\xA1\x81\x85a!\xFEV[\x93P\x83` \x82\x02\x85\x01a#\xB3\x85a\"\x0EV[\x80_[\x85\x81\x10\x15a#\xEEW\x84\x84\x03\x89R\x81Qa#\xCF\x85\x82a#nV[\x94Pa#\xDA\x83a#\x81V[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90Pa#\xB6V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra$\x18\x81\x84a#\x8DV[\x90P\x92\x91PPV[a$)\x81a\",V[\x81\x14a$3W_\x80\xFD[PV[_\x815\x90Pa$D\x81a$ V[\x92\x91PPV[_\x80_\x80`\x80\x85\x87\x03\x12\x15a$bWa$aa\x1E\xABV[[_a$o\x87\x82\x88\x01a\x1E\xD2V[\x94PP` a$\x80\x87\x82\x88\x01a$6V[\x93PP`@a$\x91\x87\x82\x88\x01a\x1E\xD2V[\x92PP``a$\xA2\x87\x82\x88\x01a\x1E\xD2V[\x91PP\x92\x95\x91\x94P\x92PV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_`\xA0\x83\x01_\x83\x01Qa$\xEC_\x86\x01\x82a\"\x1DV[P` \x83\x01Qa$\xFF` \x86\x01\x82a\"5V[P`@\x83\x01Qa%\x12`@\x86\x01\x82a\"\x1DV[P``\x83\x01Q\x84\x82\x03``\x86\x01Ra%*\x82\x82a\"\x9FV[\x91PP`\x80\x83\x01Qa%?`\x80\x86\x01\x82a\"5V[P\x80\x91PP\x92\x91PPV[_a%U\x83\x83a$\xD7V[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a%s\x82a$\xAEV[a%}\x81\x85a$\xB8V[\x93P\x83` \x82\x02\x85\x01a%\x8F\x85a$\xC8V[\x80_[\x85\x81\x10\x15a%\xCAW\x84\x84\x03\x89R\x81Qa%\xAB\x85\x82a%JV[\x94Pa%\xB6\x83a%]V[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90Pa%\x92V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra%\xF4\x81\x84a%iV[\x90P\x92\x91PPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_a&\x16\x82a\"DV[a& \x81\x85a%\xFCV[\x93Pa&+\x83a\"^V[\x80_[\x83\x81\x10\x15a&[W\x81Qa&B\x88\x82a\"|V[\x97Pa&M\x83a\"\x93V[\x92PP`\x01\x81\x01\x90Pa&.V[P\x85\x93PPPP\x92\x91PPV[a&q\x81a\",V[\x82RPPV[_``\x82\x01\x90P\x81\x81\x03_\x83\x01Ra&\x8F\x81\x86a&\x0CV[\x90Pa&\x9E` \x83\x01\x85a&hV[a&\xAB`@\x83\x01\x84a\x1F\x1CV[\x94\x93PPPPV[_\x81\x90P\x92\x91PPV[_a&\xC7\x82a\x1D\xF8V[a&\xD1\x81\x85a&\xB3V[\x93Pa&\xE1\x81\x85` \x86\x01a\x1E\x12V[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a'!`\x02\x83a&\xB3V[\x91Pa',\x82a&\xEDV[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a'k`\x01\x83a&\xB3V[\x91Pa'v\x82a'7V[`\x01\x82\x01\x90P\x91\x90PV[_a'\x8C\x82\x87a&\xBDV[\x91Pa'\x97\x82a'\x15V[\x91Pa'\xA3\x82\x86a&\xBDV[\x91Pa'\xAE\x82a'_V[\x91Pa'\xBA\x82\x85a&\xBDV[\x91Pa'\xC5\x82a'_V[\x91Pa'\xD1\x82\x84a&\xBDV[\x91P\x81\x90P\x95\x94PPPPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[a'\xFB\x81a'\xDFV[\x82RPPV[_` \x82\x01\x90Pa(\x14_\x83\x01\x84a'\xF2V[\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`2`\x04R`$_\xFD[_` \x82\x01\x90Pa(Z_\x83\x01\x84a&hV[\x92\x91PPV[a(i\x81a\x1F\x11V[\x81\x14a(sW_\x80\xFD[PV[_\x81Q\x90Pa(\x84\x81a(`V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a(\x9FWa(\x9Ea\x1E\xABV[[_a(\xAC\x84\x82\x85\x01a(vV[\x91PP\x92\x91PPV[_`\x80\x82\x01\x90Pa(\xC8_\x83\x01\x87a!$V[a(\xD5` \x83\x01\x86a&hV[a(\xE2`@\x83\x01\x85a!$V[a(\xEF``\x83\x01\x84a!$V[\x95\x94PPPPPV[_\x81Q\x90Pa)\x06\x81a$ V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a)!Wa) a\x1E\xABV[[_a).\x84\x82\x85\x01a(\xF8V[\x91PP\x92\x91PPV[`\x08\x81\x10a)CW_\x80\xFD[PV[_\x81Q\x90Pa)T\x81a)7V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a)oWa)na\x1E\xABV[[_a)|\x84\x82\x85\x01a)FV[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[`\x08\x81\x10a)\xC3Wa)\xC2a)\x85V[[PV[_\x81\x90Pa)\xD3\x82a)\xB2V[\x91\x90PV[_a)\xE2\x82a)\xC6V[\x90P\x91\x90PV[a)\xF2\x81a)\xD8V[\x82RPPV[_``\x82\x01\x90Pa*\x0B_\x83\x01\x86a!$V[a*\x18` \x83\x01\x85a&hV[a*%`@\x83\x01\x84a)\xE9V[\x94\x93PPPPV[a*6\x81a\x1FcV[\x82RPPV[_`@\x82\x01\x90Pa*O_\x83\x01\x85a!$V[a*\\` \x83\x01\x84a*-V[\x93\x92PPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_a*\x9A\x82a\",V[\x91P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x03a*\xCCWa*\xCBa*cV[[`\x01\x82\x01\x90P\x91\x90PV[_``\x82\x01\x90Pa*\xEA_\x83\x01\x86a!$V[a*\xF7` \x83\x01\x85a!$V[a+\x04`@\x83\x01\x84a&hV[\x94\x93PPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[_\x81Q\x90Pa+G\x81a\x1FtV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a+bWa+aa\x1E\xABV[[_a+o\x84\x82\x85\x01a+9V[\x91PP\x92\x91PPV[_` \x82\x01\x90Pa+\x8B_\x83\x01\x84a*-V[\x92\x91PPV[_\x81Q\x90Pa+\x9F\x81a\x1E\xBCV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a+\xBAWa+\xB9a\x1E\xABV[[_a+\xC7\x84\x82\x85\x01a+\x91V[\x91PP\x92\x91PPV[_`@\x82\x01\x90Pa+\xE3_\x83\x01\x85a&hV[a+\xF0` \x83\x01\x84a*-V[\x93\x92PPPV[_\x81Q\x90P\x91\x90PV[_\x81\x90P\x92\x91PPV[_a,\x15\x82a+\xF7V[a,\x1F\x81\x85a,\x01V[\x93Pa,/\x81\x85` \x86\x01a\x1E\x12V[\x80\x84\x01\x91PP\x92\x91PPV[_a,F\x82\x84a,\x0BV[\x91P\x81\x90P\x92\x91PPV", ); #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextStatus(u8); + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::private::SolTypeValue for u8 { + #[inline] + fn stv_to_tokens( + &self, + ) -> as alloy_sol_types::SolType>::Token<'_> { + alloy_sol_types::private::SolTypeValue::< + alloy::sol_types::sol_data::Uint<8>, + >::stv_to_tokens(self) + } + #[inline] + fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { + as alloy_sol_types::SolType>::tokenize(self) + .0 + } + #[inline] + fn stv_abi_encode_packed_to( + &self, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::SolType>::abi_encode_packed_to(self, out) + } + #[inline] + fn stv_abi_packed_encoded_size(&self) -> usize { + as alloy_sol_types::SolType>::abi_encoded_size(self) + } + } + #[automatically_derived] + impl ContextStatus { + /// The Solidity type name. + pub const NAME: &'static str = stringify!(@ name); + /// Convert from the underlying value type. + #[inline] + pub const fn from_underlying(value: u8) -> Self { + Self(value) + } + /// Return the underlying value. + #[inline] + pub const fn into_underlying(self) -> u8 { + self.0 + } + /// Return the single encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode(&self) -> alloy_sol_types::private::Vec { + ::abi_encode(&self.0) + } + /// Return the packed encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode_packed(&self) -> alloy_sol_types::private::Vec { + ::abi_encode_packed(&self.0) + } + } + #[automatically_derived] + impl From for ContextStatus { + fn from(value: u8) -> Self { + Self::from_underlying(value) + } + } + #[automatically_derived] + impl From for u8 { + fn from(value: ContextStatus) -> Self { + value.into_underlying() + } + } + #[automatically_derived] + impl alloy_sol_types::SolType for ContextStatus { + type RustType = u8; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SOL_NAME: &'static str = Self::NAME; + const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; + const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; + #[inline] + fn valid_token(token: &Self::Token<'_>) -> bool { + Self::type_check(token).is_ok() + } + #[inline] + fn type_check(token: &Self::Token<'_>) -> alloy_sol_types::Result<()> { + as alloy_sol_types::SolType>::type_check(token) + } + #[inline] + fn detokenize(token: Self::Token<'_>) -> Self::RustType { + as alloy_sol_types::SolType>::detokenize(token) + } + } + #[automatically_derived] + impl alloy_sol_types::EventTopic for ContextStatus { + #[inline] + fn topic_preimage_length(rust: &Self::RustType) -> usize { + as alloy_sol_types::EventTopic>::topic_preimage_length(rust) + } + #[inline] + fn encode_topic_preimage( + rust: &Self::RustType, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::EventTopic>::encode_topic_preimage(rust, out) + } + #[inline] + fn encode_topic( + rust: &Self::RustType, + ) -> alloy_sol_types::abi::token::WordToken { + as alloy_sol_types::EventTopic>::encode_topic(rust) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**```solidity -struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextDigest; address[] coprocessorTxSenderAddresses; } +struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextDigest; address[] coprocessorTxSenderAddresses; uint256 contextId; } ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] @@ -560,6 +761,8 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD pub coprocessorTxSenderAddresses: alloy::sol_types::private::Vec< alloy::sol_types::private::Address, >, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -575,6 +778,7 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD alloy::sol_types::sol_data::Uint<256>, alloy::sol_types::sol_data::FixedBytes<32>, alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Uint<256>, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( @@ -582,6 +786,7 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD alloy::sol_types::private::primitives::aliases::U256, alloy::sol_types::private::FixedBytes<32>, alloy::sol_types::private::Vec, + alloy::sol_types::private::primitives::aliases::U256, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -603,6 +808,7 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD value.keyId, value.ciphertextDigest, value.coprocessorTxSenderAddresses, + value.contextId, ) } } @@ -615,6 +821,7 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD keyId: tuple.1, ciphertextDigest: tuple.2, coprocessorTxSenderAddresses: tuple.3, + contextId: tuple.4, } } } @@ -641,6 +848,9 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD > as alloy_sol_types::SolType>::tokenize( &self.coprocessorTxSenderAddresses, ), + as alloy_sol_types::SolType>::tokenize(&self.contextId), ) } #[inline] @@ -715,7 +925,7 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD #[inline] fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { alloy_sol_types::private::Cow::Borrowed( - "CiphertextMaterial(bytes32 ctHandle,uint256 keyId,bytes32 ciphertextDigest,address[] coprocessorTxSenderAddresses)", + "CiphertextMaterial(bytes32 ctHandle,uint256 keyId,bytes32 ciphertextDigest,address[] coprocessorTxSenderAddresses,uint256 contextId)", ) } #[inline] @@ -751,6 +961,10 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD &self.coprocessorTxSenderAddresses, ) .0, + as alloy_sol_types::SolType>::eip712_data_word(&self.contextId) + .0, ] .concat() } @@ -778,6 +992,11 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD > as alloy_sol_types::EventTopic>::topic_preimage_length( &rust.coprocessorTxSenderAddresses, ) + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.contextId, + ) } #[inline] fn encode_topic_preimage( @@ -811,6 +1030,12 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD &rust.coprocessorTxSenderAddresses, out, ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.contextId, + out, + ); } #[inline] fn encode_topic( @@ -830,7 +1055,7 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] /**```solidity -struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphertextDigest; address[] coprocessorTxSenderAddresses; } +struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphertextDigest; address[] coprocessorTxSenderAddresses; uint256 contextId; } ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] @@ -845,6 +1070,8 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe pub coprocessorTxSenderAddresses: alloy::sol_types::private::Vec< alloy::sol_types::private::Address, >, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -860,6 +1087,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe alloy::sol_types::sol_data::Uint<256>, alloy::sol_types::sol_data::FixedBytes<32>, alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Uint<256>, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( @@ -867,6 +1095,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe alloy::sol_types::private::primitives::aliases::U256, alloy::sol_types::private::FixedBytes<32>, alloy::sol_types::private::Vec, + alloy::sol_types::private::primitives::aliases::U256, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -888,6 +1117,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe value.keyId, value.snsCiphertextDigest, value.coprocessorTxSenderAddresses, + value.contextId, ) } } @@ -900,6 +1130,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe keyId: tuple.1, snsCiphertextDigest: tuple.2, coprocessorTxSenderAddresses: tuple.3, + contextId: tuple.4, } } } @@ -926,6 +1157,9 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe > as alloy_sol_types::SolType>::tokenize( &self.coprocessorTxSenderAddresses, ), + as alloy_sol_types::SolType>::tokenize(&self.contextId), ) } #[inline] @@ -1000,7 +1234,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe #[inline] fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { alloy_sol_types::private::Cow::Borrowed( - "SnsCiphertextMaterial(bytes32 ctHandle,uint256 keyId,bytes32 snsCiphertextDigest,address[] coprocessorTxSenderAddresses)", + "SnsCiphertextMaterial(bytes32 ctHandle,uint256 keyId,bytes32 snsCiphertextDigest,address[] coprocessorTxSenderAddresses,uint256 contextId)", ) } #[inline] @@ -1036,6 +1270,10 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe &self.coprocessorTxSenderAddresses, ) .0, + as alloy_sol_types::SolType>::eip712_data_word(&self.contextId) + .0, ] .concat() } @@ -1063,6 +1301,11 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe > as alloy_sol_types::EventTopic>::topic_preimage_length( &rust.coprocessorTxSenderAddresses, ) + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.contextId, + ) } #[inline] fn encode_topic_preimage( @@ -1096,6 +1339,12 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe &rust.coprocessorTxSenderAddresses, out, ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.contextId, + out, + ); } #[inline] fn encode_topic( @@ -1680,6 +1929,110 @@ error HostChainNotRegistered(uint256 chainId); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InvalidCoprocessorContextAddCiphertext(bytes32,uint256,uint8)` and selector `0x96346431`. +```solidity +error InvalidCoprocessorContextAddCiphertext(bytes32 ctHandle, uint256 contextId, ContextStatus contextStatus); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidCoprocessorContextAddCiphertext { + #[allow(missing_docs)] + pub ctHandle: alloy::sol_types::private::FixedBytes<32>, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub contextStatus: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::FixedBytes<32>, + alloy::sol_types::sol_data::Uint<256>, + ContextStatus, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::FixedBytes<32>, + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: InvalidCoprocessorContextAddCiphertext) -> Self { + (value.ctHandle, value.contextId, value.contextStatus) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for InvalidCoprocessorContextAddCiphertext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + ctHandle: tuple.0, + contextId: tuple.1, + contextStatus: tuple.2, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InvalidCoprocessorContextAddCiphertext { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InvalidCoprocessorContextAddCiphertext(bytes32,uint256,uint8)"; + const SELECTOR: [u8; 4] = [150u8, 52u8, 100u8, 49u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.ctHandle), + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.contextStatus, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Custom error with signature `InvalidInitialization()` and selector `0xf92ee8a9`. ```solidity error InvalidInitialization(); @@ -1753,13 +2106,15 @@ error InvalidInitialization(); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `NotCoprocessorSigner(address)` and selector `0x26cd75dc`. + /**Custom error with signature `NotCoprocessorSignerFromContext(uint256,address)` and selector `0x554f8c5f`. ```solidity -error NotCoprocessorSigner(address signerAddress); +error NotCoprocessorSignerFromContext(uint256 contextId, address signerAddress); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct NotCoprocessorSigner { + pub struct NotCoprocessorSignerFromContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, #[allow(missing_docs)] pub signerAddress: alloy::sol_types::private::Address, } @@ -1772,9 +2127,15 @@ error NotCoprocessorSigner(address signerAddress); const _: () = { use alloy::sol_types as alloy_sol_types; #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -1788,26 +2149,31 @@ error NotCoprocessorSigner(address signerAddress); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: NotCoprocessorSigner) -> Self { - (value.signerAddress,) + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NotCoprocessorSignerFromContext) -> Self { + (value.contextId, value.signerAddress) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for NotCoprocessorSigner { + impl ::core::convert::From> + for NotCoprocessorSignerFromContext { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { signerAddress: tuple.0 } + Self { + contextId: tuple.0, + signerAddress: tuple.1, + } } } #[automatically_derived] - impl alloy_sol_types::SolError for NotCoprocessorSigner { + impl alloy_sol_types::SolError for NotCoprocessorSignerFromContext { type Parameters<'a> = UnderlyingSolTuple<'a>; type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "NotCoprocessorSigner(address)"; - const SELECTOR: [u8; 4] = [38u8, 205u8, 117u8, 220u8]; + const SIGNATURE: &'static str = "NotCoprocessorSignerFromContext(uint256,address)"; + const SELECTOR: [u8; 4] = [85u8, 79u8, 140u8, 95u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -1817,6 +2183,9 @@ error NotCoprocessorSigner(address signerAddress); #[inline] fn tokenize(&self) -> Self::Token<'_> { ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), ::tokenize( &self.signerAddress, ), @@ -1833,13 +2202,15 @@ error NotCoprocessorSigner(address signerAddress); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `NotCoprocessorTxSender(address)` and selector `0x52d725f5`. + /**Custom error with signature `NotCoprocessorTxSenderFromContext(uint256,address)` and selector `0x29a993c1`. ```solidity -error NotCoprocessorTxSender(address txSenderAddress); +error NotCoprocessorTxSenderFromContext(uint256 contextId, address txSenderAddress); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct NotCoprocessorTxSender { + pub struct NotCoprocessorTxSenderFromContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, #[allow(missing_docs)] pub txSenderAddress: alloy::sol_types::private::Address, } @@ -1852,9 +2223,15 @@ error NotCoprocessorTxSender(address txSenderAddress); const _: () = { use alloy::sol_types as alloy_sol_types; #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -1868,26 +2245,31 @@ error NotCoprocessorTxSender(address txSenderAddress); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: NotCoprocessorTxSender) -> Self { - (value.txSenderAddress,) + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NotCoprocessorTxSenderFromContext) -> Self { + (value.contextId, value.txSenderAddress) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for NotCoprocessorTxSender { + impl ::core::convert::From> + for NotCoprocessorTxSenderFromContext { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { txSenderAddress: tuple.0 } + Self { + contextId: tuple.0, + txSenderAddress: tuple.1, + } } } #[automatically_derived] - impl alloy_sol_types::SolError for NotCoprocessorTxSender { + impl alloy_sol_types::SolError for NotCoprocessorTxSenderFromContext { type Parameters<'a> = UnderlyingSolTuple<'a>; type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "NotCoprocessorTxSender(address)"; - const SELECTOR: [u8; 4] = [82u8, 215u8, 37u8, 245u8]; + const SIGNATURE: &'static str = "NotCoprocessorTxSenderFromContext(uint256,address)"; + const SELECTOR: [u8; 4] = [41u8, 169u8, 147u8, 193u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -1897,6 +2279,9 @@ error NotCoprocessorTxSender(address txSenderAddress); #[inline] fn tokenize(&self) -> Self::Token<'_> { ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), ::tokenize( &self.txSenderAddress, ), @@ -2618,9 +3003,9 @@ error UUPSUnsupportedProxiableUUID(bytes32 slot); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `AddCiphertextMaterial(bytes32,bytes32,bytes32,address[])` and selector `0xcb89ccb347018d7f282bb4c048e135e19bc1d13660fa0f2850e10518422536de`. + /**Event with signature `AddCiphertextMaterial(bytes32,bytes32,bytes32,uint256)` and selector `0xc3113162bedb887e086a25724f966348968a75efd447615ebfd0f715939ad964`. ```solidity -event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, bytes32 snsCiphertextDigest, address[] coprocessorTxSenders); +event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, bytes32 snsCiphertextDigest, uint256 coprocessorContextId); ```*/ #[allow( non_camel_case_types, @@ -2637,9 +3022,7 @@ event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, #[allow(missing_docs)] pub snsCiphertextDigest: alloy::sol_types::private::FixedBytes<32>, #[allow(missing_docs)] - pub coprocessorTxSenders: alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, - >, + pub coprocessorContextId: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -2654,7 +3037,7 @@ event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, type DataTuple<'a> = ( alloy::sol_types::sol_data::FixedBytes<32>, alloy::sol_types::sol_data::FixedBytes<32>, - alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Uint<256>, ); type DataToken<'a> = , alloy::sol_types::sol_data::FixedBytes<32>, ); - const SIGNATURE: &'static str = "AddCiphertextMaterial(bytes32,bytes32,bytes32,address[])"; + const SIGNATURE: &'static str = "AddCiphertextMaterial(bytes32,bytes32,bytes32,uint256)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 203u8, 137u8, 204u8, 179u8, 71u8, 1u8, 141u8, 127u8, 40u8, 43u8, 180u8, - 192u8, 72u8, 225u8, 53u8, 225u8, 155u8, 193u8, 209u8, 54u8, 96u8, 250u8, - 15u8, 40u8, 80u8, 225u8, 5u8, 24u8, 66u8, 37u8, 54u8, 222u8, + 195u8, 17u8, 49u8, 98u8, 190u8, 219u8, 136u8, 126u8, 8u8, 106u8, 37u8, + 114u8, 79u8, 150u8, 99u8, 72u8, 150u8, 138u8, 117u8, 239u8, 212u8, 71u8, + 97u8, 94u8, 191u8, 208u8, 247u8, 21u8, 147u8, 154u8, 217u8, 100u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -2680,7 +3063,7 @@ event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, ctHandle: topics.1, ciphertextDigest: data.0, snsCiphertextDigest: data.1, - coprocessorTxSenders: data.2, + coprocessorContextId: data.2, } } #[inline] @@ -2707,9 +3090,9 @@ event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, as alloy_sol_types::SolType>::tokenize(&self.snsCiphertextDigest), - as alloy_sol_types::SolType>::tokenize(&self.coprocessorTxSenders), + as alloy_sol_types::SolType>::tokenize(&self.coprocessorContextId), ) } #[inline] @@ -3357,24 +3740,28 @@ function addCiphertextMaterial(bytes32 ctHandle, uint256 keyId, bytes32 cipherte }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getAddCiphertextMaterialConsensusTxSenders(bytes32)` and selector `0xe6f6ab94`. + /**Function with signature `getCiphertextMaterials(bytes32[])` and selector `0x55c4d997`. ```solidity -function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external view returns (address[] memory); +function getCiphertextMaterials(bytes32[] memory ctHandles) external view returns (CiphertextMaterial[] memory ctMaterials); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getAddCiphertextMaterialConsensusTxSendersCall { + pub struct getCiphertextMaterialsCall { #[allow(missing_docs)] - pub ctHandle: alloy::sol_types::private::FixedBytes<32>, + pub ctHandles: alloy::sol_types::private::Vec< + alloy::sol_types::private::FixedBytes<32>, + >, } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getAddCiphertextMaterialConsensusTxSenders(bytes32)`](getAddCiphertextMaterialConsensusTxSendersCall) function. + ///Container type for the return parameters of the [`getCiphertextMaterials(bytes32[])`](getCiphertextMaterialsCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getAddCiphertextMaterialConsensusTxSendersReturn { + pub struct getCiphertextMaterialsReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec, + pub ctMaterials: alloy::sol_types::private::Vec< + ::RustType, + >, } #[allow( non_camel_case_types, @@ -3386,9 +3773,17 @@ function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external v use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::FixedBytes<32>,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Array< + alloy::sol_types::sol_data::FixedBytes<32>, + >, + ); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::FixedBytes<32>,); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Vec< + alloy::sol_types::private::FixedBytes<32>, + >, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -3402,29 +3797,31 @@ function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external v } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getAddCiphertextMaterialConsensusTxSendersCall) -> Self { - (value.ctHandle,) + fn from(value: getCiphertextMaterialsCall) -> Self { + (value.ctHandles,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getAddCiphertextMaterialConsensusTxSendersCall { + for getCiphertextMaterialsCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { ctHandle: tuple.0 } + Self { ctHandles: tuple.0 } } } } { #[doc(hidden)] type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Array, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec, + alloy::sol_types::private::Vec< + ::RustType, + >, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -3439,41 +3836,42 @@ function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external v } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from( - value: getAddCiphertextMaterialConsensusTxSendersReturn, - ) -> Self { - (value._0,) + fn from(value: getCiphertextMaterialsReturn) -> Self { + (value.ctMaterials,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getAddCiphertextMaterialConsensusTxSendersReturn { + for getCiphertextMaterialsReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } + Self { ctMaterials: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall - for getAddCiphertextMaterialConsensusTxSendersCall { - type Parameters<'a> = (alloy::sol_types::sol_data::FixedBytes<32>,); + impl alloy_sol_types::SolCall for getCiphertextMaterialsCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Array< + alloy::sol_types::sol_data::FixedBytes<32>, + >, + ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; type Return = alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, + ::RustType, >; type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Array, ); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getAddCiphertextMaterialConsensusTxSenders(bytes32)"; - const SELECTOR: [u8; 4] = [230u8, 246u8, 171u8, 148u8]; + const SIGNATURE: &'static str = "getCiphertextMaterials(bytes32[])"; + const SELECTOR: [u8; 4] = [85u8, 196u8, 217u8, 151u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -3483,16 +3881,16 @@ function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external v #[inline] fn tokenize(&self) -> Self::Token<'_> { ( - as alloy_sol_types::SolType>::tokenize(&self.ctHandle), + , + > as alloy_sol_types::SolType>::tokenize(&self.ctHandles), ) } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( as alloy_sol_types::SolType>::tokenize(ret), ) } @@ -3502,9 +3900,8 @@ function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external v '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getAddCiphertextMaterialConsensusTxSendersReturn = r - .into(); - r._0 + let r: getCiphertextMaterialsReturn = r.into(); + r.ctMaterials }) } #[inline] @@ -3515,37 +3912,36 @@ function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external v '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getAddCiphertextMaterialConsensusTxSendersReturn = r - .into(); - r._0 + let r: getCiphertextMaterialsReturn = r.into(); + r.ctMaterials }) } } }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCiphertextMaterials(bytes32[])` and selector `0x55c4d997`. + /**Function with signature `getConsensusCoprocessorTxSenders(bytes32)` and selector `0xe4bb288c`. ```solidity -function getCiphertextMaterials(bytes32[] memory ctHandles) external view returns (CiphertextMaterial[] memory ctMaterials); +function getConsensusCoprocessorTxSenders(bytes32 ctHandle) external view returns (address[] memory, uint256, bool); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCiphertextMaterialsCall { + pub struct getConsensusCoprocessorTxSendersCall { #[allow(missing_docs)] - pub ctHandles: alloy::sol_types::private::Vec< - alloy::sol_types::private::FixedBytes<32>, - >, + pub ctHandle: alloy::sol_types::private::FixedBytes<32>, } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCiphertextMaterials(bytes32[])`](getCiphertextMaterialsCall) function. + ///Container type for the return parameters of the [`getConsensusCoprocessorTxSenders(bytes32)`](getConsensusCoprocessorTxSendersCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCiphertextMaterialsReturn { + pub struct getConsensusCoprocessorTxSendersReturn { #[allow(missing_docs)] - pub ctMaterials: alloy::sol_types::private::Vec< - ::RustType, - >, + pub _0: alloy::sol_types::private::Vec, + #[allow(missing_docs)] + pub _1: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub _2: bool, } #[allow( non_camel_case_types, @@ -3557,17 +3953,9 @@ function getCiphertextMaterials(bytes32[] memory ctHandles) external view return use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array< - alloy::sol_types::sol_data::FixedBytes<32>, - >, - ); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::FixedBytes<32>,); #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec< - alloy::sol_types::private::FixedBytes<32>, - >, - ); + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::FixedBytes<32>,); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -3581,31 +3969,33 @@ function getCiphertextMaterials(bytes32[] memory ctHandles) external view return } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCiphertextMaterialsCall) -> Self { - (value.ctHandles,) + fn from(value: getConsensusCoprocessorTxSendersCall) -> Self { + (value.ctHandle,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getCiphertextMaterialsCall { + for getConsensusCoprocessorTxSendersCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { ctHandles: tuple.0 } + Self { ctHandle: tuple.0 } } } } { #[doc(hidden)] type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Bool, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec< - ::RustType, - >, + alloy::sol_types::private::Vec, + alloy::sol_types::private::primitives::aliases::U256, + bool, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -3620,42 +4010,61 @@ function getCiphertextMaterials(bytes32[] memory ctHandles) external view return } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCiphertextMaterialsReturn) -> Self { - (value.ctMaterials,) + fn from(value: getConsensusCoprocessorTxSendersReturn) -> Self { + (value._0, value._1, value._2) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getCiphertextMaterialsReturn { + for getConsensusCoprocessorTxSendersReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { ctMaterials: tuple.0 } + Self { + _0: tuple.0, + _1: tuple.1, + _2: tuple.2, + } } } } + impl getConsensusCoprocessorTxSendersReturn { + fn _tokenize( + &self, + ) -> ::ReturnToken< + '_, + > { + ( + as alloy_sol_types::SolType>::tokenize(&self._0), + as alloy_sol_types::SolType>::tokenize(&self._1), + ::tokenize( + &self._2, + ), + ) + } + } #[automatically_derived] - impl alloy_sol_types::SolCall for getCiphertextMaterialsCall { - type Parameters<'a> = ( - alloy::sol_types::sol_data::Array< - alloy::sol_types::sol_data::FixedBytes<32>, - >, - ); + impl alloy_sol_types::SolCall for getConsensusCoprocessorTxSendersCall { + type Parameters<'a> = (alloy::sol_types::sol_data::FixedBytes<32>,); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::Vec< - ::RustType, - >; + type Return = getConsensusCoprocessorTxSendersReturn; type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Bool, ); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCiphertextMaterials(bytes32[])"; - const SELECTOR: [u8; 4] = [85u8, 196u8, 217u8, 151u8]; + const SIGNATURE: &'static str = "getConsensusCoprocessorTxSenders(bytes32)"; + const SELECTOR: [u8; 4] = [228u8, 187u8, 40u8, 140u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -3665,28 +4074,21 @@ function getCiphertextMaterials(bytes32[] memory ctHandles) external view return #[inline] fn tokenize(&self) -> Self::Token<'_> { ( - , - > as alloy_sol_types::SolType>::tokenize(&self.ctHandles), + as alloy_sol_types::SolType>::tokenize(&self.ctHandle), ) } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) + getConsensusCoprocessorTxSendersReturn::_tokenize(ret) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(|r| { - let r: getCiphertextMaterialsReturn = r.into(); - r.ctMaterials - }) + .map(Into::into) } #[inline] fn abi_decode_returns_validate( @@ -3695,10 +4097,7 @@ function getCiphertextMaterials(bytes32[] memory ctHandles) external view return as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(|r| { - let r: getCiphertextMaterialsReturn = r.into(); - r.ctMaterials - }) + .map(Into::into) } } }; @@ -4465,6 +4864,143 @@ function proxiableUUID() external view returns (bytes32); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `reinitializeV2()` and selector `0xc4115874`. +```solidity +function reinitializeV2() external; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct reinitializeV2Call; + ///Container type for the return parameters of the [`reinitializeV2()`](reinitializeV2Call) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct reinitializeV2Return {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: reinitializeV2Call) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for reinitializeV2Call { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: reinitializeV2Return) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for reinitializeV2Return { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl reinitializeV2Return { + fn _tokenize( + &self, + ) -> ::ReturnToken<'_> { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for reinitializeV2Call { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = reinitializeV2Return; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "reinitializeV2()"; + const SELECTOR: [u8; 4] = [196u8, 17u8, 88u8, 116u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + reinitializeV2Return::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286`. ```solidity function upgradeToAndCall(address newImplementation, bytes memory data) external payable; @@ -4635,12 +5171,10 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external #[allow(missing_docs)] addCiphertextMaterial(addCiphertextMaterialCall), #[allow(missing_docs)] - getAddCiphertextMaterialConsensusTxSenders( - getAddCiphertextMaterialConsensusTxSendersCall, - ), - #[allow(missing_docs)] getCiphertextMaterials(getCiphertextMaterialsCall), #[allow(missing_docs)] + getConsensusCoprocessorTxSenders(getConsensusCoprocessorTxSendersCall), + #[allow(missing_docs)] getSnsCiphertextMaterials(getSnsCiphertextMaterialsCall), #[allow(missing_docs)] getVersion(getVersionCall), @@ -4651,6 +5185,8 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external #[allow(missing_docs)] proxiableUUID(proxiableUUIDCall), #[allow(missing_docs)] + reinitializeV2(reinitializeV2Call), + #[allow(missing_docs)] upgradeToAndCall(upgradeToAndCallCall), } #[automatically_derived] @@ -4671,14 +5207,15 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external [144u8, 243u8, 3u8, 84u8], [161u8, 79u8, 137u8, 113u8], [173u8, 60u8, 177u8, 204u8], - [230u8, 246u8, 171u8, 148u8], + [196u8, 17u8, 88u8, 116u8], + [228u8, 187u8, 40u8, 140u8], ]; } #[automatically_derived] impl alloy_sol_types::SolInterface for CiphertextCommitsCalls { const NAME: &'static str = "CiphertextCommitsCalls"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 10usize; + const COUNT: usize = 11usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -4688,12 +5225,12 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external Self::addCiphertextMaterial(_) => { ::SELECTOR } - Self::getAddCiphertextMaterialConsensusTxSenders(_) => { - ::SELECTOR - } Self::getCiphertextMaterials(_) => { ::SELECTOR } + Self::getConsensusCoprocessorTxSenders(_) => { + ::SELECTOR + } Self::getSnsCiphertextMaterials(_) => { ::SELECTOR } @@ -4709,6 +5246,9 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external Self::proxiableUUID(_) => { ::SELECTOR } + Self::reinitializeV2(_) => { + ::SELECTOR + } Self::upgradeToAndCall(_) => { ::SELECTOR } @@ -4831,17 +5371,28 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external UPGRADE_INTERFACE_VERSION }, { - fn getAddCiphertextMaterialConsensusTxSenders( + fn reinitializeV2( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CiphertextCommitsCalls::reinitializeV2) + } + reinitializeV2 + }, + { + fn getConsensusCoprocessorTxSenders( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw( + ::abi_decode_raw( data, ) .map( - CiphertextCommitsCalls::getAddCiphertextMaterialConsensusTxSenders, + CiphertextCommitsCalls::getConsensusCoprocessorTxSenders, ) } - getAddCiphertextMaterialConsensusTxSenders + getConsensusCoprocessorTxSenders }, ]; let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { @@ -4963,17 +5514,28 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external UPGRADE_INTERFACE_VERSION }, { - fn getAddCiphertextMaterialConsensusTxSenders( + fn reinitializeV2( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CiphertextCommitsCalls::reinitializeV2) + } + reinitializeV2 + }, + { + fn getConsensusCoprocessorTxSenders( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( + ::abi_decode_raw_validate( data, ) .map( - CiphertextCommitsCalls::getAddCiphertextMaterialConsensusTxSenders, + CiphertextCommitsCalls::getConsensusCoprocessorTxSenders, ) } - getAddCiphertextMaterialConsensusTxSenders + getConsensusCoprocessorTxSenders }, ]; let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { @@ -4999,13 +5561,13 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external inner, ) } - Self::getAddCiphertextMaterialConsensusTxSenders(inner) => { - ::abi_encoded_size( + Self::getCiphertextMaterials(inner) => { + ::abi_encoded_size( inner, ) } - Self::getCiphertextMaterials(inner) => { - ::abi_encoded_size( + Self::getConsensusCoprocessorTxSenders(inner) => { + ::abi_encoded_size( inner, ) } @@ -5032,6 +5594,11 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external inner, ) } + Self::reinitializeV2(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::upgradeToAndCall(inner) => { ::abi_encoded_size( inner, @@ -5054,14 +5621,14 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external out, ) } - Self::getAddCiphertextMaterialConsensusTxSenders(inner) => { - ::abi_encode_raw( + Self::getCiphertextMaterials(inner) => { + ::abi_encode_raw( inner, out, ) } - Self::getCiphertextMaterials(inner) => { - ::abi_encode_raw( + Self::getConsensusCoprocessorTxSenders(inner) => { + ::abi_encode_raw( inner, out, ) @@ -5096,6 +5663,12 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external out, ) } + Self::reinitializeV2(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::upgradeToAndCall(inner) => { ::abi_encode_raw( inner, @@ -5124,11 +5697,13 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external #[allow(missing_docs)] HostChainNotRegistered(HostChainNotRegistered), #[allow(missing_docs)] + InvalidCoprocessorContextAddCiphertext(InvalidCoprocessorContextAddCiphertext), + #[allow(missing_docs)] InvalidInitialization(InvalidInitialization), #[allow(missing_docs)] - NotCoprocessorSigner(NotCoprocessorSigner), + NotCoprocessorSignerFromContext(NotCoprocessorSignerFromContext), #[allow(missing_docs)] - NotCoprocessorTxSender(NotCoprocessorTxSender), + NotCoprocessorTxSenderFromContext(NotCoprocessorTxSenderFromContext), #[allow(missing_docs)] NotCustodianSigner(NotCustodianSigner), #[allow(missing_docs)] @@ -5160,12 +5735,13 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external [6u8, 102u8, 203u8, 223u8], [14u8, 86u8, 207u8, 61u8], [29u8, 215u8, 37u8, 12u8], - [38u8, 205u8, 117u8, 220u8], + [41u8, 169u8, 147u8, 193u8], [42u8, 124u8, 110u8, 246u8], [57u8, 22u8, 114u8, 167u8], [76u8, 156u8, 140u8, 227u8], - [82u8, 215u8, 37u8, 245u8], + [85u8, 79u8, 140u8, 95u8], [111u8, 79u8, 115u8, 31u8], + [150u8, 52u8, 100u8, 49u8], [153u8, 150u8, 179u8, 21u8], [170u8, 29u8, 73u8, 164u8], [174u8, 232u8, 99u8, 35u8], @@ -5182,7 +5758,7 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external impl alloy_sol_types::SolInterface for CiphertextCommitsErrors { const NAME: &'static str = "CiphertextCommitsErrors"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 19usize; + const COUNT: usize = 20usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -5207,14 +5783,17 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external Self::HostChainNotRegistered(_) => { ::SELECTOR } + Self::InvalidCoprocessorContextAddCiphertext(_) => { + ::SELECTOR + } Self::InvalidInitialization(_) => { ::SELECTOR } - Self::NotCoprocessorSigner(_) => { - ::SELECTOR + Self::NotCoprocessorSignerFromContext(_) => { + ::SELECTOR } - Self::NotCoprocessorTxSender(_) => { - ::SELECTOR + Self::NotCoprocessorTxSenderFromContext(_) => { + ::SELECTOR } Self::NotCustodianSigner(_) => { ::SELECTOR @@ -5296,15 +5875,17 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external CoprocessorAlreadyAdded }, { - fn NotCoprocessorSigner( + fn NotCoprocessorTxSenderFromContext( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw( + ::abi_decode_raw( data, ) - .map(CiphertextCommitsErrors::NotCoprocessorSigner) + .map( + CiphertextCommitsErrors::NotCoprocessorTxSenderFromContext, + ) } - NotCoprocessorSigner + NotCoprocessorTxSenderFromContext }, { fn NotKmsSigner( @@ -5338,15 +5919,17 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external ERC1967InvalidImplementation }, { - fn NotCoprocessorTxSender( + fn NotCoprocessorSignerFromContext( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw( + ::abi_decode_raw( data, ) - .map(CiphertextCommitsErrors::NotCoprocessorTxSender) + .map( + CiphertextCommitsErrors::NotCoprocessorSignerFromContext, + ) } - NotCoprocessorTxSender + NotCoprocessorSignerFromContext }, { fn NotInitializingFromEmptyProxy( @@ -5359,6 +5942,19 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } NotInitializingFromEmptyProxy }, + { + fn InvalidCoprocessorContextAddCiphertext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CiphertextCommitsErrors::InvalidCoprocessorContextAddCiphertext, + ) + } + InvalidCoprocessorContextAddCiphertext + }, { fn AddressEmptyCode( data: &[u8], @@ -5521,15 +6117,17 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external CoprocessorAlreadyAdded }, { - fn NotCoprocessorSigner( + fn NotCoprocessorTxSenderFromContext( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( + ::abi_decode_raw_validate( data, ) - .map(CiphertextCommitsErrors::NotCoprocessorSigner) + .map( + CiphertextCommitsErrors::NotCoprocessorTxSenderFromContext, + ) } - NotCoprocessorSigner + NotCoprocessorTxSenderFromContext }, { fn NotKmsSigner( @@ -5565,15 +6163,17 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external ERC1967InvalidImplementation }, { - fn NotCoprocessorTxSender( + fn NotCoprocessorSignerFromContext( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( + ::abi_decode_raw_validate( data, ) - .map(CiphertextCommitsErrors::NotCoprocessorTxSender) + .map( + CiphertextCommitsErrors::NotCoprocessorSignerFromContext, + ) } - NotCoprocessorTxSender + NotCoprocessorSignerFromContext }, { fn NotInitializingFromEmptyProxy( @@ -5586,6 +6186,19 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } NotInitializingFromEmptyProxy }, + { + fn InvalidCoprocessorContextAddCiphertext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CiphertextCommitsErrors::InvalidCoprocessorContextAddCiphertext, + ) + } + InvalidCoprocessorContextAddCiphertext + }, { fn AddressEmptyCode( data: &[u8], @@ -5743,18 +6356,23 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external inner, ) } + Self::InvalidCoprocessorContextAddCiphertext(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::InvalidInitialization(inner) => { ::abi_encoded_size( inner, ) } - Self::NotCoprocessorSigner(inner) => { - ::abi_encoded_size( + Self::NotCoprocessorSignerFromContext(inner) => { + ::abi_encoded_size( inner, ) } - Self::NotCoprocessorTxSender(inner) => { - ::abi_encoded_size( + Self::NotCoprocessorTxSenderFromContext(inner) => { + ::abi_encoded_size( inner, ) } @@ -5845,20 +6463,26 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external out, ) } + Self::InvalidCoprocessorContextAddCiphertext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::InvalidInitialization(inner) => { ::abi_encode_raw( inner, out, ) } - Self::NotCoprocessorSigner(inner) => { - ::abi_encode_raw( + Self::NotCoprocessorSignerFromContext(inner) => { + ::abi_encode_raw( inner, out, ) } - Self::NotCoprocessorTxSender(inner) => { - ::abi_encode_raw( + Self::NotCoprocessorTxSenderFromContext(inner) => { + ::abi_encode_raw( inner, out, ) @@ -5945,16 +6569,16 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external 179u8, 32u8, 65u8, 247u8, 85u8, 33u8, 77u8, 188u8, 107u8, 255u8, 169u8, 12u8, 192u8, 34u8, 91u8, 57u8, 218u8, 46u8, 92u8, 45u8, 59u8, ], + [ + 195u8, 17u8, 49u8, 98u8, 190u8, 219u8, 136u8, 126u8, 8u8, 106u8, 37u8, + 114u8, 79u8, 150u8, 99u8, 72u8, 150u8, 138u8, 117u8, 239u8, 212u8, 71u8, + 97u8, 94u8, 191u8, 208u8, 247u8, 21u8, 147u8, 154u8, 217u8, 100u8, + ], [ 199u8, 245u8, 5u8, 178u8, 243u8, 113u8, 174u8, 33u8, 117u8, 238u8, 73u8, 19u8, 244u8, 73u8, 158u8, 31u8, 38u8, 51u8, 167u8, 181u8, 147u8, 99u8, 33u8, 238u8, 209u8, 205u8, 174u8, 182u8, 17u8, 81u8, 129u8, 210u8, ], - [ - 203u8, 137u8, 204u8, 179u8, 71u8, 1u8, 141u8, 127u8, 40u8, 43u8, 180u8, - 192u8, 72u8, 225u8, 53u8, 225u8, 155u8, 193u8, 209u8, 54u8, 96u8, 250u8, - 15u8, 40u8, 80u8, 225u8, 5u8, 24u8, 66u8, 37u8, 54u8, 222u8, - ], ]; } #[automatically_derived] @@ -6211,21 +6835,6 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ }, ) } - ///Creates a new call builder for the [`getAddCiphertextMaterialConsensusTxSenders`] function. - pub fn getAddCiphertextMaterialConsensusTxSenders( - &self, - ctHandle: alloy::sol_types::private::FixedBytes<32>, - ) -> alloy_contract::SolCallBuilder< - &P, - getAddCiphertextMaterialConsensusTxSendersCall, - N, - > { - self.call_builder( - &getAddCiphertextMaterialConsensusTxSendersCall { - ctHandle, - }, - ) - } ///Creates a new call builder for the [`getCiphertextMaterials`] function. pub fn getCiphertextMaterials( &self, @@ -6239,6 +6848,21 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ }, ) } + ///Creates a new call builder for the [`getConsensusCoprocessorTxSenders`] function. + pub fn getConsensusCoprocessorTxSenders( + &self, + ctHandle: alloy::sol_types::private::FixedBytes<32>, + ) -> alloy_contract::SolCallBuilder< + &P, + getConsensusCoprocessorTxSendersCall, + N, + > { + self.call_builder( + &getConsensusCoprocessorTxSendersCall { + ctHandle, + }, + ) + } ///Creates a new call builder for the [`getSnsCiphertextMaterials`] function. pub fn getSnsCiphertextMaterials( &self, @@ -6281,6 +6905,12 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ ) -> alloy_contract::SolCallBuilder<&P, proxiableUUIDCall, N> { self.call_builder(&proxiableUUIDCall) } + ///Creates a new call builder for the [`reinitializeV2`] function. + pub fn reinitializeV2( + &self, + ) -> alloy_contract::SolCallBuilder<&P, reinitializeV2Call, N> { + self.call_builder(&reinitializeV2Call) + } ///Creates a new call builder for the [`upgradeToAndCall`] function. pub fn upgradeToAndCall( &self, diff --git a/gateway-contracts/rust_bindings/src/ciphertext_commits_utils.rs b/gateway-contracts/rust_bindings/src/ciphertext_commits_utils.rs new file mode 100644 index 0000000000..d1afab3ab4 --- /dev/null +++ b/gateway-contracts/rust_bindings/src/ciphertext_commits_utils.rs @@ -0,0 +1,440 @@ +/** + +Generated by the following Solidity interface... +```solidity +interface CiphertextCommitsUtils { + error CiphertextMaterialNotAdded(bytes32 ctHandle); +} +``` + +...which was generated by the following JSON ABI: +```json +[ + { + "type": "error", + "name": "CiphertextMaterialNotAdded", + "inputs": [ + { + "name": "ctHandle", + "type": "bytes32", + "internalType": "bytes32" + } + ] + } +] +```*/ +#[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style, + clippy::empty_structs_with_brackets +)] +pub mod CiphertextCommitsUtils { + use super::*; + use alloy::sol_types as alloy_sol_types; + /// The creation / init bytecode of the contract. + /// + /// ```text + ///0x + /// ``` + #[rustfmt::skip] + #[allow(clippy::all)] + pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( + b"", + ); + /// The runtime bytecode of the contract, as deployed on the network. + /// + /// ```text + ///0x + /// ``` + #[rustfmt::skip] + #[allow(clippy::all)] + pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( + b"", + ); + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `CiphertextMaterialNotAdded(bytes32)` and selector `0x826b4638`. +```solidity +error CiphertextMaterialNotAdded(bytes32 ctHandle); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct CiphertextMaterialNotAdded { + #[allow(missing_docs)] + pub ctHandle: alloy::sol_types::private::FixedBytes<32>, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::FixedBytes<32>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::FixedBytes<32>,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: CiphertextMaterialNotAdded) -> Self { + (value.ctHandle,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for CiphertextMaterialNotAdded { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { ctHandle: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for CiphertextMaterialNotAdded { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "CiphertextMaterialNotAdded(bytes32)"; + const SELECTOR: [u8; 4] = [130u8, 107u8, 70u8, 56u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.ctHandle), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + ///Container for all the [`CiphertextCommitsUtils`](self) custom errors. + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Debug, PartialEq, Eq, Hash)] + pub enum CiphertextCommitsUtilsErrors { + #[allow(missing_docs)] + CiphertextMaterialNotAdded(CiphertextMaterialNotAdded), + } + #[automatically_derived] + impl CiphertextCommitsUtilsErrors { + /// All the selectors of this enum. + /// + /// Note that the selectors might not be in the same order as the variants. + /// No guarantees are made about the order of the selectors. + /// + /// Prefer using `SolInterface` methods instead. + pub const SELECTORS: &'static [[u8; 4usize]] = &[[130u8, 107u8, 70u8, 56u8]]; + } + #[automatically_derived] + impl alloy_sol_types::SolInterface for CiphertextCommitsUtilsErrors { + const NAME: &'static str = "CiphertextCommitsUtilsErrors"; + const MIN_DATA_LENGTH: usize = 32usize; + const COUNT: usize = 1usize; + #[inline] + fn selector(&self) -> [u8; 4] { + match self { + Self::CiphertextMaterialNotAdded(_) => { + ::SELECTOR + } + } + } + #[inline] + fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { + Self::SELECTORS.get(i).copied() + } + #[inline] + fn valid_selector(selector: [u8; 4]) -> bool { + Self::SELECTORS.binary_search(&selector).is_ok() + } + #[inline] + #[allow(non_snake_case)] + fn abi_decode_raw( + selector: [u8; 4], + data: &[u8], + ) -> alloy_sol_types::Result { + static DECODE_SHIMS: &[fn( + &[u8], + ) -> alloy_sol_types::Result] = &[ + { + fn CiphertextMaterialNotAdded( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CiphertextCommitsUtilsErrors::CiphertextMaterialNotAdded, + ) + } + CiphertextMaterialNotAdded + }, + ]; + let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { + return Err( + alloy_sol_types::Error::unknown_selector( + ::NAME, + selector, + ), + ); + }; + DECODE_SHIMS[idx](data) + } + #[inline] + #[allow(non_snake_case)] + fn abi_decode_raw_validate( + selector: [u8; 4], + data: &[u8], + ) -> alloy_sol_types::Result { + static DECODE_VALIDATE_SHIMS: &[fn( + &[u8], + ) -> alloy_sol_types::Result] = &[ + { + fn CiphertextMaterialNotAdded( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CiphertextCommitsUtilsErrors::CiphertextMaterialNotAdded, + ) + } + CiphertextMaterialNotAdded + }, + ]; + let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { + return Err( + alloy_sol_types::Error::unknown_selector( + ::NAME, + selector, + ), + ); + }; + DECODE_VALIDATE_SHIMS[idx](data) + } + #[inline] + fn abi_encoded_size(&self) -> usize { + match self { + Self::CiphertextMaterialNotAdded(inner) => { + ::abi_encoded_size( + inner, + ) + } + } + } + #[inline] + fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { + match self { + Self::CiphertextMaterialNotAdded(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + } + } + } + use alloy::contract as alloy_contract; + /**Creates a new wrapper around an on-chain [`CiphertextCommitsUtils`](self) contract instance. + +See the [wrapper's documentation](`CiphertextCommitsUtilsInstance`) for more details.*/ + #[inline] + pub const fn new< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >( + address: alloy_sol_types::private::Address, + provider: P, + ) -> CiphertextCommitsUtilsInstance { + CiphertextCommitsUtilsInstance::::new(address, provider) + } + /**Deploys this contract using the given `provider` and constructor arguments, if any. + +Returns a new instance of the contract, if the deployment was successful. + +For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ + #[inline] + pub fn deploy< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >( + provider: P, + ) -> impl ::core::future::Future< + Output = alloy_contract::Result>, + > { + CiphertextCommitsUtilsInstance::::deploy(provider) + } + /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` +and constructor arguments, if any. + +This is a simple wrapper around creating a `RawCallBuilder` with the data set to +the bytecode concatenated with the constructor's ABI-encoded arguments.*/ + #[inline] + pub fn deploy_builder< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >(provider: P) -> alloy_contract::RawCallBuilder { + CiphertextCommitsUtilsInstance::::deploy_builder(provider) + } + /**A [`CiphertextCommitsUtils`](self) instance. + +Contains type-safe methods for interacting with an on-chain instance of the +[`CiphertextCommitsUtils`](self) contract located at a given `address`, using a given +provider `P`. + +If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) +documentation on how to provide it), the `deploy` and `deploy_builder` methods can +be used to deploy a new instance of the contract. + +See the [module-level documentation](self) for all the available methods.*/ + #[derive(Clone)] + pub struct CiphertextCommitsUtilsInstance { + address: alloy_sol_types::private::Address, + provider: P, + _network: ::core::marker::PhantomData, + } + #[automatically_derived] + impl ::core::fmt::Debug for CiphertextCommitsUtilsInstance { + #[inline] + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.debug_tuple("CiphertextCommitsUtilsInstance").field(&self.address).finish() + } + } + /// Instantiation and getters/setters. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > CiphertextCommitsUtilsInstance { + /**Creates a new wrapper around an on-chain [`CiphertextCommitsUtils`](self) contract instance. + +See the [wrapper's documentation](`CiphertextCommitsUtilsInstance`) for more details.*/ + #[inline] + pub const fn new( + address: alloy_sol_types::private::Address, + provider: P, + ) -> Self { + Self { + address, + provider, + _network: ::core::marker::PhantomData, + } + } + /**Deploys this contract using the given `provider` and constructor arguments, if any. + +Returns a new instance of the contract, if the deployment was successful. + +For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ + #[inline] + pub async fn deploy( + provider: P, + ) -> alloy_contract::Result> { + let call_builder = Self::deploy_builder(provider); + let contract_address = call_builder.deploy().await?; + Ok(Self::new(contract_address, call_builder.provider)) + } + /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` +and constructor arguments, if any. + +This is a simple wrapper around creating a `RawCallBuilder` with the data set to +the bytecode concatenated with the constructor's ABI-encoded arguments.*/ + #[inline] + pub fn deploy_builder(provider: P) -> alloy_contract::RawCallBuilder { + alloy_contract::RawCallBuilder::new_raw_deploy( + provider, + ::core::clone::Clone::clone(&BYTECODE), + ) + } + /// Returns a reference to the address. + #[inline] + pub const fn address(&self) -> &alloy_sol_types::private::Address { + &self.address + } + /// Sets the address. + #[inline] + pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { + self.address = address; + } + /// Sets the address and returns `self`. + pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { + self.set_address(address); + self + } + /// Returns a reference to the provider. + #[inline] + pub const fn provider(&self) -> &P { + &self.provider + } + } + impl CiphertextCommitsUtilsInstance<&P, N> { + /// Clones the provider and returns a new instance with the cloned provider. + #[inline] + pub fn with_cloned_provider(self) -> CiphertextCommitsUtilsInstance { + CiphertextCommitsUtilsInstance { + address: self.address, + provider: ::core::clone::Clone::clone(&self.provider), + _network: ::core::marker::PhantomData, + } + } + } + /// Function calls. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > CiphertextCommitsUtilsInstance { + /// Creates a new call builder using this contract instance's provider and address. + /// + /// Note that the call can be any function call, not just those defined in this + /// contract. Prefer using the other methods for building type-safe contract calls. + pub fn call_builder( + &self, + call: &C, + ) -> alloy_contract::SolCallBuilder<&P, C, N> { + alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) + } + } + /// Event filters. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > CiphertextCommitsUtilsInstance { + /// Creates a new event filter using this contract instance's provider and address. + /// + /// Note that the type can be any event, not just those defined in this contract. + /// Prefer using the other methods for building type-safe event filters. + pub fn event_filter( + &self, + ) -> alloy_contract::Event<&P, E, N> { + alloy_contract::Event::new_sol(&self.provider, &self.address) + } + } +} diff --git a/gateway-contracts/rust_bindings/src/context_checks.rs b/gateway-contracts/rust_bindings/src/context_checks.rs new file mode 100644 index 0000000000..3d14c923a0 --- /dev/null +++ b/gateway-contracts/rust_bindings/src/context_checks.rs @@ -0,0 +1,609 @@ +/** + +Generated by the following Solidity interface... +```solidity +interface ContextChecks { + error NotCoprocessorSignerFromContext(uint256 contextId, address signerAddress); + error NotCoprocessorTxSenderFromContext(uint256 contextId, address txSenderAddress); +} +``` + +...which was generated by the following JSON ABI: +```json +[ + { + "type": "error", + "name": "NotCoprocessorSignerFromContext", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "NotCoprocessorTxSenderFromContext", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + } + ] + } +] +```*/ +#[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style, + clippy::empty_structs_with_brackets +)] +pub mod ContextChecks { + use super::*; + use alloy::sol_types as alloy_sol_types; + /// The creation / init bytecode of the contract. + /// + /// ```text + ///0x + /// ``` + #[rustfmt::skip] + #[allow(clippy::all)] + pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( + b"", + ); + /// The runtime bytecode of the contract, as deployed on the network. + /// + /// ```text + ///0x + /// ``` + #[rustfmt::skip] + #[allow(clippy::all)] + pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( + b"", + ); + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NotCoprocessorSignerFromContext(uint256,address)` and selector `0x554f8c5f`. +```solidity +error NotCoprocessorSignerFromContext(uint256 contextId, address signerAddress); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NotCoprocessorSignerFromContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub signerAddress: alloy::sol_types::private::Address, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NotCoprocessorSignerFromContext) -> Self { + (value.contextId, value.signerAddress) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NotCoprocessorSignerFromContext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + signerAddress: tuple.1, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NotCoprocessorSignerFromContext { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NotCoprocessorSignerFromContext(uint256,address)"; + const SELECTOR: [u8; 4] = [85u8, 79u8, 140u8, 95u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.signerAddress, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NotCoprocessorTxSenderFromContext(uint256,address)` and selector `0x29a993c1`. +```solidity +error NotCoprocessorTxSenderFromContext(uint256 contextId, address txSenderAddress); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NotCoprocessorTxSenderFromContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub txSenderAddress: alloy::sol_types::private::Address, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NotCoprocessorTxSenderFromContext) -> Self { + (value.contextId, value.txSenderAddress) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NotCoprocessorTxSenderFromContext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + txSenderAddress: tuple.1, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NotCoprocessorTxSenderFromContext { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NotCoprocessorTxSenderFromContext(uint256,address)"; + const SELECTOR: [u8; 4] = [41u8, 169u8, 147u8, 193u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.txSenderAddress, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + ///Container for all the [`ContextChecks`](self) custom errors. + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Debug, PartialEq, Eq, Hash)] + pub enum ContextChecksErrors { + #[allow(missing_docs)] + NotCoprocessorSignerFromContext(NotCoprocessorSignerFromContext), + #[allow(missing_docs)] + NotCoprocessorTxSenderFromContext(NotCoprocessorTxSenderFromContext), + } + #[automatically_derived] + impl ContextChecksErrors { + /// All the selectors of this enum. + /// + /// Note that the selectors might not be in the same order as the variants. + /// No guarantees are made about the order of the selectors. + /// + /// Prefer using `SolInterface` methods instead. + pub const SELECTORS: &'static [[u8; 4usize]] = &[ + [41u8, 169u8, 147u8, 193u8], + [85u8, 79u8, 140u8, 95u8], + ]; + } + #[automatically_derived] + impl alloy_sol_types::SolInterface for ContextChecksErrors { + const NAME: &'static str = "ContextChecksErrors"; + const MIN_DATA_LENGTH: usize = 64usize; + const COUNT: usize = 2usize; + #[inline] + fn selector(&self) -> [u8; 4] { + match self { + Self::NotCoprocessorSignerFromContext(_) => { + ::SELECTOR + } + Self::NotCoprocessorTxSenderFromContext(_) => { + ::SELECTOR + } + } + } + #[inline] + fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { + Self::SELECTORS.get(i).copied() + } + #[inline] + fn valid_selector(selector: [u8; 4]) -> bool { + Self::SELECTORS.binary_search(&selector).is_ok() + } + #[inline] + #[allow(non_snake_case)] + fn abi_decode_raw( + selector: [u8; 4], + data: &[u8], + ) -> alloy_sol_types::Result { + static DECODE_SHIMS: &[fn( + &[u8], + ) -> alloy_sol_types::Result] = &[ + { + fn NotCoprocessorTxSenderFromContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ContextChecksErrors::NotCoprocessorTxSenderFromContext) + } + NotCoprocessorTxSenderFromContext + }, + { + fn NotCoprocessorSignerFromContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ContextChecksErrors::NotCoprocessorSignerFromContext) + } + NotCoprocessorSignerFromContext + }, + ]; + let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { + return Err( + alloy_sol_types::Error::unknown_selector( + ::NAME, + selector, + ), + ); + }; + DECODE_SHIMS[idx](data) + } + #[inline] + #[allow(non_snake_case)] + fn abi_decode_raw_validate( + selector: [u8; 4], + data: &[u8], + ) -> alloy_sol_types::Result { + static DECODE_VALIDATE_SHIMS: &[fn( + &[u8], + ) -> alloy_sol_types::Result] = &[ + { + fn NotCoprocessorTxSenderFromContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ContextChecksErrors::NotCoprocessorTxSenderFromContext) + } + NotCoprocessorTxSenderFromContext + }, + { + fn NotCoprocessorSignerFromContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ContextChecksErrors::NotCoprocessorSignerFromContext) + } + NotCoprocessorSignerFromContext + }, + ]; + let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { + return Err( + alloy_sol_types::Error::unknown_selector( + ::NAME, + selector, + ), + ); + }; + DECODE_VALIDATE_SHIMS[idx](data) + } + #[inline] + fn abi_encoded_size(&self) -> usize { + match self { + Self::NotCoprocessorSignerFromContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NotCoprocessorTxSenderFromContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + } + } + #[inline] + fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { + match self { + Self::NotCoprocessorSignerFromContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NotCoprocessorTxSenderFromContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + } + } + } + use alloy::contract as alloy_contract; + /**Creates a new wrapper around an on-chain [`ContextChecks`](self) contract instance. + +See the [wrapper's documentation](`ContextChecksInstance`) for more details.*/ + #[inline] + pub const fn new< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >( + address: alloy_sol_types::private::Address, + provider: P, + ) -> ContextChecksInstance { + ContextChecksInstance::::new(address, provider) + } + /**Deploys this contract using the given `provider` and constructor arguments, if any. + +Returns a new instance of the contract, if the deployment was successful. + +For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ + #[inline] + pub fn deploy< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >( + provider: P, + ) -> impl ::core::future::Future< + Output = alloy_contract::Result>, + > { + ContextChecksInstance::::deploy(provider) + } + /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` +and constructor arguments, if any. + +This is a simple wrapper around creating a `RawCallBuilder` with the data set to +the bytecode concatenated with the constructor's ABI-encoded arguments.*/ + #[inline] + pub fn deploy_builder< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >(provider: P) -> alloy_contract::RawCallBuilder { + ContextChecksInstance::::deploy_builder(provider) + } + /**A [`ContextChecks`](self) instance. + +Contains type-safe methods for interacting with an on-chain instance of the +[`ContextChecks`](self) contract located at a given `address`, using a given +provider `P`. + +If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) +documentation on how to provide it), the `deploy` and `deploy_builder` methods can +be used to deploy a new instance of the contract. + +See the [module-level documentation](self) for all the available methods.*/ + #[derive(Clone)] + pub struct ContextChecksInstance { + address: alloy_sol_types::private::Address, + provider: P, + _network: ::core::marker::PhantomData, + } + #[automatically_derived] + impl ::core::fmt::Debug for ContextChecksInstance { + #[inline] + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.debug_tuple("ContextChecksInstance").field(&self.address).finish() + } + } + /// Instantiation and getters/setters. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > ContextChecksInstance { + /**Creates a new wrapper around an on-chain [`ContextChecks`](self) contract instance. + +See the [wrapper's documentation](`ContextChecksInstance`) for more details.*/ + #[inline] + pub const fn new( + address: alloy_sol_types::private::Address, + provider: P, + ) -> Self { + Self { + address, + provider, + _network: ::core::marker::PhantomData, + } + } + /**Deploys this contract using the given `provider` and constructor arguments, if any. + +Returns a new instance of the contract, if the deployment was successful. + +For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ + #[inline] + pub async fn deploy( + provider: P, + ) -> alloy_contract::Result> { + let call_builder = Self::deploy_builder(provider); + let contract_address = call_builder.deploy().await?; + Ok(Self::new(contract_address, call_builder.provider)) + } + /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` +and constructor arguments, if any. + +This is a simple wrapper around creating a `RawCallBuilder` with the data set to +the bytecode concatenated with the constructor's ABI-encoded arguments.*/ + #[inline] + pub fn deploy_builder(provider: P) -> alloy_contract::RawCallBuilder { + alloy_contract::RawCallBuilder::new_raw_deploy( + provider, + ::core::clone::Clone::clone(&BYTECODE), + ) + } + /// Returns a reference to the address. + #[inline] + pub const fn address(&self) -> &alloy_sol_types::private::Address { + &self.address + } + /// Sets the address. + #[inline] + pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { + self.address = address; + } + /// Sets the address and returns `self`. + pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { + self.set_address(address); + self + } + /// Returns a reference to the provider. + #[inline] + pub const fn provider(&self) -> &P { + &self.provider + } + } + impl ContextChecksInstance<&P, N> { + /// Clones the provider and returns a new instance with the cloned provider. + #[inline] + pub fn with_cloned_provider(self) -> ContextChecksInstance { + ContextChecksInstance { + address: self.address, + provider: ::core::clone::Clone::clone(&self.provider), + _network: ::core::marker::PhantomData, + } + } + } + /// Function calls. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > ContextChecksInstance { + /// Creates a new call builder using this contract instance's provider and address. + /// + /// Note that the call can be any function call, not just those defined in this + /// contract. Prefer using the other methods for building type-safe contract calls. + pub fn call_builder( + &self, + call: &C, + ) -> alloy_contract::SolCallBuilder<&P, C, N> { + alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) + } + } + /// Event filters. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > ContextChecksInstance { + /// Creates a new event filter using this contract instance's provider and address. + /// + /// Note that the type can be any event, not just those defined in this contract. + /// Prefer using the other methods for building type-safe event filters. + pub fn event_filter( + &self, + ) -> alloy_contract::Event<&P, E, N> { + alloy_contract::Event::new_sol(&self.provider, &self.address) + } + } +} diff --git a/gateway-contracts/rust_bindings/src/context_lifecycle.rs b/gateway-contracts/rust_bindings/src/context_lifecycle.rs new file mode 100644 index 0000000000..a1c8a76351 --- /dev/null +++ b/gateway-contracts/rust_bindings/src/context_lifecycle.rs @@ -0,0 +1,1900 @@ +/** + +Generated by the following Solidity interface... +```solidity +interface ContextLifecycle { + error ActiveContextOngoing(uint256 activeContextId); + error ContextAlreadyExists(uint256 contextId); + error ContextDoesNotExist(uint256 contextId); + error ContextIsActive(uint256 contextId); + error ContextIsGenerating(uint256 contextId); + error ContextNotActive(uint256 contextId); + error ContextNotGenerated(uint256 contextId); + error ContextNotPreActivatedOrSuspended(uint256 contextId); + error ContextNotSuspended(uint256 contextId); + error InvalidNullContextId(); + error PreActivationContextOngoing(uint256 preActivationContextId); + error SuspendedContextOngoing(uint256 suspendedContextId); +} +``` + +...which was generated by the following JSON ABI: +```json +[ + { + "type": "error", + "name": "ActiveContextOngoing", + "inputs": [ + { + "name": "activeContextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextAlreadyExists", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextDoesNotExist", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextIsActive", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextIsGenerating", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextNotActive", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextNotGenerated", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextNotPreActivatedOrSuspended", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextNotSuspended", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidNullContextId", + "inputs": [] + }, + { + "type": "error", + "name": "PreActivationContextOngoing", + "inputs": [ + { + "name": "preActivationContextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "SuspendedContextOngoing", + "inputs": [ + { + "name": "suspendedContextId", + "type": "uint256", + "internalType": "uint256" + } + ] + } +] +```*/ +#[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style, + clippy::empty_structs_with_brackets +)] +pub mod ContextLifecycle { + use super::*; + use alloy::sol_types as alloy_sol_types; + /// The creation / init bytecode of the contract. + /// + /// ```text + ///0x601f604b600b8282823980515f1a607314603f577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f80fd + /// ``` + #[rustfmt::skip] + #[allow(clippy::all)] + pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( + b"`\x1F`K`\x0B\x82\x82\x829\x80Q_\x1A`s\x14`?W\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R_`\x04R`$_\xFD[0_R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R_\x80\xFD", + ); + /// The runtime bytecode of the contract, as deployed on the network. + /// + /// ```text + ///0x730000000000000000000000000000000000000000301460806040525f80fd + /// ``` + #[rustfmt::skip] + #[allow(clippy::all)] + pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( + b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R_\x80\xFD", + ); + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ActiveContextOngoing(uint256)` and selector `0x7eea432b`. +```solidity +error ActiveContextOngoing(uint256 activeContextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ActiveContextOngoing { + #[allow(missing_docs)] + pub activeContextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ActiveContextOngoing) -> Self { + (value.activeContextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ActiveContextOngoing { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { activeContextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ActiveContextOngoing { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ActiveContextOngoing(uint256)"; + const SELECTOR: [u8; 4] = [126u8, 234u8, 67u8, 43u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.activeContextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextAlreadyExists(uint256)` and selector `0x6653f6d7`. +```solidity +error ContextAlreadyExists(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextAlreadyExists { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ContextAlreadyExists) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ContextAlreadyExists { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextAlreadyExists { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextAlreadyExists(uint256)"; + const SELECTOR: [u8; 4] = [102u8, 83u8, 246u8, 215u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextDoesNotExist(uint256)` and selector `0x61544cfc`. +```solidity +error ContextDoesNotExist(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextDoesNotExist { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ContextDoesNotExist) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ContextDoesNotExist { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextDoesNotExist { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextDoesNotExist(uint256)"; + const SELECTOR: [u8; 4] = [97u8, 84u8, 76u8, 252u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextIsActive(uint256)` and selector `0xcd494e49`. +```solidity +error ContextIsActive(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextIsActive { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ContextIsActive) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ContextIsActive { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextIsActive { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextIsActive(uint256)"; + const SELECTOR: [u8; 4] = [205u8, 73u8, 78u8, 73u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextIsGenerating(uint256)` and selector `0x0ddd14ca`. +```solidity +error ContextIsGenerating(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextIsGenerating { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ContextIsGenerating) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ContextIsGenerating { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextIsGenerating { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextIsGenerating(uint256)"; + const SELECTOR: [u8; 4] = [13u8, 221u8, 20u8, 202u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextNotActive(uint256)` and selector `0x331486b3`. +```solidity +error ContextNotActive(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextNotActive { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ContextNotActive) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ContextNotActive { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextNotActive { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextNotActive(uint256)"; + const SELECTOR: [u8; 4] = [51u8, 20u8, 134u8, 179u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextNotGenerated(uint256)` and selector `0xc0b5ee66`. +```solidity +error ContextNotGenerated(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextNotGenerated { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ContextNotGenerated) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ContextNotGenerated { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextNotGenerated { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextNotGenerated(uint256)"; + const SELECTOR: [u8; 4] = [192u8, 181u8, 238u8, 102u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextNotPreActivatedOrSuspended(uint256)` and selector `0x12b49e3d`. +```solidity +error ContextNotPreActivatedOrSuspended(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextNotPreActivatedOrSuspended { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: ContextNotPreActivatedOrSuspended) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for ContextNotPreActivatedOrSuspended { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextNotPreActivatedOrSuspended { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextNotPreActivatedOrSuspended(uint256)"; + const SELECTOR: [u8; 4] = [18u8, 180u8, 158u8, 61u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextNotSuspended(uint256)` and selector `0x77bf5846`. +```solidity +error ContextNotSuspended(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextNotSuspended { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ContextNotSuspended) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ContextNotSuspended { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextNotSuspended { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextNotSuspended(uint256)"; + const SELECTOR: [u8; 4] = [119u8, 191u8, 88u8, 70u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InvalidNullContextId()` and selector `0xcb17b7a5`. +```solidity +error InvalidNullContextId(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidNullContextId; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: InvalidNullContextId) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for InvalidNullContextId { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InvalidNullContextId { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InvalidNullContextId()"; + const SELECTOR: [u8; 4] = [203u8, 23u8, 183u8, 165u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `PreActivationContextOngoing(uint256)` and selector `0xc470c022`. +```solidity +error PreActivationContextOngoing(uint256 preActivationContextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct PreActivationContextOngoing { + #[allow(missing_docs)] + pub preActivationContextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: PreActivationContextOngoing) -> Self { + (value.preActivationContextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for PreActivationContextOngoing { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + preActivationContextId: tuple.0, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for PreActivationContextOngoing { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "PreActivationContextOngoing(uint256)"; + const SELECTOR: [u8; 4] = [196u8, 112u8, 192u8, 34u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize( + &self.preActivationContextId, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `SuspendedContextOngoing(uint256)` and selector `0x7022ec41`. +```solidity +error SuspendedContextOngoing(uint256 suspendedContextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct SuspendedContextOngoing { + #[allow(missing_docs)] + pub suspendedContextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: SuspendedContextOngoing) -> Self { + (value.suspendedContextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for SuspendedContextOngoing { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + suspendedContextId: tuple.0, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for SuspendedContextOngoing { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "SuspendedContextOngoing(uint256)"; + const SELECTOR: [u8; 4] = [112u8, 34u8, 236u8, 65u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.suspendedContextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + ///Container for all the [`ContextLifecycle`](self) custom errors. + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Debug, PartialEq, Eq, Hash)] + pub enum ContextLifecycleErrors { + #[allow(missing_docs)] + ActiveContextOngoing(ActiveContextOngoing), + #[allow(missing_docs)] + ContextAlreadyExists(ContextAlreadyExists), + #[allow(missing_docs)] + ContextDoesNotExist(ContextDoesNotExist), + #[allow(missing_docs)] + ContextIsActive(ContextIsActive), + #[allow(missing_docs)] + ContextIsGenerating(ContextIsGenerating), + #[allow(missing_docs)] + ContextNotActive(ContextNotActive), + #[allow(missing_docs)] + ContextNotGenerated(ContextNotGenerated), + #[allow(missing_docs)] + ContextNotPreActivatedOrSuspended(ContextNotPreActivatedOrSuspended), + #[allow(missing_docs)] + ContextNotSuspended(ContextNotSuspended), + #[allow(missing_docs)] + InvalidNullContextId(InvalidNullContextId), + #[allow(missing_docs)] + PreActivationContextOngoing(PreActivationContextOngoing), + #[allow(missing_docs)] + SuspendedContextOngoing(SuspendedContextOngoing), + } + #[automatically_derived] + impl ContextLifecycleErrors { + /// All the selectors of this enum. + /// + /// Note that the selectors might not be in the same order as the variants. + /// No guarantees are made about the order of the selectors. + /// + /// Prefer using `SolInterface` methods instead. + pub const SELECTORS: &'static [[u8; 4usize]] = &[ + [13u8, 221u8, 20u8, 202u8], + [18u8, 180u8, 158u8, 61u8], + [51u8, 20u8, 134u8, 179u8], + [97u8, 84u8, 76u8, 252u8], + [102u8, 83u8, 246u8, 215u8], + [112u8, 34u8, 236u8, 65u8], + [119u8, 191u8, 88u8, 70u8], + [126u8, 234u8, 67u8, 43u8], + [192u8, 181u8, 238u8, 102u8], + [196u8, 112u8, 192u8, 34u8], + [203u8, 23u8, 183u8, 165u8], + [205u8, 73u8, 78u8, 73u8], + ]; + } + #[automatically_derived] + impl alloy_sol_types::SolInterface for ContextLifecycleErrors { + const NAME: &'static str = "ContextLifecycleErrors"; + const MIN_DATA_LENGTH: usize = 0usize; + const COUNT: usize = 12usize; + #[inline] + fn selector(&self) -> [u8; 4] { + match self { + Self::ActiveContextOngoing(_) => { + ::SELECTOR + } + Self::ContextAlreadyExists(_) => { + ::SELECTOR + } + Self::ContextDoesNotExist(_) => { + ::SELECTOR + } + Self::ContextIsActive(_) => { + ::SELECTOR + } + Self::ContextIsGenerating(_) => { + ::SELECTOR + } + Self::ContextNotActive(_) => { + ::SELECTOR + } + Self::ContextNotGenerated(_) => { + ::SELECTOR + } + Self::ContextNotPreActivatedOrSuspended(_) => { + ::SELECTOR + } + Self::ContextNotSuspended(_) => { + ::SELECTOR + } + Self::InvalidNullContextId(_) => { + ::SELECTOR + } + Self::PreActivationContextOngoing(_) => { + ::SELECTOR + } + Self::SuspendedContextOngoing(_) => { + ::SELECTOR + } + } + } + #[inline] + fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { + Self::SELECTORS.get(i).copied() + } + #[inline] + fn valid_selector(selector: [u8; 4]) -> bool { + Self::SELECTORS.binary_search(&selector).is_ok() + } + #[inline] + #[allow(non_snake_case)] + fn abi_decode_raw( + selector: [u8; 4], + data: &[u8], + ) -> alloy_sol_types::Result { + static DECODE_SHIMS: &[fn( + &[u8], + ) -> alloy_sol_types::Result] = &[ + { + fn ContextIsGenerating( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ContextLifecycleErrors::ContextIsGenerating) + } + ContextIsGenerating + }, + { + fn ContextNotPreActivatedOrSuspended( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ContextLifecycleErrors::ContextNotPreActivatedOrSuspended, + ) + } + ContextNotPreActivatedOrSuspended + }, + { + fn ContextNotActive( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ContextLifecycleErrors::ContextNotActive) + } + ContextNotActive + }, + { + fn ContextDoesNotExist( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ContextLifecycleErrors::ContextDoesNotExist) + } + ContextDoesNotExist + }, + { + fn ContextAlreadyExists( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ContextLifecycleErrors::ContextAlreadyExists) + } + ContextAlreadyExists + }, + { + fn SuspendedContextOngoing( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ContextLifecycleErrors::SuspendedContextOngoing) + } + SuspendedContextOngoing + }, + { + fn ContextNotSuspended( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ContextLifecycleErrors::ContextNotSuspended) + } + ContextNotSuspended + }, + { + fn ActiveContextOngoing( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ContextLifecycleErrors::ActiveContextOngoing) + } + ActiveContextOngoing + }, + { + fn ContextNotGenerated( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ContextLifecycleErrors::ContextNotGenerated) + } + ContextNotGenerated + }, + { + fn PreActivationContextOngoing( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ContextLifecycleErrors::PreActivationContextOngoing) + } + PreActivationContextOngoing + }, + { + fn InvalidNullContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ContextLifecycleErrors::InvalidNullContextId) + } + InvalidNullContextId + }, + { + fn ContextIsActive( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ContextLifecycleErrors::ContextIsActive) + } + ContextIsActive + }, + ]; + let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { + return Err( + alloy_sol_types::Error::unknown_selector( + ::NAME, + selector, + ), + ); + }; + DECODE_SHIMS[idx](data) + } + #[inline] + #[allow(non_snake_case)] + fn abi_decode_raw_validate( + selector: [u8; 4], + data: &[u8], + ) -> alloy_sol_types::Result { + static DECODE_VALIDATE_SHIMS: &[fn( + &[u8], + ) -> alloy_sol_types::Result] = &[ + { + fn ContextIsGenerating( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ContextLifecycleErrors::ContextIsGenerating) + } + ContextIsGenerating + }, + { + fn ContextNotPreActivatedOrSuspended( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ContextLifecycleErrors::ContextNotPreActivatedOrSuspended, + ) + } + ContextNotPreActivatedOrSuspended + }, + { + fn ContextNotActive( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ContextLifecycleErrors::ContextNotActive) + } + ContextNotActive + }, + { + fn ContextDoesNotExist( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ContextLifecycleErrors::ContextDoesNotExist) + } + ContextDoesNotExist + }, + { + fn ContextAlreadyExists( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ContextLifecycleErrors::ContextAlreadyExists) + } + ContextAlreadyExists + }, + { + fn SuspendedContextOngoing( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ContextLifecycleErrors::SuspendedContextOngoing) + } + SuspendedContextOngoing + }, + { + fn ContextNotSuspended( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ContextLifecycleErrors::ContextNotSuspended) + } + ContextNotSuspended + }, + { + fn ActiveContextOngoing( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ContextLifecycleErrors::ActiveContextOngoing) + } + ActiveContextOngoing + }, + { + fn ContextNotGenerated( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ContextLifecycleErrors::ContextNotGenerated) + } + ContextNotGenerated + }, + { + fn PreActivationContextOngoing( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ContextLifecycleErrors::PreActivationContextOngoing) + } + PreActivationContextOngoing + }, + { + fn InvalidNullContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ContextLifecycleErrors::InvalidNullContextId) + } + InvalidNullContextId + }, + { + fn ContextIsActive( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ContextLifecycleErrors::ContextIsActive) + } + ContextIsActive + }, + ]; + let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { + return Err( + alloy_sol_types::Error::unknown_selector( + ::NAME, + selector, + ), + ); + }; + DECODE_VALIDATE_SHIMS[idx](data) + } + #[inline] + fn abi_encoded_size(&self) -> usize { + match self { + Self::ActiveContextOngoing(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextAlreadyExists(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextDoesNotExist(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextIsActive(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextIsGenerating(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextNotActive(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextNotGenerated(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextNotPreActivatedOrSuspended(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextNotSuspended(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::InvalidNullContextId(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::PreActivationContextOngoing(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::SuspendedContextOngoing(inner) => { + ::abi_encoded_size( + inner, + ) + } + } + } + #[inline] + fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { + match self { + Self::ActiveContextOngoing(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextAlreadyExists(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextDoesNotExist(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextIsActive(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextIsGenerating(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextNotActive(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextNotGenerated(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextNotPreActivatedOrSuspended(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextNotSuspended(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::InvalidNullContextId(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::PreActivationContextOngoing(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::SuspendedContextOngoing(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + } + } + } + use alloy::contract as alloy_contract; + /**Creates a new wrapper around an on-chain [`ContextLifecycle`](self) contract instance. + +See the [wrapper's documentation](`ContextLifecycleInstance`) for more details.*/ + #[inline] + pub const fn new< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >( + address: alloy_sol_types::private::Address, + provider: P, + ) -> ContextLifecycleInstance { + ContextLifecycleInstance::::new(address, provider) + } + /**Deploys this contract using the given `provider` and constructor arguments, if any. + +Returns a new instance of the contract, if the deployment was successful. + +For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ + #[inline] + pub fn deploy< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >( + provider: P, + ) -> impl ::core::future::Future< + Output = alloy_contract::Result>, + > { + ContextLifecycleInstance::::deploy(provider) + } + /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` +and constructor arguments, if any. + +This is a simple wrapper around creating a `RawCallBuilder` with the data set to +the bytecode concatenated with the constructor's ABI-encoded arguments.*/ + #[inline] + pub fn deploy_builder< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >(provider: P) -> alloy_contract::RawCallBuilder { + ContextLifecycleInstance::::deploy_builder(provider) + } + /**A [`ContextLifecycle`](self) instance. + +Contains type-safe methods for interacting with an on-chain instance of the +[`ContextLifecycle`](self) contract located at a given `address`, using a given +provider `P`. + +If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) +documentation on how to provide it), the `deploy` and `deploy_builder` methods can +be used to deploy a new instance of the contract. + +See the [module-level documentation](self) for all the available methods.*/ + #[derive(Clone)] + pub struct ContextLifecycleInstance { + address: alloy_sol_types::private::Address, + provider: P, + _network: ::core::marker::PhantomData, + } + #[automatically_derived] + impl ::core::fmt::Debug for ContextLifecycleInstance { + #[inline] + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.debug_tuple("ContextLifecycleInstance").field(&self.address).finish() + } + } + /// Instantiation and getters/setters. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > ContextLifecycleInstance { + /**Creates a new wrapper around an on-chain [`ContextLifecycle`](self) contract instance. + +See the [wrapper's documentation](`ContextLifecycleInstance`) for more details.*/ + #[inline] + pub const fn new( + address: alloy_sol_types::private::Address, + provider: P, + ) -> Self { + Self { + address, + provider, + _network: ::core::marker::PhantomData, + } + } + /**Deploys this contract using the given `provider` and constructor arguments, if any. + +Returns a new instance of the contract, if the deployment was successful. + +For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ + #[inline] + pub async fn deploy( + provider: P, + ) -> alloy_contract::Result> { + let call_builder = Self::deploy_builder(provider); + let contract_address = call_builder.deploy().await?; + Ok(Self::new(contract_address, call_builder.provider)) + } + /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` +and constructor arguments, if any. + +This is a simple wrapper around creating a `RawCallBuilder` with the data set to +the bytecode concatenated with the constructor's ABI-encoded arguments.*/ + #[inline] + pub fn deploy_builder(provider: P) -> alloy_contract::RawCallBuilder { + alloy_contract::RawCallBuilder::new_raw_deploy( + provider, + ::core::clone::Clone::clone(&BYTECODE), + ) + } + /// Returns a reference to the address. + #[inline] + pub const fn address(&self) -> &alloy_sol_types::private::Address { + &self.address + } + /// Sets the address. + #[inline] + pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { + self.address = address; + } + /// Sets the address and returns `self`. + pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { + self.set_address(address); + self + } + /// Returns a reference to the provider. + #[inline] + pub const fn provider(&self) -> &P { + &self.provider + } + } + impl ContextLifecycleInstance<&P, N> { + /// Clones the provider and returns a new instance with the cloned provider. + #[inline] + pub fn with_cloned_provider(self) -> ContextLifecycleInstance { + ContextLifecycleInstance { + address: self.address, + provider: ::core::clone::Clone::clone(&self.provider), + _network: ::core::marker::PhantomData, + } + } + } + /// Function calls. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > ContextLifecycleInstance { + /// Creates a new call builder using this contract instance's provider and address. + /// + /// Note that the call can be any function call, not just those defined in this + /// contract. Prefer using the other methods for building type-safe contract calls. + pub fn call_builder( + &self, + call: &C, + ) -> alloy_contract::SolCallBuilder<&P, C, N> { + alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) + } + } + /// Event filters. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > ContextLifecycleInstance { + /// Creates a new event filter using this contract instance's provider and address. + /// + /// Note that the type can be any event, not just those defined in this contract. + /// Prefer using the other methods for building type-safe event filters. + pub fn event_filter( + &self, + ) -> alloy_contract::Event<&P, E, N> { + alloy_contract::Event::new_sol(&self.provider, &self.address) + } + } +} diff --git a/gateway-contracts/rust_bindings/src/coprocessor_contexts.rs b/gateway-contracts/rust_bindings/src/coprocessor_contexts.rs new file mode 100644 index 0000000000..63f0d7fbcb --- /dev/null +++ b/gateway-contracts/rust_bindings/src/coprocessor_contexts.rs @@ -0,0 +1,13684 @@ +/** + +Generated by the following Solidity interface... +```solidity +interface CoprocessorContexts { + type ContextStatus is uint8; + struct CoprocessorContext { + uint256 contextId; + uint256 previousContextId; + bytes blob; + CoprocessorV2[] coprocessors; + } + struct CoprocessorContextTimePeriods { + uint256 preActivationTimePeriod; + uint256 suspendedTimePeriod; + } + struct CoprocessorV2 { + string name; + address txSenderAddress; + address signerAddress; + string storageUrl; + } + + error ActiveContextOngoing(uint256 activeContextId); + error AddressEmptyCode(address target); + error ContextAlreadyExists(uint256 contextId); + error ContextDoesNotExist(uint256 contextId); + error ContextIsActive(uint256 contextId); + error ContextIsGenerating(uint256 contextId); + error ContextNotActive(uint256 contextId); + error ContextNotGenerated(uint256 contextId); + error ContextNotPreActivatedOrSuspended(uint256 contextId); + error ContextNotSuspended(uint256 contextId); + error CoprocessorContextNotInitialized(uint256 contextId); + error CoprocessorSignerAddressesNotUnique(address signerAddress, uint256 coprocessorIndex, CoprocessorV2[] coprocessors); + error CoprocessorTxSenderAddressesNotUnique(address txSenderAddress, uint256 coprocessorIndex, CoprocessorV2[] coprocessors); + error ERC1967InvalidImplementation(address implementation); + error ERC1967NonPayable(); + error EmptyCoprocessors(); + error FailedCall(); + error HostChainNotRegistered(uint256 chainId); + error InvalidContextStatusForceUpdate(uint256 contextId, ContextStatus status); + error InvalidInitialization(); + error InvalidNullContextId(); + error NoActiveCoprocessorContext(); + error NoPreActivationCoprocessorContext(); + error NoSuspendedCoprocessorContext(); + error NotCoprocessorFromContext(uint256 contextId, address coprocessorTxSenderAddress); + error NotCustodianSigner(address signerAddress); + error NotCustodianTxSender(address txSenderAddress); + error NotGatewayOwner(address sender); + error NotInitializing(); + error NotInitializingFromEmptyProxy(); + error NotKmsSigner(address signerAddress); + error NotKmsTxSender(address txSenderAddress); + error NullCoprocessorSignerAddress(uint256 coprocessorIndex, CoprocessorV2[] coprocessors); + error NullCoprocessorTxSenderAddress(uint256 coprocessorIndex, CoprocessorV2[] coprocessors); + error PreActivationContextOngoing(uint256 preActivationContextId); + error SuspendedContextOngoing(uint256 suspendedContextId); + error UUPSUnauthorizedCallContext(); + error UUPSUnsupportedProxiableUUID(bytes32 slot); + + event ActivateCoprocessorContext(uint256 contextId); + event CompromiseCoprocessorContext(uint256 contextId); + event DeactivateCoprocessorContext(uint256 contextId); + event DestroyCoprocessorContext(uint256 contextId); + event InitializeCoprocessorContexts(bytes blob, CoprocessorV2[] coprocessors); + event Initialized(uint64 version); + event NewCoprocessorContext(CoprocessorContext activeCoprocessorContext, CoprocessorContext newCoprocessorContext, CoprocessorContextTimePeriods timePeriods); + event PreActivateCoprocessorContext(CoprocessorContext newCoprocessorContext, uint256 activationBlockTimestamp); + event SuspendCoprocessorContext(uint256 contextId, uint256 deactivatedBlockTimestamp); + event Upgraded(address indexed implementation); + + constructor(); + + function UPGRADE_INTERFACE_VERSION() external view returns (string memory); + function addCoprocessorContext(bytes memory blob, CoprocessorV2[] memory coprocessors, CoprocessorContextTimePeriods memory timePeriods) external; + function forceUpdateCoprocessorContextToStatus(uint256 contextId, ContextStatus status) external; + function getActiveCoprocessorContext() external view returns (CoprocessorContext memory); + function getActiveCoprocessorContextId() external view returns (uint256); + function getCoprocessor(uint256 contextId, address coprocessorTxSenderAddress) external view returns (CoprocessorV2 memory); + function getCoprocessorActivationBlockTimestamp(uint256 contextId) external view returns (uint256); + function getCoprocessorContextStatus(uint256 contextId) external view returns (ContextStatus); + function getCoprocessorDeactivatedBlockTimestamp(uint256 contextId) external view returns (uint256); + function getCoprocessorMajorityThreshold(uint256 contextId) external view returns (uint256); + function getCoprocessorSigners(uint256 contextId) external view returns (address[] memory); + function getCoprocessorTxSenders(uint256 contextId) external view returns (address[] memory); + function getPreActivationCoprocessorContextId() external view returns (uint256); + function getSuspendedCoprocessorContextId() external view returns (uint256); + function getVersion() external pure returns (string memory); + function initializeFromEmptyProxy(bytes memory initialBlob, CoprocessorV2[] memory initialCoprocessors) external; + function isCoprocessorContextOperating(uint256 contextId) external view returns (bool); + function isCoprocessorSigner(uint256 contextId, address signerAddress) external view returns (bool); + function isCoprocessorTxSender(uint256 contextId, address txSenderAddress) external view returns (bool); + function proxiableUUID() external view returns (bytes32); + function refreshCoprocessorContextStatuses() external; + function swapSuspendedCoprocessorContextWithActive(uint256 suspendedTimePeriod) external; + function upgradeToAndCall(address newImplementation, bytes memory data) external payable; +} +``` + +...which was generated by the following JSON ABI: +```json +[ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "addCoprocessorContext", + "inputs": [ + { + "name": "blob", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + }, + { + "name": "timePeriods", + "type": "tuple", + "internalType": "struct CoprocessorContextTimePeriods", + "components": [ + { + "name": "preActivationTimePeriod", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "suspendedTimePeriod", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "forceUpdateCoprocessorContextToStatus", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getActiveCoprocessorContext", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct CoprocessorContext", + "components": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "previousContextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blob", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getActiveCoprocessorContextId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getCoprocessor", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "coprocessorTxSenderAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct CoprocessorV2", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getCoprocessorActivationBlockTimestamp", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getCoprocessorContextStatus", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getCoprocessorDeactivatedBlockTimestamp", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getCoprocessorMajorityThreshold", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getCoprocessorSigners", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getCoprocessorTxSenders", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPreActivationCoprocessorContextId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSuspendedCoprocessorContextId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getVersion", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "initializeFromEmptyProxy", + "inputs": [ + { + "name": "initialBlob", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "initialCoprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isCoprocessorContextOperating", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isCoprocessorSigner", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isCoprocessorTxSender", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "proxiableUUID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "refreshCoprocessorContextStatuses", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "swapSuspendedCoprocessorContextWithActive", + "inputs": [ + { + "name": "suspendedTimePeriod", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "upgradeToAndCall", + "inputs": [ + { + "name": "newImplementation", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "ActivateCoprocessorContext", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "CompromiseCoprocessorContext", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DeactivateCoprocessorContext", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DestroyCoprocessorContext", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InitializeCoprocessorContexts", + "inputs": [ + { + "name": "blob", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "indexed": false, + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NewCoprocessorContext", + "inputs": [ + { + "name": "activeCoprocessorContext", + "type": "tuple", + "indexed": false, + "internalType": "struct CoprocessorContext", + "components": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "previousContextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blob", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + }, + { + "name": "newCoprocessorContext", + "type": "tuple", + "indexed": false, + "internalType": "struct CoprocessorContext", + "components": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "previousContextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blob", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + }, + { + "name": "timePeriods", + "type": "tuple", + "indexed": false, + "internalType": "struct CoprocessorContextTimePeriods", + "components": [ + { + "name": "preActivationTimePeriod", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "suspendedTimePeriod", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PreActivateCoprocessorContext", + "inputs": [ + { + "name": "newCoprocessorContext", + "type": "tuple", + "indexed": false, + "internalType": "struct CoprocessorContext", + "components": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "previousContextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blob", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + }, + { + "name": "activationBlockTimestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SuspendCoprocessorContext", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "deactivatedBlockTimestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Upgraded", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "ActiveContextOngoing", + "inputs": [ + { + "name": "activeContextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ContextAlreadyExists", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextDoesNotExist", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextIsActive", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextIsGenerating", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextNotActive", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextNotGenerated", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextNotPreActivatedOrSuspended", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ContextNotSuspended", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "CoprocessorContextNotInitialized", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "CoprocessorSignerAddressesNotUnique", + "inputs": [ + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "coprocessorIndex", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + }, + { + "type": "error", + "name": "CoprocessorTxSenderAddressesNotUnique", + "inputs": [ + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "coprocessorIndex", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + }, + { + "type": "error", + "name": "ERC1967InvalidImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967NonPayable", + "inputs": [] + }, + { + "type": "error", + "name": "EmptyCoprocessors", + "inputs": [] + }, + { + "type": "error", + "name": "FailedCall", + "inputs": [] + }, + { + "type": "error", + "name": "HostChainNotRegistered", + "inputs": [ + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidContextStatusForceUpdate", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ] + }, + { + "type": "error", + "name": "InvalidInitialization", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidNullContextId", + "inputs": [] + }, + { + "type": "error", + "name": "NoActiveCoprocessorContext", + "inputs": [] + }, + { + "type": "error", + "name": "NoPreActivationCoprocessorContext", + "inputs": [] + }, + { + "type": "error", + "name": "NoSuspendedCoprocessorContext", + "inputs": [] + }, + { + "type": "error", + "name": "NotCoprocessorFromContext", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "coprocessorTxSenderAddress", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "NotCustodianSigner", + "inputs": [ + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "NotCustodianTxSender", + "inputs": [ + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "NotGatewayOwner", + "inputs": [ + { + "name": "sender", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "NotInitializing", + "inputs": [] + }, + { + "type": "error", + "name": "NotInitializingFromEmptyProxy", + "inputs": [] + }, + { + "type": "error", + "name": "NotKmsSigner", + "inputs": [ + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "NotKmsTxSender", + "inputs": [ + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "NullCoprocessorSignerAddress", + "inputs": [ + { + "name": "coprocessorIndex", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + }, + { + "type": "error", + "name": "NullCoprocessorTxSenderAddress", + "inputs": [ + { + "name": "coprocessorIndex", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + }, + { + "type": "error", + "name": "PreActivationContextOngoing", + "inputs": [ + { + "name": "preActivationContextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "SuspendedContextOngoing", + "inputs": [ + { + "name": "suspendedContextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "UUPSUnauthorizedCallContext", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnsupportedProxiableUUID", + "inputs": [ + { + "name": "slot", + "type": "bytes32", + "internalType": "bytes32" + } + ] + } +] +```*/ +#[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style, + clippy::empty_structs_with_brackets +)] +pub mod CoprocessorContexts { + use super::*; + use alloy::sol_types as alloy_sol_types; + /// The creation / init bytecode of the contract. + /// + /// ```text + ///0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000043575f80fd5b50620000546200005a60201b60201c565b620001c4565b5f6200006b6200015e60201b60201c565b9050805f0160089054906101000a900460ff1615620000b6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146200015b5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051620001529190620001a9565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b620001a38162000185565b82525050565b5f602082019050620001be5f83018462000198565b92915050565b608051615587620001eb5f395f8181611fda0152818161202f01526122d101526155875ff3fe60806040526004361061013f575f3560e01c8063991dc36d116100b5578063cac6a5a81161006e578063cac6a5a814610465578063cd8e993c1461048d578063cdbb5a82146104c9578063ecfb0b9414610505578063f88174ea1461052d578063fed9716b146105695761013f565b8063991dc36d14610347578063a1364d7914610371578063a9b4d07114610399578063ad3cb1cc146103d5578063b3f5403a146103ff578063be91187b1461043b5761013f565b80634f1ef286116101075780634f1ef2861461022557806352d1902d14610241578063820a91f81461026b5780638625e876146102a757806386dfc7de146102e3578063888b99e01461030b5761013f565b8063049f25ef14610143578063086e4e1c1461017f5780630d8e6e2c146101a95780633a5162e6146101d357806341618fe9146101e9575b5f80fd5b34801561014e575f80fd5b5061016960048036038101906101649190613dc4565b610593565b6040516101769190613ed6565b60405180910390f35b34801561018a575f80fd5b5061019361063d565b6040516101a09190613f05565b60405180910390f35b3480156101b4575f80fd5b506101bd610689565b6040516101ca9190613fa8565b60405180910390f35b3480156101de575f80fd5b506101e7610704565b005b3480156101f4575f80fd5b5061020f600480360381019061020a9190613dc4565b610882565b60405161021c9190613ed6565b60405180910390f35b61023f600480360381019061023a919061411e565b61092c565b005b34801561024c575f80fd5b5061025561094b565b6040516102629190614190565b60405180910390f35b348015610276575f80fd5b50610291600480360381019061028c91906141a9565b61097c565b60405161029e9190614296565b60405180910390f35b3480156102b2575f80fd5b506102cd60048036038101906102c891906141a9565b610c9c565b6040516102da91906142d0565b60405180910390f35b3480156102ee575f80fd5b5061030960048036038101906103049190613dc4565b610d73565b005b348015610316575f80fd5b50610331600480360381019061032c9190613dc4565b610f2f565b60405161033e919061435c565b60405180910390f35b348015610352575f80fd5b5061035b610f4f565b6040516103689190613f05565b60405180910390f35b34801561037c575f80fd5b5061039760048036038101906103929190614449565b610f9b565b005b3480156103a4575f80fd5b506103bf60048036038101906103ba9190613dc4565b61119d565b6040516103cc9190613f05565b60405180910390f35b3480156103e0575f80fd5b506103e961122c565b6040516103f69190613fa8565b60405180910390f35b34801561040a575f80fd5b5061042560048036038101906104209190613dc4565b611265565b6040516104329190613f05565b60405180910390f35b348015610446575f80fd5b5061044f6112f4565b60405161045c9190613f05565b60405180910390f35b348015610470575f80fd5b5061048b600480360381019061048691906144fd565b611340565b005b348015610498575f80fd5b506104b360048036038101906104ae9190613dc4565b6116fe565b6040516104c091906142d0565b60405180910390f35b3480156104d4575f80fd5b506104ef60048036038101906104ea91906141a9565b611788565b6040516104fc91906142d0565b60405180910390f35b348015610510575f80fd5b5061052b6004803603810190610526919061453b565b61185f565b005b348015610538575f80fd5b50610553600480360381019061054e9190613dc4565b611a3c565b6040516105609190613f05565b60405180910390f35b348015610574575f80fd5b5061057d611add565b60405161058a91906147a3565b60405180910390f35b60605f61059e611de8565b905080600a015f8481526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561063057602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116105e7575b5050505050915050919050565b5f80610647611e0f565b90505f8103610682576040517f21fb08f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8091505090565b60606040518060400160405280601381526020017f436f70726f636573736f72436f6e7465787473000000000000000000000000008152506106ca5f611e28565b6106d46001611e28565b6106dd5f611e28565b6040516020016106f09493929190614891565b604051602081830303815290604052905090565b5f61070d611de8565b90505f815f016002015490505f811415801561073c575081600d015f8281526020019081526020015f20544210155b15610806575f61074a610f4f565b90505f83600f015f8381526020019081526020015f20544261076c919061491c565b90508084600e015f8481526020019081526020015f2081905550610793845f018484611ef2565b7f3080f2b80dda4748ca2926a641fa5007735058dc5f5ab2594eeca74197a3accc82826040516107c492919061494f565b60405180910390a17f6c8c04c9fea337720b7dfadca365e850035114fd081b58d030afbe8b5dc3be71836040516107fb9190613f05565b60405180910390a150505b5f61080f611e0f565b90505f8114158015610834575082600e015f8281526020019081526020015f20544210155b1561087d57610845835f0182611f0b565b7f1baa08d8de18e8e2287691b1309748010981ebdfd12a173d8574657548a52898816040516108749190613f05565b60405180910390a15b505050565b60605f61088d611de8565b905080600c015f8481526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561091f57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116108d6575b5050505050915050919050565b610934611fd8565b61093d826120be565b61094782826121b1565b5050565b5f6109546122cf565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b610984613d08565b825f61098e611de8565b90505f816006015f8481526020019081526020015f205f0154036109e957816040517fabf9e7b00000000000000000000000000000000000000000000000000000000081526004016109e09190613f05565b60405180910390fd5b5f6109f2611de8565b90505f816008015f8881526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060800160405290815f82018054610a5d906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a89906149a3565b8015610ad45780601f10610aab57610100808354040283529160200191610ad4565b820191905f5260205f20905b815481529060010190602001808311610ab757829003601f168201915b50505050508152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382018054610b97906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc3906149a3565b8015610c0e5780601f10610be557610100808354040283529160200191610c0e565b820191905f5260205f20905b815481529060010190602001808311610bf157829003601f168201915b50505050508152505090505f73ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff1603610c8f5786866040517fc312e73e000000000000000000000000000000000000000000000000000000008152600401610c869291906149e2565b60405180910390fd5b8094505050505092915050565b5f825f610ca7611de8565b90505f816006015f8481526020019081526020015f205f015403610d0257816040517fabf9e7b0000000000000000000000000000000000000000000000000000000008152600401610cf99190613f05565b60405180910390fd5b5f610d0b611de8565b9050806009015f8781526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16935050505092915050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df49190614a1d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e6357336040517f0e56cf3d000000000000000000000000000000000000000000000000000000008152600401610e5a9190614a48565b60405180910390fd5b5f610e6c61063d565b90505f610e77612356565b90505f610e82611de8565b9050610e91815f018484611ef2565b5f8442610e9e919061491c565b90508082600e015f8581526020019081526020015f20819055507f3080f2b80dda4748ca2926a641fa5007735058dc5f5ab2594eeca74197a3accc8382604051610ee992919061494f565b60405180910390a17f6c8c04c9fea337720b7dfadca365e850035114fd081b58d030afbe8b5dc3be7184604051610f209190613f05565b60405180910390a15050505050565b5f80610f39611de8565b9050610f47815f018461236f565b915050919050565b5f80610f59612356565b90505f8103610f94576040517f046593ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8091505090565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ff8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101c9190614a1d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461108b57336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016110829190614a48565b60405180910390fd5b5f611094611de8565b90505f61109f611add565b90505f6110b2825f015189898989612397565b90507fbbb104c495886e5daa3efb6b281ec2840c69385af5cbfc1582fcf700de1ecd4b8282866040516110e793929190614ab4565b60405180910390a16110fe835f01825f0151612e8f565b61110d835f01825f0151612ff4565b5f845f01354261111d919061491c565b90508084600d015f845f015181526020019081526020015f2081905550846020013584600f015f855f015181526020019081526020015f20819055507f0425f54e602cbcf87fafd6a0b557fa5c4bc4bc6c251686255eb3bd775f452377828260405161118a929190614af7565b60405180910390a1505050505050505050565b5f815f6111a8611de8565b90505f816006015f8481526020019081526020015f205f01540361120357816040517fabf9e7b00000000000000000000000000000000000000000000000000000000081526004016111fa9190613f05565b60405180910390fd5b5f61120c611de8565b905080600e015f8681526020019081526020015f20549350505050919050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b5f815f611270611de8565b90505f816006015f8481526020019081526020015f205f0154036112cb57816040517fabf9e7b00000000000000000000000000000000000000000000000000000000081526004016112c29190613f05565b60405180910390fd5b5f6112d4611de8565b905080600d015f8681526020019081526020015f20549350505050919050565b5f806112fe6130ca565b90505f8103611339576040517fb9e861b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8091505090565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561139d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113c19190614a1d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461143057336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016114279190614a48565b60405180910390fd5b815f61143a611de8565b90505f816006015f8481526020019081526020015f205f01540361149557816040517fabf9e7b000000000000000000000000000000000000000000000000000000000815260040161148c9190613f05565b60405180910390fd5b5f61149e611de8565b9050600360078111156114b4576114b36142e9565b5b8460078111156114c7576114c66142e9565b5b0361155a575f6114d5610f4f565b90506114e4825f018783611ef2565b7f3080f2b80dda4748ca2926a641fa5007735058dc5f5ab2594eeca74197a3accc814260405161151592919061494f565b60405180910390a17f6c8c04c9fea337720b7dfadca365e850035114fd081b58d030afbe8b5dc3be718660405161154c9190613f05565b60405180910390a1506116f7565b6005600781111561156e5761156d6142e9565b5b846007811115611581576115806142e9565b5b036115ce57611592815f0186611f0b565b7f1baa08d8de18e8e2287691b1309748010981ebdfd12a173d8574657548a52898856040516115c19190613f05565b60405180910390a16116f6565b600660078111156115e2576115e16142e9565b5b8460078111156115f5576115f46142e9565b5b0361164257611606815f01866130e3565b7fee7ef83963417125d27430789fc6e94194381e82c3cda68260d0e7cfc31eaf21856040516116359190613f05565b60405180910390a16116f5565b600780811115611655576116546142e9565b5b846007811115611668576116676142e9565b5b036116b557611679815f018661326e565b7ff20b299804c9c1d6da3b82414c7aa0a845cdbabae2d90e46e360a379a77b7be5856040516116a89190613f05565b60405180910390a16116f4565b84846040517ff0bed68f0000000000000000000000000000000000000000000000000000000081526004016116eb929190614b25565b60405180910390fd5b5b5b5b5050505050565b5f815f611709611de8565b90505f816006015f8481526020019081526020015f205f01540361176457816040517fabf9e7b000000000000000000000000000000000000000000000000000000000815260040161175b9190613f05565b60405180910390fd5b61176c610f4f565b84148061177f575061177c611e0f565b84145b92505050919050565b5f825f611793611de8565b90505f816006015f8481526020019081526020015f205f0154036117ee57816040517fabf9e7b00000000000000000000000000000000000000000000000000000000081526004016117e59190613f05565b60405180910390fd5b5f6117f7611de8565b905080600b015f8781526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16935050505092915050565b60016118696133c2565b67ffffffffffffffff16146118aa576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f6118b56133e6565b9050805f0160089054906101000a900460ff16806118fd57508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15611934576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f6119875f88888888612397565b90505f611992611de8565b90506119a3815f01835f015161340d565b7fd474068ecf914caa04868493bcefa56bfb049a54f1612c2726d112e1e60663b9888888886040516119d89493929190614d94565b60405180910390a150505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d282604051611a2c9190614def565b60405180910390a1505050505050565b5f815f611a47611de8565b90505f816006015f8481526020019081526020015f205f015403611aa257816040517fabf9e7b0000000000000000000000000000000000000000000000000000000008152600401611a999190613f05565b60405180910390fd5b5f611aab611de8565b905060018082600a015f8881526020019081526020015f2080549050901c611ad3919061491c565b9350505050919050565b611ae5613d5a565b5f611aee610f4f565b90505f611af9611de8565b9050806006015f8381526020019081526020015f206040518060800160405290815f820154815260200160018201548152602001600282018054611b3c906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054611b68906149a3565b8015611bb35780601f10611b8a57610100808354040283529160200191611bb3565b820191905f5260205f20905b815481529060010190602001808311611b9657829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020015f905b82821015611dd9578382905f5260205f2090600402016040518060800160405290815f82018054611c10906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054611c3c906149a3565b8015611c875780601f10611c5e57610100808354040283529160200191611c87565b820191905f5260205f20905b815481529060010190602001808311611c6a57829003601f168201915b50505050508152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382018054611d4a906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d76906149a3565b8015611dc15780601f10611d9857610100808354040283529160200191611dc1565b820191905f5260205f20905b815481529060010190602001808311611da457829003601f168201915b50505050508152505081526020019060010190611be0565b50505050815250509250505090565b5f7f1da8a9a065a2f0a895c457065eddd3cf4a4d0d5340aaa0ca54d3cd5b4a6aaf00905090565b5f80611e19611de8565b9050805f016004015491505090565b60605f6001611e36846134db565b0190505f8167ffffffffffffffff811115611e5457611e53613ffa565b5b6040519080825280601f01601f191660200182016040528015611e865781602001600182028036833780820191505090505b5090505f82602001820190505b600115611ee7578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611edc57611edb614e08565b5b0494505f8503611e93575b819350505050919050565b611efc838261362c565b611f068383613702565b505050565b805f8103611f45576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f4f838361385a565b611f9057816040517f77bf5846000000000000000000000000000000000000000000000000000000008152600401611f879190613f05565b60405180910390fd5b6005835f015f8481526020019081526020015f205f6101000a81548160ff02191690836007811115611fc557611fc46142e9565b5b02179055505f8360040181905550505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148061208557507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661206c6138a9565b73ffffffffffffffffffffffffffffffffffffffff1614155b156120bc576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561211b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061213f9190614a1d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121ae57336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016121a59190614a48565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561221957506040513d601f19601f820116820180604052508101906122169190614e5f565b60015b61225a57816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016122519190614a48565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b81146122c057806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016122b79190614190565b60405180910390fd5b6122ca83836138fc565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614612354576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f80612360611de8565b9050805f016003015491505090565b5f825f015f8381526020019081526020015f205f9054906101000a900460ff16905092915050565b61239f613d5a565b5f83839050036123db576040517f8af082ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6123e4611de8565b9050806007015f8154809291906123fa90614e8a565b91905055505f8160070154905080826006015f8381526020019081526020015f205f018190555087826006015f8381526020019081526020015f20600101819055508686836006015f8481526020019081526020015f206002019182612461929190615078565b505f5b85859050811015612b9b575f73ffffffffffffffffffffffffffffffffffffffff1686868381811061249957612498615145565b5b90506020028101906124ab919061517e565b60200160208101906124bd91906151a5565b73ffffffffffffffffffffffffffffffffffffffff1603612519578086866040517f9edb7861000000000000000000000000000000000000000000000000000000008152600401612510939291906151d0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1686868381811061254357612542615145565b5b9050602002810190612555919061517e565b604001602081019061256791906151a5565b73ffffffffffffffffffffffffffffffffffffffff16036125c3578086866040517f4a6c59740000000000000000000000000000000000000000000000000000000081526004016125ba939291906151d0565b60405180910390fd5b826009015f8381526020019081526020015f205f8787848181106125ea576125e9615145565b5b90506020028101906125fc919061517e565b602001602081019061260e91906151a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156126d25785858281811061266c5761266b615145565b5b905060200281019061267e919061517e565b602001602081019061269091906151a5565b8187876040517f64d527590000000000000000000000000000000000000000000000000000000081526004016126c99493929190615200565b60405180910390fd5b82600b015f8381526020019081526020015f205f8787848181106126f9576126f8615145565b5b905060200281019061270b919061517e565b604001602081019061271d91906151a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156127e15785858281811061277b5761277a615145565b5b905060200281019061278d919061517e565b604001602081019061279f91906151a5565b8187876040517fc826e1a20000000000000000000000000000000000000000000000000000000081526004016127d89493929190615200565b60405180910390fd5b826006015f8381526020019081526020015f2060030186868381811061280a57612809615145565b5b905060200281019061281c919061517e565b908060018154018082558091505060019003905f5260205f2090600402015f90919091909150818161284e9190615529565b505085858281811061286357612862615145565b5b9050602002810190612875919061517e565b836008015f8481526020019081526020015f205f88888581811061289c5761289b615145565b5b90506020028101906128ae919061517e565b60200160208101906128c091906151a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081816129059190615529565b9050506001836009015f8481526020019081526020015f205f88888581811061293157612930615145565b5b9050602002810190612943919061517e565b602001602081019061295591906151a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555082600a015f8381526020019081526020015f208686838181106129ca576129c9615145565b5b90506020028101906129dc919061517e565b60200160208101906129ee91906151a5565b908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600183600b015f8481526020019081526020015f205f888885818110612a7457612a73615145565b5b9050602002810190612a86919061517e565b6040016020810190612a9891906151a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555082600c015f8381526020019081526020015f20868683818110612b0d57612b0c615145565b5b9050602002810190612b1f919061517e565b6040016020810190612b3191906151a5565b908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080600101915050612464565b50816006015f8281526020019081526020015f206040518060800160405290815f820154815260200160018201548152602001600282018054612bdd906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054612c09906149a3565b8015612c545780601f10612c2b57610100808354040283529160200191612c54565b820191905f5260205f20905b815481529060010190602001808311612c3757829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020015f905b82821015612e7a578382905f5260205f2090600402016040518060800160405290815f82018054612cb1906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054612cdd906149a3565b8015612d285780601f10612cff57610100808354040283529160200191612d28565b820191905f5260205f20905b815481529060010190602001808311612d0b57829003601f168201915b50505050508152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382018054612deb906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054612e17906149a3565b8015612e625780601f10612e3957610100808354040283529160200191612e62565b820191905f5260205f20905b815481529060010190602001808311612e4557829003601f168201915b50505050508152505081526020019060010190612c81565b50505050815250509250505095945050505050565b805f8103612ec9576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ed3838361396e565b612f1457816040517f6653f6d7000000000000000000000000000000000000000000000000000000008152600401612f0b9190613f05565b60405180910390fd5b5f836002015414612f605782600201546040517fc470c022000000000000000000000000000000000000000000000000000000008152600401612f579190613f05565b60405180910390fd5b5f836004015414612fac5782600401546040517f7022ec41000000000000000000000000000000000000000000000000000000008152600401612fa39190613f05565b60405180910390fd5b6001835f015f8481526020019081526020015f205f6101000a81548160ff02191690836007811115612fe157612fe06142e9565b5b0217905550818360010181905550505050565b805f810361302e576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61303883836139bc565b61307957816040517fc0b5ee660000000000000000000000000000000000000000000000000000000081526004016130709190613f05565b60405180910390fd5b6002835f015f8481526020019081526020015f205f6101000a81548160ff021916908360078111156130ae576130ad6142e9565b5b02179055508183600201819055505f8360010181905550505050565b5f806130d4611de8565b9050805f016002015491505090565b805f810361311d576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8282613129828261396e565b1561316b57806040517f61544cfc0000000000000000000000000000000000000000000000000000000081526004016131629190613f05565b60405180910390fd5b61317585856139bc565b156131b757836040517f0ddd14ca0000000000000000000000000000000000000000000000000000000081526004016131ae9190613f05565b60405180910390fd5b6131c18585613a0b565b1561320357836040517fcd494e490000000000000000000000000000000000000000000000000000000081526004016131fa9190613f05565b60405180910390fd5b6006855f015f8681526020019081526020015f205f6101000a81548160ff02191690836007811115613238576132376142e9565b5b021790555083856002015403613252575f85600201819055505b83856004015403613267575f85600401819055505b5050505050565b805f81036132a8576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82826132b4828261396e565b156132f657806040517f61544cfc0000000000000000000000000000000000000000000000000000000081526004016132ed9190613f05565b60405180910390fd5b6133008585613a0b565b1561334257836040517fcd494e490000000000000000000000000000000000000000000000000000000081526004016133399190613f05565b60405180910390fd5b6007855f015f8681526020019081526020015f205f6101000a81548160ff02191690836007811115613377576133766142e9565b5b021790555083856001015403613391575f85600101819055505b838560020154036133a6575f85600201819055505b838560040154036133bb575f85600401819055505b5050505050565b5f6133cb6133e6565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b805f8103613447576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8360030154146134935782600301546040517f7eea432b00000000000000000000000000000000000000000000000000000000815260040161348a9190613f05565b60405180910390fd5b6003835f015f8481526020019081526020015f205f6101000a81548160ff021916908360078111156134c8576134c76142e9565b5b0217905550818360030181905550505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613537577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161352d5761352c614e08565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613574576d04ee2d6d415b85acef8100000000838161356a57613569614e08565b5b0492506020810190505b662386f26fc1000083106135a357662386f26fc10000838161359957613598614e08565b5b0492506010810190505b6305f5e10083106135cc576305f5e10083816135c2576135c1614e08565b5b0492506008810190505b61271083106135f15761271083816135e7576135e6614e08565b5b0492506004810190505b60648310613614576064838161360a57613609614e08565b5b0492506002810190505b600a8310613623576001810190505b80915050919050565b805f8103613666576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6136708383613a0b565b6136b157816040517f331486b30000000000000000000000000000000000000000000000000000000081526004016136a89190613f05565b60405180910390fd5b6004835f015f8481526020019081526020015f205f6101000a81548160ff021916908360078111156136e6576136e56142e9565b5b02179055508183600401819055505f8360030181905550505050565b805f810361373c576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6137468383613a5a565b15801561375a5750613758838361385a565b155b1561379c57816040517f12b49e3d0000000000000000000000000000000000000000000000000000000081526004016137939190613f05565b60405180910390fd5b5f8360030154146137e85782600301546040517f7eea432b0000000000000000000000000000000000000000000000000000000081526004016137df9190613f05565b60405180910390fd5b6003835f015f8481526020019081526020015f205f6101000a81548160ff0219169083600781111561381d5761381c6142e9565b5b021790555081836003018190555081836002015403613840575f83600201819055505b81836004015403613855575f83600401819055505b505050565b5f6004600781111561386f5761386e6142e9565b5b835f015f8481526020019081526020015f205f9054906101000a900460ff1660078111156138a05761389f6142e9565b5b14905092915050565b5f6138d57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613aa9565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61390582613ab2565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156139615761395b8282613b7b565b5061396a565b613969613bfb565b5b5050565b5f806007811115613982576139816142e9565b5b835f015f8481526020019081526020015f205f9054906101000a900460ff1660078111156139b3576139b26142e9565b5b14905092915050565b5f600160078111156139d1576139d06142e9565b5b835f015f8481526020019081526020015f205f9054906101000a900460ff166007811115613a0257613a016142e9565b5b14905092915050565b5f60036007811115613a2057613a1f6142e9565b5b835f015f8481526020019081526020015f205f9054906101000a900460ff166007811115613a5157613a506142e9565b5b14905092915050565b5f60026007811115613a6f57613a6e6142e9565b5b835f015f8481526020019081526020015f205f9054906101000a900460ff166007811115613aa057613a9f6142e9565b5b14905092915050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03613b0d57806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401613b049190614a48565b60405180910390fd5b80613b397f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613aa9565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051613ba49190615571565b5f60405180830381855af49150503d805f8114613bdc576040519150601f19603f3d011682016040523d82523d5f602084013e613be1565b606091505b5091509150613bf1858383613c37565b9250505092915050565b5f341115613c35576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b606082613c4c57613c4782613cc4565b613cbc565b5f8251148015613c7257505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15613cb457836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401613cab9190614a48565b60405180910390fd5b819050613cbd565b5b9392505050565b5f81511115613cd65780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060800160405280606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b60405180608001604052805f81526020015f815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b613da381613d91565b8114613dad575f80fd5b50565b5f81359050613dbe81613d9a565b92915050565b5f60208284031215613dd957613dd8613d89565b5b5f613de684828501613db0565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e4182613e18565b9050919050565b613e5181613e37565b82525050565b5f613e628383613e48565b60208301905092915050565b5f602082019050919050565b5f613e8482613def565b613e8e8185613df9565b9350613e9983613e09565b805f5b83811015613ec9578151613eb08882613e57565b9750613ebb83613e6e565b925050600181019050613e9c565b5085935050505092915050565b5f6020820190508181035f830152613eee8184613e7a565b905092915050565b613eff81613d91565b82525050565b5f602082019050613f185f830184613ef6565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613f55578082015181840152602081019050613f3a565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613f7a82613f1e565b613f848185613f28565b9350613f94818560208601613f38565b613f9d81613f60565b840191505092915050565b5f6020820190508181035f830152613fc08184613f70565b905092915050565b613fd181613e37565b8114613fdb575f80fd5b50565b5f81359050613fec81613fc8565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61403082613f60565b810181811067ffffffffffffffff8211171561404f5761404e613ffa565b5b80604052505050565b5f614061613d80565b905061406d8282614027565b919050565b5f67ffffffffffffffff82111561408c5761408b613ffa565b5b61409582613f60565b9050602081019050919050565b828183375f83830152505050565b5f6140c26140bd84614072565b614058565b9050828152602081018484840111156140de576140dd613ff6565b5b6140e98482856140a2565b509392505050565b5f82601f83011261410557614104613ff2565b5b81356141158482602086016140b0565b91505092915050565b5f806040838503121561413457614133613d89565b5b5f61414185828601613fde565b925050602083013567ffffffffffffffff81111561416257614161613d8d565b5b61416e858286016140f1565b9150509250929050565b5f819050919050565b61418a81614178565b82525050565b5f6020820190506141a35f830184614181565b92915050565b5f80604083850312156141bf576141be613d89565b5b5f6141cc85828601613db0565b92505060206141dd85828601613fde565b9150509250929050565b5f82825260208201905092915050565b5f61420182613f1e565b61420b81856141e7565b935061421b818560208601613f38565b61422481613f60565b840191505092915050565b5f608083015f8301518482035f86015261424982826141f7565b915050602083015161425e6020860182613e48565b5060408301516142716040860182613e48565b506060830151848203606086015261428982826141f7565b9150508091505092915050565b5f6020820190508181035f8301526142ae818461422f565b905092915050565b5f8115159050919050565b6142ca816142b6565b82525050565b5f6020820190506142e35f8301846142c1565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60088110614327576143266142e9565b5b50565b5f81905061433782614316565b919050565b5f6143468261432a565b9050919050565b6143568161433c565b82525050565b5f60208201905061436f5f83018461434d565b92915050565b5f80fd5b5f80fd5b5f8083601f84011261439257614391613ff2565b5b8235905067ffffffffffffffff8111156143af576143ae614375565b5b6020830191508360018202830111156143cb576143ca614379565b5b9250929050565b5f8083601f8401126143e7576143e6613ff2565b5b8235905067ffffffffffffffff81111561440457614403614375565b5b6020830191508360208202830111156144205761441f614379565b5b9250929050565b5f80fd5b5f604082840312156144405761443f614427565b5b81905092915050565b5f805f805f6080868803121561446257614461613d89565b5b5f86013567ffffffffffffffff81111561447f5761447e613d8d565b5b61448b8882890161437d565b9550955050602086013567ffffffffffffffff8111156144ae576144ad613d8d565b5b6144ba888289016143d2565b935093505060406144cd8882890161442b565b9150509295509295909350565b600881106144e6575f80fd5b50565b5f813590506144f7816144da565b92915050565b5f806040838503121561451357614512613d89565b5b5f61452085828601613db0565b9250506020614531858286016144e9565b9150509250929050565b5f805f806040858703121561455357614552613d89565b5b5f85013567ffffffffffffffff8111156145705761456f613d8d565b5b61457c8782880161437d565b9450945050602085013567ffffffffffffffff81111561459f5761459e613d8d565b5b6145ab878288016143d2565b925092505092959194509250565b6145c281613d91565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f6145ec826145c8565b6145f681856145d2565b9350614606818560208601613f38565b61460f81613f60565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f608083015f8301518482035f86015261465d82826141f7565b91505060208301516146726020860182613e48565b5060408301516146856040860182613e48565b506060830151848203606086015261469d82826141f7565b9150508091505092915050565b5f6146b58383614643565b905092915050565b5f602082019050919050565b5f6146d38261461a565b6146dd8185614624565b9350836020820285016146ef85614634565b805f5b8581101561472a578484038952815161470b85826146aa565b9450614716836146bd565b925060208a019950506001810190506146f2565b50829750879550505050505092915050565b5f608083015f8301516147515f8601826145b9565b50602083015161476460208601826145b9565b506040830151848203604086015261477c82826145e2565b9150506060830151848203606086015261479682826146c9565b9150508091505092915050565b5f6020820190508181035f8301526147bb818461473c565b905092915050565b5f81905092915050565b5f6147d782613f1e565b6147e181856147c3565b93506147f1818560208601613f38565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f6148316002836147c3565b915061483c826147fd565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61487b6001836147c3565b915061488682614847565b600182019050919050565b5f61489c82876147cd565b91506148a782614825565b91506148b382866147cd565b91506148be8261486f565b91506148ca82856147cd565b91506148d58261486f565b91506148e182846147cd565b915081905095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61492682613d91565b915061493183613d91565b9250828201905080821115614949576149486148ef565b5b92915050565b5f6040820190506149625f830185613ef6565b61496f6020830184613ef6565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806149ba57607f821691505b6020821081036149cd576149cc614976565b5b50919050565b6149dc81613e37565b82525050565b5f6040820190506149f55f830185613ef6565b614a0260208301846149d3565b9392505050565b5f81519050614a1781613fc8565b92915050565b5f60208284031215614a3257614a31613d89565b5b5f614a3f84828501614a09565b91505092915050565b5f602082019050614a5b5f8301846149d3565b92915050565b5f614a6f6020840184613db0565b905092915050565b60408201614a875f830183614a61565b614a935f8501826145b9565b50614aa16020830183614a61565b614aae60208501826145b9565b50505050565b5f6080820190508181035f830152614acc818661473c565b90508181036020830152614ae0818561473c565b9050614aef6040830184614a77565b949350505050565b5f6040820190508181035f830152614b0f818561473c565b9050614b1e6020830184613ef6565b9392505050565b5f604082019050614b385f830185613ef6565b614b45602083018461434d565b9392505050565b5f82825260208201905092915050565b5f614b678385614b4c565b9350614b748385846140a2565b614b7d83613f60565b840190509392505050565b5f82825260208201905092915050565b5f819050919050565b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112614bc957614bc8614ba9565b5b83810192508235915060208301925067ffffffffffffffff821115614bf157614bf0614ba1565b5b600182023603831315614c0757614c06614ba5565b5b509250929050565b5f614c1a83856141e7565b9350614c278385846140a2565b614c3083613f60565b840190509392505050565b5f614c496020840184613fde565b905092915050565b5f60808301614c625f840184614bad565b8583035f870152614c74838284614c0f565b92505050614c856020840184614c3b565b614c926020860182613e48565b50614ca06040840184614c3b565b614cad6040860182613e48565b50614cbb6060840184614bad565b8583036060870152614cce838284614c0f565b925050508091505092915050565b5f614ce78383614c51565b905092915050565b5f82356001608003833603038112614d0a57614d09614ba9565b5b82810191505092915050565b5f602082019050919050565b5f614d2d8385614b88565b935083602084028501614d3f84614b98565b805f5b87811015614d82578484038952614d598284614cef565b614d638582614cdc565b9450614d6e83614d16565b925060208a01995050600181019050614d42565b50829750879450505050509392505050565b5f6040820190508181035f830152614dad818688614b5c565b90508181036020830152614dc2818486614d22565b905095945050505050565b5f67ffffffffffffffff82169050919050565b614de981614dcd565b82525050565b5f602082019050614e025f830184614de0565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b614e3e81614178565b8114614e48575f80fd5b50565b5f81519050614e5981614e35565b92915050565b5f60208284031215614e7457614e73613d89565b5b5f614e8184828501614e4b565b91505092915050565b5f614e9482613d91565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614ec657614ec56148ef565b5b600182019050919050565b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614efc565b614f418683614efc565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614f7c614f77614f7284613d91565b614f59565b613d91565b9050919050565b5f819050919050565b614f9583614f62565b614fa9614fa182614f83565b848454614f08565b825550505050565b5f90565b614fbd614fb1565b614fc8818484614f8c565b505050565b5b81811015614feb57614fe05f82614fb5565b600181019050614fce565b5050565b601f8211156150305761500181614edb565b61500a84614eed565b81016020851015615019578190505b61502d61502585614eed565b830182614fcd565b50505b505050565b5f82821c905092915050565b5f6150505f1984600802615035565b1980831691505092915050565b5f6150688383615041565b9150826002028217905092915050565b6150828383614ed1565b67ffffffffffffffff81111561509b5761509a613ffa565b5b6150a582546149a3565b6150b0828285614fef565b5f601f8311600181146150dd575f84156150cb578287013590505b6150d5858261505d565b86555061513c565b601f1984166150eb86614edb565b5f5b82811015615112578489013582556001820191506020850194506020810190506150ed565b8683101561512f578489013561512b601f891682615041565b8355505b6001600288020188555050505b50505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f8235600160800383360303811261519957615198615172565b5b80830191505092915050565b5f602082840312156151ba576151b9613d89565b5b5f6151c784828501613fde565b91505092915050565b5f6040820190506151e35f830186613ef6565b81810360208301526151f6818486614d22565b9050949350505050565b5f6060820190506152135f8301876149d3565b6152206020830186613ef6565b8181036040830152615233818486614d22565b905095945050505050565b5f808335600160200384360303811261525a57615259615172565b5b80840192508235915067ffffffffffffffff82111561527c5761527b615176565b5b6020830192506001820236038313156152985761529761517a565b5b509250929050565b5f82905092915050565b5f819050815f5260205f209050919050565b601f8211156152fd576152ce816152aa565b6152d784614eed565b810160208510156152e6578190505b6152fa6152f285614eed565b830182614fcd565b50505b505050565b61530c83836152a0565b67ffffffffffffffff81111561532557615324613ffa565b5b61532f82546149a3565b61533a8282856152bc565b5f601f831160018114615367575f8415615355578287013590505b61535f858261505d565b8655506153c6565b601f198416615375866152aa565b5f5b8281101561539c57848901358255600182019150602085019450602081019050615377565b868310156153b957848901356153b5601f891682615041565b8355505b6001600288020188555050505b50505050505050565b6153da838383615302565b505050565b5f81356153eb81613fc8565b80915050919050565b5f815f1b9050919050565b5f73ffffffffffffffffffffffffffffffffffffffff61541e846153f4565b9350801983169250808416831791505092915050565b5f61544e61544961544484613e18565b614f59565b613e18565b9050919050565b5f61545f82615434565b9050919050565b5f61547082615455565b9050919050565b5f819050919050565b61548982615466565b61549c61549582615477565b83546153ff565b8255505050565b5f81015f83016154b3818561523e565b6154be8183866153cf565b505050506001810160208301806154d4816153df565b90506154e08184615480565b5050506002810160408301806154f5816153df565b90506155018184615480565b5050506003810160608301615516818561523e565b6155218183866153cf565b505050505050565b61553382826154a3565b5050565b5f81905092915050565b5f61554b826145c8565b6155558185615537565b9350615565818560208601613f38565b80840191505092915050565b5f61557c8284615541565b91508190509291505056 + /// ``` + #[rustfmt::skip] + #[allow(clippy::all)] + pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( + b"`\xA0`@R0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x80\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP4\x80\x15b\0\0CW_\x80\xFD[Pb\0\0Tb\0\0Z` \x1B` \x1CV[b\0\x01\xC4V[_b\0\0kb\0\x01^` \x1B` \x1CV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15b\0\0\xB6W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14b\0\x01[Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`@Qb\0\x01R\x91\x90b\0\x01\xA9V[`@Q\x80\x91\x03\x90\xA1[PV[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[b\0\x01\xA3\x81b\0\x01\x85V[\x82RPPV[_` \x82\x01\x90Pb\0\x01\xBE_\x83\x01\x84b\0\x01\x98V[\x92\x91PPV[`\x80QaU\x87b\0\x01\xEB_9_\x81\x81a\x1F\xDA\x01R\x81\x81a /\x01Ra\"\xD1\x01RaU\x87_\xF3\xFE`\x80`@R`\x046\x10a\x01?W_5`\xE0\x1C\x80c\x99\x1D\xC3m\x11a\0\xB5W\x80c\xCA\xC6\xA5\xA8\x11a\0nW\x80c\xCA\xC6\xA5\xA8\x14a\x04eW\x80c\xCD\x8E\x99<\x14a\x04\x8DW\x80c\xCD\xBBZ\x82\x14a\x04\xC9W\x80c\xEC\xFB\x0B\x94\x14a\x05\x05W\x80c\xF8\x81t\xEA\x14a\x05-W\x80c\xFE\xD9qk\x14a\x05iWa\x01?V[\x80c\x99\x1D\xC3m\x14a\x03GW\x80c\xA16My\x14a\x03qW\x80c\xA9\xB4\xD0q\x14a\x03\x99W\x80c\xAD<\xB1\xCC\x14a\x03\xD5W\x80c\xB3\xF5@:\x14a\x03\xFFW\x80c\xBE\x91\x18{\x14a\x04;Wa\x01?V[\x80cO\x1E\xF2\x86\x11a\x01\x07W\x80cO\x1E\xF2\x86\x14a\x02%W\x80cR\xD1\x90-\x14a\x02AW\x80c\x82\n\x91\xF8\x14a\x02kW\x80c\x86%\xE8v\x14a\x02\xA7W\x80c\x86\xDF\xC7\xDE\x14a\x02\xE3W\x80c\x88\x8B\x99\xE0\x14a\x03\x0BWa\x01?V[\x80c\x04\x9F%\xEF\x14a\x01CW\x80c\x08nN\x1C\x14a\x01\x7FW\x80c\r\x8En,\x14a\x01\xA9W\x80c:Qb\xE6\x14a\x01\xD3W\x80cAa\x8F\xE9\x14a\x01\xE9W[_\x80\xFD[4\x80\x15a\x01NW_\x80\xFD[Pa\x01i`\x04\x806\x03\x81\x01\x90a\x01d\x91\x90a=\xC4V[a\x05\x93V[`@Qa\x01v\x91\x90a>\xD6V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x8AW_\x80\xFD[Pa\x01\x93a\x06=V[`@Qa\x01\xA0\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xB4W_\x80\xFD[Pa\x01\xBDa\x06\x89V[`@Qa\x01\xCA\x91\x90a?\xA8V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xDEW_\x80\xFD[Pa\x01\xE7a\x07\x04V[\0[4\x80\x15a\x01\xF4W_\x80\xFD[Pa\x02\x0F`\x04\x806\x03\x81\x01\x90a\x02\n\x91\x90a=\xC4V[a\x08\x82V[`@Qa\x02\x1C\x91\x90a>\xD6V[`@Q\x80\x91\x03\x90\xF3[a\x02?`\x04\x806\x03\x81\x01\x90a\x02:\x91\x90aA\x1EV[a\t,V[\0[4\x80\x15a\x02LW_\x80\xFD[Pa\x02Ua\tKV[`@Qa\x02b\x91\x90aA\x90V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02vW_\x80\xFD[Pa\x02\x91`\x04\x806\x03\x81\x01\x90a\x02\x8C\x91\x90aA\xA9V[a\t|V[`@Qa\x02\x9E\x91\x90aB\x96V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xB2W_\x80\xFD[Pa\x02\xCD`\x04\x806\x03\x81\x01\x90a\x02\xC8\x91\x90aA\xA9V[a\x0C\x9CV[`@Qa\x02\xDA\x91\x90aB\xD0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xEEW_\x80\xFD[Pa\x03\t`\x04\x806\x03\x81\x01\x90a\x03\x04\x91\x90a=\xC4V[a\rsV[\0[4\x80\x15a\x03\x16W_\x80\xFD[Pa\x031`\x04\x806\x03\x81\x01\x90a\x03,\x91\x90a=\xC4V[a\x0F/V[`@Qa\x03>\x91\x90aC\\V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03RW_\x80\xFD[Pa\x03[a\x0FOV[`@Qa\x03h\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03|W_\x80\xFD[Pa\x03\x97`\x04\x806\x03\x81\x01\x90a\x03\x92\x91\x90aDIV[a\x0F\x9BV[\0[4\x80\x15a\x03\xA4W_\x80\xFD[Pa\x03\xBF`\x04\x806\x03\x81\x01\x90a\x03\xBA\x91\x90a=\xC4V[a\x11\x9DV[`@Qa\x03\xCC\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03\xE0W_\x80\xFD[Pa\x03\xE9a\x12,V[`@Qa\x03\xF6\x91\x90a?\xA8V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x04\nW_\x80\xFD[Pa\x04%`\x04\x806\x03\x81\x01\x90a\x04 \x91\x90a=\xC4V[a\x12eV[`@Qa\x042\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x04FW_\x80\xFD[Pa\x04Oa\x12\xF4V[`@Qa\x04\\\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x04pW_\x80\xFD[Pa\x04\x8B`\x04\x806\x03\x81\x01\x90a\x04\x86\x91\x90aD\xFDV[a\x13@V[\0[4\x80\x15a\x04\x98W_\x80\xFD[Pa\x04\xB3`\x04\x806\x03\x81\x01\x90a\x04\xAE\x91\x90a=\xC4V[a\x16\xFEV[`@Qa\x04\xC0\x91\x90aB\xD0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x04\xD4W_\x80\xFD[Pa\x04\xEF`\x04\x806\x03\x81\x01\x90a\x04\xEA\x91\x90aA\xA9V[a\x17\x88V[`@Qa\x04\xFC\x91\x90aB\xD0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x05\x10W_\x80\xFD[Pa\x05+`\x04\x806\x03\x81\x01\x90a\x05&\x91\x90aE;V[a\x18_V[\0[4\x80\x15a\x058W_\x80\xFD[Pa\x05S`\x04\x806\x03\x81\x01\x90a\x05N\x91\x90a=\xC4V[a\x1A v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[a\t\x84a=\x08V[\x82_a\t\x8Ea\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\t\xE9W\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\t\xE0\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_a\t\xF2a\x1D\xE8V[\x90P_\x81`\x08\x01_\x88\x81R` \x01\x90\x81R` \x01_ _\x87s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ `@Q\x80`\x80\x01`@R\x90\x81_\x82\x01\x80Ta\n]\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\n\x89\x90aI\xA3V[\x80\x15a\n\xD4W\x80`\x1F\x10a\n\xABWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\n\xD4V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\n\xB7W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x03\x82\x01\x80Ta\x0B\x97\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x0B\xC3\x90aI\xA3V[\x80\x15a\x0C\x0EW\x80`\x1F\x10a\x0B\xE5Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x0C\x0EV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x0B\xF1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a\x0C\x8FW\x86\x86`@Q\x7F\xC3\x12\xE7>\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0C\x86\x92\x91\x90aI\xE2V[`@Q\x80\x91\x03\x90\xFD[\x80\x94PPPPP\x92\x91PPV[_\x82_a\x0C\xA7a\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\r\x02W\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0C\xF9\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_a\r\x0Ba\x1D\xE8V[\x90P\x80`\t\x01_\x87\x81R` \x01\x90\x81R` \x01_ _\x86s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x93PPPP\x92\x91PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\xD0W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\r\xF4\x91\x90aJ\x1DV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x0EcW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0EZ\x91\x90aJHV[`@Q\x80\x91\x03\x90\xFD[_a\x0Ela\x06=V[\x90P_a\x0Ewa#VV[\x90P_a\x0E\x82a\x1D\xE8V[\x90Pa\x0E\x91\x81_\x01\x84\x84a\x1E\xF2V[_\x84Ba\x0E\x9E\x91\x90aI\x1CV[\x90P\x80\x82`\x0E\x01_\x85\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x7F0\x80\xF2\xB8\r\xDAGH\xCA)&\xA6A\xFAP\x07sPX\xDC_Z\xB2YN\xEC\xA7A\x97\xA3\xAC\xCC\x83\x82`@Qa\x0E\xE9\x92\x91\x90aIOV[`@Q\x80\x91\x03\x90\xA1\x7Fl\x8C\x04\xC9\xFE\xA37r\x0B}\xFA\xDC\xA3e\xE8P\x03Q\x14\xFD\x08\x1BX\xD00\xAF\xBE\x8B]\xC3\xBEq\x84`@Qa\x0F \x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xA1PPPPPV[_\x80a\x0F9a\x1D\xE8V[\x90Pa\x0FG\x81_\x01\x84a#oV[\x91PP\x91\x90PV[_\x80a\x0FYa#VV[\x90P_\x81\x03a\x0F\x94W`@Q\x7F\x04e\x93\xEA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x91PP\x90V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0F\xF8W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x10\x1C\x91\x90aJ\x1DV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x10\x8BW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x10\x82\x91\x90aJHV[`@Q\x80\x91\x03\x90\xFD[_a\x10\x94a\x1D\xE8V[\x90P_a\x10\x9Fa\x1A\xDDV[\x90P_a\x10\xB2\x82_\x01Q\x89\x89\x89\x89a#\x97V[\x90P\x7F\xBB\xB1\x04\xC4\x95\x88n]\xAA>\xFBk(\x1E\xC2\x84\x0Ci8Z\xF5\xCB\xFC\x15\x82\xFC\xF7\0\xDE\x1E\xCDK\x82\x82\x86`@Qa\x10\xE7\x93\x92\x91\x90aJ\xB4V[`@Q\x80\x91\x03\x90\xA1a\x10\xFE\x83_\x01\x82_\x01Qa.\x8FV[a\x11\r\x83_\x01\x82_\x01Qa/\xF4V[_\x84_\x015Ba\x11\x1D\x91\x90aI\x1CV[\x90P\x80\x84`\r\x01_\x84_\x01Q\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x84` \x015\x84`\x0F\x01_\x85_\x01Q\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x7F\x04%\xF5N`,\xBC\xF8\x7F\xAF\xD6\xA0\xB5W\xFA\\K\xC4\xBCl%\x16\x86%^\xB3\xBDw_E#w\x82\x82`@Qa\x11\x8A\x92\x91\x90aJ\xF7V[`@Q\x80\x91\x03\x90\xA1PPPPPPPPPV[_\x81_a\x11\xA8a\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\x12\x03W\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x11\xFA\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_a\x12\x0Ca\x1D\xE8V[\x90P\x80`\x0E\x01_\x86\x81R` \x01\x90\x81R` \x01_ T\x93PPPP\x91\x90PV[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[_\x81_a\x12pa\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\x12\xCBW\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x12\xC2\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_a\x12\xD4a\x1D\xE8V[\x90P\x80`\r\x01_\x86\x81R` \x01\x90\x81R` \x01_ T\x93PPPP\x91\x90PV[_\x80a\x12\xFEa0\xCAV[\x90P_\x81\x03a\x139W`@Q\x7F\xB9\xE8a\xB2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x91PP\x90V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x13\x9DW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\xC1\x91\x90aJ\x1DV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x140W3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14'\x91\x90aJHV[`@Q\x80\x91\x03\x90\xFD[\x81_a\x14:a\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\x14\x95W\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14\x8C\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_a\x14\x9Ea\x1D\xE8V[\x90P`\x03`\x07\x81\x11\x15a\x14\xB4Wa\x14\xB3aB\xE9V[[\x84`\x07\x81\x11\x15a\x14\xC7Wa\x14\xC6aB\xE9V[[\x03a\x15ZW_a\x14\xD5a\x0FOV[\x90Pa\x14\xE4\x82_\x01\x87\x83a\x1E\xF2V[\x7F0\x80\xF2\xB8\r\xDAGH\xCA)&\xA6A\xFAP\x07sPX\xDC_Z\xB2YN\xEC\xA7A\x97\xA3\xAC\xCC\x81B`@Qa\x15\x15\x92\x91\x90aIOV[`@Q\x80\x91\x03\x90\xA1\x7Fl\x8C\x04\xC9\xFE\xA37r\x0B}\xFA\xDC\xA3e\xE8P\x03Q\x14\xFD\x08\x1BX\xD00\xAF\xBE\x8B]\xC3\xBEq\x86`@Qa\x15L\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xA1Pa\x16\xF7V[`\x05`\x07\x81\x11\x15a\x15nWa\x15maB\xE9V[[\x84`\x07\x81\x11\x15a\x15\x81Wa\x15\x80aB\xE9V[[\x03a\x15\xCEWa\x15\x92\x81_\x01\x86a\x1F\x0BV[\x7F\x1B\xAA\x08\xD8\xDE\x18\xE8\xE2(v\x91\xB10\x97H\x01\t\x81\xEB\xDF\xD1*\x17=\x85teuH\xA5(\x98\x85`@Qa\x15\xC1\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xA1a\x16\xF6V[`\x06`\x07\x81\x11\x15a\x15\xE2Wa\x15\xE1aB\xE9V[[\x84`\x07\x81\x11\x15a\x15\xF5Wa\x15\xF4aB\xE9V[[\x03a\x16BWa\x16\x06\x81_\x01\x86a0\xE3V[\x7F\xEE~\xF89cAq%\xD2t0x\x9F\xC6\xE9A\x948\x1E\x82\xC3\xCD\xA6\x82`\xD0\xE7\xCF\xC3\x1E\xAF!\x85`@Qa\x165\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xA1a\x16\xF5V[`\x07\x80\x81\x11\x15a\x16UWa\x16TaB\xE9V[[\x84`\x07\x81\x11\x15a\x16hWa\x16gaB\xE9V[[\x03a\x16\xB5Wa\x16y\x81_\x01\x86a2nV[\x7F\xF2\x0B)\x98\x04\xC9\xC1\xD6\xDA;\x82ALz\xA0\xA8E\xCD\xBA\xBA\xE2\xD9\x0EF\xE3`\xA3y\xA7{{\xE5\x85`@Qa\x16\xA8\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xA1a\x16\xF4V[\x84\x84`@Q\x7F\xF0\xBE\xD6\x8F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x16\xEB\x92\x91\x90aK%V[`@Q\x80\x91\x03\x90\xFD[[[[PPPPPV[_\x81_a\x17\ta\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\x17dW\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x17[\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[a\x17la\x0FOV[\x84\x14\x80a\x17\x7FWPa\x17|a\x1E\x0FV[\x84\x14[\x92PPP\x91\x90PV[_\x82_a\x17\x93a\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\x17\xEEW\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x17\xE5\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_a\x17\xF7a\x1D\xE8V[\x90P\x80`\x0B\x01_\x87\x81R` \x01\x90\x81R` \x01_ _\x86s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x93PPPP\x92\x91PPV[`\x01a\x18ia3\xC2V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x18\xAAW`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02_a\x18\xB5a3\xE6V[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x18\xFDWP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x194W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_a\x19\x87_\x88\x88\x88\x88a#\x97V[\x90P_a\x19\x92a\x1D\xE8V[\x90Pa\x19\xA3\x81_\x01\x83_\x01Qa4\rV[\x7F\xD4t\x06\x8E\xCF\x91L\xAA\x04\x86\x84\x93\xBC\xEF\xA5k\xFB\x04\x9AT\xF1a,'&\xD1\x12\xE1\xE6\x06c\xB9\x88\x88\x88\x88`@Qa\x19\xD8\x94\x93\x92\x91\x90aM\x94V[`@Q\x80\x91\x03\x90\xA1PP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x1A,\x91\x90aM\xEFV[`@Q\x80\x91\x03\x90\xA1PPPPPPV[_\x81_a\x1AGa\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\x1A\xA2W\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1A\x99\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_a\x1A\xABa\x1D\xE8V[\x90P`\x01\x80\x82`\n\x01_\x88\x81R` \x01\x90\x81R` \x01_ \x80T\x90P\x90\x1Ca\x1A\xD3\x91\x90aI\x1CV[\x93PPPP\x91\x90PV[a\x1A\xE5a=ZV[_a\x1A\xEEa\x0FOV[\x90P_a\x1A\xF9a\x1D\xE8V[\x90P\x80`\x06\x01_\x83\x81R` \x01\x90\x81R` \x01_ `@Q\x80`\x80\x01`@R\x90\x81_\x82\x01T\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01\x80Ta\x1B<\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1Bh\x90aI\xA3V[\x80\x15a\x1B\xB3W\x80`\x1F\x10a\x1B\x8AWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1B\xB3V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1B\x96W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x03\x82\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01_\x90[\x82\x82\x10\x15a\x1D\xD9W\x83\x82\x90_R` _ \x90`\x04\x02\x01`@Q\x80`\x80\x01`@R\x90\x81_\x82\x01\x80Ta\x1C\x10\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1C<\x90aI\xA3V[\x80\x15a\x1C\x87W\x80`\x1F\x10a\x1C^Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1C\x87V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1CjW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x03\x82\x01\x80Ta\x1DJ\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1Dv\x90aI\xA3V[\x80\x15a\x1D\xC1W\x80`\x1F\x10a\x1D\x98Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1D\xC1V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1D\xA4W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x81R` \x01\x90`\x01\x01\x90a\x1B\xE0V[PPPP\x81RPP\x92PPP\x90V[_\x7F\x1D\xA8\xA9\xA0e\xA2\xF0\xA8\x95\xC4W\x06^\xDD\xD3\xCFJM\rS@\xAA\xA0\xCAT\xD3\xCD[Jj\xAF\0\x90P\x90V[_\x80a\x1E\x19a\x1D\xE8V[\x90P\x80_\x01`\x04\x01T\x91PP\x90V[``_`\x01a\x1E6\x84a4\xDBV[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1ETWa\x1ESa?\xFAV[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x1E\x86W\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a\x1E\xE7W\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a\x1E\xDCWa\x1E\xDBaN\x08V[[\x04\x94P_\x85\x03a\x1E\x93W[\x81\x93PPPP\x91\x90PV[a\x1E\xFC\x83\x82a6,V[a\x1F\x06\x83\x83a7\x02V[PPPV[\x80_\x81\x03a\x1FEW`@Q\x7F\xCB\x17\xB7\xA5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1FO\x83\x83a8ZV[a\x1F\x90W\x81`@Q\x7Fw\xBFXF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1F\x87\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[`\x05\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x07\x81\x11\x15a\x1F\xC5Wa\x1F\xC4aB\xE9V[[\x02\x17\x90UP_\x83`\x04\x01\x81\x90UPPPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a \x85WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a la8\xA9V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a \xBCW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a!\x1BW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a!?\x91\x90aJ\x1DV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a!\xAEW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a!\xA5\x91\x90aJHV[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\"\x19WP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\"\x16\x91\x90aN_V[`\x01[a\"ZW\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\"Q\x91\x90aJHV[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a\"\xC0W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\"\xB7\x91\x90aA\x90V[`@Q\x80\x91\x03\x90\xFD[a\"\xCA\x83\x83a8\xFCV[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a#TW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80a#`a\x1D\xE8V[\x90P\x80_\x01`\x03\x01T\x91PP\x90V[_\x82_\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x90P\x92\x91PPV[a#\x9Fa=ZV[_\x83\x83\x90P\x03a#\xDBW`@Q\x7F\x8A\xF0\x82\xEF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a#\xE4a\x1D\xE8V[\x90P\x80`\x07\x01_\x81T\x80\x92\x91\x90a#\xFA\x90aN\x8AV[\x91\x90PUP_\x81`\x07\x01T\x90P\x80\x82`\x06\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x01\x81\x90UP\x87\x82`\x06\x01_\x83\x81R` \x01\x90\x81R` \x01_ `\x01\x01\x81\x90UP\x86\x86\x83`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ `\x02\x01\x91\x82a$a\x92\x91\x90aPxV[P_[\x85\x85\x90P\x81\x10\x15a+\x9BW_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x86\x86\x83\x81\x81\x10a$\x99Wa$\x98aQEV[[\x90P` \x02\x81\x01\x90a$\xAB\x91\x90aQ~V[` \x01` \x81\x01\x90a$\xBD\x91\x90aQ\xA5V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a%\x19W\x80\x86\x86`@Q\x7F\x9E\xDBxa\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%\x10\x93\x92\x91\x90aQ\xD0V[`@Q\x80\x91\x03\x90\xFD[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x86\x86\x83\x81\x81\x10a%CWa%BaQEV[[\x90P` \x02\x81\x01\x90a%U\x91\x90aQ~V[`@\x01` \x81\x01\x90a%g\x91\x90aQ\xA5V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a%\xC3W\x80\x86\x86`@Q\x7FJlYt\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%\xBA\x93\x92\x91\x90aQ\xD0V[`@Q\x80\x91\x03\x90\xFD[\x82`\t\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x87\x87\x84\x81\x81\x10a%\xEAWa%\xE9aQEV[[\x90P` \x02\x81\x01\x90a%\xFC\x91\x90aQ~V[` \x01` \x81\x01\x90a&\x0E\x91\x90aQ\xA5V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a&\xD2W\x85\x85\x82\x81\x81\x10a&lWa&kaQEV[[\x90P` \x02\x81\x01\x90a&~\x91\x90aQ~V[` \x01` \x81\x01\x90a&\x90\x91\x90aQ\xA5V[\x81\x87\x87`@Q\x7Fd\xD5'Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a&\xC9\x94\x93\x92\x91\x90aR\0V[`@Q\x80\x91\x03\x90\xFD[\x82`\x0B\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x87\x87\x84\x81\x81\x10a&\xF9Wa&\xF8aQEV[[\x90P` \x02\x81\x01\x90a'\x0B\x91\x90aQ~V[`@\x01` \x81\x01\x90a'\x1D\x91\x90aQ\xA5V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a'\xE1W\x85\x85\x82\x81\x81\x10a'{Wa'zaQEV[[\x90P` \x02\x81\x01\x90a'\x8D\x91\x90aQ~V[`@\x01` \x81\x01\x90a'\x9F\x91\x90aQ\xA5V[\x81\x87\x87`@Q\x7F\xC8&\xE1\xA2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a'\xD8\x94\x93\x92\x91\x90aR\0V[`@Q\x80\x91\x03\x90\xFD[\x82`\x06\x01_\x83\x81R` \x01\x90\x81R` \x01_ `\x03\x01\x86\x86\x83\x81\x81\x10a(\nWa(\taQEV[[\x90P` \x02\x81\x01\x90a(\x1C\x91\x90aQ~V[\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x90`\x04\x02\x01_\x90\x91\x90\x91\x90\x91P\x81\x81a(N\x91\x90aU)V[PP\x85\x85\x82\x81\x81\x10a(cWa(baQEV[[\x90P` \x02\x81\x01\x90a(u\x91\x90aQ~V[\x83`\x08\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x88\x88\x85\x81\x81\x10a(\x9CWa(\x9BaQEV[[\x90P` \x02\x81\x01\x90a(\xAE\x91\x90aQ~V[` \x01` \x81\x01\x90a(\xC0\x91\x90aQ\xA5V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ \x81\x81a)\x05\x91\x90aU)V[\x90PP`\x01\x83`\t\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x88\x88\x85\x81\x81\x10a)1Wa)0aQEV[[\x90P` \x02\x81\x01\x90a)C\x91\x90aQ~V[` \x01` \x81\x01\x90a)U\x91\x90aQ\xA5V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x82`\n\x01_\x83\x81R` \x01\x90\x81R` \x01_ \x86\x86\x83\x81\x81\x10a)\xCAWa)\xC9aQEV[[\x90P` \x02\x81\x01\x90a)\xDC\x91\x90aQ~V[` \x01` \x81\x01\x90a)\xEE\x91\x90aQ\xA5V[\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x83`\x0B\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x88\x88\x85\x81\x81\x10a*tWa*saQEV[[\x90P` \x02\x81\x01\x90a*\x86\x91\x90aQ~V[`@\x01` \x81\x01\x90a*\x98\x91\x90aQ\xA5V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x82`\x0C\x01_\x83\x81R` \x01\x90\x81R` \x01_ \x86\x86\x83\x81\x81\x10a+\rWa+\x0CaQEV[[\x90P` \x02\x81\x01\x90a+\x1F\x91\x90aQ~V[`@\x01` \x81\x01\x90a+1\x91\x90aQ\xA5V[\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x80\x80`\x01\x01\x91PPa$dV[P\x81`\x06\x01_\x82\x81R` \x01\x90\x81R` \x01_ `@Q\x80`\x80\x01`@R\x90\x81_\x82\x01T\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01\x80Ta+\xDD\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta,\t\x90aI\xA3V[\x80\x15a,TW\x80`\x1F\x10a,+Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a,TV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a,7W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x03\x82\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01_\x90[\x82\x82\x10\x15a.zW\x83\x82\x90_R` _ \x90`\x04\x02\x01`@Q\x80`\x80\x01`@R\x90\x81_\x82\x01\x80Ta,\xB1\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta,\xDD\x90aI\xA3V[\x80\x15a-(W\x80`\x1F\x10a,\xFFWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a-(V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a-\x0BW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x03\x82\x01\x80Ta-\xEB\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta.\x17\x90aI\xA3V[\x80\x15a.bW\x80`\x1F\x10a.9Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a.bV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a.EW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x81R` \x01\x90`\x01\x01\x90a,\x81V[PPPP\x81RPP\x92PPP\x95\x94PPPPPV[\x80_\x81\x03a.\xC9W`@Q\x7F\xCB\x17\xB7\xA5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a.\xD3\x83\x83a9nV[a/\x14W\x81`@Q\x7FfS\xF6\xD7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a/\x0B\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_\x83`\x02\x01T\x14a/`W\x82`\x02\x01T`@Q\x7F\xC4p\xC0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a/W\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_\x83`\x04\x01T\x14a/\xACW\x82`\x04\x01T`@Q\x7Fp\"\xECA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a/\xA3\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[`\x01\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x07\x81\x11\x15a/\xE1Wa/\xE0aB\xE9V[[\x02\x17\x90UP\x81\x83`\x01\x01\x81\x90UPPPPV[\x80_\x81\x03a0.W`@Q\x7F\xCB\x17\xB7\xA5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a08\x83\x83a9\xBCV[a0yW\x81`@Q\x7F\xC0\xB5\xEEf\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a0p\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[`\x02\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x07\x81\x11\x15a0\xAEWa0\xADaB\xE9V[[\x02\x17\x90UP\x81\x83`\x02\x01\x81\x90UP_\x83`\x01\x01\x81\x90UPPPPV[_\x80a0\xD4a\x1D\xE8V[\x90P\x80_\x01`\x02\x01T\x91PP\x90V[\x80_\x81\x03a1\x1DW`@Q\x7F\xCB\x17\xB7\xA5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82\x82a1)\x82\x82a9nV[\x15a1kW\x80`@Q\x7FaTL\xFC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a1b\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[a1u\x85\x85a9\xBCV[\x15a1\xB7W\x83`@Q\x7F\r\xDD\x14\xCA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a1\xAE\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[a1\xC1\x85\x85a:\x0BV[\x15a2\x03W\x83`@Q\x7F\xCDINI\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a1\xFA\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[`\x06\x85_\x01_\x86\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x07\x81\x11\x15a28Wa27aB\xE9V[[\x02\x17\x90UP\x83\x85`\x02\x01T\x03a2RW_\x85`\x02\x01\x81\x90UP[\x83\x85`\x04\x01T\x03a2gW_\x85`\x04\x01\x81\x90UP[PPPPPV[\x80_\x81\x03a2\xA8W`@Q\x7F\xCB\x17\xB7\xA5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82\x82a2\xB4\x82\x82a9nV[\x15a2\xF6W\x80`@Q\x7FaTL\xFC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a2\xED\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[a3\0\x85\x85a:\x0BV[\x15a3BW\x83`@Q\x7F\xCDINI\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a39\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[`\x07\x85_\x01_\x86\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x07\x81\x11\x15a3wWa3vaB\xE9V[[\x02\x17\x90UP\x83\x85`\x01\x01T\x03a3\x91W_\x85`\x01\x01\x81\x90UP[\x83\x85`\x02\x01T\x03a3\xA6W_\x85`\x02\x01\x81\x90UP[\x83\x85`\x04\x01T\x03a3\xBBW_\x85`\x04\x01\x81\x90UP[PPPPPV[_a3\xCBa3\xE6V[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[\x80_\x81\x03a4GW`@Q\x7F\xCB\x17\xB7\xA5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x83`\x03\x01T\x14a4\x93W\x82`\x03\x01T`@Q\x7F~\xEAC+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a4\x8A\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[`\x03\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x07\x81\x11\x15a4\xC8Wa4\xC7aB\xE9V[[\x02\x17\x90UP\x81\x83`\x03\x01\x81\x90UPPPPV[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a57Wz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a5-Wa5,aN\x08V[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a5tWm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a5jWa5iaN\x08V[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a5\xA3Wf#\x86\xF2o\xC1\0\0\x83\x81a5\x99Wa5\x98aN\x08V[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a5\xCCWc\x05\xF5\xE1\0\x83\x81a5\xC2Wa5\xC1aN\x08V[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a5\xF1Wa'\x10\x83\x81a5\xE7Wa5\xE6aN\x08V[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a6\x14W`d\x83\x81a6\nWa6\taN\x08V[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a6#W`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[\x80_\x81\x03a6fW`@Q\x7F\xCB\x17\xB7\xA5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a6p\x83\x83a:\x0BV[a6\xB1W\x81`@Q\x7F3\x14\x86\xB3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a6\xA8\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[`\x04\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x07\x81\x11\x15a6\xE6Wa6\xE5aB\xE9V[[\x02\x17\x90UP\x81\x83`\x04\x01\x81\x90UP_\x83`\x03\x01\x81\x90UPPPPV[\x80_\x81\x03a7 v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba:\xA9V[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a9\x05\x82a:\xB2V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a9aWa9[\x82\x82a;{V[Pa9jV[a9ia;\xFBV[[PPV[_\x80`\x07\x81\x11\x15a9\x82Wa9\x81aB\xE9V[[\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16`\x07\x81\x11\x15a9\xB3Wa9\xB2aB\xE9V[[\x14\x90P\x92\x91PPV[_`\x01`\x07\x81\x11\x15a9\xD1Wa9\xD0aB\xE9V[[\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16`\x07\x81\x11\x15a:\x02Wa:\x01aB\xE9V[[\x14\x90P\x92\x91PPV[_`\x03`\x07\x81\x11\x15a: Wa:\x1FaB\xE9V[[\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16`\x07\x81\x11\x15a:QWa:PaB\xE9V[[\x14\x90P\x92\x91PPV[_`\x02`\x07\x81\x11\x15a:oWa:naB\xE9V[[\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16`\x07\x81\x11\x15a:\xA0Wa:\x9FaB\xE9V[[\x14\x90P\x92\x91PPV[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a;\rW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a;\x04\x91\x90aJHV[`@Q\x80\x91\x03\x90\xFD[\x80a;9\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba:\xA9V[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa;\xA4\x91\x90aUqV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a;\xDCW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a;\xE1V[``\x91P[P\x91P\x91Pa;\xF1\x85\x83\x83a<7V[\x92PPP\x92\x91PPV[_4\x11\x15a<5W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82aA\x82a>\x18V[\x90P\x91\x90PV[a>Q\x81a>7V[\x82RPPV[_a>b\x83\x83a>HV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a>\x84\x82a=\xEFV[a>\x8E\x81\x85a=\xF9V[\x93Pa>\x99\x83a>\tV[\x80_[\x83\x81\x10\x15a>\xC9W\x81Qa>\xB0\x88\x82a>WV[\x97Pa>\xBB\x83a>nV[\x92PP`\x01\x81\x01\x90Pa>\x9CV[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra>\xEE\x81\x84a>zV[\x90P\x92\x91PPV[a>\xFF\x81a=\x91V[\x82RPPV[_` \x82\x01\x90Pa?\x18_\x83\x01\x84a>\xF6V[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a?UW\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa?:V[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a?z\x82a?\x1EV[a?\x84\x81\x85a?(V[\x93Pa?\x94\x81\x85` \x86\x01a?8V[a?\x9D\x81a?`V[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra?\xC0\x81\x84a?pV[\x90P\x92\x91PPV[a?\xD1\x81a>7V[\x81\x14a?\xDBW_\x80\xFD[PV[_\x815\x90Pa?\xEC\x81a?\xC8V[\x92\x91PPV[_\x80\xFD[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a@0\x82a?`V[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a@OWa@Na?\xFAV[[\x80`@RPPPV[_a@aa=\x80V[\x90Pa@m\x82\x82a@'V[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a@\x8CWa@\x8Ba?\xFAV[[a@\x95\x82a?`V[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_a@\xC2a@\xBD\x84a@rV[a@XV[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a@\xDEWa@\xDDa?\xF6V[[a@\xE9\x84\x82\x85a@\xA2V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aA\x05WaA\x04a?\xF2V[[\x815aA\x15\x84\x82` \x86\x01a@\xB0V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15aA4WaA3a=\x89V[[_aAA\x85\x82\x86\x01a?\xDEV[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aAbWaAaa=\x8DV[[aAn\x85\x82\x86\x01a@\xF1V[\x91PP\x92P\x92\x90PV[_\x81\x90P\x91\x90PV[aA\x8A\x81aAxV[\x82RPPV[_` \x82\x01\x90PaA\xA3_\x83\x01\x84aA\x81V[\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15aA\xBFWaA\xBEa=\x89V[[_aA\xCC\x85\x82\x86\x01a=\xB0V[\x92PP` aA\xDD\x85\x82\x86\x01a?\xDEV[\x91PP\x92P\x92\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aB\x01\x82a?\x1EV[aB\x0B\x81\x85aA\xE7V[\x93PaB\x1B\x81\x85` \x86\x01a?8V[aB$\x81a?`V[\x84\x01\x91PP\x92\x91PPV[_`\x80\x83\x01_\x83\x01Q\x84\x82\x03_\x86\x01RaBI\x82\x82aA\xF7V[\x91PP` \x83\x01QaB^` \x86\x01\x82a>HV[P`@\x83\x01QaBq`@\x86\x01\x82a>HV[P``\x83\x01Q\x84\x82\x03``\x86\x01RaB\x89\x82\x82aA\xF7V[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaB\xAE\x81\x84aB/V[\x90P\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[aB\xCA\x81aB\xB6V[\x82RPPV[_` \x82\x01\x90PaB\xE3_\x83\x01\x84aB\xC1V[\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[`\x08\x81\x10aC'WaC&aB\xE9V[[PV[_\x81\x90PaC7\x82aC\x16V[\x91\x90PV[_aCF\x82aC*V[\x90P\x91\x90PV[aCV\x81aCHV[P`@\x83\x01QaF\x85`@\x86\x01\x82a>HV[P``\x83\x01Q\x84\x82\x03``\x86\x01RaF\x9D\x82\x82aA\xF7V[\x91PP\x80\x91PP\x92\x91PPV[_aF\xB5\x83\x83aFCV[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aF\xD3\x82aF\x1AV[aF\xDD\x81\x85aF$V[\x93P\x83` \x82\x02\x85\x01aF\xEF\x85aF4V[\x80_[\x85\x81\x10\x15aG*W\x84\x84\x03\x89R\x81QaG\x0B\x85\x82aF\xAAV[\x94PaG\x16\x83aF\xBDV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaF\xF2V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_`\x80\x83\x01_\x83\x01QaGQ_\x86\x01\x82aE\xB9V[P` \x83\x01QaGd` \x86\x01\x82aE\xB9V[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaG|\x82\x82aE\xE2V[\x91PP``\x83\x01Q\x84\x82\x03``\x86\x01RaG\x96\x82\x82aF\xC9V[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaG\xBB\x81\x84aG\xF6V[aIo` \x83\x01\x84a>\xF6V[\x93\x92PPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\"`\x04R`$_\xFD[_`\x02\x82\x04\x90P`\x01\x82\x16\x80aI\xBAW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aI\xCDWaI\xCCaIvV[[P\x91\x90PV[aI\xDC\x81a>7V[\x82RPPV[_`@\x82\x01\x90PaI\xF5_\x83\x01\x85a>\xF6V[aJ\x02` \x83\x01\x84aI\xD3V[\x93\x92PPPV[_\x81Q\x90PaJ\x17\x81a?\xC8V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aJ2WaJ1a=\x89V[[_aJ?\x84\x82\x85\x01aJ\tV[\x91PP\x92\x91PPV[_` \x82\x01\x90PaJ[_\x83\x01\x84aI\xD3V[\x92\x91PPV[_aJo` \x84\x01\x84a=\xB0V[\x90P\x92\x91PPV[`@\x82\x01aJ\x87_\x83\x01\x83aJaV[aJ\x93_\x85\x01\x82aE\xB9V[PaJ\xA1` \x83\x01\x83aJaV[aJ\xAE` \x85\x01\x82aE\xB9V[PPPPV[_`\x80\x82\x01\x90P\x81\x81\x03_\x83\x01RaJ\xCC\x81\x86aG\xF6V[\x93\x92PPPV[_`@\x82\x01\x90PaK8_\x83\x01\x85a>\xF6V[aKE` \x83\x01\x84aCMV[\x93\x92PPPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aKg\x83\x85aKLV[\x93PaKt\x83\x85\x84a@\xA2V[aK}\x83a?`V[\x84\x01\x90P\x93\x92PPPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P\x91\x90PV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x835`\x01` \x03\x846\x03\x03\x81\x12aK\xC9WaK\xC8aK\xA9V[[\x83\x81\x01\x92P\x825\x91P` \x83\x01\x92Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aK\xF1WaK\xF0aK\xA1V[[`\x01\x82\x026\x03\x83\x13\x15aL\x07WaL\x06aK\xA5V[[P\x92P\x92\x90PV[_aL\x1A\x83\x85aA\xE7V[\x93PaL'\x83\x85\x84a@\xA2V[aL0\x83a?`V[\x84\x01\x90P\x93\x92PPPV[_aLI` \x84\x01\x84a?\xDEV[\x90P\x92\x91PPV[_`\x80\x83\x01aLb_\x84\x01\x84aK\xADV[\x85\x83\x03_\x87\x01RaLt\x83\x82\x84aL\x0FV[\x92PPPaL\x85` \x84\x01\x84aL;V[aL\x92` \x86\x01\x82a>HV[PaL\xA0`@\x84\x01\x84aL;V[aL\xAD`@\x86\x01\x82a>HV[PaL\xBB``\x84\x01\x84aK\xADV[\x85\x83\x03``\x87\x01RaL\xCE\x83\x82\x84aL\x0FV[\x92PPP\x80\x91PP\x92\x91PPV[_aL\xE7\x83\x83aLQV[\x90P\x92\x91PPV[_\x825`\x01`\x80\x03\x836\x03\x03\x81\x12aM\nWaM\taK\xA9V[[\x82\x81\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aM-\x83\x85aK\x88V[\x93P\x83` \x84\x02\x85\x01aM?\x84aK\x98V[\x80_[\x87\x81\x10\x15aM\x82W\x84\x84\x03\x89RaMY\x82\x84aL\xEFV[aMc\x85\x82aL\xDCV[\x94PaMn\x83aM\x16V[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaMBV[P\x82\x97P\x87\x94PPPPP\x93\x92PPPV[_`@\x82\x01\x90P\x81\x81\x03_\x83\x01RaM\xAD\x81\x86\x88aK\\V[\x90P\x81\x81\x03` \x83\x01RaM\xC2\x81\x84\x86aM\"V[\x90P\x95\x94PPPPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[aM\xE9\x81aM\xCDV[\x82RPPV[_` \x82\x01\x90PaN\x02_\x83\x01\x84aM\xE0V[\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[aN>\x81aAxV[\x81\x14aNHW_\x80\xFD[PV[_\x81Q\x90PaNY\x81aN5V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aNtWaNsa=\x89V[[_aN\x81\x84\x82\x85\x01aNKV[\x91PP\x92\x91PPV[_aN\x94\x82a=\x91V[\x91P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x03aN\xC6WaN\xC5aH\xEFV[[`\x01\x82\x01\x90P\x91\x90PV[_\x82\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_` `\x1F\x83\x01\x04\x90P\x91\x90PV[_\x82\x82\x1B\x90P\x92\x91PPV[_`\x08\x83\x02aO7\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82aN\xFCV[aOA\x86\x83aN\xFCV[\x95P\x80\x19\x84\x16\x93P\x80\x86\x16\x84\x17\x92PPP\x93\x92PPPV[_\x81\x90P\x91\x90PV[_aO|aOwaOr\x84a=\x91V[aOYV[a=\x91V[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[aO\x95\x83aObV[aO\xA9aO\xA1\x82aO\x83V[\x84\x84TaO\x08V[\x82UPPPPV[_\x90V[aO\xBDaO\xB1V[aO\xC8\x81\x84\x84aO\x8CV[PPPV[[\x81\x81\x10\x15aO\xEBWaO\xE0_\x82aO\xB5V[`\x01\x81\x01\x90PaO\xCEV[PPV[`\x1F\x82\x11\x15aP0WaP\x01\x81aN\xDBV[aP\n\x84aN\xEDV[\x81\x01` \x85\x10\x15aP\x19W\x81\x90P[aP-aP%\x85aN\xEDV[\x83\x01\x82aO\xCDV[PP[PPPV[_\x82\x82\x1C\x90P\x92\x91PPV[_aPP_\x19\x84`\x08\x02aP5V[\x19\x80\x83\x16\x91PP\x92\x91PPV[_aPh\x83\x83aPAV[\x91P\x82`\x02\x02\x82\x17\x90P\x92\x91PPV[aP\x82\x83\x83aN\xD1V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aP\x9BWaP\x9Aa?\xFAV[[aP\xA5\x82TaI\xA3V[aP\xB0\x82\x82\x85aO\xEFV[_`\x1F\x83\x11`\x01\x81\x14aP\xDDW_\x84\x15aP\xCBW\x82\x87\x015\x90P[aP\xD5\x85\x82aP]V[\x86UPaQ\xF6V[\x81\x81\x03` \x83\x01RaQ\xF6\x81\x84\x86aM\"V[\x90P\x94\x93PPPPV[_``\x82\x01\x90PaR\x13_\x83\x01\x87aI\xD3V[aR ` \x83\x01\x86a>\xF6V[\x81\x81\x03`@\x83\x01RaR3\x81\x84\x86aM\"V[\x90P\x95\x94PPPPPV[_\x80\x835`\x01` \x03\x846\x03\x03\x81\x12aRZWaRYaQrV[[\x80\x84\x01\x92P\x825\x91Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aR|WaR{aQvV[[` \x83\x01\x92P`\x01\x82\x026\x03\x83\x13\x15aR\x98WaR\x97aQzV[[P\x92P\x92\x90PV[_\x82\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[`\x1F\x82\x11\x15aR\xFDWaR\xCE\x81aR\xAAV[aR\xD7\x84aN\xEDV[\x81\x01` \x85\x10\x15aR\xE6W\x81\x90P[aR\xFAaR\xF2\x85aN\xEDV[\x83\x01\x82aO\xCDV[PP[PPPV[aS\x0C\x83\x83aR\xA0V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aS%WaS$a?\xFAV[[aS/\x82TaI\xA3V[aS:\x82\x82\x85aR\xBCV[_`\x1F\x83\x11`\x01\x81\x14aSgW_\x84\x15aSUW\x82\x87\x015\x90P[aS_\x85\x82aP]V[\x86UPaS\xC6V[`\x1F\x19\x84\x16aSu\x86aR\xAAV[_[\x82\x81\x10\x15aS\x9CW\x84\x89\x015\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90PaSwV[\x86\x83\x10\x15aS\xB9W\x84\x89\x015aS\xB5`\x1F\x89\x16\x82aPAV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPPV[aS\xDA\x83\x83\x83aS\x02V[PPPV[_\x815aS\xEB\x81a?\xC8V[\x80\x91PP\x91\x90PV[_\x81_\x1B\x90P\x91\x90PV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFFaT\x1E\x84aS\xF4V[\x93P\x80\x19\x83\x16\x92P\x80\x84\x16\x83\x17\x91PP\x92\x91PPV[_aTNaTIaTD\x84a>\x18V[aOYV[a>\x18V[\x90P\x91\x90PV[_aT_\x82aT4V[\x90P\x91\x90PV[_aTp\x82aTUV[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[aT\x89\x82aTfV[aT\x9CaT\x95\x82aTwV[\x83TaS\xFFV[\x82UPPPV[_\x81\x01_\x83\x01aT\xB3\x81\x85aR>V[aT\xBE\x81\x83\x86aS\xCFV[PPPP`\x01\x81\x01` \x83\x01\x80aT\xD4\x81aS\xDFV[\x90PaT\xE0\x81\x84aT\x80V[PPP`\x02\x81\x01`@\x83\x01\x80aT\xF5\x81aS\xDFV[\x90PaU\x01\x81\x84aT\x80V[PPP`\x03\x81\x01``\x83\x01aU\x16\x81\x85aR>V[aU!\x81\x83\x86aS\xCFV[PPPPPPV[aU3\x82\x82aT\xA3V[PPV[_\x81\x90P\x92\x91PPV[_aUK\x82aE\xC8V[aUU\x81\x85aU7V[\x93PaUe\x81\x85` \x86\x01a?8V[\x80\x84\x01\x91PP\x92\x91PPV[_aU|\x82\x84aUAV[\x91P\x81\x90P\x92\x91PPV", + ); + /// The runtime bytecode of the contract, as deployed on the network. + /// + /// ```text + ///0x60806040526004361061013f575f3560e01c8063991dc36d116100b5578063cac6a5a81161006e578063cac6a5a814610465578063cd8e993c1461048d578063cdbb5a82146104c9578063ecfb0b9414610505578063f88174ea1461052d578063fed9716b146105695761013f565b8063991dc36d14610347578063a1364d7914610371578063a9b4d07114610399578063ad3cb1cc146103d5578063b3f5403a146103ff578063be91187b1461043b5761013f565b80634f1ef286116101075780634f1ef2861461022557806352d1902d14610241578063820a91f81461026b5780638625e876146102a757806386dfc7de146102e3578063888b99e01461030b5761013f565b8063049f25ef14610143578063086e4e1c1461017f5780630d8e6e2c146101a95780633a5162e6146101d357806341618fe9146101e9575b5f80fd5b34801561014e575f80fd5b5061016960048036038101906101649190613dc4565b610593565b6040516101769190613ed6565b60405180910390f35b34801561018a575f80fd5b5061019361063d565b6040516101a09190613f05565b60405180910390f35b3480156101b4575f80fd5b506101bd610689565b6040516101ca9190613fa8565b60405180910390f35b3480156101de575f80fd5b506101e7610704565b005b3480156101f4575f80fd5b5061020f600480360381019061020a9190613dc4565b610882565b60405161021c9190613ed6565b60405180910390f35b61023f600480360381019061023a919061411e565b61092c565b005b34801561024c575f80fd5b5061025561094b565b6040516102629190614190565b60405180910390f35b348015610276575f80fd5b50610291600480360381019061028c91906141a9565b61097c565b60405161029e9190614296565b60405180910390f35b3480156102b2575f80fd5b506102cd60048036038101906102c891906141a9565b610c9c565b6040516102da91906142d0565b60405180910390f35b3480156102ee575f80fd5b5061030960048036038101906103049190613dc4565b610d73565b005b348015610316575f80fd5b50610331600480360381019061032c9190613dc4565b610f2f565b60405161033e919061435c565b60405180910390f35b348015610352575f80fd5b5061035b610f4f565b6040516103689190613f05565b60405180910390f35b34801561037c575f80fd5b5061039760048036038101906103929190614449565b610f9b565b005b3480156103a4575f80fd5b506103bf60048036038101906103ba9190613dc4565b61119d565b6040516103cc9190613f05565b60405180910390f35b3480156103e0575f80fd5b506103e961122c565b6040516103f69190613fa8565b60405180910390f35b34801561040a575f80fd5b5061042560048036038101906104209190613dc4565b611265565b6040516104329190613f05565b60405180910390f35b348015610446575f80fd5b5061044f6112f4565b60405161045c9190613f05565b60405180910390f35b348015610470575f80fd5b5061048b600480360381019061048691906144fd565b611340565b005b348015610498575f80fd5b506104b360048036038101906104ae9190613dc4565b6116fe565b6040516104c091906142d0565b60405180910390f35b3480156104d4575f80fd5b506104ef60048036038101906104ea91906141a9565b611788565b6040516104fc91906142d0565b60405180910390f35b348015610510575f80fd5b5061052b6004803603810190610526919061453b565b61185f565b005b348015610538575f80fd5b50610553600480360381019061054e9190613dc4565b611a3c565b6040516105609190613f05565b60405180910390f35b348015610574575f80fd5b5061057d611add565b60405161058a91906147a3565b60405180910390f35b60605f61059e611de8565b905080600a015f8481526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561063057602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116105e7575b5050505050915050919050565b5f80610647611e0f565b90505f8103610682576040517f21fb08f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8091505090565b60606040518060400160405280601381526020017f436f70726f636573736f72436f6e7465787473000000000000000000000000008152506106ca5f611e28565b6106d46001611e28565b6106dd5f611e28565b6040516020016106f09493929190614891565b604051602081830303815290604052905090565b5f61070d611de8565b90505f815f016002015490505f811415801561073c575081600d015f8281526020019081526020015f20544210155b15610806575f61074a610f4f565b90505f83600f015f8381526020019081526020015f20544261076c919061491c565b90508084600e015f8481526020019081526020015f2081905550610793845f018484611ef2565b7f3080f2b80dda4748ca2926a641fa5007735058dc5f5ab2594eeca74197a3accc82826040516107c492919061494f565b60405180910390a17f6c8c04c9fea337720b7dfadca365e850035114fd081b58d030afbe8b5dc3be71836040516107fb9190613f05565b60405180910390a150505b5f61080f611e0f565b90505f8114158015610834575082600e015f8281526020019081526020015f20544210155b1561087d57610845835f0182611f0b565b7f1baa08d8de18e8e2287691b1309748010981ebdfd12a173d8574657548a52898816040516108749190613f05565b60405180910390a15b505050565b60605f61088d611de8565b905080600c015f8481526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561091f57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116108d6575b5050505050915050919050565b610934611fd8565b61093d826120be565b61094782826121b1565b5050565b5f6109546122cf565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b610984613d08565b825f61098e611de8565b90505f816006015f8481526020019081526020015f205f0154036109e957816040517fabf9e7b00000000000000000000000000000000000000000000000000000000081526004016109e09190613f05565b60405180910390fd5b5f6109f2611de8565b90505f816008015f8881526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060800160405290815f82018054610a5d906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a89906149a3565b8015610ad45780601f10610aab57610100808354040283529160200191610ad4565b820191905f5260205f20905b815481529060010190602001808311610ab757829003601f168201915b50505050508152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382018054610b97906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc3906149a3565b8015610c0e5780601f10610be557610100808354040283529160200191610c0e565b820191905f5260205f20905b815481529060010190602001808311610bf157829003601f168201915b50505050508152505090505f73ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff1603610c8f5786866040517fc312e73e000000000000000000000000000000000000000000000000000000008152600401610c869291906149e2565b60405180910390fd5b8094505050505092915050565b5f825f610ca7611de8565b90505f816006015f8481526020019081526020015f205f015403610d0257816040517fabf9e7b0000000000000000000000000000000000000000000000000000000008152600401610cf99190613f05565b60405180910390fd5b5f610d0b611de8565b9050806009015f8781526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16935050505092915050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df49190614a1d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e6357336040517f0e56cf3d000000000000000000000000000000000000000000000000000000008152600401610e5a9190614a48565b60405180910390fd5b5f610e6c61063d565b90505f610e77612356565b90505f610e82611de8565b9050610e91815f018484611ef2565b5f8442610e9e919061491c565b90508082600e015f8581526020019081526020015f20819055507f3080f2b80dda4748ca2926a641fa5007735058dc5f5ab2594eeca74197a3accc8382604051610ee992919061494f565b60405180910390a17f6c8c04c9fea337720b7dfadca365e850035114fd081b58d030afbe8b5dc3be7184604051610f209190613f05565b60405180910390a15050505050565b5f80610f39611de8565b9050610f47815f018461236f565b915050919050565b5f80610f59612356565b90505f8103610f94576040517f046593ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8091505090565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ff8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101c9190614a1d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461108b57336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016110829190614a48565b60405180910390fd5b5f611094611de8565b90505f61109f611add565b90505f6110b2825f015189898989612397565b90507fbbb104c495886e5daa3efb6b281ec2840c69385af5cbfc1582fcf700de1ecd4b8282866040516110e793929190614ab4565b60405180910390a16110fe835f01825f0151612e8f565b61110d835f01825f0151612ff4565b5f845f01354261111d919061491c565b90508084600d015f845f015181526020019081526020015f2081905550846020013584600f015f855f015181526020019081526020015f20819055507f0425f54e602cbcf87fafd6a0b557fa5c4bc4bc6c251686255eb3bd775f452377828260405161118a929190614af7565b60405180910390a1505050505050505050565b5f815f6111a8611de8565b90505f816006015f8481526020019081526020015f205f01540361120357816040517fabf9e7b00000000000000000000000000000000000000000000000000000000081526004016111fa9190613f05565b60405180910390fd5b5f61120c611de8565b905080600e015f8681526020019081526020015f20549350505050919050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b5f815f611270611de8565b90505f816006015f8481526020019081526020015f205f0154036112cb57816040517fabf9e7b00000000000000000000000000000000000000000000000000000000081526004016112c29190613f05565b60405180910390fd5b5f6112d4611de8565b905080600d015f8681526020019081526020015f20549350505050919050565b5f806112fe6130ca565b90505f8103611339576040517fb9e861b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8091505090565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561139d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113c19190614a1d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461143057336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016114279190614a48565b60405180910390fd5b815f61143a611de8565b90505f816006015f8481526020019081526020015f205f01540361149557816040517fabf9e7b000000000000000000000000000000000000000000000000000000000815260040161148c9190613f05565b60405180910390fd5b5f61149e611de8565b9050600360078111156114b4576114b36142e9565b5b8460078111156114c7576114c66142e9565b5b0361155a575f6114d5610f4f565b90506114e4825f018783611ef2565b7f3080f2b80dda4748ca2926a641fa5007735058dc5f5ab2594eeca74197a3accc814260405161151592919061494f565b60405180910390a17f6c8c04c9fea337720b7dfadca365e850035114fd081b58d030afbe8b5dc3be718660405161154c9190613f05565b60405180910390a1506116f7565b6005600781111561156e5761156d6142e9565b5b846007811115611581576115806142e9565b5b036115ce57611592815f0186611f0b565b7f1baa08d8de18e8e2287691b1309748010981ebdfd12a173d8574657548a52898856040516115c19190613f05565b60405180910390a16116f6565b600660078111156115e2576115e16142e9565b5b8460078111156115f5576115f46142e9565b5b0361164257611606815f01866130e3565b7fee7ef83963417125d27430789fc6e94194381e82c3cda68260d0e7cfc31eaf21856040516116359190613f05565b60405180910390a16116f5565b600780811115611655576116546142e9565b5b846007811115611668576116676142e9565b5b036116b557611679815f018661326e565b7ff20b299804c9c1d6da3b82414c7aa0a845cdbabae2d90e46e360a379a77b7be5856040516116a89190613f05565b60405180910390a16116f4565b84846040517ff0bed68f0000000000000000000000000000000000000000000000000000000081526004016116eb929190614b25565b60405180910390fd5b5b5b5b5050505050565b5f815f611709611de8565b90505f816006015f8481526020019081526020015f205f01540361176457816040517fabf9e7b000000000000000000000000000000000000000000000000000000000815260040161175b9190613f05565b60405180910390fd5b61176c610f4f565b84148061177f575061177c611e0f565b84145b92505050919050565b5f825f611793611de8565b90505f816006015f8481526020019081526020015f205f0154036117ee57816040517fabf9e7b00000000000000000000000000000000000000000000000000000000081526004016117e59190613f05565b60405180910390fd5b5f6117f7611de8565b905080600b015f8781526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16935050505092915050565b60016118696133c2565b67ffffffffffffffff16146118aa576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f6118b56133e6565b9050805f0160089054906101000a900460ff16806118fd57508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15611934576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f6119875f88888888612397565b90505f611992611de8565b90506119a3815f01835f015161340d565b7fd474068ecf914caa04868493bcefa56bfb049a54f1612c2726d112e1e60663b9888888886040516119d89493929190614d94565b60405180910390a150505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d282604051611a2c9190614def565b60405180910390a1505050505050565b5f815f611a47611de8565b90505f816006015f8481526020019081526020015f205f015403611aa257816040517fabf9e7b0000000000000000000000000000000000000000000000000000000008152600401611a999190613f05565b60405180910390fd5b5f611aab611de8565b905060018082600a015f8881526020019081526020015f2080549050901c611ad3919061491c565b9350505050919050565b611ae5613d5a565b5f611aee610f4f565b90505f611af9611de8565b9050806006015f8381526020019081526020015f206040518060800160405290815f820154815260200160018201548152602001600282018054611b3c906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054611b68906149a3565b8015611bb35780601f10611b8a57610100808354040283529160200191611bb3565b820191905f5260205f20905b815481529060010190602001808311611b9657829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020015f905b82821015611dd9578382905f5260205f2090600402016040518060800160405290815f82018054611c10906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054611c3c906149a3565b8015611c875780601f10611c5e57610100808354040283529160200191611c87565b820191905f5260205f20905b815481529060010190602001808311611c6a57829003601f168201915b50505050508152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382018054611d4a906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d76906149a3565b8015611dc15780601f10611d9857610100808354040283529160200191611dc1565b820191905f5260205f20905b815481529060010190602001808311611da457829003601f168201915b50505050508152505081526020019060010190611be0565b50505050815250509250505090565b5f7f1da8a9a065a2f0a895c457065eddd3cf4a4d0d5340aaa0ca54d3cd5b4a6aaf00905090565b5f80611e19611de8565b9050805f016004015491505090565b60605f6001611e36846134db565b0190505f8167ffffffffffffffff811115611e5457611e53613ffa565b5b6040519080825280601f01601f191660200182016040528015611e865781602001600182028036833780820191505090505b5090505f82602001820190505b600115611ee7578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611edc57611edb614e08565b5b0494505f8503611e93575b819350505050919050565b611efc838261362c565b611f068383613702565b505050565b805f8103611f45576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f4f838361385a565b611f9057816040517f77bf5846000000000000000000000000000000000000000000000000000000008152600401611f879190613f05565b60405180910390fd5b6005835f015f8481526020019081526020015f205f6101000a81548160ff02191690836007811115611fc557611fc46142e9565b5b02179055505f8360040181905550505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148061208557507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661206c6138a9565b73ffffffffffffffffffffffffffffffffffffffff1614155b156120bc576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561211b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061213f9190614a1d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121ae57336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016121a59190614a48565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561221957506040513d601f19601f820116820180604052508101906122169190614e5f565b60015b61225a57816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016122519190614a48565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b81146122c057806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016122b79190614190565b60405180910390fd5b6122ca83836138fc565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614612354576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f80612360611de8565b9050805f016003015491505090565b5f825f015f8381526020019081526020015f205f9054906101000a900460ff16905092915050565b61239f613d5a565b5f83839050036123db576040517f8af082ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6123e4611de8565b9050806007015f8154809291906123fa90614e8a565b91905055505f8160070154905080826006015f8381526020019081526020015f205f018190555087826006015f8381526020019081526020015f20600101819055508686836006015f8481526020019081526020015f206002019182612461929190615078565b505f5b85859050811015612b9b575f73ffffffffffffffffffffffffffffffffffffffff1686868381811061249957612498615145565b5b90506020028101906124ab919061517e565b60200160208101906124bd91906151a5565b73ffffffffffffffffffffffffffffffffffffffff1603612519578086866040517f9edb7861000000000000000000000000000000000000000000000000000000008152600401612510939291906151d0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1686868381811061254357612542615145565b5b9050602002810190612555919061517e565b604001602081019061256791906151a5565b73ffffffffffffffffffffffffffffffffffffffff16036125c3578086866040517f4a6c59740000000000000000000000000000000000000000000000000000000081526004016125ba939291906151d0565b60405180910390fd5b826009015f8381526020019081526020015f205f8787848181106125ea576125e9615145565b5b90506020028101906125fc919061517e565b602001602081019061260e91906151a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156126d25785858281811061266c5761266b615145565b5b905060200281019061267e919061517e565b602001602081019061269091906151a5565b8187876040517f64d527590000000000000000000000000000000000000000000000000000000081526004016126c99493929190615200565b60405180910390fd5b82600b015f8381526020019081526020015f205f8787848181106126f9576126f8615145565b5b905060200281019061270b919061517e565b604001602081019061271d91906151a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156127e15785858281811061277b5761277a615145565b5b905060200281019061278d919061517e565b604001602081019061279f91906151a5565b8187876040517fc826e1a20000000000000000000000000000000000000000000000000000000081526004016127d89493929190615200565b60405180910390fd5b826006015f8381526020019081526020015f2060030186868381811061280a57612809615145565b5b905060200281019061281c919061517e565b908060018154018082558091505060019003905f5260205f2090600402015f90919091909150818161284e9190615529565b505085858281811061286357612862615145565b5b9050602002810190612875919061517e565b836008015f8481526020019081526020015f205f88888581811061289c5761289b615145565b5b90506020028101906128ae919061517e565b60200160208101906128c091906151a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081816129059190615529565b9050506001836009015f8481526020019081526020015f205f88888581811061293157612930615145565b5b9050602002810190612943919061517e565b602001602081019061295591906151a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555082600a015f8381526020019081526020015f208686838181106129ca576129c9615145565b5b90506020028101906129dc919061517e565b60200160208101906129ee91906151a5565b908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600183600b015f8481526020019081526020015f205f888885818110612a7457612a73615145565b5b9050602002810190612a86919061517e565b6040016020810190612a9891906151a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555082600c015f8381526020019081526020015f20868683818110612b0d57612b0c615145565b5b9050602002810190612b1f919061517e565b6040016020810190612b3191906151a5565b908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080600101915050612464565b50816006015f8281526020019081526020015f206040518060800160405290815f820154815260200160018201548152602001600282018054612bdd906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054612c09906149a3565b8015612c545780601f10612c2b57610100808354040283529160200191612c54565b820191905f5260205f20905b815481529060010190602001808311612c3757829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020015f905b82821015612e7a578382905f5260205f2090600402016040518060800160405290815f82018054612cb1906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054612cdd906149a3565b8015612d285780601f10612cff57610100808354040283529160200191612d28565b820191905f5260205f20905b815481529060010190602001808311612d0b57829003601f168201915b50505050508152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382018054612deb906149a3565b80601f0160208091040260200160405190810160405280929190818152602001828054612e17906149a3565b8015612e625780601f10612e3957610100808354040283529160200191612e62565b820191905f5260205f20905b815481529060010190602001808311612e4557829003601f168201915b50505050508152505081526020019060010190612c81565b50505050815250509250505095945050505050565b805f8103612ec9576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ed3838361396e565b612f1457816040517f6653f6d7000000000000000000000000000000000000000000000000000000008152600401612f0b9190613f05565b60405180910390fd5b5f836002015414612f605782600201546040517fc470c022000000000000000000000000000000000000000000000000000000008152600401612f579190613f05565b60405180910390fd5b5f836004015414612fac5782600401546040517f7022ec41000000000000000000000000000000000000000000000000000000008152600401612fa39190613f05565b60405180910390fd5b6001835f015f8481526020019081526020015f205f6101000a81548160ff02191690836007811115612fe157612fe06142e9565b5b0217905550818360010181905550505050565b805f810361302e576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61303883836139bc565b61307957816040517fc0b5ee660000000000000000000000000000000000000000000000000000000081526004016130709190613f05565b60405180910390fd5b6002835f015f8481526020019081526020015f205f6101000a81548160ff021916908360078111156130ae576130ad6142e9565b5b02179055508183600201819055505f8360010181905550505050565b5f806130d4611de8565b9050805f016002015491505090565b805f810361311d576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8282613129828261396e565b1561316b57806040517f61544cfc0000000000000000000000000000000000000000000000000000000081526004016131629190613f05565b60405180910390fd5b61317585856139bc565b156131b757836040517f0ddd14ca0000000000000000000000000000000000000000000000000000000081526004016131ae9190613f05565b60405180910390fd5b6131c18585613a0b565b1561320357836040517fcd494e490000000000000000000000000000000000000000000000000000000081526004016131fa9190613f05565b60405180910390fd5b6006855f015f8681526020019081526020015f205f6101000a81548160ff02191690836007811115613238576132376142e9565b5b021790555083856002015403613252575f85600201819055505b83856004015403613267575f85600401819055505b5050505050565b805f81036132a8576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82826132b4828261396e565b156132f657806040517f61544cfc0000000000000000000000000000000000000000000000000000000081526004016132ed9190613f05565b60405180910390fd5b6133008585613a0b565b1561334257836040517fcd494e490000000000000000000000000000000000000000000000000000000081526004016133399190613f05565b60405180910390fd5b6007855f015f8681526020019081526020015f205f6101000a81548160ff02191690836007811115613377576133766142e9565b5b021790555083856001015403613391575f85600101819055505b838560020154036133a6575f85600201819055505b838560040154036133bb575f85600401819055505b5050505050565b5f6133cb6133e6565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b805f8103613447576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8360030154146134935782600301546040517f7eea432b00000000000000000000000000000000000000000000000000000000815260040161348a9190613f05565b60405180910390fd5b6003835f015f8481526020019081526020015f205f6101000a81548160ff021916908360078111156134c8576134c76142e9565b5b0217905550818360030181905550505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613537577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161352d5761352c614e08565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613574576d04ee2d6d415b85acef8100000000838161356a57613569614e08565b5b0492506020810190505b662386f26fc1000083106135a357662386f26fc10000838161359957613598614e08565b5b0492506010810190505b6305f5e10083106135cc576305f5e10083816135c2576135c1614e08565b5b0492506008810190505b61271083106135f15761271083816135e7576135e6614e08565b5b0492506004810190505b60648310613614576064838161360a57613609614e08565b5b0492506002810190505b600a8310613623576001810190505b80915050919050565b805f8103613666576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6136708383613a0b565b6136b157816040517f331486b30000000000000000000000000000000000000000000000000000000081526004016136a89190613f05565b60405180910390fd5b6004835f015f8481526020019081526020015f205f6101000a81548160ff021916908360078111156136e6576136e56142e9565b5b02179055508183600401819055505f8360030181905550505050565b805f810361373c576040517fcb17b7a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6137468383613a5a565b15801561375a5750613758838361385a565b155b1561379c57816040517f12b49e3d0000000000000000000000000000000000000000000000000000000081526004016137939190613f05565b60405180910390fd5b5f8360030154146137e85782600301546040517f7eea432b0000000000000000000000000000000000000000000000000000000081526004016137df9190613f05565b60405180910390fd5b6003835f015f8481526020019081526020015f205f6101000a81548160ff0219169083600781111561381d5761381c6142e9565b5b021790555081836003018190555081836002015403613840575f83600201819055505b81836004015403613855575f83600401819055505b505050565b5f6004600781111561386f5761386e6142e9565b5b835f015f8481526020019081526020015f205f9054906101000a900460ff1660078111156138a05761389f6142e9565b5b14905092915050565b5f6138d57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613aa9565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61390582613ab2565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156139615761395b8282613b7b565b5061396a565b613969613bfb565b5b5050565b5f806007811115613982576139816142e9565b5b835f015f8481526020019081526020015f205f9054906101000a900460ff1660078111156139b3576139b26142e9565b5b14905092915050565b5f600160078111156139d1576139d06142e9565b5b835f015f8481526020019081526020015f205f9054906101000a900460ff166007811115613a0257613a016142e9565b5b14905092915050565b5f60036007811115613a2057613a1f6142e9565b5b835f015f8481526020019081526020015f205f9054906101000a900460ff166007811115613a5157613a506142e9565b5b14905092915050565b5f60026007811115613a6f57613a6e6142e9565b5b835f015f8481526020019081526020015f205f9054906101000a900460ff166007811115613aa057613a9f6142e9565b5b14905092915050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03613b0d57806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401613b049190614a48565b60405180910390fd5b80613b397f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613aa9565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051613ba49190615571565b5f60405180830381855af49150503d805f8114613bdc576040519150601f19603f3d011682016040523d82523d5f602084013e613be1565b606091505b5091509150613bf1858383613c37565b9250505092915050565b5f341115613c35576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b606082613c4c57613c4782613cc4565b613cbc565b5f8251148015613c7257505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15613cb457836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401613cab9190614a48565b60405180910390fd5b819050613cbd565b5b9392505050565b5f81511115613cd65780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060800160405280606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b60405180608001604052805f81526020015f815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b613da381613d91565b8114613dad575f80fd5b50565b5f81359050613dbe81613d9a565b92915050565b5f60208284031215613dd957613dd8613d89565b5b5f613de684828501613db0565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e4182613e18565b9050919050565b613e5181613e37565b82525050565b5f613e628383613e48565b60208301905092915050565b5f602082019050919050565b5f613e8482613def565b613e8e8185613df9565b9350613e9983613e09565b805f5b83811015613ec9578151613eb08882613e57565b9750613ebb83613e6e565b925050600181019050613e9c565b5085935050505092915050565b5f6020820190508181035f830152613eee8184613e7a565b905092915050565b613eff81613d91565b82525050565b5f602082019050613f185f830184613ef6565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613f55578082015181840152602081019050613f3a565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613f7a82613f1e565b613f848185613f28565b9350613f94818560208601613f38565b613f9d81613f60565b840191505092915050565b5f6020820190508181035f830152613fc08184613f70565b905092915050565b613fd181613e37565b8114613fdb575f80fd5b50565b5f81359050613fec81613fc8565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61403082613f60565b810181811067ffffffffffffffff8211171561404f5761404e613ffa565b5b80604052505050565b5f614061613d80565b905061406d8282614027565b919050565b5f67ffffffffffffffff82111561408c5761408b613ffa565b5b61409582613f60565b9050602081019050919050565b828183375f83830152505050565b5f6140c26140bd84614072565b614058565b9050828152602081018484840111156140de576140dd613ff6565b5b6140e98482856140a2565b509392505050565b5f82601f83011261410557614104613ff2565b5b81356141158482602086016140b0565b91505092915050565b5f806040838503121561413457614133613d89565b5b5f61414185828601613fde565b925050602083013567ffffffffffffffff81111561416257614161613d8d565b5b61416e858286016140f1565b9150509250929050565b5f819050919050565b61418a81614178565b82525050565b5f6020820190506141a35f830184614181565b92915050565b5f80604083850312156141bf576141be613d89565b5b5f6141cc85828601613db0565b92505060206141dd85828601613fde565b9150509250929050565b5f82825260208201905092915050565b5f61420182613f1e565b61420b81856141e7565b935061421b818560208601613f38565b61422481613f60565b840191505092915050565b5f608083015f8301518482035f86015261424982826141f7565b915050602083015161425e6020860182613e48565b5060408301516142716040860182613e48565b506060830151848203606086015261428982826141f7565b9150508091505092915050565b5f6020820190508181035f8301526142ae818461422f565b905092915050565b5f8115159050919050565b6142ca816142b6565b82525050565b5f6020820190506142e35f8301846142c1565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60088110614327576143266142e9565b5b50565b5f81905061433782614316565b919050565b5f6143468261432a565b9050919050565b6143568161433c565b82525050565b5f60208201905061436f5f83018461434d565b92915050565b5f80fd5b5f80fd5b5f8083601f84011261439257614391613ff2565b5b8235905067ffffffffffffffff8111156143af576143ae614375565b5b6020830191508360018202830111156143cb576143ca614379565b5b9250929050565b5f8083601f8401126143e7576143e6613ff2565b5b8235905067ffffffffffffffff81111561440457614403614375565b5b6020830191508360208202830111156144205761441f614379565b5b9250929050565b5f80fd5b5f604082840312156144405761443f614427565b5b81905092915050565b5f805f805f6080868803121561446257614461613d89565b5b5f86013567ffffffffffffffff81111561447f5761447e613d8d565b5b61448b8882890161437d565b9550955050602086013567ffffffffffffffff8111156144ae576144ad613d8d565b5b6144ba888289016143d2565b935093505060406144cd8882890161442b565b9150509295509295909350565b600881106144e6575f80fd5b50565b5f813590506144f7816144da565b92915050565b5f806040838503121561451357614512613d89565b5b5f61452085828601613db0565b9250506020614531858286016144e9565b9150509250929050565b5f805f806040858703121561455357614552613d89565b5b5f85013567ffffffffffffffff8111156145705761456f613d8d565b5b61457c8782880161437d565b9450945050602085013567ffffffffffffffff81111561459f5761459e613d8d565b5b6145ab878288016143d2565b925092505092959194509250565b6145c281613d91565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f6145ec826145c8565b6145f681856145d2565b9350614606818560208601613f38565b61460f81613f60565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f608083015f8301518482035f86015261465d82826141f7565b91505060208301516146726020860182613e48565b5060408301516146856040860182613e48565b506060830151848203606086015261469d82826141f7565b9150508091505092915050565b5f6146b58383614643565b905092915050565b5f602082019050919050565b5f6146d38261461a565b6146dd8185614624565b9350836020820285016146ef85614634565b805f5b8581101561472a578484038952815161470b85826146aa565b9450614716836146bd565b925060208a019950506001810190506146f2565b50829750879550505050505092915050565b5f608083015f8301516147515f8601826145b9565b50602083015161476460208601826145b9565b506040830151848203604086015261477c82826145e2565b9150506060830151848203606086015261479682826146c9565b9150508091505092915050565b5f6020820190508181035f8301526147bb818461473c565b905092915050565b5f81905092915050565b5f6147d782613f1e565b6147e181856147c3565b93506147f1818560208601613f38565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f6148316002836147c3565b915061483c826147fd565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61487b6001836147c3565b915061488682614847565b600182019050919050565b5f61489c82876147cd565b91506148a782614825565b91506148b382866147cd565b91506148be8261486f565b91506148ca82856147cd565b91506148d58261486f565b91506148e182846147cd565b915081905095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61492682613d91565b915061493183613d91565b9250828201905080821115614949576149486148ef565b5b92915050565b5f6040820190506149625f830185613ef6565b61496f6020830184613ef6565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806149ba57607f821691505b6020821081036149cd576149cc614976565b5b50919050565b6149dc81613e37565b82525050565b5f6040820190506149f55f830185613ef6565b614a0260208301846149d3565b9392505050565b5f81519050614a1781613fc8565b92915050565b5f60208284031215614a3257614a31613d89565b5b5f614a3f84828501614a09565b91505092915050565b5f602082019050614a5b5f8301846149d3565b92915050565b5f614a6f6020840184613db0565b905092915050565b60408201614a875f830183614a61565b614a935f8501826145b9565b50614aa16020830183614a61565b614aae60208501826145b9565b50505050565b5f6080820190508181035f830152614acc818661473c565b90508181036020830152614ae0818561473c565b9050614aef6040830184614a77565b949350505050565b5f6040820190508181035f830152614b0f818561473c565b9050614b1e6020830184613ef6565b9392505050565b5f604082019050614b385f830185613ef6565b614b45602083018461434d565b9392505050565b5f82825260208201905092915050565b5f614b678385614b4c565b9350614b748385846140a2565b614b7d83613f60565b840190509392505050565b5f82825260208201905092915050565b5f819050919050565b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112614bc957614bc8614ba9565b5b83810192508235915060208301925067ffffffffffffffff821115614bf157614bf0614ba1565b5b600182023603831315614c0757614c06614ba5565b5b509250929050565b5f614c1a83856141e7565b9350614c278385846140a2565b614c3083613f60565b840190509392505050565b5f614c496020840184613fde565b905092915050565b5f60808301614c625f840184614bad565b8583035f870152614c74838284614c0f565b92505050614c856020840184614c3b565b614c926020860182613e48565b50614ca06040840184614c3b565b614cad6040860182613e48565b50614cbb6060840184614bad565b8583036060870152614cce838284614c0f565b925050508091505092915050565b5f614ce78383614c51565b905092915050565b5f82356001608003833603038112614d0a57614d09614ba9565b5b82810191505092915050565b5f602082019050919050565b5f614d2d8385614b88565b935083602084028501614d3f84614b98565b805f5b87811015614d82578484038952614d598284614cef565b614d638582614cdc565b9450614d6e83614d16565b925060208a01995050600181019050614d42565b50829750879450505050509392505050565b5f6040820190508181035f830152614dad818688614b5c565b90508181036020830152614dc2818486614d22565b905095945050505050565b5f67ffffffffffffffff82169050919050565b614de981614dcd565b82525050565b5f602082019050614e025f830184614de0565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b614e3e81614178565b8114614e48575f80fd5b50565b5f81519050614e5981614e35565b92915050565b5f60208284031215614e7457614e73613d89565b5b5f614e8184828501614e4b565b91505092915050565b5f614e9482613d91565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614ec657614ec56148ef565b5b600182019050919050565b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614efc565b614f418683614efc565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614f7c614f77614f7284613d91565b614f59565b613d91565b9050919050565b5f819050919050565b614f9583614f62565b614fa9614fa182614f83565b848454614f08565b825550505050565b5f90565b614fbd614fb1565b614fc8818484614f8c565b505050565b5b81811015614feb57614fe05f82614fb5565b600181019050614fce565b5050565b601f8211156150305761500181614edb565b61500a84614eed565b81016020851015615019578190505b61502d61502585614eed565b830182614fcd565b50505b505050565b5f82821c905092915050565b5f6150505f1984600802615035565b1980831691505092915050565b5f6150688383615041565b9150826002028217905092915050565b6150828383614ed1565b67ffffffffffffffff81111561509b5761509a613ffa565b5b6150a582546149a3565b6150b0828285614fef565b5f601f8311600181146150dd575f84156150cb578287013590505b6150d5858261505d565b86555061513c565b601f1984166150eb86614edb565b5f5b82811015615112578489013582556001820191506020850194506020810190506150ed565b8683101561512f578489013561512b601f891682615041565b8355505b6001600288020188555050505b50505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f8235600160800383360303811261519957615198615172565b5b80830191505092915050565b5f602082840312156151ba576151b9613d89565b5b5f6151c784828501613fde565b91505092915050565b5f6040820190506151e35f830186613ef6565b81810360208301526151f6818486614d22565b9050949350505050565b5f6060820190506152135f8301876149d3565b6152206020830186613ef6565b8181036040830152615233818486614d22565b905095945050505050565b5f808335600160200384360303811261525a57615259615172565b5b80840192508235915067ffffffffffffffff82111561527c5761527b615176565b5b6020830192506001820236038313156152985761529761517a565b5b509250929050565b5f82905092915050565b5f819050815f5260205f209050919050565b601f8211156152fd576152ce816152aa565b6152d784614eed565b810160208510156152e6578190505b6152fa6152f285614eed565b830182614fcd565b50505b505050565b61530c83836152a0565b67ffffffffffffffff81111561532557615324613ffa565b5b61532f82546149a3565b61533a8282856152bc565b5f601f831160018114615367575f8415615355578287013590505b61535f858261505d565b8655506153c6565b601f198416615375866152aa565b5f5b8281101561539c57848901358255600182019150602085019450602081019050615377565b868310156153b957848901356153b5601f891682615041565b8355505b6001600288020188555050505b50505050505050565b6153da838383615302565b505050565b5f81356153eb81613fc8565b80915050919050565b5f815f1b9050919050565b5f73ffffffffffffffffffffffffffffffffffffffff61541e846153f4565b9350801983169250808416831791505092915050565b5f61544e61544961544484613e18565b614f59565b613e18565b9050919050565b5f61545f82615434565b9050919050565b5f61547082615455565b9050919050565b5f819050919050565b61548982615466565b61549c61549582615477565b83546153ff565b8255505050565b5f81015f83016154b3818561523e565b6154be8183866153cf565b505050506001810160208301806154d4816153df565b90506154e08184615480565b5050506002810160408301806154f5816153df565b90506155018184615480565b5050506003810160608301615516818561523e565b6155218183866153cf565b505050505050565b61553382826154a3565b5050565b5f81905092915050565b5f61554b826145c8565b6155558185615537565b9350615565818560208601613f38565b80840191505092915050565b5f61557c8284615541565b91508190509291505056 + /// ``` + #[rustfmt::skip] + #[allow(clippy::all)] + pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( + b"`\x80`@R`\x046\x10a\x01?W_5`\xE0\x1C\x80c\x99\x1D\xC3m\x11a\0\xB5W\x80c\xCA\xC6\xA5\xA8\x11a\0nW\x80c\xCA\xC6\xA5\xA8\x14a\x04eW\x80c\xCD\x8E\x99<\x14a\x04\x8DW\x80c\xCD\xBBZ\x82\x14a\x04\xC9W\x80c\xEC\xFB\x0B\x94\x14a\x05\x05W\x80c\xF8\x81t\xEA\x14a\x05-W\x80c\xFE\xD9qk\x14a\x05iWa\x01?V[\x80c\x99\x1D\xC3m\x14a\x03GW\x80c\xA16My\x14a\x03qW\x80c\xA9\xB4\xD0q\x14a\x03\x99W\x80c\xAD<\xB1\xCC\x14a\x03\xD5W\x80c\xB3\xF5@:\x14a\x03\xFFW\x80c\xBE\x91\x18{\x14a\x04;Wa\x01?V[\x80cO\x1E\xF2\x86\x11a\x01\x07W\x80cO\x1E\xF2\x86\x14a\x02%W\x80cR\xD1\x90-\x14a\x02AW\x80c\x82\n\x91\xF8\x14a\x02kW\x80c\x86%\xE8v\x14a\x02\xA7W\x80c\x86\xDF\xC7\xDE\x14a\x02\xE3W\x80c\x88\x8B\x99\xE0\x14a\x03\x0BWa\x01?V[\x80c\x04\x9F%\xEF\x14a\x01CW\x80c\x08nN\x1C\x14a\x01\x7FW\x80c\r\x8En,\x14a\x01\xA9W\x80c:Qb\xE6\x14a\x01\xD3W\x80cAa\x8F\xE9\x14a\x01\xE9W[_\x80\xFD[4\x80\x15a\x01NW_\x80\xFD[Pa\x01i`\x04\x806\x03\x81\x01\x90a\x01d\x91\x90a=\xC4V[a\x05\x93V[`@Qa\x01v\x91\x90a>\xD6V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x8AW_\x80\xFD[Pa\x01\x93a\x06=V[`@Qa\x01\xA0\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xB4W_\x80\xFD[Pa\x01\xBDa\x06\x89V[`@Qa\x01\xCA\x91\x90a?\xA8V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xDEW_\x80\xFD[Pa\x01\xE7a\x07\x04V[\0[4\x80\x15a\x01\xF4W_\x80\xFD[Pa\x02\x0F`\x04\x806\x03\x81\x01\x90a\x02\n\x91\x90a=\xC4V[a\x08\x82V[`@Qa\x02\x1C\x91\x90a>\xD6V[`@Q\x80\x91\x03\x90\xF3[a\x02?`\x04\x806\x03\x81\x01\x90a\x02:\x91\x90aA\x1EV[a\t,V[\0[4\x80\x15a\x02LW_\x80\xFD[Pa\x02Ua\tKV[`@Qa\x02b\x91\x90aA\x90V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02vW_\x80\xFD[Pa\x02\x91`\x04\x806\x03\x81\x01\x90a\x02\x8C\x91\x90aA\xA9V[a\t|V[`@Qa\x02\x9E\x91\x90aB\x96V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xB2W_\x80\xFD[Pa\x02\xCD`\x04\x806\x03\x81\x01\x90a\x02\xC8\x91\x90aA\xA9V[a\x0C\x9CV[`@Qa\x02\xDA\x91\x90aB\xD0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xEEW_\x80\xFD[Pa\x03\t`\x04\x806\x03\x81\x01\x90a\x03\x04\x91\x90a=\xC4V[a\rsV[\0[4\x80\x15a\x03\x16W_\x80\xFD[Pa\x031`\x04\x806\x03\x81\x01\x90a\x03,\x91\x90a=\xC4V[a\x0F/V[`@Qa\x03>\x91\x90aC\\V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03RW_\x80\xFD[Pa\x03[a\x0FOV[`@Qa\x03h\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03|W_\x80\xFD[Pa\x03\x97`\x04\x806\x03\x81\x01\x90a\x03\x92\x91\x90aDIV[a\x0F\x9BV[\0[4\x80\x15a\x03\xA4W_\x80\xFD[Pa\x03\xBF`\x04\x806\x03\x81\x01\x90a\x03\xBA\x91\x90a=\xC4V[a\x11\x9DV[`@Qa\x03\xCC\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03\xE0W_\x80\xFD[Pa\x03\xE9a\x12,V[`@Qa\x03\xF6\x91\x90a?\xA8V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x04\nW_\x80\xFD[Pa\x04%`\x04\x806\x03\x81\x01\x90a\x04 \x91\x90a=\xC4V[a\x12eV[`@Qa\x042\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x04FW_\x80\xFD[Pa\x04Oa\x12\xF4V[`@Qa\x04\\\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x04pW_\x80\xFD[Pa\x04\x8B`\x04\x806\x03\x81\x01\x90a\x04\x86\x91\x90aD\xFDV[a\x13@V[\0[4\x80\x15a\x04\x98W_\x80\xFD[Pa\x04\xB3`\x04\x806\x03\x81\x01\x90a\x04\xAE\x91\x90a=\xC4V[a\x16\xFEV[`@Qa\x04\xC0\x91\x90aB\xD0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x04\xD4W_\x80\xFD[Pa\x04\xEF`\x04\x806\x03\x81\x01\x90a\x04\xEA\x91\x90aA\xA9V[a\x17\x88V[`@Qa\x04\xFC\x91\x90aB\xD0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x05\x10W_\x80\xFD[Pa\x05+`\x04\x806\x03\x81\x01\x90a\x05&\x91\x90aE;V[a\x18_V[\0[4\x80\x15a\x058W_\x80\xFD[Pa\x05S`\x04\x806\x03\x81\x01\x90a\x05N\x91\x90a=\xC4V[a\x1A v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[a\t\x84a=\x08V[\x82_a\t\x8Ea\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\t\xE9W\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\t\xE0\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_a\t\xF2a\x1D\xE8V[\x90P_\x81`\x08\x01_\x88\x81R` \x01\x90\x81R` \x01_ _\x87s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ `@Q\x80`\x80\x01`@R\x90\x81_\x82\x01\x80Ta\n]\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\n\x89\x90aI\xA3V[\x80\x15a\n\xD4W\x80`\x1F\x10a\n\xABWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\n\xD4V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\n\xB7W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x03\x82\x01\x80Ta\x0B\x97\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x0B\xC3\x90aI\xA3V[\x80\x15a\x0C\x0EW\x80`\x1F\x10a\x0B\xE5Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x0C\x0EV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x0B\xF1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a\x0C\x8FW\x86\x86`@Q\x7F\xC3\x12\xE7>\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0C\x86\x92\x91\x90aI\xE2V[`@Q\x80\x91\x03\x90\xFD[\x80\x94PPPPP\x92\x91PPV[_\x82_a\x0C\xA7a\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\r\x02W\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0C\xF9\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_a\r\x0Ba\x1D\xE8V[\x90P\x80`\t\x01_\x87\x81R` \x01\x90\x81R` \x01_ _\x86s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x93PPPP\x92\x91PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\xD0W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\r\xF4\x91\x90aJ\x1DV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x0EcW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0EZ\x91\x90aJHV[`@Q\x80\x91\x03\x90\xFD[_a\x0Ela\x06=V[\x90P_a\x0Ewa#VV[\x90P_a\x0E\x82a\x1D\xE8V[\x90Pa\x0E\x91\x81_\x01\x84\x84a\x1E\xF2V[_\x84Ba\x0E\x9E\x91\x90aI\x1CV[\x90P\x80\x82`\x0E\x01_\x85\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x7F0\x80\xF2\xB8\r\xDAGH\xCA)&\xA6A\xFAP\x07sPX\xDC_Z\xB2YN\xEC\xA7A\x97\xA3\xAC\xCC\x83\x82`@Qa\x0E\xE9\x92\x91\x90aIOV[`@Q\x80\x91\x03\x90\xA1\x7Fl\x8C\x04\xC9\xFE\xA37r\x0B}\xFA\xDC\xA3e\xE8P\x03Q\x14\xFD\x08\x1BX\xD00\xAF\xBE\x8B]\xC3\xBEq\x84`@Qa\x0F \x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xA1PPPPPV[_\x80a\x0F9a\x1D\xE8V[\x90Pa\x0FG\x81_\x01\x84a#oV[\x91PP\x91\x90PV[_\x80a\x0FYa#VV[\x90P_\x81\x03a\x0F\x94W`@Q\x7F\x04e\x93\xEA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x91PP\x90V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0F\xF8W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x10\x1C\x91\x90aJ\x1DV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x10\x8BW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x10\x82\x91\x90aJHV[`@Q\x80\x91\x03\x90\xFD[_a\x10\x94a\x1D\xE8V[\x90P_a\x10\x9Fa\x1A\xDDV[\x90P_a\x10\xB2\x82_\x01Q\x89\x89\x89\x89a#\x97V[\x90P\x7F\xBB\xB1\x04\xC4\x95\x88n]\xAA>\xFBk(\x1E\xC2\x84\x0Ci8Z\xF5\xCB\xFC\x15\x82\xFC\xF7\0\xDE\x1E\xCDK\x82\x82\x86`@Qa\x10\xE7\x93\x92\x91\x90aJ\xB4V[`@Q\x80\x91\x03\x90\xA1a\x10\xFE\x83_\x01\x82_\x01Qa.\x8FV[a\x11\r\x83_\x01\x82_\x01Qa/\xF4V[_\x84_\x015Ba\x11\x1D\x91\x90aI\x1CV[\x90P\x80\x84`\r\x01_\x84_\x01Q\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x84` \x015\x84`\x0F\x01_\x85_\x01Q\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x7F\x04%\xF5N`,\xBC\xF8\x7F\xAF\xD6\xA0\xB5W\xFA\\K\xC4\xBCl%\x16\x86%^\xB3\xBDw_E#w\x82\x82`@Qa\x11\x8A\x92\x91\x90aJ\xF7V[`@Q\x80\x91\x03\x90\xA1PPPPPPPPPV[_\x81_a\x11\xA8a\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\x12\x03W\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x11\xFA\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_a\x12\x0Ca\x1D\xE8V[\x90P\x80`\x0E\x01_\x86\x81R` \x01\x90\x81R` \x01_ T\x93PPPP\x91\x90PV[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[_\x81_a\x12pa\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\x12\xCBW\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x12\xC2\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_a\x12\xD4a\x1D\xE8V[\x90P\x80`\r\x01_\x86\x81R` \x01\x90\x81R` \x01_ T\x93PPPP\x91\x90PV[_\x80a\x12\xFEa0\xCAV[\x90P_\x81\x03a\x139W`@Q\x7F\xB9\xE8a\xB2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x91PP\x90V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x13\x9DW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\xC1\x91\x90aJ\x1DV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x140W3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14'\x91\x90aJHV[`@Q\x80\x91\x03\x90\xFD[\x81_a\x14:a\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\x14\x95W\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14\x8C\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_a\x14\x9Ea\x1D\xE8V[\x90P`\x03`\x07\x81\x11\x15a\x14\xB4Wa\x14\xB3aB\xE9V[[\x84`\x07\x81\x11\x15a\x14\xC7Wa\x14\xC6aB\xE9V[[\x03a\x15ZW_a\x14\xD5a\x0FOV[\x90Pa\x14\xE4\x82_\x01\x87\x83a\x1E\xF2V[\x7F0\x80\xF2\xB8\r\xDAGH\xCA)&\xA6A\xFAP\x07sPX\xDC_Z\xB2YN\xEC\xA7A\x97\xA3\xAC\xCC\x81B`@Qa\x15\x15\x92\x91\x90aIOV[`@Q\x80\x91\x03\x90\xA1\x7Fl\x8C\x04\xC9\xFE\xA37r\x0B}\xFA\xDC\xA3e\xE8P\x03Q\x14\xFD\x08\x1BX\xD00\xAF\xBE\x8B]\xC3\xBEq\x86`@Qa\x15L\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xA1Pa\x16\xF7V[`\x05`\x07\x81\x11\x15a\x15nWa\x15maB\xE9V[[\x84`\x07\x81\x11\x15a\x15\x81Wa\x15\x80aB\xE9V[[\x03a\x15\xCEWa\x15\x92\x81_\x01\x86a\x1F\x0BV[\x7F\x1B\xAA\x08\xD8\xDE\x18\xE8\xE2(v\x91\xB10\x97H\x01\t\x81\xEB\xDF\xD1*\x17=\x85teuH\xA5(\x98\x85`@Qa\x15\xC1\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xA1a\x16\xF6V[`\x06`\x07\x81\x11\x15a\x15\xE2Wa\x15\xE1aB\xE9V[[\x84`\x07\x81\x11\x15a\x15\xF5Wa\x15\xF4aB\xE9V[[\x03a\x16BWa\x16\x06\x81_\x01\x86a0\xE3V[\x7F\xEE~\xF89cAq%\xD2t0x\x9F\xC6\xE9A\x948\x1E\x82\xC3\xCD\xA6\x82`\xD0\xE7\xCF\xC3\x1E\xAF!\x85`@Qa\x165\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xA1a\x16\xF5V[`\x07\x80\x81\x11\x15a\x16UWa\x16TaB\xE9V[[\x84`\x07\x81\x11\x15a\x16hWa\x16gaB\xE9V[[\x03a\x16\xB5Wa\x16y\x81_\x01\x86a2nV[\x7F\xF2\x0B)\x98\x04\xC9\xC1\xD6\xDA;\x82ALz\xA0\xA8E\xCD\xBA\xBA\xE2\xD9\x0EF\xE3`\xA3y\xA7{{\xE5\x85`@Qa\x16\xA8\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xA1a\x16\xF4V[\x84\x84`@Q\x7F\xF0\xBE\xD6\x8F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x16\xEB\x92\x91\x90aK%V[`@Q\x80\x91\x03\x90\xFD[[[[PPPPPV[_\x81_a\x17\ta\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\x17dW\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x17[\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[a\x17la\x0FOV[\x84\x14\x80a\x17\x7FWPa\x17|a\x1E\x0FV[\x84\x14[\x92PPP\x91\x90PV[_\x82_a\x17\x93a\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\x17\xEEW\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x17\xE5\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_a\x17\xF7a\x1D\xE8V[\x90P\x80`\x0B\x01_\x87\x81R` \x01\x90\x81R` \x01_ _\x86s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x93PPPP\x92\x91PPV[`\x01a\x18ia3\xC2V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x18\xAAW`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02_a\x18\xB5a3\xE6V[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x18\xFDWP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x194W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_a\x19\x87_\x88\x88\x88\x88a#\x97V[\x90P_a\x19\x92a\x1D\xE8V[\x90Pa\x19\xA3\x81_\x01\x83_\x01Qa4\rV[\x7F\xD4t\x06\x8E\xCF\x91L\xAA\x04\x86\x84\x93\xBC\xEF\xA5k\xFB\x04\x9AT\xF1a,'&\xD1\x12\xE1\xE6\x06c\xB9\x88\x88\x88\x88`@Qa\x19\xD8\x94\x93\x92\x91\x90aM\x94V[`@Q\x80\x91\x03\x90\xA1PP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x1A,\x91\x90aM\xEFV[`@Q\x80\x91\x03\x90\xA1PPPPPPV[_\x81_a\x1AGa\x1D\xE8V[\x90P_\x81`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x01T\x03a\x1A\xA2W\x81`@Q\x7F\xAB\xF9\xE7\xB0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1A\x99\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_a\x1A\xABa\x1D\xE8V[\x90P`\x01\x80\x82`\n\x01_\x88\x81R` \x01\x90\x81R` \x01_ \x80T\x90P\x90\x1Ca\x1A\xD3\x91\x90aI\x1CV[\x93PPPP\x91\x90PV[a\x1A\xE5a=ZV[_a\x1A\xEEa\x0FOV[\x90P_a\x1A\xF9a\x1D\xE8V[\x90P\x80`\x06\x01_\x83\x81R` \x01\x90\x81R` \x01_ `@Q\x80`\x80\x01`@R\x90\x81_\x82\x01T\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01\x80Ta\x1B<\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1Bh\x90aI\xA3V[\x80\x15a\x1B\xB3W\x80`\x1F\x10a\x1B\x8AWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1B\xB3V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1B\x96W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x03\x82\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01_\x90[\x82\x82\x10\x15a\x1D\xD9W\x83\x82\x90_R` _ \x90`\x04\x02\x01`@Q\x80`\x80\x01`@R\x90\x81_\x82\x01\x80Ta\x1C\x10\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1C<\x90aI\xA3V[\x80\x15a\x1C\x87W\x80`\x1F\x10a\x1C^Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1C\x87V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1CjW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x03\x82\x01\x80Ta\x1DJ\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1Dv\x90aI\xA3V[\x80\x15a\x1D\xC1W\x80`\x1F\x10a\x1D\x98Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1D\xC1V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1D\xA4W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x81R` \x01\x90`\x01\x01\x90a\x1B\xE0V[PPPP\x81RPP\x92PPP\x90V[_\x7F\x1D\xA8\xA9\xA0e\xA2\xF0\xA8\x95\xC4W\x06^\xDD\xD3\xCFJM\rS@\xAA\xA0\xCAT\xD3\xCD[Jj\xAF\0\x90P\x90V[_\x80a\x1E\x19a\x1D\xE8V[\x90P\x80_\x01`\x04\x01T\x91PP\x90V[``_`\x01a\x1E6\x84a4\xDBV[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1ETWa\x1ESa?\xFAV[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x1E\x86W\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a\x1E\xE7W\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a\x1E\xDCWa\x1E\xDBaN\x08V[[\x04\x94P_\x85\x03a\x1E\x93W[\x81\x93PPPP\x91\x90PV[a\x1E\xFC\x83\x82a6,V[a\x1F\x06\x83\x83a7\x02V[PPPV[\x80_\x81\x03a\x1FEW`@Q\x7F\xCB\x17\xB7\xA5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1FO\x83\x83a8ZV[a\x1F\x90W\x81`@Q\x7Fw\xBFXF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1F\x87\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[`\x05\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x07\x81\x11\x15a\x1F\xC5Wa\x1F\xC4aB\xE9V[[\x02\x17\x90UP_\x83`\x04\x01\x81\x90UPPPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a \x85WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a la8\xA9V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a \xBCW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a!\x1BW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a!?\x91\x90aJ\x1DV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a!\xAEW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a!\xA5\x91\x90aJHV[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\"\x19WP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\"\x16\x91\x90aN_V[`\x01[a\"ZW\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\"Q\x91\x90aJHV[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a\"\xC0W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\"\xB7\x91\x90aA\x90V[`@Q\x80\x91\x03\x90\xFD[a\"\xCA\x83\x83a8\xFCV[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a#TW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80a#`a\x1D\xE8V[\x90P\x80_\x01`\x03\x01T\x91PP\x90V[_\x82_\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x90P\x92\x91PPV[a#\x9Fa=ZV[_\x83\x83\x90P\x03a#\xDBW`@Q\x7F\x8A\xF0\x82\xEF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a#\xE4a\x1D\xE8V[\x90P\x80`\x07\x01_\x81T\x80\x92\x91\x90a#\xFA\x90aN\x8AV[\x91\x90PUP_\x81`\x07\x01T\x90P\x80\x82`\x06\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x01\x81\x90UP\x87\x82`\x06\x01_\x83\x81R` \x01\x90\x81R` \x01_ `\x01\x01\x81\x90UP\x86\x86\x83`\x06\x01_\x84\x81R` \x01\x90\x81R` \x01_ `\x02\x01\x91\x82a$a\x92\x91\x90aPxV[P_[\x85\x85\x90P\x81\x10\x15a+\x9BW_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x86\x86\x83\x81\x81\x10a$\x99Wa$\x98aQEV[[\x90P` \x02\x81\x01\x90a$\xAB\x91\x90aQ~V[` \x01` \x81\x01\x90a$\xBD\x91\x90aQ\xA5V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a%\x19W\x80\x86\x86`@Q\x7F\x9E\xDBxa\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%\x10\x93\x92\x91\x90aQ\xD0V[`@Q\x80\x91\x03\x90\xFD[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x86\x86\x83\x81\x81\x10a%CWa%BaQEV[[\x90P` \x02\x81\x01\x90a%U\x91\x90aQ~V[`@\x01` \x81\x01\x90a%g\x91\x90aQ\xA5V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a%\xC3W\x80\x86\x86`@Q\x7FJlYt\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%\xBA\x93\x92\x91\x90aQ\xD0V[`@Q\x80\x91\x03\x90\xFD[\x82`\t\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x87\x87\x84\x81\x81\x10a%\xEAWa%\xE9aQEV[[\x90P` \x02\x81\x01\x90a%\xFC\x91\x90aQ~V[` \x01` \x81\x01\x90a&\x0E\x91\x90aQ\xA5V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a&\xD2W\x85\x85\x82\x81\x81\x10a&lWa&kaQEV[[\x90P` \x02\x81\x01\x90a&~\x91\x90aQ~V[` \x01` \x81\x01\x90a&\x90\x91\x90aQ\xA5V[\x81\x87\x87`@Q\x7Fd\xD5'Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a&\xC9\x94\x93\x92\x91\x90aR\0V[`@Q\x80\x91\x03\x90\xFD[\x82`\x0B\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x87\x87\x84\x81\x81\x10a&\xF9Wa&\xF8aQEV[[\x90P` \x02\x81\x01\x90a'\x0B\x91\x90aQ~V[`@\x01` \x81\x01\x90a'\x1D\x91\x90aQ\xA5V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a'\xE1W\x85\x85\x82\x81\x81\x10a'{Wa'zaQEV[[\x90P` \x02\x81\x01\x90a'\x8D\x91\x90aQ~V[`@\x01` \x81\x01\x90a'\x9F\x91\x90aQ\xA5V[\x81\x87\x87`@Q\x7F\xC8&\xE1\xA2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a'\xD8\x94\x93\x92\x91\x90aR\0V[`@Q\x80\x91\x03\x90\xFD[\x82`\x06\x01_\x83\x81R` \x01\x90\x81R` \x01_ `\x03\x01\x86\x86\x83\x81\x81\x10a(\nWa(\taQEV[[\x90P` \x02\x81\x01\x90a(\x1C\x91\x90aQ~V[\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x90`\x04\x02\x01_\x90\x91\x90\x91\x90\x91P\x81\x81a(N\x91\x90aU)V[PP\x85\x85\x82\x81\x81\x10a(cWa(baQEV[[\x90P` \x02\x81\x01\x90a(u\x91\x90aQ~V[\x83`\x08\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x88\x88\x85\x81\x81\x10a(\x9CWa(\x9BaQEV[[\x90P` \x02\x81\x01\x90a(\xAE\x91\x90aQ~V[` \x01` \x81\x01\x90a(\xC0\x91\x90aQ\xA5V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ \x81\x81a)\x05\x91\x90aU)V[\x90PP`\x01\x83`\t\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x88\x88\x85\x81\x81\x10a)1Wa)0aQEV[[\x90P` \x02\x81\x01\x90a)C\x91\x90aQ~V[` \x01` \x81\x01\x90a)U\x91\x90aQ\xA5V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x82`\n\x01_\x83\x81R` \x01\x90\x81R` \x01_ \x86\x86\x83\x81\x81\x10a)\xCAWa)\xC9aQEV[[\x90P` \x02\x81\x01\x90a)\xDC\x91\x90aQ~V[` \x01` \x81\x01\x90a)\xEE\x91\x90aQ\xA5V[\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x83`\x0B\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x88\x88\x85\x81\x81\x10a*tWa*saQEV[[\x90P` \x02\x81\x01\x90a*\x86\x91\x90aQ~V[`@\x01` \x81\x01\x90a*\x98\x91\x90aQ\xA5V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x82`\x0C\x01_\x83\x81R` \x01\x90\x81R` \x01_ \x86\x86\x83\x81\x81\x10a+\rWa+\x0CaQEV[[\x90P` \x02\x81\x01\x90a+\x1F\x91\x90aQ~V[`@\x01` \x81\x01\x90a+1\x91\x90aQ\xA5V[\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x80\x80`\x01\x01\x91PPa$dV[P\x81`\x06\x01_\x82\x81R` \x01\x90\x81R` \x01_ `@Q\x80`\x80\x01`@R\x90\x81_\x82\x01T\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01\x80Ta+\xDD\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta,\t\x90aI\xA3V[\x80\x15a,TW\x80`\x1F\x10a,+Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a,TV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a,7W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x03\x82\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01_\x90[\x82\x82\x10\x15a.zW\x83\x82\x90_R` _ \x90`\x04\x02\x01`@Q\x80`\x80\x01`@R\x90\x81_\x82\x01\x80Ta,\xB1\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta,\xDD\x90aI\xA3V[\x80\x15a-(W\x80`\x1F\x10a,\xFFWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a-(V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a-\x0BW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x03\x82\x01\x80Ta-\xEB\x90aI\xA3V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta.\x17\x90aI\xA3V[\x80\x15a.bW\x80`\x1F\x10a.9Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a.bV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a.EW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x81R` \x01\x90`\x01\x01\x90a,\x81V[PPPP\x81RPP\x92PPP\x95\x94PPPPPV[\x80_\x81\x03a.\xC9W`@Q\x7F\xCB\x17\xB7\xA5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a.\xD3\x83\x83a9nV[a/\x14W\x81`@Q\x7FfS\xF6\xD7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a/\x0B\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_\x83`\x02\x01T\x14a/`W\x82`\x02\x01T`@Q\x7F\xC4p\xC0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a/W\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[_\x83`\x04\x01T\x14a/\xACW\x82`\x04\x01T`@Q\x7Fp\"\xECA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a/\xA3\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[`\x01\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x07\x81\x11\x15a/\xE1Wa/\xE0aB\xE9V[[\x02\x17\x90UP\x81\x83`\x01\x01\x81\x90UPPPPV[\x80_\x81\x03a0.W`@Q\x7F\xCB\x17\xB7\xA5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a08\x83\x83a9\xBCV[a0yW\x81`@Q\x7F\xC0\xB5\xEEf\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a0p\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[`\x02\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x07\x81\x11\x15a0\xAEWa0\xADaB\xE9V[[\x02\x17\x90UP\x81\x83`\x02\x01\x81\x90UP_\x83`\x01\x01\x81\x90UPPPPV[_\x80a0\xD4a\x1D\xE8V[\x90P\x80_\x01`\x02\x01T\x91PP\x90V[\x80_\x81\x03a1\x1DW`@Q\x7F\xCB\x17\xB7\xA5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82\x82a1)\x82\x82a9nV[\x15a1kW\x80`@Q\x7FaTL\xFC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a1b\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[a1u\x85\x85a9\xBCV[\x15a1\xB7W\x83`@Q\x7F\r\xDD\x14\xCA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a1\xAE\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[a1\xC1\x85\x85a:\x0BV[\x15a2\x03W\x83`@Q\x7F\xCDINI\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a1\xFA\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[`\x06\x85_\x01_\x86\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x07\x81\x11\x15a28Wa27aB\xE9V[[\x02\x17\x90UP\x83\x85`\x02\x01T\x03a2RW_\x85`\x02\x01\x81\x90UP[\x83\x85`\x04\x01T\x03a2gW_\x85`\x04\x01\x81\x90UP[PPPPPV[\x80_\x81\x03a2\xA8W`@Q\x7F\xCB\x17\xB7\xA5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82\x82a2\xB4\x82\x82a9nV[\x15a2\xF6W\x80`@Q\x7FaTL\xFC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a2\xED\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[a3\0\x85\x85a:\x0BV[\x15a3BW\x83`@Q\x7F\xCDINI\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a39\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[`\x07\x85_\x01_\x86\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x07\x81\x11\x15a3wWa3vaB\xE9V[[\x02\x17\x90UP\x83\x85`\x01\x01T\x03a3\x91W_\x85`\x01\x01\x81\x90UP[\x83\x85`\x02\x01T\x03a3\xA6W_\x85`\x02\x01\x81\x90UP[\x83\x85`\x04\x01T\x03a3\xBBW_\x85`\x04\x01\x81\x90UP[PPPPPV[_a3\xCBa3\xE6V[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[\x80_\x81\x03a4GW`@Q\x7F\xCB\x17\xB7\xA5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x83`\x03\x01T\x14a4\x93W\x82`\x03\x01T`@Q\x7F~\xEAC+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a4\x8A\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[`\x03\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x07\x81\x11\x15a4\xC8Wa4\xC7aB\xE9V[[\x02\x17\x90UP\x81\x83`\x03\x01\x81\x90UPPPPV[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a57Wz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a5-Wa5,aN\x08V[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a5tWm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a5jWa5iaN\x08V[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a5\xA3Wf#\x86\xF2o\xC1\0\0\x83\x81a5\x99Wa5\x98aN\x08V[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a5\xCCWc\x05\xF5\xE1\0\x83\x81a5\xC2Wa5\xC1aN\x08V[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a5\xF1Wa'\x10\x83\x81a5\xE7Wa5\xE6aN\x08V[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a6\x14W`d\x83\x81a6\nWa6\taN\x08V[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a6#W`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[\x80_\x81\x03a6fW`@Q\x7F\xCB\x17\xB7\xA5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a6p\x83\x83a:\x0BV[a6\xB1W\x81`@Q\x7F3\x14\x86\xB3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a6\xA8\x91\x90a?\x05V[`@Q\x80\x91\x03\x90\xFD[`\x04\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x07\x81\x11\x15a6\xE6Wa6\xE5aB\xE9V[[\x02\x17\x90UP\x81\x83`\x04\x01\x81\x90UP_\x83`\x03\x01\x81\x90UPPPPV[\x80_\x81\x03a7 v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba:\xA9V[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a9\x05\x82a:\xB2V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a9aWa9[\x82\x82a;{V[Pa9jV[a9ia;\xFBV[[PPV[_\x80`\x07\x81\x11\x15a9\x82Wa9\x81aB\xE9V[[\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16`\x07\x81\x11\x15a9\xB3Wa9\xB2aB\xE9V[[\x14\x90P\x92\x91PPV[_`\x01`\x07\x81\x11\x15a9\xD1Wa9\xD0aB\xE9V[[\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16`\x07\x81\x11\x15a:\x02Wa:\x01aB\xE9V[[\x14\x90P\x92\x91PPV[_`\x03`\x07\x81\x11\x15a: Wa:\x1FaB\xE9V[[\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16`\x07\x81\x11\x15a:QWa:PaB\xE9V[[\x14\x90P\x92\x91PPV[_`\x02`\x07\x81\x11\x15a:oWa:naB\xE9V[[\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16`\x07\x81\x11\x15a:\xA0Wa:\x9FaB\xE9V[[\x14\x90P\x92\x91PPV[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a;\rW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a;\x04\x91\x90aJHV[`@Q\x80\x91\x03\x90\xFD[\x80a;9\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba:\xA9V[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa;\xA4\x91\x90aUqV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a;\xDCW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a;\xE1V[``\x91P[P\x91P\x91Pa;\xF1\x85\x83\x83a<7V[\x92PPP\x92\x91PPV[_4\x11\x15a<5W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82aA\x82a>\x18V[\x90P\x91\x90PV[a>Q\x81a>7V[\x82RPPV[_a>b\x83\x83a>HV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a>\x84\x82a=\xEFV[a>\x8E\x81\x85a=\xF9V[\x93Pa>\x99\x83a>\tV[\x80_[\x83\x81\x10\x15a>\xC9W\x81Qa>\xB0\x88\x82a>WV[\x97Pa>\xBB\x83a>nV[\x92PP`\x01\x81\x01\x90Pa>\x9CV[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra>\xEE\x81\x84a>zV[\x90P\x92\x91PPV[a>\xFF\x81a=\x91V[\x82RPPV[_` \x82\x01\x90Pa?\x18_\x83\x01\x84a>\xF6V[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a?UW\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa?:V[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a?z\x82a?\x1EV[a?\x84\x81\x85a?(V[\x93Pa?\x94\x81\x85` \x86\x01a?8V[a?\x9D\x81a?`V[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra?\xC0\x81\x84a?pV[\x90P\x92\x91PPV[a?\xD1\x81a>7V[\x81\x14a?\xDBW_\x80\xFD[PV[_\x815\x90Pa?\xEC\x81a?\xC8V[\x92\x91PPV[_\x80\xFD[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a@0\x82a?`V[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a@OWa@Na?\xFAV[[\x80`@RPPPV[_a@aa=\x80V[\x90Pa@m\x82\x82a@'V[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a@\x8CWa@\x8Ba?\xFAV[[a@\x95\x82a?`V[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_a@\xC2a@\xBD\x84a@rV[a@XV[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a@\xDEWa@\xDDa?\xF6V[[a@\xE9\x84\x82\x85a@\xA2V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aA\x05WaA\x04a?\xF2V[[\x815aA\x15\x84\x82` \x86\x01a@\xB0V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15aA4WaA3a=\x89V[[_aAA\x85\x82\x86\x01a?\xDEV[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aAbWaAaa=\x8DV[[aAn\x85\x82\x86\x01a@\xF1V[\x91PP\x92P\x92\x90PV[_\x81\x90P\x91\x90PV[aA\x8A\x81aAxV[\x82RPPV[_` \x82\x01\x90PaA\xA3_\x83\x01\x84aA\x81V[\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15aA\xBFWaA\xBEa=\x89V[[_aA\xCC\x85\x82\x86\x01a=\xB0V[\x92PP` aA\xDD\x85\x82\x86\x01a?\xDEV[\x91PP\x92P\x92\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aB\x01\x82a?\x1EV[aB\x0B\x81\x85aA\xE7V[\x93PaB\x1B\x81\x85` \x86\x01a?8V[aB$\x81a?`V[\x84\x01\x91PP\x92\x91PPV[_`\x80\x83\x01_\x83\x01Q\x84\x82\x03_\x86\x01RaBI\x82\x82aA\xF7V[\x91PP` \x83\x01QaB^` \x86\x01\x82a>HV[P`@\x83\x01QaBq`@\x86\x01\x82a>HV[P``\x83\x01Q\x84\x82\x03``\x86\x01RaB\x89\x82\x82aA\xF7V[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaB\xAE\x81\x84aB/V[\x90P\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[aB\xCA\x81aB\xB6V[\x82RPPV[_` \x82\x01\x90PaB\xE3_\x83\x01\x84aB\xC1V[\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[`\x08\x81\x10aC'WaC&aB\xE9V[[PV[_\x81\x90PaC7\x82aC\x16V[\x91\x90PV[_aCF\x82aC*V[\x90P\x91\x90PV[aCV\x81aCHV[P`@\x83\x01QaF\x85`@\x86\x01\x82a>HV[P``\x83\x01Q\x84\x82\x03``\x86\x01RaF\x9D\x82\x82aA\xF7V[\x91PP\x80\x91PP\x92\x91PPV[_aF\xB5\x83\x83aFCV[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aF\xD3\x82aF\x1AV[aF\xDD\x81\x85aF$V[\x93P\x83` \x82\x02\x85\x01aF\xEF\x85aF4V[\x80_[\x85\x81\x10\x15aG*W\x84\x84\x03\x89R\x81QaG\x0B\x85\x82aF\xAAV[\x94PaG\x16\x83aF\xBDV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaF\xF2V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_`\x80\x83\x01_\x83\x01QaGQ_\x86\x01\x82aE\xB9V[P` \x83\x01QaGd` \x86\x01\x82aE\xB9V[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaG|\x82\x82aE\xE2V[\x91PP``\x83\x01Q\x84\x82\x03``\x86\x01RaG\x96\x82\x82aF\xC9V[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaG\xBB\x81\x84aG\xF6V[aIo` \x83\x01\x84a>\xF6V[\x93\x92PPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\"`\x04R`$_\xFD[_`\x02\x82\x04\x90P`\x01\x82\x16\x80aI\xBAW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aI\xCDWaI\xCCaIvV[[P\x91\x90PV[aI\xDC\x81a>7V[\x82RPPV[_`@\x82\x01\x90PaI\xF5_\x83\x01\x85a>\xF6V[aJ\x02` \x83\x01\x84aI\xD3V[\x93\x92PPPV[_\x81Q\x90PaJ\x17\x81a?\xC8V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aJ2WaJ1a=\x89V[[_aJ?\x84\x82\x85\x01aJ\tV[\x91PP\x92\x91PPV[_` \x82\x01\x90PaJ[_\x83\x01\x84aI\xD3V[\x92\x91PPV[_aJo` \x84\x01\x84a=\xB0V[\x90P\x92\x91PPV[`@\x82\x01aJ\x87_\x83\x01\x83aJaV[aJ\x93_\x85\x01\x82aE\xB9V[PaJ\xA1` \x83\x01\x83aJaV[aJ\xAE` \x85\x01\x82aE\xB9V[PPPPV[_`\x80\x82\x01\x90P\x81\x81\x03_\x83\x01RaJ\xCC\x81\x86aG\xF6V[\x93\x92PPPV[_`@\x82\x01\x90PaK8_\x83\x01\x85a>\xF6V[aKE` \x83\x01\x84aCMV[\x93\x92PPPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aKg\x83\x85aKLV[\x93PaKt\x83\x85\x84a@\xA2V[aK}\x83a?`V[\x84\x01\x90P\x93\x92PPPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P\x91\x90PV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x835`\x01` \x03\x846\x03\x03\x81\x12aK\xC9WaK\xC8aK\xA9V[[\x83\x81\x01\x92P\x825\x91P` \x83\x01\x92Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aK\xF1WaK\xF0aK\xA1V[[`\x01\x82\x026\x03\x83\x13\x15aL\x07WaL\x06aK\xA5V[[P\x92P\x92\x90PV[_aL\x1A\x83\x85aA\xE7V[\x93PaL'\x83\x85\x84a@\xA2V[aL0\x83a?`V[\x84\x01\x90P\x93\x92PPPV[_aLI` \x84\x01\x84a?\xDEV[\x90P\x92\x91PPV[_`\x80\x83\x01aLb_\x84\x01\x84aK\xADV[\x85\x83\x03_\x87\x01RaLt\x83\x82\x84aL\x0FV[\x92PPPaL\x85` \x84\x01\x84aL;V[aL\x92` \x86\x01\x82a>HV[PaL\xA0`@\x84\x01\x84aL;V[aL\xAD`@\x86\x01\x82a>HV[PaL\xBB``\x84\x01\x84aK\xADV[\x85\x83\x03``\x87\x01RaL\xCE\x83\x82\x84aL\x0FV[\x92PPP\x80\x91PP\x92\x91PPV[_aL\xE7\x83\x83aLQV[\x90P\x92\x91PPV[_\x825`\x01`\x80\x03\x836\x03\x03\x81\x12aM\nWaM\taK\xA9V[[\x82\x81\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aM-\x83\x85aK\x88V[\x93P\x83` \x84\x02\x85\x01aM?\x84aK\x98V[\x80_[\x87\x81\x10\x15aM\x82W\x84\x84\x03\x89RaMY\x82\x84aL\xEFV[aMc\x85\x82aL\xDCV[\x94PaMn\x83aM\x16V[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaMBV[P\x82\x97P\x87\x94PPPPP\x93\x92PPPV[_`@\x82\x01\x90P\x81\x81\x03_\x83\x01RaM\xAD\x81\x86\x88aK\\V[\x90P\x81\x81\x03` \x83\x01RaM\xC2\x81\x84\x86aM\"V[\x90P\x95\x94PPPPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[aM\xE9\x81aM\xCDV[\x82RPPV[_` \x82\x01\x90PaN\x02_\x83\x01\x84aM\xE0V[\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[aN>\x81aAxV[\x81\x14aNHW_\x80\xFD[PV[_\x81Q\x90PaNY\x81aN5V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aNtWaNsa=\x89V[[_aN\x81\x84\x82\x85\x01aNKV[\x91PP\x92\x91PPV[_aN\x94\x82a=\x91V[\x91P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x03aN\xC6WaN\xC5aH\xEFV[[`\x01\x82\x01\x90P\x91\x90PV[_\x82\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_` `\x1F\x83\x01\x04\x90P\x91\x90PV[_\x82\x82\x1B\x90P\x92\x91PPV[_`\x08\x83\x02aO7\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82aN\xFCV[aOA\x86\x83aN\xFCV[\x95P\x80\x19\x84\x16\x93P\x80\x86\x16\x84\x17\x92PPP\x93\x92PPPV[_\x81\x90P\x91\x90PV[_aO|aOwaOr\x84a=\x91V[aOYV[a=\x91V[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[aO\x95\x83aObV[aO\xA9aO\xA1\x82aO\x83V[\x84\x84TaO\x08V[\x82UPPPPV[_\x90V[aO\xBDaO\xB1V[aO\xC8\x81\x84\x84aO\x8CV[PPPV[[\x81\x81\x10\x15aO\xEBWaO\xE0_\x82aO\xB5V[`\x01\x81\x01\x90PaO\xCEV[PPV[`\x1F\x82\x11\x15aP0WaP\x01\x81aN\xDBV[aP\n\x84aN\xEDV[\x81\x01` \x85\x10\x15aP\x19W\x81\x90P[aP-aP%\x85aN\xEDV[\x83\x01\x82aO\xCDV[PP[PPPV[_\x82\x82\x1C\x90P\x92\x91PPV[_aPP_\x19\x84`\x08\x02aP5V[\x19\x80\x83\x16\x91PP\x92\x91PPV[_aPh\x83\x83aPAV[\x91P\x82`\x02\x02\x82\x17\x90P\x92\x91PPV[aP\x82\x83\x83aN\xD1V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aP\x9BWaP\x9Aa?\xFAV[[aP\xA5\x82TaI\xA3V[aP\xB0\x82\x82\x85aO\xEFV[_`\x1F\x83\x11`\x01\x81\x14aP\xDDW_\x84\x15aP\xCBW\x82\x87\x015\x90P[aP\xD5\x85\x82aP]V[\x86UPaQ\xF6V[\x81\x81\x03` \x83\x01RaQ\xF6\x81\x84\x86aM\"V[\x90P\x94\x93PPPPV[_``\x82\x01\x90PaR\x13_\x83\x01\x87aI\xD3V[aR ` \x83\x01\x86a>\xF6V[\x81\x81\x03`@\x83\x01RaR3\x81\x84\x86aM\"V[\x90P\x95\x94PPPPPV[_\x80\x835`\x01` \x03\x846\x03\x03\x81\x12aRZWaRYaQrV[[\x80\x84\x01\x92P\x825\x91Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aR|WaR{aQvV[[` \x83\x01\x92P`\x01\x82\x026\x03\x83\x13\x15aR\x98WaR\x97aQzV[[P\x92P\x92\x90PV[_\x82\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[`\x1F\x82\x11\x15aR\xFDWaR\xCE\x81aR\xAAV[aR\xD7\x84aN\xEDV[\x81\x01` \x85\x10\x15aR\xE6W\x81\x90P[aR\xFAaR\xF2\x85aN\xEDV[\x83\x01\x82aO\xCDV[PP[PPPV[aS\x0C\x83\x83aR\xA0V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aS%WaS$a?\xFAV[[aS/\x82TaI\xA3V[aS:\x82\x82\x85aR\xBCV[_`\x1F\x83\x11`\x01\x81\x14aSgW_\x84\x15aSUW\x82\x87\x015\x90P[aS_\x85\x82aP]V[\x86UPaS\xC6V[`\x1F\x19\x84\x16aSu\x86aR\xAAV[_[\x82\x81\x10\x15aS\x9CW\x84\x89\x015\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90PaSwV[\x86\x83\x10\x15aS\xB9W\x84\x89\x015aS\xB5`\x1F\x89\x16\x82aPAV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPPV[aS\xDA\x83\x83\x83aS\x02V[PPPV[_\x815aS\xEB\x81a?\xC8V[\x80\x91PP\x91\x90PV[_\x81_\x1B\x90P\x91\x90PV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFFaT\x1E\x84aS\xF4V[\x93P\x80\x19\x83\x16\x92P\x80\x84\x16\x83\x17\x91PP\x92\x91PPV[_aTNaTIaTD\x84a>\x18V[aOYV[a>\x18V[\x90P\x91\x90PV[_aT_\x82aT4V[\x90P\x91\x90PV[_aTp\x82aTUV[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[aT\x89\x82aTfV[aT\x9CaT\x95\x82aTwV[\x83TaS\xFFV[\x82UPPPV[_\x81\x01_\x83\x01aT\xB3\x81\x85aR>V[aT\xBE\x81\x83\x86aS\xCFV[PPPP`\x01\x81\x01` \x83\x01\x80aT\xD4\x81aS\xDFV[\x90PaT\xE0\x81\x84aT\x80V[PPP`\x02\x81\x01`@\x83\x01\x80aT\xF5\x81aS\xDFV[\x90PaU\x01\x81\x84aT\x80V[PPP`\x03\x81\x01``\x83\x01aU\x16\x81\x85aR>V[aU!\x81\x83\x86aS\xCFV[PPPPPPV[aU3\x82\x82aT\xA3V[PPV[_\x81\x90P\x92\x91PPV[_aUK\x82aE\xC8V[aUU\x81\x85aU7V[\x93PaUe\x81\x85` \x86\x01a?8V[\x80\x84\x01\x91PP\x92\x91PPV[_aU|\x82\x84aUAV[\x91P\x81\x90P\x92\x91PPV", + ); + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextStatus(u8); + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::private::SolTypeValue for u8 { + #[inline] + fn stv_to_tokens( + &self, + ) -> as alloy_sol_types::SolType>::Token<'_> { + alloy_sol_types::private::SolTypeValue::< + alloy::sol_types::sol_data::Uint<8>, + >::stv_to_tokens(self) + } + #[inline] + fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { + as alloy_sol_types::SolType>::tokenize(self) + .0 + } + #[inline] + fn stv_abi_encode_packed_to( + &self, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::SolType>::abi_encode_packed_to(self, out) + } + #[inline] + fn stv_abi_packed_encoded_size(&self) -> usize { + as alloy_sol_types::SolType>::abi_encoded_size(self) + } + } + #[automatically_derived] + impl ContextStatus { + /// The Solidity type name. + pub const NAME: &'static str = stringify!(@ name); + /// Convert from the underlying value type. + #[inline] + pub const fn from_underlying(value: u8) -> Self { + Self(value) + } + /// Return the underlying value. + #[inline] + pub const fn into_underlying(self) -> u8 { + self.0 + } + /// Return the single encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode(&self) -> alloy_sol_types::private::Vec { + ::abi_encode(&self.0) + } + /// Return the packed encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode_packed(&self) -> alloy_sol_types::private::Vec { + ::abi_encode_packed(&self.0) + } + } + #[automatically_derived] + impl From for ContextStatus { + fn from(value: u8) -> Self { + Self::from_underlying(value) + } + } + #[automatically_derived] + impl From for u8 { + fn from(value: ContextStatus) -> Self { + value.into_underlying() + } + } + #[automatically_derived] + impl alloy_sol_types::SolType for ContextStatus { + type RustType = u8; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SOL_NAME: &'static str = Self::NAME; + const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; + const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; + #[inline] + fn valid_token(token: &Self::Token<'_>) -> bool { + Self::type_check(token).is_ok() + } + #[inline] + fn type_check(token: &Self::Token<'_>) -> alloy_sol_types::Result<()> { + as alloy_sol_types::SolType>::type_check(token) + } + #[inline] + fn detokenize(token: Self::Token<'_>) -> Self::RustType { + as alloy_sol_types::SolType>::detokenize(token) + } + } + #[automatically_derived] + impl alloy_sol_types::EventTopic for ContextStatus { + #[inline] + fn topic_preimage_length(rust: &Self::RustType) -> usize { + as alloy_sol_types::EventTopic>::topic_preimage_length(rust) + } + #[inline] + fn encode_topic_preimage( + rust: &Self::RustType, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::EventTopic>::encode_topic_preimage(rust, out) + } + #[inline] + fn encode_topic( + rust: &Self::RustType, + ) -> alloy_sol_types::abi::token::WordToken { + as alloy_sol_types::EventTopic>::encode_topic(rust) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**```solidity +struct CoprocessorContext { uint256 contextId; uint256 previousContextId; bytes blob; CoprocessorV2[] coprocessors; } +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct CoprocessorContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub previousContextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub blob: alloy::sol_types::private::Bytes, + #[allow(missing_docs)] + pub coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Bytes, + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Bytes, + alloy::sol_types::private::Vec< + ::RustType, + >, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: CoprocessorContext) -> Self { + ( + value.contextId, + value.previousContextId, + value.blob, + value.coprocessors, + ) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for CoprocessorContext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + previousContextId: tuple.1, + blob: tuple.2, + coprocessors: tuple.3, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolValue for CoprocessorContext { + type SolType = Self; + } + #[automatically_derived] + impl alloy_sol_types::private::SolTypeValue for CoprocessorContext { + #[inline] + fn stv_to_tokens(&self) -> ::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + as alloy_sol_types::SolType>::tokenize(&self.previousContextId), + ::tokenize( + &self.blob, + ), + as alloy_sol_types::SolType>::tokenize(&self.coprocessors), + ) + } + #[inline] + fn stv_abi_encoded_size(&self) -> usize { + if let Some(size) = ::ENCODED_SIZE { + return size; + } + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_encoded_size(&tuple) + } + #[inline] + fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { + ::eip712_hash_struct(self) + } + #[inline] + fn stv_abi_encode_packed_to( + &self, + out: &mut alloy_sol_types::private::Vec, + ) { + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_encode_packed_to(&tuple, out) + } + #[inline] + fn stv_abi_packed_encoded_size(&self) -> usize { + if let Some(size) = ::PACKED_ENCODED_SIZE { + return size; + } + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_packed_encoded_size(&tuple) + } + } + #[automatically_derived] + impl alloy_sol_types::SolType for CoprocessorContext { + type RustType = Self; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SOL_NAME: &'static str = ::NAME; + const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; + const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; + #[inline] + fn valid_token(token: &Self::Token<'_>) -> bool { + as alloy_sol_types::SolType>::valid_token(token) + } + #[inline] + fn detokenize(token: Self::Token<'_>) -> Self::RustType { + let tuple = as alloy_sol_types::SolType>::detokenize(token); + >>::from(tuple) + } + } + #[automatically_derived] + impl alloy_sol_types::SolStruct for CoprocessorContext { + const NAME: &'static str = "CoprocessorContext"; + #[inline] + fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { + alloy_sol_types::private::Cow::Borrowed( + "CoprocessorContext(uint256 contextId,uint256 previousContextId,bytes blob,CoprocessorV2[] coprocessors)", + ) + } + #[inline] + fn eip712_components() -> alloy_sol_types::private::Vec< + alloy_sol_types::private::Cow<'static, str>, + > { + let mut components = alloy_sol_types::private::Vec::with_capacity(1); + components + .push( + ::eip712_root_type(), + ); + components + .extend( + ::eip712_components(), + ); + components + } + #[inline] + fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { + [ + as alloy_sol_types::SolType>::eip712_data_word(&self.contextId) + .0, + as alloy_sol_types::SolType>::eip712_data_word( + &self.previousContextId, + ) + .0, + ::eip712_data_word( + &self.blob, + ) + .0, + as alloy_sol_types::SolType>::eip712_data_word(&self.coprocessors) + .0, + ] + .concat() + } + } + #[automatically_derived] + impl alloy_sol_types::EventTopic for CoprocessorContext { + #[inline] + fn topic_preimage_length(rust: &Self::RustType) -> usize { + 0usize + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.contextId, + ) + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.previousContextId, + ) + + ::topic_preimage_length( + &rust.blob, + ) + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.coprocessors, + ) + } + #[inline] + fn encode_topic_preimage( + rust: &Self::RustType, + out: &mut alloy_sol_types::private::Vec, + ) { + out.reserve( + ::topic_preimage_length(rust), + ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.contextId, + out, + ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.previousContextId, + out, + ); + ::encode_topic_preimage( + &rust.blob, + out, + ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.coprocessors, + out, + ); + } + #[inline] + fn encode_topic( + rust: &Self::RustType, + ) -> alloy_sol_types::abi::token::WordToken { + let mut out = alloy_sol_types::private::Vec::new(); + ::encode_topic_preimage( + rust, + &mut out, + ); + alloy_sol_types::abi::token::WordToken( + alloy_sol_types::private::keccak256(out), + ) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**```solidity +struct CoprocessorContextTimePeriods { uint256 preActivationTimePeriod; uint256 suspendedTimePeriod; } +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct CoprocessorContextTimePeriods { + #[allow(missing_docs)] + pub preActivationTimePeriod: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub suspendedTimePeriod: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: CoprocessorContextTimePeriods) -> Self { + (value.preActivationTimePeriod, value.suspendedTimePeriod) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for CoprocessorContextTimePeriods { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + preActivationTimePeriod: tuple.0, + suspendedTimePeriod: tuple.1, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolValue for CoprocessorContextTimePeriods { + type SolType = Self; + } + #[automatically_derived] + impl alloy_sol_types::private::SolTypeValue + for CoprocessorContextTimePeriods { + #[inline] + fn stv_to_tokens(&self) -> ::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize( + &self.preActivationTimePeriod, + ), + as alloy_sol_types::SolType>::tokenize(&self.suspendedTimePeriod), + ) + } + #[inline] + fn stv_abi_encoded_size(&self) -> usize { + if let Some(size) = ::ENCODED_SIZE { + return size; + } + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_encoded_size(&tuple) + } + #[inline] + fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { + ::eip712_hash_struct(self) + } + #[inline] + fn stv_abi_encode_packed_to( + &self, + out: &mut alloy_sol_types::private::Vec, + ) { + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_encode_packed_to(&tuple, out) + } + #[inline] + fn stv_abi_packed_encoded_size(&self) -> usize { + if let Some(size) = ::PACKED_ENCODED_SIZE { + return size; + } + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_packed_encoded_size(&tuple) + } + } + #[automatically_derived] + impl alloy_sol_types::SolType for CoprocessorContextTimePeriods { + type RustType = Self; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SOL_NAME: &'static str = ::NAME; + const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; + const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; + #[inline] + fn valid_token(token: &Self::Token<'_>) -> bool { + as alloy_sol_types::SolType>::valid_token(token) + } + #[inline] + fn detokenize(token: Self::Token<'_>) -> Self::RustType { + let tuple = as alloy_sol_types::SolType>::detokenize(token); + >>::from(tuple) + } + } + #[automatically_derived] + impl alloy_sol_types::SolStruct for CoprocessorContextTimePeriods { + const NAME: &'static str = "CoprocessorContextTimePeriods"; + #[inline] + fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { + alloy_sol_types::private::Cow::Borrowed( + "CoprocessorContextTimePeriods(uint256 preActivationTimePeriod,uint256 suspendedTimePeriod)", + ) + } + #[inline] + fn eip712_components() -> alloy_sol_types::private::Vec< + alloy_sol_types::private::Cow<'static, str>, + > { + alloy_sol_types::private::Vec::new() + } + #[inline] + fn eip712_encode_type() -> alloy_sol_types::private::Cow<'static, str> { + ::eip712_root_type() + } + #[inline] + fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { + [ + as alloy_sol_types::SolType>::eip712_data_word( + &self.preActivationTimePeriod, + ) + .0, + as alloy_sol_types::SolType>::eip712_data_word( + &self.suspendedTimePeriod, + ) + .0, + ] + .concat() + } + } + #[automatically_derived] + impl alloy_sol_types::EventTopic for CoprocessorContextTimePeriods { + #[inline] + fn topic_preimage_length(rust: &Self::RustType) -> usize { + 0usize + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.preActivationTimePeriod, + ) + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.suspendedTimePeriod, + ) + } + #[inline] + fn encode_topic_preimage( + rust: &Self::RustType, + out: &mut alloy_sol_types::private::Vec, + ) { + out.reserve( + ::topic_preimage_length(rust), + ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.preActivationTimePeriod, + out, + ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.suspendedTimePeriod, + out, + ); + } + #[inline] + fn encode_topic( + rust: &Self::RustType, + ) -> alloy_sol_types::abi::token::WordToken { + let mut out = alloy_sol_types::private::Vec::new(); + ::encode_topic_preimage( + rust, + &mut out, + ); + alloy_sol_types::abi::token::WordToken( + alloy_sol_types::private::keccak256(out), + ) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**```solidity +struct CoprocessorV2 { string name; address txSenderAddress; address signerAddress; string storageUrl; } +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct CoprocessorV2 { + #[allow(missing_docs)] + pub name: alloy::sol_types::private::String, + #[allow(missing_docs)] + pub txSenderAddress: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub signerAddress: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub storageUrl: alloy::sol_types::private::String, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::String, + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::String, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::String, + alloy::sol_types::private::Address, + alloy::sol_types::private::Address, + alloy::sol_types::private::String, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: CoprocessorV2) -> Self { + ( + value.name, + value.txSenderAddress, + value.signerAddress, + value.storageUrl, + ) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for CoprocessorV2 { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + name: tuple.0, + txSenderAddress: tuple.1, + signerAddress: tuple.2, + storageUrl: tuple.3, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolValue for CoprocessorV2 { + type SolType = Self; + } + #[automatically_derived] + impl alloy_sol_types::private::SolTypeValue for CoprocessorV2 { + #[inline] + fn stv_to_tokens(&self) -> ::Token<'_> { + ( + ::tokenize( + &self.name, + ), + ::tokenize( + &self.txSenderAddress, + ), + ::tokenize( + &self.signerAddress, + ), + ::tokenize( + &self.storageUrl, + ), + ) + } + #[inline] + fn stv_abi_encoded_size(&self) -> usize { + if let Some(size) = ::ENCODED_SIZE { + return size; + } + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_encoded_size(&tuple) + } + #[inline] + fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { + ::eip712_hash_struct(self) + } + #[inline] + fn stv_abi_encode_packed_to( + &self, + out: &mut alloy_sol_types::private::Vec, + ) { + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_encode_packed_to(&tuple, out) + } + #[inline] + fn stv_abi_packed_encoded_size(&self) -> usize { + if let Some(size) = ::PACKED_ENCODED_SIZE { + return size; + } + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_packed_encoded_size(&tuple) + } + } + #[automatically_derived] + impl alloy_sol_types::SolType for CoprocessorV2 { + type RustType = Self; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SOL_NAME: &'static str = ::NAME; + const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; + const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; + #[inline] + fn valid_token(token: &Self::Token<'_>) -> bool { + as alloy_sol_types::SolType>::valid_token(token) + } + #[inline] + fn detokenize(token: Self::Token<'_>) -> Self::RustType { + let tuple = as alloy_sol_types::SolType>::detokenize(token); + >>::from(tuple) + } + } + #[automatically_derived] + impl alloy_sol_types::SolStruct for CoprocessorV2 { + const NAME: &'static str = "CoprocessorV2"; + #[inline] + fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { + alloy_sol_types::private::Cow::Borrowed( + "CoprocessorV2(string name,address txSenderAddress,address signerAddress,string storageUrl)", + ) + } + #[inline] + fn eip712_components() -> alloy_sol_types::private::Vec< + alloy_sol_types::private::Cow<'static, str>, + > { + alloy_sol_types::private::Vec::new() + } + #[inline] + fn eip712_encode_type() -> alloy_sol_types::private::Cow<'static, str> { + ::eip712_root_type() + } + #[inline] + fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { + [ + ::eip712_data_word( + &self.name, + ) + .0, + ::eip712_data_word( + &self.txSenderAddress, + ) + .0, + ::eip712_data_word( + &self.signerAddress, + ) + .0, + ::eip712_data_word( + &self.storageUrl, + ) + .0, + ] + .concat() + } + } + #[automatically_derived] + impl alloy_sol_types::EventTopic for CoprocessorV2 { + #[inline] + fn topic_preimage_length(rust: &Self::RustType) -> usize { + 0usize + + ::topic_preimage_length( + &rust.name, + ) + + ::topic_preimage_length( + &rust.txSenderAddress, + ) + + ::topic_preimage_length( + &rust.signerAddress, + ) + + ::topic_preimage_length( + &rust.storageUrl, + ) + } + #[inline] + fn encode_topic_preimage( + rust: &Self::RustType, + out: &mut alloy_sol_types::private::Vec, + ) { + out.reserve( + ::topic_preimage_length(rust), + ); + ::encode_topic_preimage( + &rust.name, + out, + ); + ::encode_topic_preimage( + &rust.txSenderAddress, + out, + ); + ::encode_topic_preimage( + &rust.signerAddress, + out, + ); + ::encode_topic_preimage( + &rust.storageUrl, + out, + ); + } + #[inline] + fn encode_topic( + rust: &Self::RustType, + ) -> alloy_sol_types::abi::token::WordToken { + let mut out = alloy_sol_types::private::Vec::new(); + ::encode_topic_preimage( + rust, + &mut out, + ); + alloy_sol_types::abi::token::WordToken( + alloy_sol_types::private::keccak256(out), + ) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ActiveContextOngoing(uint256)` and selector `0x7eea432b`. +```solidity +error ActiveContextOngoing(uint256 activeContextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ActiveContextOngoing { + #[allow(missing_docs)] + pub activeContextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ActiveContextOngoing) -> Self { + (value.activeContextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ActiveContextOngoing { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { activeContextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ActiveContextOngoing { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ActiveContextOngoing(uint256)"; + const SELECTOR: [u8; 4] = [126u8, 234u8, 67u8, 43u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.activeContextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `AddressEmptyCode(address)` and selector `0x9996b315`. +```solidity +error AddressEmptyCode(address target); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct AddressEmptyCode { + #[allow(missing_docs)] + pub target: alloy::sol_types::private::Address, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: AddressEmptyCode) -> Self { + (value.target,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for AddressEmptyCode { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { target: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for AddressEmptyCode { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "AddressEmptyCode(address)"; + const SELECTOR: [u8; 4] = [153u8, 150u8, 179u8, 21u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.target, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextAlreadyExists(uint256)` and selector `0x6653f6d7`. +```solidity +error ContextAlreadyExists(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextAlreadyExists { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ContextAlreadyExists) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ContextAlreadyExists { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextAlreadyExists { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextAlreadyExists(uint256)"; + const SELECTOR: [u8; 4] = [102u8, 83u8, 246u8, 215u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextDoesNotExist(uint256)` and selector `0x61544cfc`. +```solidity +error ContextDoesNotExist(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextDoesNotExist { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ContextDoesNotExist) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ContextDoesNotExist { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextDoesNotExist { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextDoesNotExist(uint256)"; + const SELECTOR: [u8; 4] = [97u8, 84u8, 76u8, 252u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextIsActive(uint256)` and selector `0xcd494e49`. +```solidity +error ContextIsActive(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextIsActive { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ContextIsActive) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ContextIsActive { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextIsActive { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextIsActive(uint256)"; + const SELECTOR: [u8; 4] = [205u8, 73u8, 78u8, 73u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextIsGenerating(uint256)` and selector `0x0ddd14ca`. +```solidity +error ContextIsGenerating(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextIsGenerating { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ContextIsGenerating) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ContextIsGenerating { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextIsGenerating { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextIsGenerating(uint256)"; + const SELECTOR: [u8; 4] = [13u8, 221u8, 20u8, 202u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextNotActive(uint256)` and selector `0x331486b3`. +```solidity +error ContextNotActive(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextNotActive { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ContextNotActive) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ContextNotActive { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextNotActive { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextNotActive(uint256)"; + const SELECTOR: [u8; 4] = [51u8, 20u8, 134u8, 179u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextNotGenerated(uint256)` and selector `0xc0b5ee66`. +```solidity +error ContextNotGenerated(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextNotGenerated { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ContextNotGenerated) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ContextNotGenerated { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextNotGenerated { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextNotGenerated(uint256)"; + const SELECTOR: [u8; 4] = [192u8, 181u8, 238u8, 102u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextNotPreActivatedOrSuspended(uint256)` and selector `0x12b49e3d`. +```solidity +error ContextNotPreActivatedOrSuspended(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextNotPreActivatedOrSuspended { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: ContextNotPreActivatedOrSuspended) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for ContextNotPreActivatedOrSuspended { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextNotPreActivatedOrSuspended { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextNotPreActivatedOrSuspended(uint256)"; + const SELECTOR: [u8; 4] = [18u8, 180u8, 158u8, 61u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ContextNotSuspended(uint256)` and selector `0x77bf5846`. +```solidity +error ContextNotSuspended(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextNotSuspended { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ContextNotSuspended) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ContextNotSuspended { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ContextNotSuspended { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ContextNotSuspended(uint256)"; + const SELECTOR: [u8; 4] = [119u8, 191u8, 88u8, 70u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `CoprocessorContextNotInitialized(uint256)` and selector `0xabf9e7b0`. +```solidity +error CoprocessorContextNotInitialized(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct CoprocessorContextNotInitialized { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: CoprocessorContextNotInitialized) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for CoprocessorContextNotInitialized { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for CoprocessorContextNotInitialized { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "CoprocessorContextNotInitialized(uint256)"; + const SELECTOR: [u8; 4] = [171u8, 249u8, 231u8, 176u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `CoprocessorSignerAddressesNotUnique(address,uint256,(string,address,address,string)[])` and selector `0xc826e1a2`. +```solidity +error CoprocessorSignerAddressesNotUnique(address signerAddress, uint256 coprocessorIndex, CoprocessorV2[] coprocessors); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct CoprocessorSignerAddressesNotUnique { + #[allow(missing_docs)] + pub signerAddress: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub coprocessorIndex: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Address, + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Vec< + ::RustType, + >, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: CoprocessorSignerAddressesNotUnique) -> Self { + (value.signerAddress, value.coprocessorIndex, value.coprocessors) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for CoprocessorSignerAddressesNotUnique { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + signerAddress: tuple.0, + coprocessorIndex: tuple.1, + coprocessors: tuple.2, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for CoprocessorSignerAddressesNotUnique { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "CoprocessorSignerAddressesNotUnique(address,uint256,(string,address,address,string)[])"; + const SELECTOR: [u8; 4] = [200u8, 38u8, 225u8, 162u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.signerAddress, + ), + as alloy_sol_types::SolType>::tokenize(&self.coprocessorIndex), + as alloy_sol_types::SolType>::tokenize(&self.coprocessors), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `CoprocessorTxSenderAddressesNotUnique(address,uint256,(string,address,address,string)[])` and selector `0x64d52759`. +```solidity +error CoprocessorTxSenderAddressesNotUnique(address txSenderAddress, uint256 coprocessorIndex, CoprocessorV2[] coprocessors); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct CoprocessorTxSenderAddressesNotUnique { + #[allow(missing_docs)] + pub txSenderAddress: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub coprocessorIndex: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Address, + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Vec< + ::RustType, + >, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: CoprocessorTxSenderAddressesNotUnique) -> Self { + (value.txSenderAddress, value.coprocessorIndex, value.coprocessors) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for CoprocessorTxSenderAddressesNotUnique { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + txSenderAddress: tuple.0, + coprocessorIndex: tuple.1, + coprocessors: tuple.2, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for CoprocessorTxSenderAddressesNotUnique { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "CoprocessorTxSenderAddressesNotUnique(address,uint256,(string,address,address,string)[])"; + const SELECTOR: [u8; 4] = [100u8, 213u8, 39u8, 89u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.txSenderAddress, + ), + as alloy_sol_types::SolType>::tokenize(&self.coprocessorIndex), + as alloy_sol_types::SolType>::tokenize(&self.coprocessors), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ERC1967InvalidImplementation(address)` and selector `0x4c9c8ce3`. +```solidity +error ERC1967InvalidImplementation(address implementation); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ERC1967InvalidImplementation { + #[allow(missing_docs)] + pub implementation: alloy::sol_types::private::Address, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: ERC1967InvalidImplementation) -> Self { + (value.implementation,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for ERC1967InvalidImplementation { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { implementation: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ERC1967InvalidImplementation { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ERC1967InvalidImplementation(address)"; + const SELECTOR: [u8; 4] = [76u8, 156u8, 140u8, 227u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.implementation, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `ERC1967NonPayable()` and selector `0xb398979f`. +```solidity +error ERC1967NonPayable(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ERC1967NonPayable; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ERC1967NonPayable) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for ERC1967NonPayable { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for ERC1967NonPayable { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "ERC1967NonPayable()"; + const SELECTOR: [u8; 4] = [179u8, 152u8, 151u8, 159u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `EmptyCoprocessors()` and selector `0x8af082ef`. +```solidity +error EmptyCoprocessors(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct EmptyCoprocessors; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: EmptyCoprocessors) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for EmptyCoprocessors { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for EmptyCoprocessors { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "EmptyCoprocessors()"; + const SELECTOR: [u8; 4] = [138u8, 240u8, 130u8, 239u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `FailedCall()` and selector `0xd6bda275`. +```solidity +error FailedCall(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct FailedCall; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: FailedCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for FailedCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for FailedCall { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "FailedCall()"; + const SELECTOR: [u8; 4] = [214u8, 189u8, 162u8, 117u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `HostChainNotRegistered(uint256)` and selector `0xb6679c3b`. +```solidity +error HostChainNotRegistered(uint256 chainId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct HostChainNotRegistered { + #[allow(missing_docs)] + pub chainId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: HostChainNotRegistered) -> Self { + (value.chainId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for HostChainNotRegistered { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { chainId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for HostChainNotRegistered { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "HostChainNotRegistered(uint256)"; + const SELECTOR: [u8; 4] = [182u8, 103u8, 156u8, 59u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.chainId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InvalidContextStatusForceUpdate(uint256,uint8)` and selector `0xf0bed68f`. +```solidity +error InvalidContextStatusForceUpdate(uint256 contextId, ContextStatus status); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidContextStatusForceUpdate { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub status: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + ContextStatus, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: InvalidContextStatusForceUpdate) -> Self { + (value.contextId, value.status) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for InvalidContextStatusForceUpdate { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + status: tuple.1, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InvalidContextStatusForceUpdate { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InvalidContextStatusForceUpdate(uint256,uint8)"; + const SELECTOR: [u8; 4] = [240u8, 190u8, 214u8, 143u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize(&self.status), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InvalidInitialization()` and selector `0xf92ee8a9`. +```solidity +error InvalidInitialization(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidInitialization; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: InvalidInitialization) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for InvalidInitialization { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InvalidInitialization { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InvalidInitialization()"; + const SELECTOR: [u8; 4] = [249u8, 46u8, 232u8, 169u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InvalidNullContextId()` and selector `0xcb17b7a5`. +```solidity +error InvalidNullContextId(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidNullContextId; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: InvalidNullContextId) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for InvalidNullContextId { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InvalidNullContextId { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InvalidNullContextId()"; + const SELECTOR: [u8; 4] = [203u8, 23u8, 183u8, 165u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NoActiveCoprocessorContext()` and selector `0x046593ea`. +```solidity +error NoActiveCoprocessorContext(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NoActiveCoprocessorContext; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NoActiveCoprocessorContext) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NoActiveCoprocessorContext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NoActiveCoprocessorContext { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NoActiveCoprocessorContext()"; + const SELECTOR: [u8; 4] = [4u8, 101u8, 147u8, 234u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NoPreActivationCoprocessorContext()` and selector `0xb9e861b2`. +```solidity +error NoPreActivationCoprocessorContext(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NoPreActivationCoprocessorContext; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NoPreActivationCoprocessorContext) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NoPreActivationCoprocessorContext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NoPreActivationCoprocessorContext { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NoPreActivationCoprocessorContext()"; + const SELECTOR: [u8; 4] = [185u8, 232u8, 97u8, 178u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NoSuspendedCoprocessorContext()` and selector `0x21fb08f9`. +```solidity +error NoSuspendedCoprocessorContext(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NoSuspendedCoprocessorContext; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NoSuspendedCoprocessorContext) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NoSuspendedCoprocessorContext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NoSuspendedCoprocessorContext { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NoSuspendedCoprocessorContext()"; + const SELECTOR: [u8; 4] = [33u8, 251u8, 8u8, 249u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NotCoprocessorFromContext(uint256,address)` and selector `0xc312e73e`. +```solidity +error NotCoprocessorFromContext(uint256 contextId, address coprocessorTxSenderAddress); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NotCoprocessorFromContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub coprocessorTxSenderAddress: alloy::sol_types::private::Address, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NotCoprocessorFromContext) -> Self { + (value.contextId, value.coprocessorTxSenderAddress) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NotCoprocessorFromContext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + coprocessorTxSenderAddress: tuple.1, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NotCoprocessorFromContext { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NotCoprocessorFromContext(uint256,address)"; + const SELECTOR: [u8; 4] = [195u8, 18u8, 231u8, 62u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.coprocessorTxSenderAddress, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NotCustodianSigner(address)` and selector `0x391672a7`. +```solidity +error NotCustodianSigner(address signerAddress); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NotCustodianSigner { + #[allow(missing_docs)] + pub signerAddress: alloy::sol_types::private::Address, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: NotCustodianSigner) -> Self { + (value.signerAddress,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for NotCustodianSigner { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { signerAddress: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NotCustodianSigner { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NotCustodianSigner(address)"; + const SELECTOR: [u8; 4] = [57u8, 22u8, 114u8, 167u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.signerAddress, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NotCustodianTxSender(address)` and selector `0xf924a0cf`. +```solidity +error NotCustodianTxSender(address txSenderAddress); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NotCustodianTxSender { + #[allow(missing_docs)] + pub txSenderAddress: alloy::sol_types::private::Address, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: NotCustodianTxSender) -> Self { + (value.txSenderAddress,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for NotCustodianTxSender { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { txSenderAddress: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NotCustodianTxSender { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NotCustodianTxSender(address)"; + const SELECTOR: [u8; 4] = [249u8, 36u8, 160u8, 207u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.txSenderAddress, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NotGatewayOwner(address)` and selector `0x0e56cf3d`. +```solidity +error NotGatewayOwner(address sender); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NotGatewayOwner { + #[allow(missing_docs)] + pub sender: alloy::sol_types::private::Address, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: NotGatewayOwner) -> Self { + (value.sender,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for NotGatewayOwner { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { sender: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NotGatewayOwner { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NotGatewayOwner(address)"; + const SELECTOR: [u8; 4] = [14u8, 86u8, 207u8, 61u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.sender, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NotInitializing()` and selector `0xd7e6bcf8`. +```solidity +error NotInitializing(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NotInitializing; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: NotInitializing) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for NotInitializing { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NotInitializing { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NotInitializing()"; + const SELECTOR: [u8; 4] = [215u8, 230u8, 188u8, 248u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NotInitializingFromEmptyProxy()` and selector `0x6f4f731f`. +```solidity +error NotInitializingFromEmptyProxy(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NotInitializingFromEmptyProxy; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NotInitializingFromEmptyProxy) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NotInitializingFromEmptyProxy { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NotInitializingFromEmptyProxy { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NotInitializingFromEmptyProxy()"; + const SELECTOR: [u8; 4] = [111u8, 79u8, 115u8, 31u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NotKmsSigner(address)` and selector `0x2a7c6ef6`. +```solidity +error NotKmsSigner(address signerAddress); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NotKmsSigner { + #[allow(missing_docs)] + pub signerAddress: alloy::sol_types::private::Address, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: NotKmsSigner) -> Self { + (value.signerAddress,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for NotKmsSigner { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { signerAddress: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NotKmsSigner { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NotKmsSigner(address)"; + const SELECTOR: [u8; 4] = [42u8, 124u8, 110u8, 246u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.signerAddress, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NotKmsTxSender(address)` and selector `0xaee86323`. +```solidity +error NotKmsTxSender(address txSenderAddress); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NotKmsTxSender { + #[allow(missing_docs)] + pub txSenderAddress: alloy::sol_types::private::Address, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: NotKmsTxSender) -> Self { + (value.txSenderAddress,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for NotKmsTxSender { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { txSenderAddress: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NotKmsTxSender { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NotKmsTxSender(address)"; + const SELECTOR: [u8; 4] = [174u8, 232u8, 99u8, 35u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.txSenderAddress, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NullCoprocessorSignerAddress(uint256,(string,address,address,string)[])` and selector `0x4a6c5974`. +```solidity +error NullCoprocessorSignerAddress(uint256 coprocessorIndex, CoprocessorV2[] coprocessors); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NullCoprocessorSignerAddress { + #[allow(missing_docs)] + pub coprocessorIndex: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Vec< + ::RustType, + >, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NullCoprocessorSignerAddress) -> Self { + (value.coprocessorIndex, value.coprocessors) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NullCoprocessorSignerAddress { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + coprocessorIndex: tuple.0, + coprocessors: tuple.1, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NullCoprocessorSignerAddress { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NullCoprocessorSignerAddress(uint256,(string,address,address,string)[])"; + const SELECTOR: [u8; 4] = [74u8, 108u8, 89u8, 116u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.coprocessorIndex), + as alloy_sol_types::SolType>::tokenize(&self.coprocessors), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NullCoprocessorTxSenderAddress(uint256,(string,address,address,string)[])` and selector `0x9edb7861`. +```solidity +error NullCoprocessorTxSenderAddress(uint256 coprocessorIndex, CoprocessorV2[] coprocessors); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NullCoprocessorTxSenderAddress { + #[allow(missing_docs)] + pub coprocessorIndex: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Vec< + ::RustType, + >, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NullCoprocessorTxSenderAddress) -> Self { + (value.coprocessorIndex, value.coprocessors) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NullCoprocessorTxSenderAddress { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + coprocessorIndex: tuple.0, + coprocessors: tuple.1, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NullCoprocessorTxSenderAddress { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NullCoprocessorTxSenderAddress(uint256,(string,address,address,string)[])"; + const SELECTOR: [u8; 4] = [158u8, 219u8, 120u8, 97u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.coprocessorIndex), + as alloy_sol_types::SolType>::tokenize(&self.coprocessors), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `PreActivationContextOngoing(uint256)` and selector `0xc470c022`. +```solidity +error PreActivationContextOngoing(uint256 preActivationContextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct PreActivationContextOngoing { + #[allow(missing_docs)] + pub preActivationContextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: PreActivationContextOngoing) -> Self { + (value.preActivationContextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for PreActivationContextOngoing { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + preActivationContextId: tuple.0, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for PreActivationContextOngoing { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "PreActivationContextOngoing(uint256)"; + const SELECTOR: [u8; 4] = [196u8, 112u8, 192u8, 34u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize( + &self.preActivationContextId, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `SuspendedContextOngoing(uint256)` and selector `0x7022ec41`. +```solidity +error SuspendedContextOngoing(uint256 suspendedContextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct SuspendedContextOngoing { + #[allow(missing_docs)] + pub suspendedContextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: SuspendedContextOngoing) -> Self { + (value.suspendedContextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for SuspendedContextOngoing { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + suspendedContextId: tuple.0, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for SuspendedContextOngoing { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "SuspendedContextOngoing(uint256)"; + const SELECTOR: [u8; 4] = [112u8, 34u8, 236u8, 65u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.suspendedContextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `UUPSUnauthorizedCallContext()` and selector `0xe07c8dba`. +```solidity +error UUPSUnauthorizedCallContext(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct UUPSUnauthorizedCallContext; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: UUPSUnauthorizedCallContext) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for UUPSUnauthorizedCallContext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for UUPSUnauthorizedCallContext { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "UUPSUnauthorizedCallContext()"; + const SELECTOR: [u8; 4] = [224u8, 124u8, 141u8, 186u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `UUPSUnsupportedProxiableUUID(bytes32)` and selector `0xaa1d49a4`. +```solidity +error UUPSUnsupportedProxiableUUID(bytes32 slot); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct UUPSUnsupportedProxiableUUID { + #[allow(missing_docs)] + pub slot: alloy::sol_types::private::FixedBytes<32>, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::FixedBytes<32>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::FixedBytes<32>,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: UUPSUnsupportedProxiableUUID) -> Self { + (value.slot,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for UUPSUnsupportedProxiableUUID { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { slot: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for UUPSUnsupportedProxiableUUID { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "UUPSUnsupportedProxiableUUID(bytes32)"; + const SELECTOR: [u8; 4] = [170u8, 29u8, 73u8, 164u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.slot), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `ActivateCoprocessorContext(uint256)` and selector `0x6c8c04c9fea337720b7dfadca365e850035114fd081b58d030afbe8b5dc3be71`. +```solidity +event ActivateCoprocessorContext(uint256 contextId); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct ActivateCoprocessorContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for ActivateCoprocessorContext { + type DataTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "ActivateCoprocessorContext(uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 108u8, 140u8, 4u8, 201u8, 254u8, 163u8, 55u8, 114u8, 11u8, 125u8, 250u8, + 220u8, 163u8, 101u8, 232u8, 80u8, 3u8, 81u8, 20u8, 253u8, 8u8, 27u8, + 88u8, 208u8, 48u8, 175u8, 190u8, 139u8, 93u8, 195u8, 190u8, 113u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { contextId: data.0 } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for ActivateCoprocessorContext { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&ActivateCoprocessorContext> for alloy_sol_types::private::LogData { + #[inline] + fn from( + this: &ActivateCoprocessorContext, + ) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `CompromiseCoprocessorContext(uint256)` and selector `0xee7ef83963417125d27430789fc6e94194381e82c3cda68260d0e7cfc31eaf21`. +```solidity +event CompromiseCoprocessorContext(uint256 contextId); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct CompromiseCoprocessorContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for CompromiseCoprocessorContext { + type DataTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "CompromiseCoprocessorContext(uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 238u8, 126u8, 248u8, 57u8, 99u8, 65u8, 113u8, 37u8, 210u8, 116u8, 48u8, + 120u8, 159u8, 198u8, 233u8, 65u8, 148u8, 56u8, 30u8, 130u8, 195u8, 205u8, + 166u8, 130u8, 96u8, 208u8, 231u8, 207u8, 195u8, 30u8, 175u8, 33u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { contextId: data.0 } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for CompromiseCoprocessorContext { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&CompromiseCoprocessorContext> for alloy_sol_types::private::LogData { + #[inline] + fn from( + this: &CompromiseCoprocessorContext, + ) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `DeactivateCoprocessorContext(uint256)` and selector `0x1baa08d8de18e8e2287691b1309748010981ebdfd12a173d8574657548a52898`. +```solidity +event DeactivateCoprocessorContext(uint256 contextId); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct DeactivateCoprocessorContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for DeactivateCoprocessorContext { + type DataTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "DeactivateCoprocessorContext(uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 27u8, 170u8, 8u8, 216u8, 222u8, 24u8, 232u8, 226u8, 40u8, 118u8, 145u8, + 177u8, 48u8, 151u8, 72u8, 1u8, 9u8, 129u8, 235u8, 223u8, 209u8, 42u8, + 23u8, 61u8, 133u8, 116u8, 101u8, 117u8, 72u8, 165u8, 40u8, 152u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { contextId: data.0 } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for DeactivateCoprocessorContext { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&DeactivateCoprocessorContext> for alloy_sol_types::private::LogData { + #[inline] + fn from( + this: &DeactivateCoprocessorContext, + ) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `DestroyCoprocessorContext(uint256)` and selector `0xf20b299804c9c1d6da3b82414c7aa0a845cdbabae2d90e46e360a379a77b7be5`. +```solidity +event DestroyCoprocessorContext(uint256 contextId); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct DestroyCoprocessorContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for DestroyCoprocessorContext { + type DataTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "DestroyCoprocessorContext(uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 242u8, 11u8, 41u8, 152u8, 4u8, 201u8, 193u8, 214u8, 218u8, 59u8, 130u8, + 65u8, 76u8, 122u8, 160u8, 168u8, 69u8, 205u8, 186u8, 186u8, 226u8, 217u8, + 14u8, 70u8, 227u8, 96u8, 163u8, 121u8, 167u8, 123u8, 123u8, 229u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { contextId: data.0 } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for DestroyCoprocessorContext { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&DestroyCoprocessorContext> for alloy_sol_types::private::LogData { + #[inline] + fn from( + this: &DestroyCoprocessorContext, + ) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `InitializeCoprocessorContexts(bytes,(string,address,address,string)[])` and selector `0xd474068ecf914caa04868493bcefa56bfb049a54f1612c2726d112e1e60663b9`. +```solidity +event InitializeCoprocessorContexts(bytes blob, CoprocessorV2[] coprocessors); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct InitializeCoprocessorContexts { + #[allow(missing_docs)] + pub blob: alloy::sol_types::private::Bytes, + #[allow(missing_docs)] + pub coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for InitializeCoprocessorContexts { + type DataTuple<'a> = ( + alloy::sol_types::sol_data::Bytes, + alloy::sol_types::sol_data::Array, + ); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "InitializeCoprocessorContexts(bytes,(string,address,address,string)[])"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 212u8, 116u8, 6u8, 142u8, 207u8, 145u8, 76u8, 170u8, 4u8, 134u8, 132u8, + 147u8, 188u8, 239u8, 165u8, 107u8, 251u8, 4u8, 154u8, 84u8, 241u8, 97u8, + 44u8, 39u8, 38u8, 209u8, 18u8, 225u8, 230u8, 6u8, 99u8, 185u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { + blob: data.0, + coprocessors: data.1, + } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + ::tokenize( + &self.blob, + ), + as alloy_sol_types::SolType>::tokenize(&self.coprocessors), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for InitializeCoprocessorContexts { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&InitializeCoprocessorContexts> for alloy_sol_types::private::LogData { + #[inline] + fn from( + this: &InitializeCoprocessorContexts, + ) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `Initialized(uint64)` and selector `0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2`. +```solidity +event Initialized(uint64 version); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct Initialized { + #[allow(missing_docs)] + pub version: u64, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for Initialized { + type DataTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "Initialized(uint64)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 199u8, 245u8, 5u8, 178u8, 243u8, 113u8, 174u8, 33u8, 117u8, 238u8, 73u8, + 19u8, 244u8, 73u8, 158u8, 31u8, 38u8, 51u8, 167u8, 181u8, 147u8, 99u8, + 33u8, 238u8, 209u8, 205u8, 174u8, 182u8, 17u8, 81u8, 129u8, 210u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { version: data.0 } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.version), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for Initialized { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&Initialized> for alloy_sol_types::private::LogData { + #[inline] + fn from(this: &Initialized) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `NewCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256))` and selector `0xbbb104c495886e5daa3efb6b281ec2840c69385af5cbfc1582fcf700de1ecd4b`. +```solidity +event NewCoprocessorContext(CoprocessorContext activeCoprocessorContext, CoprocessorContext newCoprocessorContext, CoprocessorContextTimePeriods timePeriods); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct NewCoprocessorContext { + #[allow(missing_docs)] + pub activeCoprocessorContext: ::RustType, + #[allow(missing_docs)] + pub newCoprocessorContext: ::RustType, + #[allow(missing_docs)] + pub timePeriods: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for NewCoprocessorContext { + type DataTuple<'a> = ( + CoprocessorContext, + CoprocessorContext, + CoprocessorContextTimePeriods, + ); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "NewCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256))"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 187u8, 177u8, 4u8, 196u8, 149u8, 136u8, 110u8, 93u8, 170u8, 62u8, 251u8, + 107u8, 40u8, 30u8, 194u8, 132u8, 12u8, 105u8, 56u8, 90u8, 245u8, 203u8, + 252u8, 21u8, 130u8, 252u8, 247u8, 0u8, 222u8, 30u8, 205u8, 75u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { + activeCoprocessorContext: data.0, + newCoprocessorContext: data.1, + timePeriods: data.2, + } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + ::tokenize( + &self.activeCoprocessorContext, + ), + ::tokenize( + &self.newCoprocessorContext, + ), + ::tokenize( + &self.timePeriods, + ), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for NewCoprocessorContext { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&NewCoprocessorContext> for alloy_sol_types::private::LogData { + #[inline] + fn from(this: &NewCoprocessorContext) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `PreActivateCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),uint256)` and selector `0x0425f54e602cbcf87fafd6a0b557fa5c4bc4bc6c251686255eb3bd775f452377`. +```solidity +event PreActivateCoprocessorContext(CoprocessorContext newCoprocessorContext, uint256 activationBlockTimestamp); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct PreActivateCoprocessorContext { + #[allow(missing_docs)] + pub newCoprocessorContext: ::RustType, + #[allow(missing_docs)] + pub activationBlockTimestamp: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for PreActivateCoprocessorContext { + type DataTuple<'a> = ( + CoprocessorContext, + alloy::sol_types::sol_data::Uint<256>, + ); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "PreActivateCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 4u8, 37u8, 245u8, 78u8, 96u8, 44u8, 188u8, 248u8, 127u8, 175u8, 214u8, + 160u8, 181u8, 87u8, 250u8, 92u8, 75u8, 196u8, 188u8, 108u8, 37u8, 22u8, + 134u8, 37u8, 94u8, 179u8, 189u8, 119u8, 95u8, 69u8, 35u8, 119u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { + newCoprocessorContext: data.0, + activationBlockTimestamp: data.1, + } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + ::tokenize( + &self.newCoprocessorContext, + ), + as alloy_sol_types::SolType>::tokenize( + &self.activationBlockTimestamp, + ), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for PreActivateCoprocessorContext { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&PreActivateCoprocessorContext> for alloy_sol_types::private::LogData { + #[inline] + fn from( + this: &PreActivateCoprocessorContext, + ) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `SuspendCoprocessorContext(uint256,uint256)` and selector `0x3080f2b80dda4748ca2926a641fa5007735058dc5f5ab2594eeca74197a3accc`. +```solidity +event SuspendCoprocessorContext(uint256 contextId, uint256 deactivatedBlockTimestamp); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct SuspendCoprocessorContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub deactivatedBlockTimestamp: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for SuspendCoprocessorContext { + type DataTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + ); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "SuspendCoprocessorContext(uint256,uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 48u8, 128u8, 242u8, 184u8, 13u8, 218u8, 71u8, 72u8, 202u8, 41u8, 38u8, + 166u8, 65u8, 250u8, 80u8, 7u8, 115u8, 80u8, 88u8, 220u8, 95u8, 90u8, + 178u8, 89u8, 78u8, 236u8, 167u8, 65u8, 151u8, 163u8, 172u8, 204u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { + contextId: data.0, + deactivatedBlockTimestamp: data.1, + } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + as alloy_sol_types::SolType>::tokenize( + &self.deactivatedBlockTimestamp, + ), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for SuspendCoprocessorContext { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&SuspendCoprocessorContext> for alloy_sol_types::private::LogData { + #[inline] + fn from( + this: &SuspendCoprocessorContext, + ) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `Upgraded(address)` and selector `0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b`. +```solidity +event Upgraded(address indexed implementation); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct Upgraded { + #[allow(missing_docs)] + pub implementation: alloy::sol_types::private::Address, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for Upgraded { + type DataTuple<'a> = (); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = ( + alloy_sol_types::sol_data::FixedBytes<32>, + alloy::sol_types::sol_data::Address, + ); + const SIGNATURE: &'static str = "Upgraded(address)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 188u8, 124u8, 215u8, 90u8, 32u8, 238u8, 39u8, 253u8, 154u8, 222u8, 186u8, + 179u8, 32u8, 65u8, 247u8, 85u8, 33u8, 77u8, 188u8, 107u8, 255u8, 169u8, + 12u8, 192u8, 34u8, 91u8, 57u8, 218u8, 46u8, 92u8, 45u8, 59u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { implementation: topics.1 } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + () + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(), self.implementation.clone()) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + out[1usize] = ::encode_topic( + &self.implementation, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for Upgraded { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&Upgraded> for alloy_sol_types::private::LogData { + #[inline] + fn from(this: &Upgraded) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + /**Constructor`. +```solidity +constructor(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct constructorCall {} + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: constructorCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for constructorCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolConstructor for constructorCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc`. +```solidity +function UPGRADE_INTERFACE_VERSION() external view returns (string memory); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct UPGRADE_INTERFACE_VERSIONCall; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`UPGRADE_INTERFACE_VERSION()`](UPGRADE_INTERFACE_VERSIONCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct UPGRADE_INTERFACE_VERSIONReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::String, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: UPGRADE_INTERFACE_VERSIONCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for UPGRADE_INTERFACE_VERSIONCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::String,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::String,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: UPGRADE_INTERFACE_VERSIONReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for UPGRADE_INTERFACE_VERSIONReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for UPGRADE_INTERFACE_VERSIONCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::String; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::String,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "UPGRADE_INTERFACE_VERSION()"; + const SELECTOR: [u8; 4] = [173u8, 60u8, 177u8, 204u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + ::tokenize( + ret, + ), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: UPGRADE_INTERFACE_VERSIONReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: UPGRADE_INTERFACE_VERSIONReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `addCoprocessorContext(bytes,(string,address,address,string)[],(uint256,uint256))` and selector `0xa1364d79`. +```solidity +function addCoprocessorContext(bytes memory blob, CoprocessorV2[] memory coprocessors, CoprocessorContextTimePeriods memory timePeriods) external; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct addCoprocessorContextCall { + #[allow(missing_docs)] + pub blob: alloy::sol_types::private::Bytes, + #[allow(missing_docs)] + pub coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + #[allow(missing_docs)] + pub timePeriods: ::RustType, + } + ///Container type for the return parameters of the [`addCoprocessorContext(bytes,(string,address,address,string)[],(uint256,uint256))`](addCoprocessorContextCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct addCoprocessorContextReturn {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Bytes, + alloy::sol_types::sol_data::Array, + CoprocessorContextTimePeriods, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Bytes, + alloy::sol_types::private::Vec< + ::RustType, + >, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: addCoprocessorContextCall) -> Self { + (value.blob, value.coprocessors, value.timePeriods) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for addCoprocessorContextCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + blob: tuple.0, + coprocessors: tuple.1, + timePeriods: tuple.2, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: addCoprocessorContextReturn) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for addCoprocessorContextReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl addCoprocessorContextReturn { + fn _tokenize( + &self, + ) -> ::ReturnToken< + '_, + > { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for addCoprocessorContextCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Bytes, + alloy::sol_types::sol_data::Array, + CoprocessorContextTimePeriods, + ); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = addCoprocessorContextReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "addCoprocessorContext(bytes,(string,address,address,string)[],(uint256,uint256))"; + const SELECTOR: [u8; 4] = [161u8, 54u8, 77u8, 121u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.blob, + ), + as alloy_sol_types::SolType>::tokenize(&self.coprocessors), + ::tokenize( + &self.timePeriods, + ), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + addCoprocessorContextReturn::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `forceUpdateCoprocessorContextToStatus(uint256,uint8)` and selector `0xcac6a5a8`. +```solidity +function forceUpdateCoprocessorContextToStatus(uint256 contextId, ContextStatus status) external; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct forceUpdateCoprocessorContextToStatusCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub status: ::RustType, + } + ///Container type for the return parameters of the [`forceUpdateCoprocessorContextToStatus(uint256,uint8)`](forceUpdateCoprocessorContextToStatusCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct forceUpdateCoprocessorContextToStatusReturn {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + ContextStatus, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: forceUpdateCoprocessorContextToStatusCall) -> Self { + (value.contextId, value.status) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for forceUpdateCoprocessorContextToStatusCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + status: tuple.1, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: forceUpdateCoprocessorContextToStatusReturn) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for forceUpdateCoprocessorContextToStatusReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl forceUpdateCoprocessorContextToStatusReturn { + fn _tokenize( + &self, + ) -> ::ReturnToken< + '_, + > { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for forceUpdateCoprocessorContextToStatusCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>, ContextStatus); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = forceUpdateCoprocessorContextToStatusReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "forceUpdateCoprocessorContextToStatus(uint256,uint8)"; + const SELECTOR: [u8; 4] = [202u8, 198u8, 165u8, 168u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize(&self.status), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + forceUpdateCoprocessorContextToStatusReturn::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getActiveCoprocessorContext()` and selector `0xfed9716b`. +```solidity +function getActiveCoprocessorContext() external view returns (CoprocessorContext memory); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getActiveCoprocessorContextCall; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getActiveCoprocessorContext()`](getActiveCoprocessorContextCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getActiveCoprocessorContextReturn { + #[allow(missing_docs)] + pub _0: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getActiveCoprocessorContextCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getActiveCoprocessorContextCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (CoprocessorContext,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getActiveCoprocessorContextReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getActiveCoprocessorContextReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getActiveCoprocessorContextCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = ::RustType; + type ReturnTuple<'a> = (CoprocessorContext,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getActiveCoprocessorContext()"; + const SELECTOR: [u8; 4] = [254u8, 217u8, 113u8, 107u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + (::tokenize(ret),) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getActiveCoprocessorContextReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getActiveCoprocessorContextReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getActiveCoprocessorContextId()` and selector `0x991dc36d`. +```solidity +function getActiveCoprocessorContextId() external view returns (uint256); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getActiveCoprocessorContextIdCall; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getActiveCoprocessorContextId()`](getActiveCoprocessorContextIdCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getActiveCoprocessorContextIdReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getActiveCoprocessorContextIdCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getActiveCoprocessorContextIdCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getActiveCoprocessorContextIdReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getActiveCoprocessorContextIdReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getActiveCoprocessorContextIdCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getActiveCoprocessorContextId()"; + const SELECTOR: [u8; 4] = [153u8, 29u8, 195u8, 109u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getActiveCoprocessorContextIdReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getActiveCoprocessorContextIdReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getCoprocessor(uint256,address)` and selector `0x820a91f8`. +```solidity +function getCoprocessor(uint256 contextId, address coprocessorTxSenderAddress) external view returns (CoprocessorV2 memory); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub coprocessorTxSenderAddress: alloy::sol_types::private::Address, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getCoprocessor(uint256,address)`](getCoprocessorCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorReturn { + #[allow(missing_docs)] + pub _0: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorCall) -> Self { + (value.contextId, value.coprocessorTxSenderAddress) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for getCoprocessorCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + coprocessorTxSenderAddress: tuple.1, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (CoprocessorV2,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getCoprocessorCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = ::RustType; + type ReturnTuple<'a> = (CoprocessorV2,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getCoprocessor(uint256,address)"; + const SELECTOR: [u8; 4] = [130u8, 10u8, 145u8, 248u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.coprocessorTxSenderAddress, + ), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + (::tokenize(ret),) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getCoprocessorReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getCoprocessorReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getCoprocessorActivationBlockTimestamp(uint256)` and selector `0xb3f5403a`. +```solidity +function getCoprocessorActivationBlockTimestamp(uint256 contextId) external view returns (uint256); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorActivationBlockTimestampCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getCoprocessorActivationBlockTimestamp(uint256)`](getCoprocessorActivationBlockTimestampCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorActivationBlockTimestampReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorActivationBlockTimestampCall) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorActivationBlockTimestampCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorActivationBlockTimestampReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorActivationBlockTimestampReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getCoprocessorActivationBlockTimestampCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getCoprocessorActivationBlockTimestamp(uint256)"; + const SELECTOR: [u8; 4] = [179u8, 245u8, 64u8, 58u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getCoprocessorActivationBlockTimestampReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getCoprocessorActivationBlockTimestampReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getCoprocessorContextStatus(uint256)` and selector `0x888b99e0`. +```solidity +function getCoprocessorContextStatus(uint256 contextId) external view returns (ContextStatus); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorContextStatusCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getCoprocessorContextStatus(uint256)`](getCoprocessorContextStatusCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorContextStatusReturn { + #[allow(missing_docs)] + pub _0: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorContextStatusCall) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorContextStatusCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (ContextStatus,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorContextStatusReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorContextStatusReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getCoprocessorContextStatusCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = ::RustType; + type ReturnTuple<'a> = (ContextStatus,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getCoprocessorContextStatus(uint256)"; + const SELECTOR: [u8; 4] = [136u8, 139u8, 153u8, 224u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + (::tokenize(ret),) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getCoprocessorContextStatusReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getCoprocessorContextStatusReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getCoprocessorDeactivatedBlockTimestamp(uint256)` and selector `0xa9b4d071`. +```solidity +function getCoprocessorDeactivatedBlockTimestamp(uint256 contextId) external view returns (uint256); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorDeactivatedBlockTimestampCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getCoprocessorDeactivatedBlockTimestamp(uint256)`](getCoprocessorDeactivatedBlockTimestampCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorDeactivatedBlockTimestampReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorDeactivatedBlockTimestampCall) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorDeactivatedBlockTimestampCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorDeactivatedBlockTimestampReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorDeactivatedBlockTimestampReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getCoprocessorDeactivatedBlockTimestampCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getCoprocessorDeactivatedBlockTimestamp(uint256)"; + const SELECTOR: [u8; 4] = [169u8, 180u8, 208u8, 113u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getCoprocessorDeactivatedBlockTimestampReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getCoprocessorDeactivatedBlockTimestampReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getCoprocessorMajorityThreshold(uint256)` and selector `0xf88174ea`. +```solidity +function getCoprocessorMajorityThreshold(uint256 contextId) external view returns (uint256); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorMajorityThresholdCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getCoprocessorMajorityThreshold(uint256)`](getCoprocessorMajorityThresholdCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorMajorityThresholdReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorMajorityThresholdCall) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorMajorityThresholdCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorMajorityThresholdReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorMajorityThresholdReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getCoprocessorMajorityThresholdCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getCoprocessorMajorityThreshold(uint256)"; + const SELECTOR: [u8; 4] = [248u8, 129u8, 116u8, 234u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getCoprocessorMajorityThresholdReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getCoprocessorMajorityThresholdReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getCoprocessorSigners(uint256)` and selector `0x41618fe9`. +```solidity +function getCoprocessorSigners(uint256 contextId) external view returns (address[] memory); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorSignersCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getCoprocessorSigners(uint256)`](getCoprocessorSignersCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorSignersReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::Vec, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorSignersCall) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorSignersCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Vec, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorSignersReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorSignersReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getCoprocessorSignersCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::Vec< + alloy::sol_types::private::Address, + >; + type ReturnTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getCoprocessorSigners(uint256)"; + const SELECTOR: [u8; 4] = [65u8, 97u8, 143u8, 233u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getCoprocessorSignersReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getCoprocessorSignersReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getCoprocessorTxSenders(uint256)` and selector `0x049f25ef`. +```solidity +function getCoprocessorTxSenders(uint256 contextId) external view returns (address[] memory); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorTxSendersCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getCoprocessorTxSenders(uint256)`](getCoprocessorTxSendersCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorTxSendersReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::Vec, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorTxSendersCall) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorTxSendersCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Vec, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorTxSendersReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorTxSendersReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getCoprocessorTxSendersCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::Vec< + alloy::sol_types::private::Address, + >; + type ReturnTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getCoprocessorTxSenders(uint256)"; + const SELECTOR: [u8; 4] = [4u8, 159u8, 37u8, 239u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getCoprocessorTxSendersReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getCoprocessorTxSendersReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getPreActivationCoprocessorContextId()` and selector `0xbe91187b`. +```solidity +function getPreActivationCoprocessorContextId() external view returns (uint256); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getPreActivationCoprocessorContextIdCall; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getPreActivationCoprocessorContextId()`](getPreActivationCoprocessorContextIdCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getPreActivationCoprocessorContextIdReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getPreActivationCoprocessorContextIdCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getPreActivationCoprocessorContextIdCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getPreActivationCoprocessorContextIdReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getPreActivationCoprocessorContextIdReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getPreActivationCoprocessorContextIdCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getPreActivationCoprocessorContextId()"; + const SELECTOR: [u8; 4] = [190u8, 145u8, 24u8, 123u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getPreActivationCoprocessorContextIdReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getPreActivationCoprocessorContextIdReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getSuspendedCoprocessorContextId()` and selector `0x086e4e1c`. +```solidity +function getSuspendedCoprocessorContextId() external view returns (uint256); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getSuspendedCoprocessorContextIdCall; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getSuspendedCoprocessorContextId()`](getSuspendedCoprocessorContextIdCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getSuspendedCoprocessorContextIdReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getSuspendedCoprocessorContextIdCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getSuspendedCoprocessorContextIdCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getSuspendedCoprocessorContextIdReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getSuspendedCoprocessorContextIdReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getSuspendedCoprocessorContextIdCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getSuspendedCoprocessorContextId()"; + const SELECTOR: [u8; 4] = [8u8, 110u8, 78u8, 28u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getSuspendedCoprocessorContextIdReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getSuspendedCoprocessorContextIdReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getVersion()` and selector `0x0d8e6e2c`. +```solidity +function getVersion() external pure returns (string memory); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getVersionCall; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getVersion()`](getVersionCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getVersionReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::String, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getVersionCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for getVersionCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::String,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::String,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getVersionReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for getVersionReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getVersionCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::String; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::String,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getVersion()"; + const SELECTOR: [u8; 4] = [13u8, 142u8, 110u8, 44u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + ::tokenize( + ret, + ), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getVersionReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getVersionReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `initializeFromEmptyProxy(bytes,(string,address,address,string)[])` and selector `0xecfb0b94`. +```solidity +function initializeFromEmptyProxy(bytes memory initialBlob, CoprocessorV2[] memory initialCoprocessors) external; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct initializeFromEmptyProxyCall { + #[allow(missing_docs)] + pub initialBlob: alloy::sol_types::private::Bytes, + #[allow(missing_docs)] + pub initialCoprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + } + ///Container type for the return parameters of the [`initializeFromEmptyProxy(bytes,(string,address,address,string)[])`](initializeFromEmptyProxyCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct initializeFromEmptyProxyReturn {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Bytes, + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Bytes, + alloy::sol_types::private::Vec< + ::RustType, + >, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: initializeFromEmptyProxyCall) -> Self { + (value.initialBlob, value.initialCoprocessors) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for initializeFromEmptyProxyCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + initialBlob: tuple.0, + initialCoprocessors: tuple.1, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: initializeFromEmptyProxyReturn) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for initializeFromEmptyProxyReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl initializeFromEmptyProxyReturn { + fn _tokenize( + &self, + ) -> ::ReturnToken< + '_, + > { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for initializeFromEmptyProxyCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Bytes, + alloy::sol_types::sol_data::Array, + ); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = initializeFromEmptyProxyReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "initializeFromEmptyProxy(bytes,(string,address,address,string)[])"; + const SELECTOR: [u8; 4] = [236u8, 251u8, 11u8, 148u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.initialBlob, + ), + as alloy_sol_types::SolType>::tokenize(&self.initialCoprocessors), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + initializeFromEmptyProxyReturn::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `isCoprocessorContextOperating(uint256)` and selector `0xcd8e993c`. +```solidity +function isCoprocessorContextOperating(uint256 contextId) external view returns (bool); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isCoprocessorContextOperatingCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`isCoprocessorContextOperating(uint256)`](isCoprocessorContextOperatingCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isCoprocessorContextOperatingReturn { + #[allow(missing_docs)] + pub _0: bool, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: isCoprocessorContextOperatingCall) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for isCoprocessorContextOperatingCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Bool,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (bool,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: isCoprocessorContextOperatingReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for isCoprocessorContextOperatingReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for isCoprocessorContextOperatingCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = bool; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "isCoprocessorContextOperating(uint256)"; + const SELECTOR: [u8; 4] = [205u8, 142u8, 153u8, 60u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + ::tokenize( + ret, + ), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: isCoprocessorContextOperatingReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: isCoprocessorContextOperatingReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `isCoprocessorSigner(uint256,address)` and selector `0xcdbb5a82`. +```solidity +function isCoprocessorSigner(uint256 contextId, address signerAddress) external view returns (bool); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isCoprocessorSignerCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub signerAddress: alloy::sol_types::private::Address, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`isCoprocessorSigner(uint256,address)`](isCoprocessorSignerCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isCoprocessorSignerReturn { + #[allow(missing_docs)] + pub _0: bool, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: isCoprocessorSignerCall) -> Self { + (value.contextId, value.signerAddress) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for isCoprocessorSignerCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + signerAddress: tuple.1, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Bool,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (bool,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: isCoprocessorSignerReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for isCoprocessorSignerReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for isCoprocessorSignerCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = bool; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "isCoprocessorSigner(uint256,address)"; + const SELECTOR: [u8; 4] = [205u8, 187u8, 90u8, 130u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.signerAddress, + ), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + ::tokenize( + ret, + ), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: isCoprocessorSignerReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: isCoprocessorSignerReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `isCoprocessorTxSender(uint256,address)` and selector `0x8625e876`. +```solidity +function isCoprocessorTxSender(uint256 contextId, address txSenderAddress) external view returns (bool); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isCoprocessorTxSenderCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub txSenderAddress: alloy::sol_types::private::Address, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`isCoprocessorTxSender(uint256,address)`](isCoprocessorTxSenderCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isCoprocessorTxSenderReturn { + #[allow(missing_docs)] + pub _0: bool, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: isCoprocessorTxSenderCall) -> Self { + (value.contextId, value.txSenderAddress) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for isCoprocessorTxSenderCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + txSenderAddress: tuple.1, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Bool,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (bool,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: isCoprocessorTxSenderReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for isCoprocessorTxSenderReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for isCoprocessorTxSenderCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = bool; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "isCoprocessorTxSender(uint256,address)"; + const SELECTOR: [u8; 4] = [134u8, 37u8, 232u8, 118u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.txSenderAddress, + ), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + ::tokenize( + ret, + ), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: isCoprocessorTxSenderReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: isCoprocessorTxSenderReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `proxiableUUID()` and selector `0x52d1902d`. +```solidity +function proxiableUUID() external view returns (bytes32); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct proxiableUUIDCall; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`proxiableUUID()`](proxiableUUIDCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct proxiableUUIDReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::FixedBytes<32>, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: proxiableUUIDCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for proxiableUUIDCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::FixedBytes<32>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::FixedBytes<32>,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: proxiableUUIDReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for proxiableUUIDReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for proxiableUUIDCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::FixedBytes<32>; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::FixedBytes<32>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "proxiableUUID()"; + const SELECTOR: [u8; 4] = [82u8, 209u8, 144u8, 45u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: proxiableUUIDReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: proxiableUUIDReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `refreshCoprocessorContextStatuses()` and selector `0x3a5162e6`. +```solidity +function refreshCoprocessorContextStatuses() external; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct refreshCoprocessorContextStatusesCall; + ///Container type for the return parameters of the [`refreshCoprocessorContextStatuses()`](refreshCoprocessorContextStatusesCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct refreshCoprocessorContextStatusesReturn {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: refreshCoprocessorContextStatusesCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for refreshCoprocessorContextStatusesCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: refreshCoprocessorContextStatusesReturn) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for refreshCoprocessorContextStatusesReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl refreshCoprocessorContextStatusesReturn { + fn _tokenize( + &self, + ) -> ::ReturnToken< + '_, + > { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for refreshCoprocessorContextStatusesCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = refreshCoprocessorContextStatusesReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "refreshCoprocessorContextStatuses()"; + const SELECTOR: [u8; 4] = [58u8, 81u8, 98u8, 230u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + refreshCoprocessorContextStatusesReturn::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `swapSuspendedCoprocessorContextWithActive(uint256)` and selector `0x86dfc7de`. +```solidity +function swapSuspendedCoprocessorContextWithActive(uint256 suspendedTimePeriod) external; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct swapSuspendedCoprocessorContextWithActiveCall { + #[allow(missing_docs)] + pub suspendedTimePeriod: alloy::sol_types::private::primitives::aliases::U256, + } + ///Container type for the return parameters of the [`swapSuspendedCoprocessorContextWithActive(uint256)`](swapSuspendedCoprocessorContextWithActiveCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct swapSuspendedCoprocessorContextWithActiveReturn {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: swapSuspendedCoprocessorContextWithActiveCall) -> Self { + (value.suspendedTimePeriod,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for swapSuspendedCoprocessorContextWithActiveCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + suspendedTimePeriod: tuple.0, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: swapSuspendedCoprocessorContextWithActiveReturn) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for swapSuspendedCoprocessorContextWithActiveReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl swapSuspendedCoprocessorContextWithActiveReturn { + fn _tokenize( + &self, + ) -> ::ReturnToken< + '_, + > { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for swapSuspendedCoprocessorContextWithActiveCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = swapSuspendedCoprocessorContextWithActiveReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "swapSuspendedCoprocessorContextWithActive(uint256)"; + const SELECTOR: [u8; 4] = [134u8, 223u8, 199u8, 222u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.suspendedTimePeriod), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + swapSuspendedCoprocessorContextWithActiveReturn::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286`. +```solidity +function upgradeToAndCall(address newImplementation, bytes memory data) external payable; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct upgradeToAndCallCall { + #[allow(missing_docs)] + pub newImplementation: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub data: alloy::sol_types::private::Bytes, + } + ///Container type for the return parameters of the [`upgradeToAndCall(address,bytes)`](upgradeToAndCallCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct upgradeToAndCallReturn {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Bytes, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Address, + alloy::sol_types::private::Bytes, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: upgradeToAndCallCall) -> Self { + (value.newImplementation, value.data) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for upgradeToAndCallCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + newImplementation: tuple.0, + data: tuple.1, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: upgradeToAndCallReturn) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for upgradeToAndCallReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl upgradeToAndCallReturn { + fn _tokenize( + &self, + ) -> ::ReturnToken<'_> { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for upgradeToAndCallCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Bytes, + ); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = upgradeToAndCallReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "upgradeToAndCall(address,bytes)"; + const SELECTOR: [u8; 4] = [79u8, 30u8, 242u8, 134u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.newImplementation, + ), + ::tokenize( + &self.data, + ), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + upgradeToAndCallReturn::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + ///Container for all the [`CoprocessorContexts`](self) function calls. + #[derive(serde::Serialize, serde::Deserialize)] + #[derive()] + pub enum CoprocessorContextsCalls { + #[allow(missing_docs)] + UPGRADE_INTERFACE_VERSION(UPGRADE_INTERFACE_VERSIONCall), + #[allow(missing_docs)] + addCoprocessorContext(addCoprocessorContextCall), + #[allow(missing_docs)] + forceUpdateCoprocessorContextToStatus(forceUpdateCoprocessorContextToStatusCall), + #[allow(missing_docs)] + getActiveCoprocessorContext(getActiveCoprocessorContextCall), + #[allow(missing_docs)] + getActiveCoprocessorContextId(getActiveCoprocessorContextIdCall), + #[allow(missing_docs)] + getCoprocessor(getCoprocessorCall), + #[allow(missing_docs)] + getCoprocessorActivationBlockTimestamp( + getCoprocessorActivationBlockTimestampCall, + ), + #[allow(missing_docs)] + getCoprocessorContextStatus(getCoprocessorContextStatusCall), + #[allow(missing_docs)] + getCoprocessorDeactivatedBlockTimestamp( + getCoprocessorDeactivatedBlockTimestampCall, + ), + #[allow(missing_docs)] + getCoprocessorMajorityThreshold(getCoprocessorMajorityThresholdCall), + #[allow(missing_docs)] + getCoprocessorSigners(getCoprocessorSignersCall), + #[allow(missing_docs)] + getCoprocessorTxSenders(getCoprocessorTxSendersCall), + #[allow(missing_docs)] + getPreActivationCoprocessorContextId(getPreActivationCoprocessorContextIdCall), + #[allow(missing_docs)] + getSuspendedCoprocessorContextId(getSuspendedCoprocessorContextIdCall), + #[allow(missing_docs)] + getVersion(getVersionCall), + #[allow(missing_docs)] + initializeFromEmptyProxy(initializeFromEmptyProxyCall), + #[allow(missing_docs)] + isCoprocessorContextOperating(isCoprocessorContextOperatingCall), + #[allow(missing_docs)] + isCoprocessorSigner(isCoprocessorSignerCall), + #[allow(missing_docs)] + isCoprocessorTxSender(isCoprocessorTxSenderCall), + #[allow(missing_docs)] + proxiableUUID(proxiableUUIDCall), + #[allow(missing_docs)] + refreshCoprocessorContextStatuses(refreshCoprocessorContextStatusesCall), + #[allow(missing_docs)] + swapSuspendedCoprocessorContextWithActive( + swapSuspendedCoprocessorContextWithActiveCall, + ), + #[allow(missing_docs)] + upgradeToAndCall(upgradeToAndCallCall), + } + #[automatically_derived] + impl CoprocessorContextsCalls { + /// All the selectors of this enum. + /// + /// Note that the selectors might not be in the same order as the variants. + /// No guarantees are made about the order of the selectors. + /// + /// Prefer using `SolInterface` methods instead. + pub const SELECTORS: &'static [[u8; 4usize]] = &[ + [4u8, 159u8, 37u8, 239u8], + [8u8, 110u8, 78u8, 28u8], + [13u8, 142u8, 110u8, 44u8], + [58u8, 81u8, 98u8, 230u8], + [65u8, 97u8, 143u8, 233u8], + [79u8, 30u8, 242u8, 134u8], + [82u8, 209u8, 144u8, 45u8], + [130u8, 10u8, 145u8, 248u8], + [134u8, 37u8, 232u8, 118u8], + [134u8, 223u8, 199u8, 222u8], + [136u8, 139u8, 153u8, 224u8], + [153u8, 29u8, 195u8, 109u8], + [161u8, 54u8, 77u8, 121u8], + [169u8, 180u8, 208u8, 113u8], + [173u8, 60u8, 177u8, 204u8], + [179u8, 245u8, 64u8, 58u8], + [190u8, 145u8, 24u8, 123u8], + [202u8, 198u8, 165u8, 168u8], + [205u8, 142u8, 153u8, 60u8], + [205u8, 187u8, 90u8, 130u8], + [236u8, 251u8, 11u8, 148u8], + [248u8, 129u8, 116u8, 234u8], + [254u8, 217u8, 113u8, 107u8], + ]; + } + #[automatically_derived] + impl alloy_sol_types::SolInterface for CoprocessorContextsCalls { + const NAME: &'static str = "CoprocessorContextsCalls"; + const MIN_DATA_LENGTH: usize = 0usize; + const COUNT: usize = 23usize; + #[inline] + fn selector(&self) -> [u8; 4] { + match self { + Self::UPGRADE_INTERFACE_VERSION(_) => { + ::SELECTOR + } + Self::addCoprocessorContext(_) => { + ::SELECTOR + } + Self::forceUpdateCoprocessorContextToStatus(_) => { + ::SELECTOR + } + Self::getActiveCoprocessorContext(_) => { + ::SELECTOR + } + Self::getActiveCoprocessorContextId(_) => { + ::SELECTOR + } + Self::getCoprocessor(_) => { + ::SELECTOR + } + Self::getCoprocessorActivationBlockTimestamp(_) => { + ::SELECTOR + } + Self::getCoprocessorContextStatus(_) => { + ::SELECTOR + } + Self::getCoprocessorDeactivatedBlockTimestamp(_) => { + ::SELECTOR + } + Self::getCoprocessorMajorityThreshold(_) => { + ::SELECTOR + } + Self::getCoprocessorSigners(_) => { + ::SELECTOR + } + Self::getCoprocessorTxSenders(_) => { + ::SELECTOR + } + Self::getPreActivationCoprocessorContextId(_) => { + ::SELECTOR + } + Self::getSuspendedCoprocessorContextId(_) => { + ::SELECTOR + } + Self::getVersion(_) => { + ::SELECTOR + } + Self::initializeFromEmptyProxy(_) => { + ::SELECTOR + } + Self::isCoprocessorContextOperating(_) => { + ::SELECTOR + } + Self::isCoprocessorSigner(_) => { + ::SELECTOR + } + Self::isCoprocessorTxSender(_) => { + ::SELECTOR + } + Self::proxiableUUID(_) => { + ::SELECTOR + } + Self::refreshCoprocessorContextStatuses(_) => { + ::SELECTOR + } + Self::swapSuspendedCoprocessorContextWithActive(_) => { + ::SELECTOR + } + Self::upgradeToAndCall(_) => { + ::SELECTOR + } + } + } + #[inline] + fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { + Self::SELECTORS.get(i).copied() + } + #[inline] + fn valid_selector(selector: [u8; 4]) -> bool { + Self::SELECTORS.binary_search(&selector).is_ok() + } + #[inline] + #[allow(non_snake_case)] + fn abi_decode_raw( + selector: [u8; 4], + data: &[u8], + ) -> alloy_sol_types::Result { + static DECODE_SHIMS: &[fn( + &[u8], + ) -> alloy_sol_types::Result] = &[ + { + fn getCoprocessorTxSenders( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::getCoprocessorTxSenders) + } + getCoprocessorTxSenders + }, + { + fn getSuspendedCoprocessorContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsCalls::getSuspendedCoprocessorContextId, + ) + } + getSuspendedCoprocessorContextId + }, + { + fn getVersion( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::getVersion) + } + getVersion + }, + { + fn refreshCoprocessorContextStatuses( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsCalls::refreshCoprocessorContextStatuses, + ) + } + refreshCoprocessorContextStatuses + }, + { + fn getCoprocessorSigners( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::getCoprocessorSigners) + } + getCoprocessorSigners + }, + { + fn upgradeToAndCall( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::upgradeToAndCall) + } + upgradeToAndCall + }, + { + fn proxiableUUID( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::proxiableUUID) + } + proxiableUUID + }, + { + fn getCoprocessor( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::getCoprocessor) + } + getCoprocessor + }, + { + fn isCoprocessorTxSender( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::isCoprocessorTxSender) + } + isCoprocessorTxSender + }, + { + fn swapSuspendedCoprocessorContextWithActive( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsCalls::swapSuspendedCoprocessorContextWithActive, + ) + } + swapSuspendedCoprocessorContextWithActive + }, + { + fn getCoprocessorContextStatus( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::getCoprocessorContextStatus) + } + getCoprocessorContextStatus + }, + { + fn getActiveCoprocessorContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::getActiveCoprocessorContextId) + } + getActiveCoprocessorContextId + }, + { + fn addCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::addCoprocessorContext) + } + addCoprocessorContext + }, + { + fn getCoprocessorDeactivatedBlockTimestamp( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsCalls::getCoprocessorDeactivatedBlockTimestamp, + ) + } + getCoprocessorDeactivatedBlockTimestamp + }, + { + fn UPGRADE_INTERFACE_VERSION( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::UPGRADE_INTERFACE_VERSION) + } + UPGRADE_INTERFACE_VERSION + }, + { + fn getCoprocessorActivationBlockTimestamp( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsCalls::getCoprocessorActivationBlockTimestamp, + ) + } + getCoprocessorActivationBlockTimestamp + }, + { + fn getPreActivationCoprocessorContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsCalls::getPreActivationCoprocessorContextId, + ) + } + getPreActivationCoprocessorContextId + }, + { + fn forceUpdateCoprocessorContextToStatus( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsCalls::forceUpdateCoprocessorContextToStatus, + ) + } + forceUpdateCoprocessorContextToStatus + }, + { + fn isCoprocessorContextOperating( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::isCoprocessorContextOperating) + } + isCoprocessorContextOperating + }, + { + fn isCoprocessorSigner( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::isCoprocessorSigner) + } + isCoprocessorSigner + }, + { + fn initializeFromEmptyProxy( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::initializeFromEmptyProxy) + } + initializeFromEmptyProxy + }, + { + fn getCoprocessorMajorityThreshold( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsCalls::getCoprocessorMajorityThreshold, + ) + } + getCoprocessorMajorityThreshold + }, + { + fn getActiveCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsCalls::getActiveCoprocessorContext) + } + getActiveCoprocessorContext + }, + ]; + let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { + return Err( + alloy_sol_types::Error::unknown_selector( + ::NAME, + selector, + ), + ); + }; + DECODE_SHIMS[idx](data) + } + #[inline] + #[allow(non_snake_case)] + fn abi_decode_raw_validate( + selector: [u8; 4], + data: &[u8], + ) -> alloy_sol_types::Result { + static DECODE_VALIDATE_SHIMS: &[fn( + &[u8], + ) -> alloy_sol_types::Result] = &[ + { + fn getCoprocessorTxSenders( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::getCoprocessorTxSenders) + } + getCoprocessorTxSenders + }, + { + fn getSuspendedCoprocessorContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsCalls::getSuspendedCoprocessorContextId, + ) + } + getSuspendedCoprocessorContextId + }, + { + fn getVersion( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::getVersion) + } + getVersion + }, + { + fn refreshCoprocessorContextStatuses( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsCalls::refreshCoprocessorContextStatuses, + ) + } + refreshCoprocessorContextStatuses + }, + { + fn getCoprocessorSigners( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::getCoprocessorSigners) + } + getCoprocessorSigners + }, + { + fn upgradeToAndCall( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::upgradeToAndCall) + } + upgradeToAndCall + }, + { + fn proxiableUUID( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::proxiableUUID) + } + proxiableUUID + }, + { + fn getCoprocessor( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::getCoprocessor) + } + getCoprocessor + }, + { + fn isCoprocessorTxSender( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::isCoprocessorTxSender) + } + isCoprocessorTxSender + }, + { + fn swapSuspendedCoprocessorContextWithActive( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsCalls::swapSuspendedCoprocessorContextWithActive, + ) + } + swapSuspendedCoprocessorContextWithActive + }, + { + fn getCoprocessorContextStatus( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::getCoprocessorContextStatus) + } + getCoprocessorContextStatus + }, + { + fn getActiveCoprocessorContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::getActiveCoprocessorContextId) + } + getActiveCoprocessorContextId + }, + { + fn addCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::addCoprocessorContext) + } + addCoprocessorContext + }, + { + fn getCoprocessorDeactivatedBlockTimestamp( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsCalls::getCoprocessorDeactivatedBlockTimestamp, + ) + } + getCoprocessorDeactivatedBlockTimestamp + }, + { + fn UPGRADE_INTERFACE_VERSION( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::UPGRADE_INTERFACE_VERSION) + } + UPGRADE_INTERFACE_VERSION + }, + { + fn getCoprocessorActivationBlockTimestamp( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsCalls::getCoprocessorActivationBlockTimestamp, + ) + } + getCoprocessorActivationBlockTimestamp + }, + { + fn getPreActivationCoprocessorContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsCalls::getPreActivationCoprocessorContextId, + ) + } + getPreActivationCoprocessorContextId + }, + { + fn forceUpdateCoprocessorContextToStatus( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsCalls::forceUpdateCoprocessorContextToStatus, + ) + } + forceUpdateCoprocessorContextToStatus + }, + { + fn isCoprocessorContextOperating( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::isCoprocessorContextOperating) + } + isCoprocessorContextOperating + }, + { + fn isCoprocessorSigner( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::isCoprocessorSigner) + } + isCoprocessorSigner + }, + { + fn initializeFromEmptyProxy( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::initializeFromEmptyProxy) + } + initializeFromEmptyProxy + }, + { + fn getCoprocessorMajorityThreshold( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsCalls::getCoprocessorMajorityThreshold, + ) + } + getCoprocessorMajorityThreshold + }, + { + fn getActiveCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsCalls::getActiveCoprocessorContext) + } + getActiveCoprocessorContext + }, + ]; + let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { + return Err( + alloy_sol_types::Error::unknown_selector( + ::NAME, + selector, + ), + ); + }; + DECODE_VALIDATE_SHIMS[idx](data) + } + #[inline] + fn abi_encoded_size(&self) -> usize { + match self { + Self::UPGRADE_INTERFACE_VERSION(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::addCoprocessorContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::forceUpdateCoprocessorContextToStatus(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getActiveCoprocessorContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getActiveCoprocessorContextId(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getCoprocessor(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getCoprocessorActivationBlockTimestamp(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getCoprocessorContextStatus(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getCoprocessorDeactivatedBlockTimestamp(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getCoprocessorMajorityThreshold(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getCoprocessorSigners(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getCoprocessorTxSenders(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getPreActivationCoprocessorContextId(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getSuspendedCoprocessorContextId(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getVersion(inner) => { + ::abi_encoded_size(inner) + } + Self::initializeFromEmptyProxy(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::isCoprocessorContextOperating(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::isCoprocessorSigner(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::isCoprocessorTxSender(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::proxiableUUID(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::refreshCoprocessorContextStatuses(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::swapSuspendedCoprocessorContextWithActive(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::upgradeToAndCall(inner) => { + ::abi_encoded_size( + inner, + ) + } + } + } + #[inline] + fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { + match self { + Self::UPGRADE_INTERFACE_VERSION(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::addCoprocessorContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::forceUpdateCoprocessorContextToStatus(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getActiveCoprocessorContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getActiveCoprocessorContextId(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getCoprocessor(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getCoprocessorActivationBlockTimestamp(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getCoprocessorContextStatus(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getCoprocessorDeactivatedBlockTimestamp(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getCoprocessorMajorityThreshold(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getCoprocessorSigners(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getCoprocessorTxSenders(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getPreActivationCoprocessorContextId(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getSuspendedCoprocessorContextId(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getVersion(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::initializeFromEmptyProxy(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::isCoprocessorContextOperating(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::isCoprocessorSigner(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::isCoprocessorTxSender(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::proxiableUUID(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::refreshCoprocessorContextStatuses(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::swapSuspendedCoprocessorContextWithActive(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::upgradeToAndCall(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + } + } + } + ///Container for all the [`CoprocessorContexts`](self) custom errors. + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Debug, PartialEq, Eq, Hash)] + pub enum CoprocessorContextsErrors { + #[allow(missing_docs)] + ActiveContextOngoing(ActiveContextOngoing), + #[allow(missing_docs)] + AddressEmptyCode(AddressEmptyCode), + #[allow(missing_docs)] + ContextAlreadyExists(ContextAlreadyExists), + #[allow(missing_docs)] + ContextDoesNotExist(ContextDoesNotExist), + #[allow(missing_docs)] + ContextIsActive(ContextIsActive), + #[allow(missing_docs)] + ContextIsGenerating(ContextIsGenerating), + #[allow(missing_docs)] + ContextNotActive(ContextNotActive), + #[allow(missing_docs)] + ContextNotGenerated(ContextNotGenerated), + #[allow(missing_docs)] + ContextNotPreActivatedOrSuspended(ContextNotPreActivatedOrSuspended), + #[allow(missing_docs)] + ContextNotSuspended(ContextNotSuspended), + #[allow(missing_docs)] + CoprocessorContextNotInitialized(CoprocessorContextNotInitialized), + #[allow(missing_docs)] + CoprocessorSignerAddressesNotUnique(CoprocessorSignerAddressesNotUnique), + #[allow(missing_docs)] + CoprocessorTxSenderAddressesNotUnique(CoprocessorTxSenderAddressesNotUnique), + #[allow(missing_docs)] + ERC1967InvalidImplementation(ERC1967InvalidImplementation), + #[allow(missing_docs)] + ERC1967NonPayable(ERC1967NonPayable), + #[allow(missing_docs)] + EmptyCoprocessors(EmptyCoprocessors), + #[allow(missing_docs)] + FailedCall(FailedCall), + #[allow(missing_docs)] + HostChainNotRegistered(HostChainNotRegistered), + #[allow(missing_docs)] + InvalidContextStatusForceUpdate(InvalidContextStatusForceUpdate), + #[allow(missing_docs)] + InvalidInitialization(InvalidInitialization), + #[allow(missing_docs)] + InvalidNullContextId(InvalidNullContextId), + #[allow(missing_docs)] + NoActiveCoprocessorContext(NoActiveCoprocessorContext), + #[allow(missing_docs)] + NoPreActivationCoprocessorContext(NoPreActivationCoprocessorContext), + #[allow(missing_docs)] + NoSuspendedCoprocessorContext(NoSuspendedCoprocessorContext), + #[allow(missing_docs)] + NotCoprocessorFromContext(NotCoprocessorFromContext), + #[allow(missing_docs)] + NotCustodianSigner(NotCustodianSigner), + #[allow(missing_docs)] + NotCustodianTxSender(NotCustodianTxSender), + #[allow(missing_docs)] + NotGatewayOwner(NotGatewayOwner), + #[allow(missing_docs)] + NotInitializing(NotInitializing), + #[allow(missing_docs)] + NotInitializingFromEmptyProxy(NotInitializingFromEmptyProxy), + #[allow(missing_docs)] + NotKmsSigner(NotKmsSigner), + #[allow(missing_docs)] + NotKmsTxSender(NotKmsTxSender), + #[allow(missing_docs)] + NullCoprocessorSignerAddress(NullCoprocessorSignerAddress), + #[allow(missing_docs)] + NullCoprocessorTxSenderAddress(NullCoprocessorTxSenderAddress), + #[allow(missing_docs)] + PreActivationContextOngoing(PreActivationContextOngoing), + #[allow(missing_docs)] + SuspendedContextOngoing(SuspendedContextOngoing), + #[allow(missing_docs)] + UUPSUnauthorizedCallContext(UUPSUnauthorizedCallContext), + #[allow(missing_docs)] + UUPSUnsupportedProxiableUUID(UUPSUnsupportedProxiableUUID), + } + #[automatically_derived] + impl CoprocessorContextsErrors { + /// All the selectors of this enum. + /// + /// Note that the selectors might not be in the same order as the variants. + /// No guarantees are made about the order of the selectors. + /// + /// Prefer using `SolInterface` methods instead. + pub const SELECTORS: &'static [[u8; 4usize]] = &[ + [4u8, 101u8, 147u8, 234u8], + [13u8, 221u8, 20u8, 202u8], + [14u8, 86u8, 207u8, 61u8], + [18u8, 180u8, 158u8, 61u8], + [33u8, 251u8, 8u8, 249u8], + [42u8, 124u8, 110u8, 246u8], + [51u8, 20u8, 134u8, 179u8], + [57u8, 22u8, 114u8, 167u8], + [74u8, 108u8, 89u8, 116u8], + [76u8, 156u8, 140u8, 227u8], + [97u8, 84u8, 76u8, 252u8], + [100u8, 213u8, 39u8, 89u8], + [102u8, 83u8, 246u8, 215u8], + [111u8, 79u8, 115u8, 31u8], + [112u8, 34u8, 236u8, 65u8], + [119u8, 191u8, 88u8, 70u8], + [126u8, 234u8, 67u8, 43u8], + [138u8, 240u8, 130u8, 239u8], + [153u8, 150u8, 179u8, 21u8], + [158u8, 219u8, 120u8, 97u8], + [170u8, 29u8, 73u8, 164u8], + [171u8, 249u8, 231u8, 176u8], + [174u8, 232u8, 99u8, 35u8], + [179u8, 152u8, 151u8, 159u8], + [182u8, 103u8, 156u8, 59u8], + [185u8, 232u8, 97u8, 178u8], + [192u8, 181u8, 238u8, 102u8], + [195u8, 18u8, 231u8, 62u8], + [196u8, 112u8, 192u8, 34u8], + [200u8, 38u8, 225u8, 162u8], + [203u8, 23u8, 183u8, 165u8], + [205u8, 73u8, 78u8, 73u8], + [214u8, 189u8, 162u8, 117u8], + [215u8, 230u8, 188u8, 248u8], + [224u8, 124u8, 141u8, 186u8], + [240u8, 190u8, 214u8, 143u8], + [249u8, 36u8, 160u8, 207u8], + [249u8, 46u8, 232u8, 169u8], + ]; + } + #[automatically_derived] + impl alloy_sol_types::SolInterface for CoprocessorContextsErrors { + const NAME: &'static str = "CoprocessorContextsErrors"; + const MIN_DATA_LENGTH: usize = 0usize; + const COUNT: usize = 38usize; + #[inline] + fn selector(&self) -> [u8; 4] { + match self { + Self::ActiveContextOngoing(_) => { + ::SELECTOR + } + Self::AddressEmptyCode(_) => { + ::SELECTOR + } + Self::ContextAlreadyExists(_) => { + ::SELECTOR + } + Self::ContextDoesNotExist(_) => { + ::SELECTOR + } + Self::ContextIsActive(_) => { + ::SELECTOR + } + Self::ContextIsGenerating(_) => { + ::SELECTOR + } + Self::ContextNotActive(_) => { + ::SELECTOR + } + Self::ContextNotGenerated(_) => { + ::SELECTOR + } + Self::ContextNotPreActivatedOrSuspended(_) => { + ::SELECTOR + } + Self::ContextNotSuspended(_) => { + ::SELECTOR + } + Self::CoprocessorContextNotInitialized(_) => { + ::SELECTOR + } + Self::CoprocessorSignerAddressesNotUnique(_) => { + ::SELECTOR + } + Self::CoprocessorTxSenderAddressesNotUnique(_) => { + ::SELECTOR + } + Self::ERC1967InvalidImplementation(_) => { + ::SELECTOR + } + Self::ERC1967NonPayable(_) => { + ::SELECTOR + } + Self::EmptyCoprocessors(_) => { + ::SELECTOR + } + Self::FailedCall(_) => { + ::SELECTOR + } + Self::HostChainNotRegistered(_) => { + ::SELECTOR + } + Self::InvalidContextStatusForceUpdate(_) => { + ::SELECTOR + } + Self::InvalidInitialization(_) => { + ::SELECTOR + } + Self::InvalidNullContextId(_) => { + ::SELECTOR + } + Self::NoActiveCoprocessorContext(_) => { + ::SELECTOR + } + Self::NoPreActivationCoprocessorContext(_) => { + ::SELECTOR + } + Self::NoSuspendedCoprocessorContext(_) => { + ::SELECTOR + } + Self::NotCoprocessorFromContext(_) => { + ::SELECTOR + } + Self::NotCustodianSigner(_) => { + ::SELECTOR + } + Self::NotCustodianTxSender(_) => { + ::SELECTOR + } + Self::NotGatewayOwner(_) => { + ::SELECTOR + } + Self::NotInitializing(_) => { + ::SELECTOR + } + Self::NotInitializingFromEmptyProxy(_) => { + ::SELECTOR + } + Self::NotKmsSigner(_) => { + ::SELECTOR + } + Self::NotKmsTxSender(_) => { + ::SELECTOR + } + Self::NullCoprocessorSignerAddress(_) => { + ::SELECTOR + } + Self::NullCoprocessorTxSenderAddress(_) => { + ::SELECTOR + } + Self::PreActivationContextOngoing(_) => { + ::SELECTOR + } + Self::SuspendedContextOngoing(_) => { + ::SELECTOR + } + Self::UUPSUnauthorizedCallContext(_) => { + ::SELECTOR + } + Self::UUPSUnsupportedProxiableUUID(_) => { + ::SELECTOR + } + } + } + #[inline] + fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { + Self::SELECTORS.get(i).copied() + } + #[inline] + fn valid_selector(selector: [u8; 4]) -> bool { + Self::SELECTORS.binary_search(&selector).is_ok() + } + #[inline] + #[allow(non_snake_case)] + fn abi_decode_raw( + selector: [u8; 4], + data: &[u8], + ) -> alloy_sol_types::Result { + static DECODE_SHIMS: &[fn( + &[u8], + ) -> alloy_sol_types::Result] = &[ + { + fn NoActiveCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::NoActiveCoprocessorContext) + } + NoActiveCoprocessorContext + }, + { + fn ContextIsGenerating( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::ContextIsGenerating) + } + ContextIsGenerating + }, + { + fn NotGatewayOwner( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::NotGatewayOwner) + } + NotGatewayOwner + }, + { + fn ContextNotPreActivatedOrSuspended( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsErrors::ContextNotPreActivatedOrSuspended, + ) + } + ContextNotPreActivatedOrSuspended + }, + { + fn NoSuspendedCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsErrors::NoSuspendedCoprocessorContext, + ) + } + NoSuspendedCoprocessorContext + }, + { + fn NotKmsSigner( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw(data) + .map(CoprocessorContextsErrors::NotKmsSigner) + } + NotKmsSigner + }, + { + fn ContextNotActive( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::ContextNotActive) + } + ContextNotActive + }, + { + fn NotCustodianSigner( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::NotCustodianSigner) + } + NotCustodianSigner + }, + { + fn NullCoprocessorSignerAddress( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::NullCoprocessorSignerAddress) + } + NullCoprocessorSignerAddress + }, + { + fn ERC1967InvalidImplementation( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::ERC1967InvalidImplementation) + } + ERC1967InvalidImplementation + }, + { + fn ContextDoesNotExist( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::ContextDoesNotExist) + } + ContextDoesNotExist + }, + { + fn CoprocessorTxSenderAddressesNotUnique( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsErrors::CoprocessorTxSenderAddressesNotUnique, + ) + } + CoprocessorTxSenderAddressesNotUnique + }, + { + fn ContextAlreadyExists( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::ContextAlreadyExists) + } + ContextAlreadyExists + }, + { + fn NotInitializingFromEmptyProxy( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsErrors::NotInitializingFromEmptyProxy, + ) + } + NotInitializingFromEmptyProxy + }, + { + fn SuspendedContextOngoing( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::SuspendedContextOngoing) + } + SuspendedContextOngoing + }, + { + fn ContextNotSuspended( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::ContextNotSuspended) + } + ContextNotSuspended + }, + { + fn ActiveContextOngoing( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::ActiveContextOngoing) + } + ActiveContextOngoing + }, + { + fn EmptyCoprocessors( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::EmptyCoprocessors) + } + EmptyCoprocessors + }, + { + fn AddressEmptyCode( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::AddressEmptyCode) + } + AddressEmptyCode + }, + { + fn NullCoprocessorTxSenderAddress( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsErrors::NullCoprocessorTxSenderAddress, + ) + } + NullCoprocessorTxSenderAddress + }, + { + fn UUPSUnsupportedProxiableUUID( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::UUPSUnsupportedProxiableUUID) + } + UUPSUnsupportedProxiableUUID + }, + { + fn CoprocessorContextNotInitialized( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsErrors::CoprocessorContextNotInitialized, + ) + } + CoprocessorContextNotInitialized + }, + { + fn NotKmsTxSender( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::NotKmsTxSender) + } + NotKmsTxSender + }, + { + fn ERC1967NonPayable( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::ERC1967NonPayable) + } + ERC1967NonPayable + }, + { + fn HostChainNotRegistered( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::HostChainNotRegistered) + } + HostChainNotRegistered + }, + { + fn NoPreActivationCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsErrors::NoPreActivationCoprocessorContext, + ) + } + NoPreActivationCoprocessorContext + }, + { + fn ContextNotGenerated( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::ContextNotGenerated) + } + ContextNotGenerated + }, + { + fn NotCoprocessorFromContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::NotCoprocessorFromContext) + } + NotCoprocessorFromContext + }, + { + fn PreActivationContextOngoing( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::PreActivationContextOngoing) + } + PreActivationContextOngoing + }, + { + fn CoprocessorSignerAddressesNotUnique( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsErrors::CoprocessorSignerAddressesNotUnique, + ) + } + CoprocessorSignerAddressesNotUnique + }, + { + fn InvalidNullContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::InvalidNullContextId) + } + InvalidNullContextId + }, + { + fn ContextIsActive( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::ContextIsActive) + } + ContextIsActive + }, + { + fn FailedCall( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw(data) + .map(CoprocessorContextsErrors::FailedCall) + } + FailedCall + }, + { + fn NotInitializing( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::NotInitializing) + } + NotInitializing + }, + { + fn UUPSUnauthorizedCallContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::UUPSUnauthorizedCallContext) + } + UUPSUnauthorizedCallContext + }, + { + fn InvalidContextStatusForceUpdate( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + CoprocessorContextsErrors::InvalidContextStatusForceUpdate, + ) + } + InvalidContextStatusForceUpdate + }, + { + fn NotCustodianTxSender( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::NotCustodianTxSender) + } + NotCustodianTxSender + }, + { + fn InvalidInitialization( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(CoprocessorContextsErrors::InvalidInitialization) + } + InvalidInitialization + }, + ]; + let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { + return Err( + alloy_sol_types::Error::unknown_selector( + ::NAME, + selector, + ), + ); + }; + DECODE_SHIMS[idx](data) + } + #[inline] + #[allow(non_snake_case)] + fn abi_decode_raw_validate( + selector: [u8; 4], + data: &[u8], + ) -> alloy_sol_types::Result { + static DECODE_VALIDATE_SHIMS: &[fn( + &[u8], + ) -> alloy_sol_types::Result] = &[ + { + fn NoActiveCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::NoActiveCoprocessorContext) + } + NoActiveCoprocessorContext + }, + { + fn ContextIsGenerating( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::ContextIsGenerating) + } + ContextIsGenerating + }, + { + fn NotGatewayOwner( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::NotGatewayOwner) + } + NotGatewayOwner + }, + { + fn ContextNotPreActivatedOrSuspended( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsErrors::ContextNotPreActivatedOrSuspended, + ) + } + ContextNotPreActivatedOrSuspended + }, + { + fn NoSuspendedCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsErrors::NoSuspendedCoprocessorContext, + ) + } + NoSuspendedCoprocessorContext + }, + { + fn NotKmsSigner( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::NotKmsSigner) + } + NotKmsSigner + }, + { + fn ContextNotActive( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::ContextNotActive) + } + ContextNotActive + }, + { + fn NotCustodianSigner( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::NotCustodianSigner) + } + NotCustodianSigner + }, + { + fn NullCoprocessorSignerAddress( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::NullCoprocessorSignerAddress) + } + NullCoprocessorSignerAddress + }, + { + fn ERC1967InvalidImplementation( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::ERC1967InvalidImplementation) + } + ERC1967InvalidImplementation + }, + { + fn ContextDoesNotExist( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::ContextDoesNotExist) + } + ContextDoesNotExist + }, + { + fn CoprocessorTxSenderAddressesNotUnique( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsErrors::CoprocessorTxSenderAddressesNotUnique, + ) + } + CoprocessorTxSenderAddressesNotUnique + }, + { + fn ContextAlreadyExists( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::ContextAlreadyExists) + } + ContextAlreadyExists + }, + { + fn NotInitializingFromEmptyProxy( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsErrors::NotInitializingFromEmptyProxy, + ) + } + NotInitializingFromEmptyProxy + }, + { + fn SuspendedContextOngoing( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::SuspendedContextOngoing) + } + SuspendedContextOngoing + }, + { + fn ContextNotSuspended( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::ContextNotSuspended) + } + ContextNotSuspended + }, + { + fn ActiveContextOngoing( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::ActiveContextOngoing) + } + ActiveContextOngoing + }, + { + fn EmptyCoprocessors( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::EmptyCoprocessors) + } + EmptyCoprocessors + }, + { + fn AddressEmptyCode( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::AddressEmptyCode) + } + AddressEmptyCode + }, + { + fn NullCoprocessorTxSenderAddress( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsErrors::NullCoprocessorTxSenderAddress, + ) + } + NullCoprocessorTxSenderAddress + }, + { + fn UUPSUnsupportedProxiableUUID( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::UUPSUnsupportedProxiableUUID) + } + UUPSUnsupportedProxiableUUID + }, + { + fn CoprocessorContextNotInitialized( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsErrors::CoprocessorContextNotInitialized, + ) + } + CoprocessorContextNotInitialized + }, + { + fn NotKmsTxSender( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::NotKmsTxSender) + } + NotKmsTxSender + }, + { + fn ERC1967NonPayable( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::ERC1967NonPayable) + } + ERC1967NonPayable + }, + { + fn HostChainNotRegistered( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::HostChainNotRegistered) + } + HostChainNotRegistered + }, + { + fn NoPreActivationCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsErrors::NoPreActivationCoprocessorContext, + ) + } + NoPreActivationCoprocessorContext + }, + { + fn ContextNotGenerated( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::ContextNotGenerated) + } + ContextNotGenerated + }, + { + fn NotCoprocessorFromContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::NotCoprocessorFromContext) + } + NotCoprocessorFromContext + }, + { + fn PreActivationContextOngoing( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::PreActivationContextOngoing) + } + PreActivationContextOngoing + }, + { + fn CoprocessorSignerAddressesNotUnique( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsErrors::CoprocessorSignerAddressesNotUnique, + ) + } + CoprocessorSignerAddressesNotUnique + }, + { + fn InvalidNullContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::InvalidNullContextId) + } + InvalidNullContextId + }, + { + fn ContextIsActive( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::ContextIsActive) + } + ContextIsActive + }, + { + fn FailedCall( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::FailedCall) + } + FailedCall + }, + { + fn NotInitializing( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::NotInitializing) + } + NotInitializing + }, + { + fn UUPSUnauthorizedCallContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::UUPSUnauthorizedCallContext) + } + UUPSUnauthorizedCallContext + }, + { + fn InvalidContextStatusForceUpdate( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + CoprocessorContextsErrors::InvalidContextStatusForceUpdate, + ) + } + InvalidContextStatusForceUpdate + }, + { + fn NotCustodianTxSender( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::NotCustodianTxSender) + } + NotCustodianTxSender + }, + { + fn InvalidInitialization( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(CoprocessorContextsErrors::InvalidInitialization) + } + InvalidInitialization + }, + ]; + let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { + return Err( + alloy_sol_types::Error::unknown_selector( + ::NAME, + selector, + ), + ); + }; + DECODE_VALIDATE_SHIMS[idx](data) + } + #[inline] + fn abi_encoded_size(&self) -> usize { + match self { + Self::ActiveContextOngoing(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::AddressEmptyCode(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextAlreadyExists(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextDoesNotExist(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextIsActive(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextIsGenerating(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextNotActive(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextNotGenerated(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextNotPreActivatedOrSuspended(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ContextNotSuspended(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::CoprocessorContextNotInitialized(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::CoprocessorSignerAddressesNotUnique(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::CoprocessorTxSenderAddressesNotUnique(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ERC1967InvalidImplementation(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::ERC1967NonPayable(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::EmptyCoprocessors(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::FailedCall(inner) => { + ::abi_encoded_size(inner) + } + Self::HostChainNotRegistered(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::InvalidContextStatusForceUpdate(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::InvalidInitialization(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::InvalidNullContextId(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NoActiveCoprocessorContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NoPreActivationCoprocessorContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NoSuspendedCoprocessorContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NotCoprocessorFromContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NotCustodianSigner(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NotCustodianTxSender(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NotGatewayOwner(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NotInitializing(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NotInitializingFromEmptyProxy(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NotKmsSigner(inner) => { + ::abi_encoded_size(inner) + } + Self::NotKmsTxSender(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NullCoprocessorSignerAddress(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NullCoprocessorTxSenderAddress(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::PreActivationContextOngoing(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::SuspendedContextOngoing(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::UUPSUnauthorizedCallContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::UUPSUnsupportedProxiableUUID(inner) => { + ::abi_encoded_size( + inner, + ) + } + } + } + #[inline] + fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { + match self { + Self::ActiveContextOngoing(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::AddressEmptyCode(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextAlreadyExists(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextDoesNotExist(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextIsActive(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextIsGenerating(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextNotActive(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextNotGenerated(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextNotPreActivatedOrSuspended(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ContextNotSuspended(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::CoprocessorContextNotInitialized(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::CoprocessorSignerAddressesNotUnique(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::CoprocessorTxSenderAddressesNotUnique(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ERC1967InvalidImplementation(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::ERC1967NonPayable(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::EmptyCoprocessors(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::FailedCall(inner) => { + ::abi_encode_raw(inner, out) + } + Self::HostChainNotRegistered(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::InvalidContextStatusForceUpdate(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::InvalidInitialization(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::InvalidNullContextId(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NoActiveCoprocessorContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NoPreActivationCoprocessorContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NoSuspendedCoprocessorContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NotCoprocessorFromContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NotCustodianSigner(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NotCustodianTxSender(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NotGatewayOwner(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NotInitializing(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NotInitializingFromEmptyProxy(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NotKmsSigner(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NotKmsTxSender(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NullCoprocessorSignerAddress(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NullCoprocessorTxSenderAddress(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::PreActivationContextOngoing(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::SuspendedContextOngoing(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::UUPSUnauthorizedCallContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::UUPSUnsupportedProxiableUUID(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + } + } + } + ///Container for all the [`CoprocessorContexts`](self) events. + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Debug, PartialEq, Eq, Hash)] + pub enum CoprocessorContextsEvents { + #[allow(missing_docs)] + ActivateCoprocessorContext(ActivateCoprocessorContext), + #[allow(missing_docs)] + CompromiseCoprocessorContext(CompromiseCoprocessorContext), + #[allow(missing_docs)] + DeactivateCoprocessorContext(DeactivateCoprocessorContext), + #[allow(missing_docs)] + DestroyCoprocessorContext(DestroyCoprocessorContext), + #[allow(missing_docs)] + InitializeCoprocessorContexts(InitializeCoprocessorContexts), + #[allow(missing_docs)] + Initialized(Initialized), + #[allow(missing_docs)] + NewCoprocessorContext(NewCoprocessorContext), + #[allow(missing_docs)] + PreActivateCoprocessorContext(PreActivateCoprocessorContext), + #[allow(missing_docs)] + SuspendCoprocessorContext(SuspendCoprocessorContext), + #[allow(missing_docs)] + Upgraded(Upgraded), + } + #[automatically_derived] + impl CoprocessorContextsEvents { + /// All the selectors of this enum. + /// + /// Note that the selectors might not be in the same order as the variants. + /// No guarantees are made about the order of the selectors. + /// + /// Prefer using `SolInterface` methods instead. + pub const SELECTORS: &'static [[u8; 32usize]] = &[ + [ + 4u8, 37u8, 245u8, 78u8, 96u8, 44u8, 188u8, 248u8, 127u8, 175u8, 214u8, + 160u8, 181u8, 87u8, 250u8, 92u8, 75u8, 196u8, 188u8, 108u8, 37u8, 22u8, + 134u8, 37u8, 94u8, 179u8, 189u8, 119u8, 95u8, 69u8, 35u8, 119u8, + ], + [ + 27u8, 170u8, 8u8, 216u8, 222u8, 24u8, 232u8, 226u8, 40u8, 118u8, 145u8, + 177u8, 48u8, 151u8, 72u8, 1u8, 9u8, 129u8, 235u8, 223u8, 209u8, 42u8, + 23u8, 61u8, 133u8, 116u8, 101u8, 117u8, 72u8, 165u8, 40u8, 152u8, + ], + [ + 48u8, 128u8, 242u8, 184u8, 13u8, 218u8, 71u8, 72u8, 202u8, 41u8, 38u8, + 166u8, 65u8, 250u8, 80u8, 7u8, 115u8, 80u8, 88u8, 220u8, 95u8, 90u8, + 178u8, 89u8, 78u8, 236u8, 167u8, 65u8, 151u8, 163u8, 172u8, 204u8, + ], + [ + 108u8, 140u8, 4u8, 201u8, 254u8, 163u8, 55u8, 114u8, 11u8, 125u8, 250u8, + 220u8, 163u8, 101u8, 232u8, 80u8, 3u8, 81u8, 20u8, 253u8, 8u8, 27u8, + 88u8, 208u8, 48u8, 175u8, 190u8, 139u8, 93u8, 195u8, 190u8, 113u8, + ], + [ + 187u8, 177u8, 4u8, 196u8, 149u8, 136u8, 110u8, 93u8, 170u8, 62u8, 251u8, + 107u8, 40u8, 30u8, 194u8, 132u8, 12u8, 105u8, 56u8, 90u8, 245u8, 203u8, + 252u8, 21u8, 130u8, 252u8, 247u8, 0u8, 222u8, 30u8, 205u8, 75u8, + ], + [ + 188u8, 124u8, 215u8, 90u8, 32u8, 238u8, 39u8, 253u8, 154u8, 222u8, 186u8, + 179u8, 32u8, 65u8, 247u8, 85u8, 33u8, 77u8, 188u8, 107u8, 255u8, 169u8, + 12u8, 192u8, 34u8, 91u8, 57u8, 218u8, 46u8, 92u8, 45u8, 59u8, + ], + [ + 199u8, 245u8, 5u8, 178u8, 243u8, 113u8, 174u8, 33u8, 117u8, 238u8, 73u8, + 19u8, 244u8, 73u8, 158u8, 31u8, 38u8, 51u8, 167u8, 181u8, 147u8, 99u8, + 33u8, 238u8, 209u8, 205u8, 174u8, 182u8, 17u8, 81u8, 129u8, 210u8, + ], + [ + 212u8, 116u8, 6u8, 142u8, 207u8, 145u8, 76u8, 170u8, 4u8, 134u8, 132u8, + 147u8, 188u8, 239u8, 165u8, 107u8, 251u8, 4u8, 154u8, 84u8, 241u8, 97u8, + 44u8, 39u8, 38u8, 209u8, 18u8, 225u8, 230u8, 6u8, 99u8, 185u8, + ], + [ + 238u8, 126u8, 248u8, 57u8, 99u8, 65u8, 113u8, 37u8, 210u8, 116u8, 48u8, + 120u8, 159u8, 198u8, 233u8, 65u8, 148u8, 56u8, 30u8, 130u8, 195u8, 205u8, + 166u8, 130u8, 96u8, 208u8, 231u8, 207u8, 195u8, 30u8, 175u8, 33u8, + ], + [ + 242u8, 11u8, 41u8, 152u8, 4u8, 201u8, 193u8, 214u8, 218u8, 59u8, 130u8, + 65u8, 76u8, 122u8, 160u8, 168u8, 69u8, 205u8, 186u8, 186u8, 226u8, 217u8, + 14u8, 70u8, 227u8, 96u8, 163u8, 121u8, 167u8, 123u8, 123u8, 229u8, + ], + ]; + } + #[automatically_derived] + impl alloy_sol_types::SolEventInterface for CoprocessorContextsEvents { + const NAME: &'static str = "CoprocessorContextsEvents"; + const COUNT: usize = 10usize; + fn decode_raw_log( + topics: &[alloy_sol_types::Word], + data: &[u8], + ) -> alloy_sol_types::Result { + match topics.first().copied() { + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::ActivateCoprocessorContext) + } + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::CompromiseCoprocessorContext) + } + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::DeactivateCoprocessorContext) + } + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::DestroyCoprocessorContext) + } + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::InitializeCoprocessorContexts) + } + Some(::SIGNATURE_HASH) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::Initialized) + } + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::NewCoprocessorContext) + } + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::PreActivateCoprocessorContext) + } + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::SuspendCoprocessorContext) + } + Some(::SIGNATURE_HASH) => { + ::decode_raw_log(topics, data) + .map(Self::Upgraded) + } + _ => { + alloy_sol_types::private::Err(alloy_sol_types::Error::InvalidLog { + name: ::NAME, + log: alloy_sol_types::private::Box::new( + alloy_sol_types::private::LogData::new_unchecked( + topics.to_vec(), + data.to_vec().into(), + ), + ), + }) + } + } + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for CoprocessorContextsEvents { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + match self { + Self::ActivateCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::CompromiseCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::DeactivateCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::DestroyCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::InitializeCoprocessorContexts(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::Initialized(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::NewCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::PreActivateCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::SuspendCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::Upgraded(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + } + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + match self { + Self::ActivateCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::CompromiseCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::DeactivateCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::DestroyCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::InitializeCoprocessorContexts(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::Initialized(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::NewCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::PreActivateCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::SuspendCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::Upgraded(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + } + } + } + use alloy::contract as alloy_contract; + /**Creates a new wrapper around an on-chain [`CoprocessorContexts`](self) contract instance. + +See the [wrapper's documentation](`CoprocessorContextsInstance`) for more details.*/ + #[inline] + pub const fn new< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >( + address: alloy_sol_types::private::Address, + provider: P, + ) -> CoprocessorContextsInstance { + CoprocessorContextsInstance::::new(address, provider) + } + /**Deploys this contract using the given `provider` and constructor arguments, if any. + +Returns a new instance of the contract, if the deployment was successful. + +For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ + #[inline] + pub fn deploy< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >( + provider: P, + ) -> impl ::core::future::Future< + Output = alloy_contract::Result>, + > { + CoprocessorContextsInstance::::deploy(provider) + } + /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` +and constructor arguments, if any. + +This is a simple wrapper around creating a `RawCallBuilder` with the data set to +the bytecode concatenated with the constructor's ABI-encoded arguments.*/ + #[inline] + pub fn deploy_builder< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >(provider: P) -> alloy_contract::RawCallBuilder { + CoprocessorContextsInstance::::deploy_builder(provider) + } + /**A [`CoprocessorContexts`](self) instance. + +Contains type-safe methods for interacting with an on-chain instance of the +[`CoprocessorContexts`](self) contract located at a given `address`, using a given +provider `P`. + +If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) +documentation on how to provide it), the `deploy` and `deploy_builder` methods can +be used to deploy a new instance of the contract. + +See the [module-level documentation](self) for all the available methods.*/ + #[derive(Clone)] + pub struct CoprocessorContextsInstance { + address: alloy_sol_types::private::Address, + provider: P, + _network: ::core::marker::PhantomData, + } + #[automatically_derived] + impl ::core::fmt::Debug for CoprocessorContextsInstance { + #[inline] + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.debug_tuple("CoprocessorContextsInstance").field(&self.address).finish() + } + } + /// Instantiation and getters/setters. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > CoprocessorContextsInstance { + /**Creates a new wrapper around an on-chain [`CoprocessorContexts`](self) contract instance. + +See the [wrapper's documentation](`CoprocessorContextsInstance`) for more details.*/ + #[inline] + pub const fn new( + address: alloy_sol_types::private::Address, + provider: P, + ) -> Self { + Self { + address, + provider, + _network: ::core::marker::PhantomData, + } + } + /**Deploys this contract using the given `provider` and constructor arguments, if any. + +Returns a new instance of the contract, if the deployment was successful. + +For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ + #[inline] + pub async fn deploy( + provider: P, + ) -> alloy_contract::Result> { + let call_builder = Self::deploy_builder(provider); + let contract_address = call_builder.deploy().await?; + Ok(Self::new(contract_address, call_builder.provider)) + } + /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` +and constructor arguments, if any. + +This is a simple wrapper around creating a `RawCallBuilder` with the data set to +the bytecode concatenated with the constructor's ABI-encoded arguments.*/ + #[inline] + pub fn deploy_builder(provider: P) -> alloy_contract::RawCallBuilder { + alloy_contract::RawCallBuilder::new_raw_deploy( + provider, + ::core::clone::Clone::clone(&BYTECODE), + ) + } + /// Returns a reference to the address. + #[inline] + pub const fn address(&self) -> &alloy_sol_types::private::Address { + &self.address + } + /// Sets the address. + #[inline] + pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { + self.address = address; + } + /// Sets the address and returns `self`. + pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { + self.set_address(address); + self + } + /// Returns a reference to the provider. + #[inline] + pub const fn provider(&self) -> &P { + &self.provider + } + } + impl CoprocessorContextsInstance<&P, N> { + /// Clones the provider and returns a new instance with the cloned provider. + #[inline] + pub fn with_cloned_provider(self) -> CoprocessorContextsInstance { + CoprocessorContextsInstance { + address: self.address, + provider: ::core::clone::Clone::clone(&self.provider), + _network: ::core::marker::PhantomData, + } + } + } + /// Function calls. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > CoprocessorContextsInstance { + /// Creates a new call builder using this contract instance's provider and address. + /// + /// Note that the call can be any function call, not just those defined in this + /// contract. Prefer using the other methods for building type-safe contract calls. + pub fn call_builder( + &self, + call: &C, + ) -> alloy_contract::SolCallBuilder<&P, C, N> { + alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) + } + ///Creates a new call builder for the [`UPGRADE_INTERFACE_VERSION`] function. + pub fn UPGRADE_INTERFACE_VERSION( + &self, + ) -> alloy_contract::SolCallBuilder<&P, UPGRADE_INTERFACE_VERSIONCall, N> { + self.call_builder(&UPGRADE_INTERFACE_VERSIONCall) + } + ///Creates a new call builder for the [`addCoprocessorContext`] function. + pub fn addCoprocessorContext( + &self, + blob: alloy::sol_types::private::Bytes, + coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + timePeriods: ::RustType, + ) -> alloy_contract::SolCallBuilder<&P, addCoprocessorContextCall, N> { + self.call_builder( + &addCoprocessorContextCall { + blob, + coprocessors, + timePeriods, + }, + ) + } + ///Creates a new call builder for the [`forceUpdateCoprocessorContextToStatus`] function. + pub fn forceUpdateCoprocessorContextToStatus( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + status: ::RustType, + ) -> alloy_contract::SolCallBuilder< + &P, + forceUpdateCoprocessorContextToStatusCall, + N, + > { + self.call_builder( + &forceUpdateCoprocessorContextToStatusCall { + contextId, + status, + }, + ) + } + ///Creates a new call builder for the [`getActiveCoprocessorContext`] function. + pub fn getActiveCoprocessorContext( + &self, + ) -> alloy_contract::SolCallBuilder<&P, getActiveCoprocessorContextCall, N> { + self.call_builder(&getActiveCoprocessorContextCall) + } + ///Creates a new call builder for the [`getActiveCoprocessorContextId`] function. + pub fn getActiveCoprocessorContextId( + &self, + ) -> alloy_contract::SolCallBuilder<&P, getActiveCoprocessorContextIdCall, N> { + self.call_builder(&getActiveCoprocessorContextIdCall) + } + ///Creates a new call builder for the [`getCoprocessor`] function. + pub fn getCoprocessor( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + coprocessorTxSenderAddress: alloy::sol_types::private::Address, + ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorCall, N> { + self.call_builder( + &getCoprocessorCall { + contextId, + coprocessorTxSenderAddress, + }, + ) + } + ///Creates a new call builder for the [`getCoprocessorActivationBlockTimestamp`] function. + pub fn getCoprocessorActivationBlockTimestamp( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder< + &P, + getCoprocessorActivationBlockTimestampCall, + N, + > { + self.call_builder( + &getCoprocessorActivationBlockTimestampCall { + contextId, + }, + ) + } + ///Creates a new call builder for the [`getCoprocessorContextStatus`] function. + pub fn getCoprocessorContextStatus( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorContextStatusCall, N> { + self.call_builder( + &getCoprocessorContextStatusCall { + contextId, + }, + ) + } + ///Creates a new call builder for the [`getCoprocessorDeactivatedBlockTimestamp`] function. + pub fn getCoprocessorDeactivatedBlockTimestamp( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder< + &P, + getCoprocessorDeactivatedBlockTimestampCall, + N, + > { + self.call_builder( + &getCoprocessorDeactivatedBlockTimestampCall { + contextId, + }, + ) + } + ///Creates a new call builder for the [`getCoprocessorMajorityThreshold`] function. + pub fn getCoprocessorMajorityThreshold( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorMajorityThresholdCall, N> { + self.call_builder( + &getCoprocessorMajorityThresholdCall { + contextId, + }, + ) + } + ///Creates a new call builder for the [`getCoprocessorSigners`] function. + pub fn getCoprocessorSigners( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorSignersCall, N> { + self.call_builder( + &getCoprocessorSignersCall { + contextId, + }, + ) + } + ///Creates a new call builder for the [`getCoprocessorTxSenders`] function. + pub fn getCoprocessorTxSenders( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorTxSendersCall, N> { + self.call_builder( + &getCoprocessorTxSendersCall { + contextId, + }, + ) + } + ///Creates a new call builder for the [`getPreActivationCoprocessorContextId`] function. + pub fn getPreActivationCoprocessorContextId( + &self, + ) -> alloy_contract::SolCallBuilder< + &P, + getPreActivationCoprocessorContextIdCall, + N, + > { + self.call_builder(&getPreActivationCoprocessorContextIdCall) + } + ///Creates a new call builder for the [`getSuspendedCoprocessorContextId`] function. + pub fn getSuspendedCoprocessorContextId( + &self, + ) -> alloy_contract::SolCallBuilder< + &P, + getSuspendedCoprocessorContextIdCall, + N, + > { + self.call_builder(&getSuspendedCoprocessorContextIdCall) + } + ///Creates a new call builder for the [`getVersion`] function. + pub fn getVersion( + &self, + ) -> alloy_contract::SolCallBuilder<&P, getVersionCall, N> { + self.call_builder(&getVersionCall) + } + ///Creates a new call builder for the [`initializeFromEmptyProxy`] function. + pub fn initializeFromEmptyProxy( + &self, + initialBlob: alloy::sol_types::private::Bytes, + initialCoprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + ) -> alloy_contract::SolCallBuilder<&P, initializeFromEmptyProxyCall, N> { + self.call_builder( + &initializeFromEmptyProxyCall { + initialBlob, + initialCoprocessors, + }, + ) + } + ///Creates a new call builder for the [`isCoprocessorContextOperating`] function. + pub fn isCoprocessorContextOperating( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder<&P, isCoprocessorContextOperatingCall, N> { + self.call_builder( + &isCoprocessorContextOperatingCall { + contextId, + }, + ) + } + ///Creates a new call builder for the [`isCoprocessorSigner`] function. + pub fn isCoprocessorSigner( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + signerAddress: alloy::sol_types::private::Address, + ) -> alloy_contract::SolCallBuilder<&P, isCoprocessorSignerCall, N> { + self.call_builder( + &isCoprocessorSignerCall { + contextId, + signerAddress, + }, + ) + } + ///Creates a new call builder for the [`isCoprocessorTxSender`] function. + pub fn isCoprocessorTxSender( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + txSenderAddress: alloy::sol_types::private::Address, + ) -> alloy_contract::SolCallBuilder<&P, isCoprocessorTxSenderCall, N> { + self.call_builder( + &isCoprocessorTxSenderCall { + contextId, + txSenderAddress, + }, + ) + } + ///Creates a new call builder for the [`proxiableUUID`] function. + pub fn proxiableUUID( + &self, + ) -> alloy_contract::SolCallBuilder<&P, proxiableUUIDCall, N> { + self.call_builder(&proxiableUUIDCall) + } + ///Creates a new call builder for the [`refreshCoprocessorContextStatuses`] function. + pub fn refreshCoprocessorContextStatuses( + &self, + ) -> alloy_contract::SolCallBuilder< + &P, + refreshCoprocessorContextStatusesCall, + N, + > { + self.call_builder(&refreshCoprocessorContextStatusesCall) + } + ///Creates a new call builder for the [`swapSuspendedCoprocessorContextWithActive`] function. + pub fn swapSuspendedCoprocessorContextWithActive( + &self, + suspendedTimePeriod: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder< + &P, + swapSuspendedCoprocessorContextWithActiveCall, + N, + > { + self.call_builder( + &swapSuspendedCoprocessorContextWithActiveCall { + suspendedTimePeriod, + }, + ) + } + ///Creates a new call builder for the [`upgradeToAndCall`] function. + pub fn upgradeToAndCall( + &self, + newImplementation: alloy::sol_types::private::Address, + data: alloy::sol_types::private::Bytes, + ) -> alloy_contract::SolCallBuilder<&P, upgradeToAndCallCall, N> { + self.call_builder( + &upgradeToAndCallCall { + newImplementation, + data, + }, + ) + } + } + /// Event filters. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > CoprocessorContextsInstance { + /// Creates a new event filter using this contract instance's provider and address. + /// + /// Note that the type can be any event, not just those defined in this contract. + /// Prefer using the other methods for building type-safe event filters. + pub fn event_filter( + &self, + ) -> alloy_contract::Event<&P, E, N> { + alloy_contract::Event::new_sol(&self.provider, &self.address) + } + ///Creates a new event filter for the [`ActivateCoprocessorContext`] event. + pub fn ActivateCoprocessorContext_filter( + &self, + ) -> alloy_contract::Event<&P, ActivateCoprocessorContext, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`CompromiseCoprocessorContext`] event. + pub fn CompromiseCoprocessorContext_filter( + &self, + ) -> alloy_contract::Event<&P, CompromiseCoprocessorContext, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`DeactivateCoprocessorContext`] event. + pub fn DeactivateCoprocessorContext_filter( + &self, + ) -> alloy_contract::Event<&P, DeactivateCoprocessorContext, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`DestroyCoprocessorContext`] event. + pub fn DestroyCoprocessorContext_filter( + &self, + ) -> alloy_contract::Event<&P, DestroyCoprocessorContext, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`InitializeCoprocessorContexts`] event. + pub fn InitializeCoprocessorContexts_filter( + &self, + ) -> alloy_contract::Event<&P, InitializeCoprocessorContexts, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`Initialized`] event. + pub fn Initialized_filter(&self) -> alloy_contract::Event<&P, Initialized, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`NewCoprocessorContext`] event. + pub fn NewCoprocessorContext_filter( + &self, + ) -> alloy_contract::Event<&P, NewCoprocessorContext, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`PreActivateCoprocessorContext`] event. + pub fn PreActivateCoprocessorContext_filter( + &self, + ) -> alloy_contract::Event<&P, PreActivateCoprocessorContext, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`SuspendCoprocessorContext`] event. + pub fn SuspendCoprocessorContext_filter( + &self, + ) -> alloy_contract::Event<&P, SuspendCoprocessorContext, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`Upgraded`] event. + pub fn Upgraded_filter(&self) -> alloy_contract::Event<&P, Upgraded, N> { + self.event_filter::() + } + } +} diff --git a/gateway-contracts/rust_bindings/src/decryption.rs b/gateway-contracts/rust_bindings/src/decryption.rs index f5227f3ac0..a801fc7497 100644 --- a/gateway-contracts/rust_bindings/src/decryption.rs +++ b/gateway-contracts/rust_bindings/src/decryption.rs @@ -627,10 +627,12 @@ interface Decryption { uint256 keyId; bytes32 snsCiphertextDigest; address[] coprocessorTxSenderAddresses; + uint256 contextId; } error AccountNotAllowedToUseCiphertext(bytes32 ctHandle, address accountAddress); error AddressEmptyCode(address target); + error CiphertextMaterialNotAdded(bytes32 ctHandle); error ContractAddressesMaxLengthExceeded(uint256 maxLength, uint256 actualLength); error ContractNotInContractAddresses(address contractAddress, address[] contractAddresses); error DecryptionNotRequested(uint256 decryptionId); @@ -654,8 +656,6 @@ interface Decryption { error KmsNodeAlreadySigned(uint256 decryptionId, address signer); error MaxDecryptionRequestBitSizeExceeded(uint256 maxBitSize, uint256 totalBitSize); error MaxDurationDaysExceeded(uint256 maxValue, uint256 actualValue); - error NotCoprocessorSigner(address signerAddress); - error NotCoprocessorTxSender(address txSenderAddress); error NotCustodianSigner(address signerAddress); error NotCustodianTxSender(address txSenderAddress); error NotGatewayOwner(address sender); @@ -699,6 +699,7 @@ interface Decryption { function proxiableUUID() external view returns (bytes32); function publicDecryptionRequest(bytes32[] memory ctHandles, bytes memory extraData) external; function publicDecryptionResponse(uint256 decryptionId, bytes memory decryptedResult, bytes memory signature, bytes memory extraData) external; + function reinitializeV2() external; function unpause() external; function upgradeToAndCall(address newImplementation, bytes memory data) external payable; function userDecryptionRequest(CtHandleContractPair[] memory ctHandleContractPairs, IDecryption.RequestValidity memory requestValidity, IDecryption.ContractsInfo memory contractsInfo, address userAddress, bytes memory publicKey, bytes memory signature, bytes memory extraData) external; @@ -972,6 +973,13 @@ interface Decryption { "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "reinitializeV2", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "unpause", @@ -1171,6 +1179,11 @@ interface Decryption { "name": "coprocessorTxSenderAddresses", "type": "address[]", "internalType": "address[]" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" } ] }, @@ -1275,6 +1288,11 @@ interface Decryption { "name": "coprocessorTxSenderAddresses", "type": "address[]", "internalType": "address[]" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" } ] }, @@ -1376,6 +1394,17 @@ interface Decryption { } ] }, + { + "type": "error", + "name": "CiphertextMaterialNotAdded", + "inputs": [ + { + "name": "ctHandle", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, { "type": "error", "name": "ContractAddressesMaxLengthExceeded", @@ -1447,6 +1476,11 @@ interface Decryption { "name": "coprocessorTxSenderAddresses", "type": "address[]", "internalType": "address[]" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" } ] }, @@ -1474,6 +1508,11 @@ interface Decryption { "name": "coprocessorTxSenderAddresses", "type": "address[]", "internalType": "address[]" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" } ] } @@ -1643,28 +1682,6 @@ interface Decryption { } ] }, - { - "type": "error", - "name": "NotCoprocessorSigner", - "inputs": [ - { - "name": "signerAddress", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "NotCoprocessorTxSender", - "inputs": [ - { - "name": "txSenderAddress", - "type": "address", - "internalType": "address" - } - ] - }, { "type": "error", "name": "NotCustodianSigner", @@ -1865,22 +1882,22 @@ pub mod Decryption { /// The creation / init bytecode of the contract. /// /// ```text - ///0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000043575f80fd5b50620000546200005a60201b60201c565b620001c4565b5f6200006b6200015e60201b60201c565b9050805f0160089054906101000a900460ff1615620000b6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146200015b5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051620001529190620001a9565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b620001a38162000185565b82525050565b5f602082019050620001be5f83018462000198565b92915050565b60805161666e620001eb5f395f818161233a0152818161238f0152612631015261666e5ff3fe6080604052600436106100fd575f3560e01c806358f5b8ab1161009457806384b0196e1161006357806384b0196e146102e1578063ad3cb1cc14610311578063d8998f451461033b578063f1b57adb14610363578063fbb832591461038b576100fd565b806358f5b8ab1461023d5780635c975abb146102795780636f8913bc146102a35780638456cb59146102cb576100fd565b80633f4ba83a116100d05780633f4ba83a146101a55780634014c4cd146101bb5780634f1ef286146101f757806352d1902d14610213576100fd565b8063046f9eb3146101015780630900cc69146101295780630d8e6e2c1461016557806339f738101461018f575b5f80fd5b34801561010c575f80fd5b5061012760048036038101906101229190614208565b6103c7565b005b348015610134575f80fd5b5061014f600480360381019061014a91906142cc565b610853565b60405161015c91906143de565b60405180910390f35b348015610170575f80fd5b50610179610924565b6040516101869190614488565b60405180910390f35b34801561019a575f80fd5b506101a361099f565b005b3480156101b0575f80fd5b506101b9610bd7565b005b3480156101c6575f80fd5b506101e160048036038101906101dc91906144fd565b610d1f565b6040516101ee9190614595565b60405180910390f35b610211600480360381019061020c9190614700565b610eac565b005b34801561021e575f80fd5b50610227610ecb565b6040516102349190614772565b60405180910390f35b348015610248575f80fd5b50610263600480360381019061025e91906142cc565b610efc565b6040516102709190614595565b60405180910390f35b348015610284575f80fd5b5061028d610f2f565b60405161029a9190614595565b60405180910390f35b3480156102ae575f80fd5b506102c960048036038101906102c49190614208565b610f51565b005b3480156102d6575f80fd5b506102df611358565b005b3480156102ec575f80fd5b506102f561147d565b604051610308979695949392919061489a565b60405180910390f35b34801561031c575f80fd5b50610325611586565b6040516103329190614488565b60405180910390f35b348015610346575f80fd5b50610361600480360381019061035c91906144fd565b6115bf565b005b34801561036e575f80fd5b50610389600480360381019061038491906149b1565b61177d565b005b348015610396575f80fd5b506103b160048036038101906103ac9190614aeb565b611c2e565b6040516103be9190614595565b60405180910390f35b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663e5275eaf336040518263ffffffff1660e01b81526004016104149190614b7c565b602060405180830381865afa15801561042f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104539190614bbf565b61049457336040517faee8632300000000000000000000000000000000000000000000000000000000815260040161048b9190614b7c565b60405180910390fd5b5f61049d611e9d565b905060f8600260058111156104b5576104b4614bea565b5b901b881115806104c85750806008015488115b1561050a57876040517fd48af9420000000000000000000000000000000000000000000000000000000081526004016105019190614c17565b60405180910390fd5b5f816007015f8a81526020019081526020015f206040518060400160405290815f8201805461053890614c5d565b80601f016020809104026020016040519081016040528092919081815260200182805461056490614c5d565b80156105af5780601f10610586576101008083540402835291602001916105af565b820191905f5260205f20905b81548152906001019060200180831161059257829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561060557602002820191905f5260205f20905b8154815260200190600101908083116105f1575b50505050508152505090505f6040518060800160405280835f01518152602001836020015181526020018a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081525090505f6106cb82611ec4565b90506106d98b828a8a611f8b565b5f846002015f8d81526020019081526020015f205f805f1b81526020019081526020015f2090508033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b7f7fcdfb5381917f554a717d0a5470a33f5a49ba6445f05ec43c74c0bc2cc608b2600183805490506107929190614cba565b8d8d8d8d8d8d6040516107ab9796959493929190614d29565b60405180910390a2845f015f8d81526020019081526020015f205f9054906101000a900460ff161580156107e857506107e781805490506120fc565b5b15610845576001855f015f8e81526020019081526020015f205f6101000a81548160ff0219169083151502179055508b7fe89752be0ecdb68b2a6eb5ef1a891039e0e92ae3c8a62274c5881e48eea1ed2560405160405180910390a25b505050505050505050505050565b60605f61085e611e9d565b90505f816003015f8581526020019081526020015f20549050816002015f8581526020019081526020015f205f8281526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561091657602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116108cd575b505050505092505050919050565b60606040518060400160405280600a81526020017f44656372797074696f6e000000000000000000000000000000000000000000008152506109655f61218d565b61096f600161218d565b6109785f61218d565b60405160200161098b9493929190614e55565b604051602081830303815290604052905090565b60016109a9612257565b67ffffffffffffffff16146109ea576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f6109f561227b565b9050805f0160089054906101000a900460ff1680610a3d57508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15610a74576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff021916908315150217905550610b2d6040518060400160405280600a81526020017f44656372797074696f6e000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506122a2565b610b356122b8565b5f610b3e611e9d565b905060f860016005811115610b5657610b55614bea565b5b901b816006018190555060f860026005811115610b7657610b75614bea565b5b901b8160080181905550505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d282604051610bcb9190614ed5565b60405180910390a15050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c589190614f02565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610cd3575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610d1557336040517fe19166ee000000000000000000000000000000000000000000000000000000008152600401610d0c9190614b7c565b60405180910390fd5b610d1d6122ca565b565b5f805f90505b85859050811015610e9e5773f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff16630620326d878784818110610d7357610d72614f2d565b5b905060200201356040518263ffffffff1660e01b8152600401610d969190614772565b602060405180830381865afa158015610db1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dd59190614bbf565b1580610e83575073c7d45661a345ec5ca0e8521cfef7e32fda0daa6873ffffffffffffffffffffffffffffffffffffffff16632ddc9a6f878784818110610e1f57610e1e614f2d565b5b905060200201356040518263ffffffff1660e01b8152600401610e429190614772565b602060405180830381865afa158015610e5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e819190614bbf565b155b15610e91575f915050610ea4565b8080600101915050610d25565b50600190505b949350505050565b610eb4612338565b610ebd8261241e565b610ec78282612511565b5050565b5f610ed461262f565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f80610f06611e9d565b9050805f015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b5f80610f396126b6565b9050805f015f9054906101000a900460ff1691505090565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663e5275eaf336040518263ffffffff1660e01b8152600401610f9e9190614b7c565b602060405180830381865afa158015610fb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fdd9190614bbf565b61101e57336040517faee863230000000000000000000000000000000000000000000000000000000081526004016110159190614b7c565b60405180910390fd5b5f611027611e9d565b905060f86001600581111561103f5761103e614bea565b5b901b881115806110525750806006015488115b1561109457876040517fd48af94200000000000000000000000000000000000000000000000000000000815260040161108b9190614c17565b60405180910390fd5b5f6040518060600160405280836005015f8c81526020019081526020015f208054806020026020016040519081016040528092919081815260200182805480156110fb57602002820191905f5260205f20905b8154815260200190600101908083116110e7575b5050505050815260200189898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081525090505f6111a1826126dd565b90506111af8a828989611f8b565b5f836004015f8c81526020019081526020015f205f8381526020019081526020015f20905080888890918060018154018082558091505060019003905f5260205f20015f90919290919290919290919250918261120d929190615101565b50836002015f8c81526020019081526020015f205f8381526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550835f015f8c81526020019081526020015f205f9054906101000a900460ff161580156112c357506112c28180549050612797565b5b1561134b576001845f015f8d81526020019081526020015f205f6101000a81548160ff02191690831515021790555081846003015f8d81526020019081526020015f20819055508a7fd7e58a367a0a6c298e76ad5d240004e327aa1423cbe4bd7ff85d4c715ef8d15f8b8b848a8a60405161134295949392919061531c565b60405180910390a25b5050505050505050505050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016113a59190614b7c565b602060405180830381865afa1580156113c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e49190614bbf565b158015611431575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561147357336040517f388916bb00000000000000000000000000000000000000000000000000000000815260040161146a9190614b7c565b60405180910390fd5b61147b612828565b565b5f6060805f805f60605f61148f612897565b90505f801b815f01541480156114aa57505f801b8160010154145b6114e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e0906153b4565b60405180910390fd5b6114f16128be565b6114f961295c565b46305f801b5f67ffffffffffffffff811115611518576115176145dc565b5b6040519080825280602002602001820160405280156115465781602001602082028036833780820191505090505b507f0f0000000000000000000000000000000000000000000000000000000000000095949392919097509750975097509750975097505090919293949596565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6115c76129fa565b5f8484905003611603576040517f2de7543800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61164c8484808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050612a3b565b5f73c7d45661a345ec5ca0e8521cfef7e32fda0daa6873ffffffffffffffffffffffffffffffffffffffff1663a14f897186866040518363ffffffff1660e01b815260040161169c92919061544a565b5f60405180830381865afa1580156116b6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906116de91906156e1565b90506116e981612af3565b5f6116f2611e9d565b9050806006015f81548092919061170890615728565b91905055505f816006015490508686836005015f8481526020019081526020015f2091906117379291906140b2565b50807f22db480a39bd72556438aadb4a32a3d2a6638b87c03bbec5fef6997e109587ff84878760405161176c93929190615905565b60405180910390a250505050505050565b6117856129fa565b5f8880602001906117969190615948565b9050036117cf576040517f57cfa21700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a60ff168880602001906117e49190615948565b9050111561183d57600a8880602001906117fe9190615948565b90506040517faf1f04950000000000000000000000000000000000000000000000000000000081526004016118349291906159e6565b60405180910390fd5b611856898036038101906118519190615a5a565b612bd9565b6118ae8880602001906118699190615948565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f8201169050808301925050505050505088612d24565b1561190257868880602001906118c49190615948565b6040517fdc4d78b10000000000000000000000000000000000000000000000000000000081526004016118f993929190615b0b565b60405180910390fd5b5f61195d8c8c8b80602001906119189190615948565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508b612da2565b90505f6040518060a0016040528089898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081526020018b80602001906119c49190615948565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f8201169050808301925050505050505081526020018c5f013581526020018c60200135815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508152509050611a74818a88888e5f0135612f95565b5f73c7d45661a345ec5ca0e8521cfef7e32fda0daa6873ffffffffffffffffffffffffffffffffffffffff1663a14f8971846040518263ffffffff1660e01b8152600401611ac29190615bd3565b5f60405180830381865afa158015611adc573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611b0491906156e1565b9050611b0f81612af3565b5f611b18611e9d565b9050806008015f815480929190611b2e90615728565b91905055505f8160080154905060405180604001604052808c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815260200186815250826007015f8381526020019081526020015f205f820151815f019081611bb99190615bfd565b506020820151816001019080519060200190611bd69291906140fd565b50905050807ff9011bd6ba0da6049c520d70fe5971f17ed7ab795486052544b51019896c596b848e8e8e8c8c604051611c1496959493929190615ccc565b60405180910390a250505050505050505050505050505050565b5f805f90505b85859050811015611e8e5773f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff1663c6528f69878784818110611c8257611c81614f2d565b5b9050604002015f0135896040518363ffffffff1660e01b8152600401611ca9929190615d28565b602060405180830381865afa158015611cc4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce89190614bbf565b1580611dc4575073f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff1663c6528f69878784818110611d3257611d31614f2d565b5b9050604002015f0135888885818110611d4e57611d4d614f2d565b5b9050604002016020016020810190611d669190615d4f565b6040518363ffffffff1660e01b8152600401611d83929190615d28565b602060405180830381865afa158015611d9e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc29190614bbf565b155b80611e73575073c7d45661a345ec5ca0e8521cfef7e32fda0daa6873ffffffffffffffffffffffffffffffffffffffff16632ddc9a6f878784818110611e0d57611e0c614f2d565b5b9050604002015f01356040518263ffffffff1660e01b8152600401611e329190614772565b602060405180830381865afa158015611e4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e719190614bbf565b155b15611e81575f915050611e94565b8080600101915050611c34565b50600190505b95945050505050565b5f7f68113e68af494c6efd0210fc4bf9ba748d1ffadaa4718217fdf63548c4aee700905090565b5f611f846040518060a00160405280606d8152602001616526606d913980519060200120835f0151805190602001208460200151604051602001611f089190615e06565b604051602081830303815290604052805190602001208560400151805190602001208660600151604051602001611f3f9190615e56565b60405160208183030381529060405280519060200120604051602001611f69959493929190615e6c565b6040516020818303038152906040528051906020012061306d565b9050919050565b5f611f94611e9d565b90505f611fe48585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050613086565b9050611fef816130b0565b816001015f8781526020019081526020015f205f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561208e5785816040517f99ec48d9000000000000000000000000000000000000000000000000000000008152600401612085929190615ebd565b60405180910390fd5b6001826001015f8881526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550505050505050565b5f8073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663c2b429866040518163ffffffff1660e01b8152600401602060405180830381865afa15801561215b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061217f9190615ee4565b905080831015915050919050565b60605f600161219b84613180565b0190505f8167ffffffffffffffff8111156121b9576121b86145dc565b5b6040519080825280601f01601f1916602001820160405280156121eb5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561224c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161224157612240615f0f565b5b0494505f85036121f8575b819350505050919050565b5f61226061227b565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b6122aa6132d1565b6122b48282613311565b5050565b6122c06132d1565b6122c8613362565b565b6122d2613392565b5f6122db6126b6565b90505f815f015f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6123206133d2565b60405161232d9190614b7c565b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614806123e557507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166123cc6133d9565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561241c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561247b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249f9190614f02565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461250e57336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016125059190614b7c565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561257957506040513d601f19601f820116820180604052508101906125769190615f3c565b60015b6125ba57816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016125b19190614b7c565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b811461262057806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016126179190614772565b60405180910390fd5b61262a838361342c565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16146126b4576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b5f6127906040518060800160405280605481526020016165936054913980519060200120835f01516040516020016127159190615e06565b60405160208183030381529060405280519060200120846020015180519060200120856040015160405160200161274c9190615e56565b604051602081830303815290604052805190602001206040516020016127759493929190615f67565b6040516020818303038152906040528051906020012061306d565b9050919050565b5f8073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16632a3889986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061281a9190615ee4565b905080831015915050919050565b6128306129fa565b5f6128396126b6565b90506001815f015f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861287f6133d2565b60405161288c9190614b7c565b60405180910390a150565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100905090565b60605f6128c9612897565b90508060020180546128da90614c5d565b80601f016020809104026020016040519081016040528092919081815260200182805461290690614c5d565b80156129515780601f1061292857610100808354040283529160200191612951565b820191905f5260205f20905b81548152906001019060200180831161293457829003601f168201915b505050505091505090565b60605f612967612897565b905080600301805461297890614c5d565b80601f01602080910402602001604051908101604052809291908181526020018280546129a490614c5d565b80156129ef5780601f106129c6576101008083540402835291602001916129ef565b820191905f5260205f20905b8154815290600101906020018083116129d257829003601f168201915b505050505091505090565b612a02610f2f565b15612a39576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f805b8251811015612aa3575f838281518110612a5b57612a5a614f2d565b5b602002602001015190505f612a6f8261349e565b9050612a7a81613528565b61ffff1684612a899190615faa565b9350612a9482613713565b50508080600101915050612a3e565b50610800811115612aef57610800816040517fe7f4895d000000000000000000000000000000000000000000000000000000008152600401612ae6929190615fdd565b60405180910390fd5b5050565b600181511115612bd6575f815f81518110612b1157612b10614f2d565b5b60200260200101516020015190505f600190505b8251811015612bd35781838281518110612b4257612b41614f2d565b5b60200260200101516020015114612bc657825f81518110612b6657612b65614f2d565b5b6020026020010151838281518110612b8157612b80614f2d565b5b60200260200101516040517fcfae921f000000000000000000000000000000000000000000000000000000008152600401612bbd929190616064565b60405180910390fd5b8080600101915050612b25565b50505b50565b5f816020015103612c16576040517fde2859c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61016d61ffff1681602001511115612c6d5761016d81602001516040517f32951863000000000000000000000000000000000000000000000000000000008152600401612c649291906160d6565b60405180910390fd5b42815f01511115612cba5742815f01516040517ff24c0887000000000000000000000000000000000000000000000000000000008152600401612cb1929190615fdd565b60405180910390fd5b42620151808260200151612cce91906160fd565b825f0151612cdc9190615faa565b1015612d215742816040517f30348040000000000000000000000000000000000000000000000000000000008152600401612d1892919061616b565b60405180910390fd5b50565b5f805f90505b8351811015612d97578273ffffffffffffffffffffffffffffffffffffffff16848281518110612d5d57612d5c614f2d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612d8a576001915050612d9c565b8080600101915050612d2a565b505f90505b92915050565b60605f8585905003612de0576040517fa6a6cb2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484905067ffffffffffffffff811115612dfd57612dfc6145dc565b5b604051908082528060200260200182016040528015612e2b5781602001602082028036833780820191505090505b5090505f805b86869050811015612f40575f878783818110612e5057612e4f614f2d565b5b9050604002015f013590505f888884818110612e6f57612e6e614f2d565b5b9050604002016020016020810190612e879190615d4f565b90505f612e938361349e565b9050612e9e81613528565b61ffff1685612ead9190615faa565b9450612eb983886137e3565b612ec383836137e3565b612ecd8883612d24565b612f105781886040517fa4c30391000000000000000000000000000000000000000000000000000000008152600401612f07929190616192565b60405180910390fd5b82868581518110612f2457612f23614f2d565b5b6020026020010181815250505050508080600101915050612e31565b50610800811115612f8c57610800816040517fe7f4895d000000000000000000000000000000000000000000000000000000008152600401612f83929190615fdd565b60405180910390fd5b50949350505050565b5f612fa086836138b8565b90505f612ff08286868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050613086565b90508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146130645784846040517f2a873d2700000000000000000000000000000000000000000000000000000000815260040161305b9291906161c0565b60405180910390fd5b50505050505050565b5f61307f613079613985565b83613993565b9050919050565b5f805f8061309486866139d3565b9250925092506130a48282613a28565b82935050505092915050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663203d0114826040518263ffffffff1660e01b81526004016130fd9190614b7c565b602060405180830381865afa158015613118573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061313c9190614bbf565b61317d57806040517f2a7c6ef60000000000000000000000000000000000000000000000000000000081526004016131749190614b7c565b60405180910390fd5b50565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106131dc577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816131d2576131d1615f0f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613219576d04ee2d6d415b85acef8100000000838161320f5761320e615f0f565b5b0492506020810190505b662386f26fc10000831061324857662386f26fc10000838161323e5761323d615f0f565b5b0492506010810190505b6305f5e1008310613271576305f5e100838161326757613266615f0f565b5b0492506008810190505b612710831061329657612710838161328c5761328b615f0f565b5b0492506004810190505b606483106132b957606483816132af576132ae615f0f565b5b0492506002810190505b600a83106132c8576001810190505b80915050919050565b6132d9613b8a565b61330f576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6133196132d1565b5f613322612897565b905082816002019081613335919061623a565b5081816003019081613347919061623a565b505f801b815f01819055505f801b8160010181905550505050565b61336a6132d1565b5f6133736126b6565b90505f815f015f6101000a81548160ff02191690831515021790555050565b61339a610f2f565b6133d0576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f33905090565b5f6134057f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613ba8565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61343582613bb1565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156134915761348b8282613c7a565b5061349a565b613499613cfa565b5b5050565b5f8060f860f084901b901c5f1c90506053808111156134c0576134bf614bea565b5b60ff168160ff16111561350a57806040517f641950d70000000000000000000000000000000000000000000000000000000081526004016135019190616318565b60405180910390fd5b8060ff1660538111156135205761351f614bea565b5b915050919050565b5f80605381111561353c5761353b614bea565b5b82605381111561354f5761354e614bea565b5b0361355d576002905061370e565b6002605381111561357157613570614bea565b5b82605381111561358457613583614bea565b5b03613592576008905061370e565b600360538111156135a6576135a5614bea565b5b8260538111156135b9576135b8614bea565b5b036135c7576010905061370e565b600460538111156135db576135da614bea565b5b8260538111156135ee576135ed614bea565b5b036135fc576020905061370e565b600560538111156136105761360f614bea565b5b82605381111561362357613622614bea565b5b03613631576040905061370e565b6006605381111561364557613644614bea565b5b82605381111561365857613657614bea565b5b03613666576080905061370e565b6007605381111561367a57613679614bea565b5b82605381111561368d5761368c614bea565b5b0361369b5760a0905061370e565b600860538111156136af576136ae614bea565b5b8260538111156136c2576136c1614bea565b5b036136d157610100905061370e565b816040517fbe7830b10000000000000000000000000000000000000000000000000000000081526004016137059190616377565b60405180910390fd5b919050565b73f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff16630620326d826040518263ffffffff1660e01b81526004016137609190614772565b602060405180830381865afa15801561377b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061379f9190614bbf565b6137e057806040517f4331a85d0000000000000000000000000000000000000000000000000000000081526004016137d79190614772565b60405180910390fd5b50565b73f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff1663c6528f6983836040518363ffffffff1660e01b8152600401613832929190615d28565b602060405180830381865afa15801561384d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138719190614bbf565b6138b45781816040517f160a2b4b0000000000000000000000000000000000000000000000000000000081526004016138ab929190615d28565b60405180910390fd5b5050565b5f806040518060c00160405280608781526020016165e76087913980519060200120845f01518051906020012085602001516040516020016138fa919061641c565b6040516020818303038152906040528051906020012086604001518760600151886080015160405160200161392f9190615e56565b6040516020818303038152906040528051906020012060405160200161395a96959493929190616432565b60405160208183030381529060405280519060200120905061397c8382613d36565b91505092915050565b5f61398e613daa565b905090565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f6041845103613a13575f805f602087015192506040870151915060608701515f1a9050613a0588828585613e0d565b955095509550505050613a21565b5f600285515f1b9250925092505b9250925092565b5f6003811115613a3b57613a3a614bea565b5b826003811115613a4e57613a4d614bea565b5b0315613b865760016003811115613a6857613a67614bea565b5b826003811115613a7b57613a7a614bea565b5b03613ab2576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115613ac657613ac5614bea565b5b826003811115613ad957613ad8614bea565b5b03613b1d57805f1c6040517ffce698f7000000000000000000000000000000000000000000000000000000008152600401613b149190614c17565b60405180910390fd5b600380811115613b3057613b2f614bea565b5b826003811115613b4357613b42614bea565b5b03613b8557806040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600401613b7c9190614772565b60405180910390fd5b5b5050565b5f613b9361227b565b5f0160089054906101000a900460ff16905090565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03613c0c57806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401613c039190614b7c565b60405180910390fd5b80613c387f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613ba8565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051613ca39190615e56565b5f60405180830381855af49150503d805f8114613cdb576040519150601f19603f3d011682016040523d82523d5f602084013e613ce0565b606091505b5091509150613cf0858383613ef4565b9250505092915050565b5f341115613d34576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f807f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613d61613f81565b613d69613ff7565b8630604051602001613d7f959493929190616491565b604051602081830303815290604052805190602001209050613da18184613993565b91505092915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613dd4613f81565b613ddc613ff7565b4630604051602001613df2959493929190616491565b60405160208183030381529060405280519060200120905090565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115613e49575f600385925092509250613eea565b5f6001888888886040515f8152602001604052604051613e6c94939291906164e2565b6020604051602081039080840390855afa158015613e8c573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613edd575f60015f801b93509350935050613eea565b805f805f1b935093509350505b9450945094915050565b606082613f0957613f048261406e565b613f79565b5f8251148015613f2f57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15613f7157836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401613f689190614b7c565b60405180910390fd5b819050613f7a565b5b9392505050565b5f80613f8b612897565b90505f613f966128be565b90505f81511115613fb257808051906020012092505050613ff4565b5f825f015490505f801b8114613fcd57809350505050613ff4565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f80614001612897565b90505f61400c61295c565b90505f815111156140285780805190602001209250505061406b565b5f826001015490505f801b81146140445780935050505061406b565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f815111156140805780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828054828255905f5260205f209081019282156140ec579160200282015b828111156140eb5782358255916020019190600101906140d0565b5b5090506140f99190614148565b5090565b828054828255905f5260205f20908101928215614137579160200282015b8281111561413657825182559160200191906001019061411b565b5b5090506141449190614148565b5090565b5b8082111561415f575f815f905550600101614149565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61418681614174565b8114614190575f80fd5b50565b5f813590506141a18161417d565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126141c8576141c76141a7565b5b8235905067ffffffffffffffff8111156141e5576141e46141ab565b5b602083019150836001820283011115614201576142006141af565b5b9250929050565b5f805f805f805f6080888a0312156142235761422261416c565b5b5f6142308a828b01614193565b975050602088013567ffffffffffffffff81111561425157614250614170565b5b61425d8a828b016141b3565b9650965050604088013567ffffffffffffffff8111156142805761427f614170565b5b61428c8a828b016141b3565b9450945050606088013567ffffffffffffffff8111156142af576142ae614170565b5b6142bb8a828b016141b3565b925092505092959891949750929550565b5f602082840312156142e1576142e061416c565b5b5f6142ee84828501614193565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61434982614320565b9050919050565b6143598161433f565b82525050565b5f61436a8383614350565b60208301905092915050565b5f602082019050919050565b5f61438c826142f7565b6143968185614301565b93506143a183614311565b805f5b838110156143d15781516143b8888261435f565b97506143c383614376565b9250506001810190506143a4565b5085935050505092915050565b5f6020820190508181035f8301526143f68184614382565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561443557808201518184015260208101905061441a565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61445a826143fe565b6144648185614408565b9350614474818560208601614418565b61447d81614440565b840191505092915050565b5f6020820190508181035f8301526144a08184614450565b905092915050565b5f8083601f8401126144bd576144bc6141a7565b5b8235905067ffffffffffffffff8111156144da576144d96141ab565b5b6020830191508360208202830111156144f6576144f56141af565b5b9250929050565b5f805f80604085870312156145155761451461416c565b5b5f85013567ffffffffffffffff81111561453257614531614170565b5b61453e878288016144a8565b9450945050602085013567ffffffffffffffff81111561456157614560614170565b5b61456d878288016141b3565b925092505092959194509250565b5f8115159050919050565b61458f8161457b565b82525050565b5f6020820190506145a85f830184614586565b92915050565b6145b78161433f565b81146145c1575f80fd5b50565b5f813590506145d2816145ae565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61461282614440565b810181811067ffffffffffffffff82111715614631576146306145dc565b5b80604052505050565b5f614643614163565b905061464f8282614609565b919050565b5f67ffffffffffffffff82111561466e5761466d6145dc565b5b61467782614440565b9050602081019050919050565b828183375f83830152505050565b5f6146a461469f84614654565b61463a565b9050828152602081018484840111156146c0576146bf6145d8565b5b6146cb848285614684565b509392505050565b5f82601f8301126146e7576146e66141a7565b5b81356146f7848260208601614692565b91505092915050565b5f80604083850312156147165761471561416c565b5b5f614723858286016145c4565b925050602083013567ffffffffffffffff81111561474457614743614170565b5b614750858286016146d3565b9150509250929050565b5f819050919050565b61476c8161475a565b82525050565b5f6020820190506147855f830184614763565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6147bf8161478b565b82525050565b6147ce81614174565b82525050565b6147dd8161433f565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61481581614174565b82525050565b5f614826838361480c565b60208301905092915050565b5f602082019050919050565b5f614848826147e3565b61485281856147ed565b935061485d836147fd565b805f5b8381101561488d578151614874888261481b565b975061487f83614832565b925050600181019050614860565b5085935050505092915050565b5f60e0820190506148ad5f83018a6147b6565b81810360208301526148bf8189614450565b905081810360408301526148d38188614450565b90506148e260608301876147c5565b6148ef60808301866147d4565b6148fc60a0830185614763565b81810360c083015261490e818461483e565b905098975050505050505050565b5f8083601f840112614931576149306141a7565b5b8235905067ffffffffffffffff81111561494e5761494d6141ab565b5b60208301915083604082028301111561496a576149696141af565b5b9250929050565b5f80fd5b5f6040828403121561498a57614989614971565b5b81905092915050565b5f604082840312156149a8576149a7614971565b5b81905092915050565b5f805f805f805f805f805f6101008c8e0312156149d1576149d061416c565b5b5f8c013567ffffffffffffffff8111156149ee576149ed614170565b5b6149fa8e828f0161491c565b9b509b50506020614a0d8e828f01614975565b99505060608c013567ffffffffffffffff811115614a2e57614a2d614170565b5b614a3a8e828f01614993565b9850506080614a4b8e828f016145c4565b97505060a08c013567ffffffffffffffff811115614a6c57614a6b614170565b5b614a788e828f016141b3565b965096505060c08c013567ffffffffffffffff811115614a9b57614a9a614170565b5b614aa78e828f016141b3565b945094505060e08c013567ffffffffffffffff811115614aca57614ac9614170565b5b614ad68e828f016141b3565b92509250509295989b509295989b9093969950565b5f805f805f60608688031215614b0457614b0361416c565b5b5f614b11888289016145c4565b955050602086013567ffffffffffffffff811115614b3257614b31614170565b5b614b3e8882890161491c565b9450945050604086013567ffffffffffffffff811115614b6157614b60614170565b5b614b6d888289016141b3565b92509250509295509295909350565b5f602082019050614b8f5f8301846147d4565b92915050565b614b9e8161457b565b8114614ba8575f80fd5b50565b5f81519050614bb981614b95565b92915050565b5f60208284031215614bd457614bd361416c565b5b5f614be184828501614bab565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082019050614c2a5f8301846147c5565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614c7457607f821691505b602082108103614c8757614c86614c30565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614cc482614174565b9150614ccf83614174565b9250828203905081811115614ce757614ce6614c8d565b5b92915050565b5f82825260208201905092915050565b5f614d088385614ced565b9350614d15838584614684565b614d1e83614440565b840190509392505050565b5f608082019050614d3c5f83018a6147c5565b8181036020830152614d4f81888a614cfd565b90508181036040830152614d64818688614cfd565b90508181036060830152614d79818486614cfd565b905098975050505050505050565b5f81905092915050565b5f614d9b826143fe565b614da58185614d87565b9350614db5818560208601614418565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f614df5600283614d87565b9150614e0082614dc1565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f614e3f600183614d87565b9150614e4a82614e0b565b600182019050919050565b5f614e608287614d91565b9150614e6b82614de9565b9150614e778286614d91565b9150614e8282614e33565b9150614e8e8285614d91565b9150614e9982614e33565b9150614ea58284614d91565b915081905095945050505050565b5f67ffffffffffffffff82169050919050565b614ecf81614eb3565b82525050565b5f602082019050614ee85f830184614ec6565b92915050565b5f81519050614efc816145ae565b92915050565b5f60208284031215614f1757614f1661416c565b5b5f614f2484828501614eee565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614fc07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614f85565b614fca8683614f85565b95508019841693508086168417925050509392505050565b5f819050919050565b5f615005615000614ffb84614174565b614fe2565b614174565b9050919050565b5f819050919050565b61501e83614feb565b61503261502a8261500c565b848454614f91565b825550505050565b5f90565b61504661503a565b615051818484615015565b505050565b5b81811015615074576150695f8261503e565b600181019050615057565b5050565b601f8211156150b95761508a81614f64565b61509384614f76565b810160208510156150a2578190505b6150b66150ae85614f76565b830182615056565b50505b505050565b5f82821c905092915050565b5f6150d95f19846008026150be565b1980831691505092915050565b5f6150f183836150ca565b9150826002028217905092915050565b61510b8383614f5a565b67ffffffffffffffff811115615124576151236145dc565b5b61512e8254614c5d565b615139828285615078565b5f601f831160018114615166575f8415615154578287013590505b61515e85826150e6565b8655506151c5565b601f19841661517486614f64565b5f5b8281101561519b57848901358255600182019150602085019450602081019050615176565b868310156151b857848901356151b4601f8916826150ca565b8355505b6001600288020188555050505b50505050505050565b5f81549050919050565b5f82825260208201905092915050565b5f819050815f5260205f209050919050565b5f82825260208201905092915050565b5f815461521681614c5d565b61522081866151fa565b9450600182165f811461523a576001811461525057615282565b60ff198316865281151560200286019350615282565b61525985614f64565b5f5b8381101561527a5781548189015260018201915060208101905061525b565b808801955050505b50505092915050565b5f615296838361520a565b905092915050565b5f600182019050919050565b5f6152b4826151ce565b6152be81856151d8565b9350836020820285016152d0856151e8565b805f5b8581101561530a578484038952816152eb858261528b565b94506152f68361529e565b925060208a019950506001810190506152d3565b50829750879550505050505092915050565b5f6060820190508181035f830152615335818789614cfd565b9050818103602083015261534981866152aa565b9050818103604083015261535e818486614cfd565b90509695505050505050565b7f4549503731323a20556e696e697469616c697a656400000000000000000000005f82015250565b5f61539e601583614408565b91506153a98261536a565b602082019050919050565b5f6020820190508181035f8301526153cb81615392565b9050919050565b5f82825260208201905092915050565b5f80fd5b82818337505050565b5f6153fa83856153d2565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561542d5761542c6153e2565b5b60208302925061543e8385846153e6565b82840190509392505050565b5f6020820190508181035f8301526154638184866153ef565b90509392505050565b5f67ffffffffffffffff821115615486576154856145dc565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b6154a88161475a565b81146154b2575f80fd5b50565b5f815190506154c38161549f565b92915050565b5f815190506154d78161417d565b92915050565b5f67ffffffffffffffff8211156154f7576154f66145dc565b5b602082029050602081019050919050565b5f61551a615515846154dd565b61463a565b9050808382526020820190506020840283018581111561553d5761553c6141af565b5b835b8181101561556657806155528882614eee565b84526020840193505060208101905061553f565b5050509392505050565b5f82601f830112615584576155836141a7565b5b8151615594848260208601615508565b91505092915050565b5f608082840312156155b2576155b1615497565b5b6155bc608061463a565b90505f6155cb848285016154b5565b5f8301525060206155de848285016154c9565b60208301525060406155f2848285016154b5565b604083015250606082015167ffffffffffffffff8111156156165761561561549b565b5b61562284828501615570565b60608301525092915050565b5f61564061563b8461546c565b61463a565b90508083825260208201905060208402830185811115615663576156626141af565b5b835b818110156156aa57805167ffffffffffffffff811115615688576156876141a7565b5b808601615695898261559d565b85526020850194505050602081019050615665565b5050509392505050565b5f82601f8301126156c8576156c76141a7565b5b81516156d884826020860161562e565b91505092915050565b5f602082840312156156f6576156f561416c565b5b5f82015167ffffffffffffffff81111561571357615712614170565b5b61571f848285016156b4565b91505092915050565b5f61573282614174565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361576457615763614c8d565b5b600182019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6157a18161475a565b82525050565b5f82825260208201905092915050565b5f6157c1826142f7565b6157cb81856157a7565b93506157d683614311565b805f5b838110156158065781516157ed888261435f565b97506157f883614376565b9250506001810190506157d9565b5085935050505092915050565b5f608083015f8301516158285f860182615798565b50602083015161583b602086018261480c565b50604083015161584e6040860182615798565b506060830151848203606086015261586682826157b7565b9150508091505092915050565b5f61587e8383615813565b905092915050565b5f602082019050919050565b5f61589c8261576f565b6158a68185615779565b9350836020820285016158b885615789565b805f5b858110156158f357848403895281516158d48582615873565b94506158df83615886565b925060208a019950506001810190506158bb565b50829750879550505050505092915050565b5f6040820190508181035f83015261591d8186615892565b90508181036020830152615932818486614cfd565b9050949350505050565b5f80fd5b5f80fd5b5f80fd5b5f80833560016020038436030381126159645761596361593c565b5b80840192508235915067ffffffffffffffff82111561598657615985615940565b5b6020830192506020820236038313156159a2576159a1615944565b5b509250929050565b5f60ff82169050919050565b5f6159d06159cb6159c6846159aa565b614fe2565b614174565b9050919050565b6159e0816159b6565b82525050565b5f6040820190506159f95f8301856159d7565b615a0660208301846147c5565b9392505050565b5f60408284031215615a2257615a21615497565b5b615a2c604061463a565b90505f615a3b84828501614193565b5f830152506020615a4e84828501614193565b60208301525092915050565b5f60408284031215615a6f57615a6e61416c565b5b5f615a7c84828501615a0d565b91505092915050565b5f819050919050565b5f615a9c60208401846145c4565b905092915050565b5f602082019050919050565b5f615abb8385614301565b9350615ac682615a85565b805f5b85811015615afe57615adb8284615a8e565b615ae5888261435f565b9750615af083615aa4565b925050600181019050615ac9565b5085925050509392505050565b5f604082019050615b1e5f8301866147d4565b8181036020830152615b31818486615ab0565b9050949350505050565b5f81519050919050565b5f819050602082019050919050565b5f615b5f8383615798565b60208301905092915050565b5f602082019050919050565b5f615b8182615b3b565b615b8b81856153d2565b9350615b9683615b45565b805f5b83811015615bc6578151615bad8882615b54565b9750615bb883615b6b565b925050600181019050615b99565b5085935050505092915050565b5f6020820190508181035f830152615beb8184615b77565b905092915050565b5f81519050919050565b615c0682615bf3565b67ffffffffffffffff811115615c1f57615c1e6145dc565b5b615c298254614c5d565b615c34828285615078565b5f60209050601f831160018114615c65575f8415615c53578287015190505b615c5d85826150e6565b865550615cc4565b601f198416615c7386614f64565b5f5b82811015615c9a57848901518255600182019150602085019450602081019050615c75565b86831015615cb75784890151615cb3601f8916826150ca565b8355505b6001600288020188555050505b505050505050565b5f6080820190508181035f830152615ce48189615892565b9050615cf360208301886147d4565b8181036040830152615d06818688614cfd565b90508181036060830152615d1b818486614cfd565b9050979650505050505050565b5f604082019050615d3b5f830185614763565b615d4860208301846147d4565b9392505050565b5f60208284031215615d6457615d6361416c565b5b5f615d71848285016145c4565b91505092915050565b5f81905092915050565b615d8d8161475a565b82525050565b5f615d9e8383615d84565b60208301905092915050565b5f615db482615b3b565b615dbe8185615d7a565b9350615dc983615b45565b805f5b83811015615df9578151615de08882615d93565b9750615deb83615b6b565b925050600181019050615dcc565b5085935050505092915050565b5f615e118284615daa565b915081905092915050565b5f81905092915050565b5f615e3082615bf3565b615e3a8185615e1c565b9350615e4a818560208601614418565b80840191505092915050565b5f615e618284615e26565b915081905092915050565b5f60a082019050615e7f5f830188614763565b615e8c6020830187614763565b615e996040830186614763565b615ea66060830185614763565b615eb36080830184614763565b9695505050505050565b5f604082019050615ed05f8301856147c5565b615edd60208301846147d4565b9392505050565b5f60208284031215615ef957615ef861416c565b5b5f615f06848285016154c9565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f60208284031215615f5157615f5061416c565b5b5f615f5e848285016154b5565b91505092915050565b5f608082019050615f7a5f830187614763565b615f876020830186614763565b615f946040830185614763565b615fa16060830184614763565b95945050505050565b5f615fb482614174565b9150615fbf83614174565b9250828201905080821115615fd757615fd6614c8d565b5b92915050565b5f604082019050615ff05f8301856147c5565b615ffd60208301846147c5565b9392505050565b5f608083015f8301516160195f860182615798565b50602083015161602c602086018261480c565b50604083015161603f6040860182615798565b506060830151848203606086015261605782826157b7565b9150508091505092915050565b5f6040820190508181035f83015261607c8185616004565b905081810360208301526160908184616004565b90509392505050565b5f61ffff82169050919050565b5f6160c06160bb6160b684616099565b614fe2565b614174565b9050919050565b6160d0816160a6565b82525050565b5f6040820190506160e95f8301856160c7565b6160f660208301846147c5565b9392505050565b5f61610782614174565b915061611283614174565b925082820261612081614174565b9150828204841483151761613757616136614c8d565b5b5092915050565b604082015f8201516161525f85018261480c565b506020820151616165602085018261480c565b50505050565b5f60608201905061617e5f8301856147c5565b61618b602083018461613e565b9392505050565b5f6040820190506161a55f8301856147d4565b81810360208301526161b78184614382565b90509392505050565b5f6020820190508181035f8301526161d9818486614cfd565b90509392505050565b5f819050815f5260205f209050919050565b601f82111561623557616206816161e2565b61620f84614f76565b8101602085101561621e578190505b61623261622a85614f76565b830182615056565b50505b505050565b616243826143fe565b67ffffffffffffffff81111561625c5761625b6145dc565b5b6162668254614c5d565b6162718282856161f4565b5f60209050601f8311600181146162a2575f8415616290578287015190505b61629a85826150e6565b865550616301565b601f1984166162b0866161e2565b5f5b828110156162d7578489015182556001820191506020850194506020810190506162b2565b868310156162f457848901516162f0601f8916826150ca565b8355505b6001600288020188555050505b505050505050565b616312816159aa565b82525050565b5f60208201905061632b5f830184616309565b92915050565b6054811061634257616341614bea565b5b50565b5f81905061635282616331565b919050565b5f61636182616345565b9050919050565b61637181616357565b82525050565b5f60208201905061638a5f830184616368565b92915050565b5f81905092915050565b6163a38161433f565b82525050565b5f6163b4838361639a565b60208301905092915050565b5f6163ca826142f7565b6163d48185616390565b93506163df83614311565b805f5b8381101561640f5781516163f688826163a9565b975061640183614376565b9250506001810190506163e2565b5085935050505092915050565b5f61642782846163c0565b915081905092915050565b5f60c0820190506164455f830189614763565b6164526020830188614763565b61645f6040830187614763565b61646c60608301866147c5565b61647960808301856147c5565b61648660a0830184614763565b979650505050505050565b5f60a0820190506164a45f830188614763565b6164b16020830187614763565b6164be6040830186614763565b6164cb60608301856147c5565b6164d860808301846147d4565b9695505050505050565b5f6080820190506164f55f830187614763565b6165026020830186616309565b61650f6040830185614763565b61651c6060830184614763565b9594505050505056fe5573657244656372797074526573706f6e7365566572696669636174696f6e286279746573207075626c69634b65792c627974657333325b5d20637448616e646c65732c6279746573207573657244656372797074656453686172652c627974657320657874726144617461295075626c696344656372797074566572696669636174696f6e28627974657333325b5d20637448616e646c65732c627974657320646563727970746564526573756c742c62797465732065787472614461746129557365724465637279707452657175657374566572696669636174696f6e286279746573207075626c69634b65792c616464726573735b5d20636f6e74726163744164647265737365732c75696e7432353620737461727454696d657374616d702c75696e74323536206475726174696f6e446179732c62797465732065787472614461746129 + ///0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000043575f80fd5b50620000546200005a60201b60201c565b620001c4565b5f6200006b6200015e60201b60201c565b9050805f0160089054906101000a900460ff1615620000b6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146200015b5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051620001529190620001a9565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b620001a38162000185565b82525050565b5f602082019050620001be5f83018462000198565b92915050565b6080516167ca620001eb5f395f8181612354015281816123a9015261264b01526167ca5ff3fe608060405260043610610108575f3560e01c80635c975abb11610094578063ad3cb1cc11610063578063ad3cb1cc1461031c578063c411587414610346578063d8998f451461035c578063f1b57adb14610384578063fbb83259146103ac57610108565b80635c975abb146102845780636f8913bc146102ae5780638456cb59146102d657806384b0196e146102ec57610108565b80633f4ba83a116100db5780633f4ba83a146101b05780634014c4cd146101c65780634f1ef2861461020257806352d1902d1461021e57806358f5b8ab1461024857610108565b8063046f9eb31461010c5780630900cc69146101345780630d8e6e2c1461017057806339f738101461019a575b5f80fd5b348015610117575f80fd5b50610132600480360381019061012d919061421a565b6103e8565b005b34801561013f575f80fd5b5061015a600480360381019061015591906142de565b610845565b60405161016791906143f0565b60405180910390f35b34801561017b575f80fd5b50610184610916565b604051610191919061449a565b60405180910390f35b3480156101a5575f80fd5b506101ae610991565b005b3480156101bb575f80fd5b506101c4610bc9565b005b3480156101d1575f80fd5b506101ec60048036038101906101e7919061450f565b610d11565b6040516101f991906145a7565b60405180910390f35b61021c60048036038101906102179190614712565b610e1b565b005b348015610229575f80fd5b50610232610e3a565b60405161023f9190614784565b60405180910390f35b348015610253575f80fd5b5061026e600480360381019061026991906142de565b610e6b565b60405161027b91906145a7565b60405180910390f35b34801561028f575f80fd5b50610298610e9e565b6040516102a591906145a7565b60405180910390f35b3480156102b9575f80fd5b506102d460048036038101906102cf919061421a565b610ec0565b005b3480156102e1575f80fd5b506102ea6112aa565b005b3480156102f7575f80fd5b506103006113cf565b60405161031397969594939291906148ac565b60405180910390f35b348015610327575f80fd5b506103306114d8565b60405161033d919061449a565b60405180910390f35b348015610351575f80fd5b5061035a611511565b005b348015610367575f80fd5b50610382600480360381019061037d919061450f565b611636565b005b34801561038f575f80fd5b506103aa60048036038101906103a591906149c3565b6117f4565b005b3480156103b7575f80fd5b506103d260048036038101906103cd9190614afd565b611c3d565b6040516103df91906145a7565b60405180910390f35b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663e5275eaf336040518263ffffffff1660e01b81526004016104359190614b8e565b602060405180830381865afa158015610450573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104749190614bd1565b6104b557336040517faee863230000000000000000000000000000000000000000000000000000000081526004016104ac9190614b8e565b60405180910390fd5b5f6104be611e29565b905060f8600260058111156104d6576104d5614bfc565b5b901b881115806104e95750806008015488115b1561052b57876040517fd48af9420000000000000000000000000000000000000000000000000000000081526004016105229190614c29565b60405180910390fd5b5f6106bf826007015f8b81526020019081526020015f206040518060400160405290815f8201805461055c90614c6f565b80601f016020809104026020016040519081016040528092919081815260200182805461058890614c6f565b80156105d35780601f106105aa576101008083540402835291602001916105d3565b820191905f5260205f20905b8154815290600101906020018083116105b657829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561062957602002820191905f5260205f20905b815481526020019060010190808311610615575b50505050508152505089898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505086868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611e50565b90506106cd89828888611f11565b5f826002015f8b81526020019081526020015f205f805f1b81526020019081526020015f2090508033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550897f7fcdfb5381917f554a717d0a5470a33f5a49ba6445f05ec43c74c0bc2cc608b2600183805490506107869190614ccc565b8b8b8b8b8b8b60405161079f9796959493929190614d3b565b60405180910390a2825f015f8b81526020019081526020015f205f9054906101000a900460ff161580156107dc57506107db8180549050612082565b5b15610839576001835f015f8c81526020019081526020015f205f6101000a81548160ff021916908315150217905550897fe89752be0ecdb68b2a6eb5ef1a891039e0e92ae3c8a62274c5881e48eea1ed2560405160405180910390a25b50505050505050505050565b60605f610850611e29565b90505f816003015f8581526020019081526020015f20549050816002015f8581526020019081526020015f205f8281526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561090857602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116108bf575b505050505092505050919050565b60606040518060400160405280600a81526020017f44656372797074696f6e000000000000000000000000000000000000000000008152506109575f612113565b6109616002612113565b61096a5f612113565b60405160200161097d9493929190614e67565b604051602081830303815290604052905090565b600161099b6121dd565b67ffffffffffffffff16146109dc576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f6109e7612201565b9050805f0160089054906101000a900460ff1680610a2f57508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15610a66576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff021916908315150217905550610b1f6040518060400160405280600a81526020017f44656372797074696f6e000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250612228565b610b2761223e565b5f610b30611e29565b905060f860016005811115610b4857610b47614bfc565b5b901b816006018190555060f860026005811115610b6857610b67614bfc565b5b901b8160080181905550505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d282604051610bbd9190614ee7565b60405180910390a15050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4a9190614f14565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610cc5575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610d0757336040517fe19166ee000000000000000000000000000000000000000000000000000000008152600401610cfe9190614b8e565b60405180910390fd5b610d0f612250565b565b5f805f90505b85859050811015610e0d5773f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff16630620326d878784818110610d6557610d64614f3f565b5b905060200201356040518263ffffffff1660e01b8152600401610d889190614784565b602060405180830381865afa158015610da3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc79190614bd1565b1580610df25750610df0868683818110610de457610de3614f3f565b5b905060200201356122be565b155b15610e00575f915050610e13565b8080600101915050610d17565b50600190505b949350505050565b610e23612352565b610e2c82612438565b610e36828261252b565b5050565b5f610e43612649565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f80610e75611e29565b9050805f015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b5f80610ea86126d0565b9050805f015f9054906101000a900460ff1691505090565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663e5275eaf336040518263ffffffff1660e01b8152600401610f0d9190614b8e565b602060405180830381865afa158015610f28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4c9190614bd1565b610f8d57336040517faee86323000000000000000000000000000000000000000000000000000000008152600401610f849190614b8e565b60405180910390fd5b5f610f96611e29565b905060f860016005811115610fae57610fad614bfc565b5b901b88111580610fc15750806006015488115b1561100357876040517fd48af942000000000000000000000000000000000000000000000000000000008152600401610ffa9190614c29565b60405180910390fd5b5f6110f4826005015f8b81526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561106257602002820191905f5260205f20905b81548152602001906001019080831161104e575b505050505089898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505086868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506126f7565b905061110289828888611f11565b5f826004015f8b81526020019081526020015f205f8381526020019081526020015f20905080878790918060018154018082558091505060019003905f5260205f20015f909192909192909192909192509182611160929190615113565b50826002015f8b81526020019081526020015f205f8381526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825f015f8b81526020019081526020015f205f9054906101000a900460ff16158015611216575061121581805490506127a8565b5b1561129e576001835f015f8c81526020019081526020015f205f6101000a81548160ff02191690831515021790555081836003015f8c81526020019081526020015f2081905550897fd7e58a367a0a6c298e76ad5d240004e327aa1423cbe4bd7ff85d4c715ef8d15f8a8a84898960405161129595949392919061532e565b60405180910390a25b50505050505050505050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016112f79190614b8e565b602060405180830381865afa158015611312573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113369190614bd1565b158015611383575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156113c557336040517f388916bb0000000000000000000000000000000000000000000000000000000081526004016113bc9190614b8e565b60405180910390fd5b6113cd612839565b565b5f6060805f805f60605f6113e16128a8565b90505f801b815f01541480156113fc57505f801b8160010154145b61143b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611432906153c6565b60405180910390fd5b6114436128cf565b61144b61296d565b46305f801b5f67ffffffffffffffff81111561146a576114696145ee565b5b6040519080825280602002602001820160405280156114985781602001602082028036833780820191505090505b507f0f0000000000000000000000000000000000000000000000000000000000000095949392919097509750975097509750975097505090919293949596565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60035f61151c612201565b9050805f0160089054906101000a900460ff168061156457508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b1561159b576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d28260405161162a9190614ee7565b60405180910390a15050565b61163e612a0b565b5f848490500361167a576040517f2de7543800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116c38484808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050612a4c565b5f73c7d45661a345ec5ca0e8521cfef7e32fda0daa6873ffffffffffffffffffffffffffffffffffffffff1663a14f897186866040518363ffffffff1660e01b815260040161171392919061545c565b5f60405180830381865afa15801561172d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906117559190615707565b905061176081612b04565b5f611769611e29565b9050806006015f81548092919061177f9061574e565b91905055505f816006015490508686836005015f8481526020019081526020015f2091906117ae9291906140c4565b50807ff1b11be50c03123b97d816b2941afe78c72cbaefeff5531fd1ef80ed6d2ecca88487876040516117e39392919061593e565b60405180910390a250505050505050565b6117fc612a0b565b5f88806020019061180d9190615981565b905003611846576040517f57cfa21700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a60ff1688806020019061185b9190615981565b905011156118b457600a8880602001906118759190615981565b90506040517faf1f04950000000000000000000000000000000000000000000000000000000081526004016118ab929190615a1f565b60405180910390fd5b6118cd898036038101906118c89190615a93565b612bea565b6119258880602001906118e09190615981565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f8201169050808301925050505050505088612d35565b15611979578688806020019061193b9190615981565b6040517fdc4d78b100000000000000000000000000000000000000000000000000000000815260040161197093929190615b44565b60405180910390fd5b5f6119d48c8c8b806020019061198f9190615981565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508b612db3565b9050611a848a8036038101906119ea9190615a93565b8a6119f490615c72565b8a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612fa6565b5f73c7d45661a345ec5ca0e8521cfef7e32fda0daa6873ffffffffffffffffffffffffffffffffffffffff1663a14f8971836040518263ffffffff1660e01b8152600401611ad29190615d1c565b5f60405180830381865afa158015611aec573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611b149190615707565b9050611b1f81612b04565b5f611b28611e29565b9050806008015f815480929190611b3e9061574e565b91905055505f8160080154905060405180604001604052808b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815260200185815250826007015f8381526020019081526020015f205f820151815f019081611bc99190615d46565b506020820151816001019080519060200190611be692919061410f565b50905050807f953b685968a1a7c5f0dfb3ded7daa9f4f6b8f2d81fe33e4d272623d10e783eb8848d8d8d8b8b604051611c2496959493929190615e15565b60405180910390a2505050505050505050505050505050565b5f805f90505b85859050811015611e1a5773f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff1663c6528f69878784818110611c9157611c90614f3f565b5b9050604002015f0135896040518363ffffffff1660e01b8152600401611cb8929190615e71565b602060405180830381865afa158015611cd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf79190614bd1565b1580611dd3575073f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff1663c6528f69878784818110611d4157611d40614f3f565b5b9050604002015f0135888885818110611d5d57611d5c614f3f565b5b9050604002016020016020810190611d759190615e98565b6040518363ffffffff1660e01b8152600401611d92929190615e71565b602060405180830381865afa158015611dad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd19190614bd1565b155b80611dff5750611dfd868683818110611def57611dee614f3f565b5b9050604002015f01356122be565b155b15611e0d575f915050611e20565b8080600101915050611c43565b50600190505b95945050505050565b5f7f68113e68af494c6efd0210fc4bf9ba748d1ffadaa4718217fdf63548c4aee700905090565b5f611f086040518060a00160405280606d8152602001616682606d913980519060200120855f0151805190602001208660200151604051602001611e949190615f4f565b60405160208183030381529060405280519060200120868051906020012086604051602001611ec39190615f9f565b60405160208183030381529060405280519060200120604051602001611eed959493929190615fb5565b60405160208183030381529060405280519060200120613082565b90509392505050565b5f611f1a611e29565b90505f611f6a8585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505061309b565b9050611f75816130c5565b816001015f8781526020019081526020015f205f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156120145785816040517f99ec48d900000000000000000000000000000000000000000000000000000000815260040161200b929190616006565b60405180910390fd5b6001826001015f8881526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550505050505050565b5f8073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663c2b429866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612105919061602d565b905080831015915050919050565b60605f600161212184613195565b0190505f8167ffffffffffffffff81111561213f5761213e6145ee565b5b6040519080825280601f01601f1916602001820160405280156121715781602001600182028036833780820191505090505b5090505f82602001820190505b6001156121d2578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816121c7576121c6616058565b5b0494505f850361217e575b819350505050919050565b5f6121e6612201565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b6122306132e6565b61223a8282613326565b5050565b6122466132e6565b61224e613377565b565b6122586133a7565b5f6122616126d0565b90505f815f015f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122a66133e7565b6040516122b39190614b8e565b60405180910390a150565b5f73c7d45661a345ec5ca0e8521cfef7e32fda0daa6873ffffffffffffffffffffffffffffffffffffffff16632ddc9a6f836040518263ffffffff1660e01b815260040161230c9190614784565b602060405180830381865afa158015612327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061234b9190614bd1565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614806123ff57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166123e66133ee565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612436576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612495573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b99190614f14565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461252857336040517f0e56cf3d00000000000000000000000000000000000000000000000000000000815260040161251f9190614b8e565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561259357506040513d601f19601f820116820180604052508101906125909190616085565b60015b6125d457816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016125cb9190614b8e565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b811461263a57806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016126319190614784565b60405180910390fd5b6126448383613441565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16146126ce576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b5f61279f6040518060800160405280605481526020016166ef60549139805190602001208560405160200161272c9190615f4f565b6040516020818303038152906040528051906020012085805190602001208560405160200161275b9190615f9f565b6040516020818303038152906040528051906020012060405160200161278494939291906160b0565b60405160208183030381529060405280519060200120613082565b90509392505050565b5f8073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16632a3889986040518163ffffffff1660e01b8152600401602060405180830381865afa158015612807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061282b919061602d565b905080831015915050919050565b612841612a0b565b5f61284a6126d0565b90506001815f015f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586128906133e7565b60405161289d9190614b8e565b60405180910390a150565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100905090565b60605f6128da6128a8565b90508060020180546128eb90614c6f565b80601f016020809104026020016040519081016040528092919081815260200182805461291790614c6f565b80156129625780601f1061293957610100808354040283529160200191612962565b820191905f5260205f20905b81548152906001019060200180831161294557829003601f168201915b505050505091505090565b60605f6129786128a8565b905080600301805461298990614c6f565b80601f01602080910402602001604051908101604052809291908181526020018280546129b590614c6f565b8015612a005780601f106129d757610100808354040283529160200191612a00565b820191905f5260205f20905b8154815290600101906020018083116129e357829003601f168201915b505050505091505090565b612a13610e9e565b15612a4a576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f805b8251811015612ab4575f838281518110612a6c57612a6b614f3f565b5b602002602001015190505f612a80826134b3565b9050612a8b8161353d565b61ffff1684612a9a91906160f3565b9350612aa582613728565b50508080600101915050612a4f565b50610800811115612b0057610800816040517fe7f4895d000000000000000000000000000000000000000000000000000000008152600401612af7929190616126565b60405180910390fd5b5050565b600181511115612be7575f815f81518110612b2257612b21614f3f565b5b60200260200101516020015190505f600190505b8251811015612be45781838281518110612b5357612b52614f3f565b5b60200260200101516020015114612bd757825f81518110612b7757612b76614f3f565b5b6020026020010151838281518110612b9257612b91614f3f565b5b60200260200101516040517fc2eddf9d000000000000000000000000000000000000000000000000000000008152600401612bce9291906161c0565b60405180910390fd5b8080600101915050612b36565b50505b50565b5f816020015103612c27576040517fde2859c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61016d61ffff1681602001511115612c7e5761016d81602001516040517f32951863000000000000000000000000000000000000000000000000000000008152600401612c75929190616232565b60405180910390fd5b42815f01511115612ccb5742815f01516040517ff24c0887000000000000000000000000000000000000000000000000000000008152600401612cc2929190616126565b60405180910390fd5b42620151808260200151612cdf9190616259565b825f0151612ced91906160f3565b1015612d325742816040517f30348040000000000000000000000000000000000000000000000000000000008152600401612d299291906162c7565b60405180910390fd5b50565b5f805f90505b8351811015612da8578273ffffffffffffffffffffffffffffffffffffffff16848281518110612d6e57612d6d614f3f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612d9b576001915050612dad565b8080600101915050612d3b565b505f90505b92915050565b60605f8585905003612df1576040517fa6a6cb2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484905067ffffffffffffffff811115612e0e57612e0d6145ee565b5b604051908082528060200260200182016040528015612e3c5781602001602082028036833780820191505090505b5090505f805b86869050811015612f51575f878783818110612e6157612e60614f3f565b5b9050604002015f013590505f888884818110612e8057612e7f614f3f565b5b9050604002016020016020810190612e989190615e98565b90505f612ea4836134b3565b9050612eaf8161353d565b61ffff1685612ebe91906160f3565b9450612eca83886137f8565b612ed483836137f8565b612ede8883612d35565b612f215781886040517fa4c30391000000000000000000000000000000000000000000000000000000008152600401612f189291906162ee565b60405180910390fd5b82868581518110612f3557612f34614f3f565b5b6020026020010181815250505050508080600101915050612e42565b50610800811115612f9d57610800816040517fe7f4895d000000000000000000000000000000000000000000000000000000008152600401612f94929190616126565b60405180910390fd5b50949350505050565b5f612fb3888887856138cd565b90505f6130038286868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505061309b565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146130775784846040517f2a873d2700000000000000000000000000000000000000000000000000000000815260040161306e92919061631c565b60405180910390fd5b505050505050505050565b5f61309461308e613997565b836139a5565b9050919050565b5f805f806130a986866139e5565b9250925092506130b98282613a3a565b82935050505092915050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663203d0114826040518263ffffffff1660e01b81526004016131129190614b8e565b602060405180830381865afa15801561312d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131519190614bd1565b61319257806040517f2a7c6ef60000000000000000000000000000000000000000000000000000000081526004016131899190614b8e565b60405180910390fd5b50565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106131f1577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816131e7576131e6616058565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061322e576d04ee2d6d415b85acef8100000000838161322457613223616058565b5b0492506020810190505b662386f26fc10000831061325d57662386f26fc10000838161325357613252616058565b5b0492506010810190505b6305f5e1008310613286576305f5e100838161327c5761327b616058565b5b0492506008810190505b61271083106132ab5761271083816132a1576132a0616058565b5b0492506004810190505b606483106132ce57606483816132c4576132c3616058565b5b0492506002810190505b600a83106132dd576001810190505b80915050919050565b6132ee613b9c565b613324576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61332e6132e6565b5f6133376128a8565b90508281600201908161334a9190616396565b508181600301908161335c9190616396565b505f801b815f01819055505f801b8160010181905550505050565b61337f6132e6565b5f6133886126d0565b90505f815f015f6101000a81548160ff02191690831515021790555050565b6133af610e9e565b6133e5576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f33905090565b5f61341a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613bba565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61344a82613bc3565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156134a6576134a08282613c8c565b506134af565b6134ae613d0c565b5b5050565b5f8060f860f084901b901c5f1c90506053808111156134d5576134d4614bfc565b5b60ff168160ff16111561351f57806040517f641950d70000000000000000000000000000000000000000000000000000000081526004016135169190616474565b60405180910390fd5b8060ff16605381111561353557613534614bfc565b5b915050919050565b5f80605381111561355157613550614bfc565b5b82605381111561356457613563614bfc565b5b036135725760029050613723565b6002605381111561358657613585614bfc565b5b82605381111561359957613598614bfc565b5b036135a75760089050613723565b600360538111156135bb576135ba614bfc565b5b8260538111156135ce576135cd614bfc565b5b036135dc5760109050613723565b600460538111156135f0576135ef614bfc565b5b82605381111561360357613602614bfc565b5b036136115760209050613723565b6005605381111561362557613624614bfc565b5b82605381111561363857613637614bfc565b5b036136465760409050613723565b6006605381111561365a57613659614bfc565b5b82605381111561366d5761366c614bfc565b5b0361367b5760809050613723565b6007605381111561368f5761368e614bfc565b5b8260538111156136a2576136a1614bfc565b5b036136b05760a09050613723565b600860538111156136c4576136c3614bfc565b5b8260538111156136d7576136d6614bfc565b5b036136e6576101009050613723565b816040517fbe7830b100000000000000000000000000000000000000000000000000000000815260040161371a91906164d3565b60405180910390fd5b919050565b73f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff16630620326d826040518263ffffffff1660e01b81526004016137759190614784565b602060405180830381865afa158015613790573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137b49190614bd1565b6137f557806040517f4331a85d0000000000000000000000000000000000000000000000000000000081526004016137ec9190614784565b60405180910390fd5b50565b73f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff1663c6528f6983836040518363ffffffff1660e01b8152600401613847929190615e71565b602060405180830381865afa158015613862573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138869190614bd1565b6138c95781816040517f160a2b4b0000000000000000000000000000000000000000000000000000000081526004016138c0929190615e71565b60405180910390fd5b5050565b5f806040518060c001604052806087815260200161674360879139805190602001208480519060200120866020015160405160200161390c9190616578565b60405160208183030381529060405280519060200120885f015189602001518760405160200161393c9190615f9f565b604051602081830303815290604052805190602001206040516020016139679695949392919061658e565b60405160208183030381529060405280519060200120905061398c855f015182613d48565b915050949350505050565b5f6139a0613dbc565b905090565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f6041845103613a25575f805f602087015192506040870151915060608701515f1a9050613a1788828585613e1f565b955095509550505050613a33565b5f600285515f1b9250925092505b9250925092565b5f6003811115613a4d57613a4c614bfc565b5b826003811115613a6057613a5f614bfc565b5b0315613b985760016003811115613a7a57613a79614bfc565b5b826003811115613a8d57613a8c614bfc565b5b03613ac4576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115613ad857613ad7614bfc565b5b826003811115613aeb57613aea614bfc565b5b03613b2f57805f1c6040517ffce698f7000000000000000000000000000000000000000000000000000000008152600401613b269190614c29565b60405180910390fd5b600380811115613b4257613b41614bfc565b5b826003811115613b5557613b54614bfc565b5b03613b9757806040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600401613b8e9190614784565b60405180910390fd5b5b5050565b5f613ba5612201565b5f0160089054906101000a900460ff16905090565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03613c1e57806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401613c159190614b8e565b60405180910390fd5b80613c4a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613bba565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051613cb59190615f9f565b5f60405180830381855af49150503d805f8114613ced576040519150601f19603f3d011682016040523d82523d5f602084013e613cf2565b606091505b5091509150613d02858383613f06565b9250505092915050565b5f341115613d46576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f807f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613d73613f93565b613d7b614009565b8630604051602001613d919594939291906165ed565b604051602081830303815290604052805190602001209050613db381846139a5565b91505092915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613de6613f93565b613dee614009565b4630604051602001613e049594939291906165ed565b60405160208183030381529060405280519060200120905090565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115613e5b575f600385925092509250613efc565b5f6001888888886040515f8152602001604052604051613e7e949392919061663e565b6020604051602081039080840390855afa158015613e9e573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613eef575f60015f801b93509350935050613efc565b805f805f1b935093509350505b9450945094915050565b606082613f1b57613f1682614080565b613f8b565b5f8251148015613f4157505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15613f8357836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401613f7a9190614b8e565b60405180910390fd5b819050613f8c565b5b9392505050565b5f80613f9d6128a8565b90505f613fa86128cf565b90505f81511115613fc457808051906020012092505050614006565b5f825f015490505f801b8114613fdf57809350505050614006565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f806140136128a8565b90505f61401e61296d565b90505f8151111561403a5780805190602001209250505061407d565b5f826001015490505f801b81146140565780935050505061407d565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f815111156140925780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828054828255905f5260205f209081019282156140fe579160200282015b828111156140fd5782358255916020019190600101906140e2565b5b50905061410b919061415a565b5090565b828054828255905f5260205f20908101928215614149579160200282015b8281111561414857825182559160200191906001019061412d565b5b509050614156919061415a565b5090565b5b80821115614171575f815f90555060010161415b565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61419881614186565b81146141a2575f80fd5b50565b5f813590506141b38161418f565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126141da576141d96141b9565b5b8235905067ffffffffffffffff8111156141f7576141f66141bd565b5b602083019150836001820283011115614213576142126141c1565b5b9250929050565b5f805f805f805f6080888a0312156142355761423461417e565b5b5f6142428a828b016141a5565b975050602088013567ffffffffffffffff81111561426357614262614182565b5b61426f8a828b016141c5565b9650965050604088013567ffffffffffffffff81111561429257614291614182565b5b61429e8a828b016141c5565b9450945050606088013567ffffffffffffffff8111156142c1576142c0614182565b5b6142cd8a828b016141c5565b925092505092959891949750929550565b5f602082840312156142f3576142f261417e565b5b5f614300848285016141a5565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61435b82614332565b9050919050565b61436b81614351565b82525050565b5f61437c8383614362565b60208301905092915050565b5f602082019050919050565b5f61439e82614309565b6143a88185614313565b93506143b383614323565b805f5b838110156143e35781516143ca8882614371565b97506143d583614388565b9250506001810190506143b6565b5085935050505092915050565b5f6020820190508181035f8301526144088184614394565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561444757808201518184015260208101905061442c565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61446c82614410565b614476818561441a565b935061448681856020860161442a565b61448f81614452565b840191505092915050565b5f6020820190508181035f8301526144b28184614462565b905092915050565b5f8083601f8401126144cf576144ce6141b9565b5b8235905067ffffffffffffffff8111156144ec576144eb6141bd565b5b602083019150836020820283011115614508576145076141c1565b5b9250929050565b5f805f80604085870312156145275761452661417e565b5b5f85013567ffffffffffffffff81111561454457614543614182565b5b614550878288016144ba565b9450945050602085013567ffffffffffffffff81111561457357614572614182565b5b61457f878288016141c5565b925092505092959194509250565b5f8115159050919050565b6145a18161458d565b82525050565b5f6020820190506145ba5f830184614598565b92915050565b6145c981614351565b81146145d3575f80fd5b50565b5f813590506145e4816145c0565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61462482614452565b810181811067ffffffffffffffff82111715614643576146426145ee565b5b80604052505050565b5f614655614175565b9050614661828261461b565b919050565b5f67ffffffffffffffff8211156146805761467f6145ee565b5b61468982614452565b9050602081019050919050565b828183375f83830152505050565b5f6146b66146b184614666565b61464c565b9050828152602081018484840111156146d2576146d16145ea565b5b6146dd848285614696565b509392505050565b5f82601f8301126146f9576146f86141b9565b5b81356147098482602086016146a4565b91505092915050565b5f80604083850312156147285761472761417e565b5b5f614735858286016145d6565b925050602083013567ffffffffffffffff81111561475657614755614182565b5b614762858286016146e5565b9150509250929050565b5f819050919050565b61477e8161476c565b82525050565b5f6020820190506147975f830184614775565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6147d18161479d565b82525050565b6147e081614186565b82525050565b6147ef81614351565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61482781614186565b82525050565b5f614838838361481e565b60208301905092915050565b5f602082019050919050565b5f61485a826147f5565b61486481856147ff565b935061486f8361480f565b805f5b8381101561489f578151614886888261482d565b975061489183614844565b925050600181019050614872565b5085935050505092915050565b5f60e0820190506148bf5f83018a6147c8565b81810360208301526148d18189614462565b905081810360408301526148e58188614462565b90506148f460608301876147d7565b61490160808301866147e6565b61490e60a0830185614775565b81810360c08301526149208184614850565b905098975050505050505050565b5f8083601f840112614943576149426141b9565b5b8235905067ffffffffffffffff8111156149605761495f6141bd565b5b60208301915083604082028301111561497c5761497b6141c1565b5b9250929050565b5f80fd5b5f6040828403121561499c5761499b614983565b5b81905092915050565b5f604082840312156149ba576149b9614983565b5b81905092915050565b5f805f805f805f805f805f6101008c8e0312156149e3576149e261417e565b5b5f8c013567ffffffffffffffff811115614a00576149ff614182565b5b614a0c8e828f0161492e565b9b509b50506020614a1f8e828f01614987565b99505060608c013567ffffffffffffffff811115614a4057614a3f614182565b5b614a4c8e828f016149a5565b9850506080614a5d8e828f016145d6565b97505060a08c013567ffffffffffffffff811115614a7e57614a7d614182565b5b614a8a8e828f016141c5565b965096505060c08c013567ffffffffffffffff811115614aad57614aac614182565b5b614ab98e828f016141c5565b945094505060e08c013567ffffffffffffffff811115614adc57614adb614182565b5b614ae88e828f016141c5565b92509250509295989b509295989b9093969950565b5f805f805f60608688031215614b1657614b1561417e565b5b5f614b23888289016145d6565b955050602086013567ffffffffffffffff811115614b4457614b43614182565b5b614b508882890161492e565b9450945050604086013567ffffffffffffffff811115614b7357614b72614182565b5b614b7f888289016141c5565b92509250509295509295909350565b5f602082019050614ba15f8301846147e6565b92915050565b614bb08161458d565b8114614bba575f80fd5b50565b5f81519050614bcb81614ba7565b92915050565b5f60208284031215614be657614be561417e565b5b5f614bf384828501614bbd565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082019050614c3c5f8301846147d7565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614c8657607f821691505b602082108103614c9957614c98614c42565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614cd682614186565b9150614ce183614186565b9250828203905081811115614cf957614cf8614c9f565b5b92915050565b5f82825260208201905092915050565b5f614d1a8385614cff565b9350614d27838584614696565b614d3083614452565b840190509392505050565b5f608082019050614d4e5f83018a6147d7565b8181036020830152614d6181888a614d0f565b90508181036040830152614d76818688614d0f565b90508181036060830152614d8b818486614d0f565b905098975050505050505050565b5f81905092915050565b5f614dad82614410565b614db78185614d99565b9350614dc781856020860161442a565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f614e07600283614d99565b9150614e1282614dd3565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f614e51600183614d99565b9150614e5c82614e1d565b600182019050919050565b5f614e728287614da3565b9150614e7d82614dfb565b9150614e898286614da3565b9150614e9482614e45565b9150614ea08285614da3565b9150614eab82614e45565b9150614eb78284614da3565b915081905095945050505050565b5f67ffffffffffffffff82169050919050565b614ee181614ec5565b82525050565b5f602082019050614efa5f830184614ed8565b92915050565b5f81519050614f0e816145c0565b92915050565b5f60208284031215614f2957614f2861417e565b5b5f614f3684828501614f00565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614fd27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614f97565b614fdc8683614f97565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61501761501261500d84614186565b614ff4565b614186565b9050919050565b5f819050919050565b61503083614ffd565b61504461503c8261501e565b848454614fa3565b825550505050565b5f90565b61505861504c565b615063818484615027565b505050565b5b818110156150865761507b5f82615050565b600181019050615069565b5050565b601f8211156150cb5761509c81614f76565b6150a584614f88565b810160208510156150b4578190505b6150c86150c085614f88565b830182615068565b50505b505050565b5f82821c905092915050565b5f6150eb5f19846008026150d0565b1980831691505092915050565b5f61510383836150dc565b9150826002028217905092915050565b61511d8383614f6c565b67ffffffffffffffff811115615136576151356145ee565b5b6151408254614c6f565b61514b82828561508a565b5f601f831160018114615178575f8415615166578287013590505b61517085826150f8565b8655506151d7565b601f19841661518686614f76565b5f5b828110156151ad57848901358255600182019150602085019450602081019050615188565b868310156151ca57848901356151c6601f8916826150dc565b8355505b6001600288020188555050505b50505050505050565b5f81549050919050565b5f82825260208201905092915050565b5f819050815f5260205f209050919050565b5f82825260208201905092915050565b5f815461522881614c6f565b615232818661520c565b9450600182165f811461524c576001811461526257615294565b60ff198316865281151560200286019350615294565b61526b85614f76565b5f5b8381101561528c5781548189015260018201915060208101905061526d565b808801955050505b50505092915050565b5f6152a8838361521c565b905092915050565b5f600182019050919050565b5f6152c6826151e0565b6152d081856151ea565b9350836020820285016152e2856151fa565b805f5b8581101561531c578484038952816152fd858261529d565b9450615308836152b0565b925060208a019950506001810190506152e5565b50829750879550505050505092915050565b5f6060820190508181035f830152615347818789614d0f565b9050818103602083015261535b81866152bc565b90508181036040830152615370818486614d0f565b90509695505050505050565b7f4549503731323a20556e696e697469616c697a656400000000000000000000005f82015250565b5f6153b060158361441a565b91506153bb8261537c565b602082019050919050565b5f6020820190508181035f8301526153dd816153a4565b9050919050565b5f82825260208201905092915050565b5f80fd5b82818337505050565b5f61540c83856153e4565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561543f5761543e6153f4565b5b6020830292506154508385846153f8565b82840190509392505050565b5f6020820190508181035f830152615475818486615401565b90509392505050565b5f67ffffffffffffffff821115615498576154976145ee565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b6154ba8161476c565b81146154c4575f80fd5b50565b5f815190506154d5816154b1565b92915050565b5f815190506154e98161418f565b92915050565b5f67ffffffffffffffff821115615509576155086145ee565b5b602082029050602081019050919050565b5f61552c615527846154ef565b61464c565b9050808382526020820190506020840283018581111561554f5761554e6141c1565b5b835b8181101561557857806155648882614f00565b845260208401935050602081019050615551565b5050509392505050565b5f82601f830112615596576155956141b9565b5b81516155a684826020860161551a565b91505092915050565b5f60a082840312156155c4576155c36154a9565b5b6155ce60a061464c565b90505f6155dd848285016154c7565b5f8301525060206155f0848285016154db565b6020830152506040615604848285016154c7565b604083015250606082015167ffffffffffffffff811115615628576156276154ad565b5b61563484828501615582565b6060830152506080615648848285016154db565b60808301525092915050565b5f6156666156618461547e565b61464c565b90508083825260208201905060208402830185811115615689576156886141c1565b5b835b818110156156d057805167ffffffffffffffff8111156156ae576156ad6141b9565b5b8086016156bb89826155af565b8552602085019450505060208101905061568b565b5050509392505050565b5f82601f8301126156ee576156ed6141b9565b5b81516156fe848260208601615654565b91505092915050565b5f6020828403121561571c5761571b61417e565b5b5f82015167ffffffffffffffff81111561573957615738614182565b5b615745848285016156da565b91505092915050565b5f61575882614186565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361578a57615789614c9f565b5b600182019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6157c78161476c565b82525050565b5f82825260208201905092915050565b5f6157e782614309565b6157f181856157cd565b93506157fc83614323565b805f5b8381101561582c5781516158138882614371565b975061581e83614388565b9250506001810190506157ff565b5085935050505092915050565b5f60a083015f83015161584e5f8601826157be565b506020830151615861602086018261481e565b50604083015161587460408601826157be565b506060830151848203606086015261588c82826157dd565b91505060808301516158a1608086018261481e565b508091505092915050565b5f6158b78383615839565b905092915050565b5f602082019050919050565b5f6158d582615795565b6158df818561579f565b9350836020820285016158f1856157af565b805f5b8581101561592c578484038952815161590d85826158ac565b9450615918836158bf565b925060208a019950506001810190506158f4565b50829750879550505050505092915050565b5f6040820190508181035f83015261595681866158cb565b9050818103602083015261596b818486614d0f565b9050949350505050565b5f80fd5b5f80fd5b5f80fd5b5f808335600160200384360303811261599d5761599c615975565b5b80840192508235915067ffffffffffffffff8211156159bf576159be615979565b5b6020830192506020820236038313156159db576159da61597d565b5b509250929050565b5f60ff82169050919050565b5f615a09615a046159ff846159e3565b614ff4565b614186565b9050919050565b615a19816159ef565b82525050565b5f604082019050615a325f830185615a10565b615a3f60208301846147d7565b9392505050565b5f60408284031215615a5b57615a5a6154a9565b5b615a65604061464c565b90505f615a74848285016141a5565b5f830152506020615a87848285016141a5565b60208301525092915050565b5f60408284031215615aa857615aa761417e565b5b5f615ab584828501615a46565b91505092915050565b5f819050919050565b5f615ad560208401846145d6565b905092915050565b5f602082019050919050565b5f615af48385614313565b9350615aff82615abe565b805f5b85811015615b3757615b148284615ac7565b615b1e8882614371565b9750615b2983615add565b925050600181019050615b02565b5085925050509392505050565b5f604082019050615b575f8301866147e6565b8181036020830152615b6a818486615ae9565b9050949350505050565b5f615b86615b81846154ef565b61464c565b90508083825260208201905060208402830185811115615ba957615ba86141c1565b5b835b81811015615bd25780615bbe88826145d6565b845260208401935050602081019050615bab565b5050509392505050565b5f82601f830112615bf057615bef6141b9565b5b8135615c00848260208601615b74565b91505092915050565b5f60408284031215615c1e57615c1d6154a9565b5b615c28604061464c565b90505f615c37848285016141a5565b5f83015250602082013567ffffffffffffffff811115615c5a57615c596154ad565b5b615c6684828501615bdc565b60208301525092915050565b5f615c7d3683615c09565b9050919050565b5f81519050919050565b5f819050602082019050919050565b5f615ca883836157be565b60208301905092915050565b5f602082019050919050565b5f615cca82615c84565b615cd481856153e4565b9350615cdf83615c8e565b805f5b83811015615d0f578151615cf68882615c9d565b9750615d0183615cb4565b925050600181019050615ce2565b5085935050505092915050565b5f6020820190508181035f830152615d348184615cc0565b905092915050565b5f81519050919050565b615d4f82615d3c565b67ffffffffffffffff811115615d6857615d676145ee565b5b615d728254614c6f565b615d7d82828561508a565b5f60209050601f831160018114615dae575f8415615d9c578287015190505b615da685826150f8565b865550615e0d565b601f198416615dbc86614f76565b5f5b82811015615de357848901518255600182019150602085019450602081019050615dbe565b86831015615e005784890151615dfc601f8916826150dc565b8355505b6001600288020188555050505b505050505050565b5f6080820190508181035f830152615e2d81896158cb565b9050615e3c60208301886147e6565b8181036040830152615e4f818688614d0f565b90508181036060830152615e64818486614d0f565b9050979650505050505050565b5f604082019050615e845f830185614775565b615e9160208301846147e6565b9392505050565b5f60208284031215615ead57615eac61417e565b5b5f615eba848285016145d6565b91505092915050565b5f81905092915050565b615ed68161476c565b82525050565b5f615ee78383615ecd565b60208301905092915050565b5f615efd82615c84565b615f078185615ec3565b9350615f1283615c8e565b805f5b83811015615f42578151615f298882615edc565b9750615f3483615cb4565b925050600181019050615f15565b5085935050505092915050565b5f615f5a8284615ef3565b915081905092915050565b5f81905092915050565b5f615f7982615d3c565b615f838185615f65565b9350615f9381856020860161442a565b80840191505092915050565b5f615faa8284615f6f565b915081905092915050565b5f60a082019050615fc85f830188614775565b615fd56020830187614775565b615fe26040830186614775565b615fef6060830185614775565b615ffc6080830184614775565b9695505050505050565b5f6040820190506160195f8301856147d7565b61602660208301846147e6565b9392505050565b5f602082840312156160425761604161417e565b5b5f61604f848285016154db565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6020828403121561609a5761609961417e565b5b5f6160a7848285016154c7565b91505092915050565b5f6080820190506160c35f830187614775565b6160d06020830186614775565b6160dd6040830185614775565b6160ea6060830184614775565b95945050505050565b5f6160fd82614186565b915061610883614186565b92508282019050808211156161205761611f614c9f565b5b92915050565b5f6040820190506161395f8301856147d7565b61614660208301846147d7565b9392505050565b5f60a083015f8301516161625f8601826157be565b506020830151616175602086018261481e565b50604083015161618860408601826157be565b50606083015184820360608601526161a082826157dd565b91505060808301516161b5608086018261481e565b508091505092915050565b5f6040820190508181035f8301526161d8818561614d565b905081810360208301526161ec818461614d565b90509392505050565b5f61ffff82169050919050565b5f61621c616217616212846161f5565b614ff4565b614186565b9050919050565b61622c81616202565b82525050565b5f6040820190506162455f830185616223565b61625260208301846147d7565b9392505050565b5f61626382614186565b915061626e83614186565b925082820261627c81614186565b9150828204841483151761629357616292614c9f565b5b5092915050565b604082015f8201516162ae5f85018261481e565b5060208201516162c1602085018261481e565b50505050565b5f6060820190506162da5f8301856147d7565b6162e7602083018461629a565b9392505050565b5f6040820190506163015f8301856147e6565b81810360208301526163138184614394565b90509392505050565b5f6020820190508181035f830152616335818486614d0f565b90509392505050565b5f819050815f5260205f209050919050565b601f821115616391576163628161633e565b61636b84614f88565b8101602085101561637a578190505b61638e61638685614f88565b830182615068565b50505b505050565b61639f82614410565b67ffffffffffffffff8111156163b8576163b76145ee565b5b6163c28254614c6f565b6163cd828285616350565b5f60209050601f8311600181146163fe575f84156163ec578287015190505b6163f685826150f8565b86555061645d565b601f19841661640c8661633e565b5f5b828110156164335784890151825560018201915060208501945060208101905061640e565b86831015616450578489015161644c601f8916826150dc565b8355505b6001600288020188555050505b505050505050565b61646e816159e3565b82525050565b5f6020820190506164875f830184616465565b92915050565b6054811061649e5761649d614bfc565b5b50565b5f8190506164ae8261648d565b919050565b5f6164bd826164a1565b9050919050565b6164cd816164b3565b82525050565b5f6020820190506164e65f8301846164c4565b92915050565b5f81905092915050565b6164ff81614351565b82525050565b5f61651083836164f6565b60208301905092915050565b5f61652682614309565b61653081856164ec565b935061653b83614323565b805f5b8381101561656b5781516165528882616505565b975061655d83614388565b92505060018101905061653e565b5085935050505092915050565b5f616583828461651c565b915081905092915050565b5f60c0820190506165a15f830189614775565b6165ae6020830188614775565b6165bb6040830187614775565b6165c860608301866147d7565b6165d560808301856147d7565b6165e260a0830184614775565b979650505050505050565b5f60a0820190506166005f830188614775565b61660d6020830187614775565b61661a6040830186614775565b61662760608301856147d7565b61663460808301846147e6565b9695505050505050565b5f6080820190506166515f830187614775565b61665e6020830186616465565b61666b6040830185614775565b6166786060830184614775565b9594505050505056fe5573657244656372797074526573706f6e7365566572696669636174696f6e286279746573207075626c69634b65792c627974657333325b5d20637448616e646c65732c6279746573207573657244656372797074656453686172652c627974657320657874726144617461295075626c696344656372797074566572696669636174696f6e28627974657333325b5d20637448616e646c65732c627974657320646563727970746564526573756c742c62797465732065787472614461746129557365724465637279707452657175657374566572696669636174696f6e286279746573207075626c69634b65792c616464726573735b5d20636f6e74726163744164647265737365732c75696e7432353620737461727454696d657374616d702c75696e74323536206475726174696f6e446179732c62797465732065787472614461746129 /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\xA0`@R0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x80\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP4\x80\x15b\0\0CW_\x80\xFD[Pb\0\0Tb\0\0Z` \x1B` \x1CV[b\0\x01\xC4V[_b\0\0kb\0\x01^` \x1B` \x1CV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15b\0\0\xB6W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14b\0\x01[Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`@Qb\0\x01R\x91\x90b\0\x01\xA9V[`@Q\x80\x91\x03\x90\xA1[PV[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[b\0\x01\xA3\x81b\0\x01\x85V[\x82RPPV[_` \x82\x01\x90Pb\0\x01\xBE_\x83\x01\x84b\0\x01\x98V[\x92\x91PPV[`\x80Qafnb\0\x01\xEB_9_\x81\x81a#:\x01R\x81\x81a#\x8F\x01Ra&1\x01Rafn_\xF3\xFE`\x80`@R`\x046\x10a\0\xFDW_5`\xE0\x1C\x80cX\xF5\xB8\xAB\x11a\0\x94W\x80c\x84\xB0\x19n\x11a\0cW\x80c\x84\xB0\x19n\x14a\x02\xE1W\x80c\xAD<\xB1\xCC\x14a\x03\x11W\x80c\xD8\x99\x8FE\x14a\x03;W\x80c\xF1\xB5z\xDB\x14a\x03cW\x80c\xFB\xB82Y\x14a\x03\x8BWa\0\xFDV[\x80cX\xF5\xB8\xAB\x14a\x02=W\x80c\\\x97Z\xBB\x14a\x02yW\x80co\x89\x13\xBC\x14a\x02\xA3W\x80c\x84V\xCBY\x14a\x02\xCBWa\0\xFDV[\x80c?K\xA8:\x11a\0\xD0W\x80c?K\xA8:\x14a\x01\xA5W\x80c@\x14\xC4\xCD\x14a\x01\xBBW\x80cO\x1E\xF2\x86\x14a\x01\xF7W\x80cR\xD1\x90-\x14a\x02\x13Wa\0\xFDV[\x80c\x04o\x9E\xB3\x14a\x01\x01W\x80c\t\0\xCCi\x14a\x01)W\x80c\r\x8En,\x14a\x01eW\x80c9\xF78\x10\x14a\x01\x8FW[_\x80\xFD[4\x80\x15a\x01\x0CW_\x80\xFD[Pa\x01'`\x04\x806\x03\x81\x01\x90a\x01\"\x91\x90aB\x08V[a\x03\xC7V[\0[4\x80\x15a\x014W_\x80\xFD[Pa\x01O`\x04\x806\x03\x81\x01\x90a\x01J\x91\x90aB\xCCV[a\x08SV[`@Qa\x01\\\x91\x90aC\xDEV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01pW_\x80\xFD[Pa\x01ya\t$V[`@Qa\x01\x86\x91\x90aD\x88V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x9AW_\x80\xFD[Pa\x01\xA3a\t\x9FV[\0[4\x80\x15a\x01\xB0W_\x80\xFD[Pa\x01\xB9a\x0B\xD7V[\0[4\x80\x15a\x01\xC6W_\x80\xFD[Pa\x01\xE1`\x04\x806\x03\x81\x01\x90a\x01\xDC\x91\x90aD\xFDV[a\r\x1FV[`@Qa\x01\xEE\x91\x90aE\x95V[`@Q\x80\x91\x03\x90\xF3[a\x02\x11`\x04\x806\x03\x81\x01\x90a\x02\x0C\x91\x90aG\0V[a\x0E\xACV[\0[4\x80\x15a\x02\x1EW_\x80\xFD[Pa\x02'a\x0E\xCBV[`@Qa\x024\x91\x90aGrV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02HW_\x80\xFD[Pa\x02c`\x04\x806\x03\x81\x01\x90a\x02^\x91\x90aB\xCCV[a\x0E\xFCV[`@Qa\x02p\x91\x90aE\x95V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x84W_\x80\xFD[Pa\x02\x8Da\x0F/V[`@Qa\x02\x9A\x91\x90aE\x95V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xAEW_\x80\xFD[Pa\x02\xC9`\x04\x806\x03\x81\x01\x90a\x02\xC4\x91\x90aB\x08V[a\x0FQV[\0[4\x80\x15a\x02\xD6W_\x80\xFD[Pa\x02\xDFa\x13XV[\0[4\x80\x15a\x02\xECW_\x80\xFD[Pa\x02\xF5a\x14}V[`@Qa\x03\x08\x97\x96\x95\x94\x93\x92\x91\x90aH\x9AV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03\x1CW_\x80\xFD[Pa\x03%a\x15\x86V[`@Qa\x032\x91\x90aD\x88V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03FW_\x80\xFD[Pa\x03a`\x04\x806\x03\x81\x01\x90a\x03\\\x91\x90aD\xFDV[a\x15\xBFV[\0[4\x80\x15a\x03nW_\x80\xFD[Pa\x03\x89`\x04\x806\x03\x81\x01\x90a\x03\x84\x91\x90aI\xB1V[a\x17}V[\0[4\x80\x15a\x03\x96W_\x80\xFD[Pa\x03\xB1`\x04\x806\x03\x81\x01\x90a\x03\xAC\x91\x90aJ\xEBV[a\x1C.V[`@Qa\x03\xBE\x91\x90aE\x95V[`@Q\x80\x91\x03\x90\xF3[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xE5'^\xAF3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x04\x14\x91\x90aK|V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04/W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04S\x91\x90aK\xBFV[a\x04\x94W3`@Q\x7F\xAE\xE8c#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x04\x8B\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[_a\x04\x9Da\x1E\x9DV[\x90P`\xF8`\x02`\x05\x81\x11\x15a\x04\xB5Wa\x04\xB4aK\xEAV[[\x90\x1B\x88\x11\x15\x80a\x04\xC8WP\x80`\x08\x01T\x88\x11[\x15a\x05\nW\x87`@Q\x7F\xD4\x8A\xF9B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05\x01\x91\x90aL\x17V[`@Q\x80\x91\x03\x90\xFD[_\x81`\x07\x01_\x8A\x81R` \x01\x90\x81R` \x01_ `@Q\x80`@\x01`@R\x90\x81_\x82\x01\x80Ta\x058\x90aL]V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x05d\x90aL]V[\x80\x15a\x05\xAFW\x80`\x1F\x10a\x05\x86Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x05\xAFV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x05\x92W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x06\x05W` \x02\x82\x01\x91\x90_R` _ \x90[\x81T\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x05\xF1W[PPPPP\x81RPP\x90P_`@Q\x80`\x80\x01`@R\x80\x83_\x01Q\x81R` \x01\x83` \x01Q\x81R` \x01\x8A\x8A\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81R` \x01\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81RP\x90P_a\x06\xCB\x82a\x1E\xC4V[\x90Pa\x06\xD9\x8B\x82\x8A\x8Aa\x1F\x8BV[_\x84`\x02\x01_\x8D\x81R` \x01\x90\x81R` \x01_ _\x80_\x1B\x81R` \x01\x90\x81R` \x01_ \x90P\x803\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x8B\x7F\x7F\xCD\xFBS\x81\x91\x7FUJq}\nTp\xA3?ZI\xBAdE\xF0^\xC4a\x1E\x9DV[\x90P`\xF8`\x01`\x05\x81\x11\x15a\x0BVWa\x0BUaK\xEAV[[\x90\x1B\x81`\x06\x01\x81\x90UP`\xF8`\x02`\x05\x81\x11\x15a\x0BvWa\x0BuaK\xEAV[[\x90\x1B\x81`\x08\x01\x81\x90UPP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x0B\xCB\x91\x90aN\xD5V[`@Q\x80\x91\x03\x90\xA1PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0C4W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0CX\x91\x90aO\x02V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15\x80\x15a\x0C\xD3WPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\r\x15W3`@Q\x7F\xE1\x91f\xEE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\r\x0C\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[a\r\x1Da\"\xCAV[V[_\x80_\x90P[\x85\x85\x90P\x81\x10\x15a\x0E\x9EWs\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x06 2m\x87\x87\x84\x81\x81\x10a\rsWa\rraO-V[[\x90P` \x02\x015`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\x96\x91\x90aGrV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\xB1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\r\xD5\x91\x90aK\xBFV[\x15\x80a\x0E\x83WPs\xC7\xD4Va\xA3E\xEC\\\xA0\xE8R\x1C\xFE\xF7\xE3/\xDA\r\xAAhs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xDC\x9Ao\x87\x87\x84\x81\x81\x10a\x0E\x1FWa\x0E\x1EaO-V[[\x90P` \x02\x015`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0EB\x91\x90aGrV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E]W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\x81\x91\x90aK\xBFV[\x15[\x15a\x0E\x91W_\x91PPa\x0E\xA4V[\x80\x80`\x01\x01\x91PPa\r%V[P`\x01\x90P[\x94\x93PPPPV[a\x0E\xB4a#8V[a\x0E\xBD\x82a$\x1EV[a\x0E\xC7\x82\x82a%\x11V[PPV[_a\x0E\xD4a&/V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[_\x80a\x0F\x06a\x1E\x9DV[\x90P\x80_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x80a\x0F9a&\xB6V[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x90V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xE5'^\xAF3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\x9E\x91\x90aK|V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0F\xB9W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0F\xDD\x91\x90aK\xBFV[a\x10\x1EW3`@Q\x7F\xAE\xE8c#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x10\x15\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[_a\x10'a\x1E\x9DV[\x90P`\xF8`\x01`\x05\x81\x11\x15a\x10?Wa\x10>aK\xEAV[[\x90\x1B\x88\x11\x15\x80a\x10RWP\x80`\x06\x01T\x88\x11[\x15a\x10\x94W\x87`@Q\x7F\xD4\x8A\xF9B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x10\x8B\x91\x90aL\x17V[`@Q\x80\x91\x03\x90\xFD[_`@Q\x80``\x01`@R\x80\x83`\x05\x01_\x8C\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x10\xFBW` \x02\x82\x01\x91\x90_R` _ \x90[\x81T\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x10\xE7W[PPPPP\x81R` \x01\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81R` \x01\x85\x85\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81RP\x90P_a\x11\xA1\x82a&\xDDV[\x90Pa\x11\xAF\x8A\x82\x89\x89a\x1F\x8BV[_\x83`\x04\x01_\x8C\x81R` \x01\x90\x81R` \x01_ _\x83\x81R` \x01\x90\x81R` \x01_ \x90P\x80\x88\x88\x90\x91\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x92\x90\x91\x92\x90\x91\x92\x90\x91\x92P\x91\x82a\x12\r\x92\x91\x90aQ\x01V[P\x83`\x02\x01_\x8C\x81R` \x01\x90\x81R` \x01_ _\x83\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x83_\x01_\x8C\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x12\xC3WPa\x12\xC2\x81\x80T\x90Pa'\x97V[[\x15a\x13KW`\x01\x84_\x01_\x8D\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81\x84`\x03\x01_\x8D\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x8A\x7F\xD7\xE5\x8A6z\nl)\x8Ev\xAD]$\0\x04\xE3'\xAA\x14#\xCB\xE4\xBD\x7F\xF8]Lq^\xF8\xD1_\x8B\x8B\x84\x8A\x8A`@Qa\x13B\x95\x94\x93\x92\x91\x90aS\x1CV[`@Q\x80\x91\x03\x90\xA2[PPPPPPPPPPPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cF\xFB\xF6\x8E3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x13\xA5\x91\x90aK|V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x13\xC0W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\xE4\x91\x90aK\xBFV[\x15\x80\x15a\x141WPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x14sW3`@Q\x7F8\x89\x16\xBB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14j\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[a\x14{a((V[V[_``\x80_\x80_``_a\x14\x8Fa(\x97V[\x90P_\x80\x1B\x81_\x01T\x14\x80\x15a\x14\xAAWP_\x80\x1B\x81`\x01\x01T\x14[a\x14\xE9W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14\xE0\x90aS\xB4V[`@Q\x80\x91\x03\x90\xFD[a\x14\xF1a(\xBEV[a\x14\xF9a)\\V[F0_\x80\x1B_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x15\x18Wa\x15\x17aE\xDCV[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x15FW\x81` \x01` \x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x7F\x0F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95\x94\x93\x92\x91\x90\x97P\x97P\x97P\x97P\x97P\x97P\x97PP\x90\x91\x92\x93\x94\x95\x96V[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[a\x15\xC7a)\xFAV[_\x84\x84\x90P\x03a\x16\x03W`@Q\x7F-\xE7T8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x16L\x84\x84\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa*;V[_s\xC7\xD4Va\xA3E\xEC\\\xA0\xE8R\x1C\xFE\xF7\xE3/\xDA\r\xAAhs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xA1O\x89q\x86\x86`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x16\x9C\x92\x91\x90aTJV[_`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x16\xB6W=_\x80>=_\xFD[PPPP`@Q=_\x82>=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x16\xDE\x91\x90aV\xE1V[\x90Pa\x16\xE9\x81a*\xF3V[_a\x16\xF2a\x1E\x9DV[\x90P\x80`\x06\x01_\x81T\x80\x92\x91\x90a\x17\x08\x90aW(V[\x91\x90PUP_\x81`\x06\x01T\x90P\x86\x86\x83`\x05\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x91\x90a\x177\x92\x91\x90a@\xB2V[P\x80\x7F\"\xDBH\n9\xBDrUd8\xAA\xDBJ2\xA3\xD2\xA6c\x8B\x87\xC0;\xBE\xC5\xFE\xF6\x99~\x10\x95\x87\xFF\x84\x87\x87`@Qa\x17l\x93\x92\x91\x90aY\x05V[`@Q\x80\x91\x03\x90\xA2PPPPPPPV[a\x17\x85a)\xFAV[_\x88\x80` \x01\x90a\x17\x96\x91\x90aYHV[\x90P\x03a\x17\xCFW`@Q\x7FW\xCF\xA2\x17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\n`\xFF\x16\x88\x80` \x01\x90a\x17\xE4\x91\x90aYHV[\x90P\x11\x15a\x18=W`\n\x88\x80` \x01\x90a\x17\xFE\x91\x90aYHV[\x90P`@Q\x7F\xAF\x1F\x04\x95\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x184\x92\x91\x90aY\xE6V[`@Q\x80\x91\x03\x90\xFD[a\x18V\x89\x806\x03\x81\x01\x90a\x18Q\x91\x90aZZV[a+\xD9V[a\x18\xAE\x88\x80` \x01\x90a\x18i\x91\x90aYHV[\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x88a-$V[\x15a\x19\x02W\x86\x88\x80` \x01\x90a\x18\xC4\x91\x90aYHV[`@Q\x7F\xDCMx\xB1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x18\xF9\x93\x92\x91\x90a[\x0BV[`@Q\x80\x91\x03\x90\xFD[_a\x19]\x8C\x8C\x8B\x80` \x01\x90a\x19\x18\x91\x90aYHV[\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x8Ba-\xA2V[\x90P_`@Q\x80`\xA0\x01`@R\x80\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81R` \x01\x8B\x80` \x01\x90a\x19\xC4\x91\x90aYHV[\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81R` \x01\x8C_\x015\x81R` \x01\x8C` \x015\x81R` \x01\x85\x85\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81RP\x90Pa\x1At\x81\x8A\x88\x88\x8E_\x015a/\x95V[_s\xC7\xD4Va\xA3E\xEC\\\xA0\xE8R\x1C\xFE\xF7\xE3/\xDA\r\xAAhs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xA1O\x89q\x84`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1A\xC2\x91\x90a[\xD3V[_`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1A\xDCW=_\x80>=_\xFD[PPPP`@Q=_\x82>=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1B\x04\x91\x90aV\xE1V[\x90Pa\x1B\x0F\x81a*\xF3V[_a\x1B\x18a\x1E\x9DV[\x90P\x80`\x08\x01_\x81T\x80\x92\x91\x90a\x1B.\x90aW(V[\x91\x90PUP_\x81`\x08\x01T\x90P`@Q\x80`@\x01`@R\x80\x8C\x8C\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81R` \x01\x86\x81RP\x82`\x07\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01\x90\x81a\x1B\xB9\x91\x90a[\xFDV[P` \x82\x01Q\x81`\x01\x01\x90\x80Q\x90` \x01\x90a\x1B\xD6\x92\x91\x90a@\xFDV[P\x90PP\x80\x7F\xF9\x01\x1B\xD6\xBA\r\xA6\x04\x9CR\rp\xFEYq\xF1~\xD7\xAByT\x86\x05%D\xB5\x10\x19\x89lYk\x84\x8E\x8E\x8E\x8C\x8C`@Qa\x1C\x14\x96\x95\x94\x93\x92\x91\x90a\\\xCCV[`@Q\x80\x91\x03\x90\xA2PPPPPPPPPPPPPPPPV[_\x80_\x90P[\x85\x85\x90P\x81\x10\x15a\x1E\x8EWs\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC6R\x8Fi\x87\x87\x84\x81\x81\x10a\x1C\x82Wa\x1C\x81aO-V[[\x90P`@\x02\x01_\x015\x89`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1C\xA9\x92\x91\x90a](V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1C\xC4W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1C\xE8\x91\x90aK\xBFV[\x15\x80a\x1D\xC4WPs\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC6R\x8Fi\x87\x87\x84\x81\x81\x10a\x1D2Wa\x1D1aO-V[[\x90P`@\x02\x01_\x015\x88\x88\x85\x81\x81\x10a\x1DNWa\x1DMaO-V[[\x90P`@\x02\x01` \x01` \x81\x01\x90a\x1Df\x91\x90a]OV[`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\x83\x92\x91\x90a](V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1D\x9EW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1D\xC2\x91\x90aK\xBFV[\x15[\x80a\x1EsWPs\xC7\xD4Va\xA3E\xEC\\\xA0\xE8R\x1C\xFE\xF7\xE3/\xDA\r\xAAhs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xDC\x9Ao\x87\x87\x84\x81\x81\x10a\x1E\rWa\x1E\x0CaO-V[[\x90P`@\x02\x01_\x015`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E2\x91\x90aGrV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1EMW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1Eq\x91\x90aK\xBFV[\x15[\x15a\x1E\x81W_\x91PPa\x1E\x94V[\x80\x80`\x01\x01\x91PPa\x1C4V[P`\x01\x90P[\x95\x94PPPPPV[_\x7Fh\x11>h\xAFILn\xFD\x02\x10\xFCK\xF9\xBAt\x8D\x1F\xFA\xDA\xA4q\x82\x17\xFD\xF65H\xC4\xAE\xE7\0\x90P\x90V[_a\x1F\x84`@Q\x80`\xA0\x01`@R\x80`m\x81R` \x01ae&`m\x919\x80Q\x90` \x01 \x83_\x01Q\x80Q\x90` \x01 \x84` \x01Q`@Q` \x01a\x1F\x08\x91\x90a^\x06V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x85`@\x01Q\x80Q\x90` \x01 \x86``\x01Q`@Q` \x01a\x1F?\x91\x90a^VV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a\x1Fi\x95\x94\x93\x92\x91\x90a^lV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 a0mV[\x90P\x91\x90PV[_a\x1F\x94a\x1E\x9DV[\x90P_a\x1F\xE4\x85\x85\x85\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa0\x86V[\x90Pa\x1F\xEF\x81a0\xB0V[\x81`\x01\x01_\x87\x81R` \x01\x90\x81R` \x01_ _\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a \x8EW\x85\x81`@Q\x7F\x99\xECH\xD9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a \x85\x92\x91\x90a^\xBDV[`@Q\x80\x91\x03\x90\xFD[`\x01\x82`\x01\x01_\x88\x81R` \x01\x90\x81R` \x01_ _\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UPPPPPPPV[_\x80s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC2\xB4)\x86`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a![W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a!\x7F\x91\x90a^\xE4V[\x90P\x80\x83\x10\x15\x91PP\x91\x90PV[``_`\x01a!\x9B\x84a1\x80V[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!\xB9Wa!\xB8aE\xDCV[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a!\xEBW\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a\"LW\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a\"AWa\"@a_\x0FV[[\x04\x94P_\x85\x03a!\xF8W[\x81\x93PPPP\x91\x90PV[_a\"`a\"{V[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[a\"\xAAa2\xD1V[a\"\xB4\x82\x82a3\x11V[PPV[a\"\xC0a2\xD1V[a\"\xC8a3bV[V[a\"\xD2a3\x92V[_a\"\xDBa&\xB6V[\x90P_\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F]\xB9\xEE\nI[\xF2\xE6\xFF\x9C\x91\xA7\x83L\x1B\xA4\xFD\xD2D\xA5\xE8\xAANS{\xD3\x8A\xEA\xE4\xB0s\xAAa# a3\xD2V[`@Qa#-\x91\x90aK|V[`@Q\x80\x91\x03\x90\xA1PV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a#\xE5WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a#\xCCa3\xD9V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a$\x1CW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a${W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a$\x9F\x91\x90aO\x02V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a%\x0EW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%\x05\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a%yWP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a%v\x91\x90a_ v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a& W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a&\x17\x91\x90aGrV[`@Q\x80\x91\x03\x90\xFD[a&*\x83\x83a4,V[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a&\xB4W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x7F\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\x90P\x90V[_a'\x90`@Q\x80`\x80\x01`@R\x80`T\x81R` \x01ae\x93`T\x919\x80Q\x90` \x01 \x83_\x01Q`@Q` \x01a'\x15\x91\x90a^\x06V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x84` \x01Q\x80Q\x90` \x01 \x85`@\x01Q`@Q` \x01a'L\x91\x90a^VV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a'u\x94\x93\x92\x91\x90a_gV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 a0mV[\x90P\x91\x90PV[_\x80s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c*8\x89\x98`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a'\xF6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a(\x1A\x91\x90a^\xE4V[\x90P\x80\x83\x10\x15\x91PP\x91\x90PV[a(0a)\xFAV[_a(9a&\xB6V[\x90P`\x01\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2Xa(\x7Fa3\xD2V[`@Qa(\x8C\x91\x90aK|V[`@Q\x80\x91\x03\x90\xA1PV[_\x7F\xA1jF\xD9Ba\xC7Q|\xC8\xFF\x89\xF6\x1C\x0C\xE95\x98\xE3\xC8I\x80\x10\x11\xDE\xE6I\xA6\xA5W\xD1\0\x90P\x90V[``_a(\xC9a(\x97V[\x90P\x80`\x02\x01\x80Ta(\xDA\x90aL]V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta)\x06\x90aL]V[\x80\x15a)QW\x80`\x1F\x10a)(Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a)QV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a)4W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[``_a)ga(\x97V[\x90P\x80`\x03\x01\x80Ta)x\x90aL]V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta)\xA4\x90aL]V[\x80\x15a)\xEFW\x80`\x1F\x10a)\xC6Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a)\xEFV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a)\xD2W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[a*\x02a\x0F/V[\x15a*9W`@Q\x7F\xD9<\x06e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80[\x82Q\x81\x10\x15a*\xA3W_\x83\x82\x81Q\x81\x10a*[Wa*ZaO-V[[` \x02` \x01\x01Q\x90P_a*o\x82a4\x9EV[\x90Pa*z\x81a5(V[a\xFF\xFF\x16\x84a*\x89\x91\x90a_\xAAV[\x93Pa*\x94\x82a7\x13V[PP\x80\x80`\x01\x01\x91PPa*>V[Pa\x08\0\x81\x11\x15a*\xEFWa\x08\0\x81`@Q\x7F\xE7\xF4\x89]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a*\xE6\x92\x91\x90a_\xDDV[`@Q\x80\x91\x03\x90\xFD[PPV[`\x01\x81Q\x11\x15a+\xD6W_\x81_\x81Q\x81\x10a+\x11Wa+\x10aO-V[[` \x02` \x01\x01Q` \x01Q\x90P_`\x01\x90P[\x82Q\x81\x10\x15a+\xD3W\x81\x83\x82\x81Q\x81\x10a+BWa+AaO-V[[` \x02` \x01\x01Q` \x01Q\x14a+\xC6W\x82_\x81Q\x81\x10a+fWa+eaO-V[[` \x02` \x01\x01Q\x83\x82\x81Q\x81\x10a+\x81Wa+\x80aO-V[[` \x02` \x01\x01Q`@Q\x7F\xCF\xAE\x92\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a+\xBD\x92\x91\x90a`dV[`@Q\x80\x91\x03\x90\xFD[\x80\x80`\x01\x01\x91PPa+%V[PP[PV[_\x81` \x01Q\x03a,\x16W`@Q\x7F\xDE(Y\xC1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x01ma\xFF\xFF\x16\x81` \x01Q\x11\x15a,mWa\x01m\x81` \x01Q`@Q\x7F2\x95\x18c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a,d\x92\x91\x90a`\xD6V[`@Q\x80\x91\x03\x90\xFD[B\x81_\x01Q\x11\x15a,\xBAWB\x81_\x01Q`@Q\x7F\xF2L\x08\x87\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a,\xB1\x92\x91\x90a_\xDDV[`@Q\x80\x91\x03\x90\xFD[Bb\x01Q\x80\x82` \x01Qa,\xCE\x91\x90a`\xFDV[\x82_\x01Qa,\xDC\x91\x90a_\xAAV[\x10\x15a-!WB\x81`@Q\x7F04\x80@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a-\x18\x92\x91\x90aakV[`@Q\x80\x91\x03\x90\xFD[PV[_\x80_\x90P[\x83Q\x81\x10\x15a-\x97W\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84\x82\x81Q\x81\x10a-]Wa-\\aO-V[[` \x02` \x01\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a-\x8AW`\x01\x91PPa-\x9CV[\x80\x80`\x01\x01\x91PPa-*V[P_\x90P[\x92\x91PPV[``_\x85\x85\x90P\x03a-\xE0W`@Q\x7F\xA6\xA6\xCB!\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84\x84\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a-\xFDWa-\xFCaE\xDCV[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a.+W\x81` \x01` \x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x80[\x86\x86\x90P\x81\x10\x15a/@W_\x87\x87\x83\x81\x81\x10a.PWa.OaO-V[[\x90P`@\x02\x01_\x015\x90P_\x88\x88\x84\x81\x81\x10a.oWa.naO-V[[\x90P`@\x02\x01` \x01` \x81\x01\x90a.\x87\x91\x90a]OV[\x90P_a.\x93\x83a4\x9EV[\x90Pa.\x9E\x81a5(V[a\xFF\xFF\x16\x85a.\xAD\x91\x90a_\xAAV[\x94Pa.\xB9\x83\x88a7\xE3V[a.\xC3\x83\x83a7\xE3V[a.\xCD\x88\x83a-$V[a/\x10W\x81\x88`@Q\x7F\xA4\xC3\x03\x91\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a/\x07\x92\x91\x90aa\x92V[`@Q\x80\x91\x03\x90\xFD[\x82\x86\x85\x81Q\x81\x10a/$Wa/#aO-V[[` \x02` \x01\x01\x81\x81RPPPPP\x80\x80`\x01\x01\x91PPa.1V[Pa\x08\0\x81\x11\x15a/\x8CWa\x08\0\x81`@Q\x7F\xE7\xF4\x89]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a/\x83\x92\x91\x90a_\xDDV[`@Q\x80\x91\x03\x90\xFD[P\x94\x93PPPPV[_a/\xA0\x86\x83a8\xB8V[\x90P_a/\xF0\x82\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa0\x86V[\x90P\x85s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a0dW\x84\x84`@Q\x7F*\x87='\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a0[\x92\x91\x90aa\xC0V[`@Q\x80\x91\x03\x90\xFD[PPPPPPPV[_a0\x7Fa0ya9\x85V[\x83a9\x93V[\x90P\x91\x90PV[_\x80_\x80a0\x94\x86\x86a9\xD3V[\x92P\x92P\x92Pa0\xA4\x82\x82a:(V[\x82\x93PPPP\x92\x91PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c =\x01\x14\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a0\xFD\x91\x90aK|V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a1\x18W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a1<\x91\x90aK\xBFV[a1}W\x80`@Q\x7F*|n\xF6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a1t\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[PV[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a1\xDCWz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a1\xD2Wa1\xD1a_\x0FV[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a2\x19Wm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a2\x0FWa2\x0Ea_\x0FV[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a2HWf#\x86\xF2o\xC1\0\0\x83\x81a2>Wa2=a_\x0FV[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a2qWc\x05\xF5\xE1\0\x83\x81a2gWa2fa_\x0FV[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a2\x96Wa'\x10\x83\x81a2\x8CWa2\x8Ba_\x0FV[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a2\xB9W`d\x83\x81a2\xAFWa2\xAEa_\x0FV[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a2\xC8W`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[a2\xD9a;\x8AV[a3\x0FW`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a3\x19a2\xD1V[_a3\"a(\x97V[\x90P\x82\x81`\x02\x01\x90\x81a35\x91\x90ab:V[P\x81\x81`\x03\x01\x90\x81a3G\x91\x90ab:V[P_\x80\x1B\x81_\x01\x81\x90UP_\x80\x1B\x81`\x01\x01\x81\x90UPPPPV[a3ja2\xD1V[_a3sa&\xB6V[\x90P_\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UPPV[a3\x9Aa\x0F/V[a3\xD0W`@Q\x7F\x8D\xFC +\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_3\x90P\x90V[_a4\x05\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba;\xA8V[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a45\x82a;\xB1V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a4\x91Wa4\x8B\x82\x82a=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a7\x9F\x91\x90aK\xBFV[a7\xE0W\x80`@Q\x7FC1\xA8]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a7\xD7\x91\x90aGrV[`@Q\x80\x91\x03\x90\xFD[PV[s\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC6R\x8Fi\x83\x83`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a82\x92\x91\x90a](V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a8MW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a8q\x91\x90aK\xBFV[a8\xB4W\x81\x81`@Q\x7F\x16\n+K\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a8\xAB\x92\x91\x90a](V[`@Q\x80\x91\x03\x90\xFD[PPV[_\x80`@Q\x80`\xC0\x01`@R\x80`\x87\x81R` \x01ae\xE7`\x87\x919\x80Q\x90` \x01 \x84_\x01Q\x80Q\x90` \x01 \x85` \x01Q`@Q` \x01a8\xFA\x91\x90ad\x1CV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x86`@\x01Q\x87``\x01Q\x88`\x80\x01Q`@Q` \x01a9/\x91\x90a^VV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a9Z\x96\x95\x94\x93\x92\x91\x90ad2V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90Pa9|\x83\x82a=6V[\x91PP\x92\x91PPV[_a9\x8Ea=\xAAV[\x90P\x90V[_`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x83`\x02\x82\x01R\x82`\"\x82\x01R`B\x81 \x91PP\x92\x91PPV[_\x80_`A\x84Q\x03a:\x13W_\x80_` \x87\x01Q\x92P`@\x87\x01Q\x91P``\x87\x01Q_\x1A\x90Pa:\x05\x88\x82\x85\x85a>\rV[\x95P\x95P\x95PPPPa:!V[_`\x02\x85Q_\x1B\x92P\x92P\x92P[\x92P\x92P\x92V[_`\x03\x81\x11\x15a:;Wa::aK\xEAV[[\x82`\x03\x81\x11\x15a:NWa:MaK\xEAV[[\x03\x15a;\x86W`\x01`\x03\x81\x11\x15a:hWa:gaK\xEAV[[\x82`\x03\x81\x11\x15a:{Wa:zaK\xEAV[[\x03a:\xB2W`@Q\x7F\xF6E\xEE\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02`\x03\x81\x11\x15a:\xC6Wa:\xC5aK\xEAV[[\x82`\x03\x81\x11\x15a:\xD9Wa:\xD8aK\xEAV[[\x03a;\x1DW\x80_\x1C`@Q\x7F\xFC\xE6\x98\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a;\x14\x91\x90aL\x17V[`@Q\x80\x91\x03\x90\xFD[`\x03\x80\x81\x11\x15a;0Wa;/aK\xEAV[[\x82`\x03\x81\x11\x15a;CWa;BaK\xEAV[[\x03a;\x85W\x80`@Q\x7F\xD7\x8B\xCE\x0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a;|\x91\x90aGrV[`@Q\x80\x91\x03\x90\xFD[[PPV[_a;\x93a\"{V[_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x90P\x90V[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a<\x0CW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a<\x03\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[\x80a<8\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba;\xA8V[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa<\xA3\x91\x90a^VV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a<\xDBW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a<\xE0V[``\x91P[P\x91P\x91Pa<\xF0\x85\x83\x83a>\xF4V[\x92PPP\x92\x91PPV[_4\x11\x15a=4W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80\x7F\x8Bs\xC3\xC6\x9B\xB8\xFE=Q.\xCCL\xF7Y\xCCy#\x9F{\x17\x9B\x0F\xFA\xCA\xA9\xA7]R+9@\x0Fa=aa?\x81V[a=ia?\xF7V[\x860`@Q` \x01a=\x7F\x95\x94\x93\x92\x91\x90ad\x91V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90Pa=\xA1\x81\x84a9\x93V[\x91PP\x92\x91PPV[_\x7F\x8Bs\xC3\xC6\x9B\xB8\xFE=Q.\xCCL\xF7Y\xCCy#\x9F{\x17\x9B\x0F\xFA\xCA\xA9\xA7]R+9@\x0Fa=\xD4a?\x81V[a=\xDCa?\xF7V[F0`@Q` \x01a=\xF2\x95\x94\x93\x92\x91\x90ad\x91V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x90V[_\x80_\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84_\x1C\x11\x15a>IW_`\x03\x85\x92P\x92P\x92Pa>\xEAV[_`\x01\x88\x88\x88\x88`@Q_\x81R` \x01`@R`@Qa>l\x94\x93\x92\x91\x90ad\xE2V[` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a>\x8CW=_\x80>=_\xFD[PPP` `@Q\x03Q\x90P_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a>\xDDW_`\x01_\x80\x1B\x93P\x93P\x93PPa>\xEAV[\x80_\x80_\x1B\x93P\x93P\x93PP[\x94P\x94P\x94\x91PPV[``\x82a?\tWa?\x04\x82a@nV[a?yV[_\x82Q\x14\x80\x15a?/WP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a?qW\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a?h\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa?zV[[\x93\x92PPPV[_\x80a?\x8Ba(\x97V[\x90P_a?\x96a(\xBEV[\x90P_\x81Q\x11\x15a?\xB2W\x80\x80Q\x90` \x01 \x92PPPa?\xF4V[_\x82_\x01T\x90P_\x80\x1B\x81\x14a?\xCDW\x80\x93PPPPa?\xF4V[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x80a@\x01a(\x97V[\x90P_a@\x0Ca)\\V[\x90P_\x81Q\x11\x15a@(W\x80\x80Q\x90` \x01 \x92PPPa@kV[_\x82`\x01\x01T\x90P_\x80\x1B\x81\x14a@DW\x80\x93PPPPa@kV[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x81Q\x11\x15a@\x80W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82\x80T\x82\x82U\x90_R` _ \x90\x81\x01\x92\x82\x15a@\xECW\x91` \x02\x82\x01[\x82\x81\x11\x15a@\xEBW\x825\x82U\x91` \x01\x91\x90`\x01\x01\x90a@\xD0V[[P\x90Pa@\xF9\x91\x90aAHV[P\x90V[\x82\x80T\x82\x82U\x90_R` _ \x90\x81\x01\x92\x82\x15aA7W\x91` \x02\x82\x01[\x82\x81\x11\x15aA6W\x82Q\x82U\x91` \x01\x91\x90`\x01\x01\x90aA\x1BV[[P\x90PaAD\x91\x90aAHV[P\x90V[[\x80\x82\x11\x15aA_W_\x81_\x90UP`\x01\x01aAIV[P\x90V[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[aA\x86\x81aAtV[\x81\x14aA\x90W_\x80\xFD[PV[_\x815\x90PaA\xA1\x81aA}V[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12aA\xC8WaA\xC7aA\xA7V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aA\xE5WaA\xE4aA\xABV[[` \x83\x01\x91P\x83`\x01\x82\x02\x83\x01\x11\x15aB\x01WaB\0aA\xAFV[[\x92P\x92\x90PV[_\x80_\x80_\x80_`\x80\x88\x8A\x03\x12\x15aB#WaB\"aAlV[[_aB0\x8A\x82\x8B\x01aA\x93V[\x97PP` \x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aBQWaBPaApV[[aB]\x8A\x82\x8B\x01aA\xB3V[\x96P\x96PP`@\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aB\x80WaB\x7FaApV[[aB\x8C\x8A\x82\x8B\x01aA\xB3V[\x94P\x94PP``\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aB\xAFWaB\xAEaApV[[aB\xBB\x8A\x82\x8B\x01aA\xB3V[\x92P\x92PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[_` \x82\x84\x03\x12\x15aB\xE1WaB\xE0aAlV[[_aB\xEE\x84\x82\x85\x01aA\x93V[\x91PP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_aCI\x82aC V[\x90P\x91\x90PV[aCY\x81aC?V[\x82RPPV[_aCj\x83\x83aCPV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aC\x8C\x82aB\xF7V[aC\x96\x81\x85aC\x01V[\x93PaC\xA1\x83aC\x11V[\x80_[\x83\x81\x10\x15aC\xD1W\x81QaC\xB8\x88\x82aC_V[\x97PaC\xC3\x83aCvV[\x92PP`\x01\x81\x01\x90PaC\xA4V[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaC\xF6\x81\x84aC\x82V[\x90P\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15aD5W\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90PaD\x1AV[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_aDZ\x82aC\xFEV[aDd\x81\x85aD\x08V[\x93PaDt\x81\x85` \x86\x01aD\x18V[aD}\x81aD@V[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaD\xA0\x81\x84aDPV[\x90P\x92\x91PPV[_\x80\x83`\x1F\x84\x01\x12aD\xBDWaD\xBCaA\xA7V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aD\xDAWaD\xD9aA\xABV[[` \x83\x01\x91P\x83` \x82\x02\x83\x01\x11\x15aD\xF6WaD\xF5aA\xAFV[[\x92P\x92\x90PV[_\x80_\x80`@\x85\x87\x03\x12\x15aE\x15WaE\x14aAlV[[_\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aE2WaE1aApV[[aE>\x87\x82\x88\x01aD\xA8V[\x94P\x94PP` \x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aEaWaE`aApV[[aEm\x87\x82\x88\x01aA\xB3V[\x92P\x92PP\x92\x95\x91\x94P\x92PV[_\x81\x15\x15\x90P\x91\x90PV[aE\x8F\x81aE{V[\x82RPPV[_` \x82\x01\x90PaE\xA8_\x83\x01\x84aE\x86V[\x92\x91PPV[aE\xB7\x81aC?V[\x81\x14aE\xC1W_\x80\xFD[PV[_\x815\x90PaE\xD2\x81aE\xAEV[\x92\x91PPV[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[aF\x12\x82aD@V[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15aF1WaF0aE\xDCV[[\x80`@RPPPV[_aFCaAcV[\x90PaFO\x82\x82aF\tV[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aFnWaFmaE\xDCV[[aFw\x82aD@V[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_aF\xA4aF\x9F\x84aFTV[aF:V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15aF\xC0WaF\xBFaE\xD8V[[aF\xCB\x84\x82\x85aF\x84V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aF\xE7WaF\xE6aA\xA7V[[\x815aF\xF7\x84\x82` \x86\x01aF\x92V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15aG\x16WaG\x15aAlV[[_aG#\x85\x82\x86\x01aE\xC4V[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aGDWaGCaApV[[aGP\x85\x82\x86\x01aF\xD3V[\x91PP\x92P\x92\x90PV[_\x81\x90P\x91\x90PV[aGl\x81aGZV[\x82RPPV[_` \x82\x01\x90PaG\x85_\x83\x01\x84aGcV[\x92\x91PPV[_\x7F\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x82\x16\x90P\x91\x90PV[aG\xBF\x81aG\x8BV[\x82RPPV[aG\xCE\x81aAtV[\x82RPPV[aG\xDD\x81aC?V[\x82RPPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[aH\x15\x81aAtV[\x82RPPV[_aH&\x83\x83aH\x0CV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aHH\x82aG\xE3V[aHR\x81\x85aG\xEDV[\x93PaH]\x83aG\xFDV[\x80_[\x83\x81\x10\x15aH\x8DW\x81QaHt\x88\x82aH\x1BV[\x97PaH\x7F\x83aH2V[\x92PP`\x01\x81\x01\x90PaH`V[P\x85\x93PPPP\x92\x91PPV[_`\xE0\x82\x01\x90PaH\xAD_\x83\x01\x8AaG\xB6V[\x81\x81\x03` \x83\x01RaH\xBF\x81\x89aDPV[\x90P\x81\x81\x03`@\x83\x01RaH\xD3\x81\x88aDPV[\x90PaH\xE2``\x83\x01\x87aG\xC5V[aH\xEF`\x80\x83\x01\x86aG\xD4V[aH\xFC`\xA0\x83\x01\x85aGcV[\x81\x81\x03`\xC0\x83\x01RaI\x0E\x81\x84aH>V[\x90P\x98\x97PPPPPPPPV[_\x80\x83`\x1F\x84\x01\x12aI1WaI0aA\xA7V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aINWaIMaA\xABV[[` \x83\x01\x91P\x83`@\x82\x02\x83\x01\x11\x15aIjWaIiaA\xAFV[[\x92P\x92\x90PV[_\x80\xFD[_`@\x82\x84\x03\x12\x15aI\x8AWaI\x89aIqV[[\x81\x90P\x92\x91PPV[_`@\x82\x84\x03\x12\x15aI\xA8WaI\xA7aIqV[[\x81\x90P\x92\x91PPV[_\x80_\x80_\x80_\x80_\x80_a\x01\0\x8C\x8E\x03\x12\x15aI\xD1WaI\xD0aAlV[[_\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aI\xEEWaI\xEDaApV[[aI\xFA\x8E\x82\x8F\x01aI\x1CV[\x9BP\x9BPP` aJ\r\x8E\x82\x8F\x01aIuV[\x99PP``\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ.WaJ-aApV[[aJ:\x8E\x82\x8F\x01aI\x93V[\x98PP`\x80aJK\x8E\x82\x8F\x01aE\xC4V[\x97PP`\xA0\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJlWaJkaApV[[aJx\x8E\x82\x8F\x01aA\xB3V[\x96P\x96PP`\xC0\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ\x9BWaJ\x9AaApV[[aJ\xA7\x8E\x82\x8F\x01aA\xB3V[\x94P\x94PP`\xE0\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ\xCAWaJ\xC9aApV[[aJ\xD6\x8E\x82\x8F\x01aA\xB3V[\x92P\x92PP\x92\x95\x98\x9BP\x92\x95\x98\x9B\x90\x93\x96\x99PV[_\x80_\x80_``\x86\x88\x03\x12\x15aK\x04WaK\x03aAlV[[_aK\x11\x88\x82\x89\x01aE\xC4V[\x95PP` \x86\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aK2WaK1aApV[[aK>\x88\x82\x89\x01aI\x1CV[\x94P\x94PP`@\x86\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aKaWaK`aApV[[aKm\x88\x82\x89\x01aA\xB3V[\x92P\x92PP\x92\x95P\x92\x95\x90\x93PV[_` \x82\x01\x90PaK\x8F_\x83\x01\x84aG\xD4V[\x92\x91PPV[aK\x9E\x81aE{V[\x81\x14aK\xA8W_\x80\xFD[PV[_\x81Q\x90PaK\xB9\x81aK\x95V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aK\xD4WaK\xD3aAlV[[_aK\xE1\x84\x82\x85\x01aK\xABV[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[_` \x82\x01\x90PaL*_\x83\x01\x84aG\xC5V[\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\"`\x04R`$_\xFD[_`\x02\x82\x04\x90P`\x01\x82\x16\x80aLtW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aL\x87WaL\x86aL0V[[P\x91\x90PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_aL\xC4\x82aAtV[\x91PaL\xCF\x83aAtV[\x92P\x82\x82\x03\x90P\x81\x81\x11\x15aL\xE7WaL\xE6aL\x8DV[[\x92\x91PPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aM\x08\x83\x85aL\xEDV[\x93PaM\x15\x83\x85\x84aF\x84V[aM\x1E\x83aD@V[\x84\x01\x90P\x93\x92PPPV[_`\x80\x82\x01\x90PaM<_\x83\x01\x8AaG\xC5V[\x81\x81\x03` \x83\x01RaMO\x81\x88\x8AaL\xFDV[\x90P\x81\x81\x03`@\x83\x01RaMd\x81\x86\x88aL\xFDV[\x90P\x81\x81\x03``\x83\x01RaMy\x81\x84\x86aL\xFDV[\x90P\x98\x97PPPPPPPPV[_\x81\x90P\x92\x91PPV[_aM\x9B\x82aC\xFEV[aM\xA5\x81\x85aM\x87V[\x93PaM\xB5\x81\x85` \x86\x01aD\x18V[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aM\xF5`\x02\x83aM\x87V[\x91PaN\0\x82aM\xC1V[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aN?`\x01\x83aM\x87V[\x91PaNJ\x82aN\x0BV[`\x01\x82\x01\x90P\x91\x90PV[_aN`\x82\x87aM\x91V[\x91PaNk\x82aM\xE9V[\x91PaNw\x82\x86aM\x91V[\x91PaN\x82\x82aN3V[\x91PaN\x8E\x82\x85aM\x91V[\x91PaN\x99\x82aN3V[\x91PaN\xA5\x82\x84aM\x91V[\x91P\x81\x90P\x95\x94PPPPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[aN\xCF\x81aN\xB3V[\x82RPPV[_` \x82\x01\x90PaN\xE8_\x83\x01\x84aN\xC6V[\x92\x91PPV[_\x81Q\x90PaN\xFC\x81aE\xAEV[\x92\x91PPV[_` \x82\x84\x03\x12\x15aO\x17WaO\x16aAlV[[_aO$\x84\x82\x85\x01aN\xEEV[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`2`\x04R`$_\xFD[_\x82\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_` `\x1F\x83\x01\x04\x90P\x91\x90PV[_\x82\x82\x1B\x90P\x92\x91PPV[_`\x08\x83\x02aO\xC0\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82aO\x85V[aO\xCA\x86\x83aO\x85V[\x95P\x80\x19\x84\x16\x93P\x80\x86\x16\x84\x17\x92PPP\x93\x92PPPV[_\x81\x90P\x91\x90PV[_aP\x05aP\0aO\xFB\x84aAtV[aO\xE2V[aAtV[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[aP\x1E\x83aO\xEBV[aP2aP*\x82aP\x0CV[\x84\x84TaO\x91V[\x82UPPPPV[_\x90V[aPFaP:V[aPQ\x81\x84\x84aP\x15V[PPPV[[\x81\x81\x10\x15aPtWaPi_\x82aP>V[`\x01\x81\x01\x90PaPWV[PPV[`\x1F\x82\x11\x15aP\xB9WaP\x8A\x81aOdV[aP\x93\x84aOvV[\x81\x01` \x85\x10\x15aP\xA2W\x81\x90P[aP\xB6aP\xAE\x85aOvV[\x83\x01\x82aPVV[PP[PPPV[_\x82\x82\x1C\x90P\x92\x91PPV[_aP\xD9_\x19\x84`\x08\x02aP\xBEV[\x19\x80\x83\x16\x91PP\x92\x91PPV[_aP\xF1\x83\x83aP\xCAV[\x91P\x82`\x02\x02\x82\x17\x90P\x92\x91PPV[aQ\x0B\x83\x83aOZV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aQ$WaQ#aE\xDCV[[aQ.\x82TaL]V[aQ9\x82\x82\x85aPxV[_`\x1F\x83\x11`\x01\x81\x14aQfW_\x84\x15aQTW\x82\x87\x015\x90P[aQ^\x85\x82aP\xE6V[\x86UPaQ\xC5V[`\x1F\x19\x84\x16aQt\x86aOdV[_[\x82\x81\x10\x15aQ\x9BW\x84\x89\x015\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90PaQvV[\x86\x83\x10\x15aQ\xB8W\x84\x89\x015aQ\xB4`\x1F\x89\x16\x82aP\xCAV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPPV[_\x81T\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81TaR\x16\x81aL]V[aR \x81\x86aQ\xFAV[\x94P`\x01\x82\x16_\x81\x14aR:W`\x01\x81\x14aRPWaR\x82V[`\xFF\x19\x83\x16\x86R\x81\x15\x15` \x02\x86\x01\x93PaR\x82V[aRY\x85aOdV[_[\x83\x81\x10\x15aRzW\x81T\x81\x89\x01R`\x01\x82\x01\x91P` \x81\x01\x90PaR[V[\x80\x88\x01\x95PPP[PPP\x92\x91PPV[_aR\x96\x83\x83aR\nV[\x90P\x92\x91PPV[_`\x01\x82\x01\x90P\x91\x90PV[_aR\xB4\x82aQ\xCEV[aR\xBE\x81\x85aQ\xD8V[\x93P\x83` \x82\x02\x85\x01aR\xD0\x85aQ\xE8V[\x80_[\x85\x81\x10\x15aS\nW\x84\x84\x03\x89R\x81aR\xEB\x85\x82aR\x8BV[\x94PaR\xF6\x83aR\x9EV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaR\xD3V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_``\x82\x01\x90P\x81\x81\x03_\x83\x01RaS5\x81\x87\x89aL\xFDV[\x90P\x81\x81\x03` \x83\x01RaSI\x81\x86aR\xAAV[\x90P\x81\x81\x03`@\x83\x01RaS^\x81\x84\x86aL\xFDV[\x90P\x96\x95PPPPPPV[\x7FEIP712: Uninitialized\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aS\x9E`\x15\x83aD\x08V[\x91PaS\xA9\x82aSjV[` \x82\x01\x90P\x91\x90PV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaS\xCB\x81aS\x92V[\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x80\xFD[\x82\x81\x837PPPV[_aS\xFA\x83\x85aS\xD2V[\x93P\x7F\x07\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x11\x15aT-WaT,aS\xE2V[[` \x83\x02\x92PaT>\x83\x85\x84aS\xE6V[\x82\x84\x01\x90P\x93\x92PPPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaTc\x81\x84\x86aS\xEFV[\x90P\x93\x92PPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aT\x86WaT\x85aE\xDCV[[` \x82\x02\x90P` \x81\x01\x90P\x91\x90PV[_\x80\xFD[_\x80\xFD[aT\xA8\x81aGZV[\x81\x14aT\xB2W_\x80\xFD[PV[_\x81Q\x90PaT\xC3\x81aT\x9FV[\x92\x91PPV[_\x81Q\x90PaT\xD7\x81aA}V[\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aT\xF7WaT\xF6aE\xDCV[[` \x82\x02\x90P` \x81\x01\x90P\x91\x90PV[_aU\x1AaU\x15\x84aT\xDDV[aF:V[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15aU=WaUV[\x93\x92PPPV[_`@\x82\x01\x90Paa\xA5_\x83\x01\x85aG\xD4V[\x81\x81\x03` \x83\x01Raa\xB7\x81\x84aC\x82V[\x90P\x93\x92PPPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Raa\xD9\x81\x84\x86aL\xFDV[\x90P\x93\x92PPPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[`\x1F\x82\x11\x15ab5Wab\x06\x81aa\xE2V[ab\x0F\x84aOvV[\x81\x01` \x85\x10\x15ab\x1EW\x81\x90P[ab2ab*\x85aOvV[\x83\x01\x82aPVV[PP[PPPV[abC\x82aC\xFEV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15ab\\Wab[aE\xDCV[[abf\x82TaL]V[abq\x82\x82\x85aa\xF4V[_` \x90P`\x1F\x83\x11`\x01\x81\x14ab\xA2W_\x84\x15ab\x90W\x82\x87\x01Q\x90P[ab\x9A\x85\x82aP\xE6V[\x86UPac\x01V[`\x1F\x19\x84\x16ab\xB0\x86aa\xE2V[_[\x82\x81\x10\x15ab\xD7W\x84\x89\x01Q\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90Pab\xB2V[\x86\x83\x10\x15ab\xF4W\x84\x89\x01Qab\xF0`\x1F\x89\x16\x82aP\xCAV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPV[ac\x12\x81aY\xAAV[\x82RPPV[_` \x82\x01\x90Pac+_\x83\x01\x84ac\tV[\x92\x91PPV[`T\x81\x10acBWacAaK\xEAV[[PV[_\x81\x90PacR\x82ac1V[\x91\x90PV[_aca\x82acEV[\x90P\x91\x90PV[acq\x81acWV[\x82RPPV[_` \x82\x01\x90Pac\x8A_\x83\x01\x84achV[\x92\x91PPV[_\x81\x90P\x92\x91PPV[ac\xA3\x81aC?V[\x82RPPV[_ac\xB4\x83\x83ac\x9AV[` \x83\x01\x90P\x92\x91PPV[_ac\xCA\x82aB\xF7V[ac\xD4\x81\x85ac\x90V[\x93Pac\xDF\x83aC\x11V[\x80_[\x83\x81\x10\x15ad\x0FW\x81Qac\xF6\x88\x82ac\xA9V[\x97Pad\x01\x83aCvV[\x92PP`\x01\x81\x01\x90Pac\xE2V[P\x85\x93PPPP\x92\x91PPV[_ad'\x82\x84ac\xC0V[\x91P\x81\x90P\x92\x91PPV[_`\xC0\x82\x01\x90PadE_\x83\x01\x89aGcV[adR` \x83\x01\x88aGcV[ad_`@\x83\x01\x87aGcV[adl``\x83\x01\x86aG\xC5V[ady`\x80\x83\x01\x85aG\xC5V[ad\x86`\xA0\x83\x01\x84aGcV[\x97\x96PPPPPPPV[_`\xA0\x82\x01\x90Pad\xA4_\x83\x01\x88aGcV[ad\xB1` \x83\x01\x87aGcV[ad\xBE`@\x83\x01\x86aGcV[ad\xCB``\x83\x01\x85aG\xC5V[ad\xD8`\x80\x83\x01\x84aG\xD4V[\x96\x95PPPPPPV[_`\x80\x82\x01\x90Pad\xF5_\x83\x01\x87aGcV[ae\x02` \x83\x01\x86ac\tV[ae\x0F`@\x83\x01\x85aGcV[ae\x1C``\x83\x01\x84aGcV[\x95\x94PPPPPV\xFEUserDecryptResponseVerification(bytes publicKey,bytes32[] ctHandles,bytes userDecryptedShare,bytes extraData)PublicDecryptVerification(bytes32[] ctHandles,bytes decryptedResult,bytes extraData)UserDecryptRequestVerification(bytes publicKey,address[] contractAddresses,uint256 startTimestamp,uint256 durationDays,bytes extraData)", + b"`\xA0`@R0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x80\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP4\x80\x15b\0\0CW_\x80\xFD[Pb\0\0Tb\0\0Z` \x1B` \x1CV[b\0\x01\xC4V[_b\0\0kb\0\x01^` \x1B` \x1CV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15b\0\0\xB6W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14b\0\x01[Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`@Qb\0\x01R\x91\x90b\0\x01\xA9V[`@Q\x80\x91\x03\x90\xA1[PV[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[b\0\x01\xA3\x81b\0\x01\x85V[\x82RPPV[_` \x82\x01\x90Pb\0\x01\xBE_\x83\x01\x84b\0\x01\x98V[\x92\x91PPV[`\x80Qag\xCAb\0\x01\xEB_9_\x81\x81a#T\x01R\x81\x81a#\xA9\x01Ra&K\x01Rag\xCA_\xF3\xFE`\x80`@R`\x046\x10a\x01\x08W_5`\xE0\x1C\x80c\\\x97Z\xBB\x11a\0\x94W\x80c\xAD<\xB1\xCC\x11a\0cW\x80c\xAD<\xB1\xCC\x14a\x03\x1CW\x80c\xC4\x11Xt\x14a\x03FW\x80c\xD8\x99\x8FE\x14a\x03\\W\x80c\xF1\xB5z\xDB\x14a\x03\x84W\x80c\xFB\xB82Y\x14a\x03\xACWa\x01\x08V[\x80c\\\x97Z\xBB\x14a\x02\x84W\x80co\x89\x13\xBC\x14a\x02\xAEW\x80c\x84V\xCBY\x14a\x02\xD6W\x80c\x84\xB0\x19n\x14a\x02\xECWa\x01\x08V[\x80c?K\xA8:\x11a\0\xDBW\x80c?K\xA8:\x14a\x01\xB0W\x80c@\x14\xC4\xCD\x14a\x01\xC6W\x80cO\x1E\xF2\x86\x14a\x02\x02W\x80cR\xD1\x90-\x14a\x02\x1EW\x80cX\xF5\xB8\xAB\x14a\x02HWa\x01\x08V[\x80c\x04o\x9E\xB3\x14a\x01\x0CW\x80c\t\0\xCCi\x14a\x014W\x80c\r\x8En,\x14a\x01pW\x80c9\xF78\x10\x14a\x01\x9AW[_\x80\xFD[4\x80\x15a\x01\x17W_\x80\xFD[Pa\x012`\x04\x806\x03\x81\x01\x90a\x01-\x91\x90aB\x1AV[a\x03\xE8V[\0[4\x80\x15a\x01?W_\x80\xFD[Pa\x01Z`\x04\x806\x03\x81\x01\x90a\x01U\x91\x90aB\xDEV[a\x08EV[`@Qa\x01g\x91\x90aC\xF0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01{W_\x80\xFD[Pa\x01\x84a\t\x16V[`@Qa\x01\x91\x91\x90aD\x9AV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xA5W_\x80\xFD[Pa\x01\xAEa\t\x91V[\0[4\x80\x15a\x01\xBBW_\x80\xFD[Pa\x01\xC4a\x0B\xC9V[\0[4\x80\x15a\x01\xD1W_\x80\xFD[Pa\x01\xEC`\x04\x806\x03\x81\x01\x90a\x01\xE7\x91\x90aE\x0FV[a\r\x11V[`@Qa\x01\xF9\x91\x90aE\xA7V[`@Q\x80\x91\x03\x90\xF3[a\x02\x1C`\x04\x806\x03\x81\x01\x90a\x02\x17\x91\x90aG\x12V[a\x0E\x1BV[\0[4\x80\x15a\x02)W_\x80\xFD[Pa\x022a\x0E:V[`@Qa\x02?\x91\x90aG\x84V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02SW_\x80\xFD[Pa\x02n`\x04\x806\x03\x81\x01\x90a\x02i\x91\x90aB\xDEV[a\x0EkV[`@Qa\x02{\x91\x90aE\xA7V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x8FW_\x80\xFD[Pa\x02\x98a\x0E\x9EV[`@Qa\x02\xA5\x91\x90aE\xA7V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xB9W_\x80\xFD[Pa\x02\xD4`\x04\x806\x03\x81\x01\x90a\x02\xCF\x91\x90aB\x1AV[a\x0E\xC0V[\0[4\x80\x15a\x02\xE1W_\x80\xFD[Pa\x02\xEAa\x12\xAAV[\0[4\x80\x15a\x02\xF7W_\x80\xFD[Pa\x03\0a\x13\xCFV[`@Qa\x03\x13\x97\x96\x95\x94\x93\x92\x91\x90aH\xACV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03'W_\x80\xFD[Pa\x030a\x14\xD8V[`@Qa\x03=\x91\x90aD\x9AV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03QW_\x80\xFD[Pa\x03Za\x15\x11V[\0[4\x80\x15a\x03gW_\x80\xFD[Pa\x03\x82`\x04\x806\x03\x81\x01\x90a\x03}\x91\x90aE\x0FV[a\x166V[\0[4\x80\x15a\x03\x8FW_\x80\xFD[Pa\x03\xAA`\x04\x806\x03\x81\x01\x90a\x03\xA5\x91\x90aI\xC3V[a\x17\xF4V[\0[4\x80\x15a\x03\xB7W_\x80\xFD[Pa\x03\xD2`\x04\x806\x03\x81\x01\x90a\x03\xCD\x91\x90aJ\xFDV[a\x1C=V[`@Qa\x03\xDF\x91\x90aE\xA7V[`@Q\x80\x91\x03\x90\xF3[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xE5'^\xAF3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x045\x91\x90aK\x8EV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04PW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04t\x91\x90aK\xD1V[a\x04\xB5W3`@Q\x7F\xAE\xE8c#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x04\xAC\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[_a\x04\xBEa\x1E)V[\x90P`\xF8`\x02`\x05\x81\x11\x15a\x04\xD6Wa\x04\xD5aK\xFCV[[\x90\x1B\x88\x11\x15\x80a\x04\xE9WP\x80`\x08\x01T\x88\x11[\x15a\x05+W\x87`@Q\x7F\xD4\x8A\xF9B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05\"\x91\x90aL)V[`@Q\x80\x91\x03\x90\xFD[_a\x06\xBF\x82`\x07\x01_\x8B\x81R` \x01\x90\x81R` \x01_ `@Q\x80`@\x01`@R\x90\x81_\x82\x01\x80Ta\x05\\\x90aLoV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x05\x88\x90aLoV[\x80\x15a\x05\xD3W\x80`\x1F\x10a\x05\xAAWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x05\xD3V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x05\xB6W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x06)W` \x02\x82\x01\x91\x90_R` _ \x90[\x81T\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x06\x15W[PPPPP\x81RPP\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa\x1EPV[\x90Pa\x06\xCD\x89\x82\x88\x88a\x1F\x11V[_\x82`\x02\x01_\x8B\x81R` \x01\x90\x81R` \x01_ _\x80_\x1B\x81R` \x01\x90\x81R` \x01_ \x90P\x803\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x89\x7F\x7F\xCD\xFBS\x81\x91\x7FUJq}\nTp\xA3?ZI\xBAdE\xF0^\xC4V[_a\x0B0a\x1E)V[\x90P`\xF8`\x01`\x05\x81\x11\x15a\x0BHWa\x0BGaK\xFCV[[\x90\x1B\x81`\x06\x01\x81\x90UP`\xF8`\x02`\x05\x81\x11\x15a\x0BhWa\x0BgaK\xFCV[[\x90\x1B\x81`\x08\x01\x81\x90UPP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x0B\xBD\x91\x90aN\xE7V[`@Q\x80\x91\x03\x90\xA1PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0C&W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0CJ\x91\x90aO\x14V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15\x80\x15a\x0C\xC5WPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\r\x07W3`@Q\x7F\xE1\x91f\xEE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0C\xFE\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[a\r\x0Fa\"PV[V[_\x80_\x90P[\x85\x85\x90P\x81\x10\x15a\x0E\rWs\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x06 2m\x87\x87\x84\x81\x81\x10a\reWa\rdaO?V[[\x90P` \x02\x015`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\x88\x91\x90aG\x84V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\xA3W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\r\xC7\x91\x90aK\xD1V[\x15\x80a\r\xF2WPa\r\xF0\x86\x86\x83\x81\x81\x10a\r\xE4Wa\r\xE3aO?V[[\x90P` \x02\x015a\"\xBEV[\x15[\x15a\x0E\0W_\x91PPa\x0E\x13V[\x80\x80`\x01\x01\x91PPa\r\x17V[P`\x01\x90P[\x94\x93PPPPV[a\x0E#a#RV[a\x0E,\x82a$8V[a\x0E6\x82\x82a%+V[PPV[_a\x0ECa&IV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[_\x80a\x0Eua\x1E)V[\x90P\x80_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x80a\x0E\xA8a&\xD0V[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x90V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xE5'^\xAF3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\r\x91\x90aK\x8EV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0F(W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0FL\x91\x90aK\xD1V[a\x0F\x8DW3`@Q\x7F\xAE\xE8c#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0F\x84\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[_a\x0F\x96a\x1E)V[\x90P`\xF8`\x01`\x05\x81\x11\x15a\x0F\xAEWa\x0F\xADaK\xFCV[[\x90\x1B\x88\x11\x15\x80a\x0F\xC1WP\x80`\x06\x01T\x88\x11[\x15a\x10\x03W\x87`@Q\x7F\xD4\x8A\xF9B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0F\xFA\x91\x90aL)V[`@Q\x80\x91\x03\x90\xFD[_a\x10\xF4\x82`\x05\x01_\x8B\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x10bW` \x02\x82\x01\x91\x90_R` _ \x90[\x81T\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x10NW[PPPPP\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa&\xF7V[\x90Pa\x11\x02\x89\x82\x88\x88a\x1F\x11V[_\x82`\x04\x01_\x8B\x81R` \x01\x90\x81R` \x01_ _\x83\x81R` \x01\x90\x81R` \x01_ \x90P\x80\x87\x87\x90\x91\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x92\x90\x91\x92\x90\x91\x92\x90\x91\x92P\x91\x82a\x11`\x92\x91\x90aQ\x13V[P\x82`\x02\x01_\x8B\x81R` \x01\x90\x81R` \x01_ _\x83\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x82_\x01_\x8B\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x12\x16WPa\x12\x15\x81\x80T\x90Pa'\xA8V[[\x15a\x12\x9EW`\x01\x83_\x01_\x8C\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81\x83`\x03\x01_\x8C\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x89\x7F\xD7\xE5\x8A6z\nl)\x8Ev\xAD]$\0\x04\xE3'\xAA\x14#\xCB\xE4\xBD\x7F\xF8]Lq^\xF8\xD1_\x8A\x8A\x84\x89\x89`@Qa\x12\x95\x95\x94\x93\x92\x91\x90aS.V[`@Q\x80\x91\x03\x90\xA2[PPPPPPPPPPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cF\xFB\xF6\x8E3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x12\xF7\x91\x90aK\x8EV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x13\x12W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x136\x91\x90aK\xD1V[\x15\x80\x15a\x13\x83WPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x13\xC5W3`@Q\x7F8\x89\x16\xBB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x13\xBC\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[a\x13\xCDa(9V[V[_``\x80_\x80_``_a\x13\xE1a(\xA8V[\x90P_\x80\x1B\x81_\x01T\x14\x80\x15a\x13\xFCWP_\x80\x1B\x81`\x01\x01T\x14[a\x14;W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x142\x90aS\xC6V[`@Q\x80\x91\x03\x90\xFD[a\x14Ca(\xCFV[a\x14Ka)mV[F0_\x80\x1B_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x14jWa\x14iaE\xEEV[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x14\x98W\x81` \x01` \x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x7F\x0F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95\x94\x93\x92\x91\x90\x97P\x97P\x97P\x97P\x97P\x97P\x97PP\x90\x91\x92\x93\x94\x95\x96V[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[`\x03_a\x15\x1Ca\"\x01V[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x15dWP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x15\x9BW`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x16*\x91\x90aN\xE7V[`@Q\x80\x91\x03\x90\xA1PPV[a\x16>a*\x0BV[_\x84\x84\x90P\x03a\x16zW`@Q\x7F-\xE7T8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x16\xC3\x84\x84\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa*LV[_s\xC7\xD4Va\xA3E\xEC\\\xA0\xE8R\x1C\xFE\xF7\xE3/\xDA\r\xAAhs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xA1O\x89q\x86\x86`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x13\x92\x91\x90aT\\V[_`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17-W=_\x80>=_\xFD[PPPP`@Q=_\x82>=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x17U\x91\x90aW\x07V[\x90Pa\x17`\x81a+\x04V[_a\x17ia\x1E)V[\x90P\x80`\x06\x01_\x81T\x80\x92\x91\x90a\x17\x7F\x90aWNV[\x91\x90PUP_\x81`\x06\x01T\x90P\x86\x86\x83`\x05\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x91\x90a\x17\xAE\x92\x91\x90a@\xC4V[P\x80\x7F\xF1\xB1\x1B\xE5\x0C\x03\x12;\x97\xD8\x16\xB2\x94\x1A\xFEx\xC7,\xBA\xEF\xEF\xF5S\x1F\xD1\xEF\x80\xEDm.\xCC\xA8\x84\x87\x87`@Qa\x17\xE3\x93\x92\x91\x90aY>V[`@Q\x80\x91\x03\x90\xA2PPPPPPPV[a\x17\xFCa*\x0BV[_\x88\x80` \x01\x90a\x18\r\x91\x90aY\x81V[\x90P\x03a\x18FW`@Q\x7FW\xCF\xA2\x17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\n`\xFF\x16\x88\x80` \x01\x90a\x18[\x91\x90aY\x81V[\x90P\x11\x15a\x18\xB4W`\n\x88\x80` \x01\x90a\x18u\x91\x90aY\x81V[\x90P`@Q\x7F\xAF\x1F\x04\x95\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x18\xAB\x92\x91\x90aZ\x1FV[`@Q\x80\x91\x03\x90\xFD[a\x18\xCD\x89\x806\x03\x81\x01\x90a\x18\xC8\x91\x90aZ\x93V[a+\xEAV[a\x19%\x88\x80` \x01\x90a\x18\xE0\x91\x90aY\x81V[\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x88a-5V[\x15a\x19yW\x86\x88\x80` \x01\x90a\x19;\x91\x90aY\x81V[`@Q\x7F\xDCMx\xB1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x19p\x93\x92\x91\x90a[DV[`@Q\x80\x91\x03\x90\xFD[_a\x19\xD4\x8C\x8C\x8B\x80` \x01\x90a\x19\x8F\x91\x90aY\x81V[\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x8Ba-\xB3V[\x90Pa\x1A\x84\x8A\x806\x03\x81\x01\x90a\x19\xEA\x91\x90aZ\x93V[\x8Aa\x19\xF4\x90a\\rV[\x8A\x8A\x8A\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x89\x89\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa/\xA6V[_s\xC7\xD4Va\xA3E\xEC\\\xA0\xE8R\x1C\xFE\xF7\xE3/\xDA\r\xAAhs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xA1O\x89q\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1A\xD2\x91\x90a]\x1CV[_`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1A\xECW=_\x80>=_\xFD[PPPP`@Q=_\x82>=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1B\x14\x91\x90aW\x07V[\x90Pa\x1B\x1F\x81a+\x04V[_a\x1B(a\x1E)V[\x90P\x80`\x08\x01_\x81T\x80\x92\x91\x90a\x1B>\x90aWNV[\x91\x90PUP_\x81`\x08\x01T\x90P`@Q\x80`@\x01`@R\x80\x8B\x8B\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81R` \x01\x85\x81RP\x82`\x07\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01\x90\x81a\x1B\xC9\x91\x90a]FV[P` \x82\x01Q\x81`\x01\x01\x90\x80Q\x90` \x01\x90a\x1B\xE6\x92\x91\x90aA\x0FV[P\x90PP\x80\x7F\x95;hYh\xA1\xA7\xC5\xF0\xDF\xB3\xDE\xD7\xDA\xA9\xF4\xF6\xB8\xF2\xD8\x1F\xE3>M'&#\xD1\x0Ex>\xB8\x84\x8D\x8D\x8D\x8B\x8B`@Qa\x1C$\x96\x95\x94\x93\x92\x91\x90a^\x15V[`@Q\x80\x91\x03\x90\xA2PPPPPPPPPPPPPPPV[_\x80_\x90P[\x85\x85\x90P\x81\x10\x15a\x1E\x1AWs\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC6R\x8Fi\x87\x87\x84\x81\x81\x10a\x1C\x91Wa\x1C\x90aO?V[[\x90P`@\x02\x01_\x015\x89`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1C\xB8\x92\x91\x90a^qV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1C\xD3W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1C\xF7\x91\x90aK\xD1V[\x15\x80a\x1D\xD3WPs\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC6R\x8Fi\x87\x87\x84\x81\x81\x10a\x1DAWa\x1D@aO?V[[\x90P`@\x02\x01_\x015\x88\x88\x85\x81\x81\x10a\x1D]Wa\x1D\\aO?V[[\x90P`@\x02\x01` \x01` \x81\x01\x90a\x1Du\x91\x90a^\x98V[`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\x92\x92\x91\x90a^qV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1D\xADW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1D\xD1\x91\x90aK\xD1V[\x15[\x80a\x1D\xFFWPa\x1D\xFD\x86\x86\x83\x81\x81\x10a\x1D\xEFWa\x1D\xEEaO?V[[\x90P`@\x02\x01_\x015a\"\xBEV[\x15[\x15a\x1E\rW_\x91PPa\x1E V[\x80\x80`\x01\x01\x91PPa\x1CCV[P`\x01\x90P[\x95\x94PPPPPV[_\x7Fh\x11>h\xAFILn\xFD\x02\x10\xFCK\xF9\xBAt\x8D\x1F\xFA\xDA\xA4q\x82\x17\xFD\xF65H\xC4\xAE\xE7\0\x90P\x90V[_a\x1F\x08`@Q\x80`\xA0\x01`@R\x80`m\x81R` \x01af\x82`m\x919\x80Q\x90` \x01 \x85_\x01Q\x80Q\x90` \x01 \x86` \x01Q`@Q` \x01a\x1E\x94\x91\x90a_OV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x86\x80Q\x90` \x01 \x86`@Q` \x01a\x1E\xC3\x91\x90a_\x9FV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a\x1E\xED\x95\x94\x93\x92\x91\x90a_\xB5V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 a0\x82V[\x90P\x93\x92PPPV[_a\x1F\x1Aa\x1E)V[\x90P_a\x1Fj\x85\x85\x85\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa0\x9BV[\x90Pa\x1Fu\x81a0\xC5V[\x81`\x01\x01_\x87\x81R` \x01\x90\x81R` \x01_ _\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a \x14W\x85\x81`@Q\x7F\x99\xECH\xD9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a \x0B\x92\x91\x90a`\x06V[`@Q\x80\x91\x03\x90\xFD[`\x01\x82`\x01\x01_\x88\x81R` \x01\x90\x81R` \x01_ _\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UPPPPPPPV[_\x80s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC2\xB4)\x86`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a \xE1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a!\x05\x91\x90a`-V[\x90P\x80\x83\x10\x15\x91PP\x91\x90PV[``_`\x01a!!\x84a1\x95V[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!?Wa!>aE\xEEV[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a!qW\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a!\xD2W\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a!\xC7Wa!\xC6a`XV[[\x04\x94P_\x85\x03a!~W[\x81\x93PPPP\x91\x90PV[_a!\xE6a\"\x01V[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[a\"0a2\xE6V[a\":\x82\x82a3&V[PPV[a\"Fa2\xE6V[a\"Na3wV[V[a\"Xa3\xA7V[_a\"aa&\xD0V[\x90P_\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F]\xB9\xEE\nI[\xF2\xE6\xFF\x9C\x91\xA7\x83L\x1B\xA4\xFD\xD2D\xA5\xE8\xAANS{\xD3\x8A\xEA\xE4\xB0s\xAAa\"\xA6a3\xE7V[`@Qa\"\xB3\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xA1PV[_s\xC7\xD4Va\xA3E\xEC\\\xA0\xE8R\x1C\xFE\xF7\xE3/\xDA\r\xAAhs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xDC\x9Ao\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a#\x0C\x91\x90aG\x84V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a#'W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a#K\x91\x90aK\xD1V[\x90P\x91\x90PV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a#\xFFWP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a#\xE6a3\xEEV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a$6W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a$\x95W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a$\xB9\x91\x90aO\x14V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a%(W3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%\x1F\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a%\x93WP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a%\x90\x91\x90a`\x85V[`\x01[a%\xD4W\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%\xCB\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a&:W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a&1\x91\x90aG\x84V[`@Q\x80\x91\x03\x90\xFD[a&D\x83\x83a4AV[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a&\xCEW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x7F\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\x90P\x90V[_a'\x9F`@Q\x80`\x80\x01`@R\x80`T\x81R` \x01af\xEF`T\x919\x80Q\x90` \x01 \x85`@Q` \x01a',\x91\x90a_OV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x85\x80Q\x90` \x01 \x85`@Q` \x01a'[\x91\x90a_\x9FV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a'\x84\x94\x93\x92\x91\x90a`\xB0V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 a0\x82V[\x90P\x93\x92PPPV[_\x80s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c*8\x89\x98`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a(\x07W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a(+\x91\x90a`-V[\x90P\x80\x83\x10\x15\x91PP\x91\x90PV[a(Aa*\x0BV[_a(Ja&\xD0V[\x90P`\x01\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2Xa(\x90a3\xE7V[`@Qa(\x9D\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xA1PV[_\x7F\xA1jF\xD9Ba\xC7Q|\xC8\xFF\x89\xF6\x1C\x0C\xE95\x98\xE3\xC8I\x80\x10\x11\xDE\xE6I\xA6\xA5W\xD1\0\x90P\x90V[``_a(\xDAa(\xA8V[\x90P\x80`\x02\x01\x80Ta(\xEB\x90aLoV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta)\x17\x90aLoV[\x80\x15a)bW\x80`\x1F\x10a)9Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a)bV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a)EW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[``_a)xa(\xA8V[\x90P\x80`\x03\x01\x80Ta)\x89\x90aLoV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta)\xB5\x90aLoV[\x80\x15a*\0W\x80`\x1F\x10a)\xD7Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a*\0V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a)\xE3W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[a*\x13a\x0E\x9EV[\x15a*JW`@Q\x7F\xD9<\x06e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80[\x82Q\x81\x10\x15a*\xB4W_\x83\x82\x81Q\x81\x10a*lWa*kaO?V[[` \x02` \x01\x01Q\x90P_a*\x80\x82a4\xB3V[\x90Pa*\x8B\x81a5=V[a\xFF\xFF\x16\x84a*\x9A\x91\x90a`\xF3V[\x93Pa*\xA5\x82a7(V[PP\x80\x80`\x01\x01\x91PPa*OV[Pa\x08\0\x81\x11\x15a+\0Wa\x08\0\x81`@Q\x7F\xE7\xF4\x89]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a*\xF7\x92\x91\x90aa&V[`@Q\x80\x91\x03\x90\xFD[PPV[`\x01\x81Q\x11\x15a+\xE7W_\x81_\x81Q\x81\x10a+\"Wa+!aO?V[[` \x02` \x01\x01Q` \x01Q\x90P_`\x01\x90P[\x82Q\x81\x10\x15a+\xE4W\x81\x83\x82\x81Q\x81\x10a+SWa+RaO?V[[` \x02` \x01\x01Q` \x01Q\x14a+\xD7W\x82_\x81Q\x81\x10a+wWa+vaO?V[[` \x02` \x01\x01Q\x83\x82\x81Q\x81\x10a+\x92Wa+\x91aO?V[[` \x02` \x01\x01Q`@Q\x7F\xC2\xED\xDF\x9D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a+\xCE\x92\x91\x90aa\xC0V[`@Q\x80\x91\x03\x90\xFD[\x80\x80`\x01\x01\x91PPa+6V[PP[PV[_\x81` \x01Q\x03a,'W`@Q\x7F\xDE(Y\xC1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x01ma\xFF\xFF\x16\x81` \x01Q\x11\x15a,~Wa\x01m\x81` \x01Q`@Q\x7F2\x95\x18c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a,u\x92\x91\x90ab2V[`@Q\x80\x91\x03\x90\xFD[B\x81_\x01Q\x11\x15a,\xCBWB\x81_\x01Q`@Q\x7F\xF2L\x08\x87\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a,\xC2\x92\x91\x90aa&V[`@Q\x80\x91\x03\x90\xFD[Bb\x01Q\x80\x82` \x01Qa,\xDF\x91\x90abYV[\x82_\x01Qa,\xED\x91\x90a`\xF3V[\x10\x15a-2WB\x81`@Q\x7F04\x80@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a-)\x92\x91\x90ab\xC7V[`@Q\x80\x91\x03\x90\xFD[PV[_\x80_\x90P[\x83Q\x81\x10\x15a-\xA8W\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84\x82\x81Q\x81\x10a-nWa-maO?V[[` \x02` \x01\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a-\x9BW`\x01\x91PPa-\xADV[\x80\x80`\x01\x01\x91PPa-;V[P_\x90P[\x92\x91PPV[``_\x85\x85\x90P\x03a-\xF1W`@Q\x7F\xA6\xA6\xCB!\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84\x84\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a.\x0EWa.\raE\xEEV[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a. v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba;\xBAV[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a4J\x82a;\xC3V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a4\xA6Wa4\xA0\x82\x82a<\x8CV[Pa4\xAFV[a4\xAEa=\x0CV[[PPV[_\x80`\xF8`\xF0\x84\x90\x1B\x90\x1C_\x1C\x90P`S\x80\x81\x11\x15a4\xD5Wa4\xD4aK\xFCV[[`\xFF\x16\x81`\xFF\x16\x11\x15a5\x1FW\x80`@Q\x7Fd\x19P\xD7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a5\x16\x91\x90adtV[`@Q\x80\x91\x03\x90\xFD[\x80`\xFF\x16`S\x81\x11\x15a55Wa54aK\xFCV[[\x91PP\x91\x90PV[_\x80`S\x81\x11\x15a5QWa5PaK\xFCV[[\x82`S\x81\x11\x15a5dWa5caK\xFCV[[\x03a5rW`\x02\x90Pa7#V[`\x02`S\x81\x11\x15a5\x86Wa5\x85aK\xFCV[[\x82`S\x81\x11\x15a5\x99Wa5\x98aK\xFCV[[\x03a5\xA7W`\x08\x90Pa7#V[`\x03`S\x81\x11\x15a5\xBBWa5\xBAaK\xFCV[[\x82`S\x81\x11\x15a5\xCEWa5\xCDaK\xFCV[[\x03a5\xDCW`\x10\x90Pa7#V[`\x04`S\x81\x11\x15a5\xF0Wa5\xEFaK\xFCV[[\x82`S\x81\x11\x15a6\x03Wa6\x02aK\xFCV[[\x03a6\x11W` \x90Pa7#V[`\x05`S\x81\x11\x15a6%Wa6$aK\xFCV[[\x82`S\x81\x11\x15a68Wa67aK\xFCV[[\x03a6FW`@\x90Pa7#V[`\x06`S\x81\x11\x15a6ZWa6YaK\xFCV[[\x82`S\x81\x11\x15a6mWa6laK\xFCV[[\x03a6{W`\x80\x90Pa7#V[`\x07`S\x81\x11\x15a6\x8FWa6\x8EaK\xFCV[[\x82`S\x81\x11\x15a6\xA2Wa6\xA1aK\xFCV[[\x03a6\xB0W`\xA0\x90Pa7#V[`\x08`S\x81\x11\x15a6\xC4Wa6\xC3aK\xFCV[[\x82`S\x81\x11\x15a6\xD7Wa6\xD6aK\xFCV[[\x03a6\xE6Wa\x01\0\x90Pa7#V[\x81`@Q\x7F\xBEx0\xB1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a7\x1A\x91\x90ad\xD3V[`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[s\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x06 2m\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a7u\x91\x90aG\x84V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a7\x90W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a7\xB4\x91\x90aK\xD1V[a7\xF5W\x80`@Q\x7FC1\xA8]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a7\xEC\x91\x90aG\x84V[`@Q\x80\x91\x03\x90\xFD[PV[s\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC6R\x8Fi\x83\x83`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a8G\x92\x91\x90a^qV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a8bW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a8\x86\x91\x90aK\xD1V[a8\xC9W\x81\x81`@Q\x7F\x16\n+K\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a8\xC0\x92\x91\x90a^qV[`@Q\x80\x91\x03\x90\xFD[PPV[_\x80`@Q\x80`\xC0\x01`@R\x80`\x87\x81R` \x01agC`\x87\x919\x80Q\x90` \x01 \x84\x80Q\x90` \x01 \x86` \x01Q`@Q` \x01a9\x0C\x91\x90aexV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x88_\x01Q\x89` \x01Q\x87`@Q` \x01a9<\x91\x90a_\x9FV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a9g\x96\x95\x94\x93\x92\x91\x90ae\x8EV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90Pa9\x8C\x85_\x01Q\x82a=HV[\x91PP\x94\x93PPPPV[_a9\xA0a=\xBCV[\x90P\x90V[_`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x83`\x02\x82\x01R\x82`\"\x82\x01R`B\x81 \x91PP\x92\x91PPV[_\x80_`A\x84Q\x03a:%W_\x80_` \x87\x01Q\x92P`@\x87\x01Q\x91P``\x87\x01Q_\x1A\x90Pa:\x17\x88\x82\x85\x85a>\x1FV[\x95P\x95P\x95PPPPa:3V[_`\x02\x85Q_\x1B\x92P\x92P\x92P[\x92P\x92P\x92V[_`\x03\x81\x11\x15a:MWa:LaK\xFCV[[\x82`\x03\x81\x11\x15a:`Wa:_aK\xFCV[[\x03\x15a;\x98W`\x01`\x03\x81\x11\x15a:zWa:yaK\xFCV[[\x82`\x03\x81\x11\x15a:\x8DWa:\x8CaK\xFCV[[\x03a:\xC4W`@Q\x7F\xF6E\xEE\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02`\x03\x81\x11\x15a:\xD8Wa:\xD7aK\xFCV[[\x82`\x03\x81\x11\x15a:\xEBWa:\xEAaK\xFCV[[\x03a;/W\x80_\x1C`@Q\x7F\xFC\xE6\x98\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a;&\x91\x90aL)V[`@Q\x80\x91\x03\x90\xFD[`\x03\x80\x81\x11\x15a;BWa;AaK\xFCV[[\x82`\x03\x81\x11\x15a;UWa;TaK\xFCV[[\x03a;\x97W\x80`@Q\x7F\xD7\x8B\xCE\x0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a;\x8E\x91\x90aG\x84V[`@Q\x80\x91\x03\x90\xFD[[PPV[_a;\xA5a\"\x01V[_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x90P\x90V[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a<\x1EW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a<\x15\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[\x80a v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba;\xBAV[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa<\xB5\x91\x90a_\x9FV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a<\xEDW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a<\xF2V[``\x91P[P\x91P\x91Pa=\x02\x85\x83\x83a?\x06V[\x92PPP\x92\x91PPV[_4\x11\x15a=FW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80\x7F\x8Bs\xC3\xC6\x9B\xB8\xFE=Q.\xCCL\xF7Y\xCCy#\x9F{\x17\x9B\x0F\xFA\xCA\xA9\xA7]R+9@\x0Fa=sa?\x93V[a={a@\tV[\x860`@Q` \x01a=\x91\x95\x94\x93\x92\x91\x90ae\xEDV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90Pa=\xB3\x81\x84a9\xA5V[\x91PP\x92\x91PPV[_\x7F\x8Bs\xC3\xC6\x9B\xB8\xFE=Q.\xCCL\xF7Y\xCCy#\x9F{\x17\x9B\x0F\xFA\xCA\xA9\xA7]R+9@\x0Fa=\xE6a?\x93V[a=\xEEa@\tV[F0`@Q` \x01a>\x04\x95\x94\x93\x92\x91\x90ae\xEDV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x90V[_\x80_\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84_\x1C\x11\x15a>[W_`\x03\x85\x92P\x92P\x92Pa>\xFCV[_`\x01\x88\x88\x88\x88`@Q_\x81R` \x01`@R`@Qa>~\x94\x93\x92\x91\x90af>V[` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a>\x9EW=_\x80>=_\xFD[PPP` `@Q\x03Q\x90P_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a>\xEFW_`\x01_\x80\x1B\x93P\x93P\x93PPa>\xFCV[\x80_\x80_\x1B\x93P\x93P\x93PP[\x94P\x94P\x94\x91PPV[``\x82a?\x1BWa?\x16\x82a@\x80V[a?\x8BV[_\x82Q\x14\x80\x15a?AWP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a?\x83W\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a?z\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa?\x8CV[[\x93\x92PPPV[_\x80a?\x9Da(\xA8V[\x90P_a?\xA8a(\xCFV[\x90P_\x81Q\x11\x15a?\xC4W\x80\x80Q\x90` \x01 \x92PPPa@\x06V[_\x82_\x01T\x90P_\x80\x1B\x81\x14a?\xDFW\x80\x93PPPPa@\x06V[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x80a@\x13a(\xA8V[\x90P_a@\x1Ea)mV[\x90P_\x81Q\x11\x15a@:W\x80\x80Q\x90` \x01 \x92PPPa@}V[_\x82`\x01\x01T\x90P_\x80\x1B\x81\x14a@VW\x80\x93PPPPa@}V[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x81Q\x11\x15a@\x92W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82\x80T\x82\x82U\x90_R` _ \x90\x81\x01\x92\x82\x15a@\xFEW\x91` \x02\x82\x01[\x82\x81\x11\x15a@\xFDW\x825\x82U\x91` \x01\x91\x90`\x01\x01\x90a@\xE2V[[P\x90PaA\x0B\x91\x90aAZV[P\x90V[\x82\x80T\x82\x82U\x90_R` _ \x90\x81\x01\x92\x82\x15aAIW\x91` \x02\x82\x01[\x82\x81\x11\x15aAHW\x82Q\x82U\x91` \x01\x91\x90`\x01\x01\x90aA-V[[P\x90PaAV\x91\x90aAZV[P\x90V[[\x80\x82\x11\x15aAqW_\x81_\x90UP`\x01\x01aA[V[P\x90V[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[aA\x98\x81aA\x86V[\x81\x14aA\xA2W_\x80\xFD[PV[_\x815\x90PaA\xB3\x81aA\x8FV[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12aA\xDAWaA\xD9aA\xB9V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aA\xF7WaA\xF6aA\xBDV[[` \x83\x01\x91P\x83`\x01\x82\x02\x83\x01\x11\x15aB\x13WaB\x12aA\xC1V[[\x92P\x92\x90PV[_\x80_\x80_\x80_`\x80\x88\x8A\x03\x12\x15aB5WaB4aA~V[[_aBB\x8A\x82\x8B\x01aA\xA5V[\x97PP` \x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aBcWaBbaA\x82V[[aBo\x8A\x82\x8B\x01aA\xC5V[\x96P\x96PP`@\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aB\x92WaB\x91aA\x82V[[aB\x9E\x8A\x82\x8B\x01aA\xC5V[\x94P\x94PP``\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aB\xC1WaB\xC0aA\x82V[[aB\xCD\x8A\x82\x8B\x01aA\xC5V[\x92P\x92PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[_` \x82\x84\x03\x12\x15aB\xF3WaB\xF2aA~V[[_aC\0\x84\x82\x85\x01aA\xA5V[\x91PP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_aC[\x82aC2V[\x90P\x91\x90PV[aCk\x81aCQV[\x82RPPV[_aC|\x83\x83aCbV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aC\x9E\x82aC\tV[aC\xA8\x81\x85aC\x13V[\x93PaC\xB3\x83aC#V[\x80_[\x83\x81\x10\x15aC\xE3W\x81QaC\xCA\x88\x82aCqV[\x97PaC\xD5\x83aC\x88V[\x92PP`\x01\x81\x01\x90PaC\xB6V[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaD\x08\x81\x84aC\x94V[\x90P\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15aDGW\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90PaD,V[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_aDl\x82aD\x10V[aDv\x81\x85aD\x1AV[\x93PaD\x86\x81\x85` \x86\x01aD*V[aD\x8F\x81aDRV[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaD\xB2\x81\x84aDbV[\x90P\x92\x91PPV[_\x80\x83`\x1F\x84\x01\x12aD\xCFWaD\xCEaA\xB9V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aD\xECWaD\xEBaA\xBDV[[` \x83\x01\x91P\x83` \x82\x02\x83\x01\x11\x15aE\x08WaE\x07aA\xC1V[[\x92P\x92\x90PV[_\x80_\x80`@\x85\x87\x03\x12\x15aE'WaE&aA~V[[_\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aEDWaECaA\x82V[[aEP\x87\x82\x88\x01aD\xBAV[\x94P\x94PP` \x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aEsWaEraA\x82V[[aE\x7F\x87\x82\x88\x01aA\xC5V[\x92P\x92PP\x92\x95\x91\x94P\x92PV[_\x81\x15\x15\x90P\x91\x90PV[aE\xA1\x81aE\x8DV[\x82RPPV[_` \x82\x01\x90PaE\xBA_\x83\x01\x84aE\x98V[\x92\x91PPV[aE\xC9\x81aCQV[\x81\x14aE\xD3W_\x80\xFD[PV[_\x815\x90PaE\xE4\x81aE\xC0V[\x92\x91PPV[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[aF$\x82aDRV[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15aFCWaFBaE\xEEV[[\x80`@RPPPV[_aFUaAuV[\x90PaFa\x82\x82aF\x1BV[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aF\x80WaF\x7FaE\xEEV[[aF\x89\x82aDRV[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_aF\xB6aF\xB1\x84aFfV[aFLV[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15aF\xD2WaF\xD1aE\xEAV[[aF\xDD\x84\x82\x85aF\x96V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aF\xF9WaF\xF8aA\xB9V[[\x815aG\t\x84\x82` \x86\x01aF\xA4V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15aG(WaG'aA~V[[_aG5\x85\x82\x86\x01aE\xD6V[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aGVWaGUaA\x82V[[aGb\x85\x82\x86\x01aF\xE5V[\x91PP\x92P\x92\x90PV[_\x81\x90P\x91\x90PV[aG~\x81aGlV[\x82RPPV[_` \x82\x01\x90PaG\x97_\x83\x01\x84aGuV[\x92\x91PPV[_\x7F\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x82\x16\x90P\x91\x90PV[aG\xD1\x81aG\x9DV[\x82RPPV[aG\xE0\x81aA\x86V[\x82RPPV[aG\xEF\x81aCQV[\x82RPPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[aH'\x81aA\x86V[\x82RPPV[_aH8\x83\x83aH\x1EV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aHZ\x82aG\xF5V[aHd\x81\x85aG\xFFV[\x93PaHo\x83aH\x0FV[\x80_[\x83\x81\x10\x15aH\x9FW\x81QaH\x86\x88\x82aH-V[\x97PaH\x91\x83aHDV[\x92PP`\x01\x81\x01\x90PaHrV[P\x85\x93PPPP\x92\x91PPV[_`\xE0\x82\x01\x90PaH\xBF_\x83\x01\x8AaG\xC8V[\x81\x81\x03` \x83\x01RaH\xD1\x81\x89aDbV[\x90P\x81\x81\x03`@\x83\x01RaH\xE5\x81\x88aDbV[\x90PaH\xF4``\x83\x01\x87aG\xD7V[aI\x01`\x80\x83\x01\x86aG\xE6V[aI\x0E`\xA0\x83\x01\x85aGuV[\x81\x81\x03`\xC0\x83\x01RaI \x81\x84aHPV[\x90P\x98\x97PPPPPPPPV[_\x80\x83`\x1F\x84\x01\x12aICWaIBaA\xB9V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aI`WaI_aA\xBDV[[` \x83\x01\x91P\x83`@\x82\x02\x83\x01\x11\x15aI|WaI{aA\xC1V[[\x92P\x92\x90PV[_\x80\xFD[_`@\x82\x84\x03\x12\x15aI\x9CWaI\x9BaI\x83V[[\x81\x90P\x92\x91PPV[_`@\x82\x84\x03\x12\x15aI\xBAWaI\xB9aI\x83V[[\x81\x90P\x92\x91PPV[_\x80_\x80_\x80_\x80_\x80_a\x01\0\x8C\x8E\x03\x12\x15aI\xE3WaI\xE2aA~V[[_\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ\0WaI\xFFaA\x82V[[aJ\x0C\x8E\x82\x8F\x01aI.V[\x9BP\x9BPP` aJ\x1F\x8E\x82\x8F\x01aI\x87V[\x99PP``\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ@WaJ?aA\x82V[[aJL\x8E\x82\x8F\x01aI\xA5V[\x98PP`\x80aJ]\x8E\x82\x8F\x01aE\xD6V[\x97PP`\xA0\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ~WaJ}aA\x82V[[aJ\x8A\x8E\x82\x8F\x01aA\xC5V[\x96P\x96PP`\xC0\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ\xADWaJ\xACaA\x82V[[aJ\xB9\x8E\x82\x8F\x01aA\xC5V[\x94P\x94PP`\xE0\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ\xDCWaJ\xDBaA\x82V[[aJ\xE8\x8E\x82\x8F\x01aA\xC5V[\x92P\x92PP\x92\x95\x98\x9BP\x92\x95\x98\x9B\x90\x93\x96\x99PV[_\x80_\x80_``\x86\x88\x03\x12\x15aK\x16WaK\x15aA~V[[_aK#\x88\x82\x89\x01aE\xD6V[\x95PP` \x86\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aKDWaKCaA\x82V[[aKP\x88\x82\x89\x01aI.V[\x94P\x94PP`@\x86\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aKsWaKraA\x82V[[aK\x7F\x88\x82\x89\x01aA\xC5V[\x92P\x92PP\x92\x95P\x92\x95\x90\x93PV[_` \x82\x01\x90PaK\xA1_\x83\x01\x84aG\xE6V[\x92\x91PPV[aK\xB0\x81aE\x8DV[\x81\x14aK\xBAW_\x80\xFD[PV[_\x81Q\x90PaK\xCB\x81aK\xA7V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aK\xE6WaK\xE5aA~V[[_aK\xF3\x84\x82\x85\x01aK\xBDV[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[_` \x82\x01\x90PaL<_\x83\x01\x84aG\xD7V[\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\"`\x04R`$_\xFD[_`\x02\x82\x04\x90P`\x01\x82\x16\x80aL\x86W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aL\x99WaL\x98aLBV[[P\x91\x90PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_aL\xD6\x82aA\x86V[\x91PaL\xE1\x83aA\x86V[\x92P\x82\x82\x03\x90P\x81\x81\x11\x15aL\xF9WaL\xF8aL\x9FV[[\x92\x91PPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aM\x1A\x83\x85aL\xFFV[\x93PaM'\x83\x85\x84aF\x96V[aM0\x83aDRV[\x84\x01\x90P\x93\x92PPPV[_`\x80\x82\x01\x90PaMN_\x83\x01\x8AaG\xD7V[\x81\x81\x03` \x83\x01RaMa\x81\x88\x8AaM\x0FV[\x90P\x81\x81\x03`@\x83\x01RaMv\x81\x86\x88aM\x0FV[\x90P\x81\x81\x03``\x83\x01RaM\x8B\x81\x84\x86aM\x0FV[\x90P\x98\x97PPPPPPPPV[_\x81\x90P\x92\x91PPV[_aM\xAD\x82aD\x10V[aM\xB7\x81\x85aM\x99V[\x93PaM\xC7\x81\x85` \x86\x01aD*V[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aN\x07`\x02\x83aM\x99V[\x91PaN\x12\x82aM\xD3V[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aNQ`\x01\x83aM\x99V[\x91PaN\\\x82aN\x1DV[`\x01\x82\x01\x90P\x91\x90PV[_aNr\x82\x87aM\xA3V[\x91PaN}\x82aM\xFBV[\x91PaN\x89\x82\x86aM\xA3V[\x91PaN\x94\x82aNEV[\x91PaN\xA0\x82\x85aM\xA3V[\x91PaN\xAB\x82aNEV[\x91PaN\xB7\x82\x84aM\xA3V[\x91P\x81\x90P\x95\x94PPPPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[aN\xE1\x81aN\xC5V[\x82RPPV[_` \x82\x01\x90PaN\xFA_\x83\x01\x84aN\xD8V[\x92\x91PPV[_\x81Q\x90PaO\x0E\x81aE\xC0V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aO)WaO(aA~V[[_aO6\x84\x82\x85\x01aO\0V[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`2`\x04R`$_\xFD[_\x82\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_` `\x1F\x83\x01\x04\x90P\x91\x90PV[_\x82\x82\x1B\x90P\x92\x91PPV[_`\x08\x83\x02aO\xD2\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82aO\x97V[aO\xDC\x86\x83aO\x97V[\x95P\x80\x19\x84\x16\x93P\x80\x86\x16\x84\x17\x92PPP\x93\x92PPPV[_\x81\x90P\x91\x90PV[_aP\x17aP\x12aP\r\x84aA\x86V[aO\xF4V[aA\x86V[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[aP0\x83aO\xFDV[aPDaP<\x82aP\x1EV[\x84\x84TaO\xA3V[\x82UPPPPV[_\x90V[aPXaPLV[aPc\x81\x84\x84aP'V[PPPV[[\x81\x81\x10\x15aP\x86WaP{_\x82aPPV[`\x01\x81\x01\x90PaPiV[PPV[`\x1F\x82\x11\x15aP\xCBWaP\x9C\x81aOvV[aP\xA5\x84aO\x88V[\x81\x01` \x85\x10\x15aP\xB4W\x81\x90P[aP\xC8aP\xC0\x85aO\x88V[\x83\x01\x82aPhV[PP[PPPV[_\x82\x82\x1C\x90P\x92\x91PPV[_aP\xEB_\x19\x84`\x08\x02aP\xD0V[\x19\x80\x83\x16\x91PP\x92\x91PPV[_aQ\x03\x83\x83aP\xDCV[\x91P\x82`\x02\x02\x82\x17\x90P\x92\x91PPV[aQ\x1D\x83\x83aOlV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aQ6WaQ5aE\xEEV[[aQ@\x82TaLoV[aQK\x82\x82\x85aP\x8AV[_`\x1F\x83\x11`\x01\x81\x14aQxW_\x84\x15aQfW\x82\x87\x015\x90P[aQp\x85\x82aP\xF8V[\x86UPaQ\xD7V[`\x1F\x19\x84\x16aQ\x86\x86aOvV[_[\x82\x81\x10\x15aQ\xADW\x84\x89\x015\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90PaQ\x88V[\x86\x83\x10\x15aQ\xCAW\x84\x89\x015aQ\xC6`\x1F\x89\x16\x82aP\xDCV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPPV[_\x81T\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81TaR(\x81aLoV[aR2\x81\x86aR\x0CV[\x94P`\x01\x82\x16_\x81\x14aRLW`\x01\x81\x14aRbWaR\x94V[`\xFF\x19\x83\x16\x86R\x81\x15\x15` \x02\x86\x01\x93PaR\x94V[aRk\x85aOvV[_[\x83\x81\x10\x15aR\x8CW\x81T\x81\x89\x01R`\x01\x82\x01\x91P` \x81\x01\x90PaRmV[\x80\x88\x01\x95PPP[PPP\x92\x91PPV[_aR\xA8\x83\x83aR\x1CV[\x90P\x92\x91PPV[_`\x01\x82\x01\x90P\x91\x90PV[_aR\xC6\x82aQ\xE0V[aR\xD0\x81\x85aQ\xEAV[\x93P\x83` \x82\x02\x85\x01aR\xE2\x85aQ\xFAV[\x80_[\x85\x81\x10\x15aS\x1CW\x84\x84\x03\x89R\x81aR\xFD\x85\x82aR\x9DV[\x94PaS\x08\x83aR\xB0V[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaR\xE5V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_``\x82\x01\x90P\x81\x81\x03_\x83\x01RaSG\x81\x87\x89aM\x0FV[\x90P\x81\x81\x03` \x83\x01RaS[\x81\x86aR\xBCV[\x90P\x81\x81\x03`@\x83\x01RaSp\x81\x84\x86aM\x0FV[\x90P\x96\x95PPPPPPV[\x7FEIP712: Uninitialized\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aS\xB0`\x15\x83aD\x1AV[\x91PaS\xBB\x82aS|V[` \x82\x01\x90P\x91\x90PV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaS\xDD\x81aS\xA4V[\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x80\xFD[\x82\x81\x837PPPV[_aT\x0C\x83\x85aS\xE4V[\x93P\x7F\x07\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x11\x15aT?WaT>aS\xF4V[[` \x83\x02\x92PaTP\x83\x85\x84aS\xF8V[\x82\x84\x01\x90P\x93\x92PPPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaTu\x81\x84\x86aT\x01V[\x90P\x93\x92PPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aT\x98WaT\x97aE\xEEV[[` \x82\x02\x90P` \x81\x01\x90P\x91\x90PV[_\x80\xFD[_\x80\xFD[aT\xBA\x81aGlV[\x81\x14aT\xC4W_\x80\xFD[PV[_\x81Q\x90PaT\xD5\x81aT\xB1V[\x92\x91PPV[_\x81Q\x90PaT\xE9\x81aA\x8FV[\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aU\tWaU\x08aE\xEEV[[` \x82\x02\x90P` \x81\x01\x90P\x91\x90PV[_aU,aU'\x84aT\xEFV[aFLV[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15aUOWaUNaA\xC1V[[\x83[\x81\x81\x10\x15aUxW\x80aUd\x88\x82aO\0V[\x84R` \x84\x01\x93PP` \x81\x01\x90PaUQV[PPP\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aU\x96WaU\x95aA\xB9V[[\x81QaU\xA6\x84\x82` \x86\x01aU\x1AV[\x91PP\x92\x91PPV[_`\xA0\x82\x84\x03\x12\x15aU\xC4WaU\xC3aT\xA9V[[aU\xCE`\xA0aFLV[\x90P_aU\xDD\x84\x82\x85\x01aT\xC7V[_\x83\x01RP` aU\xF0\x84\x82\x85\x01aT\xDBV[` \x83\x01RP`@aV\x04\x84\x82\x85\x01aT\xC7V[`@\x83\x01RP``\x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aV(WaV'aT\xADV[[aV4\x84\x82\x85\x01aU\x82V[``\x83\x01RP`\x80aVH\x84\x82\x85\x01aT\xDBV[`\x80\x83\x01RP\x92\x91PPV[_aVfaVa\x84aT~V[aFLV[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15aV\x89WaV\x88aA\xC1V[[\x83[\x81\x81\x10\x15aV\xD0W\x80Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aV\xAEWaV\xADaA\xB9V[[\x80\x86\x01aV\xBB\x89\x82aU\xAFV[\x85R` \x85\x01\x94PPP` \x81\x01\x90PaV\x8BV[PPP\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aV\xEEWaV\xEDaA\xB9V[[\x81QaV\xFE\x84\x82` \x86\x01aVTV[\x91PP\x92\x91PPV[_` \x82\x84\x03\x12\x15aW\x1CWaW\x1BaA~V[[_\x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aW9WaW8aA\x82V[[aWE\x84\x82\x85\x01aV\xDAV[\x91PP\x92\x91PPV[_aWX\x82aA\x86V[\x91P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x03aW\x8AWaW\x89aL\x9FV[[`\x01\x82\x01\x90P\x91\x90PV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[aW\xC7\x81aGlV[\x82RPPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aW\xE7\x82aC\tV[aW\xF1\x81\x85aW\xCDV[\x93PaW\xFC\x83aC#V[\x80_[\x83\x81\x10\x15aX,W\x81QaX\x13\x88\x82aCqV[\x97PaX\x1E\x83aC\x88V[\x92PP`\x01\x81\x01\x90PaW\xFFV[P\x85\x93PPPP\x92\x91PPV[_`\xA0\x83\x01_\x83\x01QaXN_\x86\x01\x82aW\xBEV[P` \x83\x01QaXa` \x86\x01\x82aH\x1EV[P`@\x83\x01QaXt`@\x86\x01\x82aW\xBEV[P``\x83\x01Q\x84\x82\x03``\x86\x01RaX\x8C\x82\x82aW\xDDV[\x91PP`\x80\x83\x01QaX\xA1`\x80\x86\x01\x82aH\x1EV[P\x80\x91PP\x92\x91PPV[_aX\xB7\x83\x83aX9V[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aX\xD5\x82aW\x95V[aX\xDF\x81\x85aW\x9FV[\x93P\x83` \x82\x02\x85\x01aX\xF1\x85aW\xAFV[\x80_[\x85\x81\x10\x15aY,W\x84\x84\x03\x89R\x81QaY\r\x85\x82aX\xACV[\x94PaY\x18\x83aX\xBFV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaX\xF4V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_`@\x82\x01\x90P\x81\x81\x03_\x83\x01RaYV\x81\x86aX\xCBV[\x90P\x81\x81\x03` \x83\x01RaYk\x81\x84\x86aM\x0FV[\x90P\x94\x93PPPPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x835`\x01` \x03\x846\x03\x03\x81\x12aY\x9DWaY\x9CaYuV[[\x80\x84\x01\x92P\x825\x91Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aY\xBFWaY\xBEaYyV[[` \x83\x01\x92P` \x82\x026\x03\x83\x13\x15aY\xDBWaY\xDAaY}V[[P\x92P\x92\x90PV[_`\xFF\x82\x16\x90P\x91\x90PV[_aZ\taZ\x04aY\xFF\x84aY\xE3V[aO\xF4V[aA\x86V[\x90P\x91\x90PV[aZ\x19\x81aY\xEFV[\x82RPPV[_`@\x82\x01\x90PaZ2_\x83\x01\x85aZ\x10V[aZ?` \x83\x01\x84aG\xD7V[\x93\x92PPPV[_`@\x82\x84\x03\x12\x15aZ[WaZZaT\xA9V[[aZe`@aFLV[\x90P_aZt\x84\x82\x85\x01aA\xA5V[_\x83\x01RP` aZ\x87\x84\x82\x85\x01aA\xA5V[` \x83\x01RP\x92\x91PPV[_`@\x82\x84\x03\x12\x15aZ\xA8WaZ\xA7aA~V[[_aZ\xB5\x84\x82\x85\x01aZFV[\x91PP\x92\x91PPV[_\x81\x90P\x91\x90PV[_aZ\xD5` \x84\x01\x84aE\xD6V[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aZ\xF4\x83\x85aC\x13V[\x93PaZ\xFF\x82aZ\xBEV[\x80_[\x85\x81\x10\x15a[7Wa[\x14\x82\x84aZ\xC7V[a[\x1E\x88\x82aCqV[\x97Pa[)\x83aZ\xDDV[\x92PP`\x01\x81\x01\x90Pa[\x02V[P\x85\x92PPP\x93\x92PPPV[_`@\x82\x01\x90Pa[W_\x83\x01\x86aG\xE6V[\x81\x81\x03` \x83\x01Ra[j\x81\x84\x86aZ\xE9V[\x90P\x94\x93PPPPV[_a[\x86a[\x81\x84aT\xEFV[aFLV[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15a[\xA9Wa[\xA8aA\xC1V[[\x83[\x81\x81\x10\x15a[\xD2W\x80a[\xBE\x88\x82aE\xD6V[\x84R` \x84\x01\x93PP` \x81\x01\x90Pa[\xABV[PPP\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a[\xF0Wa[\xEFaA\xB9V[[\x815a\\\0\x84\x82` \x86\x01a[tV[\x91PP\x92\x91PPV[_`@\x82\x84\x03\x12\x15a\\\x1EWa\\\x1DaT\xA9V[[a\\(`@aFLV[\x90P_a\\7\x84\x82\x85\x01aA\xA5V[_\x83\x01RP` \x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\\ZWa\\YaT\xADV[[a\\f\x84\x82\x85\x01a[\xDCV[` \x83\x01RP\x92\x91PPV[_a\\}6\x83a\\\tV[\x90P\x91\x90PV[_\x81Q\x90P\x91\x90PV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_a\\\xA8\x83\x83aW\xBEV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a\\\xCA\x82a\\\x84V[a\\\xD4\x81\x85aS\xE4V[\x93Pa\\\xDF\x83a\\\x8EV[\x80_[\x83\x81\x10\x15a]\x0FW\x81Qa\\\xF6\x88\x82a\\\x9DV[\x97Pa]\x01\x83a\\\xB4V[\x92PP`\x01\x81\x01\x90Pa\\\xE2V[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra]4\x81\x84a\\\xC0V[\x90P\x92\x91PPV[_\x81Q\x90P\x91\x90PV[a]O\x82a]V[ack\x84aO\x88V[\x81\x01` \x85\x10\x15aczW\x81\x90P[ac\x8Eac\x86\x85aO\x88V[\x83\x01\x82aPhV[PP[PPPV[ac\x9F\x82aD\x10V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15ac\xB8Wac\xB7aE\xEEV[[ac\xC2\x82TaLoV[ac\xCD\x82\x82\x85acPV[_` \x90P`\x1F\x83\x11`\x01\x81\x14ac\xFEW_\x84\x15ac\xECW\x82\x87\x01Q\x90P[ac\xF6\x85\x82aP\xF8V[\x86UPad]V[`\x1F\x19\x84\x16ad\x0C\x86ac>V[_[\x82\x81\x10\x15ad3W\x84\x89\x01Q\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90Pad\x0EV[\x86\x83\x10\x15adPW\x84\x89\x01QadL`\x1F\x89\x16\x82aP\xDCV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPV[adn\x81aY\xE3V[\x82RPPV[_` \x82\x01\x90Pad\x87_\x83\x01\x84adeV[\x92\x91PPV[`T\x81\x10ad\x9EWad\x9DaK\xFCV[[PV[_\x81\x90Pad\xAE\x82ad\x8DV[\x91\x90PV[_ad\xBD\x82ad\xA1V[\x90P\x91\x90PV[ad\xCD\x81ad\xB3V[\x82RPPV[_` \x82\x01\x90Pad\xE6_\x83\x01\x84ad\xC4V[\x92\x91PPV[_\x81\x90P\x92\x91PPV[ad\xFF\x81aCQV[\x82RPPV[_ae\x10\x83\x83ad\xF6V[` \x83\x01\x90P\x92\x91PPV[_ae&\x82aC\tV[ae0\x81\x85ad\xECV[\x93Pae;\x83aC#V[\x80_[\x83\x81\x10\x15aekW\x81QaeR\x88\x82ae\x05V[\x97Pae]\x83aC\x88V[\x92PP`\x01\x81\x01\x90Pae>V[P\x85\x93PPPP\x92\x91PPV[_ae\x83\x82\x84ae\x1CV[\x91P\x81\x90P\x92\x91PPV[_`\xC0\x82\x01\x90Pae\xA1_\x83\x01\x89aGuV[ae\xAE` \x83\x01\x88aGuV[ae\xBB`@\x83\x01\x87aGuV[ae\xC8``\x83\x01\x86aG\xD7V[ae\xD5`\x80\x83\x01\x85aG\xD7V[ae\xE2`\xA0\x83\x01\x84aGuV[\x97\x96PPPPPPPV[_`\xA0\x82\x01\x90Paf\0_\x83\x01\x88aGuV[af\r` \x83\x01\x87aGuV[af\x1A`@\x83\x01\x86aGuV[af'``\x83\x01\x85aG\xD7V[af4`\x80\x83\x01\x84aG\xE6V[\x96\x95PPPPPPV[_`\x80\x82\x01\x90PafQ_\x83\x01\x87aGuV[af^` \x83\x01\x86adeV[afk`@\x83\x01\x85aGuV[afx``\x83\x01\x84aGuV[\x95\x94PPPPPV\xFEUserDecryptResponseVerification(bytes publicKey,bytes32[] ctHandles,bytes userDecryptedShare,bytes extraData)PublicDecryptVerification(bytes32[] ctHandles,bytes decryptedResult,bytes extraData)UserDecryptRequestVerification(bytes publicKey,address[] contractAddresses,uint256 startTimestamp,uint256 durationDays,bytes extraData)", ); /// The runtime bytecode of the contract, as deployed on the network. /// /// ```text - ///0x6080604052600436106100fd575f3560e01c806358f5b8ab1161009457806384b0196e1161006357806384b0196e146102e1578063ad3cb1cc14610311578063d8998f451461033b578063f1b57adb14610363578063fbb832591461038b576100fd565b806358f5b8ab1461023d5780635c975abb146102795780636f8913bc146102a35780638456cb59146102cb576100fd565b80633f4ba83a116100d05780633f4ba83a146101a55780634014c4cd146101bb5780634f1ef286146101f757806352d1902d14610213576100fd565b8063046f9eb3146101015780630900cc69146101295780630d8e6e2c1461016557806339f738101461018f575b5f80fd5b34801561010c575f80fd5b5061012760048036038101906101229190614208565b6103c7565b005b348015610134575f80fd5b5061014f600480360381019061014a91906142cc565b610853565b60405161015c91906143de565b60405180910390f35b348015610170575f80fd5b50610179610924565b6040516101869190614488565b60405180910390f35b34801561019a575f80fd5b506101a361099f565b005b3480156101b0575f80fd5b506101b9610bd7565b005b3480156101c6575f80fd5b506101e160048036038101906101dc91906144fd565b610d1f565b6040516101ee9190614595565b60405180910390f35b610211600480360381019061020c9190614700565b610eac565b005b34801561021e575f80fd5b50610227610ecb565b6040516102349190614772565b60405180910390f35b348015610248575f80fd5b50610263600480360381019061025e91906142cc565b610efc565b6040516102709190614595565b60405180910390f35b348015610284575f80fd5b5061028d610f2f565b60405161029a9190614595565b60405180910390f35b3480156102ae575f80fd5b506102c960048036038101906102c49190614208565b610f51565b005b3480156102d6575f80fd5b506102df611358565b005b3480156102ec575f80fd5b506102f561147d565b604051610308979695949392919061489a565b60405180910390f35b34801561031c575f80fd5b50610325611586565b6040516103329190614488565b60405180910390f35b348015610346575f80fd5b50610361600480360381019061035c91906144fd565b6115bf565b005b34801561036e575f80fd5b50610389600480360381019061038491906149b1565b61177d565b005b348015610396575f80fd5b506103b160048036038101906103ac9190614aeb565b611c2e565b6040516103be9190614595565b60405180910390f35b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663e5275eaf336040518263ffffffff1660e01b81526004016104149190614b7c565b602060405180830381865afa15801561042f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104539190614bbf565b61049457336040517faee8632300000000000000000000000000000000000000000000000000000000815260040161048b9190614b7c565b60405180910390fd5b5f61049d611e9d565b905060f8600260058111156104b5576104b4614bea565b5b901b881115806104c85750806008015488115b1561050a57876040517fd48af9420000000000000000000000000000000000000000000000000000000081526004016105019190614c17565b60405180910390fd5b5f816007015f8a81526020019081526020015f206040518060400160405290815f8201805461053890614c5d565b80601f016020809104026020016040519081016040528092919081815260200182805461056490614c5d565b80156105af5780601f10610586576101008083540402835291602001916105af565b820191905f5260205f20905b81548152906001019060200180831161059257829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561060557602002820191905f5260205f20905b8154815260200190600101908083116105f1575b50505050508152505090505f6040518060800160405280835f01518152602001836020015181526020018a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081525090505f6106cb82611ec4565b90506106d98b828a8a611f8b565b5f846002015f8d81526020019081526020015f205f805f1b81526020019081526020015f2090508033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b7f7fcdfb5381917f554a717d0a5470a33f5a49ba6445f05ec43c74c0bc2cc608b2600183805490506107929190614cba565b8d8d8d8d8d8d6040516107ab9796959493929190614d29565b60405180910390a2845f015f8d81526020019081526020015f205f9054906101000a900460ff161580156107e857506107e781805490506120fc565b5b15610845576001855f015f8e81526020019081526020015f205f6101000a81548160ff0219169083151502179055508b7fe89752be0ecdb68b2a6eb5ef1a891039e0e92ae3c8a62274c5881e48eea1ed2560405160405180910390a25b505050505050505050505050565b60605f61085e611e9d565b90505f816003015f8581526020019081526020015f20549050816002015f8581526020019081526020015f205f8281526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561091657602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116108cd575b505050505092505050919050565b60606040518060400160405280600a81526020017f44656372797074696f6e000000000000000000000000000000000000000000008152506109655f61218d565b61096f600161218d565b6109785f61218d565b60405160200161098b9493929190614e55565b604051602081830303815290604052905090565b60016109a9612257565b67ffffffffffffffff16146109ea576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f6109f561227b565b9050805f0160089054906101000a900460ff1680610a3d57508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15610a74576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff021916908315150217905550610b2d6040518060400160405280600a81526020017f44656372797074696f6e000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506122a2565b610b356122b8565b5f610b3e611e9d565b905060f860016005811115610b5657610b55614bea565b5b901b816006018190555060f860026005811115610b7657610b75614bea565b5b901b8160080181905550505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d282604051610bcb9190614ed5565b60405180910390a15050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c589190614f02565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610cd3575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610d1557336040517fe19166ee000000000000000000000000000000000000000000000000000000008152600401610d0c9190614b7c565b60405180910390fd5b610d1d6122ca565b565b5f805f90505b85859050811015610e9e5773f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff16630620326d878784818110610d7357610d72614f2d565b5b905060200201356040518263ffffffff1660e01b8152600401610d969190614772565b602060405180830381865afa158015610db1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dd59190614bbf565b1580610e83575073c7d45661a345ec5ca0e8521cfef7e32fda0daa6873ffffffffffffffffffffffffffffffffffffffff16632ddc9a6f878784818110610e1f57610e1e614f2d565b5b905060200201356040518263ffffffff1660e01b8152600401610e429190614772565b602060405180830381865afa158015610e5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e819190614bbf565b155b15610e91575f915050610ea4565b8080600101915050610d25565b50600190505b949350505050565b610eb4612338565b610ebd8261241e565b610ec78282612511565b5050565b5f610ed461262f565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f80610f06611e9d565b9050805f015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b5f80610f396126b6565b9050805f015f9054906101000a900460ff1691505090565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663e5275eaf336040518263ffffffff1660e01b8152600401610f9e9190614b7c565b602060405180830381865afa158015610fb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fdd9190614bbf565b61101e57336040517faee863230000000000000000000000000000000000000000000000000000000081526004016110159190614b7c565b60405180910390fd5b5f611027611e9d565b905060f86001600581111561103f5761103e614bea565b5b901b881115806110525750806006015488115b1561109457876040517fd48af94200000000000000000000000000000000000000000000000000000000815260040161108b9190614c17565b60405180910390fd5b5f6040518060600160405280836005015f8c81526020019081526020015f208054806020026020016040519081016040528092919081815260200182805480156110fb57602002820191905f5260205f20905b8154815260200190600101908083116110e7575b5050505050815260200189898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081525090505f6111a1826126dd565b90506111af8a828989611f8b565b5f836004015f8c81526020019081526020015f205f8381526020019081526020015f20905080888890918060018154018082558091505060019003905f5260205f20015f90919290919290919290919250918261120d929190615101565b50836002015f8c81526020019081526020015f205f8381526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550835f015f8c81526020019081526020015f205f9054906101000a900460ff161580156112c357506112c28180549050612797565b5b1561134b576001845f015f8d81526020019081526020015f205f6101000a81548160ff02191690831515021790555081846003015f8d81526020019081526020015f20819055508a7fd7e58a367a0a6c298e76ad5d240004e327aa1423cbe4bd7ff85d4c715ef8d15f8b8b848a8a60405161134295949392919061531c565b60405180910390a25b5050505050505050505050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016113a59190614b7c565b602060405180830381865afa1580156113c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e49190614bbf565b158015611431575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561147357336040517f388916bb00000000000000000000000000000000000000000000000000000000815260040161146a9190614b7c565b60405180910390fd5b61147b612828565b565b5f6060805f805f60605f61148f612897565b90505f801b815f01541480156114aa57505f801b8160010154145b6114e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e0906153b4565b60405180910390fd5b6114f16128be565b6114f961295c565b46305f801b5f67ffffffffffffffff811115611518576115176145dc565b5b6040519080825280602002602001820160405280156115465781602001602082028036833780820191505090505b507f0f0000000000000000000000000000000000000000000000000000000000000095949392919097509750975097509750975097505090919293949596565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6115c76129fa565b5f8484905003611603576040517f2de7543800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61164c8484808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050612a3b565b5f73c7d45661a345ec5ca0e8521cfef7e32fda0daa6873ffffffffffffffffffffffffffffffffffffffff1663a14f897186866040518363ffffffff1660e01b815260040161169c92919061544a565b5f60405180830381865afa1580156116b6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906116de91906156e1565b90506116e981612af3565b5f6116f2611e9d565b9050806006015f81548092919061170890615728565b91905055505f816006015490508686836005015f8481526020019081526020015f2091906117379291906140b2565b50807f22db480a39bd72556438aadb4a32a3d2a6638b87c03bbec5fef6997e109587ff84878760405161176c93929190615905565b60405180910390a250505050505050565b6117856129fa565b5f8880602001906117969190615948565b9050036117cf576040517f57cfa21700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a60ff168880602001906117e49190615948565b9050111561183d57600a8880602001906117fe9190615948565b90506040517faf1f04950000000000000000000000000000000000000000000000000000000081526004016118349291906159e6565b60405180910390fd5b611856898036038101906118519190615a5a565b612bd9565b6118ae8880602001906118699190615948565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f8201169050808301925050505050505088612d24565b1561190257868880602001906118c49190615948565b6040517fdc4d78b10000000000000000000000000000000000000000000000000000000081526004016118f993929190615b0b565b60405180910390fd5b5f61195d8c8c8b80602001906119189190615948565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508b612da2565b90505f6040518060a0016040528089898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081526020018b80602001906119c49190615948565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f8201169050808301925050505050505081526020018c5f013581526020018c60200135815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508152509050611a74818a88888e5f0135612f95565b5f73c7d45661a345ec5ca0e8521cfef7e32fda0daa6873ffffffffffffffffffffffffffffffffffffffff1663a14f8971846040518263ffffffff1660e01b8152600401611ac29190615bd3565b5f60405180830381865afa158015611adc573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611b0491906156e1565b9050611b0f81612af3565b5f611b18611e9d565b9050806008015f815480929190611b2e90615728565b91905055505f8160080154905060405180604001604052808c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815260200186815250826007015f8381526020019081526020015f205f820151815f019081611bb99190615bfd565b506020820151816001019080519060200190611bd69291906140fd565b50905050807ff9011bd6ba0da6049c520d70fe5971f17ed7ab795486052544b51019896c596b848e8e8e8c8c604051611c1496959493929190615ccc565b60405180910390a250505050505050505050505050505050565b5f805f90505b85859050811015611e8e5773f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff1663c6528f69878784818110611c8257611c81614f2d565b5b9050604002015f0135896040518363ffffffff1660e01b8152600401611ca9929190615d28565b602060405180830381865afa158015611cc4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce89190614bbf565b1580611dc4575073f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff1663c6528f69878784818110611d3257611d31614f2d565b5b9050604002015f0135888885818110611d4e57611d4d614f2d565b5b9050604002016020016020810190611d669190615d4f565b6040518363ffffffff1660e01b8152600401611d83929190615d28565b602060405180830381865afa158015611d9e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc29190614bbf565b155b80611e73575073c7d45661a345ec5ca0e8521cfef7e32fda0daa6873ffffffffffffffffffffffffffffffffffffffff16632ddc9a6f878784818110611e0d57611e0c614f2d565b5b9050604002015f01356040518263ffffffff1660e01b8152600401611e329190614772565b602060405180830381865afa158015611e4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e719190614bbf565b155b15611e81575f915050611e94565b8080600101915050611c34565b50600190505b95945050505050565b5f7f68113e68af494c6efd0210fc4bf9ba748d1ffadaa4718217fdf63548c4aee700905090565b5f611f846040518060a00160405280606d8152602001616526606d913980519060200120835f0151805190602001208460200151604051602001611f089190615e06565b604051602081830303815290604052805190602001208560400151805190602001208660600151604051602001611f3f9190615e56565b60405160208183030381529060405280519060200120604051602001611f69959493929190615e6c565b6040516020818303038152906040528051906020012061306d565b9050919050565b5f611f94611e9d565b90505f611fe48585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050613086565b9050611fef816130b0565b816001015f8781526020019081526020015f205f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561208e5785816040517f99ec48d9000000000000000000000000000000000000000000000000000000008152600401612085929190615ebd565b60405180910390fd5b6001826001015f8881526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550505050505050565b5f8073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663c2b429866040518163ffffffff1660e01b8152600401602060405180830381865afa15801561215b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061217f9190615ee4565b905080831015915050919050565b60605f600161219b84613180565b0190505f8167ffffffffffffffff8111156121b9576121b86145dc565b5b6040519080825280601f01601f1916602001820160405280156121eb5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561224c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161224157612240615f0f565b5b0494505f85036121f8575b819350505050919050565b5f61226061227b565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b6122aa6132d1565b6122b48282613311565b5050565b6122c06132d1565b6122c8613362565b565b6122d2613392565b5f6122db6126b6565b90505f815f015f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6123206133d2565b60405161232d9190614b7c565b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614806123e557507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166123cc6133d9565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561241c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561247b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249f9190614f02565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461250e57336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016125059190614b7c565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561257957506040513d601f19601f820116820180604052508101906125769190615f3c565b60015b6125ba57816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016125b19190614b7c565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b811461262057806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016126179190614772565b60405180910390fd5b61262a838361342c565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16146126b4576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b5f6127906040518060800160405280605481526020016165936054913980519060200120835f01516040516020016127159190615e06565b60405160208183030381529060405280519060200120846020015180519060200120856040015160405160200161274c9190615e56565b604051602081830303815290604052805190602001206040516020016127759493929190615f67565b6040516020818303038152906040528051906020012061306d565b9050919050565b5f8073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16632a3889986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061281a9190615ee4565b905080831015915050919050565b6128306129fa565b5f6128396126b6565b90506001815f015f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861287f6133d2565b60405161288c9190614b7c565b60405180910390a150565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100905090565b60605f6128c9612897565b90508060020180546128da90614c5d565b80601f016020809104026020016040519081016040528092919081815260200182805461290690614c5d565b80156129515780601f1061292857610100808354040283529160200191612951565b820191905f5260205f20905b81548152906001019060200180831161293457829003601f168201915b505050505091505090565b60605f612967612897565b905080600301805461297890614c5d565b80601f01602080910402602001604051908101604052809291908181526020018280546129a490614c5d565b80156129ef5780601f106129c6576101008083540402835291602001916129ef565b820191905f5260205f20905b8154815290600101906020018083116129d257829003601f168201915b505050505091505090565b612a02610f2f565b15612a39576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f805b8251811015612aa3575f838281518110612a5b57612a5a614f2d565b5b602002602001015190505f612a6f8261349e565b9050612a7a81613528565b61ffff1684612a899190615faa565b9350612a9482613713565b50508080600101915050612a3e565b50610800811115612aef57610800816040517fe7f4895d000000000000000000000000000000000000000000000000000000008152600401612ae6929190615fdd565b60405180910390fd5b5050565b600181511115612bd6575f815f81518110612b1157612b10614f2d565b5b60200260200101516020015190505f600190505b8251811015612bd35781838281518110612b4257612b41614f2d565b5b60200260200101516020015114612bc657825f81518110612b6657612b65614f2d565b5b6020026020010151838281518110612b8157612b80614f2d565b5b60200260200101516040517fcfae921f000000000000000000000000000000000000000000000000000000008152600401612bbd929190616064565b60405180910390fd5b8080600101915050612b25565b50505b50565b5f816020015103612c16576040517fde2859c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61016d61ffff1681602001511115612c6d5761016d81602001516040517f32951863000000000000000000000000000000000000000000000000000000008152600401612c649291906160d6565b60405180910390fd5b42815f01511115612cba5742815f01516040517ff24c0887000000000000000000000000000000000000000000000000000000008152600401612cb1929190615fdd565b60405180910390fd5b42620151808260200151612cce91906160fd565b825f0151612cdc9190615faa565b1015612d215742816040517f30348040000000000000000000000000000000000000000000000000000000008152600401612d1892919061616b565b60405180910390fd5b50565b5f805f90505b8351811015612d97578273ffffffffffffffffffffffffffffffffffffffff16848281518110612d5d57612d5c614f2d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612d8a576001915050612d9c565b8080600101915050612d2a565b505f90505b92915050565b60605f8585905003612de0576040517fa6a6cb2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484905067ffffffffffffffff811115612dfd57612dfc6145dc565b5b604051908082528060200260200182016040528015612e2b5781602001602082028036833780820191505090505b5090505f805b86869050811015612f40575f878783818110612e5057612e4f614f2d565b5b9050604002015f013590505f888884818110612e6f57612e6e614f2d565b5b9050604002016020016020810190612e879190615d4f565b90505f612e938361349e565b9050612e9e81613528565b61ffff1685612ead9190615faa565b9450612eb983886137e3565b612ec383836137e3565b612ecd8883612d24565b612f105781886040517fa4c30391000000000000000000000000000000000000000000000000000000008152600401612f07929190616192565b60405180910390fd5b82868581518110612f2457612f23614f2d565b5b6020026020010181815250505050508080600101915050612e31565b50610800811115612f8c57610800816040517fe7f4895d000000000000000000000000000000000000000000000000000000008152600401612f83929190615fdd565b60405180910390fd5b50949350505050565b5f612fa086836138b8565b90505f612ff08286868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050613086565b90508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146130645784846040517f2a873d2700000000000000000000000000000000000000000000000000000000815260040161305b9291906161c0565b60405180910390fd5b50505050505050565b5f61307f613079613985565b83613993565b9050919050565b5f805f8061309486866139d3565b9250925092506130a48282613a28565b82935050505092915050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663203d0114826040518263ffffffff1660e01b81526004016130fd9190614b7c565b602060405180830381865afa158015613118573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061313c9190614bbf565b61317d57806040517f2a7c6ef60000000000000000000000000000000000000000000000000000000081526004016131749190614b7c565b60405180910390fd5b50565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106131dc577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816131d2576131d1615f0f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613219576d04ee2d6d415b85acef8100000000838161320f5761320e615f0f565b5b0492506020810190505b662386f26fc10000831061324857662386f26fc10000838161323e5761323d615f0f565b5b0492506010810190505b6305f5e1008310613271576305f5e100838161326757613266615f0f565b5b0492506008810190505b612710831061329657612710838161328c5761328b615f0f565b5b0492506004810190505b606483106132b957606483816132af576132ae615f0f565b5b0492506002810190505b600a83106132c8576001810190505b80915050919050565b6132d9613b8a565b61330f576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6133196132d1565b5f613322612897565b905082816002019081613335919061623a565b5081816003019081613347919061623a565b505f801b815f01819055505f801b8160010181905550505050565b61336a6132d1565b5f6133736126b6565b90505f815f015f6101000a81548160ff02191690831515021790555050565b61339a610f2f565b6133d0576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f33905090565b5f6134057f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613ba8565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61343582613bb1565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156134915761348b8282613c7a565b5061349a565b613499613cfa565b5b5050565b5f8060f860f084901b901c5f1c90506053808111156134c0576134bf614bea565b5b60ff168160ff16111561350a57806040517f641950d70000000000000000000000000000000000000000000000000000000081526004016135019190616318565b60405180910390fd5b8060ff1660538111156135205761351f614bea565b5b915050919050565b5f80605381111561353c5761353b614bea565b5b82605381111561354f5761354e614bea565b5b0361355d576002905061370e565b6002605381111561357157613570614bea565b5b82605381111561358457613583614bea565b5b03613592576008905061370e565b600360538111156135a6576135a5614bea565b5b8260538111156135b9576135b8614bea565b5b036135c7576010905061370e565b600460538111156135db576135da614bea565b5b8260538111156135ee576135ed614bea565b5b036135fc576020905061370e565b600560538111156136105761360f614bea565b5b82605381111561362357613622614bea565b5b03613631576040905061370e565b6006605381111561364557613644614bea565b5b82605381111561365857613657614bea565b5b03613666576080905061370e565b6007605381111561367a57613679614bea565b5b82605381111561368d5761368c614bea565b5b0361369b5760a0905061370e565b600860538111156136af576136ae614bea565b5b8260538111156136c2576136c1614bea565b5b036136d157610100905061370e565b816040517fbe7830b10000000000000000000000000000000000000000000000000000000081526004016137059190616377565b60405180910390fd5b919050565b73f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff16630620326d826040518263ffffffff1660e01b81526004016137609190614772565b602060405180830381865afa15801561377b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061379f9190614bbf565b6137e057806040517f4331a85d0000000000000000000000000000000000000000000000000000000081526004016137d79190614772565b60405180910390fd5b50565b73f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff1663c6528f6983836040518363ffffffff1660e01b8152600401613832929190615d28565b602060405180830381865afa15801561384d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138719190614bbf565b6138b45781816040517f160a2b4b0000000000000000000000000000000000000000000000000000000081526004016138ab929190615d28565b60405180910390fd5b5050565b5f806040518060c00160405280608781526020016165e76087913980519060200120845f01518051906020012085602001516040516020016138fa919061641c565b6040516020818303038152906040528051906020012086604001518760600151886080015160405160200161392f9190615e56565b6040516020818303038152906040528051906020012060405160200161395a96959493929190616432565b60405160208183030381529060405280519060200120905061397c8382613d36565b91505092915050565b5f61398e613daa565b905090565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f6041845103613a13575f805f602087015192506040870151915060608701515f1a9050613a0588828585613e0d565b955095509550505050613a21565b5f600285515f1b9250925092505b9250925092565b5f6003811115613a3b57613a3a614bea565b5b826003811115613a4e57613a4d614bea565b5b0315613b865760016003811115613a6857613a67614bea565b5b826003811115613a7b57613a7a614bea565b5b03613ab2576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115613ac657613ac5614bea565b5b826003811115613ad957613ad8614bea565b5b03613b1d57805f1c6040517ffce698f7000000000000000000000000000000000000000000000000000000008152600401613b149190614c17565b60405180910390fd5b600380811115613b3057613b2f614bea565b5b826003811115613b4357613b42614bea565b5b03613b8557806040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600401613b7c9190614772565b60405180910390fd5b5b5050565b5f613b9361227b565b5f0160089054906101000a900460ff16905090565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03613c0c57806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401613c039190614b7c565b60405180910390fd5b80613c387f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613ba8565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051613ca39190615e56565b5f60405180830381855af49150503d805f8114613cdb576040519150601f19603f3d011682016040523d82523d5f602084013e613ce0565b606091505b5091509150613cf0858383613ef4565b9250505092915050565b5f341115613d34576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f807f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613d61613f81565b613d69613ff7565b8630604051602001613d7f959493929190616491565b604051602081830303815290604052805190602001209050613da18184613993565b91505092915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613dd4613f81565b613ddc613ff7565b4630604051602001613df2959493929190616491565b60405160208183030381529060405280519060200120905090565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115613e49575f600385925092509250613eea565b5f6001888888886040515f8152602001604052604051613e6c94939291906164e2565b6020604051602081039080840390855afa158015613e8c573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613edd575f60015f801b93509350935050613eea565b805f805f1b935093509350505b9450945094915050565b606082613f0957613f048261406e565b613f79565b5f8251148015613f2f57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15613f7157836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401613f689190614b7c565b60405180910390fd5b819050613f7a565b5b9392505050565b5f80613f8b612897565b90505f613f966128be565b90505f81511115613fb257808051906020012092505050613ff4565b5f825f015490505f801b8114613fcd57809350505050613ff4565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f80614001612897565b90505f61400c61295c565b90505f815111156140285780805190602001209250505061406b565b5f826001015490505f801b81146140445780935050505061406b565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f815111156140805780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828054828255905f5260205f209081019282156140ec579160200282015b828111156140eb5782358255916020019190600101906140d0565b5b5090506140f99190614148565b5090565b828054828255905f5260205f20908101928215614137579160200282015b8281111561413657825182559160200191906001019061411b565b5b5090506141449190614148565b5090565b5b8082111561415f575f815f905550600101614149565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61418681614174565b8114614190575f80fd5b50565b5f813590506141a18161417d565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126141c8576141c76141a7565b5b8235905067ffffffffffffffff8111156141e5576141e46141ab565b5b602083019150836001820283011115614201576142006141af565b5b9250929050565b5f805f805f805f6080888a0312156142235761422261416c565b5b5f6142308a828b01614193565b975050602088013567ffffffffffffffff81111561425157614250614170565b5b61425d8a828b016141b3565b9650965050604088013567ffffffffffffffff8111156142805761427f614170565b5b61428c8a828b016141b3565b9450945050606088013567ffffffffffffffff8111156142af576142ae614170565b5b6142bb8a828b016141b3565b925092505092959891949750929550565b5f602082840312156142e1576142e061416c565b5b5f6142ee84828501614193565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61434982614320565b9050919050565b6143598161433f565b82525050565b5f61436a8383614350565b60208301905092915050565b5f602082019050919050565b5f61438c826142f7565b6143968185614301565b93506143a183614311565b805f5b838110156143d15781516143b8888261435f565b97506143c383614376565b9250506001810190506143a4565b5085935050505092915050565b5f6020820190508181035f8301526143f68184614382565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561443557808201518184015260208101905061441a565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61445a826143fe565b6144648185614408565b9350614474818560208601614418565b61447d81614440565b840191505092915050565b5f6020820190508181035f8301526144a08184614450565b905092915050565b5f8083601f8401126144bd576144bc6141a7565b5b8235905067ffffffffffffffff8111156144da576144d96141ab565b5b6020830191508360208202830111156144f6576144f56141af565b5b9250929050565b5f805f80604085870312156145155761451461416c565b5b5f85013567ffffffffffffffff81111561453257614531614170565b5b61453e878288016144a8565b9450945050602085013567ffffffffffffffff81111561456157614560614170565b5b61456d878288016141b3565b925092505092959194509250565b5f8115159050919050565b61458f8161457b565b82525050565b5f6020820190506145a85f830184614586565b92915050565b6145b78161433f565b81146145c1575f80fd5b50565b5f813590506145d2816145ae565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61461282614440565b810181811067ffffffffffffffff82111715614631576146306145dc565b5b80604052505050565b5f614643614163565b905061464f8282614609565b919050565b5f67ffffffffffffffff82111561466e5761466d6145dc565b5b61467782614440565b9050602081019050919050565b828183375f83830152505050565b5f6146a461469f84614654565b61463a565b9050828152602081018484840111156146c0576146bf6145d8565b5b6146cb848285614684565b509392505050565b5f82601f8301126146e7576146e66141a7565b5b81356146f7848260208601614692565b91505092915050565b5f80604083850312156147165761471561416c565b5b5f614723858286016145c4565b925050602083013567ffffffffffffffff81111561474457614743614170565b5b614750858286016146d3565b9150509250929050565b5f819050919050565b61476c8161475a565b82525050565b5f6020820190506147855f830184614763565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6147bf8161478b565b82525050565b6147ce81614174565b82525050565b6147dd8161433f565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61481581614174565b82525050565b5f614826838361480c565b60208301905092915050565b5f602082019050919050565b5f614848826147e3565b61485281856147ed565b935061485d836147fd565b805f5b8381101561488d578151614874888261481b565b975061487f83614832565b925050600181019050614860565b5085935050505092915050565b5f60e0820190506148ad5f83018a6147b6565b81810360208301526148bf8189614450565b905081810360408301526148d38188614450565b90506148e260608301876147c5565b6148ef60808301866147d4565b6148fc60a0830185614763565b81810360c083015261490e818461483e565b905098975050505050505050565b5f8083601f840112614931576149306141a7565b5b8235905067ffffffffffffffff81111561494e5761494d6141ab565b5b60208301915083604082028301111561496a576149696141af565b5b9250929050565b5f80fd5b5f6040828403121561498a57614989614971565b5b81905092915050565b5f604082840312156149a8576149a7614971565b5b81905092915050565b5f805f805f805f805f805f6101008c8e0312156149d1576149d061416c565b5b5f8c013567ffffffffffffffff8111156149ee576149ed614170565b5b6149fa8e828f0161491c565b9b509b50506020614a0d8e828f01614975565b99505060608c013567ffffffffffffffff811115614a2e57614a2d614170565b5b614a3a8e828f01614993565b9850506080614a4b8e828f016145c4565b97505060a08c013567ffffffffffffffff811115614a6c57614a6b614170565b5b614a788e828f016141b3565b965096505060c08c013567ffffffffffffffff811115614a9b57614a9a614170565b5b614aa78e828f016141b3565b945094505060e08c013567ffffffffffffffff811115614aca57614ac9614170565b5b614ad68e828f016141b3565b92509250509295989b509295989b9093969950565b5f805f805f60608688031215614b0457614b0361416c565b5b5f614b11888289016145c4565b955050602086013567ffffffffffffffff811115614b3257614b31614170565b5b614b3e8882890161491c565b9450945050604086013567ffffffffffffffff811115614b6157614b60614170565b5b614b6d888289016141b3565b92509250509295509295909350565b5f602082019050614b8f5f8301846147d4565b92915050565b614b9e8161457b565b8114614ba8575f80fd5b50565b5f81519050614bb981614b95565b92915050565b5f60208284031215614bd457614bd361416c565b5b5f614be184828501614bab565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082019050614c2a5f8301846147c5565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614c7457607f821691505b602082108103614c8757614c86614c30565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614cc482614174565b9150614ccf83614174565b9250828203905081811115614ce757614ce6614c8d565b5b92915050565b5f82825260208201905092915050565b5f614d088385614ced565b9350614d15838584614684565b614d1e83614440565b840190509392505050565b5f608082019050614d3c5f83018a6147c5565b8181036020830152614d4f81888a614cfd565b90508181036040830152614d64818688614cfd565b90508181036060830152614d79818486614cfd565b905098975050505050505050565b5f81905092915050565b5f614d9b826143fe565b614da58185614d87565b9350614db5818560208601614418565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f614df5600283614d87565b9150614e0082614dc1565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f614e3f600183614d87565b9150614e4a82614e0b565b600182019050919050565b5f614e608287614d91565b9150614e6b82614de9565b9150614e778286614d91565b9150614e8282614e33565b9150614e8e8285614d91565b9150614e9982614e33565b9150614ea58284614d91565b915081905095945050505050565b5f67ffffffffffffffff82169050919050565b614ecf81614eb3565b82525050565b5f602082019050614ee85f830184614ec6565b92915050565b5f81519050614efc816145ae565b92915050565b5f60208284031215614f1757614f1661416c565b5b5f614f2484828501614eee565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614fc07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614f85565b614fca8683614f85565b95508019841693508086168417925050509392505050565b5f819050919050565b5f615005615000614ffb84614174565b614fe2565b614174565b9050919050565b5f819050919050565b61501e83614feb565b61503261502a8261500c565b848454614f91565b825550505050565b5f90565b61504661503a565b615051818484615015565b505050565b5b81811015615074576150695f8261503e565b600181019050615057565b5050565b601f8211156150b95761508a81614f64565b61509384614f76565b810160208510156150a2578190505b6150b66150ae85614f76565b830182615056565b50505b505050565b5f82821c905092915050565b5f6150d95f19846008026150be565b1980831691505092915050565b5f6150f183836150ca565b9150826002028217905092915050565b61510b8383614f5a565b67ffffffffffffffff811115615124576151236145dc565b5b61512e8254614c5d565b615139828285615078565b5f601f831160018114615166575f8415615154578287013590505b61515e85826150e6565b8655506151c5565b601f19841661517486614f64565b5f5b8281101561519b57848901358255600182019150602085019450602081019050615176565b868310156151b857848901356151b4601f8916826150ca565b8355505b6001600288020188555050505b50505050505050565b5f81549050919050565b5f82825260208201905092915050565b5f819050815f5260205f209050919050565b5f82825260208201905092915050565b5f815461521681614c5d565b61522081866151fa565b9450600182165f811461523a576001811461525057615282565b60ff198316865281151560200286019350615282565b61525985614f64565b5f5b8381101561527a5781548189015260018201915060208101905061525b565b808801955050505b50505092915050565b5f615296838361520a565b905092915050565b5f600182019050919050565b5f6152b4826151ce565b6152be81856151d8565b9350836020820285016152d0856151e8565b805f5b8581101561530a578484038952816152eb858261528b565b94506152f68361529e565b925060208a019950506001810190506152d3565b50829750879550505050505092915050565b5f6060820190508181035f830152615335818789614cfd565b9050818103602083015261534981866152aa565b9050818103604083015261535e818486614cfd565b90509695505050505050565b7f4549503731323a20556e696e697469616c697a656400000000000000000000005f82015250565b5f61539e601583614408565b91506153a98261536a565b602082019050919050565b5f6020820190508181035f8301526153cb81615392565b9050919050565b5f82825260208201905092915050565b5f80fd5b82818337505050565b5f6153fa83856153d2565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561542d5761542c6153e2565b5b60208302925061543e8385846153e6565b82840190509392505050565b5f6020820190508181035f8301526154638184866153ef565b90509392505050565b5f67ffffffffffffffff821115615486576154856145dc565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b6154a88161475a565b81146154b2575f80fd5b50565b5f815190506154c38161549f565b92915050565b5f815190506154d78161417d565b92915050565b5f67ffffffffffffffff8211156154f7576154f66145dc565b5b602082029050602081019050919050565b5f61551a615515846154dd565b61463a565b9050808382526020820190506020840283018581111561553d5761553c6141af565b5b835b8181101561556657806155528882614eee565b84526020840193505060208101905061553f565b5050509392505050565b5f82601f830112615584576155836141a7565b5b8151615594848260208601615508565b91505092915050565b5f608082840312156155b2576155b1615497565b5b6155bc608061463a565b90505f6155cb848285016154b5565b5f8301525060206155de848285016154c9565b60208301525060406155f2848285016154b5565b604083015250606082015167ffffffffffffffff8111156156165761561561549b565b5b61562284828501615570565b60608301525092915050565b5f61564061563b8461546c565b61463a565b90508083825260208201905060208402830185811115615663576156626141af565b5b835b818110156156aa57805167ffffffffffffffff811115615688576156876141a7565b5b808601615695898261559d565b85526020850194505050602081019050615665565b5050509392505050565b5f82601f8301126156c8576156c76141a7565b5b81516156d884826020860161562e565b91505092915050565b5f602082840312156156f6576156f561416c565b5b5f82015167ffffffffffffffff81111561571357615712614170565b5b61571f848285016156b4565b91505092915050565b5f61573282614174565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361576457615763614c8d565b5b600182019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6157a18161475a565b82525050565b5f82825260208201905092915050565b5f6157c1826142f7565b6157cb81856157a7565b93506157d683614311565b805f5b838110156158065781516157ed888261435f565b97506157f883614376565b9250506001810190506157d9565b5085935050505092915050565b5f608083015f8301516158285f860182615798565b50602083015161583b602086018261480c565b50604083015161584e6040860182615798565b506060830151848203606086015261586682826157b7565b9150508091505092915050565b5f61587e8383615813565b905092915050565b5f602082019050919050565b5f61589c8261576f565b6158a68185615779565b9350836020820285016158b885615789565b805f5b858110156158f357848403895281516158d48582615873565b94506158df83615886565b925060208a019950506001810190506158bb565b50829750879550505050505092915050565b5f6040820190508181035f83015261591d8186615892565b90508181036020830152615932818486614cfd565b9050949350505050565b5f80fd5b5f80fd5b5f80fd5b5f80833560016020038436030381126159645761596361593c565b5b80840192508235915067ffffffffffffffff82111561598657615985615940565b5b6020830192506020820236038313156159a2576159a1615944565b5b509250929050565b5f60ff82169050919050565b5f6159d06159cb6159c6846159aa565b614fe2565b614174565b9050919050565b6159e0816159b6565b82525050565b5f6040820190506159f95f8301856159d7565b615a0660208301846147c5565b9392505050565b5f60408284031215615a2257615a21615497565b5b615a2c604061463a565b90505f615a3b84828501614193565b5f830152506020615a4e84828501614193565b60208301525092915050565b5f60408284031215615a6f57615a6e61416c565b5b5f615a7c84828501615a0d565b91505092915050565b5f819050919050565b5f615a9c60208401846145c4565b905092915050565b5f602082019050919050565b5f615abb8385614301565b9350615ac682615a85565b805f5b85811015615afe57615adb8284615a8e565b615ae5888261435f565b9750615af083615aa4565b925050600181019050615ac9565b5085925050509392505050565b5f604082019050615b1e5f8301866147d4565b8181036020830152615b31818486615ab0565b9050949350505050565b5f81519050919050565b5f819050602082019050919050565b5f615b5f8383615798565b60208301905092915050565b5f602082019050919050565b5f615b8182615b3b565b615b8b81856153d2565b9350615b9683615b45565b805f5b83811015615bc6578151615bad8882615b54565b9750615bb883615b6b565b925050600181019050615b99565b5085935050505092915050565b5f6020820190508181035f830152615beb8184615b77565b905092915050565b5f81519050919050565b615c0682615bf3565b67ffffffffffffffff811115615c1f57615c1e6145dc565b5b615c298254614c5d565b615c34828285615078565b5f60209050601f831160018114615c65575f8415615c53578287015190505b615c5d85826150e6565b865550615cc4565b601f198416615c7386614f64565b5f5b82811015615c9a57848901518255600182019150602085019450602081019050615c75565b86831015615cb75784890151615cb3601f8916826150ca565b8355505b6001600288020188555050505b505050505050565b5f6080820190508181035f830152615ce48189615892565b9050615cf360208301886147d4565b8181036040830152615d06818688614cfd565b90508181036060830152615d1b818486614cfd565b9050979650505050505050565b5f604082019050615d3b5f830185614763565b615d4860208301846147d4565b9392505050565b5f60208284031215615d6457615d6361416c565b5b5f615d71848285016145c4565b91505092915050565b5f81905092915050565b615d8d8161475a565b82525050565b5f615d9e8383615d84565b60208301905092915050565b5f615db482615b3b565b615dbe8185615d7a565b9350615dc983615b45565b805f5b83811015615df9578151615de08882615d93565b9750615deb83615b6b565b925050600181019050615dcc565b5085935050505092915050565b5f615e118284615daa565b915081905092915050565b5f81905092915050565b5f615e3082615bf3565b615e3a8185615e1c565b9350615e4a818560208601614418565b80840191505092915050565b5f615e618284615e26565b915081905092915050565b5f60a082019050615e7f5f830188614763565b615e8c6020830187614763565b615e996040830186614763565b615ea66060830185614763565b615eb36080830184614763565b9695505050505050565b5f604082019050615ed05f8301856147c5565b615edd60208301846147d4565b9392505050565b5f60208284031215615ef957615ef861416c565b5b5f615f06848285016154c9565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f60208284031215615f5157615f5061416c565b5b5f615f5e848285016154b5565b91505092915050565b5f608082019050615f7a5f830187614763565b615f876020830186614763565b615f946040830185614763565b615fa16060830184614763565b95945050505050565b5f615fb482614174565b9150615fbf83614174565b9250828201905080821115615fd757615fd6614c8d565b5b92915050565b5f604082019050615ff05f8301856147c5565b615ffd60208301846147c5565b9392505050565b5f608083015f8301516160195f860182615798565b50602083015161602c602086018261480c565b50604083015161603f6040860182615798565b506060830151848203606086015261605782826157b7565b9150508091505092915050565b5f6040820190508181035f83015261607c8185616004565b905081810360208301526160908184616004565b90509392505050565b5f61ffff82169050919050565b5f6160c06160bb6160b684616099565b614fe2565b614174565b9050919050565b6160d0816160a6565b82525050565b5f6040820190506160e95f8301856160c7565b6160f660208301846147c5565b9392505050565b5f61610782614174565b915061611283614174565b925082820261612081614174565b9150828204841483151761613757616136614c8d565b5b5092915050565b604082015f8201516161525f85018261480c565b506020820151616165602085018261480c565b50505050565b5f60608201905061617e5f8301856147c5565b61618b602083018461613e565b9392505050565b5f6040820190506161a55f8301856147d4565b81810360208301526161b78184614382565b90509392505050565b5f6020820190508181035f8301526161d9818486614cfd565b90509392505050565b5f819050815f5260205f209050919050565b601f82111561623557616206816161e2565b61620f84614f76565b8101602085101561621e578190505b61623261622a85614f76565b830182615056565b50505b505050565b616243826143fe565b67ffffffffffffffff81111561625c5761625b6145dc565b5b6162668254614c5d565b6162718282856161f4565b5f60209050601f8311600181146162a2575f8415616290578287015190505b61629a85826150e6565b865550616301565b601f1984166162b0866161e2565b5f5b828110156162d7578489015182556001820191506020850194506020810190506162b2565b868310156162f457848901516162f0601f8916826150ca565b8355505b6001600288020188555050505b505050505050565b616312816159aa565b82525050565b5f60208201905061632b5f830184616309565b92915050565b6054811061634257616341614bea565b5b50565b5f81905061635282616331565b919050565b5f61636182616345565b9050919050565b61637181616357565b82525050565b5f60208201905061638a5f830184616368565b92915050565b5f81905092915050565b6163a38161433f565b82525050565b5f6163b4838361639a565b60208301905092915050565b5f6163ca826142f7565b6163d48185616390565b93506163df83614311565b805f5b8381101561640f5781516163f688826163a9565b975061640183614376565b9250506001810190506163e2565b5085935050505092915050565b5f61642782846163c0565b915081905092915050565b5f60c0820190506164455f830189614763565b6164526020830188614763565b61645f6040830187614763565b61646c60608301866147c5565b61647960808301856147c5565b61648660a0830184614763565b979650505050505050565b5f60a0820190506164a45f830188614763565b6164b16020830187614763565b6164be6040830186614763565b6164cb60608301856147c5565b6164d860808301846147d4565b9695505050505050565b5f6080820190506164f55f830187614763565b6165026020830186616309565b61650f6040830185614763565b61651c6060830184614763565b9594505050505056fe5573657244656372797074526573706f6e7365566572696669636174696f6e286279746573207075626c69634b65792c627974657333325b5d20637448616e646c65732c6279746573207573657244656372797074656453686172652c627974657320657874726144617461295075626c696344656372797074566572696669636174696f6e28627974657333325b5d20637448616e646c65732c627974657320646563727970746564526573756c742c62797465732065787472614461746129557365724465637279707452657175657374566572696669636174696f6e286279746573207075626c69634b65792c616464726573735b5d20636f6e74726163744164647265737365732c75696e7432353620737461727454696d657374616d702c75696e74323536206475726174696f6e446179732c62797465732065787472614461746129 + ///0x608060405260043610610108575f3560e01c80635c975abb11610094578063ad3cb1cc11610063578063ad3cb1cc1461031c578063c411587414610346578063d8998f451461035c578063f1b57adb14610384578063fbb83259146103ac57610108565b80635c975abb146102845780636f8913bc146102ae5780638456cb59146102d657806384b0196e146102ec57610108565b80633f4ba83a116100db5780633f4ba83a146101b05780634014c4cd146101c65780634f1ef2861461020257806352d1902d1461021e57806358f5b8ab1461024857610108565b8063046f9eb31461010c5780630900cc69146101345780630d8e6e2c1461017057806339f738101461019a575b5f80fd5b348015610117575f80fd5b50610132600480360381019061012d919061421a565b6103e8565b005b34801561013f575f80fd5b5061015a600480360381019061015591906142de565b610845565b60405161016791906143f0565b60405180910390f35b34801561017b575f80fd5b50610184610916565b604051610191919061449a565b60405180910390f35b3480156101a5575f80fd5b506101ae610991565b005b3480156101bb575f80fd5b506101c4610bc9565b005b3480156101d1575f80fd5b506101ec60048036038101906101e7919061450f565b610d11565b6040516101f991906145a7565b60405180910390f35b61021c60048036038101906102179190614712565b610e1b565b005b348015610229575f80fd5b50610232610e3a565b60405161023f9190614784565b60405180910390f35b348015610253575f80fd5b5061026e600480360381019061026991906142de565b610e6b565b60405161027b91906145a7565b60405180910390f35b34801561028f575f80fd5b50610298610e9e565b6040516102a591906145a7565b60405180910390f35b3480156102b9575f80fd5b506102d460048036038101906102cf919061421a565b610ec0565b005b3480156102e1575f80fd5b506102ea6112aa565b005b3480156102f7575f80fd5b506103006113cf565b60405161031397969594939291906148ac565b60405180910390f35b348015610327575f80fd5b506103306114d8565b60405161033d919061449a565b60405180910390f35b348015610351575f80fd5b5061035a611511565b005b348015610367575f80fd5b50610382600480360381019061037d919061450f565b611636565b005b34801561038f575f80fd5b506103aa60048036038101906103a591906149c3565b6117f4565b005b3480156103b7575f80fd5b506103d260048036038101906103cd9190614afd565b611c3d565b6040516103df91906145a7565b60405180910390f35b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663e5275eaf336040518263ffffffff1660e01b81526004016104359190614b8e565b602060405180830381865afa158015610450573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104749190614bd1565b6104b557336040517faee863230000000000000000000000000000000000000000000000000000000081526004016104ac9190614b8e565b60405180910390fd5b5f6104be611e29565b905060f8600260058111156104d6576104d5614bfc565b5b901b881115806104e95750806008015488115b1561052b57876040517fd48af9420000000000000000000000000000000000000000000000000000000081526004016105229190614c29565b60405180910390fd5b5f6106bf826007015f8b81526020019081526020015f206040518060400160405290815f8201805461055c90614c6f565b80601f016020809104026020016040519081016040528092919081815260200182805461058890614c6f565b80156105d35780601f106105aa576101008083540402835291602001916105d3565b820191905f5260205f20905b8154815290600101906020018083116105b657829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561062957602002820191905f5260205f20905b815481526020019060010190808311610615575b50505050508152505089898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505086868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611e50565b90506106cd89828888611f11565b5f826002015f8b81526020019081526020015f205f805f1b81526020019081526020015f2090508033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550897f7fcdfb5381917f554a717d0a5470a33f5a49ba6445f05ec43c74c0bc2cc608b2600183805490506107869190614ccc565b8b8b8b8b8b8b60405161079f9796959493929190614d3b565b60405180910390a2825f015f8b81526020019081526020015f205f9054906101000a900460ff161580156107dc57506107db8180549050612082565b5b15610839576001835f015f8c81526020019081526020015f205f6101000a81548160ff021916908315150217905550897fe89752be0ecdb68b2a6eb5ef1a891039e0e92ae3c8a62274c5881e48eea1ed2560405160405180910390a25b50505050505050505050565b60605f610850611e29565b90505f816003015f8581526020019081526020015f20549050816002015f8581526020019081526020015f205f8281526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561090857602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116108bf575b505050505092505050919050565b60606040518060400160405280600a81526020017f44656372797074696f6e000000000000000000000000000000000000000000008152506109575f612113565b6109616002612113565b61096a5f612113565b60405160200161097d9493929190614e67565b604051602081830303815290604052905090565b600161099b6121dd565b67ffffffffffffffff16146109dc576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f6109e7612201565b9050805f0160089054906101000a900460ff1680610a2f57508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15610a66576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff021916908315150217905550610b1f6040518060400160405280600a81526020017f44656372797074696f6e000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250612228565b610b2761223e565b5f610b30611e29565b905060f860016005811115610b4857610b47614bfc565b5b901b816006018190555060f860026005811115610b6857610b67614bfc565b5b901b8160080181905550505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d282604051610bbd9190614ee7565b60405180910390a15050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4a9190614f14565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610cc5575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610d0757336040517fe19166ee000000000000000000000000000000000000000000000000000000008152600401610cfe9190614b8e565b60405180910390fd5b610d0f612250565b565b5f805f90505b85859050811015610e0d5773f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff16630620326d878784818110610d6557610d64614f3f565b5b905060200201356040518263ffffffff1660e01b8152600401610d889190614784565b602060405180830381865afa158015610da3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc79190614bd1565b1580610df25750610df0868683818110610de457610de3614f3f565b5b905060200201356122be565b155b15610e00575f915050610e13565b8080600101915050610d17565b50600190505b949350505050565b610e23612352565b610e2c82612438565b610e36828261252b565b5050565b5f610e43612649565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f80610e75611e29565b9050805f015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b5f80610ea86126d0565b9050805f015f9054906101000a900460ff1691505090565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663e5275eaf336040518263ffffffff1660e01b8152600401610f0d9190614b8e565b602060405180830381865afa158015610f28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4c9190614bd1565b610f8d57336040517faee86323000000000000000000000000000000000000000000000000000000008152600401610f849190614b8e565b60405180910390fd5b5f610f96611e29565b905060f860016005811115610fae57610fad614bfc565b5b901b88111580610fc15750806006015488115b1561100357876040517fd48af942000000000000000000000000000000000000000000000000000000008152600401610ffa9190614c29565b60405180910390fd5b5f6110f4826005015f8b81526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561106257602002820191905f5260205f20905b81548152602001906001019080831161104e575b505050505089898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505086868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506126f7565b905061110289828888611f11565b5f826004015f8b81526020019081526020015f205f8381526020019081526020015f20905080878790918060018154018082558091505060019003905f5260205f20015f909192909192909192909192509182611160929190615113565b50826002015f8b81526020019081526020015f205f8381526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825f015f8b81526020019081526020015f205f9054906101000a900460ff16158015611216575061121581805490506127a8565b5b1561129e576001835f015f8c81526020019081526020015f205f6101000a81548160ff02191690831515021790555081836003015f8c81526020019081526020015f2081905550897fd7e58a367a0a6c298e76ad5d240004e327aa1423cbe4bd7ff85d4c715ef8d15f8a8a84898960405161129595949392919061532e565b60405180910390a25b50505050505050505050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016112f79190614b8e565b602060405180830381865afa158015611312573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113369190614bd1565b158015611383575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156113c557336040517f388916bb0000000000000000000000000000000000000000000000000000000081526004016113bc9190614b8e565b60405180910390fd5b6113cd612839565b565b5f6060805f805f60605f6113e16128a8565b90505f801b815f01541480156113fc57505f801b8160010154145b61143b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611432906153c6565b60405180910390fd5b6114436128cf565b61144b61296d565b46305f801b5f67ffffffffffffffff81111561146a576114696145ee565b5b6040519080825280602002602001820160405280156114985781602001602082028036833780820191505090505b507f0f0000000000000000000000000000000000000000000000000000000000000095949392919097509750975097509750975097505090919293949596565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60035f61151c612201565b9050805f0160089054906101000a900460ff168061156457508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b1561159b576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d28260405161162a9190614ee7565b60405180910390a15050565b61163e612a0b565b5f848490500361167a576040517f2de7543800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116c38484808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050612a4c565b5f73c7d45661a345ec5ca0e8521cfef7e32fda0daa6873ffffffffffffffffffffffffffffffffffffffff1663a14f897186866040518363ffffffff1660e01b815260040161171392919061545c565b5f60405180830381865afa15801561172d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906117559190615707565b905061176081612b04565b5f611769611e29565b9050806006015f81548092919061177f9061574e565b91905055505f816006015490508686836005015f8481526020019081526020015f2091906117ae9291906140c4565b50807ff1b11be50c03123b97d816b2941afe78c72cbaefeff5531fd1ef80ed6d2ecca88487876040516117e39392919061593e565b60405180910390a250505050505050565b6117fc612a0b565b5f88806020019061180d9190615981565b905003611846576040517f57cfa21700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a60ff1688806020019061185b9190615981565b905011156118b457600a8880602001906118759190615981565b90506040517faf1f04950000000000000000000000000000000000000000000000000000000081526004016118ab929190615a1f565b60405180910390fd5b6118cd898036038101906118c89190615a93565b612bea565b6119258880602001906118e09190615981565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f8201169050808301925050505050505088612d35565b15611979578688806020019061193b9190615981565b6040517fdc4d78b100000000000000000000000000000000000000000000000000000000815260040161197093929190615b44565b60405180910390fd5b5f6119d48c8c8b806020019061198f9190615981565b808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508b612db3565b9050611a848a8036038101906119ea9190615a93565b8a6119f490615c72565b8a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612fa6565b5f73c7d45661a345ec5ca0e8521cfef7e32fda0daa6873ffffffffffffffffffffffffffffffffffffffff1663a14f8971836040518263ffffffff1660e01b8152600401611ad29190615d1c565b5f60405180830381865afa158015611aec573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611b149190615707565b9050611b1f81612b04565b5f611b28611e29565b9050806008015f815480929190611b3e9061574e565b91905055505f8160080154905060405180604001604052808b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815260200185815250826007015f8381526020019081526020015f205f820151815f019081611bc99190615d46565b506020820151816001019080519060200190611be692919061410f565b50905050807f953b685968a1a7c5f0dfb3ded7daa9f4f6b8f2d81fe33e4d272623d10e783eb8848d8d8d8b8b604051611c2496959493929190615e15565b60405180910390a2505050505050505050505050505050565b5f805f90505b85859050811015611e1a5773f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff1663c6528f69878784818110611c9157611c90614f3f565b5b9050604002015f0135896040518363ffffffff1660e01b8152600401611cb8929190615e71565b602060405180830381865afa158015611cd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf79190614bd1565b1580611dd3575073f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff1663c6528f69878784818110611d4157611d40614f3f565b5b9050604002015f0135888885818110611d5d57611d5c614f3f565b5b9050604002016020016020810190611d759190615e98565b6040518363ffffffff1660e01b8152600401611d92929190615e71565b602060405180830381865afa158015611dad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd19190614bd1565b155b80611dff5750611dfd868683818110611def57611dee614f3f565b5b9050604002015f01356122be565b155b15611e0d575f915050611e20565b8080600101915050611c43565b50600190505b95945050505050565b5f7f68113e68af494c6efd0210fc4bf9ba748d1ffadaa4718217fdf63548c4aee700905090565b5f611f086040518060a00160405280606d8152602001616682606d913980519060200120855f0151805190602001208660200151604051602001611e949190615f4f565b60405160208183030381529060405280519060200120868051906020012086604051602001611ec39190615f9f565b60405160208183030381529060405280519060200120604051602001611eed959493929190615fb5565b60405160208183030381529060405280519060200120613082565b90509392505050565b5f611f1a611e29565b90505f611f6a8585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505061309b565b9050611f75816130c5565b816001015f8781526020019081526020015f205f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156120145785816040517f99ec48d900000000000000000000000000000000000000000000000000000000815260040161200b929190616006565b60405180910390fd5b6001826001015f8881526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550505050505050565b5f8073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663c2b429866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612105919061602d565b905080831015915050919050565b60605f600161212184613195565b0190505f8167ffffffffffffffff81111561213f5761213e6145ee565b5b6040519080825280601f01601f1916602001820160405280156121715781602001600182028036833780820191505090505b5090505f82602001820190505b6001156121d2578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816121c7576121c6616058565b5b0494505f850361217e575b819350505050919050565b5f6121e6612201565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b6122306132e6565b61223a8282613326565b5050565b6122466132e6565b61224e613377565b565b6122586133a7565b5f6122616126d0565b90505f815f015f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122a66133e7565b6040516122b39190614b8e565b60405180910390a150565b5f73c7d45661a345ec5ca0e8521cfef7e32fda0daa6873ffffffffffffffffffffffffffffffffffffffff16632ddc9a6f836040518263ffffffff1660e01b815260040161230c9190614784565b602060405180830381865afa158015612327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061234b9190614bd1565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614806123ff57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166123e66133ee565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612436576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612495573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b99190614f14565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461252857336040517f0e56cf3d00000000000000000000000000000000000000000000000000000000815260040161251f9190614b8e565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561259357506040513d601f19601f820116820180604052508101906125909190616085565b60015b6125d457816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016125cb9190614b8e565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b811461263a57806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016126319190614784565b60405180910390fd5b6126448383613441565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16146126ce576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b5f61279f6040518060800160405280605481526020016166ef60549139805190602001208560405160200161272c9190615f4f565b6040516020818303038152906040528051906020012085805190602001208560405160200161275b9190615f9f565b6040516020818303038152906040528051906020012060405160200161278494939291906160b0565b60405160208183030381529060405280519060200120613082565b90509392505050565b5f8073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16632a3889986040518163ffffffff1660e01b8152600401602060405180830381865afa158015612807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061282b919061602d565b905080831015915050919050565b612841612a0b565b5f61284a6126d0565b90506001815f015f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586128906133e7565b60405161289d9190614b8e565b60405180910390a150565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100905090565b60605f6128da6128a8565b90508060020180546128eb90614c6f565b80601f016020809104026020016040519081016040528092919081815260200182805461291790614c6f565b80156129625780601f1061293957610100808354040283529160200191612962565b820191905f5260205f20905b81548152906001019060200180831161294557829003601f168201915b505050505091505090565b60605f6129786128a8565b905080600301805461298990614c6f565b80601f01602080910402602001604051908101604052809291908181526020018280546129b590614c6f565b8015612a005780601f106129d757610100808354040283529160200191612a00565b820191905f5260205f20905b8154815290600101906020018083116129e357829003601f168201915b505050505091505090565b612a13610e9e565b15612a4a576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f805b8251811015612ab4575f838281518110612a6c57612a6b614f3f565b5b602002602001015190505f612a80826134b3565b9050612a8b8161353d565b61ffff1684612a9a91906160f3565b9350612aa582613728565b50508080600101915050612a4f565b50610800811115612b0057610800816040517fe7f4895d000000000000000000000000000000000000000000000000000000008152600401612af7929190616126565b60405180910390fd5b5050565b600181511115612be7575f815f81518110612b2257612b21614f3f565b5b60200260200101516020015190505f600190505b8251811015612be45781838281518110612b5357612b52614f3f565b5b60200260200101516020015114612bd757825f81518110612b7757612b76614f3f565b5b6020026020010151838281518110612b9257612b91614f3f565b5b60200260200101516040517fc2eddf9d000000000000000000000000000000000000000000000000000000008152600401612bce9291906161c0565b60405180910390fd5b8080600101915050612b36565b50505b50565b5f816020015103612c27576040517fde2859c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61016d61ffff1681602001511115612c7e5761016d81602001516040517f32951863000000000000000000000000000000000000000000000000000000008152600401612c75929190616232565b60405180910390fd5b42815f01511115612ccb5742815f01516040517ff24c0887000000000000000000000000000000000000000000000000000000008152600401612cc2929190616126565b60405180910390fd5b42620151808260200151612cdf9190616259565b825f0151612ced91906160f3565b1015612d325742816040517f30348040000000000000000000000000000000000000000000000000000000008152600401612d299291906162c7565b60405180910390fd5b50565b5f805f90505b8351811015612da8578273ffffffffffffffffffffffffffffffffffffffff16848281518110612d6e57612d6d614f3f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612d9b576001915050612dad565b8080600101915050612d3b565b505f90505b92915050565b60605f8585905003612df1576040517fa6a6cb2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484905067ffffffffffffffff811115612e0e57612e0d6145ee565b5b604051908082528060200260200182016040528015612e3c5781602001602082028036833780820191505090505b5090505f805b86869050811015612f51575f878783818110612e6157612e60614f3f565b5b9050604002015f013590505f888884818110612e8057612e7f614f3f565b5b9050604002016020016020810190612e989190615e98565b90505f612ea4836134b3565b9050612eaf8161353d565b61ffff1685612ebe91906160f3565b9450612eca83886137f8565b612ed483836137f8565b612ede8883612d35565b612f215781886040517fa4c30391000000000000000000000000000000000000000000000000000000008152600401612f189291906162ee565b60405180910390fd5b82868581518110612f3557612f34614f3f565b5b6020026020010181815250505050508080600101915050612e42565b50610800811115612f9d57610800816040517fe7f4895d000000000000000000000000000000000000000000000000000000008152600401612f94929190616126565b60405180910390fd5b50949350505050565b5f612fb3888887856138cd565b90505f6130038286868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505061309b565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146130775784846040517f2a873d2700000000000000000000000000000000000000000000000000000000815260040161306e92919061631c565b60405180910390fd5b505050505050505050565b5f61309461308e613997565b836139a5565b9050919050565b5f805f806130a986866139e5565b9250925092506130b98282613a3a565b82935050505092915050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663203d0114826040518263ffffffff1660e01b81526004016131129190614b8e565b602060405180830381865afa15801561312d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131519190614bd1565b61319257806040517f2a7c6ef60000000000000000000000000000000000000000000000000000000081526004016131899190614b8e565b60405180910390fd5b50565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106131f1577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816131e7576131e6616058565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061322e576d04ee2d6d415b85acef8100000000838161322457613223616058565b5b0492506020810190505b662386f26fc10000831061325d57662386f26fc10000838161325357613252616058565b5b0492506010810190505b6305f5e1008310613286576305f5e100838161327c5761327b616058565b5b0492506008810190505b61271083106132ab5761271083816132a1576132a0616058565b5b0492506004810190505b606483106132ce57606483816132c4576132c3616058565b5b0492506002810190505b600a83106132dd576001810190505b80915050919050565b6132ee613b9c565b613324576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61332e6132e6565b5f6133376128a8565b90508281600201908161334a9190616396565b508181600301908161335c9190616396565b505f801b815f01819055505f801b8160010181905550505050565b61337f6132e6565b5f6133886126d0565b90505f815f015f6101000a81548160ff02191690831515021790555050565b6133af610e9e565b6133e5576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f33905090565b5f61341a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613bba565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61344a82613bc3565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156134a6576134a08282613c8c565b506134af565b6134ae613d0c565b5b5050565b5f8060f860f084901b901c5f1c90506053808111156134d5576134d4614bfc565b5b60ff168160ff16111561351f57806040517f641950d70000000000000000000000000000000000000000000000000000000081526004016135169190616474565b60405180910390fd5b8060ff16605381111561353557613534614bfc565b5b915050919050565b5f80605381111561355157613550614bfc565b5b82605381111561356457613563614bfc565b5b036135725760029050613723565b6002605381111561358657613585614bfc565b5b82605381111561359957613598614bfc565b5b036135a75760089050613723565b600360538111156135bb576135ba614bfc565b5b8260538111156135ce576135cd614bfc565b5b036135dc5760109050613723565b600460538111156135f0576135ef614bfc565b5b82605381111561360357613602614bfc565b5b036136115760209050613723565b6005605381111561362557613624614bfc565b5b82605381111561363857613637614bfc565b5b036136465760409050613723565b6006605381111561365a57613659614bfc565b5b82605381111561366d5761366c614bfc565b5b0361367b5760809050613723565b6007605381111561368f5761368e614bfc565b5b8260538111156136a2576136a1614bfc565b5b036136b05760a09050613723565b600860538111156136c4576136c3614bfc565b5b8260538111156136d7576136d6614bfc565b5b036136e6576101009050613723565b816040517fbe7830b100000000000000000000000000000000000000000000000000000000815260040161371a91906164d3565b60405180910390fd5b919050565b73f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff16630620326d826040518263ffffffff1660e01b81526004016137759190614784565b602060405180830381865afa158015613790573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137b49190614bd1565b6137f557806040517f4331a85d0000000000000000000000000000000000000000000000000000000081526004016137ec9190614784565b60405180910390fd5b50565b73f3627f73c8ae1d0bdc2af62812284303a525eeef73ffffffffffffffffffffffffffffffffffffffff1663c6528f6983836040518363ffffffff1660e01b8152600401613847929190615e71565b602060405180830381865afa158015613862573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138869190614bd1565b6138c95781816040517f160a2b4b0000000000000000000000000000000000000000000000000000000081526004016138c0929190615e71565b60405180910390fd5b5050565b5f806040518060c001604052806087815260200161674360879139805190602001208480519060200120866020015160405160200161390c9190616578565b60405160208183030381529060405280519060200120885f015189602001518760405160200161393c9190615f9f565b604051602081830303815290604052805190602001206040516020016139679695949392919061658e565b60405160208183030381529060405280519060200120905061398c855f015182613d48565b915050949350505050565b5f6139a0613dbc565b905090565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f6041845103613a25575f805f602087015192506040870151915060608701515f1a9050613a1788828585613e1f565b955095509550505050613a33565b5f600285515f1b9250925092505b9250925092565b5f6003811115613a4d57613a4c614bfc565b5b826003811115613a6057613a5f614bfc565b5b0315613b985760016003811115613a7a57613a79614bfc565b5b826003811115613a8d57613a8c614bfc565b5b03613ac4576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115613ad857613ad7614bfc565b5b826003811115613aeb57613aea614bfc565b5b03613b2f57805f1c6040517ffce698f7000000000000000000000000000000000000000000000000000000008152600401613b269190614c29565b60405180910390fd5b600380811115613b4257613b41614bfc565b5b826003811115613b5557613b54614bfc565b5b03613b9757806040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600401613b8e9190614784565b60405180910390fd5b5b5050565b5f613ba5612201565b5f0160089054906101000a900460ff16905090565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03613c1e57806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401613c159190614b8e565b60405180910390fd5b80613c4a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613bba565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051613cb59190615f9f565b5f60405180830381855af49150503d805f8114613ced576040519150601f19603f3d011682016040523d82523d5f602084013e613cf2565b606091505b5091509150613d02858383613f06565b9250505092915050565b5f341115613d46576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f807f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613d73613f93565b613d7b614009565b8630604051602001613d919594939291906165ed565b604051602081830303815290604052805190602001209050613db381846139a5565b91505092915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613de6613f93565b613dee614009565b4630604051602001613e049594939291906165ed565b60405160208183030381529060405280519060200120905090565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115613e5b575f600385925092509250613efc565b5f6001888888886040515f8152602001604052604051613e7e949392919061663e565b6020604051602081039080840390855afa158015613e9e573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613eef575f60015f801b93509350935050613efc565b805f805f1b935093509350505b9450945094915050565b606082613f1b57613f1682614080565b613f8b565b5f8251148015613f4157505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15613f8357836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401613f7a9190614b8e565b60405180910390fd5b819050613f8c565b5b9392505050565b5f80613f9d6128a8565b90505f613fa86128cf565b90505f81511115613fc457808051906020012092505050614006565b5f825f015490505f801b8114613fdf57809350505050614006565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f806140136128a8565b90505f61401e61296d565b90505f8151111561403a5780805190602001209250505061407d565b5f826001015490505f801b81146140565780935050505061407d565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f815111156140925780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828054828255905f5260205f209081019282156140fe579160200282015b828111156140fd5782358255916020019190600101906140e2565b5b50905061410b919061415a565b5090565b828054828255905f5260205f20908101928215614149579160200282015b8281111561414857825182559160200191906001019061412d565b5b509050614156919061415a565b5090565b5b80821115614171575f815f90555060010161415b565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61419881614186565b81146141a2575f80fd5b50565b5f813590506141b38161418f565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126141da576141d96141b9565b5b8235905067ffffffffffffffff8111156141f7576141f66141bd565b5b602083019150836001820283011115614213576142126141c1565b5b9250929050565b5f805f805f805f6080888a0312156142355761423461417e565b5b5f6142428a828b016141a5565b975050602088013567ffffffffffffffff81111561426357614262614182565b5b61426f8a828b016141c5565b9650965050604088013567ffffffffffffffff81111561429257614291614182565b5b61429e8a828b016141c5565b9450945050606088013567ffffffffffffffff8111156142c1576142c0614182565b5b6142cd8a828b016141c5565b925092505092959891949750929550565b5f602082840312156142f3576142f261417e565b5b5f614300848285016141a5565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61435b82614332565b9050919050565b61436b81614351565b82525050565b5f61437c8383614362565b60208301905092915050565b5f602082019050919050565b5f61439e82614309565b6143a88185614313565b93506143b383614323565b805f5b838110156143e35781516143ca8882614371565b97506143d583614388565b9250506001810190506143b6565b5085935050505092915050565b5f6020820190508181035f8301526144088184614394565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561444757808201518184015260208101905061442c565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61446c82614410565b614476818561441a565b935061448681856020860161442a565b61448f81614452565b840191505092915050565b5f6020820190508181035f8301526144b28184614462565b905092915050565b5f8083601f8401126144cf576144ce6141b9565b5b8235905067ffffffffffffffff8111156144ec576144eb6141bd565b5b602083019150836020820283011115614508576145076141c1565b5b9250929050565b5f805f80604085870312156145275761452661417e565b5b5f85013567ffffffffffffffff81111561454457614543614182565b5b614550878288016144ba565b9450945050602085013567ffffffffffffffff81111561457357614572614182565b5b61457f878288016141c5565b925092505092959194509250565b5f8115159050919050565b6145a18161458d565b82525050565b5f6020820190506145ba5f830184614598565b92915050565b6145c981614351565b81146145d3575f80fd5b50565b5f813590506145e4816145c0565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61462482614452565b810181811067ffffffffffffffff82111715614643576146426145ee565b5b80604052505050565b5f614655614175565b9050614661828261461b565b919050565b5f67ffffffffffffffff8211156146805761467f6145ee565b5b61468982614452565b9050602081019050919050565b828183375f83830152505050565b5f6146b66146b184614666565b61464c565b9050828152602081018484840111156146d2576146d16145ea565b5b6146dd848285614696565b509392505050565b5f82601f8301126146f9576146f86141b9565b5b81356147098482602086016146a4565b91505092915050565b5f80604083850312156147285761472761417e565b5b5f614735858286016145d6565b925050602083013567ffffffffffffffff81111561475657614755614182565b5b614762858286016146e5565b9150509250929050565b5f819050919050565b61477e8161476c565b82525050565b5f6020820190506147975f830184614775565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6147d18161479d565b82525050565b6147e081614186565b82525050565b6147ef81614351565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61482781614186565b82525050565b5f614838838361481e565b60208301905092915050565b5f602082019050919050565b5f61485a826147f5565b61486481856147ff565b935061486f8361480f565b805f5b8381101561489f578151614886888261482d565b975061489183614844565b925050600181019050614872565b5085935050505092915050565b5f60e0820190506148bf5f83018a6147c8565b81810360208301526148d18189614462565b905081810360408301526148e58188614462565b90506148f460608301876147d7565b61490160808301866147e6565b61490e60a0830185614775565b81810360c08301526149208184614850565b905098975050505050505050565b5f8083601f840112614943576149426141b9565b5b8235905067ffffffffffffffff8111156149605761495f6141bd565b5b60208301915083604082028301111561497c5761497b6141c1565b5b9250929050565b5f80fd5b5f6040828403121561499c5761499b614983565b5b81905092915050565b5f604082840312156149ba576149b9614983565b5b81905092915050565b5f805f805f805f805f805f6101008c8e0312156149e3576149e261417e565b5b5f8c013567ffffffffffffffff811115614a00576149ff614182565b5b614a0c8e828f0161492e565b9b509b50506020614a1f8e828f01614987565b99505060608c013567ffffffffffffffff811115614a4057614a3f614182565b5b614a4c8e828f016149a5565b9850506080614a5d8e828f016145d6565b97505060a08c013567ffffffffffffffff811115614a7e57614a7d614182565b5b614a8a8e828f016141c5565b965096505060c08c013567ffffffffffffffff811115614aad57614aac614182565b5b614ab98e828f016141c5565b945094505060e08c013567ffffffffffffffff811115614adc57614adb614182565b5b614ae88e828f016141c5565b92509250509295989b509295989b9093969950565b5f805f805f60608688031215614b1657614b1561417e565b5b5f614b23888289016145d6565b955050602086013567ffffffffffffffff811115614b4457614b43614182565b5b614b508882890161492e565b9450945050604086013567ffffffffffffffff811115614b7357614b72614182565b5b614b7f888289016141c5565b92509250509295509295909350565b5f602082019050614ba15f8301846147e6565b92915050565b614bb08161458d565b8114614bba575f80fd5b50565b5f81519050614bcb81614ba7565b92915050565b5f60208284031215614be657614be561417e565b5b5f614bf384828501614bbd565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082019050614c3c5f8301846147d7565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614c8657607f821691505b602082108103614c9957614c98614c42565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614cd682614186565b9150614ce183614186565b9250828203905081811115614cf957614cf8614c9f565b5b92915050565b5f82825260208201905092915050565b5f614d1a8385614cff565b9350614d27838584614696565b614d3083614452565b840190509392505050565b5f608082019050614d4e5f83018a6147d7565b8181036020830152614d6181888a614d0f565b90508181036040830152614d76818688614d0f565b90508181036060830152614d8b818486614d0f565b905098975050505050505050565b5f81905092915050565b5f614dad82614410565b614db78185614d99565b9350614dc781856020860161442a565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f614e07600283614d99565b9150614e1282614dd3565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f614e51600183614d99565b9150614e5c82614e1d565b600182019050919050565b5f614e728287614da3565b9150614e7d82614dfb565b9150614e898286614da3565b9150614e9482614e45565b9150614ea08285614da3565b9150614eab82614e45565b9150614eb78284614da3565b915081905095945050505050565b5f67ffffffffffffffff82169050919050565b614ee181614ec5565b82525050565b5f602082019050614efa5f830184614ed8565b92915050565b5f81519050614f0e816145c0565b92915050565b5f60208284031215614f2957614f2861417e565b5b5f614f3684828501614f00565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614fd27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614f97565b614fdc8683614f97565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61501761501261500d84614186565b614ff4565b614186565b9050919050565b5f819050919050565b61503083614ffd565b61504461503c8261501e565b848454614fa3565b825550505050565b5f90565b61505861504c565b615063818484615027565b505050565b5b818110156150865761507b5f82615050565b600181019050615069565b5050565b601f8211156150cb5761509c81614f76565b6150a584614f88565b810160208510156150b4578190505b6150c86150c085614f88565b830182615068565b50505b505050565b5f82821c905092915050565b5f6150eb5f19846008026150d0565b1980831691505092915050565b5f61510383836150dc565b9150826002028217905092915050565b61511d8383614f6c565b67ffffffffffffffff811115615136576151356145ee565b5b6151408254614c6f565b61514b82828561508a565b5f601f831160018114615178575f8415615166578287013590505b61517085826150f8565b8655506151d7565b601f19841661518686614f76565b5f5b828110156151ad57848901358255600182019150602085019450602081019050615188565b868310156151ca57848901356151c6601f8916826150dc565b8355505b6001600288020188555050505b50505050505050565b5f81549050919050565b5f82825260208201905092915050565b5f819050815f5260205f209050919050565b5f82825260208201905092915050565b5f815461522881614c6f565b615232818661520c565b9450600182165f811461524c576001811461526257615294565b60ff198316865281151560200286019350615294565b61526b85614f76565b5f5b8381101561528c5781548189015260018201915060208101905061526d565b808801955050505b50505092915050565b5f6152a8838361521c565b905092915050565b5f600182019050919050565b5f6152c6826151e0565b6152d081856151ea565b9350836020820285016152e2856151fa565b805f5b8581101561531c578484038952816152fd858261529d565b9450615308836152b0565b925060208a019950506001810190506152e5565b50829750879550505050505092915050565b5f6060820190508181035f830152615347818789614d0f565b9050818103602083015261535b81866152bc565b90508181036040830152615370818486614d0f565b90509695505050505050565b7f4549503731323a20556e696e697469616c697a656400000000000000000000005f82015250565b5f6153b060158361441a565b91506153bb8261537c565b602082019050919050565b5f6020820190508181035f8301526153dd816153a4565b9050919050565b5f82825260208201905092915050565b5f80fd5b82818337505050565b5f61540c83856153e4565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561543f5761543e6153f4565b5b6020830292506154508385846153f8565b82840190509392505050565b5f6020820190508181035f830152615475818486615401565b90509392505050565b5f67ffffffffffffffff821115615498576154976145ee565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b6154ba8161476c565b81146154c4575f80fd5b50565b5f815190506154d5816154b1565b92915050565b5f815190506154e98161418f565b92915050565b5f67ffffffffffffffff821115615509576155086145ee565b5b602082029050602081019050919050565b5f61552c615527846154ef565b61464c565b9050808382526020820190506020840283018581111561554f5761554e6141c1565b5b835b8181101561557857806155648882614f00565b845260208401935050602081019050615551565b5050509392505050565b5f82601f830112615596576155956141b9565b5b81516155a684826020860161551a565b91505092915050565b5f60a082840312156155c4576155c36154a9565b5b6155ce60a061464c565b90505f6155dd848285016154c7565b5f8301525060206155f0848285016154db565b6020830152506040615604848285016154c7565b604083015250606082015167ffffffffffffffff811115615628576156276154ad565b5b61563484828501615582565b6060830152506080615648848285016154db565b60808301525092915050565b5f6156666156618461547e565b61464c565b90508083825260208201905060208402830185811115615689576156886141c1565b5b835b818110156156d057805167ffffffffffffffff8111156156ae576156ad6141b9565b5b8086016156bb89826155af565b8552602085019450505060208101905061568b565b5050509392505050565b5f82601f8301126156ee576156ed6141b9565b5b81516156fe848260208601615654565b91505092915050565b5f6020828403121561571c5761571b61417e565b5b5f82015167ffffffffffffffff81111561573957615738614182565b5b615745848285016156da565b91505092915050565b5f61575882614186565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361578a57615789614c9f565b5b600182019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6157c78161476c565b82525050565b5f82825260208201905092915050565b5f6157e782614309565b6157f181856157cd565b93506157fc83614323565b805f5b8381101561582c5781516158138882614371565b975061581e83614388565b9250506001810190506157ff565b5085935050505092915050565b5f60a083015f83015161584e5f8601826157be565b506020830151615861602086018261481e565b50604083015161587460408601826157be565b506060830151848203606086015261588c82826157dd565b91505060808301516158a1608086018261481e565b508091505092915050565b5f6158b78383615839565b905092915050565b5f602082019050919050565b5f6158d582615795565b6158df818561579f565b9350836020820285016158f1856157af565b805f5b8581101561592c578484038952815161590d85826158ac565b9450615918836158bf565b925060208a019950506001810190506158f4565b50829750879550505050505092915050565b5f6040820190508181035f83015261595681866158cb565b9050818103602083015261596b818486614d0f565b9050949350505050565b5f80fd5b5f80fd5b5f80fd5b5f808335600160200384360303811261599d5761599c615975565b5b80840192508235915067ffffffffffffffff8211156159bf576159be615979565b5b6020830192506020820236038313156159db576159da61597d565b5b509250929050565b5f60ff82169050919050565b5f615a09615a046159ff846159e3565b614ff4565b614186565b9050919050565b615a19816159ef565b82525050565b5f604082019050615a325f830185615a10565b615a3f60208301846147d7565b9392505050565b5f60408284031215615a5b57615a5a6154a9565b5b615a65604061464c565b90505f615a74848285016141a5565b5f830152506020615a87848285016141a5565b60208301525092915050565b5f60408284031215615aa857615aa761417e565b5b5f615ab584828501615a46565b91505092915050565b5f819050919050565b5f615ad560208401846145d6565b905092915050565b5f602082019050919050565b5f615af48385614313565b9350615aff82615abe565b805f5b85811015615b3757615b148284615ac7565b615b1e8882614371565b9750615b2983615add565b925050600181019050615b02565b5085925050509392505050565b5f604082019050615b575f8301866147e6565b8181036020830152615b6a818486615ae9565b9050949350505050565b5f615b86615b81846154ef565b61464c565b90508083825260208201905060208402830185811115615ba957615ba86141c1565b5b835b81811015615bd25780615bbe88826145d6565b845260208401935050602081019050615bab565b5050509392505050565b5f82601f830112615bf057615bef6141b9565b5b8135615c00848260208601615b74565b91505092915050565b5f60408284031215615c1e57615c1d6154a9565b5b615c28604061464c565b90505f615c37848285016141a5565b5f83015250602082013567ffffffffffffffff811115615c5a57615c596154ad565b5b615c6684828501615bdc565b60208301525092915050565b5f615c7d3683615c09565b9050919050565b5f81519050919050565b5f819050602082019050919050565b5f615ca883836157be565b60208301905092915050565b5f602082019050919050565b5f615cca82615c84565b615cd481856153e4565b9350615cdf83615c8e565b805f5b83811015615d0f578151615cf68882615c9d565b9750615d0183615cb4565b925050600181019050615ce2565b5085935050505092915050565b5f6020820190508181035f830152615d348184615cc0565b905092915050565b5f81519050919050565b615d4f82615d3c565b67ffffffffffffffff811115615d6857615d676145ee565b5b615d728254614c6f565b615d7d82828561508a565b5f60209050601f831160018114615dae575f8415615d9c578287015190505b615da685826150f8565b865550615e0d565b601f198416615dbc86614f76565b5f5b82811015615de357848901518255600182019150602085019450602081019050615dbe565b86831015615e005784890151615dfc601f8916826150dc565b8355505b6001600288020188555050505b505050505050565b5f6080820190508181035f830152615e2d81896158cb565b9050615e3c60208301886147e6565b8181036040830152615e4f818688614d0f565b90508181036060830152615e64818486614d0f565b9050979650505050505050565b5f604082019050615e845f830185614775565b615e9160208301846147e6565b9392505050565b5f60208284031215615ead57615eac61417e565b5b5f615eba848285016145d6565b91505092915050565b5f81905092915050565b615ed68161476c565b82525050565b5f615ee78383615ecd565b60208301905092915050565b5f615efd82615c84565b615f078185615ec3565b9350615f1283615c8e565b805f5b83811015615f42578151615f298882615edc565b9750615f3483615cb4565b925050600181019050615f15565b5085935050505092915050565b5f615f5a8284615ef3565b915081905092915050565b5f81905092915050565b5f615f7982615d3c565b615f838185615f65565b9350615f9381856020860161442a565b80840191505092915050565b5f615faa8284615f6f565b915081905092915050565b5f60a082019050615fc85f830188614775565b615fd56020830187614775565b615fe26040830186614775565b615fef6060830185614775565b615ffc6080830184614775565b9695505050505050565b5f6040820190506160195f8301856147d7565b61602660208301846147e6565b9392505050565b5f602082840312156160425761604161417e565b5b5f61604f848285016154db565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6020828403121561609a5761609961417e565b5b5f6160a7848285016154c7565b91505092915050565b5f6080820190506160c35f830187614775565b6160d06020830186614775565b6160dd6040830185614775565b6160ea6060830184614775565b95945050505050565b5f6160fd82614186565b915061610883614186565b92508282019050808211156161205761611f614c9f565b5b92915050565b5f6040820190506161395f8301856147d7565b61614660208301846147d7565b9392505050565b5f60a083015f8301516161625f8601826157be565b506020830151616175602086018261481e565b50604083015161618860408601826157be565b50606083015184820360608601526161a082826157dd565b91505060808301516161b5608086018261481e565b508091505092915050565b5f6040820190508181035f8301526161d8818561614d565b905081810360208301526161ec818461614d565b90509392505050565b5f61ffff82169050919050565b5f61621c616217616212846161f5565b614ff4565b614186565b9050919050565b61622c81616202565b82525050565b5f6040820190506162455f830185616223565b61625260208301846147d7565b9392505050565b5f61626382614186565b915061626e83614186565b925082820261627c81614186565b9150828204841483151761629357616292614c9f565b5b5092915050565b604082015f8201516162ae5f85018261481e565b5060208201516162c1602085018261481e565b50505050565b5f6060820190506162da5f8301856147d7565b6162e7602083018461629a565b9392505050565b5f6040820190506163015f8301856147e6565b81810360208301526163138184614394565b90509392505050565b5f6020820190508181035f830152616335818486614d0f565b90509392505050565b5f819050815f5260205f209050919050565b601f821115616391576163628161633e565b61636b84614f88565b8101602085101561637a578190505b61638e61638685614f88565b830182615068565b50505b505050565b61639f82614410565b67ffffffffffffffff8111156163b8576163b76145ee565b5b6163c28254614c6f565b6163cd828285616350565b5f60209050601f8311600181146163fe575f84156163ec578287015190505b6163f685826150f8565b86555061645d565b601f19841661640c8661633e565b5f5b828110156164335784890151825560018201915060208501945060208101905061640e565b86831015616450578489015161644c601f8916826150dc565b8355505b6001600288020188555050505b505050505050565b61646e816159e3565b82525050565b5f6020820190506164875f830184616465565b92915050565b6054811061649e5761649d614bfc565b5b50565b5f8190506164ae8261648d565b919050565b5f6164bd826164a1565b9050919050565b6164cd816164b3565b82525050565b5f6020820190506164e65f8301846164c4565b92915050565b5f81905092915050565b6164ff81614351565b82525050565b5f61651083836164f6565b60208301905092915050565b5f61652682614309565b61653081856164ec565b935061653b83614323565b805f5b8381101561656b5781516165528882616505565b975061655d83614388565b92505060018101905061653e565b5085935050505092915050565b5f616583828461651c565b915081905092915050565b5f60c0820190506165a15f830189614775565b6165ae6020830188614775565b6165bb6040830187614775565b6165c860608301866147d7565b6165d560808301856147d7565b6165e260a0830184614775565b979650505050505050565b5f60a0820190506166005f830188614775565b61660d6020830187614775565b61661a6040830186614775565b61662760608301856147d7565b61663460808301846147e6565b9695505050505050565b5f6080820190506166515f830187614775565b61665e6020830186616465565b61666b6040830185614775565b6166786060830184614775565b9594505050505056fe5573657244656372797074526573706f6e7365566572696669636174696f6e286279746573207075626c69634b65792c627974657333325b5d20637448616e646c65732c6279746573207573657244656372797074656453686172652c627974657320657874726144617461295075626c696344656372797074566572696669636174696f6e28627974657333325b5d20637448616e646c65732c627974657320646563727970746564526573756c742c62797465732065787472614461746129557365724465637279707452657175657374566572696669636174696f6e286279746573207075626c69634b65792c616464726573735b5d20636f6e74726163744164647265737365732c75696e7432353620737461727454696d657374616d702c75696e74323536206475726174696f6e446179732c62797465732065787472614461746129 /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\x80`@R`\x046\x10a\0\xFDW_5`\xE0\x1C\x80cX\xF5\xB8\xAB\x11a\0\x94W\x80c\x84\xB0\x19n\x11a\0cW\x80c\x84\xB0\x19n\x14a\x02\xE1W\x80c\xAD<\xB1\xCC\x14a\x03\x11W\x80c\xD8\x99\x8FE\x14a\x03;W\x80c\xF1\xB5z\xDB\x14a\x03cW\x80c\xFB\xB82Y\x14a\x03\x8BWa\0\xFDV[\x80cX\xF5\xB8\xAB\x14a\x02=W\x80c\\\x97Z\xBB\x14a\x02yW\x80co\x89\x13\xBC\x14a\x02\xA3W\x80c\x84V\xCBY\x14a\x02\xCBWa\0\xFDV[\x80c?K\xA8:\x11a\0\xD0W\x80c?K\xA8:\x14a\x01\xA5W\x80c@\x14\xC4\xCD\x14a\x01\xBBW\x80cO\x1E\xF2\x86\x14a\x01\xF7W\x80cR\xD1\x90-\x14a\x02\x13Wa\0\xFDV[\x80c\x04o\x9E\xB3\x14a\x01\x01W\x80c\t\0\xCCi\x14a\x01)W\x80c\r\x8En,\x14a\x01eW\x80c9\xF78\x10\x14a\x01\x8FW[_\x80\xFD[4\x80\x15a\x01\x0CW_\x80\xFD[Pa\x01'`\x04\x806\x03\x81\x01\x90a\x01\"\x91\x90aB\x08V[a\x03\xC7V[\0[4\x80\x15a\x014W_\x80\xFD[Pa\x01O`\x04\x806\x03\x81\x01\x90a\x01J\x91\x90aB\xCCV[a\x08SV[`@Qa\x01\\\x91\x90aC\xDEV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01pW_\x80\xFD[Pa\x01ya\t$V[`@Qa\x01\x86\x91\x90aD\x88V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x9AW_\x80\xFD[Pa\x01\xA3a\t\x9FV[\0[4\x80\x15a\x01\xB0W_\x80\xFD[Pa\x01\xB9a\x0B\xD7V[\0[4\x80\x15a\x01\xC6W_\x80\xFD[Pa\x01\xE1`\x04\x806\x03\x81\x01\x90a\x01\xDC\x91\x90aD\xFDV[a\r\x1FV[`@Qa\x01\xEE\x91\x90aE\x95V[`@Q\x80\x91\x03\x90\xF3[a\x02\x11`\x04\x806\x03\x81\x01\x90a\x02\x0C\x91\x90aG\0V[a\x0E\xACV[\0[4\x80\x15a\x02\x1EW_\x80\xFD[Pa\x02'a\x0E\xCBV[`@Qa\x024\x91\x90aGrV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02HW_\x80\xFD[Pa\x02c`\x04\x806\x03\x81\x01\x90a\x02^\x91\x90aB\xCCV[a\x0E\xFCV[`@Qa\x02p\x91\x90aE\x95V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x84W_\x80\xFD[Pa\x02\x8Da\x0F/V[`@Qa\x02\x9A\x91\x90aE\x95V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xAEW_\x80\xFD[Pa\x02\xC9`\x04\x806\x03\x81\x01\x90a\x02\xC4\x91\x90aB\x08V[a\x0FQV[\0[4\x80\x15a\x02\xD6W_\x80\xFD[Pa\x02\xDFa\x13XV[\0[4\x80\x15a\x02\xECW_\x80\xFD[Pa\x02\xF5a\x14}V[`@Qa\x03\x08\x97\x96\x95\x94\x93\x92\x91\x90aH\x9AV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03\x1CW_\x80\xFD[Pa\x03%a\x15\x86V[`@Qa\x032\x91\x90aD\x88V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03FW_\x80\xFD[Pa\x03a`\x04\x806\x03\x81\x01\x90a\x03\\\x91\x90aD\xFDV[a\x15\xBFV[\0[4\x80\x15a\x03nW_\x80\xFD[Pa\x03\x89`\x04\x806\x03\x81\x01\x90a\x03\x84\x91\x90aI\xB1V[a\x17}V[\0[4\x80\x15a\x03\x96W_\x80\xFD[Pa\x03\xB1`\x04\x806\x03\x81\x01\x90a\x03\xAC\x91\x90aJ\xEBV[a\x1C.V[`@Qa\x03\xBE\x91\x90aE\x95V[`@Q\x80\x91\x03\x90\xF3[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xE5'^\xAF3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x04\x14\x91\x90aK|V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04/W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04S\x91\x90aK\xBFV[a\x04\x94W3`@Q\x7F\xAE\xE8c#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x04\x8B\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[_a\x04\x9Da\x1E\x9DV[\x90P`\xF8`\x02`\x05\x81\x11\x15a\x04\xB5Wa\x04\xB4aK\xEAV[[\x90\x1B\x88\x11\x15\x80a\x04\xC8WP\x80`\x08\x01T\x88\x11[\x15a\x05\nW\x87`@Q\x7F\xD4\x8A\xF9B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05\x01\x91\x90aL\x17V[`@Q\x80\x91\x03\x90\xFD[_\x81`\x07\x01_\x8A\x81R` \x01\x90\x81R` \x01_ `@Q\x80`@\x01`@R\x90\x81_\x82\x01\x80Ta\x058\x90aL]V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x05d\x90aL]V[\x80\x15a\x05\xAFW\x80`\x1F\x10a\x05\x86Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x05\xAFV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x05\x92W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x06\x05W` \x02\x82\x01\x91\x90_R` _ \x90[\x81T\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x05\xF1W[PPPPP\x81RPP\x90P_`@Q\x80`\x80\x01`@R\x80\x83_\x01Q\x81R` \x01\x83` \x01Q\x81R` \x01\x8A\x8A\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81R` \x01\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81RP\x90P_a\x06\xCB\x82a\x1E\xC4V[\x90Pa\x06\xD9\x8B\x82\x8A\x8Aa\x1F\x8BV[_\x84`\x02\x01_\x8D\x81R` \x01\x90\x81R` \x01_ _\x80_\x1B\x81R` \x01\x90\x81R` \x01_ \x90P\x803\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x8B\x7F\x7F\xCD\xFBS\x81\x91\x7FUJq}\nTp\xA3?ZI\xBAdE\xF0^\xC4a\x1E\x9DV[\x90P`\xF8`\x01`\x05\x81\x11\x15a\x0BVWa\x0BUaK\xEAV[[\x90\x1B\x81`\x06\x01\x81\x90UP`\xF8`\x02`\x05\x81\x11\x15a\x0BvWa\x0BuaK\xEAV[[\x90\x1B\x81`\x08\x01\x81\x90UPP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x0B\xCB\x91\x90aN\xD5V[`@Q\x80\x91\x03\x90\xA1PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0C4W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0CX\x91\x90aO\x02V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15\x80\x15a\x0C\xD3WPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\r\x15W3`@Q\x7F\xE1\x91f\xEE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\r\x0C\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[a\r\x1Da\"\xCAV[V[_\x80_\x90P[\x85\x85\x90P\x81\x10\x15a\x0E\x9EWs\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x06 2m\x87\x87\x84\x81\x81\x10a\rsWa\rraO-V[[\x90P` \x02\x015`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\x96\x91\x90aGrV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\xB1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\r\xD5\x91\x90aK\xBFV[\x15\x80a\x0E\x83WPs\xC7\xD4Va\xA3E\xEC\\\xA0\xE8R\x1C\xFE\xF7\xE3/\xDA\r\xAAhs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xDC\x9Ao\x87\x87\x84\x81\x81\x10a\x0E\x1FWa\x0E\x1EaO-V[[\x90P` \x02\x015`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0EB\x91\x90aGrV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E]W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\x81\x91\x90aK\xBFV[\x15[\x15a\x0E\x91W_\x91PPa\x0E\xA4V[\x80\x80`\x01\x01\x91PPa\r%V[P`\x01\x90P[\x94\x93PPPPV[a\x0E\xB4a#8V[a\x0E\xBD\x82a$\x1EV[a\x0E\xC7\x82\x82a%\x11V[PPV[_a\x0E\xD4a&/V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[_\x80a\x0F\x06a\x1E\x9DV[\x90P\x80_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x80a\x0F9a&\xB6V[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x90V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xE5'^\xAF3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\x9E\x91\x90aK|V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0F\xB9W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0F\xDD\x91\x90aK\xBFV[a\x10\x1EW3`@Q\x7F\xAE\xE8c#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x10\x15\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[_a\x10'a\x1E\x9DV[\x90P`\xF8`\x01`\x05\x81\x11\x15a\x10?Wa\x10>aK\xEAV[[\x90\x1B\x88\x11\x15\x80a\x10RWP\x80`\x06\x01T\x88\x11[\x15a\x10\x94W\x87`@Q\x7F\xD4\x8A\xF9B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x10\x8B\x91\x90aL\x17V[`@Q\x80\x91\x03\x90\xFD[_`@Q\x80``\x01`@R\x80\x83`\x05\x01_\x8C\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x10\xFBW` \x02\x82\x01\x91\x90_R` _ \x90[\x81T\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x10\xE7W[PPPPP\x81R` \x01\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81R` \x01\x85\x85\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81RP\x90P_a\x11\xA1\x82a&\xDDV[\x90Pa\x11\xAF\x8A\x82\x89\x89a\x1F\x8BV[_\x83`\x04\x01_\x8C\x81R` \x01\x90\x81R` \x01_ _\x83\x81R` \x01\x90\x81R` \x01_ \x90P\x80\x88\x88\x90\x91\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x92\x90\x91\x92\x90\x91\x92\x90\x91\x92P\x91\x82a\x12\r\x92\x91\x90aQ\x01V[P\x83`\x02\x01_\x8C\x81R` \x01\x90\x81R` \x01_ _\x83\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x83_\x01_\x8C\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x12\xC3WPa\x12\xC2\x81\x80T\x90Pa'\x97V[[\x15a\x13KW`\x01\x84_\x01_\x8D\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81\x84`\x03\x01_\x8D\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x8A\x7F\xD7\xE5\x8A6z\nl)\x8Ev\xAD]$\0\x04\xE3'\xAA\x14#\xCB\xE4\xBD\x7F\xF8]Lq^\xF8\xD1_\x8B\x8B\x84\x8A\x8A`@Qa\x13B\x95\x94\x93\x92\x91\x90aS\x1CV[`@Q\x80\x91\x03\x90\xA2[PPPPPPPPPPPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cF\xFB\xF6\x8E3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x13\xA5\x91\x90aK|V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x13\xC0W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\xE4\x91\x90aK\xBFV[\x15\x80\x15a\x141WPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x14sW3`@Q\x7F8\x89\x16\xBB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14j\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[a\x14{a((V[V[_``\x80_\x80_``_a\x14\x8Fa(\x97V[\x90P_\x80\x1B\x81_\x01T\x14\x80\x15a\x14\xAAWP_\x80\x1B\x81`\x01\x01T\x14[a\x14\xE9W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14\xE0\x90aS\xB4V[`@Q\x80\x91\x03\x90\xFD[a\x14\xF1a(\xBEV[a\x14\xF9a)\\V[F0_\x80\x1B_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x15\x18Wa\x15\x17aE\xDCV[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x15FW\x81` \x01` \x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x7F\x0F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95\x94\x93\x92\x91\x90\x97P\x97P\x97P\x97P\x97P\x97P\x97PP\x90\x91\x92\x93\x94\x95\x96V[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[a\x15\xC7a)\xFAV[_\x84\x84\x90P\x03a\x16\x03W`@Q\x7F-\xE7T8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x16L\x84\x84\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa*;V[_s\xC7\xD4Va\xA3E\xEC\\\xA0\xE8R\x1C\xFE\xF7\xE3/\xDA\r\xAAhs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xA1O\x89q\x86\x86`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x16\x9C\x92\x91\x90aTJV[_`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x16\xB6W=_\x80>=_\xFD[PPPP`@Q=_\x82>=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x16\xDE\x91\x90aV\xE1V[\x90Pa\x16\xE9\x81a*\xF3V[_a\x16\xF2a\x1E\x9DV[\x90P\x80`\x06\x01_\x81T\x80\x92\x91\x90a\x17\x08\x90aW(V[\x91\x90PUP_\x81`\x06\x01T\x90P\x86\x86\x83`\x05\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x91\x90a\x177\x92\x91\x90a@\xB2V[P\x80\x7F\"\xDBH\n9\xBDrUd8\xAA\xDBJ2\xA3\xD2\xA6c\x8B\x87\xC0;\xBE\xC5\xFE\xF6\x99~\x10\x95\x87\xFF\x84\x87\x87`@Qa\x17l\x93\x92\x91\x90aY\x05V[`@Q\x80\x91\x03\x90\xA2PPPPPPPV[a\x17\x85a)\xFAV[_\x88\x80` \x01\x90a\x17\x96\x91\x90aYHV[\x90P\x03a\x17\xCFW`@Q\x7FW\xCF\xA2\x17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\n`\xFF\x16\x88\x80` \x01\x90a\x17\xE4\x91\x90aYHV[\x90P\x11\x15a\x18=W`\n\x88\x80` \x01\x90a\x17\xFE\x91\x90aYHV[\x90P`@Q\x7F\xAF\x1F\x04\x95\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x184\x92\x91\x90aY\xE6V[`@Q\x80\x91\x03\x90\xFD[a\x18V\x89\x806\x03\x81\x01\x90a\x18Q\x91\x90aZZV[a+\xD9V[a\x18\xAE\x88\x80` \x01\x90a\x18i\x91\x90aYHV[\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x88a-$V[\x15a\x19\x02W\x86\x88\x80` \x01\x90a\x18\xC4\x91\x90aYHV[`@Q\x7F\xDCMx\xB1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x18\xF9\x93\x92\x91\x90a[\x0BV[`@Q\x80\x91\x03\x90\xFD[_a\x19]\x8C\x8C\x8B\x80` \x01\x90a\x19\x18\x91\x90aYHV[\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x8Ba-\xA2V[\x90P_`@Q\x80`\xA0\x01`@R\x80\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81R` \x01\x8B\x80` \x01\x90a\x19\xC4\x91\x90aYHV[\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81R` \x01\x8C_\x015\x81R` \x01\x8C` \x015\x81R` \x01\x85\x85\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81RP\x90Pa\x1At\x81\x8A\x88\x88\x8E_\x015a/\x95V[_s\xC7\xD4Va\xA3E\xEC\\\xA0\xE8R\x1C\xFE\xF7\xE3/\xDA\r\xAAhs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xA1O\x89q\x84`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1A\xC2\x91\x90a[\xD3V[_`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1A\xDCW=_\x80>=_\xFD[PPPP`@Q=_\x82>=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1B\x04\x91\x90aV\xE1V[\x90Pa\x1B\x0F\x81a*\xF3V[_a\x1B\x18a\x1E\x9DV[\x90P\x80`\x08\x01_\x81T\x80\x92\x91\x90a\x1B.\x90aW(V[\x91\x90PUP_\x81`\x08\x01T\x90P`@Q\x80`@\x01`@R\x80\x8C\x8C\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81R` \x01\x86\x81RP\x82`\x07\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01\x90\x81a\x1B\xB9\x91\x90a[\xFDV[P` \x82\x01Q\x81`\x01\x01\x90\x80Q\x90` \x01\x90a\x1B\xD6\x92\x91\x90a@\xFDV[P\x90PP\x80\x7F\xF9\x01\x1B\xD6\xBA\r\xA6\x04\x9CR\rp\xFEYq\xF1~\xD7\xAByT\x86\x05%D\xB5\x10\x19\x89lYk\x84\x8E\x8E\x8E\x8C\x8C`@Qa\x1C\x14\x96\x95\x94\x93\x92\x91\x90a\\\xCCV[`@Q\x80\x91\x03\x90\xA2PPPPPPPPPPPPPPPPV[_\x80_\x90P[\x85\x85\x90P\x81\x10\x15a\x1E\x8EWs\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC6R\x8Fi\x87\x87\x84\x81\x81\x10a\x1C\x82Wa\x1C\x81aO-V[[\x90P`@\x02\x01_\x015\x89`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1C\xA9\x92\x91\x90a](V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1C\xC4W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1C\xE8\x91\x90aK\xBFV[\x15\x80a\x1D\xC4WPs\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC6R\x8Fi\x87\x87\x84\x81\x81\x10a\x1D2Wa\x1D1aO-V[[\x90P`@\x02\x01_\x015\x88\x88\x85\x81\x81\x10a\x1DNWa\x1DMaO-V[[\x90P`@\x02\x01` \x01` \x81\x01\x90a\x1Df\x91\x90a]OV[`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\x83\x92\x91\x90a](V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1D\x9EW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1D\xC2\x91\x90aK\xBFV[\x15[\x80a\x1EsWPs\xC7\xD4Va\xA3E\xEC\\\xA0\xE8R\x1C\xFE\xF7\xE3/\xDA\r\xAAhs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xDC\x9Ao\x87\x87\x84\x81\x81\x10a\x1E\rWa\x1E\x0CaO-V[[\x90P`@\x02\x01_\x015`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E2\x91\x90aGrV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1EMW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1Eq\x91\x90aK\xBFV[\x15[\x15a\x1E\x81W_\x91PPa\x1E\x94V[\x80\x80`\x01\x01\x91PPa\x1C4V[P`\x01\x90P[\x95\x94PPPPPV[_\x7Fh\x11>h\xAFILn\xFD\x02\x10\xFCK\xF9\xBAt\x8D\x1F\xFA\xDA\xA4q\x82\x17\xFD\xF65H\xC4\xAE\xE7\0\x90P\x90V[_a\x1F\x84`@Q\x80`\xA0\x01`@R\x80`m\x81R` \x01ae&`m\x919\x80Q\x90` \x01 \x83_\x01Q\x80Q\x90` \x01 \x84` \x01Q`@Q` \x01a\x1F\x08\x91\x90a^\x06V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x85`@\x01Q\x80Q\x90` \x01 \x86``\x01Q`@Q` \x01a\x1F?\x91\x90a^VV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a\x1Fi\x95\x94\x93\x92\x91\x90a^lV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 a0mV[\x90P\x91\x90PV[_a\x1F\x94a\x1E\x9DV[\x90P_a\x1F\xE4\x85\x85\x85\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa0\x86V[\x90Pa\x1F\xEF\x81a0\xB0V[\x81`\x01\x01_\x87\x81R` \x01\x90\x81R` \x01_ _\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a \x8EW\x85\x81`@Q\x7F\x99\xECH\xD9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a \x85\x92\x91\x90a^\xBDV[`@Q\x80\x91\x03\x90\xFD[`\x01\x82`\x01\x01_\x88\x81R` \x01\x90\x81R` \x01_ _\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UPPPPPPPV[_\x80s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC2\xB4)\x86`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a![W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a!\x7F\x91\x90a^\xE4V[\x90P\x80\x83\x10\x15\x91PP\x91\x90PV[``_`\x01a!\x9B\x84a1\x80V[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!\xB9Wa!\xB8aE\xDCV[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a!\xEBW\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a\"LW\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a\"AWa\"@a_\x0FV[[\x04\x94P_\x85\x03a!\xF8W[\x81\x93PPPP\x91\x90PV[_a\"`a\"{V[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[a\"\xAAa2\xD1V[a\"\xB4\x82\x82a3\x11V[PPV[a\"\xC0a2\xD1V[a\"\xC8a3bV[V[a\"\xD2a3\x92V[_a\"\xDBa&\xB6V[\x90P_\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F]\xB9\xEE\nI[\xF2\xE6\xFF\x9C\x91\xA7\x83L\x1B\xA4\xFD\xD2D\xA5\xE8\xAANS{\xD3\x8A\xEA\xE4\xB0s\xAAa# a3\xD2V[`@Qa#-\x91\x90aK|V[`@Q\x80\x91\x03\x90\xA1PV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a#\xE5WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a#\xCCa3\xD9V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a$\x1CW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a${W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a$\x9F\x91\x90aO\x02V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a%\x0EW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%\x05\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a%yWP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a%v\x91\x90a_ v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a& W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a&\x17\x91\x90aGrV[`@Q\x80\x91\x03\x90\xFD[a&*\x83\x83a4,V[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a&\xB4W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x7F\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\x90P\x90V[_a'\x90`@Q\x80`\x80\x01`@R\x80`T\x81R` \x01ae\x93`T\x919\x80Q\x90` \x01 \x83_\x01Q`@Q` \x01a'\x15\x91\x90a^\x06V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x84` \x01Q\x80Q\x90` \x01 \x85`@\x01Q`@Q` \x01a'L\x91\x90a^VV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a'u\x94\x93\x92\x91\x90a_gV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 a0mV[\x90P\x91\x90PV[_\x80s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c*8\x89\x98`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a'\xF6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a(\x1A\x91\x90a^\xE4V[\x90P\x80\x83\x10\x15\x91PP\x91\x90PV[a(0a)\xFAV[_a(9a&\xB6V[\x90P`\x01\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2Xa(\x7Fa3\xD2V[`@Qa(\x8C\x91\x90aK|V[`@Q\x80\x91\x03\x90\xA1PV[_\x7F\xA1jF\xD9Ba\xC7Q|\xC8\xFF\x89\xF6\x1C\x0C\xE95\x98\xE3\xC8I\x80\x10\x11\xDE\xE6I\xA6\xA5W\xD1\0\x90P\x90V[``_a(\xC9a(\x97V[\x90P\x80`\x02\x01\x80Ta(\xDA\x90aL]V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta)\x06\x90aL]V[\x80\x15a)QW\x80`\x1F\x10a)(Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a)QV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a)4W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[``_a)ga(\x97V[\x90P\x80`\x03\x01\x80Ta)x\x90aL]V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta)\xA4\x90aL]V[\x80\x15a)\xEFW\x80`\x1F\x10a)\xC6Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a)\xEFV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a)\xD2W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[a*\x02a\x0F/V[\x15a*9W`@Q\x7F\xD9<\x06e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80[\x82Q\x81\x10\x15a*\xA3W_\x83\x82\x81Q\x81\x10a*[Wa*ZaO-V[[` \x02` \x01\x01Q\x90P_a*o\x82a4\x9EV[\x90Pa*z\x81a5(V[a\xFF\xFF\x16\x84a*\x89\x91\x90a_\xAAV[\x93Pa*\x94\x82a7\x13V[PP\x80\x80`\x01\x01\x91PPa*>V[Pa\x08\0\x81\x11\x15a*\xEFWa\x08\0\x81`@Q\x7F\xE7\xF4\x89]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a*\xE6\x92\x91\x90a_\xDDV[`@Q\x80\x91\x03\x90\xFD[PPV[`\x01\x81Q\x11\x15a+\xD6W_\x81_\x81Q\x81\x10a+\x11Wa+\x10aO-V[[` \x02` \x01\x01Q` \x01Q\x90P_`\x01\x90P[\x82Q\x81\x10\x15a+\xD3W\x81\x83\x82\x81Q\x81\x10a+BWa+AaO-V[[` \x02` \x01\x01Q` \x01Q\x14a+\xC6W\x82_\x81Q\x81\x10a+fWa+eaO-V[[` \x02` \x01\x01Q\x83\x82\x81Q\x81\x10a+\x81Wa+\x80aO-V[[` \x02` \x01\x01Q`@Q\x7F\xCF\xAE\x92\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a+\xBD\x92\x91\x90a`dV[`@Q\x80\x91\x03\x90\xFD[\x80\x80`\x01\x01\x91PPa+%V[PP[PV[_\x81` \x01Q\x03a,\x16W`@Q\x7F\xDE(Y\xC1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x01ma\xFF\xFF\x16\x81` \x01Q\x11\x15a,mWa\x01m\x81` \x01Q`@Q\x7F2\x95\x18c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a,d\x92\x91\x90a`\xD6V[`@Q\x80\x91\x03\x90\xFD[B\x81_\x01Q\x11\x15a,\xBAWB\x81_\x01Q`@Q\x7F\xF2L\x08\x87\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a,\xB1\x92\x91\x90a_\xDDV[`@Q\x80\x91\x03\x90\xFD[Bb\x01Q\x80\x82` \x01Qa,\xCE\x91\x90a`\xFDV[\x82_\x01Qa,\xDC\x91\x90a_\xAAV[\x10\x15a-!WB\x81`@Q\x7F04\x80@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a-\x18\x92\x91\x90aakV[`@Q\x80\x91\x03\x90\xFD[PV[_\x80_\x90P[\x83Q\x81\x10\x15a-\x97W\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84\x82\x81Q\x81\x10a-]Wa-\\aO-V[[` \x02` \x01\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a-\x8AW`\x01\x91PPa-\x9CV[\x80\x80`\x01\x01\x91PPa-*V[P_\x90P[\x92\x91PPV[``_\x85\x85\x90P\x03a-\xE0W`@Q\x7F\xA6\xA6\xCB!\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84\x84\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a-\xFDWa-\xFCaE\xDCV[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a.+W\x81` \x01` \x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x80[\x86\x86\x90P\x81\x10\x15a/@W_\x87\x87\x83\x81\x81\x10a.PWa.OaO-V[[\x90P`@\x02\x01_\x015\x90P_\x88\x88\x84\x81\x81\x10a.oWa.naO-V[[\x90P`@\x02\x01` \x01` \x81\x01\x90a.\x87\x91\x90a]OV[\x90P_a.\x93\x83a4\x9EV[\x90Pa.\x9E\x81a5(V[a\xFF\xFF\x16\x85a.\xAD\x91\x90a_\xAAV[\x94Pa.\xB9\x83\x88a7\xE3V[a.\xC3\x83\x83a7\xE3V[a.\xCD\x88\x83a-$V[a/\x10W\x81\x88`@Q\x7F\xA4\xC3\x03\x91\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a/\x07\x92\x91\x90aa\x92V[`@Q\x80\x91\x03\x90\xFD[\x82\x86\x85\x81Q\x81\x10a/$Wa/#aO-V[[` \x02` \x01\x01\x81\x81RPPPPP\x80\x80`\x01\x01\x91PPa.1V[Pa\x08\0\x81\x11\x15a/\x8CWa\x08\0\x81`@Q\x7F\xE7\xF4\x89]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a/\x83\x92\x91\x90a_\xDDV[`@Q\x80\x91\x03\x90\xFD[P\x94\x93PPPPV[_a/\xA0\x86\x83a8\xB8V[\x90P_a/\xF0\x82\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa0\x86V[\x90P\x85s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a0dW\x84\x84`@Q\x7F*\x87='\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a0[\x92\x91\x90aa\xC0V[`@Q\x80\x91\x03\x90\xFD[PPPPPPPV[_a0\x7Fa0ya9\x85V[\x83a9\x93V[\x90P\x91\x90PV[_\x80_\x80a0\x94\x86\x86a9\xD3V[\x92P\x92P\x92Pa0\xA4\x82\x82a:(V[\x82\x93PPPP\x92\x91PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c =\x01\x14\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a0\xFD\x91\x90aK|V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a1\x18W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a1<\x91\x90aK\xBFV[a1}W\x80`@Q\x7F*|n\xF6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a1t\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[PV[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a1\xDCWz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a1\xD2Wa1\xD1a_\x0FV[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a2\x19Wm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a2\x0FWa2\x0Ea_\x0FV[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a2HWf#\x86\xF2o\xC1\0\0\x83\x81a2>Wa2=a_\x0FV[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a2qWc\x05\xF5\xE1\0\x83\x81a2gWa2fa_\x0FV[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a2\x96Wa'\x10\x83\x81a2\x8CWa2\x8Ba_\x0FV[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a2\xB9W`d\x83\x81a2\xAFWa2\xAEa_\x0FV[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a2\xC8W`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[a2\xD9a;\x8AV[a3\x0FW`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a3\x19a2\xD1V[_a3\"a(\x97V[\x90P\x82\x81`\x02\x01\x90\x81a35\x91\x90ab:V[P\x81\x81`\x03\x01\x90\x81a3G\x91\x90ab:V[P_\x80\x1B\x81_\x01\x81\x90UP_\x80\x1B\x81`\x01\x01\x81\x90UPPPPV[a3ja2\xD1V[_a3sa&\xB6V[\x90P_\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UPPV[a3\x9Aa\x0F/V[a3\xD0W`@Q\x7F\x8D\xFC +\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_3\x90P\x90V[_a4\x05\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba;\xA8V[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a45\x82a;\xB1V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a4\x91Wa4\x8B\x82\x82a=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a7\x9F\x91\x90aK\xBFV[a7\xE0W\x80`@Q\x7FC1\xA8]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a7\xD7\x91\x90aGrV[`@Q\x80\x91\x03\x90\xFD[PV[s\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC6R\x8Fi\x83\x83`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a82\x92\x91\x90a](V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a8MW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a8q\x91\x90aK\xBFV[a8\xB4W\x81\x81`@Q\x7F\x16\n+K\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a8\xAB\x92\x91\x90a](V[`@Q\x80\x91\x03\x90\xFD[PPV[_\x80`@Q\x80`\xC0\x01`@R\x80`\x87\x81R` \x01ae\xE7`\x87\x919\x80Q\x90` \x01 \x84_\x01Q\x80Q\x90` \x01 \x85` \x01Q`@Q` \x01a8\xFA\x91\x90ad\x1CV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x86`@\x01Q\x87``\x01Q\x88`\x80\x01Q`@Q` \x01a9/\x91\x90a^VV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a9Z\x96\x95\x94\x93\x92\x91\x90ad2V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90Pa9|\x83\x82a=6V[\x91PP\x92\x91PPV[_a9\x8Ea=\xAAV[\x90P\x90V[_`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x83`\x02\x82\x01R\x82`\"\x82\x01R`B\x81 \x91PP\x92\x91PPV[_\x80_`A\x84Q\x03a:\x13W_\x80_` \x87\x01Q\x92P`@\x87\x01Q\x91P``\x87\x01Q_\x1A\x90Pa:\x05\x88\x82\x85\x85a>\rV[\x95P\x95P\x95PPPPa:!V[_`\x02\x85Q_\x1B\x92P\x92P\x92P[\x92P\x92P\x92V[_`\x03\x81\x11\x15a:;Wa::aK\xEAV[[\x82`\x03\x81\x11\x15a:NWa:MaK\xEAV[[\x03\x15a;\x86W`\x01`\x03\x81\x11\x15a:hWa:gaK\xEAV[[\x82`\x03\x81\x11\x15a:{Wa:zaK\xEAV[[\x03a:\xB2W`@Q\x7F\xF6E\xEE\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02`\x03\x81\x11\x15a:\xC6Wa:\xC5aK\xEAV[[\x82`\x03\x81\x11\x15a:\xD9Wa:\xD8aK\xEAV[[\x03a;\x1DW\x80_\x1C`@Q\x7F\xFC\xE6\x98\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a;\x14\x91\x90aL\x17V[`@Q\x80\x91\x03\x90\xFD[`\x03\x80\x81\x11\x15a;0Wa;/aK\xEAV[[\x82`\x03\x81\x11\x15a;CWa;BaK\xEAV[[\x03a;\x85W\x80`@Q\x7F\xD7\x8B\xCE\x0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a;|\x91\x90aGrV[`@Q\x80\x91\x03\x90\xFD[[PPV[_a;\x93a\"{V[_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x90P\x90V[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a<\x0CW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a<\x03\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[\x80a<8\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba;\xA8V[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa<\xA3\x91\x90a^VV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a<\xDBW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a<\xE0V[``\x91P[P\x91P\x91Pa<\xF0\x85\x83\x83a>\xF4V[\x92PPP\x92\x91PPV[_4\x11\x15a=4W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80\x7F\x8Bs\xC3\xC6\x9B\xB8\xFE=Q.\xCCL\xF7Y\xCCy#\x9F{\x17\x9B\x0F\xFA\xCA\xA9\xA7]R+9@\x0Fa=aa?\x81V[a=ia?\xF7V[\x860`@Q` \x01a=\x7F\x95\x94\x93\x92\x91\x90ad\x91V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90Pa=\xA1\x81\x84a9\x93V[\x91PP\x92\x91PPV[_\x7F\x8Bs\xC3\xC6\x9B\xB8\xFE=Q.\xCCL\xF7Y\xCCy#\x9F{\x17\x9B\x0F\xFA\xCA\xA9\xA7]R+9@\x0Fa=\xD4a?\x81V[a=\xDCa?\xF7V[F0`@Q` \x01a=\xF2\x95\x94\x93\x92\x91\x90ad\x91V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x90V[_\x80_\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84_\x1C\x11\x15a>IW_`\x03\x85\x92P\x92P\x92Pa>\xEAV[_`\x01\x88\x88\x88\x88`@Q_\x81R` \x01`@R`@Qa>l\x94\x93\x92\x91\x90ad\xE2V[` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a>\x8CW=_\x80>=_\xFD[PPP` `@Q\x03Q\x90P_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a>\xDDW_`\x01_\x80\x1B\x93P\x93P\x93PPa>\xEAV[\x80_\x80_\x1B\x93P\x93P\x93PP[\x94P\x94P\x94\x91PPV[``\x82a?\tWa?\x04\x82a@nV[a?yV[_\x82Q\x14\x80\x15a?/WP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a?qW\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a?h\x91\x90aK|V[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa?zV[[\x93\x92PPPV[_\x80a?\x8Ba(\x97V[\x90P_a?\x96a(\xBEV[\x90P_\x81Q\x11\x15a?\xB2W\x80\x80Q\x90` \x01 \x92PPPa?\xF4V[_\x82_\x01T\x90P_\x80\x1B\x81\x14a?\xCDW\x80\x93PPPPa?\xF4V[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x80a@\x01a(\x97V[\x90P_a@\x0Ca)\\V[\x90P_\x81Q\x11\x15a@(W\x80\x80Q\x90` \x01 \x92PPPa@kV[_\x82`\x01\x01T\x90P_\x80\x1B\x81\x14a@DW\x80\x93PPPPa@kV[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x81Q\x11\x15a@\x80W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82\x80T\x82\x82U\x90_R` _ \x90\x81\x01\x92\x82\x15a@\xECW\x91` \x02\x82\x01[\x82\x81\x11\x15a@\xEBW\x825\x82U\x91` \x01\x91\x90`\x01\x01\x90a@\xD0V[[P\x90Pa@\xF9\x91\x90aAHV[P\x90V[\x82\x80T\x82\x82U\x90_R` _ \x90\x81\x01\x92\x82\x15aA7W\x91` \x02\x82\x01[\x82\x81\x11\x15aA6W\x82Q\x82U\x91` \x01\x91\x90`\x01\x01\x90aA\x1BV[[P\x90PaAD\x91\x90aAHV[P\x90V[[\x80\x82\x11\x15aA_W_\x81_\x90UP`\x01\x01aAIV[P\x90V[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[aA\x86\x81aAtV[\x81\x14aA\x90W_\x80\xFD[PV[_\x815\x90PaA\xA1\x81aA}V[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12aA\xC8WaA\xC7aA\xA7V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aA\xE5WaA\xE4aA\xABV[[` \x83\x01\x91P\x83`\x01\x82\x02\x83\x01\x11\x15aB\x01WaB\0aA\xAFV[[\x92P\x92\x90PV[_\x80_\x80_\x80_`\x80\x88\x8A\x03\x12\x15aB#WaB\"aAlV[[_aB0\x8A\x82\x8B\x01aA\x93V[\x97PP` \x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aBQWaBPaApV[[aB]\x8A\x82\x8B\x01aA\xB3V[\x96P\x96PP`@\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aB\x80WaB\x7FaApV[[aB\x8C\x8A\x82\x8B\x01aA\xB3V[\x94P\x94PP``\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aB\xAFWaB\xAEaApV[[aB\xBB\x8A\x82\x8B\x01aA\xB3V[\x92P\x92PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[_` \x82\x84\x03\x12\x15aB\xE1WaB\xE0aAlV[[_aB\xEE\x84\x82\x85\x01aA\x93V[\x91PP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_aCI\x82aC V[\x90P\x91\x90PV[aCY\x81aC?V[\x82RPPV[_aCj\x83\x83aCPV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aC\x8C\x82aB\xF7V[aC\x96\x81\x85aC\x01V[\x93PaC\xA1\x83aC\x11V[\x80_[\x83\x81\x10\x15aC\xD1W\x81QaC\xB8\x88\x82aC_V[\x97PaC\xC3\x83aCvV[\x92PP`\x01\x81\x01\x90PaC\xA4V[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaC\xF6\x81\x84aC\x82V[\x90P\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15aD5W\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90PaD\x1AV[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_aDZ\x82aC\xFEV[aDd\x81\x85aD\x08V[\x93PaDt\x81\x85` \x86\x01aD\x18V[aD}\x81aD@V[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaD\xA0\x81\x84aDPV[\x90P\x92\x91PPV[_\x80\x83`\x1F\x84\x01\x12aD\xBDWaD\xBCaA\xA7V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aD\xDAWaD\xD9aA\xABV[[` \x83\x01\x91P\x83` \x82\x02\x83\x01\x11\x15aD\xF6WaD\xF5aA\xAFV[[\x92P\x92\x90PV[_\x80_\x80`@\x85\x87\x03\x12\x15aE\x15WaE\x14aAlV[[_\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aE2WaE1aApV[[aE>\x87\x82\x88\x01aD\xA8V[\x94P\x94PP` \x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aEaWaE`aApV[[aEm\x87\x82\x88\x01aA\xB3V[\x92P\x92PP\x92\x95\x91\x94P\x92PV[_\x81\x15\x15\x90P\x91\x90PV[aE\x8F\x81aE{V[\x82RPPV[_` \x82\x01\x90PaE\xA8_\x83\x01\x84aE\x86V[\x92\x91PPV[aE\xB7\x81aC?V[\x81\x14aE\xC1W_\x80\xFD[PV[_\x815\x90PaE\xD2\x81aE\xAEV[\x92\x91PPV[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[aF\x12\x82aD@V[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15aF1WaF0aE\xDCV[[\x80`@RPPPV[_aFCaAcV[\x90PaFO\x82\x82aF\tV[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aFnWaFmaE\xDCV[[aFw\x82aD@V[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_aF\xA4aF\x9F\x84aFTV[aF:V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15aF\xC0WaF\xBFaE\xD8V[[aF\xCB\x84\x82\x85aF\x84V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aF\xE7WaF\xE6aA\xA7V[[\x815aF\xF7\x84\x82` \x86\x01aF\x92V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15aG\x16WaG\x15aAlV[[_aG#\x85\x82\x86\x01aE\xC4V[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aGDWaGCaApV[[aGP\x85\x82\x86\x01aF\xD3V[\x91PP\x92P\x92\x90PV[_\x81\x90P\x91\x90PV[aGl\x81aGZV[\x82RPPV[_` \x82\x01\x90PaG\x85_\x83\x01\x84aGcV[\x92\x91PPV[_\x7F\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x82\x16\x90P\x91\x90PV[aG\xBF\x81aG\x8BV[\x82RPPV[aG\xCE\x81aAtV[\x82RPPV[aG\xDD\x81aC?V[\x82RPPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[aH\x15\x81aAtV[\x82RPPV[_aH&\x83\x83aH\x0CV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aHH\x82aG\xE3V[aHR\x81\x85aG\xEDV[\x93PaH]\x83aG\xFDV[\x80_[\x83\x81\x10\x15aH\x8DW\x81QaHt\x88\x82aH\x1BV[\x97PaH\x7F\x83aH2V[\x92PP`\x01\x81\x01\x90PaH`V[P\x85\x93PPPP\x92\x91PPV[_`\xE0\x82\x01\x90PaH\xAD_\x83\x01\x8AaG\xB6V[\x81\x81\x03` \x83\x01RaH\xBF\x81\x89aDPV[\x90P\x81\x81\x03`@\x83\x01RaH\xD3\x81\x88aDPV[\x90PaH\xE2``\x83\x01\x87aG\xC5V[aH\xEF`\x80\x83\x01\x86aG\xD4V[aH\xFC`\xA0\x83\x01\x85aGcV[\x81\x81\x03`\xC0\x83\x01RaI\x0E\x81\x84aH>V[\x90P\x98\x97PPPPPPPPV[_\x80\x83`\x1F\x84\x01\x12aI1WaI0aA\xA7V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aINWaIMaA\xABV[[` \x83\x01\x91P\x83`@\x82\x02\x83\x01\x11\x15aIjWaIiaA\xAFV[[\x92P\x92\x90PV[_\x80\xFD[_`@\x82\x84\x03\x12\x15aI\x8AWaI\x89aIqV[[\x81\x90P\x92\x91PPV[_`@\x82\x84\x03\x12\x15aI\xA8WaI\xA7aIqV[[\x81\x90P\x92\x91PPV[_\x80_\x80_\x80_\x80_\x80_a\x01\0\x8C\x8E\x03\x12\x15aI\xD1WaI\xD0aAlV[[_\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aI\xEEWaI\xEDaApV[[aI\xFA\x8E\x82\x8F\x01aI\x1CV[\x9BP\x9BPP` aJ\r\x8E\x82\x8F\x01aIuV[\x99PP``\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ.WaJ-aApV[[aJ:\x8E\x82\x8F\x01aI\x93V[\x98PP`\x80aJK\x8E\x82\x8F\x01aE\xC4V[\x97PP`\xA0\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJlWaJkaApV[[aJx\x8E\x82\x8F\x01aA\xB3V[\x96P\x96PP`\xC0\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ\x9BWaJ\x9AaApV[[aJ\xA7\x8E\x82\x8F\x01aA\xB3V[\x94P\x94PP`\xE0\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ\xCAWaJ\xC9aApV[[aJ\xD6\x8E\x82\x8F\x01aA\xB3V[\x92P\x92PP\x92\x95\x98\x9BP\x92\x95\x98\x9B\x90\x93\x96\x99PV[_\x80_\x80_``\x86\x88\x03\x12\x15aK\x04WaK\x03aAlV[[_aK\x11\x88\x82\x89\x01aE\xC4V[\x95PP` \x86\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aK2WaK1aApV[[aK>\x88\x82\x89\x01aI\x1CV[\x94P\x94PP`@\x86\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aKaWaK`aApV[[aKm\x88\x82\x89\x01aA\xB3V[\x92P\x92PP\x92\x95P\x92\x95\x90\x93PV[_` \x82\x01\x90PaK\x8F_\x83\x01\x84aG\xD4V[\x92\x91PPV[aK\x9E\x81aE{V[\x81\x14aK\xA8W_\x80\xFD[PV[_\x81Q\x90PaK\xB9\x81aK\x95V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aK\xD4WaK\xD3aAlV[[_aK\xE1\x84\x82\x85\x01aK\xABV[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[_` \x82\x01\x90PaL*_\x83\x01\x84aG\xC5V[\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\"`\x04R`$_\xFD[_`\x02\x82\x04\x90P`\x01\x82\x16\x80aLtW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aL\x87WaL\x86aL0V[[P\x91\x90PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_aL\xC4\x82aAtV[\x91PaL\xCF\x83aAtV[\x92P\x82\x82\x03\x90P\x81\x81\x11\x15aL\xE7WaL\xE6aL\x8DV[[\x92\x91PPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aM\x08\x83\x85aL\xEDV[\x93PaM\x15\x83\x85\x84aF\x84V[aM\x1E\x83aD@V[\x84\x01\x90P\x93\x92PPPV[_`\x80\x82\x01\x90PaM<_\x83\x01\x8AaG\xC5V[\x81\x81\x03` \x83\x01RaMO\x81\x88\x8AaL\xFDV[\x90P\x81\x81\x03`@\x83\x01RaMd\x81\x86\x88aL\xFDV[\x90P\x81\x81\x03``\x83\x01RaMy\x81\x84\x86aL\xFDV[\x90P\x98\x97PPPPPPPPV[_\x81\x90P\x92\x91PPV[_aM\x9B\x82aC\xFEV[aM\xA5\x81\x85aM\x87V[\x93PaM\xB5\x81\x85` \x86\x01aD\x18V[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aM\xF5`\x02\x83aM\x87V[\x91PaN\0\x82aM\xC1V[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aN?`\x01\x83aM\x87V[\x91PaNJ\x82aN\x0BV[`\x01\x82\x01\x90P\x91\x90PV[_aN`\x82\x87aM\x91V[\x91PaNk\x82aM\xE9V[\x91PaNw\x82\x86aM\x91V[\x91PaN\x82\x82aN3V[\x91PaN\x8E\x82\x85aM\x91V[\x91PaN\x99\x82aN3V[\x91PaN\xA5\x82\x84aM\x91V[\x91P\x81\x90P\x95\x94PPPPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[aN\xCF\x81aN\xB3V[\x82RPPV[_` \x82\x01\x90PaN\xE8_\x83\x01\x84aN\xC6V[\x92\x91PPV[_\x81Q\x90PaN\xFC\x81aE\xAEV[\x92\x91PPV[_` \x82\x84\x03\x12\x15aO\x17WaO\x16aAlV[[_aO$\x84\x82\x85\x01aN\xEEV[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`2`\x04R`$_\xFD[_\x82\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_` `\x1F\x83\x01\x04\x90P\x91\x90PV[_\x82\x82\x1B\x90P\x92\x91PPV[_`\x08\x83\x02aO\xC0\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82aO\x85V[aO\xCA\x86\x83aO\x85V[\x95P\x80\x19\x84\x16\x93P\x80\x86\x16\x84\x17\x92PPP\x93\x92PPPV[_\x81\x90P\x91\x90PV[_aP\x05aP\0aO\xFB\x84aAtV[aO\xE2V[aAtV[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[aP\x1E\x83aO\xEBV[aP2aP*\x82aP\x0CV[\x84\x84TaO\x91V[\x82UPPPPV[_\x90V[aPFaP:V[aPQ\x81\x84\x84aP\x15V[PPPV[[\x81\x81\x10\x15aPtWaPi_\x82aP>V[`\x01\x81\x01\x90PaPWV[PPV[`\x1F\x82\x11\x15aP\xB9WaP\x8A\x81aOdV[aP\x93\x84aOvV[\x81\x01` \x85\x10\x15aP\xA2W\x81\x90P[aP\xB6aP\xAE\x85aOvV[\x83\x01\x82aPVV[PP[PPPV[_\x82\x82\x1C\x90P\x92\x91PPV[_aP\xD9_\x19\x84`\x08\x02aP\xBEV[\x19\x80\x83\x16\x91PP\x92\x91PPV[_aP\xF1\x83\x83aP\xCAV[\x91P\x82`\x02\x02\x82\x17\x90P\x92\x91PPV[aQ\x0B\x83\x83aOZV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aQ$WaQ#aE\xDCV[[aQ.\x82TaL]V[aQ9\x82\x82\x85aPxV[_`\x1F\x83\x11`\x01\x81\x14aQfW_\x84\x15aQTW\x82\x87\x015\x90P[aQ^\x85\x82aP\xE6V[\x86UPaQ\xC5V[`\x1F\x19\x84\x16aQt\x86aOdV[_[\x82\x81\x10\x15aQ\x9BW\x84\x89\x015\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90PaQvV[\x86\x83\x10\x15aQ\xB8W\x84\x89\x015aQ\xB4`\x1F\x89\x16\x82aP\xCAV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPPV[_\x81T\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81TaR\x16\x81aL]V[aR \x81\x86aQ\xFAV[\x94P`\x01\x82\x16_\x81\x14aR:W`\x01\x81\x14aRPWaR\x82V[`\xFF\x19\x83\x16\x86R\x81\x15\x15` \x02\x86\x01\x93PaR\x82V[aRY\x85aOdV[_[\x83\x81\x10\x15aRzW\x81T\x81\x89\x01R`\x01\x82\x01\x91P` \x81\x01\x90PaR[V[\x80\x88\x01\x95PPP[PPP\x92\x91PPV[_aR\x96\x83\x83aR\nV[\x90P\x92\x91PPV[_`\x01\x82\x01\x90P\x91\x90PV[_aR\xB4\x82aQ\xCEV[aR\xBE\x81\x85aQ\xD8V[\x93P\x83` \x82\x02\x85\x01aR\xD0\x85aQ\xE8V[\x80_[\x85\x81\x10\x15aS\nW\x84\x84\x03\x89R\x81aR\xEB\x85\x82aR\x8BV[\x94PaR\xF6\x83aR\x9EV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaR\xD3V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_``\x82\x01\x90P\x81\x81\x03_\x83\x01RaS5\x81\x87\x89aL\xFDV[\x90P\x81\x81\x03` \x83\x01RaSI\x81\x86aR\xAAV[\x90P\x81\x81\x03`@\x83\x01RaS^\x81\x84\x86aL\xFDV[\x90P\x96\x95PPPPPPV[\x7FEIP712: Uninitialized\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aS\x9E`\x15\x83aD\x08V[\x91PaS\xA9\x82aSjV[` \x82\x01\x90P\x91\x90PV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaS\xCB\x81aS\x92V[\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x80\xFD[\x82\x81\x837PPPV[_aS\xFA\x83\x85aS\xD2V[\x93P\x7F\x07\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x11\x15aT-WaT,aS\xE2V[[` \x83\x02\x92PaT>\x83\x85\x84aS\xE6V[\x82\x84\x01\x90P\x93\x92PPPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaTc\x81\x84\x86aS\xEFV[\x90P\x93\x92PPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aT\x86WaT\x85aE\xDCV[[` \x82\x02\x90P` \x81\x01\x90P\x91\x90PV[_\x80\xFD[_\x80\xFD[aT\xA8\x81aGZV[\x81\x14aT\xB2W_\x80\xFD[PV[_\x81Q\x90PaT\xC3\x81aT\x9FV[\x92\x91PPV[_\x81Q\x90PaT\xD7\x81aA}V[\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aT\xF7WaT\xF6aE\xDCV[[` \x82\x02\x90P` \x81\x01\x90P\x91\x90PV[_aU\x1AaU\x15\x84aT\xDDV[aF:V[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15aU=WaUV[\x93\x92PPPV[_`@\x82\x01\x90Paa\xA5_\x83\x01\x85aG\xD4V[\x81\x81\x03` \x83\x01Raa\xB7\x81\x84aC\x82V[\x90P\x93\x92PPPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Raa\xD9\x81\x84\x86aL\xFDV[\x90P\x93\x92PPPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[`\x1F\x82\x11\x15ab5Wab\x06\x81aa\xE2V[ab\x0F\x84aOvV[\x81\x01` \x85\x10\x15ab\x1EW\x81\x90P[ab2ab*\x85aOvV[\x83\x01\x82aPVV[PP[PPPV[abC\x82aC\xFEV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15ab\\Wab[aE\xDCV[[abf\x82TaL]V[abq\x82\x82\x85aa\xF4V[_` \x90P`\x1F\x83\x11`\x01\x81\x14ab\xA2W_\x84\x15ab\x90W\x82\x87\x01Q\x90P[ab\x9A\x85\x82aP\xE6V[\x86UPac\x01V[`\x1F\x19\x84\x16ab\xB0\x86aa\xE2V[_[\x82\x81\x10\x15ab\xD7W\x84\x89\x01Q\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90Pab\xB2V[\x86\x83\x10\x15ab\xF4W\x84\x89\x01Qab\xF0`\x1F\x89\x16\x82aP\xCAV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPV[ac\x12\x81aY\xAAV[\x82RPPV[_` \x82\x01\x90Pac+_\x83\x01\x84ac\tV[\x92\x91PPV[`T\x81\x10acBWacAaK\xEAV[[PV[_\x81\x90PacR\x82ac1V[\x91\x90PV[_aca\x82acEV[\x90P\x91\x90PV[acq\x81acWV[\x82RPPV[_` \x82\x01\x90Pac\x8A_\x83\x01\x84achV[\x92\x91PPV[_\x81\x90P\x92\x91PPV[ac\xA3\x81aC?V[\x82RPPV[_ac\xB4\x83\x83ac\x9AV[` \x83\x01\x90P\x92\x91PPV[_ac\xCA\x82aB\xF7V[ac\xD4\x81\x85ac\x90V[\x93Pac\xDF\x83aC\x11V[\x80_[\x83\x81\x10\x15ad\x0FW\x81Qac\xF6\x88\x82ac\xA9V[\x97Pad\x01\x83aCvV[\x92PP`\x01\x81\x01\x90Pac\xE2V[P\x85\x93PPPP\x92\x91PPV[_ad'\x82\x84ac\xC0V[\x91P\x81\x90P\x92\x91PPV[_`\xC0\x82\x01\x90PadE_\x83\x01\x89aGcV[adR` \x83\x01\x88aGcV[ad_`@\x83\x01\x87aGcV[adl``\x83\x01\x86aG\xC5V[ady`\x80\x83\x01\x85aG\xC5V[ad\x86`\xA0\x83\x01\x84aGcV[\x97\x96PPPPPPPV[_`\xA0\x82\x01\x90Pad\xA4_\x83\x01\x88aGcV[ad\xB1` \x83\x01\x87aGcV[ad\xBE`@\x83\x01\x86aGcV[ad\xCB``\x83\x01\x85aG\xC5V[ad\xD8`\x80\x83\x01\x84aG\xD4V[\x96\x95PPPPPPV[_`\x80\x82\x01\x90Pad\xF5_\x83\x01\x87aGcV[ae\x02` \x83\x01\x86ac\tV[ae\x0F`@\x83\x01\x85aGcV[ae\x1C``\x83\x01\x84aGcV[\x95\x94PPPPPV\xFEUserDecryptResponseVerification(bytes publicKey,bytes32[] ctHandles,bytes userDecryptedShare,bytes extraData)PublicDecryptVerification(bytes32[] ctHandles,bytes decryptedResult,bytes extraData)UserDecryptRequestVerification(bytes publicKey,address[] contractAddresses,uint256 startTimestamp,uint256 durationDays,bytes extraData)", + b"`\x80`@R`\x046\x10a\x01\x08W_5`\xE0\x1C\x80c\\\x97Z\xBB\x11a\0\x94W\x80c\xAD<\xB1\xCC\x11a\0cW\x80c\xAD<\xB1\xCC\x14a\x03\x1CW\x80c\xC4\x11Xt\x14a\x03FW\x80c\xD8\x99\x8FE\x14a\x03\\W\x80c\xF1\xB5z\xDB\x14a\x03\x84W\x80c\xFB\xB82Y\x14a\x03\xACWa\x01\x08V[\x80c\\\x97Z\xBB\x14a\x02\x84W\x80co\x89\x13\xBC\x14a\x02\xAEW\x80c\x84V\xCBY\x14a\x02\xD6W\x80c\x84\xB0\x19n\x14a\x02\xECWa\x01\x08V[\x80c?K\xA8:\x11a\0\xDBW\x80c?K\xA8:\x14a\x01\xB0W\x80c@\x14\xC4\xCD\x14a\x01\xC6W\x80cO\x1E\xF2\x86\x14a\x02\x02W\x80cR\xD1\x90-\x14a\x02\x1EW\x80cX\xF5\xB8\xAB\x14a\x02HWa\x01\x08V[\x80c\x04o\x9E\xB3\x14a\x01\x0CW\x80c\t\0\xCCi\x14a\x014W\x80c\r\x8En,\x14a\x01pW\x80c9\xF78\x10\x14a\x01\x9AW[_\x80\xFD[4\x80\x15a\x01\x17W_\x80\xFD[Pa\x012`\x04\x806\x03\x81\x01\x90a\x01-\x91\x90aB\x1AV[a\x03\xE8V[\0[4\x80\x15a\x01?W_\x80\xFD[Pa\x01Z`\x04\x806\x03\x81\x01\x90a\x01U\x91\x90aB\xDEV[a\x08EV[`@Qa\x01g\x91\x90aC\xF0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01{W_\x80\xFD[Pa\x01\x84a\t\x16V[`@Qa\x01\x91\x91\x90aD\x9AV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xA5W_\x80\xFD[Pa\x01\xAEa\t\x91V[\0[4\x80\x15a\x01\xBBW_\x80\xFD[Pa\x01\xC4a\x0B\xC9V[\0[4\x80\x15a\x01\xD1W_\x80\xFD[Pa\x01\xEC`\x04\x806\x03\x81\x01\x90a\x01\xE7\x91\x90aE\x0FV[a\r\x11V[`@Qa\x01\xF9\x91\x90aE\xA7V[`@Q\x80\x91\x03\x90\xF3[a\x02\x1C`\x04\x806\x03\x81\x01\x90a\x02\x17\x91\x90aG\x12V[a\x0E\x1BV[\0[4\x80\x15a\x02)W_\x80\xFD[Pa\x022a\x0E:V[`@Qa\x02?\x91\x90aG\x84V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02SW_\x80\xFD[Pa\x02n`\x04\x806\x03\x81\x01\x90a\x02i\x91\x90aB\xDEV[a\x0EkV[`@Qa\x02{\x91\x90aE\xA7V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x8FW_\x80\xFD[Pa\x02\x98a\x0E\x9EV[`@Qa\x02\xA5\x91\x90aE\xA7V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xB9W_\x80\xFD[Pa\x02\xD4`\x04\x806\x03\x81\x01\x90a\x02\xCF\x91\x90aB\x1AV[a\x0E\xC0V[\0[4\x80\x15a\x02\xE1W_\x80\xFD[Pa\x02\xEAa\x12\xAAV[\0[4\x80\x15a\x02\xF7W_\x80\xFD[Pa\x03\0a\x13\xCFV[`@Qa\x03\x13\x97\x96\x95\x94\x93\x92\x91\x90aH\xACV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03'W_\x80\xFD[Pa\x030a\x14\xD8V[`@Qa\x03=\x91\x90aD\x9AV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03QW_\x80\xFD[Pa\x03Za\x15\x11V[\0[4\x80\x15a\x03gW_\x80\xFD[Pa\x03\x82`\x04\x806\x03\x81\x01\x90a\x03}\x91\x90aE\x0FV[a\x166V[\0[4\x80\x15a\x03\x8FW_\x80\xFD[Pa\x03\xAA`\x04\x806\x03\x81\x01\x90a\x03\xA5\x91\x90aI\xC3V[a\x17\xF4V[\0[4\x80\x15a\x03\xB7W_\x80\xFD[Pa\x03\xD2`\x04\x806\x03\x81\x01\x90a\x03\xCD\x91\x90aJ\xFDV[a\x1C=V[`@Qa\x03\xDF\x91\x90aE\xA7V[`@Q\x80\x91\x03\x90\xF3[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xE5'^\xAF3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x045\x91\x90aK\x8EV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04PW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04t\x91\x90aK\xD1V[a\x04\xB5W3`@Q\x7F\xAE\xE8c#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x04\xAC\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[_a\x04\xBEa\x1E)V[\x90P`\xF8`\x02`\x05\x81\x11\x15a\x04\xD6Wa\x04\xD5aK\xFCV[[\x90\x1B\x88\x11\x15\x80a\x04\xE9WP\x80`\x08\x01T\x88\x11[\x15a\x05+W\x87`@Q\x7F\xD4\x8A\xF9B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05\"\x91\x90aL)V[`@Q\x80\x91\x03\x90\xFD[_a\x06\xBF\x82`\x07\x01_\x8B\x81R` \x01\x90\x81R` \x01_ `@Q\x80`@\x01`@R\x90\x81_\x82\x01\x80Ta\x05\\\x90aLoV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x05\x88\x90aLoV[\x80\x15a\x05\xD3W\x80`\x1F\x10a\x05\xAAWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x05\xD3V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x05\xB6W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x06)W` \x02\x82\x01\x91\x90_R` _ \x90[\x81T\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x06\x15W[PPPPP\x81RPP\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa\x1EPV[\x90Pa\x06\xCD\x89\x82\x88\x88a\x1F\x11V[_\x82`\x02\x01_\x8B\x81R` \x01\x90\x81R` \x01_ _\x80_\x1B\x81R` \x01\x90\x81R` \x01_ \x90P\x803\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x89\x7F\x7F\xCD\xFBS\x81\x91\x7FUJq}\nTp\xA3?ZI\xBAdE\xF0^\xC4V[_a\x0B0a\x1E)V[\x90P`\xF8`\x01`\x05\x81\x11\x15a\x0BHWa\x0BGaK\xFCV[[\x90\x1B\x81`\x06\x01\x81\x90UP`\xF8`\x02`\x05\x81\x11\x15a\x0BhWa\x0BgaK\xFCV[[\x90\x1B\x81`\x08\x01\x81\x90UPP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x0B\xBD\x91\x90aN\xE7V[`@Q\x80\x91\x03\x90\xA1PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0C&W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0CJ\x91\x90aO\x14V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15\x80\x15a\x0C\xC5WPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\r\x07W3`@Q\x7F\xE1\x91f\xEE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0C\xFE\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[a\r\x0Fa\"PV[V[_\x80_\x90P[\x85\x85\x90P\x81\x10\x15a\x0E\rWs\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x06 2m\x87\x87\x84\x81\x81\x10a\reWa\rdaO?V[[\x90P` \x02\x015`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\x88\x91\x90aG\x84V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\xA3W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\r\xC7\x91\x90aK\xD1V[\x15\x80a\r\xF2WPa\r\xF0\x86\x86\x83\x81\x81\x10a\r\xE4Wa\r\xE3aO?V[[\x90P` \x02\x015a\"\xBEV[\x15[\x15a\x0E\0W_\x91PPa\x0E\x13V[\x80\x80`\x01\x01\x91PPa\r\x17V[P`\x01\x90P[\x94\x93PPPPV[a\x0E#a#RV[a\x0E,\x82a$8V[a\x0E6\x82\x82a%+V[PPV[_a\x0ECa&IV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[_\x80a\x0Eua\x1E)V[\x90P\x80_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x80a\x0E\xA8a&\xD0V[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x90V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xE5'^\xAF3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\r\x91\x90aK\x8EV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0F(W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0FL\x91\x90aK\xD1V[a\x0F\x8DW3`@Q\x7F\xAE\xE8c#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0F\x84\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[_a\x0F\x96a\x1E)V[\x90P`\xF8`\x01`\x05\x81\x11\x15a\x0F\xAEWa\x0F\xADaK\xFCV[[\x90\x1B\x88\x11\x15\x80a\x0F\xC1WP\x80`\x06\x01T\x88\x11[\x15a\x10\x03W\x87`@Q\x7F\xD4\x8A\xF9B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0F\xFA\x91\x90aL)V[`@Q\x80\x91\x03\x90\xFD[_a\x10\xF4\x82`\x05\x01_\x8B\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x10bW` \x02\x82\x01\x91\x90_R` _ \x90[\x81T\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x10NW[PPPPP\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa&\xF7V[\x90Pa\x11\x02\x89\x82\x88\x88a\x1F\x11V[_\x82`\x04\x01_\x8B\x81R` \x01\x90\x81R` \x01_ _\x83\x81R` \x01\x90\x81R` \x01_ \x90P\x80\x87\x87\x90\x91\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x92\x90\x91\x92\x90\x91\x92\x90\x91\x92P\x91\x82a\x11`\x92\x91\x90aQ\x13V[P\x82`\x02\x01_\x8B\x81R` \x01\x90\x81R` \x01_ _\x83\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x82_\x01_\x8B\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x12\x16WPa\x12\x15\x81\x80T\x90Pa'\xA8V[[\x15a\x12\x9EW`\x01\x83_\x01_\x8C\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81\x83`\x03\x01_\x8C\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x89\x7F\xD7\xE5\x8A6z\nl)\x8Ev\xAD]$\0\x04\xE3'\xAA\x14#\xCB\xE4\xBD\x7F\xF8]Lq^\xF8\xD1_\x8A\x8A\x84\x89\x89`@Qa\x12\x95\x95\x94\x93\x92\x91\x90aS.V[`@Q\x80\x91\x03\x90\xA2[PPPPPPPPPPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cF\xFB\xF6\x8E3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x12\xF7\x91\x90aK\x8EV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x13\x12W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x136\x91\x90aK\xD1V[\x15\x80\x15a\x13\x83WPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x13\xC5W3`@Q\x7F8\x89\x16\xBB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x13\xBC\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[a\x13\xCDa(9V[V[_``\x80_\x80_``_a\x13\xE1a(\xA8V[\x90P_\x80\x1B\x81_\x01T\x14\x80\x15a\x13\xFCWP_\x80\x1B\x81`\x01\x01T\x14[a\x14;W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x142\x90aS\xC6V[`@Q\x80\x91\x03\x90\xFD[a\x14Ca(\xCFV[a\x14Ka)mV[F0_\x80\x1B_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x14jWa\x14iaE\xEEV[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x14\x98W\x81` \x01` \x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x7F\x0F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95\x94\x93\x92\x91\x90\x97P\x97P\x97P\x97P\x97P\x97P\x97PP\x90\x91\x92\x93\x94\x95\x96V[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[`\x03_a\x15\x1Ca\"\x01V[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x15dWP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x15\x9BW`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x16*\x91\x90aN\xE7V[`@Q\x80\x91\x03\x90\xA1PPV[a\x16>a*\x0BV[_\x84\x84\x90P\x03a\x16zW`@Q\x7F-\xE7T8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x16\xC3\x84\x84\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa*LV[_s\xC7\xD4Va\xA3E\xEC\\\xA0\xE8R\x1C\xFE\xF7\xE3/\xDA\r\xAAhs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xA1O\x89q\x86\x86`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x13\x92\x91\x90aT\\V[_`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17-W=_\x80>=_\xFD[PPPP`@Q=_\x82>=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x17U\x91\x90aW\x07V[\x90Pa\x17`\x81a+\x04V[_a\x17ia\x1E)V[\x90P\x80`\x06\x01_\x81T\x80\x92\x91\x90a\x17\x7F\x90aWNV[\x91\x90PUP_\x81`\x06\x01T\x90P\x86\x86\x83`\x05\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x91\x90a\x17\xAE\x92\x91\x90a@\xC4V[P\x80\x7F\xF1\xB1\x1B\xE5\x0C\x03\x12;\x97\xD8\x16\xB2\x94\x1A\xFEx\xC7,\xBA\xEF\xEF\xF5S\x1F\xD1\xEF\x80\xEDm.\xCC\xA8\x84\x87\x87`@Qa\x17\xE3\x93\x92\x91\x90aY>V[`@Q\x80\x91\x03\x90\xA2PPPPPPPV[a\x17\xFCa*\x0BV[_\x88\x80` \x01\x90a\x18\r\x91\x90aY\x81V[\x90P\x03a\x18FW`@Q\x7FW\xCF\xA2\x17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\n`\xFF\x16\x88\x80` \x01\x90a\x18[\x91\x90aY\x81V[\x90P\x11\x15a\x18\xB4W`\n\x88\x80` \x01\x90a\x18u\x91\x90aY\x81V[\x90P`@Q\x7F\xAF\x1F\x04\x95\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x18\xAB\x92\x91\x90aZ\x1FV[`@Q\x80\x91\x03\x90\xFD[a\x18\xCD\x89\x806\x03\x81\x01\x90a\x18\xC8\x91\x90aZ\x93V[a+\xEAV[a\x19%\x88\x80` \x01\x90a\x18\xE0\x91\x90aY\x81V[\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x88a-5V[\x15a\x19yW\x86\x88\x80` \x01\x90a\x19;\x91\x90aY\x81V[`@Q\x7F\xDCMx\xB1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x19p\x93\x92\x91\x90a[DV[`@Q\x80\x91\x03\x90\xFD[_a\x19\xD4\x8C\x8C\x8B\x80` \x01\x90a\x19\x8F\x91\x90aY\x81V[\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x8Ba-\xB3V[\x90Pa\x1A\x84\x8A\x806\x03\x81\x01\x90a\x19\xEA\x91\x90aZ\x93V[\x8Aa\x19\xF4\x90a\\rV[\x8A\x8A\x8A\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x89\x89\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa/\xA6V[_s\xC7\xD4Va\xA3E\xEC\\\xA0\xE8R\x1C\xFE\xF7\xE3/\xDA\r\xAAhs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xA1O\x89q\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1A\xD2\x91\x90a]\x1CV[_`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1A\xECW=_\x80>=_\xFD[PPPP`@Q=_\x82>=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1B\x14\x91\x90aW\x07V[\x90Pa\x1B\x1F\x81a+\x04V[_a\x1B(a\x1E)V[\x90P\x80`\x08\x01_\x81T\x80\x92\x91\x90a\x1B>\x90aWNV[\x91\x90PUP_\x81`\x08\x01T\x90P`@Q\x80`@\x01`@R\x80\x8B\x8B\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81R` \x01\x85\x81RP\x82`\x07\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01\x90\x81a\x1B\xC9\x91\x90a]FV[P` \x82\x01Q\x81`\x01\x01\x90\x80Q\x90` \x01\x90a\x1B\xE6\x92\x91\x90aA\x0FV[P\x90PP\x80\x7F\x95;hYh\xA1\xA7\xC5\xF0\xDF\xB3\xDE\xD7\xDA\xA9\xF4\xF6\xB8\xF2\xD8\x1F\xE3>M'&#\xD1\x0Ex>\xB8\x84\x8D\x8D\x8D\x8B\x8B`@Qa\x1C$\x96\x95\x94\x93\x92\x91\x90a^\x15V[`@Q\x80\x91\x03\x90\xA2PPPPPPPPPPPPPPPV[_\x80_\x90P[\x85\x85\x90P\x81\x10\x15a\x1E\x1AWs\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC6R\x8Fi\x87\x87\x84\x81\x81\x10a\x1C\x91Wa\x1C\x90aO?V[[\x90P`@\x02\x01_\x015\x89`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1C\xB8\x92\x91\x90a^qV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1C\xD3W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1C\xF7\x91\x90aK\xD1V[\x15\x80a\x1D\xD3WPs\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC6R\x8Fi\x87\x87\x84\x81\x81\x10a\x1DAWa\x1D@aO?V[[\x90P`@\x02\x01_\x015\x88\x88\x85\x81\x81\x10a\x1D]Wa\x1D\\aO?V[[\x90P`@\x02\x01` \x01` \x81\x01\x90a\x1Du\x91\x90a^\x98V[`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1D\x92\x92\x91\x90a^qV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1D\xADW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1D\xD1\x91\x90aK\xD1V[\x15[\x80a\x1D\xFFWPa\x1D\xFD\x86\x86\x83\x81\x81\x10a\x1D\xEFWa\x1D\xEEaO?V[[\x90P`@\x02\x01_\x015a\"\xBEV[\x15[\x15a\x1E\rW_\x91PPa\x1E V[\x80\x80`\x01\x01\x91PPa\x1CCV[P`\x01\x90P[\x95\x94PPPPPV[_\x7Fh\x11>h\xAFILn\xFD\x02\x10\xFCK\xF9\xBAt\x8D\x1F\xFA\xDA\xA4q\x82\x17\xFD\xF65H\xC4\xAE\xE7\0\x90P\x90V[_a\x1F\x08`@Q\x80`\xA0\x01`@R\x80`m\x81R` \x01af\x82`m\x919\x80Q\x90` \x01 \x85_\x01Q\x80Q\x90` \x01 \x86` \x01Q`@Q` \x01a\x1E\x94\x91\x90a_OV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x86\x80Q\x90` \x01 \x86`@Q` \x01a\x1E\xC3\x91\x90a_\x9FV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a\x1E\xED\x95\x94\x93\x92\x91\x90a_\xB5V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 a0\x82V[\x90P\x93\x92PPPV[_a\x1F\x1Aa\x1E)V[\x90P_a\x1Fj\x85\x85\x85\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa0\x9BV[\x90Pa\x1Fu\x81a0\xC5V[\x81`\x01\x01_\x87\x81R` \x01\x90\x81R` \x01_ _\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a \x14W\x85\x81`@Q\x7F\x99\xECH\xD9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a \x0B\x92\x91\x90a`\x06V[`@Q\x80\x91\x03\x90\xFD[`\x01\x82`\x01\x01_\x88\x81R` \x01\x90\x81R` \x01_ _\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UPPPPPPPV[_\x80s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC2\xB4)\x86`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a \xE1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a!\x05\x91\x90a`-V[\x90P\x80\x83\x10\x15\x91PP\x91\x90PV[``_`\x01a!!\x84a1\x95V[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!?Wa!>aE\xEEV[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a!qW\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a!\xD2W\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a!\xC7Wa!\xC6a`XV[[\x04\x94P_\x85\x03a!~W[\x81\x93PPPP\x91\x90PV[_a!\xE6a\"\x01V[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[a\"0a2\xE6V[a\":\x82\x82a3&V[PPV[a\"Fa2\xE6V[a\"Na3wV[V[a\"Xa3\xA7V[_a\"aa&\xD0V[\x90P_\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F]\xB9\xEE\nI[\xF2\xE6\xFF\x9C\x91\xA7\x83L\x1B\xA4\xFD\xD2D\xA5\xE8\xAANS{\xD3\x8A\xEA\xE4\xB0s\xAAa\"\xA6a3\xE7V[`@Qa\"\xB3\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xA1PV[_s\xC7\xD4Va\xA3E\xEC\\\xA0\xE8R\x1C\xFE\xF7\xE3/\xDA\r\xAAhs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xDC\x9Ao\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a#\x0C\x91\x90aG\x84V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a#'W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a#K\x91\x90aK\xD1V[\x90P\x91\x90PV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a#\xFFWP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a#\xE6a3\xEEV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a$6W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a$\x95W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a$\xB9\x91\x90aO\x14V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a%(W3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%\x1F\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a%\x93WP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a%\x90\x91\x90a`\x85V[`\x01[a%\xD4W\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%\xCB\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a&:W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a&1\x91\x90aG\x84V[`@Q\x80\x91\x03\x90\xFD[a&D\x83\x83a4AV[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a&\xCEW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x7F\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\x90P\x90V[_a'\x9F`@Q\x80`\x80\x01`@R\x80`T\x81R` \x01af\xEF`T\x919\x80Q\x90` \x01 \x85`@Q` \x01a',\x91\x90a_OV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x85\x80Q\x90` \x01 \x85`@Q` \x01a'[\x91\x90a_\x9FV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a'\x84\x94\x93\x92\x91\x90a`\xB0V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 a0\x82V[\x90P\x93\x92PPPV[_\x80s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c*8\x89\x98`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a(\x07W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a(+\x91\x90a`-V[\x90P\x80\x83\x10\x15\x91PP\x91\x90PV[a(Aa*\x0BV[_a(Ja&\xD0V[\x90P`\x01\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2Xa(\x90a3\xE7V[`@Qa(\x9D\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xA1PV[_\x7F\xA1jF\xD9Ba\xC7Q|\xC8\xFF\x89\xF6\x1C\x0C\xE95\x98\xE3\xC8I\x80\x10\x11\xDE\xE6I\xA6\xA5W\xD1\0\x90P\x90V[``_a(\xDAa(\xA8V[\x90P\x80`\x02\x01\x80Ta(\xEB\x90aLoV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta)\x17\x90aLoV[\x80\x15a)bW\x80`\x1F\x10a)9Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a)bV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a)EW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[``_a)xa(\xA8V[\x90P\x80`\x03\x01\x80Ta)\x89\x90aLoV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta)\xB5\x90aLoV[\x80\x15a*\0W\x80`\x1F\x10a)\xD7Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a*\0V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a)\xE3W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[a*\x13a\x0E\x9EV[\x15a*JW`@Q\x7F\xD9<\x06e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80[\x82Q\x81\x10\x15a*\xB4W_\x83\x82\x81Q\x81\x10a*lWa*kaO?V[[` \x02` \x01\x01Q\x90P_a*\x80\x82a4\xB3V[\x90Pa*\x8B\x81a5=V[a\xFF\xFF\x16\x84a*\x9A\x91\x90a`\xF3V[\x93Pa*\xA5\x82a7(V[PP\x80\x80`\x01\x01\x91PPa*OV[Pa\x08\0\x81\x11\x15a+\0Wa\x08\0\x81`@Q\x7F\xE7\xF4\x89]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a*\xF7\x92\x91\x90aa&V[`@Q\x80\x91\x03\x90\xFD[PPV[`\x01\x81Q\x11\x15a+\xE7W_\x81_\x81Q\x81\x10a+\"Wa+!aO?V[[` \x02` \x01\x01Q` \x01Q\x90P_`\x01\x90P[\x82Q\x81\x10\x15a+\xE4W\x81\x83\x82\x81Q\x81\x10a+SWa+RaO?V[[` \x02` \x01\x01Q` \x01Q\x14a+\xD7W\x82_\x81Q\x81\x10a+wWa+vaO?V[[` \x02` \x01\x01Q\x83\x82\x81Q\x81\x10a+\x92Wa+\x91aO?V[[` \x02` \x01\x01Q`@Q\x7F\xC2\xED\xDF\x9D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a+\xCE\x92\x91\x90aa\xC0V[`@Q\x80\x91\x03\x90\xFD[\x80\x80`\x01\x01\x91PPa+6V[PP[PV[_\x81` \x01Q\x03a,'W`@Q\x7F\xDE(Y\xC1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x01ma\xFF\xFF\x16\x81` \x01Q\x11\x15a,~Wa\x01m\x81` \x01Q`@Q\x7F2\x95\x18c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a,u\x92\x91\x90ab2V[`@Q\x80\x91\x03\x90\xFD[B\x81_\x01Q\x11\x15a,\xCBWB\x81_\x01Q`@Q\x7F\xF2L\x08\x87\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a,\xC2\x92\x91\x90aa&V[`@Q\x80\x91\x03\x90\xFD[Bb\x01Q\x80\x82` \x01Qa,\xDF\x91\x90abYV[\x82_\x01Qa,\xED\x91\x90a`\xF3V[\x10\x15a-2WB\x81`@Q\x7F04\x80@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a-)\x92\x91\x90ab\xC7V[`@Q\x80\x91\x03\x90\xFD[PV[_\x80_\x90P[\x83Q\x81\x10\x15a-\xA8W\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84\x82\x81Q\x81\x10a-nWa-maO?V[[` \x02` \x01\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a-\x9BW`\x01\x91PPa-\xADV[\x80\x80`\x01\x01\x91PPa-;V[P_\x90P[\x92\x91PPV[``_\x85\x85\x90P\x03a-\xF1W`@Q\x7F\xA6\xA6\xCB!\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84\x84\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a.\x0EWa.\raE\xEEV[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a. v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba;\xBAV[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a4J\x82a;\xC3V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a4\xA6Wa4\xA0\x82\x82a<\x8CV[Pa4\xAFV[a4\xAEa=\x0CV[[PPV[_\x80`\xF8`\xF0\x84\x90\x1B\x90\x1C_\x1C\x90P`S\x80\x81\x11\x15a4\xD5Wa4\xD4aK\xFCV[[`\xFF\x16\x81`\xFF\x16\x11\x15a5\x1FW\x80`@Q\x7Fd\x19P\xD7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a5\x16\x91\x90adtV[`@Q\x80\x91\x03\x90\xFD[\x80`\xFF\x16`S\x81\x11\x15a55Wa54aK\xFCV[[\x91PP\x91\x90PV[_\x80`S\x81\x11\x15a5QWa5PaK\xFCV[[\x82`S\x81\x11\x15a5dWa5caK\xFCV[[\x03a5rW`\x02\x90Pa7#V[`\x02`S\x81\x11\x15a5\x86Wa5\x85aK\xFCV[[\x82`S\x81\x11\x15a5\x99Wa5\x98aK\xFCV[[\x03a5\xA7W`\x08\x90Pa7#V[`\x03`S\x81\x11\x15a5\xBBWa5\xBAaK\xFCV[[\x82`S\x81\x11\x15a5\xCEWa5\xCDaK\xFCV[[\x03a5\xDCW`\x10\x90Pa7#V[`\x04`S\x81\x11\x15a5\xF0Wa5\xEFaK\xFCV[[\x82`S\x81\x11\x15a6\x03Wa6\x02aK\xFCV[[\x03a6\x11W` \x90Pa7#V[`\x05`S\x81\x11\x15a6%Wa6$aK\xFCV[[\x82`S\x81\x11\x15a68Wa67aK\xFCV[[\x03a6FW`@\x90Pa7#V[`\x06`S\x81\x11\x15a6ZWa6YaK\xFCV[[\x82`S\x81\x11\x15a6mWa6laK\xFCV[[\x03a6{W`\x80\x90Pa7#V[`\x07`S\x81\x11\x15a6\x8FWa6\x8EaK\xFCV[[\x82`S\x81\x11\x15a6\xA2Wa6\xA1aK\xFCV[[\x03a6\xB0W`\xA0\x90Pa7#V[`\x08`S\x81\x11\x15a6\xC4Wa6\xC3aK\xFCV[[\x82`S\x81\x11\x15a6\xD7Wa6\xD6aK\xFCV[[\x03a6\xE6Wa\x01\0\x90Pa7#V[\x81`@Q\x7F\xBEx0\xB1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a7\x1A\x91\x90ad\xD3V[`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[s\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x06 2m\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a7u\x91\x90aG\x84V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a7\x90W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a7\xB4\x91\x90aK\xD1V[a7\xF5W\x80`@Q\x7FC1\xA8]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a7\xEC\x91\x90aG\x84V[`@Q\x80\x91\x03\x90\xFD[PV[s\xF3b\x7Fs\xC8\xAE\x1D\x0B\xDC*\xF6(\x12(C\x03\xA5%\xEE\xEFs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xC6R\x8Fi\x83\x83`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a8G\x92\x91\x90a^qV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a8bW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a8\x86\x91\x90aK\xD1V[a8\xC9W\x81\x81`@Q\x7F\x16\n+K\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a8\xC0\x92\x91\x90a^qV[`@Q\x80\x91\x03\x90\xFD[PPV[_\x80`@Q\x80`\xC0\x01`@R\x80`\x87\x81R` \x01agC`\x87\x919\x80Q\x90` \x01 \x84\x80Q\x90` \x01 \x86` \x01Q`@Q` \x01a9\x0C\x91\x90aexV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x88_\x01Q\x89` \x01Q\x87`@Q` \x01a9<\x91\x90a_\x9FV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a9g\x96\x95\x94\x93\x92\x91\x90ae\x8EV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90Pa9\x8C\x85_\x01Q\x82a=HV[\x91PP\x94\x93PPPPV[_a9\xA0a=\xBCV[\x90P\x90V[_`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x83`\x02\x82\x01R\x82`\"\x82\x01R`B\x81 \x91PP\x92\x91PPV[_\x80_`A\x84Q\x03a:%W_\x80_` \x87\x01Q\x92P`@\x87\x01Q\x91P``\x87\x01Q_\x1A\x90Pa:\x17\x88\x82\x85\x85a>\x1FV[\x95P\x95P\x95PPPPa:3V[_`\x02\x85Q_\x1B\x92P\x92P\x92P[\x92P\x92P\x92V[_`\x03\x81\x11\x15a:MWa:LaK\xFCV[[\x82`\x03\x81\x11\x15a:`Wa:_aK\xFCV[[\x03\x15a;\x98W`\x01`\x03\x81\x11\x15a:zWa:yaK\xFCV[[\x82`\x03\x81\x11\x15a:\x8DWa:\x8CaK\xFCV[[\x03a:\xC4W`@Q\x7F\xF6E\xEE\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02`\x03\x81\x11\x15a:\xD8Wa:\xD7aK\xFCV[[\x82`\x03\x81\x11\x15a:\xEBWa:\xEAaK\xFCV[[\x03a;/W\x80_\x1C`@Q\x7F\xFC\xE6\x98\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a;&\x91\x90aL)V[`@Q\x80\x91\x03\x90\xFD[`\x03\x80\x81\x11\x15a;BWa;AaK\xFCV[[\x82`\x03\x81\x11\x15a;UWa;TaK\xFCV[[\x03a;\x97W\x80`@Q\x7F\xD7\x8B\xCE\x0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a;\x8E\x91\x90aG\x84V[`@Q\x80\x91\x03\x90\xFD[[PPV[_a;\xA5a\"\x01V[_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x90P\x90V[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a<\x1EW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a<\x15\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[\x80a v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba;\xBAV[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa<\xB5\x91\x90a_\x9FV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a<\xEDW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a<\xF2V[``\x91P[P\x91P\x91Pa=\x02\x85\x83\x83a?\x06V[\x92PPP\x92\x91PPV[_4\x11\x15a=FW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80\x7F\x8Bs\xC3\xC6\x9B\xB8\xFE=Q.\xCCL\xF7Y\xCCy#\x9F{\x17\x9B\x0F\xFA\xCA\xA9\xA7]R+9@\x0Fa=sa?\x93V[a={a@\tV[\x860`@Q` \x01a=\x91\x95\x94\x93\x92\x91\x90ae\xEDV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90Pa=\xB3\x81\x84a9\xA5V[\x91PP\x92\x91PPV[_\x7F\x8Bs\xC3\xC6\x9B\xB8\xFE=Q.\xCCL\xF7Y\xCCy#\x9F{\x17\x9B\x0F\xFA\xCA\xA9\xA7]R+9@\x0Fa=\xE6a?\x93V[a=\xEEa@\tV[F0`@Q` \x01a>\x04\x95\x94\x93\x92\x91\x90ae\xEDV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x90V[_\x80_\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84_\x1C\x11\x15a>[W_`\x03\x85\x92P\x92P\x92Pa>\xFCV[_`\x01\x88\x88\x88\x88`@Q_\x81R` \x01`@R`@Qa>~\x94\x93\x92\x91\x90af>V[` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a>\x9EW=_\x80>=_\xFD[PPP` `@Q\x03Q\x90P_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a>\xEFW_`\x01_\x80\x1B\x93P\x93P\x93PPa>\xFCV[\x80_\x80_\x1B\x93P\x93P\x93PP[\x94P\x94P\x94\x91PPV[``\x82a?\x1BWa?\x16\x82a@\x80V[a?\x8BV[_\x82Q\x14\x80\x15a?AWP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a?\x83W\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a?z\x91\x90aK\x8EV[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa?\x8CV[[\x93\x92PPPV[_\x80a?\x9Da(\xA8V[\x90P_a?\xA8a(\xCFV[\x90P_\x81Q\x11\x15a?\xC4W\x80\x80Q\x90` \x01 \x92PPPa@\x06V[_\x82_\x01T\x90P_\x80\x1B\x81\x14a?\xDFW\x80\x93PPPPa@\x06V[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x80a@\x13a(\xA8V[\x90P_a@\x1Ea)mV[\x90P_\x81Q\x11\x15a@:W\x80\x80Q\x90` \x01 \x92PPPa@}V[_\x82`\x01\x01T\x90P_\x80\x1B\x81\x14a@VW\x80\x93PPPPa@}V[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x81Q\x11\x15a@\x92W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82\x80T\x82\x82U\x90_R` _ \x90\x81\x01\x92\x82\x15a@\xFEW\x91` \x02\x82\x01[\x82\x81\x11\x15a@\xFDW\x825\x82U\x91` \x01\x91\x90`\x01\x01\x90a@\xE2V[[P\x90PaA\x0B\x91\x90aAZV[P\x90V[\x82\x80T\x82\x82U\x90_R` _ \x90\x81\x01\x92\x82\x15aAIW\x91` \x02\x82\x01[\x82\x81\x11\x15aAHW\x82Q\x82U\x91` \x01\x91\x90`\x01\x01\x90aA-V[[P\x90PaAV\x91\x90aAZV[P\x90V[[\x80\x82\x11\x15aAqW_\x81_\x90UP`\x01\x01aA[V[P\x90V[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[aA\x98\x81aA\x86V[\x81\x14aA\xA2W_\x80\xFD[PV[_\x815\x90PaA\xB3\x81aA\x8FV[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12aA\xDAWaA\xD9aA\xB9V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aA\xF7WaA\xF6aA\xBDV[[` \x83\x01\x91P\x83`\x01\x82\x02\x83\x01\x11\x15aB\x13WaB\x12aA\xC1V[[\x92P\x92\x90PV[_\x80_\x80_\x80_`\x80\x88\x8A\x03\x12\x15aB5WaB4aA~V[[_aBB\x8A\x82\x8B\x01aA\xA5V[\x97PP` \x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aBcWaBbaA\x82V[[aBo\x8A\x82\x8B\x01aA\xC5V[\x96P\x96PP`@\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aB\x92WaB\x91aA\x82V[[aB\x9E\x8A\x82\x8B\x01aA\xC5V[\x94P\x94PP``\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aB\xC1WaB\xC0aA\x82V[[aB\xCD\x8A\x82\x8B\x01aA\xC5V[\x92P\x92PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[_` \x82\x84\x03\x12\x15aB\xF3WaB\xF2aA~V[[_aC\0\x84\x82\x85\x01aA\xA5V[\x91PP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_aC[\x82aC2V[\x90P\x91\x90PV[aCk\x81aCQV[\x82RPPV[_aC|\x83\x83aCbV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aC\x9E\x82aC\tV[aC\xA8\x81\x85aC\x13V[\x93PaC\xB3\x83aC#V[\x80_[\x83\x81\x10\x15aC\xE3W\x81QaC\xCA\x88\x82aCqV[\x97PaC\xD5\x83aC\x88V[\x92PP`\x01\x81\x01\x90PaC\xB6V[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaD\x08\x81\x84aC\x94V[\x90P\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15aDGW\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90PaD,V[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_aDl\x82aD\x10V[aDv\x81\x85aD\x1AV[\x93PaD\x86\x81\x85` \x86\x01aD*V[aD\x8F\x81aDRV[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaD\xB2\x81\x84aDbV[\x90P\x92\x91PPV[_\x80\x83`\x1F\x84\x01\x12aD\xCFWaD\xCEaA\xB9V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aD\xECWaD\xEBaA\xBDV[[` \x83\x01\x91P\x83` \x82\x02\x83\x01\x11\x15aE\x08WaE\x07aA\xC1V[[\x92P\x92\x90PV[_\x80_\x80`@\x85\x87\x03\x12\x15aE'WaE&aA~V[[_\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aEDWaECaA\x82V[[aEP\x87\x82\x88\x01aD\xBAV[\x94P\x94PP` \x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aEsWaEraA\x82V[[aE\x7F\x87\x82\x88\x01aA\xC5V[\x92P\x92PP\x92\x95\x91\x94P\x92PV[_\x81\x15\x15\x90P\x91\x90PV[aE\xA1\x81aE\x8DV[\x82RPPV[_` \x82\x01\x90PaE\xBA_\x83\x01\x84aE\x98V[\x92\x91PPV[aE\xC9\x81aCQV[\x81\x14aE\xD3W_\x80\xFD[PV[_\x815\x90PaE\xE4\x81aE\xC0V[\x92\x91PPV[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[aF$\x82aDRV[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15aFCWaFBaE\xEEV[[\x80`@RPPPV[_aFUaAuV[\x90PaFa\x82\x82aF\x1BV[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aF\x80WaF\x7FaE\xEEV[[aF\x89\x82aDRV[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_aF\xB6aF\xB1\x84aFfV[aFLV[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15aF\xD2WaF\xD1aE\xEAV[[aF\xDD\x84\x82\x85aF\x96V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aF\xF9WaF\xF8aA\xB9V[[\x815aG\t\x84\x82` \x86\x01aF\xA4V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15aG(WaG'aA~V[[_aG5\x85\x82\x86\x01aE\xD6V[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aGVWaGUaA\x82V[[aGb\x85\x82\x86\x01aF\xE5V[\x91PP\x92P\x92\x90PV[_\x81\x90P\x91\x90PV[aG~\x81aGlV[\x82RPPV[_` \x82\x01\x90PaG\x97_\x83\x01\x84aGuV[\x92\x91PPV[_\x7F\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x82\x16\x90P\x91\x90PV[aG\xD1\x81aG\x9DV[\x82RPPV[aG\xE0\x81aA\x86V[\x82RPPV[aG\xEF\x81aCQV[\x82RPPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[aH'\x81aA\x86V[\x82RPPV[_aH8\x83\x83aH\x1EV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aHZ\x82aG\xF5V[aHd\x81\x85aG\xFFV[\x93PaHo\x83aH\x0FV[\x80_[\x83\x81\x10\x15aH\x9FW\x81QaH\x86\x88\x82aH-V[\x97PaH\x91\x83aHDV[\x92PP`\x01\x81\x01\x90PaHrV[P\x85\x93PPPP\x92\x91PPV[_`\xE0\x82\x01\x90PaH\xBF_\x83\x01\x8AaG\xC8V[\x81\x81\x03` \x83\x01RaH\xD1\x81\x89aDbV[\x90P\x81\x81\x03`@\x83\x01RaH\xE5\x81\x88aDbV[\x90PaH\xF4``\x83\x01\x87aG\xD7V[aI\x01`\x80\x83\x01\x86aG\xE6V[aI\x0E`\xA0\x83\x01\x85aGuV[\x81\x81\x03`\xC0\x83\x01RaI \x81\x84aHPV[\x90P\x98\x97PPPPPPPPV[_\x80\x83`\x1F\x84\x01\x12aICWaIBaA\xB9V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aI`WaI_aA\xBDV[[` \x83\x01\x91P\x83`@\x82\x02\x83\x01\x11\x15aI|WaI{aA\xC1V[[\x92P\x92\x90PV[_\x80\xFD[_`@\x82\x84\x03\x12\x15aI\x9CWaI\x9BaI\x83V[[\x81\x90P\x92\x91PPV[_`@\x82\x84\x03\x12\x15aI\xBAWaI\xB9aI\x83V[[\x81\x90P\x92\x91PPV[_\x80_\x80_\x80_\x80_\x80_a\x01\0\x8C\x8E\x03\x12\x15aI\xE3WaI\xE2aA~V[[_\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ\0WaI\xFFaA\x82V[[aJ\x0C\x8E\x82\x8F\x01aI.V[\x9BP\x9BPP` aJ\x1F\x8E\x82\x8F\x01aI\x87V[\x99PP``\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ@WaJ?aA\x82V[[aJL\x8E\x82\x8F\x01aI\xA5V[\x98PP`\x80aJ]\x8E\x82\x8F\x01aE\xD6V[\x97PP`\xA0\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ~WaJ}aA\x82V[[aJ\x8A\x8E\x82\x8F\x01aA\xC5V[\x96P\x96PP`\xC0\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ\xADWaJ\xACaA\x82V[[aJ\xB9\x8E\x82\x8F\x01aA\xC5V[\x94P\x94PP`\xE0\x8C\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ\xDCWaJ\xDBaA\x82V[[aJ\xE8\x8E\x82\x8F\x01aA\xC5V[\x92P\x92PP\x92\x95\x98\x9BP\x92\x95\x98\x9B\x90\x93\x96\x99PV[_\x80_\x80_``\x86\x88\x03\x12\x15aK\x16WaK\x15aA~V[[_aK#\x88\x82\x89\x01aE\xD6V[\x95PP` \x86\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aKDWaKCaA\x82V[[aKP\x88\x82\x89\x01aI.V[\x94P\x94PP`@\x86\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aKsWaKraA\x82V[[aK\x7F\x88\x82\x89\x01aA\xC5V[\x92P\x92PP\x92\x95P\x92\x95\x90\x93PV[_` \x82\x01\x90PaK\xA1_\x83\x01\x84aG\xE6V[\x92\x91PPV[aK\xB0\x81aE\x8DV[\x81\x14aK\xBAW_\x80\xFD[PV[_\x81Q\x90PaK\xCB\x81aK\xA7V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aK\xE6WaK\xE5aA~V[[_aK\xF3\x84\x82\x85\x01aK\xBDV[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[_` \x82\x01\x90PaL<_\x83\x01\x84aG\xD7V[\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\"`\x04R`$_\xFD[_`\x02\x82\x04\x90P`\x01\x82\x16\x80aL\x86W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aL\x99WaL\x98aLBV[[P\x91\x90PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_aL\xD6\x82aA\x86V[\x91PaL\xE1\x83aA\x86V[\x92P\x82\x82\x03\x90P\x81\x81\x11\x15aL\xF9WaL\xF8aL\x9FV[[\x92\x91PPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aM\x1A\x83\x85aL\xFFV[\x93PaM'\x83\x85\x84aF\x96V[aM0\x83aDRV[\x84\x01\x90P\x93\x92PPPV[_`\x80\x82\x01\x90PaMN_\x83\x01\x8AaG\xD7V[\x81\x81\x03` \x83\x01RaMa\x81\x88\x8AaM\x0FV[\x90P\x81\x81\x03`@\x83\x01RaMv\x81\x86\x88aM\x0FV[\x90P\x81\x81\x03``\x83\x01RaM\x8B\x81\x84\x86aM\x0FV[\x90P\x98\x97PPPPPPPPV[_\x81\x90P\x92\x91PPV[_aM\xAD\x82aD\x10V[aM\xB7\x81\x85aM\x99V[\x93PaM\xC7\x81\x85` \x86\x01aD*V[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aN\x07`\x02\x83aM\x99V[\x91PaN\x12\x82aM\xD3V[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aNQ`\x01\x83aM\x99V[\x91PaN\\\x82aN\x1DV[`\x01\x82\x01\x90P\x91\x90PV[_aNr\x82\x87aM\xA3V[\x91PaN}\x82aM\xFBV[\x91PaN\x89\x82\x86aM\xA3V[\x91PaN\x94\x82aNEV[\x91PaN\xA0\x82\x85aM\xA3V[\x91PaN\xAB\x82aNEV[\x91PaN\xB7\x82\x84aM\xA3V[\x91P\x81\x90P\x95\x94PPPPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[aN\xE1\x81aN\xC5V[\x82RPPV[_` \x82\x01\x90PaN\xFA_\x83\x01\x84aN\xD8V[\x92\x91PPV[_\x81Q\x90PaO\x0E\x81aE\xC0V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aO)WaO(aA~V[[_aO6\x84\x82\x85\x01aO\0V[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`2`\x04R`$_\xFD[_\x82\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_` `\x1F\x83\x01\x04\x90P\x91\x90PV[_\x82\x82\x1B\x90P\x92\x91PPV[_`\x08\x83\x02aO\xD2\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82aO\x97V[aO\xDC\x86\x83aO\x97V[\x95P\x80\x19\x84\x16\x93P\x80\x86\x16\x84\x17\x92PPP\x93\x92PPPV[_\x81\x90P\x91\x90PV[_aP\x17aP\x12aP\r\x84aA\x86V[aO\xF4V[aA\x86V[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[aP0\x83aO\xFDV[aPDaP<\x82aP\x1EV[\x84\x84TaO\xA3V[\x82UPPPPV[_\x90V[aPXaPLV[aPc\x81\x84\x84aP'V[PPPV[[\x81\x81\x10\x15aP\x86WaP{_\x82aPPV[`\x01\x81\x01\x90PaPiV[PPV[`\x1F\x82\x11\x15aP\xCBWaP\x9C\x81aOvV[aP\xA5\x84aO\x88V[\x81\x01` \x85\x10\x15aP\xB4W\x81\x90P[aP\xC8aP\xC0\x85aO\x88V[\x83\x01\x82aPhV[PP[PPPV[_\x82\x82\x1C\x90P\x92\x91PPV[_aP\xEB_\x19\x84`\x08\x02aP\xD0V[\x19\x80\x83\x16\x91PP\x92\x91PPV[_aQ\x03\x83\x83aP\xDCV[\x91P\x82`\x02\x02\x82\x17\x90P\x92\x91PPV[aQ\x1D\x83\x83aOlV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aQ6WaQ5aE\xEEV[[aQ@\x82TaLoV[aQK\x82\x82\x85aP\x8AV[_`\x1F\x83\x11`\x01\x81\x14aQxW_\x84\x15aQfW\x82\x87\x015\x90P[aQp\x85\x82aP\xF8V[\x86UPaQ\xD7V[`\x1F\x19\x84\x16aQ\x86\x86aOvV[_[\x82\x81\x10\x15aQ\xADW\x84\x89\x015\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90PaQ\x88V[\x86\x83\x10\x15aQ\xCAW\x84\x89\x015aQ\xC6`\x1F\x89\x16\x82aP\xDCV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPPV[_\x81T\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81TaR(\x81aLoV[aR2\x81\x86aR\x0CV[\x94P`\x01\x82\x16_\x81\x14aRLW`\x01\x81\x14aRbWaR\x94V[`\xFF\x19\x83\x16\x86R\x81\x15\x15` \x02\x86\x01\x93PaR\x94V[aRk\x85aOvV[_[\x83\x81\x10\x15aR\x8CW\x81T\x81\x89\x01R`\x01\x82\x01\x91P` \x81\x01\x90PaRmV[\x80\x88\x01\x95PPP[PPP\x92\x91PPV[_aR\xA8\x83\x83aR\x1CV[\x90P\x92\x91PPV[_`\x01\x82\x01\x90P\x91\x90PV[_aR\xC6\x82aQ\xE0V[aR\xD0\x81\x85aQ\xEAV[\x93P\x83` \x82\x02\x85\x01aR\xE2\x85aQ\xFAV[\x80_[\x85\x81\x10\x15aS\x1CW\x84\x84\x03\x89R\x81aR\xFD\x85\x82aR\x9DV[\x94PaS\x08\x83aR\xB0V[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaR\xE5V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_``\x82\x01\x90P\x81\x81\x03_\x83\x01RaSG\x81\x87\x89aM\x0FV[\x90P\x81\x81\x03` \x83\x01RaS[\x81\x86aR\xBCV[\x90P\x81\x81\x03`@\x83\x01RaSp\x81\x84\x86aM\x0FV[\x90P\x96\x95PPPPPPV[\x7FEIP712: Uninitialized\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aS\xB0`\x15\x83aD\x1AV[\x91PaS\xBB\x82aS|V[` \x82\x01\x90P\x91\x90PV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaS\xDD\x81aS\xA4V[\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x80\xFD[\x82\x81\x837PPPV[_aT\x0C\x83\x85aS\xE4V[\x93P\x7F\x07\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x11\x15aT?WaT>aS\xF4V[[` \x83\x02\x92PaTP\x83\x85\x84aS\xF8V[\x82\x84\x01\x90P\x93\x92PPPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaTu\x81\x84\x86aT\x01V[\x90P\x93\x92PPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aT\x98WaT\x97aE\xEEV[[` \x82\x02\x90P` \x81\x01\x90P\x91\x90PV[_\x80\xFD[_\x80\xFD[aT\xBA\x81aGlV[\x81\x14aT\xC4W_\x80\xFD[PV[_\x81Q\x90PaT\xD5\x81aT\xB1V[\x92\x91PPV[_\x81Q\x90PaT\xE9\x81aA\x8FV[\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aU\tWaU\x08aE\xEEV[[` \x82\x02\x90P` \x81\x01\x90P\x91\x90PV[_aU,aU'\x84aT\xEFV[aFLV[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15aUOWaUNaA\xC1V[[\x83[\x81\x81\x10\x15aUxW\x80aUd\x88\x82aO\0V[\x84R` \x84\x01\x93PP` \x81\x01\x90PaUQV[PPP\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aU\x96WaU\x95aA\xB9V[[\x81QaU\xA6\x84\x82` \x86\x01aU\x1AV[\x91PP\x92\x91PPV[_`\xA0\x82\x84\x03\x12\x15aU\xC4WaU\xC3aT\xA9V[[aU\xCE`\xA0aFLV[\x90P_aU\xDD\x84\x82\x85\x01aT\xC7V[_\x83\x01RP` aU\xF0\x84\x82\x85\x01aT\xDBV[` \x83\x01RP`@aV\x04\x84\x82\x85\x01aT\xC7V[`@\x83\x01RP``\x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aV(WaV'aT\xADV[[aV4\x84\x82\x85\x01aU\x82V[``\x83\x01RP`\x80aVH\x84\x82\x85\x01aT\xDBV[`\x80\x83\x01RP\x92\x91PPV[_aVfaVa\x84aT~V[aFLV[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15aV\x89WaV\x88aA\xC1V[[\x83[\x81\x81\x10\x15aV\xD0W\x80Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aV\xAEWaV\xADaA\xB9V[[\x80\x86\x01aV\xBB\x89\x82aU\xAFV[\x85R` \x85\x01\x94PPP` \x81\x01\x90PaV\x8BV[PPP\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aV\xEEWaV\xEDaA\xB9V[[\x81QaV\xFE\x84\x82` \x86\x01aVTV[\x91PP\x92\x91PPV[_` \x82\x84\x03\x12\x15aW\x1CWaW\x1BaA~V[[_\x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aW9WaW8aA\x82V[[aWE\x84\x82\x85\x01aV\xDAV[\x91PP\x92\x91PPV[_aWX\x82aA\x86V[\x91P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x03aW\x8AWaW\x89aL\x9FV[[`\x01\x82\x01\x90P\x91\x90PV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[aW\xC7\x81aGlV[\x82RPPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aW\xE7\x82aC\tV[aW\xF1\x81\x85aW\xCDV[\x93PaW\xFC\x83aC#V[\x80_[\x83\x81\x10\x15aX,W\x81QaX\x13\x88\x82aCqV[\x97PaX\x1E\x83aC\x88V[\x92PP`\x01\x81\x01\x90PaW\xFFV[P\x85\x93PPPP\x92\x91PPV[_`\xA0\x83\x01_\x83\x01QaXN_\x86\x01\x82aW\xBEV[P` \x83\x01QaXa` \x86\x01\x82aH\x1EV[P`@\x83\x01QaXt`@\x86\x01\x82aW\xBEV[P``\x83\x01Q\x84\x82\x03``\x86\x01RaX\x8C\x82\x82aW\xDDV[\x91PP`\x80\x83\x01QaX\xA1`\x80\x86\x01\x82aH\x1EV[P\x80\x91PP\x92\x91PPV[_aX\xB7\x83\x83aX9V[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aX\xD5\x82aW\x95V[aX\xDF\x81\x85aW\x9FV[\x93P\x83` \x82\x02\x85\x01aX\xF1\x85aW\xAFV[\x80_[\x85\x81\x10\x15aY,W\x84\x84\x03\x89R\x81QaY\r\x85\x82aX\xACV[\x94PaY\x18\x83aX\xBFV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaX\xF4V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_`@\x82\x01\x90P\x81\x81\x03_\x83\x01RaYV\x81\x86aX\xCBV[\x90P\x81\x81\x03` \x83\x01RaYk\x81\x84\x86aM\x0FV[\x90P\x94\x93PPPPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x835`\x01` \x03\x846\x03\x03\x81\x12aY\x9DWaY\x9CaYuV[[\x80\x84\x01\x92P\x825\x91Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aY\xBFWaY\xBEaYyV[[` \x83\x01\x92P` \x82\x026\x03\x83\x13\x15aY\xDBWaY\xDAaY}V[[P\x92P\x92\x90PV[_`\xFF\x82\x16\x90P\x91\x90PV[_aZ\taZ\x04aY\xFF\x84aY\xE3V[aO\xF4V[aA\x86V[\x90P\x91\x90PV[aZ\x19\x81aY\xEFV[\x82RPPV[_`@\x82\x01\x90PaZ2_\x83\x01\x85aZ\x10V[aZ?` \x83\x01\x84aG\xD7V[\x93\x92PPPV[_`@\x82\x84\x03\x12\x15aZ[WaZZaT\xA9V[[aZe`@aFLV[\x90P_aZt\x84\x82\x85\x01aA\xA5V[_\x83\x01RP` aZ\x87\x84\x82\x85\x01aA\xA5V[` \x83\x01RP\x92\x91PPV[_`@\x82\x84\x03\x12\x15aZ\xA8WaZ\xA7aA~V[[_aZ\xB5\x84\x82\x85\x01aZFV[\x91PP\x92\x91PPV[_\x81\x90P\x91\x90PV[_aZ\xD5` \x84\x01\x84aE\xD6V[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aZ\xF4\x83\x85aC\x13V[\x93PaZ\xFF\x82aZ\xBEV[\x80_[\x85\x81\x10\x15a[7Wa[\x14\x82\x84aZ\xC7V[a[\x1E\x88\x82aCqV[\x97Pa[)\x83aZ\xDDV[\x92PP`\x01\x81\x01\x90Pa[\x02V[P\x85\x92PPP\x93\x92PPPV[_`@\x82\x01\x90Pa[W_\x83\x01\x86aG\xE6V[\x81\x81\x03` \x83\x01Ra[j\x81\x84\x86aZ\xE9V[\x90P\x94\x93PPPPV[_a[\x86a[\x81\x84aT\xEFV[aFLV[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15a[\xA9Wa[\xA8aA\xC1V[[\x83[\x81\x81\x10\x15a[\xD2W\x80a[\xBE\x88\x82aE\xD6V[\x84R` \x84\x01\x93PP` \x81\x01\x90Pa[\xABV[PPP\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a[\xF0Wa[\xEFaA\xB9V[[\x815a\\\0\x84\x82` \x86\x01a[tV[\x91PP\x92\x91PPV[_`@\x82\x84\x03\x12\x15a\\\x1EWa\\\x1DaT\xA9V[[a\\(`@aFLV[\x90P_a\\7\x84\x82\x85\x01aA\xA5V[_\x83\x01RP` \x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\\ZWa\\YaT\xADV[[a\\f\x84\x82\x85\x01a[\xDCV[` \x83\x01RP\x92\x91PPV[_a\\}6\x83a\\\tV[\x90P\x91\x90PV[_\x81Q\x90P\x91\x90PV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_a\\\xA8\x83\x83aW\xBEV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a\\\xCA\x82a\\\x84V[a\\\xD4\x81\x85aS\xE4V[\x93Pa\\\xDF\x83a\\\x8EV[\x80_[\x83\x81\x10\x15a]\x0FW\x81Qa\\\xF6\x88\x82a\\\x9DV[\x97Pa]\x01\x83a\\\xB4V[\x92PP`\x01\x81\x01\x90Pa\\\xE2V[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra]4\x81\x84a\\\xC0V[\x90P\x92\x91PPV[_\x81Q\x90P\x91\x90PV[a]O\x82a]V[ack\x84aO\x88V[\x81\x01` \x85\x10\x15aczW\x81\x90P[ac\x8Eac\x86\x85aO\x88V[\x83\x01\x82aPhV[PP[PPPV[ac\x9F\x82aD\x10V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15ac\xB8Wac\xB7aE\xEEV[[ac\xC2\x82TaLoV[ac\xCD\x82\x82\x85acPV[_` \x90P`\x1F\x83\x11`\x01\x81\x14ac\xFEW_\x84\x15ac\xECW\x82\x87\x01Q\x90P[ac\xF6\x85\x82aP\xF8V[\x86UPad]V[`\x1F\x19\x84\x16ad\x0C\x86ac>V[_[\x82\x81\x10\x15ad3W\x84\x89\x01Q\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90Pad\x0EV[\x86\x83\x10\x15adPW\x84\x89\x01QadL`\x1F\x89\x16\x82aP\xDCV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPV[adn\x81aY\xE3V[\x82RPPV[_` \x82\x01\x90Pad\x87_\x83\x01\x84adeV[\x92\x91PPV[`T\x81\x10ad\x9EWad\x9DaK\xFCV[[PV[_\x81\x90Pad\xAE\x82ad\x8DV[\x91\x90PV[_ad\xBD\x82ad\xA1V[\x90P\x91\x90PV[ad\xCD\x81ad\xB3V[\x82RPPV[_` \x82\x01\x90Pad\xE6_\x83\x01\x84ad\xC4V[\x92\x91PPV[_\x81\x90P\x92\x91PPV[ad\xFF\x81aCQV[\x82RPPV[_ae\x10\x83\x83ad\xF6V[` \x83\x01\x90P\x92\x91PPV[_ae&\x82aC\tV[ae0\x81\x85ad\xECV[\x93Pae;\x83aC#V[\x80_[\x83\x81\x10\x15aekW\x81QaeR\x88\x82ae\x05V[\x97Pae]\x83aC\x88V[\x92PP`\x01\x81\x01\x90Pae>V[P\x85\x93PPPP\x92\x91PPV[_ae\x83\x82\x84ae\x1CV[\x91P\x81\x90P\x92\x91PPV[_`\xC0\x82\x01\x90Pae\xA1_\x83\x01\x89aGuV[ae\xAE` \x83\x01\x88aGuV[ae\xBB`@\x83\x01\x87aGuV[ae\xC8``\x83\x01\x86aG\xD7V[ae\xD5`\x80\x83\x01\x85aG\xD7V[ae\xE2`\xA0\x83\x01\x84aGuV[\x97\x96PPPPPPPV[_`\xA0\x82\x01\x90Paf\0_\x83\x01\x88aGuV[af\r` \x83\x01\x87aGuV[af\x1A`@\x83\x01\x86aGuV[af'``\x83\x01\x85aG\xD7V[af4`\x80\x83\x01\x84aG\xE6V[\x96\x95PPPPPPV[_`\x80\x82\x01\x90PafQ_\x83\x01\x87aGuV[af^` \x83\x01\x86adeV[afk`@\x83\x01\x85aGuV[afx``\x83\x01\x84aGuV[\x95\x94PPPPPV\xFEUserDecryptResponseVerification(bytes publicKey,bytes32[] ctHandles,bytes userDecryptedShare,bytes extraData)PublicDecryptVerification(bytes32[] ctHandles,bytes decryptedResult,bytes extraData)UserDecryptRequestVerification(bytes publicKey,address[] contractAddresses,uint256 startTimestamp,uint256 durationDays,bytes extraData)", ); #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] @@ -2247,7 +2264,7 @@ struct CtHandleContractPair { bytes32 ctHandle; address contractAddress; } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] /**```solidity -struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphertextDigest; address[] coprocessorTxSenderAddresses; } +struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphertextDigest; address[] coprocessorTxSenderAddresses; uint256 contextId; } ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] @@ -2262,6 +2279,8 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe pub coprocessorTxSenderAddresses: alloy::sol_types::private::Vec< alloy::sol_types::private::Address, >, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -2277,6 +2296,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe alloy::sol_types::sol_data::Uint<256>, alloy::sol_types::sol_data::FixedBytes<32>, alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Uint<256>, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( @@ -2284,6 +2304,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe alloy::sol_types::private::primitives::aliases::U256, alloy::sol_types::private::FixedBytes<32>, alloy::sol_types::private::Vec, + alloy::sol_types::private::primitives::aliases::U256, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -2305,6 +2326,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe value.keyId, value.snsCiphertextDigest, value.coprocessorTxSenderAddresses, + value.contextId, ) } } @@ -2317,6 +2339,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe keyId: tuple.1, snsCiphertextDigest: tuple.2, coprocessorTxSenderAddresses: tuple.3, + contextId: tuple.4, } } } @@ -2343,6 +2366,9 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe > as alloy_sol_types::SolType>::tokenize( &self.coprocessorTxSenderAddresses, ), + as alloy_sol_types::SolType>::tokenize(&self.contextId), ) } #[inline] @@ -2417,7 +2443,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe #[inline] fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { alloy_sol_types::private::Cow::Borrowed( - "SnsCiphertextMaterial(bytes32 ctHandle,uint256 keyId,bytes32 snsCiphertextDigest,address[] coprocessorTxSenderAddresses)", + "SnsCiphertextMaterial(bytes32 ctHandle,uint256 keyId,bytes32 snsCiphertextDigest,address[] coprocessorTxSenderAddresses,uint256 contextId)", ) } #[inline] @@ -2453,6 +2479,10 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe &self.coprocessorTxSenderAddresses, ) .0, + as alloy_sol_types::SolType>::eip712_data_word(&self.contextId) + .0, ] .concat() } @@ -2480,6 +2510,11 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe > as alloy_sol_types::EventTopic>::topic_preimage_length( &rust.coprocessorTxSenderAddresses, ) + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.contextId, + ) } #[inline] fn encode_topic_preimage( @@ -2513,6 +2548,12 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe &rust.coprocessorTxSenderAddresses, out, ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.contextId, + out, + ); } #[inline] fn encode_topic( @@ -2707,6 +2748,88 @@ error AddressEmptyCode(address target); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `CiphertextMaterialNotAdded(bytes32)` and selector `0x826b4638`. +```solidity +error CiphertextMaterialNotAdded(bytes32 ctHandle); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct CiphertextMaterialNotAdded { + #[allow(missing_docs)] + pub ctHandle: alloy::sol_types::private::FixedBytes<32>, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::FixedBytes<32>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::FixedBytes<32>,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: CiphertextMaterialNotAdded) -> Self { + (value.ctHandle,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for CiphertextMaterialNotAdded { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { ctHandle: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for CiphertextMaterialNotAdded { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "CiphertextMaterialNotAdded(bytes32)"; + const SELECTOR: [u8; 4] = [130u8, 107u8, 70u8, 56u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.ctHandle), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Custom error with signature `ContractAddressesMaxLengthExceeded(uint256,uint256)` and selector `0xaf1f0495`. ```solidity error ContractAddressesMaxLengthExceeded(uint256 maxLength, uint256 actualLength); @@ -2983,7 +3106,7 @@ error DecryptionNotRequested(uint256 decryptionId); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `DifferentKeyIdsNotAllowed((bytes32,uint256,bytes32,address[]),(bytes32,uint256,bytes32,address[]))` and selector `0xcfae921f`. + /**Custom error with signature `DifferentKeyIdsNotAllowed((bytes32,uint256,bytes32,address[],uint256),(bytes32,uint256,bytes32,address[],uint256))` and selector `0xc2eddf9d`. ```solidity error DifferentKeyIdsNotAllowed(SnsCiphertextMaterial firstSnsCtMaterial, SnsCiphertextMaterial invalidSnsCtMaterial); ```*/ @@ -3046,8 +3169,8 @@ error DifferentKeyIdsNotAllowed(SnsCiphertextMaterial firstSnsCtMaterial, SnsCip type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "DifferentKeyIdsNotAllowed((bytes32,uint256,bytes32,address[]),(bytes32,uint256,bytes32,address[]))"; - const SELECTOR: [u8; 4] = [207u8, 174u8, 146u8, 31u8]; + const SIGNATURE: &'static str = "DifferentKeyIdsNotAllowed((bytes32,uint256,bytes32,address[],uint256),(bytes32,uint256,bytes32,address[],uint256))"; + const SELECTOR: [u8; 4] = [194u8, 237u8, 223u8, 157u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -4580,166 +4703,6 @@ error MaxDurationDaysExceeded(uint256 maxValue, uint256 actualValue); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `NotCoprocessorSigner(address)` and selector `0x26cd75dc`. -```solidity -error NotCoprocessorSigner(address signerAddress); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct NotCoprocessorSigner { - #[allow(missing_docs)] - pub signerAddress: alloy::sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: NotCoprocessorSigner) -> Self { - (value.signerAddress,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for NotCoprocessorSigner { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { signerAddress: tuple.0 } - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for NotCoprocessorSigner { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "NotCoprocessorSigner(address)"; - const SELECTOR: [u8; 4] = [38u8, 205u8, 117u8, 220u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.signerAddress, - ), - ) - } - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(Self::new) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `NotCoprocessorTxSender(address)` and selector `0x52d725f5`. -```solidity -error NotCoprocessorTxSender(address txSenderAddress); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct NotCoprocessorTxSender { - #[allow(missing_docs)] - pub txSenderAddress: alloy::sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: NotCoprocessorTxSender) -> Self { - (value.txSenderAddress,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for NotCoprocessorTxSender { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { txSenderAddress: tuple.0 } - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for NotCoprocessorTxSender { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "NotCoprocessorTxSender(address)"; - const SELECTOR: [u8; 4] = [82u8, 215u8, 37u8, 245u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.txSenderAddress, - ), - ) - } - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(Self::new) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Custom error with signature `NotCustodianSigner(address)` and selector `0x391672a7`. ```solidity error NotCustodianSigner(address signerAddress); @@ -6365,7 +6328,7 @@ event Paused(address account); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],bytes)` and selector `0x22db480a39bd72556438aadb4a32a3d2a6638b87c03bbec5fef6997e109587ff`. + /**Event with signature `PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],bytes)` and selector `0xf1b11be50c03123b97d816b2941afe78c72cbaefeff5531fd1ef80ed6d2ecca8`. ```solidity event PublicDecryptionRequest(uint256 indexed decryptionId, SnsCiphertextMaterial[] snsCtMaterials, bytes extraData); ```*/ @@ -6407,11 +6370,11 @@ event PublicDecryptionRequest(uint256 indexed decryptionId, SnsCiphertextMateria alloy_sol_types::sol_data::FixedBytes<32>, alloy::sol_types::sol_data::Uint<256>, ); - const SIGNATURE: &'static str = "PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],bytes)"; + const SIGNATURE: &'static str = "PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],bytes)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 34u8, 219u8, 72u8, 10u8, 57u8, 189u8, 114u8, 85u8, 100u8, 56u8, 170u8, - 219u8, 74u8, 50u8, 163u8, 210u8, 166u8, 99u8, 139u8, 135u8, 192u8, 59u8, - 190u8, 197u8, 254u8, 246u8, 153u8, 126u8, 16u8, 149u8, 135u8, 255u8, + 241u8, 177u8, 27u8, 229u8, 12u8, 3u8, 18u8, 59u8, 151u8, 216u8, 22u8, + 178u8, 148u8, 26u8, 254u8, 120u8, 199u8, 44u8, 186u8, 239u8, 239u8, + 245u8, 83u8, 31u8, 209u8, 239u8, 128u8, 237u8, 109u8, 46u8, 204u8, 168u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -6840,7 +6803,7 @@ event Upgraded(address indexed implementation); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],address,bytes,bytes)` and selector `0xf9011bd6ba0da6049c520d70fe5971f17ed7ab795486052544b51019896c596b`. + /**Event with signature `UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],address,bytes,bytes)` and selector `0x953b685968a1a7c5f0dfb3ded7daa9f4f6b8f2d81fe33e4d272623d10e783eb8`. ```solidity event UserDecryptionRequest(uint256 indexed decryptionId, SnsCiphertextMaterial[] snsCtMaterials, address userAddress, bytes publicKey, bytes extraData); ```*/ @@ -6888,11 +6851,12 @@ event UserDecryptionRequest(uint256 indexed decryptionId, SnsCiphertextMaterial[ alloy_sol_types::sol_data::FixedBytes<32>, alloy::sol_types::sol_data::Uint<256>, ); - const SIGNATURE: &'static str = "UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],address,bytes,bytes)"; + const SIGNATURE: &'static str = "UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],address,bytes,bytes)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 249u8, 1u8, 27u8, 214u8, 186u8, 13u8, 166u8, 4u8, 156u8, 82u8, 13u8, - 112u8, 254u8, 89u8, 113u8, 241u8, 126u8, 215u8, 171u8, 121u8, 84u8, - 134u8, 5u8, 37u8, 68u8, 181u8, 16u8, 25u8, 137u8, 108u8, 89u8, 107u8, + 149u8, 59u8, 104u8, 89u8, 104u8, 161u8, 167u8, 197u8, 240u8, 223u8, + 179u8, 222u8, 215u8, 218u8, 169u8, 244u8, 246u8, 184u8, 242u8, 216u8, + 31u8, 227u8, 62u8, 77u8, 39u8, 38u8, 35u8, 209u8, 14u8, 120u8, 62u8, + 184u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -9405,6 +9369,143 @@ function publicDecryptionResponse(uint256 decryptionId, bytes memory decryptedRe }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `reinitializeV2()` and selector `0xc4115874`. +```solidity +function reinitializeV2() external; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct reinitializeV2Call; + ///Container type for the return parameters of the [`reinitializeV2()`](reinitializeV2Call) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct reinitializeV2Return {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: reinitializeV2Call) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for reinitializeV2Call { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: reinitializeV2Return) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for reinitializeV2Return { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl reinitializeV2Return { + fn _tokenize( + &self, + ) -> ::ReturnToken<'_> { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for reinitializeV2Call { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = reinitializeV2Return; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "reinitializeV2()"; + const SELECTOR: [u8; 4] = [196u8, 17u8, 88u8, 116u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + reinitializeV2Return::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Function with signature `unpause()` and selector `0x3f4ba83a`. ```solidity function unpause() external; @@ -10144,6 +10245,8 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted #[allow(missing_docs)] publicDecryptionResponse(publicDecryptionResponseCall), #[allow(missing_docs)] + reinitializeV2(reinitializeV2Call), + #[allow(missing_docs)] unpause(unpauseCall), #[allow(missing_docs)] upgradeToAndCall(upgradeToAndCallCall), @@ -10175,6 +10278,7 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted [132u8, 86u8, 203u8, 89u8], [132u8, 176u8, 25u8, 110u8], [173u8, 60u8, 177u8, 204u8], + [196u8, 17u8, 88u8, 116u8], [216u8, 153u8, 143u8, 69u8], [241u8, 181u8, 122u8, 219u8], [251u8, 184u8, 50u8, 89u8], @@ -10184,7 +10288,7 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted impl alloy_sol_types::SolInterface for DecryptionCalls { const NAME: &'static str = "DecryptionCalls"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 17usize; + const COUNT: usize = 18usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -10223,6 +10327,9 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted Self::publicDecryptionResponse(_) => { ::SELECTOR } + Self::reinitializeV2(_) => { + ::SELECTOR + } Self::unpause(_) => ::SELECTOR, Self::upgradeToAndCall(_) => { ::SELECTOR @@ -10394,6 +10501,17 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted } UPGRADE_INTERFACE_VERSION }, + { + fn reinitializeV2( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(DecryptionCalls::reinitializeV2) + } + reinitializeV2 + }, { fn publicDecryptionRequest( data: &[u8], @@ -10595,6 +10713,17 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted } UPGRADE_INTERFACE_VERSION }, + { + fn reinitializeV2( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(DecryptionCalls::reinitializeV2) + } + reinitializeV2 + }, { fn publicDecryptionRequest( data: &[u8], @@ -10701,6 +10830,11 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted inner, ) } + Self::reinitializeV2(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::unpause(inner) => { ::abi_encoded_size(inner) } @@ -10796,6 +10930,12 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted out, ) } + Self::reinitializeV2(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::unpause(inner) => { ::abi_encode_raw(inner, out) } @@ -10829,6 +10969,8 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted #[allow(missing_docs)] AddressEmptyCode(AddressEmptyCode), #[allow(missing_docs)] + CiphertextMaterialNotAdded(CiphertextMaterialNotAdded), + #[allow(missing_docs)] ContractAddressesMaxLengthExceeded(ContractAddressesMaxLengthExceeded), #[allow(missing_docs)] ContractNotInContractAddresses(ContractNotInContractAddresses), @@ -10875,10 +11017,6 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted #[allow(missing_docs)] MaxDurationDaysExceeded(MaxDurationDaysExceeded), #[allow(missing_docs)] - NotCoprocessorSigner(NotCoprocessorSigner), - #[allow(missing_docs)] - NotCoprocessorTxSender(NotCoprocessorTxSender), - #[allow(missing_docs)] NotCustodianSigner(NotCustodianSigner), #[allow(missing_docs)] NotCustodianTxSender(NotCustodianTxSender), @@ -10922,7 +11060,6 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted pub const SELECTORS: &'static [[u8; 4usize]] = &[ [14u8, 86u8, 207u8, 61u8], [22u8, 10u8, 43u8, 75u8], - [38u8, 205u8, 117u8, 220u8], [42u8, 124u8, 110u8, 246u8], [42u8, 135u8, 61u8, 39u8], [45u8, 231u8, 84u8, 56u8], @@ -10932,10 +11069,10 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted [57u8, 22u8, 114u8, 167u8], [67u8, 49u8, 168u8, 93u8], [76u8, 156u8, 140u8, 227u8], - [82u8, 215u8, 37u8, 245u8], [87u8, 207u8, 162u8, 23u8], [100u8, 25u8, 80u8, 215u8], [111u8, 79u8, 115u8, 31u8], + [130u8, 107u8, 70u8, 56u8], [141u8, 252u8, 32u8, 43u8], [153u8, 150u8, 179u8, 21u8], [153u8, 236u8, 72u8, 217u8], @@ -10947,7 +11084,7 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted [179u8, 152u8, 151u8, 159u8], [182u8, 103u8, 156u8, 59u8], [190u8, 120u8, 48u8, 177u8], - [207u8, 174u8, 146u8, 31u8], + [194u8, 237u8, 223u8, 157u8], [212u8, 138u8, 249u8, 66u8], [214u8, 189u8, 162u8, 117u8], [215u8, 139u8, 206u8, 12u8], @@ -10969,7 +11106,7 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted impl alloy_sol_types::SolInterface for DecryptionErrors { const NAME: &'static str = "DecryptionErrors"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 43usize; + const COUNT: usize = 42usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -10979,6 +11116,9 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted Self::AddressEmptyCode(_) => { ::SELECTOR } + Self::CiphertextMaterialNotAdded(_) => { + ::SELECTOR + } Self::ContractAddressesMaxLengthExceeded(_) => { ::SELECTOR } @@ -11048,12 +11188,6 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted Self::MaxDurationDaysExceeded(_) => { ::SELECTOR } - Self::NotCoprocessorSigner(_) => { - ::SELECTOR - } - Self::NotCoprocessorTxSender(_) => { - ::SELECTOR - } Self::NotCustodianSigner(_) => { ::SELECTOR } @@ -11143,17 +11277,6 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted } AccountNotAllowedToUseCiphertext }, - { - fn NotCoprocessorSigner( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(DecryptionErrors::NotCoprocessorSigner) - } - NotCoprocessorSigner - }, { fn NotKmsSigner( data: &[u8], @@ -11251,17 +11374,6 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted } ERC1967InvalidImplementation }, - { - fn NotCoprocessorTxSender( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(DecryptionErrors::NotCoprocessorTxSender) - } - NotCoprocessorTxSender - }, { fn EmptyContractAddresses( data: &[u8], @@ -11295,6 +11407,17 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted } NotInitializingFromEmptyProxy }, + { + fn CiphertextMaterialNotAdded( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(DecryptionErrors::CiphertextMaterialNotAdded) + } + CiphertextMaterialNotAdded + }, { fn ExpectedPause( data: &[u8], @@ -11632,17 +11755,6 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted } AccountNotAllowedToUseCiphertext }, - { - fn NotCoprocessorSigner( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(DecryptionErrors::NotCoprocessorSigner) - } - NotCoprocessorSigner - }, { fn NotKmsSigner( data: &[u8], @@ -11742,17 +11854,6 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted } ERC1967InvalidImplementation }, - { - fn NotCoprocessorTxSender( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(DecryptionErrors::NotCoprocessorTxSender) - } - NotCoprocessorTxSender - }, { fn EmptyContractAddresses( data: &[u8], @@ -11786,6 +11887,17 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted } NotInitializingFromEmptyProxy }, + { + fn CiphertextMaterialNotAdded( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(DecryptionErrors::CiphertextMaterialNotAdded) + } + CiphertextMaterialNotAdded + }, { fn ExpectedPause( data: &[u8], @@ -12107,6 +12219,11 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted inner, ) } + Self::CiphertextMaterialNotAdded(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::ContractAddressesMaxLengthExceeded(inner) => { ::abi_encoded_size( inner, @@ -12216,16 +12333,6 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted inner, ) } - Self::NotCoprocessorSigner(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::NotCoprocessorTxSender(inner) => { - ::abi_encoded_size( - inner, - ) - } Self::NotCustodianSigner(inner) => { ::abi_encoded_size( inner, @@ -12321,6 +12428,12 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted out, ) } + Self::CiphertextMaterialNotAdded(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::ContractAddressesMaxLengthExceeded(inner) => { ::abi_encode_raw( inner, @@ -12456,18 +12569,6 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted out, ) } - Self::NotCoprocessorSigner(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::NotCoprocessorTxSender(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } Self::NotCustodianSigner(inner) => { ::abi_encode_raw( inner, @@ -12606,11 +12707,6 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted 180u8, 243u8, 177u8, 81u8, 119u8, 15u8, 112u8, 8u8, 81u8, 23u8, 161u8, 95u8, 155u8, 243u8, 120u8, 124u8, 218u8, 83u8, 241u8, 61u8, 49u8, ], - [ - 34u8, 219u8, 72u8, 10u8, 57u8, 189u8, 114u8, 85u8, 100u8, 56u8, 170u8, - 219u8, 74u8, 50u8, 163u8, 210u8, 166u8, 99u8, 139u8, 135u8, 192u8, 59u8, - 190u8, 197u8, 254u8, 246u8, 153u8, 126u8, 16u8, 149u8, 135u8, 255u8, - ], [ 93u8, 185u8, 238u8, 10u8, 73u8, 91u8, 242u8, 230u8, 255u8, 156u8, 145u8, 167u8, 131u8, 76u8, 27u8, 164u8, 253u8, 210u8, 68u8, 165u8, 232u8, 170u8, @@ -12626,6 +12722,12 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted 10u8, 84u8, 112u8, 163u8, 63u8, 90u8, 73u8, 186u8, 100u8, 69u8, 240u8, 94u8, 196u8, 60u8, 116u8, 192u8, 188u8, 44u8, 198u8, 8u8, 178u8, ], + [ + 149u8, 59u8, 104u8, 89u8, 104u8, 161u8, 167u8, 197u8, 240u8, 223u8, + 179u8, 222u8, 215u8, 218u8, 169u8, 244u8, 246u8, 184u8, 242u8, 216u8, + 31u8, 227u8, 62u8, 77u8, 39u8, 38u8, 35u8, 209u8, 14u8, 120u8, 62u8, + 184u8, + ], [ 188u8, 124u8, 215u8, 90u8, 32u8, 238u8, 39u8, 253u8, 154u8, 222u8, 186u8, 179u8, 32u8, 65u8, 247u8, 85u8, 33u8, 77u8, 188u8, 107u8, 255u8, 169u8, @@ -12647,9 +12749,9 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted 34u8, 116u8, 197u8, 136u8, 30u8, 72u8, 238u8, 161u8, 237u8, 37u8, ], [ - 249u8, 1u8, 27u8, 214u8, 186u8, 13u8, 166u8, 4u8, 156u8, 82u8, 13u8, - 112u8, 254u8, 89u8, 113u8, 241u8, 126u8, 215u8, 171u8, 121u8, 84u8, - 134u8, 5u8, 37u8, 68u8, 181u8, 16u8, 25u8, 137u8, 108u8, 89u8, 107u8, + 241u8, 177u8, 27u8, 229u8, 12u8, 3u8, 18u8, 59u8, 151u8, 216u8, 22u8, + 178u8, 148u8, 26u8, 254u8, 120u8, 199u8, 44u8, 186u8, 239u8, 239u8, + 245u8, 83u8, 31u8, 209u8, 239u8, 128u8, 237u8, 109u8, 46u8, 204u8, 168u8, ], ]; } @@ -13103,6 +13205,12 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ }, ) } + ///Creates a new call builder for the [`reinitializeV2`] function. + pub fn reinitializeV2( + &self, + ) -> alloy_contract::SolCallBuilder<&P, reinitializeV2Call, N> { + self.call_builder(&reinitializeV2Call) + } ///Creates a new call builder for the [`unpause`] function. pub fn unpause(&self) -> alloy_contract::SolCallBuilder<&P, unpauseCall, N> { self.call_builder(&unpauseCall) diff --git a/gateway-contracts/rust_bindings/src/gateway_config.rs b/gateway-contracts/rust_bindings/src/gateway_config.rs index 74c46ff809..dde223d6b1 100644 --- a/gateway-contracts/rust_bindings/src/gateway_config.rs +++ b/gateway-contracts/rust_bindings/src/gateway_config.rs @@ -3,11 +3,6 @@ Generated by the following Solidity interface... ```solidity interface GatewayConfig { - struct Coprocessor { - address txSenderAddress; - address signerAddress; - string s3BucketUrl; - } struct Custodian { address txSenderAddress; address signerAddress; @@ -35,7 +30,6 @@ interface GatewayConfig { error ChainIdNotUint64(uint256 chainId); error ERC1967InvalidImplementation(address implementation); error ERC1967NonPayable(); - error EmptyCoprocessors(); error EmptyCustodians(); error EmptyKmsNodes(); error FailedCall(); @@ -58,7 +52,7 @@ interface GatewayConfig { error UUPSUnsupportedProxiableUUID(bytes32 slot); event AddHostChain(HostChain hostChain); - event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, KmsNode[] kmsNodes, Coprocessor[] coprocessors, Custodian[] custodians); + event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, KmsNode[] kmsNodes, Custodian[] custodians); event Initialized(uint64 version); event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); @@ -75,10 +69,6 @@ interface GatewayConfig { function UPGRADE_INTERFACE_VERSION() external view returns (string memory); function acceptOwnership() external; function addHostChain(HostChain memory hostChain) external; - function getCoprocessor(address coprocessorTxSenderAddress) external view returns (Coprocessor memory); - function getCoprocessorMajorityThreshold() external view returns (uint256); - function getCoprocessorSigners() external view returns (address[] memory); - function getCoprocessorTxSenders() external view returns (address[] memory); function getCustodian(address custodianTxSenderAddress) external view returns (Custodian memory); function getCustodianSigners() external view returns (address[] memory); function getCustodianTxSenders() external view returns (address[] memory); @@ -93,9 +83,7 @@ interface GatewayConfig { function getPublicDecryptionThreshold() external view returns (uint256); function getUserDecryptionThreshold() external view returns (uint256); function getVersion() external pure returns (string memory); - function initializeFromEmptyProxy(ProtocolMetadata memory initialMetadata, uint256 initialMpcThreshold, uint256 initialPublicDecryptionThreshold, uint256 initialUserDecryptionThreshold, uint256 initialKmsGenThreshold, KmsNode[] memory initialKmsNodes, Coprocessor[] memory initialCoprocessors, Custodian[] memory initialCustodians) external; - function isCoprocessorSigner(address signerAddress) external view returns (bool); - function isCoprocessorTxSender(address txSenderAddress) external view returns (bool); + function initializeFromEmptyProxy(ProtocolMetadata memory initialMetadata, uint256 initialMpcThreshold, uint256 initialPublicDecryptionThreshold, uint256 initialUserDecryptionThreshold, uint256 initialKmsGenThreshold, KmsNode[] memory initialKmsNodes, Custodian[] memory initialCustodians) external; function isCustodianSigner(address signerAddress) external view returns (bool); function isCustodianTxSender(address txSenderAddress) external view returns (bool); function isHostChainRegistered(uint256 chainId) external view returns (bool); @@ -106,6 +94,7 @@ interface GatewayConfig { function pauseAllGatewayContracts() external; function pendingOwner() external view returns (address); function proxiableUUID() external view returns (bytes32); + function reinitializeV2() external; function renounceOwnership() external; function transferOwnership(address newOwner) external; function unpauseAllGatewayContracts() external; @@ -185,81 +174,6 @@ interface GatewayConfig { "outputs": [], "stateMutability": "nonpayable" }, - { - "type": "function", - "name": "getCoprocessor", - "inputs": [ - { - "name": "coprocessorTxSenderAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct Coprocessor", - "components": [ - { - "name": "txSenderAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "signerAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "s3BucketUrl", - "type": "string", - "internalType": "string" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getCoprocessorMajorityThreshold", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getCoprocessorSigners", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address[]", - "internalType": "address[]" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getCoprocessorTxSenders", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address[]", - "internalType": "address[]" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "getCustodian", @@ -633,28 +547,6 @@ interface GatewayConfig { } ] }, - { - "name": "initialCoprocessors", - "type": "tuple[]", - "internalType": "struct Coprocessor[]", - "components": [ - { - "name": "txSenderAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "signerAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "s3BucketUrl", - "type": "string", - "internalType": "string" - } - ] - }, { "name": "initialCustodians", "type": "tuple[]", @@ -681,44 +573,6 @@ interface GatewayConfig { "outputs": [], "stateMutability": "nonpayable" }, - { - "type": "function", - "name": "isCoprocessorSigner", - "inputs": [ - { - "name": "signerAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "isCoprocessorTxSender", - "inputs": [ - { - "name": "txSenderAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "isCustodianSigner", @@ -879,6 +733,13 @@ interface GatewayConfig { ], "stateMutability": "view" }, + { + "type": "function", + "name": "reinitializeV2", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "renounceOwnership", @@ -1072,29 +933,6 @@ interface GatewayConfig { } ] }, - { - "name": "coprocessors", - "type": "tuple[]", - "indexed": false, - "internalType": "struct Coprocessor[]", - "components": [ - { - "name": "txSenderAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "signerAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "s3BucketUrl", - "type": "string", - "internalType": "string" - } - ] - }, { "name": "custodians", "type": "tuple[]", @@ -1287,11 +1125,6 @@ interface GatewayConfig { "name": "ERC1967NonPayable", "inputs": [] }, - { - "type": "error", - "name": "EmptyCoprocessors", - "inputs": [] - }, { "type": "error", "name": "EmptyCustodians", @@ -1481,37 +1314,37 @@ pub mod GatewayConfig { /// The creation / init bytecode of the contract. /// /// ```text - ///0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000043575f80fd5b50620000546200005a60201b60201c565b620001c4565b5f6200006b6200015e60201b60201c565b9050805f0160089054906101000a900460ff1615620000b6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146200015b5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051620001529190620001a9565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b620001a38162000185565b82525050565b5f602082019050620001be5f83018462000198565b92915050565b608051615ecf620001eb5f395f81816132e30152818161333801526134f20152615ecf5ff3fe608060405260043610610250575f3560e01c806379ba509711610138578063bff3aaba116100b5578063e30c397811610079578063e30c397814610876578063e3b2a874146108a0578063e5275eaf146108dc578063eb843cf614610918578063ef6997f914610940578063f2fde38b1461097c57610250565b8063bff3aaba14610770578063c2b42986146107ac578063c80b33ca146107d6578063cb5aa7e9146107fe578063d10f7ff91461083a57610250565b80639164d0ae116100fc5780639164d0ae146106b25780639a5a3bc4146106dc578063ad3cb1cc146106f2578063b4722bc41461071c578063ba1f31d21461074657610250565b806379ba5097146105e45780637eaac8f2146105fa578063882d7dd3146106245780638b8dd876146106605780638da5cb5b1461068857610250565b80632e2d3a82116101d15780635bace7ff116101955780635bace7ff146105005780636799ef521461053c578063715018a6146105665780637420f3d41461057c578063772d2fe9146105a6578063798b58a6146105ce57610250565b80632e2d3a821461042c57806346fbf68e1461045457806348144c61146104905780634f1ef286146104ba57806352d1902d146104d657610250565b806326cf5def1161021857806326cf5def146103365780632a388998146103605780632a8b9de91461038a5780632b101c03146103b45780632dd3edfe146103f057610250565b80630724dd23146102545780630d8e6e2c1461027c5780631ea5bd42146102a6578063203d0114146102d05780632585bb651461030c575b5f80fd5b34801561025f575f80fd5b5061027a60048036038101906102759190613f3c565b6109a4565b005b348015610287575f80fd5b506102906109ef565b60405161029d9190613ff1565b60405180910390f35b3480156102b1575f80fd5b506102ba610a6a565b6040516102c791906140f8565b60405180910390f35b3480156102db575f80fd5b506102f660048036038101906102f19190614142565b610b03565b6040516103039190614187565b60405180910390f35b348015610317575f80fd5b50610320610b63565b60405161032d919061432c565b60405180910390f35b348015610341575f80fd5b5061034a610da0565b604051610357919061435b565b60405180910390f35b34801561036b575f80fd5b50610374610db7565b604051610381919061435b565b60405180910390f35b348015610395575f80fd5b5061039e610dce565b6040516103ab91906140f8565b60405180910390f35b3480156103bf575f80fd5b506103da60048036038101906103d59190614142565b610e67565b6040516103e79190614187565b60405180910390f35b3480156103fb575f80fd5b5061041660048036038101906104119190614142565b610ec7565b6040516104239190614187565b60405180910390f35b348015610437575f80fd5b50610452600480360381019061044d9190613f3c565b610f27565b005b34801561045f575f80fd5b5061047a60048036038101906104759190614142565b610f72565b6040516104879190614187565b60405180910390f35b34801561049b575f80fd5b506104a4611006565b6040516104b191906143b5565b60405180910390f35b6104d460048036038101906104cf9190614501565b61114c565b005b3480156104e1575f80fd5b506104ea61116b565b6040516104f79190614573565b60405180910390f35b34801561050b575f80fd5b5061052660048036038101906105219190614142565b61119c565b6040516105339190614187565b60405180910390f35b348015610547575f80fd5b506105506111fc565b60405161055d919061435b565b60405180910390f35b348015610571575f80fd5b5061057a61122e565b005b348015610587575f80fd5b50610590611241565b60405161059d91906140f8565b60405180910390f35b3480156105b1575f80fd5b506105cc60048036038101906105c79190613f3c565b6112da565b005b3480156105d9575f80fd5b506105e2611325565b005b3480156105ef575f80fd5b506105f8611439565b005b348015610605575f80fd5b5061060e6114c7565b60405161061b91906140f8565b60405180910390f35b34801561062f575f80fd5b5061064a60048036038101906106459190614142565b611560565b6040516106579190614187565b60405180910390f35b34801561066b575f80fd5b5061068660048036038101906106819190614afc565b6115c0565b005b348015610693575f80fd5b5061069c6121fd565b6040516106a99190614c2c565b60405180910390f35b3480156106bd575f80fd5b506106c6612232565b6040516106d391906140f8565b60405180910390f35b3480156106e7575f80fd5b506106f06122cb565b005b3480156106fd575f80fd5b50610706612421565b6040516107139190613ff1565b60405180910390f35b348015610727575f80fd5b5061073061245a565b60405161073d919061435b565b60405180910390f35b348015610751575f80fd5b5061075a612471565b60405161076791906140f8565b60405180910390f35b34801561077b575f80fd5b5061079660048036038101906107919190613f3c565b61250a565b6040516107a39190614187565b60405180910390f35b3480156107b7575f80fd5b506107c061253e565b6040516107cd919061435b565b60405180910390f35b3480156107e1575f80fd5b506107fc60048036038101906107f79190614c67565b612555565b005b348015610809575f80fd5b50610824600480360381019061081f9190614142565b612703565b6040516108319190614d4d565b60405180910390f35b348015610845575f80fd5b50610860600480360381019061085b9190613f3c565b6128a1565b60405161086d9190614de7565b60405180910390f35b348015610881575f80fd5b5061088a612abc565b6040516108979190614c2c565b60405180910390f35b3480156108ab575f80fd5b506108c660048036038101906108c19190614142565b612af1565b6040516108d39190614e6e565b60405180910390f35b3480156108e7575f80fd5b5061090260048036038101906108fd9190614142565b612d1f565b60405161090f9190614187565b60405180910390f35b348015610923575f80fd5b5061093e60048036038101906109399190613f3c565b612d7f565b005b34801561094b575f80fd5b5061096660048036038101906109619190614142565b612dca565b6040516109739190614edb565b60405180910390f35b348015610987575f80fd5b506109a2600480360381019061099d9190614142565b612f68565b005b6109ac613021565b6109b5816130a8565b7f30c9b1d004f57eae3c6cc3a3752bcb4c8ea2e57c8241a782aa9b65fbc604ec5b816040516109e4919061435b565b60405180910390a150565b60606040518060400160405280600d81526020017f47617465776179436f6e66696700000000000000000000000000000000000000815250610a305f61314c565b610a3a600161314c565b610a435f61314c565b604051602001610a569493929190614fc9565b604051602081830303815290604052905090565b60605f610a75613216565b905080600d01805480602002602001604051908101604052809291908181526020018280548015610af857602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610aaf575b505050505091505090565b5f80610b0d613216565b9050806003015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b60605f610b6e613216565b905080601001805480602002602001604051908101604052809291908181526020015f905b82821015610d96578382905f5260205f2090600502016040518060a00160405290815f8201548152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382018054610c7790615054565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca390615054565b8015610cee5780601f10610cc557610100808354040283529160200191610cee565b820191905f5260205f20905b815481529060010190602001808311610cd157829003601f168201915b50505050508152602001600482018054610d0790615054565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3390615054565b8015610d7e5780601f10610d5557610100808354040283529160200191610d7e565b820191905f5260205f20905b815481529060010190602001808311610d6157829003601f168201915b50505050508152505081526020019060010190610b93565b5050505091505090565b5f80610daa613216565b9050806007015491505090565b5f80610dc1613216565b9050806008015491505090565b60605f610dd9613216565b905080601201805480602002602001604051908101604052809291908181526020018280548015610e5c57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610e13575b505050505091505090565b5f80610e71613216565b905080600b015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b5f80610ed1613216565b905080600a015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b610f2f613021565b610f388161323d565b7fe41802af725729adcb8c151e2937380a25c69155757e3af5d3979adab503580081604051610f67919061435b565b60405180910390a150565b5f73c1d733116990ce3d9e54f9ecf48a1cdd441af4f973ffffffffffffffffffffffffffffffffffffffff166346fbf68e836040518263ffffffff1660e01b8152600401610fc09190614c2c565b602060405180830381865afa158015610fdb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fff91906150ae565b9050919050565b61100e613d9e565b5f611017613216565b9050805f016040518060400160405290815f8201805461103690615054565b80601f016020809104026020016040519081016040528092919081815260200182805461106290615054565b80156110ad5780601f10611084576101008083540402835291602001916110ad565b820191905f5260205f20905b81548152906001019060200180831161109057829003601f168201915b505050505081526020016001820180546110c690615054565b80601f01602080910402602001604051908101604052809291908181526020018280546110f290615054565b801561113d5780601f106111145761010080835404028352916020019161113d565b820191905f5260205f20905b81548152906001019060200180831161112057829003601f168201915b50505050508152505091505090565b6111546132e1565b61115d826133c7565b61116782826133d2565b5050565b5f6111746134f0565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f806111a6613216565b9050806014015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b5f80611206613216565b90506001600282600d018054905061121e9190615133565b6112289190615163565b91505090565b611236613021565b61123f5f613577565b565b60605f61124c613216565b9050806005018054806020026020016040519081016040528092919081815260200182805480156112cf57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611286575b505050505091505090565b6112e2613021565b6112eb816135b4565b7f3571172a49e72d7724be384cdd59f4f21a216c70352ea59cb02543fc763084378160405161131a919061435b565b60405180910390a150565b61132d613021565b73de409109e0fccaae7b87de518f61d617a3fda09473ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611386575f80fd5b505af1158015611398573d5f803e3d5ffd5b5050505073817a285f1fca3bb4084cbfc77d4babc238ad609c73ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156113f5575f80fd5b505af1158015611407573d5f803e3d5ffd5b505050507fbe4f655daae0dbaef63a6b525cab2fa6ace4aa5b94b8834b241137cdfe73a5b060405160405180910390a1565b5f61144261361e565b90508073ffffffffffffffffffffffffffffffffffffffff16611463612abc565b73ffffffffffffffffffffffffffffffffffffffff16146114bb57806040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016114b29190614c2c565b60405180910390fd5b6114c481613577565b50565b60605f6114d2613216565b90508060060180548060200260200160405190810160405280929190818152602001828054801561155557602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161150c575b505050505091505090565b5f8061156a613216565b9050806015015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b60016115ca613625565b67ffffffffffffffff161461160b576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f611616613649565b9050805f0160089054906101000a900460ff168061165e57508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15611695576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055506116ea6116e56121fd565b613670565b5f855103611724576040517f068c8d4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84510361175e576040517f8af082ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835103611798576040517fcad1d53400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6117a1613216565b90508a815f015f820151815f0190816117ba9190615333565b5060208201518160010190816117d09190615333565b509050505f5b8651811015611b04576001826002015f8984815181106117f9576117f8615402565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555086818151811061186657611865615402565b5b6020026020010151826004015f89848151811061188657611885615402565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020190816119699190615333565b50606082015181600301908161197f9190615333565b509050508160050187828151811061199a57611999615402565b5b60200260200101515f0151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001826003015f898481518110611a1c57611a1b615402565b5b60200260200101516020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555081600601878281518110611a8e57611a8d615402565b5b602002602001015160200151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080806001019150506117d6565b50611b0e8a6135b4565b611b178961323d565b611b2088613684565b611b29876130a8565b5f5b8551811015611e4357600182600a015f888481518110611b4e57611b4d615402565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550858181518110611bbb57611bba615402565b5b602002602001015182600c015f888481518110611bdb57611bda615402565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019081611cbe9190615333565b5090505081600d01868281518110611cd957611cd8615402565b5b60200260200101515f0151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182600b015f888481518110611d5b57611d5a615402565b5b60200260200101516020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555081600e01868281518110611dcd57611dcc615402565b5b602002602001015160200151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080600101915050611b2b565b505f5b845181101561215e57848181518110611e6257611e61615402565b5b6020026020010151826011015f878481518110611e8257611e81615402565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019081611f659190615487565b5090505081601201858281518110611f8057611f7f615402565b5b60200260200101515f0151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001826014015f87848151811061200257612001615402565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508160130185828151811061207357612072615402565b5b602002602001015160200151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001826015015f8784815181106120f6576120f5615402565b5b60200260200101516020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508080600101915050611e46565b507f3a7c54b1195d44a288f9c3c9a0679aed9325068e0d0d5b69e96047355cc717458b8b888888604051612196959493929190615888565b60405180910390a1505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2826040516121e99190615917565b60405180910390a150505050505050505050565b5f80612207613728565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b60605f61223d613216565b905080600e018054806020026020016040519081016040528092919081815260200182805480156122c057602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612277575b505050505091505090565b6122d433610f72565b61231557336040517f206a346e00000000000000000000000000000000000000000000000000000000815260040161230c9190614c2c565b60405180910390fd5b73de409109e0fccaae7b87de518f61d617a3fda09473ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561236e575f80fd5b505af1158015612380573d5f803e3d5ffd5b5050505073817a285f1fca3bb4084cbfc77d4babc238ad609c73ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156123dd575f80fd5b505af11580156123ef573d5f803e3d5ffd5b505050507f13dbe8823219e226dd0525aeb071e1d2679f89382ba799f7f644867e65b6f3a660405160405180910390a1565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b5f80612464613216565b9050806016015491505090565b60605f61247c613216565b9050806013018054806020026020016040519081016040528092919081815260200182805480156124ff57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116124b6575b505050505091505090565b5f80612514613216565b905080600f015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b5f80612548613216565b9050806009015491505090565b61255d613021565b5f815f013503612599576040517f22f73fea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f013511156125ee57805f01356040517f4178de420000000000000000000000000000000000000000000000000000000081526004016125e5919061435b565b60405180910390fd5b5f6125f7613216565b905080600f015f835f013581526020019081526020015f205f9054906101000a900460ff161561266157815f01356040517f96a56828000000000000000000000000000000000000000000000000000000008152600401612658919061435b565b60405180910390fd5b8060100182908060018154018082558091505060019003905f5260205f2090600502015f9091909190915081816126989190615c69565b5050600181600f015f845f013581526020019081526020015f205f6101000a81548160ff0219169083151502179055507f66769341effd268fc4e9a9c8f27bfc968507b519b0ddb9b4ad3ded5f03016837826040516126f79190615de3565b60405180910390a15050565b61270b613db8565b5f612714613216565b9050806011015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201805461281990615054565b80601f016020809104026020016040519081016040528092919081815260200182805461284590615054565b80156128905780601f1061286757610100808354040283529160200191612890565b820191905f5260205f20905b81548152906001019060200180831161287357829003601f168201915b505050505081525050915050919050565b6128a9613e03565b5f6128b2613216565b90508060100183815481106128ca576128c9615402565b5b905f5260205f2090600502016040518060a00160405290815f8201548152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820180546129a490615054565b80601f01602080910402602001604051908101604052809291908181526020018280546129d090615054565b8015612a1b5780601f106129f257610100808354040283529160200191612a1b565b820191905f5260205f20905b8154815290600101906020018083116129fe57829003601f168201915b50505050508152602001600482018054612a3490615054565b80601f0160208091040260200160405190810160405280929190818152602001828054612a6090615054565b8015612aab5780601f10612a8257610100808354040283529160200191612aab565b820191905f5260205f20905b815481529060010190602001808311612a8e57829003601f168201915b505050505081525050915050919050565b5f80612ac661374f565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b612af9613e5b565b5f612b02613216565b9050806004015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060800160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282018054612c0790615054565b80601f0160208091040260200160405190810160405280929190818152602001828054612c3390615054565b8015612c7e5780601f10612c5557610100808354040283529160200191612c7e565b820191905f5260205f20905b815481529060010190602001808311612c6157829003601f168201915b50505050508152602001600382018054612c9790615054565b80601f0160208091040260200160405190810160405280929190818152602001828054612cc390615054565b8015612d0e5780601f10612ce557610100808354040283529160200191612d0e565b820191905f5260205f20905b815481529060010190602001808311612cf157829003601f168201915b505050505081525050915050919050565b5f80612d29613216565b9050806002015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b612d87613021565b612d9081613684565b7f837e0a6528dadfa2dc792692c5182e52a9f5bbdeed7b2372927a26c69583961381604051612dbf919061435b565b60405180910390a150565b612dd2613ead565b5f612ddb613216565b905080600c015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282018054612ee090615054565b80601f0160208091040260200160405190810160405280929190818152602001828054612f0c90615054565b8015612f575780601f10612f2e57610100808354040283529160200191612f57565b820191905f5260205f20905b815481529060010190602001808311612f3a57829003601f168201915b505050505081525050915050919050565b612f70613021565b5f612f7961374f565b905081815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16612fdb6121fd565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b61302961361e565b73ffffffffffffffffffffffffffffffffffffffff166130476121fd565b73ffffffffffffffffffffffffffffffffffffffff16146130a65761306a61361e565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161309d9190614c2c565b60405180910390fd5b565b5f6130b1613216565b90505f816006018054905090505f83036130f7576040517f3ee5077400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8083111561313e5782816040517f0f69cbfc000000000000000000000000000000000000000000000000000000008152600401613135929190615e03565b60405180910390fd5b828260160181905550505050565b60605f600161315a84613776565b0190505f8167ffffffffffffffff811115613178576131776143dd565b5b6040519080825280601f01601f1916602001820160405280156131aa5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561320b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581613200576131ff6150d9565b5b0494505f85036131b7575b819350505050919050565b5f7f86d3070a8993f6b209bee6185186d38a07fce8bbd97c750d934451b72f35b400905090565b5f613246613216565b90505f816006018054905090505f830361328c576040517fb1ae92ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156132d35782816040517f84208f230000000000000000000000000000000000000000000000000000000081526004016132ca929190615e03565b60405180910390fd5b828260080181905550505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148061338e57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166133756138c7565b73ffffffffffffffffffffffffffffffffffffffff1614155b156133c5576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6133cf613021565b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561343a57506040513d601f19601f820116820180604052508101906134379190615e54565b60015b61347b57816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016134729190614c2c565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b81146134e157806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016134d89190614573565b60405180910390fd5b6134eb838361391a565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614613575576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f61358061374f565b9050805f015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556135b08261398c565b5050565b5f6135bd613216565b90505f816006018054905090508083106136105782816040517f907e6681000000000000000000000000000000000000000000000000000000008152600401613607929190615e03565b60405180910390fd5b828260070181905550505050565b5f33905090565b5f61362e613649565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b613678613a5d565b61368181613a9d565b50565b5f61368d613216565b90505f816006018054905090505f83036136d3576040517fe60a727100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8083111561371a5782816040517fd2535e11000000000000000000000000000000000000000000000000000000008152600401613711929190615e03565b60405180910390fd5b828260090181905550505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00905090565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106137d2577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816137c8576137c76150d9565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061380f576d04ee2d6d415b85acef81000000008381613805576138046150d9565b5b0492506020810190505b662386f26fc10000831061383e57662386f26fc100008381613834576138336150d9565b5b0492506010810190505b6305f5e1008310613867576305f5e100838161385d5761385c6150d9565b5b0492506008810190505b612710831061388c576127108381613882576138816150d9565b5b0492506004810190505b606483106138af57606483816138a5576138a46150d9565b5b0492506002810190505b600a83106138be576001810190505b80915050919050565b5f6138f37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613b21565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61392382613b2a565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f8151111561397f576139798282613bf3565b50613988565b613987613c73565b5b5050565b5f613995613728565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b613a65613caf565b613a9b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b613aa5613a5d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613b15575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401613b0c9190614c2c565b60405180910390fd5b613b1e81613577565b50565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03613b8557806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401613b7c9190614c2c565b60405180910390fd5b80613bb17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613b21565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051613c1c9190615eb9565b5f60405180830381855af49150503d805f8114613c54576040519150601f19603f3d011682016040523d82523d5f602084013e613c59565b606091505b5091509150613c69858383613ccd565b9250505092915050565b5f341115613cad576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f613cb8613649565b5f0160089054906101000a900460ff16905090565b606082613ce257613cdd82613d5a565b613d52565b5f8251148015613d0857505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15613d4a57836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401613d419190614c2c565b60405180910390fd5b819050613d53565b5b9392505050565b5f81511115613d6c5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806040016040528060608152602001606081525090565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060a001604052805f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081525090565b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081525090565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b613f1b81613f09565b8114613f25575f80fd5b50565b5f81359050613f3681613f12565b92915050565b5f60208284031215613f5157613f50613f01565b5b5f613f5e84828501613f28565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613f9e578082015181840152602081019050613f83565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613fc382613f67565b613fcd8185613f71565b9350613fdd818560208601613f81565b613fe681613fa9565b840191505092915050565b5f6020820190508181035f8301526140098184613fb9565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6140638261403a565b9050919050565b61407381614059565b82525050565b5f614084838361406a565b60208301905092915050565b5f602082019050919050565b5f6140a682614011565b6140b0818561401b565b93506140bb8361402b565b805f5b838110156140eb5781516140d28882614079565b97506140dd83614090565b9250506001810190506140be565b5085935050505092915050565b5f6020820190508181035f830152614110818461409c565b905092915050565b61412181614059565b811461412b575f80fd5b50565b5f8135905061413c81614118565b92915050565b5f6020828403121561415757614156613f01565b5b5f6141648482850161412e565b91505092915050565b5f8115159050919050565b6141818161416d565b82525050565b5f60208201905061419a5f830184614178565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6141d281613f09565b82525050565b5f82825260208201905092915050565b5f6141f282613f67565b6141fc81856141d8565b935061420c818560208601613f81565b61421581613fa9565b840191505092915050565b5f60a083015f8301516142355f8601826141c9565b506020830151614248602086018261406a565b50604083015161425b604086018261406a565b506060830151848203606086015261427382826141e8565b9150506080830151848203608086015261428d82826141e8565b9150508091505092915050565b5f6142a58383614220565b905092915050565b5f602082019050919050565b5f6142c3826141a0565b6142cd81856141aa565b9350836020820285016142df856141ba565b805f5b8581101561431a57848403895281516142fb858261429a565b9450614306836142ad565b925060208a019950506001810190506142e2565b50829750879550505050505092915050565b5f6020820190508181035f83015261434481846142b9565b905092915050565b61435581613f09565b82525050565b5f60208201905061436e5f83018461434c565b92915050565b5f604083015f8301518482035f86015261438e82826141e8565b915050602083015184820360208601526143a882826141e8565b9150508091505092915050565b5f6020820190508181035f8301526143cd8184614374565b905092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61441382613fa9565b810181811067ffffffffffffffff82111715614432576144316143dd565b5b80604052505050565b5f614444613ef8565b9050614450828261440a565b919050565b5f67ffffffffffffffff82111561446f5761446e6143dd565b5b61447882613fa9565b9050602081019050919050565b828183375f83830152505050565b5f6144a56144a084614455565b61443b565b9050828152602081018484840111156144c1576144c06143d9565b5b6144cc848285614485565b509392505050565b5f82601f8301126144e8576144e76143d5565b5b81356144f8848260208601614493565b91505092915050565b5f806040838503121561451757614516613f01565b5b5f6145248582860161412e565b925050602083013567ffffffffffffffff81111561454557614544613f05565b5b614551858286016144d4565b9150509250929050565b5f819050919050565b61456d8161455b565b82525050565b5f6020820190506145865f830184614564565b92915050565b5f80fd5b5f80fd5b5f67ffffffffffffffff8211156145ae576145ad6143dd565b5b6145b782613fa9565b9050602081019050919050565b5f6145d66145d184614594565b61443b565b9050828152602081018484840111156145f2576145f16143d9565b5b6145fd848285614485565b509392505050565b5f82601f830112614619576146186143d5565b5b81356146298482602086016145c4565b91505092915050565b5f604082840312156146475761464661458c565b5b614651604061443b565b90505f82013567ffffffffffffffff8111156146705761466f614590565b5b61467c84828501614605565b5f83015250602082013567ffffffffffffffff81111561469f5761469e614590565b5b6146ab84828501614605565b60208301525092915050565b5f67ffffffffffffffff8211156146d1576146d06143dd565b5b602082029050602081019050919050565b5f80fd5b5f608082840312156146fb576146fa61458c565b5b614705608061443b565b90505f6147148482850161412e565b5f8301525060206147278482850161412e565b602083015250604082013567ffffffffffffffff81111561474b5761474a614590565b5b61475784828501614605565b604083015250606082013567ffffffffffffffff81111561477b5761477a614590565b5b61478784828501614605565b60608301525092915050565b5f6147a56147a0846146b7565b61443b565b905080838252602082019050602084028301858111156147c8576147c76146e2565b5b835b8181101561480f57803567ffffffffffffffff8111156147ed576147ec6143d5565b5b8086016147fa89826146e6565b855260208501945050506020810190506147ca565b5050509392505050565b5f82601f83011261482d5761482c6143d5565b5b813561483d848260208601614793565b91505092915050565b5f67ffffffffffffffff8211156148605761485f6143dd565b5b602082029050602081019050919050565b5f606082840312156148865761488561458c565b5b614890606061443b565b90505f61489f8482850161412e565b5f8301525060206148b28482850161412e565b602083015250604082013567ffffffffffffffff8111156148d6576148d5614590565b5b6148e284828501614605565b60408301525092915050565b5f6149006148fb84614846565b61443b565b90508083825260208201905060208402830185811115614923576149226146e2565b5b835b8181101561496a57803567ffffffffffffffff811115614948576149476143d5565b5b8086016149558982614871565b85526020850194505050602081019050614925565b5050509392505050565b5f82601f830112614988576149876143d5565b5b81356149988482602086016148ee565b91505092915050565b5f67ffffffffffffffff8211156149bb576149ba6143dd565b5b602082029050602081019050919050565b5f606082840312156149e1576149e061458c565b5b6149eb606061443b565b90505f6149fa8482850161412e565b5f830152506020614a0d8482850161412e565b602083015250604082013567ffffffffffffffff811115614a3157614a30614590565b5b614a3d848285016144d4565b60408301525092915050565b5f614a5b614a56846149a1565b61443b565b90508083825260208201905060208402830185811115614a7e57614a7d6146e2565b5b835b81811015614ac557803567ffffffffffffffff811115614aa357614aa26143d5565b5b808601614ab089826149cc565b85526020850194505050602081019050614a80565b5050509392505050565b5f82601f830112614ae357614ae26143d5565b5b8135614af3848260208601614a49565b91505092915050565b5f805f805f805f80610100898b031215614b1957614b18613f01565b5b5f89013567ffffffffffffffff811115614b3657614b35613f05565b5b614b428b828c01614632565b9850506020614b538b828c01613f28565b9750506040614b648b828c01613f28565b9650506060614b758b828c01613f28565b9550506080614b868b828c01613f28565b94505060a089013567ffffffffffffffff811115614ba757614ba6613f05565b5b614bb38b828c01614819565b93505060c089013567ffffffffffffffff811115614bd457614bd3613f05565b5b614be08b828c01614974565b92505060e089013567ffffffffffffffff811115614c0157614c00613f05565b5b614c0d8b828c01614acf565b9150509295985092959890939650565b614c2681614059565b82525050565b5f602082019050614c3f5f830184614c1d565b92915050565b5f80fd5b5f60a08284031215614c5e57614c5d614c45565b5b81905092915050565b5f60208284031215614c7c57614c7b613f01565b5b5f82013567ffffffffffffffff811115614c9957614c98613f05565b5b614ca584828501614c49565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f614cd282614cae565b614cdc8185614cb8565b9350614cec818560208601613f81565b614cf581613fa9565b840191505092915050565b5f606083015f830151614d155f86018261406a565b506020830151614d28602086018261406a565b5060408301518482036040860152614d408282614cc8565b9150508091505092915050565b5f6020820190508181035f830152614d658184614d00565b905092915050565b5f60a083015f830151614d825f8601826141c9565b506020830151614d95602086018261406a565b506040830151614da8604086018261406a565b5060608301518482036060860152614dc082826141e8565b91505060808301518482036080860152614dda82826141e8565b9150508091505092915050565b5f6020820190508181035f830152614dff8184614d6d565b905092915050565b5f608083015f830151614e1c5f86018261406a565b506020830151614e2f602086018261406a565b5060408301518482036040860152614e4782826141e8565b91505060608301518482036060860152614e6182826141e8565b9150508091505092915050565b5f6020820190508181035f830152614e868184614e07565b905092915050565b5f606083015f830151614ea35f86018261406a565b506020830151614eb6602086018261406a565b5060408301518482036040860152614ece82826141e8565b9150508091505092915050565b5f6020820190508181035f830152614ef38184614e8e565b905092915050565b5f81905092915050565b5f614f0f82613f67565b614f198185614efb565b9350614f29818560208601613f81565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f614f69600283614efb565b9150614f7482614f35565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f614fb3600183614efb565b9150614fbe82614f7f565b600182019050919050565b5f614fd48287614f05565b9150614fdf82614f5d565b9150614feb8286614f05565b9150614ff682614fa7565b91506150028285614f05565b915061500d82614fa7565b91506150198284614f05565b915081905095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061506b57607f821691505b60208210810361507e5761507d615027565b5b50919050565b61508d8161416d565b8114615097575f80fd5b50565b5f815190506150a881615084565b92915050565b5f602082840312156150c3576150c2613f01565b5b5f6150d08482850161509a565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61513d82613f09565b915061514883613f09565b925082615158576151576150d9565b5b828204905092915050565b5f61516d82613f09565b915061517883613f09565b92508282019050808211156151905761518f615106565b5b92915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026151f27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826151b7565b6151fc86836151b7565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61523761523261522d84613f09565b615214565b613f09565b9050919050565b5f819050919050565b6152508361521d565b61526461525c8261523e565b8484546151c3565b825550505050565b5f90565b61527861526c565b615283818484615247565b505050565b5b818110156152a65761529b5f82615270565b600181019050615289565b5050565b601f8211156152eb576152bc81615196565b6152c5846151a8565b810160208510156152d4578190505b6152e86152e0856151a8565b830182615288565b50505b505050565b5f82821c905092915050565b5f61530b5f19846008026152f0565b1980831691505092915050565b5f61532383836152fc565b9150826002028217905092915050565b61533c82613f67565b67ffffffffffffffff811115615355576153546143dd565b5b61535f8254615054565b61536a8282856152aa565b5f60209050601f83116001811461539b575f8415615389578287015190505b6153938582615318565b8655506153fa565b601f1984166153a986615196565b5f5b828110156153d0578489015182556001820191506020850194506020810190506153ab565b868310156153ed57848901516153e9601f8916826152fc565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050815f5260205f209050919050565b601f821115615482576154538161542f565b61545c846151a8565b8101602085101561546b578190505b61547f615477856151a8565b830182615288565b50505b505050565b61549082614cae565b67ffffffffffffffff8111156154a9576154a86143dd565b5b6154b38254615054565b6154be828285615441565b5f60209050601f8311600181146154ef575f84156154dd578287015190505b6154e78582615318565b86555061554e565b601f1984166154fd8661542f565b5f5b82811015615524578489015182556001820191506020850194506020810190506154ff565b86831015615541578489015161553d601f8916826152fc565b8355505b6001600288020188555050505b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f608083015f8301516155945f86018261406a565b5060208301516155a7602086018261406a565b50604083015184820360408601526155bf82826141e8565b915050606083015184820360608601526155d982826141e8565b9150508091505092915050565b5f6155f1838361557f565b905092915050565b5f602082019050919050565b5f61560f82615556565b6156198185615560565b93508360208202850161562b85615570565b805f5b85811015615666578484038952815161564785826155e6565b9450615652836155f9565b925060208a0199505060018101905061562e565b50829750879550505050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f606083015f8301516156b65f86018261406a565b5060208301516156c9602086018261406a565b50604083015184820360408601526156e182826141e8565b9150508091505092915050565b5f6156f983836156a1565b905092915050565b5f602082019050919050565b5f61571782615678565b6157218185615682565b93508360208202850161573385615692565b805f5b8581101561576e578484038952815161574f85826156ee565b945061575a83615701565b925060208a01995050600181019050615736565b50829750879550505050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f606083015f8301516157be5f86018261406a565b5060208301516157d1602086018261406a565b50604083015184820360408601526157e98282614cc8565b9150508091505092915050565b5f61580183836157a9565b905092915050565b5f602082019050919050565b5f61581f82615780565b615829818561578a565b93508360208202850161583b8561579a565b805f5b85811015615876578484038952815161585785826157f6565b945061586283615809565b925060208a0199505060018101905061583e565b50829750879550505050505092915050565b5f60a0820190508181035f8301526158a08188614374565b90506158af602083018761434c565b81810360408301526158c18186615605565b905081810360608301526158d5818561570d565b905081810360808301526158e98184615815565b90509695505050505050565b5f67ffffffffffffffff82169050919050565b615911816158f5565b82525050565b5f60208201905061592a5f830184615908565b92915050565b5f813561593c81613f12565b80915050919050565b5f815f1b9050919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61597b84615945565b9350801983169250808416831791505092915050565b61599a8261521d565b6159ad6159a68261523e565b8354615950565b8255505050565b5f81356159c081614118565b80915050919050565b5f73ffffffffffffffffffffffffffffffffffffffff6159e884615945565b9350801983169250808416831791505092915050565b5f615a18615a13615a0e8461403a565b615214565b61403a565b9050919050565b5f615a29826159fe565b9050919050565b5f615a3a82615a1f565b9050919050565b5f819050919050565b615a5382615a30565b615a66615a5f82615a41565b83546159c9565b8255505050565b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112615a9557615a94615a6d565b5b80840192508235915067ffffffffffffffff821115615ab757615ab6615a71565b5b602083019250600182023603831315615ad357615ad2615a75565b5b509250929050565b5f82905092915050565b615aef8383615adb565b67ffffffffffffffff811115615b0857615b076143dd565b5b615b128254615054565b615b1d8282856152aa565b5f601f831160018114615b4a575f8415615b38578287013590505b615b428582615318565b865550615ba9565b601f198416615b5886615196565b5f5b82811015615b7f57848901358255600182019150602085019450602081019050615b5a565b86831015615b9c5784890135615b98601f8916826152fc565b8355505b6001600288020188555050505b50505050505050565b615bbd838383615ae5565b505050565b5f81015f830180615bd281615930565b9050615bde8184615991565b505050600181016020830180615bf3816159b4565b9050615bff8184615a4a565b505050600281016040830180615c14816159b4565b9050615c208184615a4a565b5050506003810160608301615c358185615a79565b615c40818386615bb2565b505050506004810160808301615c568185615a79565b615c61818386615bb2565b505050505050565b615c738282615bc2565b5050565b5f615c856020840184613f28565b905092915050565b5f615c9b602084018461412e565b905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112615ccb57615cca615cab565b5b83810192508235915060208301925067ffffffffffffffff821115615cf357615cf2615ca3565b5b600182023603831315615d0957615d08615ca7565b5b509250929050565b5f615d1c83856141d8565b9350615d29838584614485565b615d3283613fa9565b840190509392505050565b5f60a08301615d4e5f840184615c77565b615d5a5f8601826141c9565b50615d686020840184615c8d565b615d75602086018261406a565b50615d836040840184615c8d565b615d90604086018261406a565b50615d9e6060840184615caf565b8583036060870152615db1838284615d11565b92505050615dc26080840184615caf565b8583036080870152615dd5838284615d11565b925050508091505092915050565b5f6020820190508181035f830152615dfb8184615d3d565b905092915050565b5f604082019050615e165f83018561434c565b615e23602083018461434c565b9392505050565b615e338161455b565b8114615e3d575f80fd5b50565b5f81519050615e4e81615e2a565b92915050565b5f60208284031215615e6957615e68613f01565b5b5f615e7684828501615e40565b91505092915050565b5f81905092915050565b5f615e9382614cae565b615e9d8185615e7f565b9350615ead818560208601613f81565b80840191505092915050565b5f615ec48284615e89565b91508190509291505056 + ///0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000043575f80fd5b50620000546200005a60201b60201c565b620001c4565b5f6200006b6200015e60201b60201c565b9050805f0160089054906101000a900460ff1615620000b6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146200015b5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051620001529190620001a9565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b620001a38162000185565b82525050565b5f602082019050620001be5f83018462000198565b92915050565b608051615397620001eb5f395f8181612b9b01528181612bf00152612daa01526153975ff3fe608060405260043610610219575f3560e01c80637eaac8f211610122578063c2b42986116100aa578063e30c39781161006e578063e30c39781461075f578063e3b2a87414610789578063e5275eaf146107c5578063eb843cf614610801578063f2fde38b1461082957610219565b8063c2b429861461067f578063c4115874146106a9578063c80b33ca146106bf578063cb5aa7e9146106e7578063d10f7ff91461072357610219565b8063ad3cb1cc116100f1578063ad3cb1cc1461059d578063aeb1a21c146105c7578063b4722bc4146105ef578063ba1f31d214610619578063bff3aaba1461064357610219565b80637eaac8f2146104f7578063882d7dd3146105215780638da5cb5b1461055d5780639a5a3bc41461058757610219565b806348144c61116101a5578063715018a611610174578063715018a6146104635780637420f3d414610479578063772d2fe9146104a3578063798b58a6146104cb57806379ba5097146104e157610219565b806348144c61146103b75780634f1ef286146103e157806352d1902d146103fd5780635bace7ff1461042757610219565b806326cf5def116101ec57806326cf5def146102d55780632a388998146102ff5780632a8b9de9146103295780632e2d3a821461035357806346fbf68e1461037b57610219565b80630724dd231461021d5780630d8e6e2c14610245578063203d01141461026f5780632585bb65146102ab575b5f80fd5b348015610228575f80fd5b50610243600480360381019061023e91906137a9565b610851565b005b348015610250575f80fd5b5061025961089c565b604051610266919061385e565b60405180910390f35b34801561027a575f80fd5b50610295600480360381019061029091906138d8565b610917565b6040516102a2919061391d565b60405180910390f35b3480156102b6575f80fd5b506102bf610977565b6040516102cc9190613ad1565b60405180910390f35b3480156102e0575f80fd5b506102e9610bb4565b6040516102f69190613b00565b60405180910390f35b34801561030a575f80fd5b50610313610bcb565b6040516103209190613b00565b60405180910390f35b348015610334575f80fd5b5061033d610be2565b60405161034a9190613bc1565b60405180910390f35b34801561035e575f80fd5b50610379600480360381019061037491906137a9565b610c7b565b005b348015610386575f80fd5b506103a1600480360381019061039c91906138d8565b610cc6565b6040516103ae919061391d565b60405180910390f35b3480156103c2575f80fd5b506103cb610d5a565b6040516103d89190613c22565b60405180910390f35b6103fb60048036038101906103f69190613d6e565b610ea0565b005b348015610408575f80fd5b50610411610ebf565b60405161041e9190613de0565b60405180910390f35b348015610432575f80fd5b5061044d600480360381019061044891906138d8565b610ef0565b60405161045a919061391d565b60405180910390f35b34801561046e575f80fd5b50610477610f50565b005b348015610484575f80fd5b5061048d610f63565b60405161049a9190613bc1565b60405180910390f35b3480156104ae575f80fd5b506104c960048036038101906104c491906137a9565b610ffc565b005b3480156104d6575f80fd5b506104df611047565b005b3480156104ec575f80fd5b506104f561115b565b005b348015610502575f80fd5b5061050b6111e9565b6040516105189190613bc1565b60405180910390f35b34801561052c575f80fd5b50610547600480360381019061054291906138d8565b611282565b604051610554919061391d565b60405180910390f35b348015610568575f80fd5b506105716112e2565b60405161057e9190613e08565b60405180910390f35b348015610592575f80fd5b5061059b611317565b005b3480156105a8575f80fd5b506105b161146d565b6040516105be919061385e565b60405180910390f35b3480156105d2575f80fd5b506105ed60048036038101906105e89190614236565b6114a6565b005b3480156105fa575f80fd5b50610603611d8b565b6040516106109190613b00565b60405180910390f35b348015610624575f80fd5b5061062d611da2565b60405161063a9190613bc1565b60405180910390f35b34801561064e575f80fd5b50610669600480360381019061066491906137a9565b611e3b565b604051610676919061391d565b60405180910390f35b34801561068a575f80fd5b50610693611e6f565b6040516106a09190613b00565b60405180910390f35b3480156106b4575f80fd5b506106bd611e86565b005b3480156106ca575f80fd5b506106e560048036038101906106e09190614349565b611fab565b005b3480156106f2575f80fd5b5061070d600480360381019061070891906138d8565b612159565b60405161071a919061442f565b60405180910390f35b34801561072e575f80fd5b50610749600480360381019061074491906137a9565b6122f7565b60405161075691906144c9565b60405180910390f35b34801561076a575f80fd5b50610773612512565b6040516107809190613e08565b60405180910390f35b348015610794575f80fd5b506107af60048036038101906107aa91906138d8565b612547565b6040516107bc9190614550565b60405180910390f35b3480156107d0575f80fd5b506107eb60048036038101906107e691906138d8565b612775565b6040516107f8919061391d565b60405180910390f35b34801561080c575f80fd5b50610827600480360381019061082291906137a9565b6127d5565b005b348015610834575f80fd5b5061084f600480360381019061084a91906138d8565b612820565b005b6108596128d9565b61086281612960565b7f30c9b1d004f57eae3c6cc3a3752bcb4c8ea2e57c8241a782aa9b65fbc604ec5b816040516108919190613b00565b60405180910390a150565b60606040518060400160405280600d81526020017f47617465776179436f6e666967000000000000000000000000000000000000008152506108dd5f612a04565b6108e76002612a04565b6108f05f612a04565b604051602001610903949392919061463e565b604051602081830303815290604052905090565b5f80610921612ace565b9050806003015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b60605f610982612ace565b905080601001805480602002602001604051908101604052809291908181526020015f905b82821015610baa578382905f5260205f2090600502016040518060a00160405290815f8201548152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382018054610a8b906146c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab7906146c9565b8015610b025780601f10610ad957610100808354040283529160200191610b02565b820191905f5260205f20905b815481529060010190602001808311610ae557829003601f168201915b50505050508152602001600482018054610b1b906146c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b47906146c9565b8015610b925780601f10610b6957610100808354040283529160200191610b92565b820191905f5260205f20905b815481529060010190602001808311610b7557829003601f168201915b505050505081525050815260200190600101906109a7565b5050505091505090565b5f80610bbe612ace565b9050806007015491505090565b5f80610bd5612ace565b9050806008015491505090565b60605f610bed612ace565b905080601201805480602002602001604051908101604052809291908181526020018280548015610c7057602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610c27575b505050505091505090565b610c836128d9565b610c8c81612af5565b7fe41802af725729adcb8c151e2937380a25c69155757e3af5d3979adab503580081604051610cbb9190613b00565b60405180910390a150565b5f73c1d733116990ce3d9e54f9ecf48a1cdd441af4f973ffffffffffffffffffffffffffffffffffffffff166346fbf68e836040518263ffffffff1660e01b8152600401610d149190613e08565b602060405180830381865afa158015610d2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d539190614723565b9050919050565b610d62613656565b5f610d6b612ace565b9050805f016040518060400160405290815f82018054610d8a906146c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610db6906146c9565b8015610e015780601f10610dd857610100808354040283529160200191610e01565b820191905f5260205f20905b815481529060010190602001808311610de457829003601f168201915b50505050508152602001600182018054610e1a906146c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e46906146c9565b8015610e915780601f10610e6857610100808354040283529160200191610e91565b820191905f5260205f20905b815481529060010190602001808311610e7457829003601f168201915b50505050508152505091505090565b610ea8612b99565b610eb182612c7f565b610ebb8282612c8a565b5050565b5f610ec8612da8565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f80610efa612ace565b9050806014015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b610f586128d9565b610f615f612e2f565b565b60605f610f6e612ace565b905080600501805480602002602001604051908101604052809291908181526020018280548015610ff157602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610fa8575b505050505091505090565b6110046128d9565b61100d81612e6c565b7f3571172a49e72d7724be384cdd59f4f21a216c70352ea59cb02543fc763084378160405161103c9190613b00565b60405180910390a150565b61104f6128d9565b73de409109e0fccaae7b87de518f61d617a3fda09473ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156110a8575f80fd5b505af11580156110ba573d5f803e3d5ffd5b5050505073817a285f1fca3bb4084cbfc77d4babc238ad609c73ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611117575f80fd5b505af1158015611129573d5f803e3d5ffd5b505050507fbe4f655daae0dbaef63a6b525cab2fa6ace4aa5b94b8834b241137cdfe73a5b060405160405180910390a1565b5f611164612ed6565b90508073ffffffffffffffffffffffffffffffffffffffff16611185612512565b73ffffffffffffffffffffffffffffffffffffffff16146111dd57806040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016111d49190613e08565b60405180910390fd5b6111e681612e2f565b50565b60605f6111f4612ace565b90508060060180548060200260200160405190810160405280929190818152602001828054801561127757602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161122e575b505050505091505090565b5f8061128c612ace565b9050806015015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b5f806112ec612edd565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b61132033610cc6565b61136157336040517f206a346e0000000000000000000000000000000000000000000000000000000081526004016113589190613e08565b60405180910390fd5b73de409109e0fccaae7b87de518f61d617a3fda09473ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156113ba575f80fd5b505af11580156113cc573d5f803e3d5ffd5b5050505073817a285f1fca3bb4084cbfc77d4babc238ad609c73ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611429575f80fd5b505af115801561143b573d5f803e3d5ffd5b505050507f13dbe8823219e226dd0525aeb071e1d2679f89382ba799f7f644867e65b6f3a660405160405180910390a1565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60016114b0612f04565b67ffffffffffffffff16146114f1576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f6114fc612f28565b9050805f0160089054906101000a900460ff168061154457508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b1561157b576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055506115d06115cb6112e2565b612f4f565b5f84510361160a576040517f068c8d4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835103611644576040517fcad1d53400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61164d612ace565b905089815f015f820151815f01908161166691906148eb565b50602082015181600101908161167c91906148eb565b509050505f5b85518110156119b0576001826002015f8884815181106116a5576116a46149ba565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550858181518110611712576117116149ba565b5b6020026020010151826004015f888481518110611732576117316149ba565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201908161181591906148eb565b50606082015181600301908161182b91906148eb565b5090505081600501868281518110611846576118456149ba565b5b60200260200101515f0151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001826003015f8884815181106118c8576118c76149ba565b5b60200260200101516020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508160060186828151811061193a576119396149ba565b5b602002602001015160200151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080600101915050611682565b506119ba89612e6c565b6119c388612af5565b6119cc87612f63565b6119d586612960565b5f5b8451811015611cef578481815181106119f3576119f26149ba565b5b6020026020010151826011015f878481518110611a1357611a126149ba565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019081611af69190614a3f565b5090505081601201858281518110611b1157611b106149ba565b5b60200260200101515f0151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001826014015f878481518110611b9357611b926149ba565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555081601301858281518110611c0457611c036149ba565b5b602002602001015160200151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001826015015f878481518110611c8757611c866149ba565b5b60200260200101516020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080806001019150506119d7565b507fab58ab938892a1855d09c7c1390cabd4ca0405eaab322c5a82570770a719826e8a8a8787604051611d259493929190614d38565b60405180910390a1505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d282604051611d789190614db2565b60405180910390a1505050505050505050565b5f80611d95612ace565b9050806016015491505090565b60605f611dad612ace565b905080601301805480602002602001604051908101604052809291908181526020018280548015611e3057602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611de7575b505050505091505090565b5f80611e45612ace565b905080600f015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b5f80611e79612ace565b9050806009015491505090565b60035f611e91612f28565b9050805f0160089054906101000a900460ff1680611ed957508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15611f10576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d282604051611f9f9190614db2565b60405180910390a15050565b611fb36128d9565b5f815f013503611fef576040517f22f73fea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f0135111561204457805f01356040517f4178de4200000000000000000000000000000000000000000000000000000000815260040161203b9190613b00565b60405180910390fd5b5f61204d612ace565b905080600f015f835f013581526020019081526020015f205f9054906101000a900460ff16156120b757815f01356040517f96a568280000000000000000000000000000000000000000000000000000000081526004016120ae9190613b00565b60405180910390fd5b8060100182908060018154018082558091505060019003905f5260205f2090600502015f9091909190915081816120ee9190615104565b5050600181600f015f845f013581526020019081526020015f205f6101000a81548160ff0219169083151502179055507f66769341effd268fc4e9a9c8f27bfc968507b519b0ddb9b4ad3ded5f030168378260405161214d919061527e565b60405180910390a15050565b612161613670565b5f61216a612ace565b9050806011015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201805461226f906146c9565b80601f016020809104026020016040519081016040528092919081815260200182805461229b906146c9565b80156122e65780601f106122bd576101008083540402835291602001916122e6565b820191905f5260205f20905b8154815290600101906020018083116122c957829003601f168201915b505050505081525050915050919050565b6122ff6136bb565b5f612308612ace565b90508060100183815481106123205761231f6149ba565b5b905f5260205f2090600502016040518060a00160405290815f8201548152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820180546123fa906146c9565b80601f0160208091040260200160405190810160405280929190818152602001828054612426906146c9565b80156124715780601f1061244857610100808354040283529160200191612471565b820191905f5260205f20905b81548152906001019060200180831161245457829003601f168201915b5050505050815260200160048201805461248a906146c9565b80601f01602080910402602001604051908101604052809291908181526020018280546124b6906146c9565b80156125015780601f106124d857610100808354040283529160200191612501565b820191905f5260205f20905b8154815290600101906020018083116124e457829003601f168201915b505050505081525050915050919050565b5f8061251c613007565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b61254f613713565b5f612558612ace565b9050806004015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060800160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201805461265d906146c9565b80601f0160208091040260200160405190810160405280929190818152602001828054612689906146c9565b80156126d45780601f106126ab576101008083540402835291602001916126d4565b820191905f5260205f20905b8154815290600101906020018083116126b757829003601f168201915b505050505081526020016003820180546126ed906146c9565b80601f0160208091040260200160405190810160405280929190818152602001828054612719906146c9565b80156127645780601f1061273b57610100808354040283529160200191612764565b820191905f5260205f20905b81548152906001019060200180831161274757829003601f168201915b505050505081525050915050919050565b5f8061277f612ace565b9050806002015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b6127dd6128d9565b6127e681612f63565b7f837e0a6528dadfa2dc792692c5182e52a9f5bbdeed7b2372927a26c695839613816040516128159190613b00565b60405180910390a150565b6128286128d9565b5f612831613007565b905081815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff166128936112e2565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b6128e1612ed6565b73ffffffffffffffffffffffffffffffffffffffff166128ff6112e2565b73ffffffffffffffffffffffffffffffffffffffff161461295e57612922612ed6565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016129559190613e08565b60405180910390fd5b565b5f612969612ace565b90505f816006018054905090505f83036129af576040517f3ee5077400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156129f65782816040517f0f69cbfc0000000000000000000000000000000000000000000000000000000081526004016129ed92919061529e565b60405180910390fd5b828260160181905550505050565b60605f6001612a128461302e565b0190505f8167ffffffffffffffff811115612a3057612a2f613c4a565b5b6040519080825280601f01601f191660200182016040528015612a625781602001600182028036833780820191505090505b5090505f82602001820190505b600115612ac3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612ab857612ab76152c5565b5b0494505f8503612a6f575b819350505050919050565b5f7f86d3070a8993f6b209bee6185186d38a07fce8bbd97c750d934451b72f35b400905090565b5f612afe612ace565b90505f816006018054905090505f8303612b44576040517fb1ae92ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115612b8b5782816040517f84208f23000000000000000000000000000000000000000000000000000000008152600401612b8292919061529e565b60405180910390fd5b828260080181905550505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480612c4657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612c2d61317f565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612c7d576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b612c876128d9565b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612cf257506040513d601f19601f82011682018060405250810190612cef919061531c565b60015b612d3357816040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401612d2a9190613e08565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114612d9957806040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600401612d909190613de0565b60405180910390fd5b612da383836131d2565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614612e2d576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f612e38613007565b9050805f015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055612e6882613244565b5050565b5f612e75612ace565b90505f81600601805490509050808310612ec85782816040517f907e6681000000000000000000000000000000000000000000000000000000008152600401612ebf92919061529e565b60405180910390fd5b828260070181905550505050565b5f33905090565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f612f0d612f28565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b612f57613315565b612f6081613355565b50565b5f612f6c612ace565b90505f816006018054905090505f8303612fb2576040517fe60a727100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115612ff95782816040517fd2535e11000000000000000000000000000000000000000000000000000000008152600401612ff092919061529e565b60405180910390fd5b828260090181905550505050565b5f7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00905090565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061308a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816130805761307f6152c5565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106130c7576d04ee2d6d415b85acef810000000083816130bd576130bc6152c5565b5b0492506020810190505b662386f26fc1000083106130f657662386f26fc1000083816130ec576130eb6152c5565b5b0492506010810190505b6305f5e100831061311f576305f5e1008381613115576131146152c5565b5b0492506008810190505b612710831061314457612710838161313a576131396152c5565b5b0492506004810190505b60648310613167576064838161315d5761315c6152c5565b5b0492506002810190505b600a8310613176576001810190505b80915050919050565b5f6131ab7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6133d9565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6131db826133e2565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156132375761323182826134ab565b50613240565b61323f61352b565b5b5050565b5f61324d612edd565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b61331d613567565b613353576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61335d613315565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036133cd575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016133c49190613e08565b60405180910390fd5b6133d681612e2f565b50565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361343d57806040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016134349190613e08565b60405180910390fd5b806134697f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6133d9565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040516134d49190615381565b5f60405180830381855af49150503d805f811461350c576040519150601f19603f3d011682016040523d82523d5f602084013e613511565b606091505b5091509150613521858383613585565b9250505092915050565b5f341115613565576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f613570612f28565b5f0160089054906101000a900460ff16905090565b60608261359a5761359582613612565b61360a565b5f82511480156135c057505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561360257836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016135f99190613e08565b60405180910390fd5b81905061360b565b5b9392505050565b5f815111156136245780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806040016040528060608152602001606081525090565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060a001604052805f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081525090565b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61378881613776565b8114613792575f80fd5b50565b5f813590506137a38161377f565b92915050565b5f602082840312156137be576137bd61376e565b5b5f6137cb84828501613795565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561380b5780820151818401526020810190506137f0565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613830826137d4565b61383a81856137de565b935061384a8185602086016137ee565b61385381613816565b840191505092915050565b5f6020820190508181035f8301526138768184613826565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6138a78261387e565b9050919050565b6138b78161389d565b81146138c1575f80fd5b50565b5f813590506138d2816138ae565b92915050565b5f602082840312156138ed576138ec61376e565b5b5f6138fa848285016138c4565b91505092915050565b5f8115159050919050565b61391781613903565b82525050565b5f6020820190506139305f83018461390e565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61396881613776565b82525050565b6139778161389d565b82525050565b5f82825260208201905092915050565b5f613997826137d4565b6139a1818561397d565b93506139b18185602086016137ee565b6139ba81613816565b840191505092915050565b5f60a083015f8301516139da5f86018261395f565b5060208301516139ed602086018261396e565b506040830151613a00604086018261396e565b5060608301518482036060860152613a18828261398d565b91505060808301518482036080860152613a32828261398d565b9150508091505092915050565b5f613a4a83836139c5565b905092915050565b5f602082019050919050565b5f613a6882613936565b613a728185613940565b935083602082028501613a8485613950565b805f5b85811015613abf5784840389528151613aa08582613a3f565b9450613aab83613a52565b925060208a01995050600181019050613a87565b50829750879550505050505092915050565b5f6020820190508181035f830152613ae98184613a5e565b905092915050565b613afa81613776565b82525050565b5f602082019050613b135f830184613af1565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f613b4d838361396e565b60208301905092915050565b5f602082019050919050565b5f613b6f82613b19565b613b798185613b23565b9350613b8483613b33565b805f5b83811015613bb4578151613b9b8882613b42565b9750613ba683613b59565b925050600181019050613b87565b5085935050505092915050565b5f6020820190508181035f830152613bd98184613b65565b905092915050565b5f604083015f8301518482035f860152613bfb828261398d565b91505060208301518482036020860152613c15828261398d565b9150508091505092915050565b5f6020820190508181035f830152613c3a8184613be1565b905092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613c8082613816565b810181811067ffffffffffffffff82111715613c9f57613c9e613c4a565b5b80604052505050565b5f613cb1613765565b9050613cbd8282613c77565b919050565b5f67ffffffffffffffff821115613cdc57613cdb613c4a565b5b613ce582613816565b9050602081019050919050565b828183375f83830152505050565b5f613d12613d0d84613cc2565b613ca8565b905082815260208101848484011115613d2e57613d2d613c46565b5b613d39848285613cf2565b509392505050565b5f82601f830112613d5557613d54613c42565b5b8135613d65848260208601613d00565b91505092915050565b5f8060408385031215613d8457613d8361376e565b5b5f613d91858286016138c4565b925050602083013567ffffffffffffffff811115613db257613db1613772565b5b613dbe85828601613d41565b9150509250929050565b5f819050919050565b613dda81613dc8565b82525050565b5f602082019050613df35f830184613dd1565b92915050565b613e028161389d565b82525050565b5f602082019050613e1b5f830184613df9565b92915050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115613e4357613e42613c4a565b5b613e4c82613816565b9050602081019050919050565b5f613e6b613e6684613e29565b613ca8565b905082815260208101848484011115613e8757613e86613c46565b5b613e92848285613cf2565b509392505050565b5f82601f830112613eae57613ead613c42565b5b8135613ebe848260208601613e59565b91505092915050565b5f60408284031215613edc57613edb613e21565b5b613ee66040613ca8565b90505f82013567ffffffffffffffff811115613f0557613f04613e25565b5b613f1184828501613e9a565b5f83015250602082013567ffffffffffffffff811115613f3457613f33613e25565b5b613f4084828501613e9a565b60208301525092915050565b5f67ffffffffffffffff821115613f6657613f65613c4a565b5b602082029050602081019050919050565b5f80fd5b5f60808284031215613f9057613f8f613e21565b5b613f9a6080613ca8565b90505f613fa9848285016138c4565b5f830152506020613fbc848285016138c4565b602083015250604082013567ffffffffffffffff811115613fe057613fdf613e25565b5b613fec84828501613e9a565b604083015250606082013567ffffffffffffffff8111156140105761400f613e25565b5b61401c84828501613e9a565b60608301525092915050565b5f61403a61403584613f4c565b613ca8565b9050808382526020820190506020840283018581111561405d5761405c613f77565b5b835b818110156140a457803567ffffffffffffffff81111561408257614081613c42565b5b80860161408f8982613f7b565b8552602085019450505060208101905061405f565b5050509392505050565b5f82601f8301126140c2576140c1613c42565b5b81356140d2848260208601614028565b91505092915050565b5f67ffffffffffffffff8211156140f5576140f4613c4a565b5b602082029050602081019050919050565b5f6060828403121561411b5761411a613e21565b5b6141256060613ca8565b90505f614134848285016138c4565b5f830152506020614147848285016138c4565b602083015250604082013567ffffffffffffffff81111561416b5761416a613e25565b5b61417784828501613d41565b60408301525092915050565b5f614195614190846140db565b613ca8565b905080838252602082019050602084028301858111156141b8576141b7613f77565b5b835b818110156141ff57803567ffffffffffffffff8111156141dd576141dc613c42565b5b8086016141ea8982614106565b855260208501945050506020810190506141ba565b5050509392505050565b5f82601f83011261421d5761421c613c42565b5b813561422d848260208601614183565b91505092915050565b5f805f805f805f60e0888a0312156142515761425061376e565b5b5f88013567ffffffffffffffff81111561426e5761426d613772565b5b61427a8a828b01613ec7565b975050602061428b8a828b01613795565b965050604061429c8a828b01613795565b95505060606142ad8a828b01613795565b94505060806142be8a828b01613795565b93505060a088013567ffffffffffffffff8111156142df576142de613772565b5b6142eb8a828b016140ae565b92505060c088013567ffffffffffffffff81111561430c5761430b613772565b5b6143188a828b01614209565b91505092959891949750929550565b5f80fd5b5f60a082840312156143405761433f614327565b5b81905092915050565b5f6020828403121561435e5761435d61376e565b5b5f82013567ffffffffffffffff81111561437b5761437a613772565b5b6143878482850161432b565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6143b482614390565b6143be818561439a565b93506143ce8185602086016137ee565b6143d781613816565b840191505092915050565b5f606083015f8301516143f75f86018261396e565b50602083015161440a602086018261396e565b506040830151848203604086015261442282826143aa565b9150508091505092915050565b5f6020820190508181035f83015261444781846143e2565b905092915050565b5f60a083015f8301516144645f86018261395f565b506020830151614477602086018261396e565b50604083015161448a604086018261396e565b50606083015184820360608601526144a2828261398d565b915050608083015184820360808601526144bc828261398d565b9150508091505092915050565b5f6020820190508181035f8301526144e1818461444f565b905092915050565b5f608083015f8301516144fe5f86018261396e565b506020830151614511602086018261396e565b5060408301518482036040860152614529828261398d565b91505060608301518482036060860152614543828261398d565b9150508091505092915050565b5f6020820190508181035f83015261456881846144e9565b905092915050565b5f81905092915050565b5f614584826137d4565b61458e8185614570565b935061459e8185602086016137ee565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f6145de600283614570565b91506145e9826145aa565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f614628600183614570565b9150614633826145f4565b600182019050919050565b5f614649828761457a565b9150614654826145d2565b9150614660828661457a565b915061466b8261461c565b9150614677828561457a565b91506146828261461c565b915061468e828461457a565b915081905095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806146e057607f821691505b6020821081036146f3576146f261469c565b5b50919050565b61470281613903565b811461470c575f80fd5b50565b5f8151905061471d816146f9565b92915050565b5f602082840312156147385761473761376e565b5b5f6147458482850161470f565b91505092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026147aa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261476f565b6147b4868361476f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6147ef6147ea6147e584613776565b6147cc565b613776565b9050919050565b5f819050919050565b614808836147d5565b61481c614814826147f6565b84845461477b565b825550505050565b5f90565b614830614824565b61483b8184846147ff565b505050565b5b8181101561485e576148535f82614828565b600181019050614841565b5050565b601f8211156148a3576148748161474e565b61487d84614760565b8101602085101561488c578190505b6148a061489885614760565b830182614840565b50505b505050565b5f82821c905092915050565b5f6148c35f19846008026148a8565b1980831691505092915050565b5f6148db83836148b4565b9150826002028217905092915050565b6148f4826137d4565b67ffffffffffffffff81111561490d5761490c613c4a565b5b61491782546146c9565b614922828285614862565b5f60209050601f831160018114614953575f8415614941578287015190505b61494b85826148d0565b8655506149b2565b601f1984166149618661474e565b5f5b8281101561498857848901518255600182019150602085019450602081019050614963565b868310156149a557848901516149a1601f8916826148b4565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050815f5260205f209050919050565b601f821115614a3a57614a0b816149e7565b614a1484614760565b81016020851015614a23578190505b614a37614a2f85614760565b830182614840565b50505b505050565b614a4882614390565b67ffffffffffffffff811115614a6157614a60613c4a565b5b614a6b82546146c9565b614a768282856149f9565b5f60209050601f831160018114614aa7575f8415614a95578287015190505b614a9f85826148d0565b865550614b06565b601f198416614ab5866149e7565b5f5b82811015614adc57848901518255600182019150602085019450602081019050614ab7565b86831015614af95784890151614af5601f8916826148b4565b8355505b6001600288020188555050505b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f608083015f830151614b4c5f86018261396e565b506020830151614b5f602086018261396e565b5060408301518482036040860152614b77828261398d565b91505060608301518482036060860152614b91828261398d565b9150508091505092915050565b5f614ba98383614b37565b905092915050565b5f602082019050919050565b5f614bc782614b0e565b614bd18185614b18565b935083602082028501614be385614b28565b805f5b85811015614c1e5784840389528151614bff8582614b9e565b9450614c0a83614bb1565b925060208a01995050600181019050614be6565b50829750879550505050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f606083015f830151614c6e5f86018261396e565b506020830151614c81602086018261396e565b5060408301518482036040860152614c9982826143aa565b9150508091505092915050565b5f614cb18383614c59565b905092915050565b5f602082019050919050565b5f614ccf82614c30565b614cd98185614c3a565b935083602082028501614ceb85614c4a565b805f5b85811015614d265784840389528151614d078582614ca6565b9450614d1283614cb9565b925060208a01995050600181019050614cee565b50829750879550505050505092915050565b5f6080820190508181035f830152614d508187613be1565b9050614d5f6020830186613af1565b8181036040830152614d718185614bbd565b90508181036060830152614d858184614cc5565b905095945050505050565b5f67ffffffffffffffff82169050919050565b614dac81614d90565b82525050565b5f602082019050614dc55f830184614da3565b92915050565b5f8135614dd78161377f565b80915050919050565b5f815f1b9050919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614e1684614de0565b9350801983169250808416831791505092915050565b614e35826147d5565b614e48614e41826147f6565b8354614deb565b8255505050565b5f8135614e5b816138ae565b80915050919050565b5f73ffffffffffffffffffffffffffffffffffffffff614e8384614de0565b9350801983169250808416831791505092915050565b5f614eb3614eae614ea98461387e565b6147cc565b61387e565b9050919050565b5f614ec482614e99565b9050919050565b5f614ed582614eba565b9050919050565b5f819050919050565b614eee82614ecb565b614f01614efa82614edc565b8354614e64565b8255505050565b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112614f3057614f2f614f08565b5b80840192508235915067ffffffffffffffff821115614f5257614f51614f0c565b5b602083019250600182023603831315614f6e57614f6d614f10565b5b509250929050565b5f82905092915050565b614f8a8383614f76565b67ffffffffffffffff811115614fa357614fa2613c4a565b5b614fad82546146c9565b614fb8828285614862565b5f601f831160018114614fe5575f8415614fd3578287013590505b614fdd85826148d0565b865550615044565b601f198416614ff38661474e565b5f5b8281101561501a57848901358255600182019150602085019450602081019050614ff5565b868310156150375784890135615033601f8916826148b4565b8355505b6001600288020188555050505b50505050505050565b615058838383614f80565b505050565b5f81015f83018061506d81614dcb565b90506150798184614e2c565b50505060018101602083018061508e81614e4f565b905061509a8184614ee5565b5050506002810160408301806150af81614e4f565b90506150bb8184614ee5565b50505060038101606083016150d08185614f14565b6150db81838661504d565b5050505060048101608083016150f18185614f14565b6150fc81838661504d565b505050505050565b61510e828261505d565b5050565b5f6151206020840184613795565b905092915050565b5f61513660208401846138c4565b905092915050565b5f80fd5b5f80fd5b5f80fd5b5f808335600160200384360303811261516657615165615146565b5b83810192508235915060208301925067ffffffffffffffff82111561518e5761518d61513e565b5b6001820236038313156151a4576151a3615142565b5b509250929050565b5f6151b7838561397d565b93506151c4838584613cf2565b6151cd83613816565b840190509392505050565b5f60a083016151e95f840184615112565b6151f55f86018261395f565b506152036020840184615128565b615210602086018261396e565b5061521e6040840184615128565b61522b604086018261396e565b50615239606084018461514a565b858303606087015261524c8382846151ac565b9250505061525d608084018461514a565b85830360808701526152708382846151ac565b925050508091505092915050565b5f6020820190508181035f83015261529681846151d8565b905092915050565b5f6040820190506152b15f830185613af1565b6152be6020830184613af1565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b6152fb81613dc8565b8114615305575f80fd5b50565b5f81519050615316816152f2565b92915050565b5f602082840312156153315761533061376e565b5b5f61533e84828501615308565b91505092915050565b5f81905092915050565b5f61535b82614390565b6153658185615347565b93506153758185602086016137ee565b80840191505092915050565b5f61538c8284615351565b91508190509291505056 /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\xA0`@R0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x80\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP4\x80\x15b\0\0CW_\x80\xFD[Pb\0\0Tb\0\0Z` \x1B` \x1CV[b\0\x01\xC4V[_b\0\0kb\0\x01^` \x1B` \x1CV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15b\0\0\xB6W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14b\0\x01[Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`@Qb\0\x01R\x91\x90b\0\x01\xA9V[`@Q\x80\x91\x03\x90\xA1[PV[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[b\0\x01\xA3\x81b\0\x01\x85V[\x82RPPV[_` \x82\x01\x90Pb\0\x01\xBE_\x83\x01\x84b\0\x01\x98V[\x92\x91PPV[`\x80Qa^\xCFb\0\x01\xEB_9_\x81\x81a2\xE3\x01R\x81\x81a38\x01Ra4\xF2\x01Ra^\xCF_\xF3\xFE`\x80`@R`\x046\x10a\x02PW_5`\xE0\x1C\x80cy\xBAP\x97\x11a\x018W\x80c\xBF\xF3\xAA\xBA\x11a\0\xB5W\x80c\xE3\x0C9x\x11a\0yW\x80c\xE3\x0C9x\x14a\x08vW\x80c\xE3\xB2\xA8t\x14a\x08\xA0W\x80c\xE5'^\xAF\x14a\x08\xDCW\x80c\xEB\x84<\xF6\x14a\t\x18W\x80c\xEFi\x97\xF9\x14a\t@W\x80c\xF2\xFD\xE3\x8B\x14a\t|Wa\x02PV[\x80c\xBF\xF3\xAA\xBA\x14a\x07pW\x80c\xC2\xB4)\x86\x14a\x07\xACW\x80c\xC8\x0B3\xCA\x14a\x07\xD6W\x80c\xCBZ\xA7\xE9\x14a\x07\xFEW\x80c\xD1\x0F\x7F\xF9\x14a\x08:Wa\x02PV[\x80c\x91d\xD0\xAE\x11a\0\xFCW\x80c\x91d\xD0\xAE\x14a\x06\xB2W\x80c\x9AZ;\xC4\x14a\x06\xDCW\x80c\xAD<\xB1\xCC\x14a\x06\xF2W\x80c\xB4r+\xC4\x14a\x07\x1CW\x80c\xBA\x1F1\xD2\x14a\x07FWa\x02PV[\x80cy\xBAP\x97\x14a\x05\xE4W\x80c~\xAA\xC8\xF2\x14a\x05\xFAW\x80c\x88-}\xD3\x14a\x06$W\x80c\x8B\x8D\xD8v\x14a\x06`W\x80c\x8D\xA5\xCB[\x14a\x06\x88Wa\x02PV[\x80c.-:\x82\x11a\x01\xD1W\x80c[\xAC\xE7\xFF\x11a\x01\x95W\x80c[\xAC\xE7\xFF\x14a\x05\0W\x80cg\x99\xEFR\x14a\x05V[`@Qa\x07\xCD\x91\x90aC[V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x07\xE1W_\x80\xFD[Pa\x07\xFC`\x04\x806\x03\x81\x01\x90a\x07\xF7\x91\x90aLgV[a%UV[\0[4\x80\x15a\x08\tW_\x80\xFD[Pa\x08$`\x04\x806\x03\x81\x01\x90a\x08\x1F\x91\x90aABV[a'\x03V[`@Qa\x081\x91\x90aMMV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x08EW_\x80\xFD[Pa\x08``\x04\x806\x03\x81\x01\x90a\x08[\x91\x90a?`\x04\x806\x03\x81\x01\x90a\t9\x91\x90a?=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0F\xFF\x91\x90aP\xAEV[\x90P\x91\x90PV[a\x10\x0Ea=\x9EV[_a\x10\x17a2\x16V[\x90P\x80_\x01`@Q\x80`@\x01`@R\x90\x81_\x82\x01\x80Ta\x106\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x10b\x90aPTV[\x80\x15a\x10\xADW\x80`\x1F\x10a\x10\x84Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x10\xADV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x10\x90W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01\x80Ta\x10\xC6\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x10\xF2\x90aPTV[\x80\x15a\x11=W\x80`\x1F\x10a\x11\x14Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x11=V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x11 W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x90V[a\x11Ta2\xE1V[a\x11]\x82a3\xC7V[a\x11g\x82\x82a3\xD2V[PPV[_a\x11ta4\xF0V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[_\x80a\x11\xA6a2\x16V[\x90P\x80`\x14\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x80a\x12\x06a2\x16V[\x90P`\x01`\x02\x82`\r\x01\x80T\x90Pa\x12\x1E\x91\x90aQ3V[a\x12(\x91\x90aQcV[\x91PP\x90V[a\x126a0!V[a\x12?_a5wV[V[``_a\x12La2\x16V[\x90P\x80`\x05\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x12\xCFW` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x12\x86W[PPPPP\x91PP\x90V[a\x12\xE2a0!V[a\x12\xEB\x81a5\xB4V[\x7F5q\x17*I\xE7-w$\xBE8L\xDDY\xF4\xF2\x1A!lp5.\xA5\x9C\xB0%C\xFCv0\x847\x81`@Qa\x13\x1A\x91\x90aC[V[`@Q\x80\x91\x03\x90\xA1PV[a\x13-a0!V[s\xDE@\x91\t\xE0\xFC\xCA\xAE{\x87\xDEQ\x8Fa\xD6\x17\xA3\xFD\xA0\x94s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c?K\xA8:`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x13\x86W_\x80\xFD[PZ\xF1\x15\x80\x15a\x13\x98W=_\x80>=_\xFD[PPPPs\x81z(_\x1F\xCA;\xB4\x08L\xBF\xC7}K\xAB\xC28\xAD`\x9Cs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c?K\xA8:`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x13\xF5W_\x80\xFD[PZ\xF1\x15\x80\x15a\x14\x07W=_\x80>=_\xFD[PPPP\x7F\xBEOe]\xAA\xE0\xDB\xAE\xF6:kR\\\xAB/\xA6\xAC\xE4\xAA[\x94\xB8\x83K$\x117\xCD\xFEs\xA5\xB0`@Q`@Q\x80\x91\x03\x90\xA1V[_a\x14Ba6\x1EV[\x90P\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x14ca*\xBCV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x14\xBBW\x80`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14\xB2\x91\x90aL,V[`@Q\x80\x91\x03\x90\xFD[a\x14\xC4\x81a5wV[PV[``_a\x14\xD2a2\x16V[\x90P\x80`\x06\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x15UW` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x15\x0CW[PPPPP\x91PP\x90V[_\x80a\x15ja2\x16V[\x90P\x80`\x15\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[`\x01a\x15\xCAa6%V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x16\x0BW`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02_a\x16\x16a6IV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x16^WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x16\x95W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UPa\x16\xEAa\x16\xE5a!\xFDV[a6pV[_\x85Q\x03a\x17$W`@Q\x7F\x06\x8C\x8D@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x84Q\x03a\x17^W`@Q\x7F\x8A\xF0\x82\xEF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x83Q\x03a\x17\x98W`@Q\x7F\xCA\xD1\xD54\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a\x17\xA1a2\x16V[\x90P\x8A\x81_\x01_\x82\x01Q\x81_\x01\x90\x81a\x17\xBA\x91\x90aS3V[P` \x82\x01Q\x81`\x01\x01\x90\x81a\x17\xD0\x91\x90aS3V[P\x90PP_[\x86Q\x81\x10\x15a\x1B\x04W`\x01\x82`\x02\x01_\x89\x84\x81Q\x81\x10a\x17\xF9Wa\x17\xF8aT\x02V[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x86\x81\x81Q\x81\x10a\x18fWa\x18eaT\x02V[[` \x02` \x01\x01Q\x82`\x04\x01_\x89\x84\x81Q\x81\x10a\x18\x86Wa\x18\x85aT\x02V[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\x01\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x02\x01\x90\x81a\x19i\x91\x90aS3V[P``\x82\x01Q\x81`\x03\x01\x90\x81a\x19\x7F\x91\x90aS3V[P\x90PP\x81`\x05\x01\x87\x82\x81Q\x81\x10a\x19\x9AWa\x19\x99aT\x02V[[` \x02` \x01\x01Q_\x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x82`\x03\x01_\x89\x84\x81Q\x81\x10a\x1A\x1CWa\x1A\x1BaT\x02V[[` \x02` \x01\x01Q` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x06\x01\x87\x82\x81Q\x81\x10a\x1A\x8EWa\x1A\x8DaT\x02V[[` \x02` \x01\x01Q` \x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x80\x80`\x01\x01\x91PPa\x17\xD6V[Pa\x1B\x0E\x8Aa5\xB4V[a\x1B\x17\x89a2=V[a\x1B \x88a6\x84V[a\x1B)\x87a0\xA8V[_[\x85Q\x81\x10\x15a\x1ECW`\x01\x82`\n\x01_\x88\x84\x81Q\x81\x10a\x1BNWa\x1BMaT\x02V[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x85\x81\x81Q\x81\x10a\x1B\xBBWa\x1B\xBAaT\x02V[[` \x02` \x01\x01Q\x82`\x0C\x01_\x88\x84\x81Q\x81\x10a\x1B\xDBWa\x1B\xDAaT\x02V[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\x01\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x02\x01\x90\x81a\x1C\xBE\x91\x90aS3V[P\x90PP\x81`\r\x01\x86\x82\x81Q\x81\x10a\x1C\xD9Wa\x1C\xD8aT\x02V[[` \x02` \x01\x01Q_\x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x82`\x0B\x01_\x88\x84\x81Q\x81\x10a\x1D[Wa\x1DZaT\x02V[[` \x02` \x01\x01Q` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x0E\x01\x86\x82\x81Q\x81\x10a\x1D\xCDWa\x1D\xCCaT\x02V[[` \x02` \x01\x01Q` \x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x80\x80`\x01\x01\x91PPa\x1B+V[P_[\x84Q\x81\x10\x15a!^W\x84\x81\x81Q\x81\x10a\x1EbWa\x1EaaT\x02V[[` \x02` \x01\x01Q\x82`\x11\x01_\x87\x84\x81Q\x81\x10a\x1E\x82Wa\x1E\x81aT\x02V[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\x01\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x02\x01\x90\x81a\x1Fe\x91\x90aT\x87V[P\x90PP\x81`\x12\x01\x85\x82\x81Q\x81\x10a\x1F\x80Wa\x1F\x7FaT\x02V[[` \x02` \x01\x01Q_\x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x82`\x14\x01_\x87\x84\x81Q\x81\x10a \x02Wa \x01aT\x02V[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x13\x01\x85\x82\x81Q\x81\x10a sWa raT\x02V[[` \x02` \x01\x01Q` \x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x82`\x15\x01_\x87\x84\x81Q\x81\x10a \xF6Wa \xF5aT\x02V[[` \x02` \x01\x01Q` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x80\x80`\x01\x01\x91PPa\x1EFV[P\x7F:|T\xB1\x19]D\xA2\x88\xF9\xC3\xC9\xA0g\x9A\xED\x93%\x06\x8E\r\r[i\xE9`G5\\\xC7\x17E\x8B\x8B\x88\x88\x88`@Qa!\x96\x95\x94\x93\x92\x91\x90aX\x88V[`@Q\x80\x91\x03\x90\xA1P_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa!\xE9\x91\x90aY\x17V[`@Q\x80\x91\x03\x90\xA1PPPPPPPPPPV[_\x80a\"\x07a7(V[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x91PP\x90V[``_a\"=a2\x16V[\x90P\x80`\x0E\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\"\xC0W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\"wW[PPPPP\x91PP\x90V[a\"\xD43a\x0FrV[a#\x15W3`@Q\x7F j4n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a#\x0C\x91\x90aL,V[`@Q\x80\x91\x03\x90\xFD[s\xDE@\x91\t\xE0\xFC\xCA\xAE{\x87\xDEQ\x8Fa\xD6\x17\xA3\xFD\xA0\x94s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x84V\xCBY`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a#nW_\x80\xFD[PZ\xF1\x15\x80\x15a#\x80W=_\x80>=_\xFD[PPPPs\x81z(_\x1F\xCA;\xB4\x08L\xBF\xC7}K\xAB\xC28\xAD`\x9Cs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x84V\xCBY`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a#\xDDW_\x80\xFD[PZ\xF1\x15\x80\x15a#\xEFW=_\x80>=_\xFD[PPPP\x7F\x13\xDB\xE8\x822\x19\xE2&\xDD\x05%\xAE\xB0q\xE1\xD2g\x9F\x898+\xA7\x99\xF7\xF6D\x86~e\xB6\xF3\xA6`@Q`@Q\x80\x91\x03\x90\xA1V[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[_\x80a$da2\x16V[\x90P\x80`\x16\x01T\x91PP\x90V[``_a$|a2\x16V[\x90P\x80`\x13\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a$\xFFW` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a$\xB6W[PPPPP\x91PP\x90V[_\x80a%\x14a2\x16V[\x90P\x80`\x0F\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x80a%Ha2\x16V[\x90P\x80`\t\x01T\x91PP\x90V[a%]a0!V[_\x81_\x015\x03a%\x99W`@Q\x7F\"\xF7?\xEA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x015\x11\x15a%\xEEW\x80_\x015`@Q\x7FAx\xDEB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%\xE5\x91\x90aC[V[`@Q\x80\x91\x03\x90\xFD[_a%\xF7a2\x16V[\x90P\x80`\x0F\x01_\x83_\x015\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a&aW\x81_\x015`@Q\x7F\x96\xA5h(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a&X\x91\x90aC[V[`@Q\x80\x91\x03\x90\xFD[\x80`\x10\x01\x82\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x90`\x05\x02\x01_\x90\x91\x90\x91\x90\x91P\x81\x81a&\x98\x91\x90a\\iV[PP`\x01\x81`\x0F\x01_\x84_\x015\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7Ffv\x93A\xEF\xFD&\x8F\xC4\xE9\xA9\xC8\xF2{\xFC\x96\x85\x07\xB5\x19\xB0\xDD\xB9\xB4\xAD=\xED_\x03\x01h7\x82`@Qa&\xF7\x91\x90a]\xE3V[`@Q\x80\x91\x03\x90\xA1PPV[a'\x0Ba=\xB8V[_a'\x14a2\x16V[\x90P\x80`\x11\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ `@Q\x80``\x01`@R\x90\x81_\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01\x80Ta(\x19\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta(E\x90aPTV[\x80\x15a(\x90W\x80`\x1F\x10a(gWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a(\x90V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a(sW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[a(\xA9a>\x03V[_a(\xB2a2\x16V[\x90P\x80`\x10\x01\x83\x81T\x81\x10a(\xCAWa(\xC9aT\x02V[[\x90_R` _ \x90`\x05\x02\x01`@Q\x80`\xA0\x01`@R\x90\x81_\x82\x01T\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x03\x82\x01\x80Ta)\xA4\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta)\xD0\x90aPTV[\x80\x15a*\x1BW\x80`\x1F\x10a)\xF2Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a*\x1BV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a)\xFEW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x04\x82\x01\x80Ta*4\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta*`\x90aPTV[\x80\x15a*\xABW\x80`\x1F\x10a*\x82Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a*\xABV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a*\x8EW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[_\x80a*\xC6a7OV[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x91PP\x90V[a*\xF9a>[V[_a+\x02a2\x16V[\x90P\x80`\x04\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ `@Q\x80`\x80\x01`@R\x90\x81_\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01\x80Ta,\x07\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta,3\x90aPTV[\x80\x15a,~W\x80`\x1F\x10a,UWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a,~V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a,aW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x03\x82\x01\x80Ta,\x97\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta,\xC3\x90aPTV[\x80\x15a-\x0EW\x80`\x1F\x10a,\xE5Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a-\x0EV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a,\xF1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[_\x80a-)a2\x16V[\x90P\x80`\x02\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[a-\x87a0!V[a-\x90\x81a6\x84V[\x7F\x83~\ne(\xDA\xDF\xA2\xDCy&\x92\xC5\x18.R\xA9\xF5\xBB\xDE\xED{#r\x92z&\xC6\x95\x83\x96\x13\x81`@Qa-\xBF\x91\x90aC[V[`@Q\x80\x91\x03\x90\xA1PV[a-\xD2a>\xADV[_a-\xDBa2\x16V[\x90P\x80`\x0C\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ `@Q\x80``\x01`@R\x90\x81_\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01\x80Ta.\xE0\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta/\x0C\x90aPTV[\x80\x15a/WW\x80`\x1F\x10a/.Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a/WV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a/:W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[a/pa0!V[_a/ya7OV[\x90P\x81\x81_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a/\xDBa!\xFDV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F8\xD1k\x8C\xAC\"\xD9\x9F\xC7\xC1$\xB9\xCD\r\xE2\xD3\xFA\x1F\xAE\xF4 \xBF\xE7\x91\xD8\xC3b\xD7e\xE2'\0`@Q`@Q\x80\x91\x03\x90\xA3PPV[a0)a6\x1EV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a0Ga!\xFDV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a0\xA6Wa0ja6\x1EV[`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a0\x9D\x91\x90aL,V[`@Q\x80\x91\x03\x90\xFD[V[_a0\xB1a2\x16V[\x90P_\x81`\x06\x01\x80T\x90P\x90P_\x83\x03a0\xF7W`@Q\x7F>\xE5\x07t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x83\x11\x15a1>W\x82\x81`@Q\x7F\x0Fi\xCB\xFC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a15\x92\x91\x90a^\x03V[`@Q\x80\x91\x03\x90\xFD[\x82\x82`\x16\x01\x81\x90UPPPPV[``_`\x01a1Z\x84a7vV[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a1xWa1waC\xDDV[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a1\xAAW\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a2\x0BW\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a2\0Wa1\xFFaP\xD9V[[\x04\x94P_\x85\x03a1\xB7W[\x81\x93PPPP\x91\x90PV[_\x7F\x86\xD3\x07\n\x89\x93\xF6\xB2\t\xBE\xE6\x18Q\x86\xD3\x8A\x07\xFC\xE8\xBB\xD9|u\r\x93DQ\xB7/5\xB4\0\x90P\x90V[_a2Fa2\x16V[\x90P_\x81`\x06\x01\x80T\x90P\x90P_\x83\x03a2\x8CW`@Q\x7F\xB1\xAE\x92\xEA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x83\x11\x15a2\xD3W\x82\x81`@Q\x7F\x84 \x8F#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a2\xCA\x92\x91\x90a^\x03V[`@Q\x80\x91\x03\x90\xFD[\x82\x82`\x08\x01\x81\x90UPPPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a3\x8EWP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a3ua8\xC7V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a3\xC5W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a3\xCFa0!V[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a4:WP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a47\x91\x90a^TV[`\x01[a4{W\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a4r\x91\x90aL,V[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a4\xE1W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a4\xD8\x91\x90aEsV[`@Q\x80\x91\x03\x90\xFD[a4\xEB\x83\x83a9\x1AV[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a5uW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_a5\x80a7OV[\x90P\x80_\x01_a\x01\0\n\x81T\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90Ua5\xB0\x82a9\x8CV[PPV[_a5\xBDa2\x16V[\x90P_\x81`\x06\x01\x80T\x90P\x90P\x80\x83\x10a6\x10W\x82\x81`@Q\x7F\x90~f\x81\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a6\x07\x92\x91\x90a^\x03V[`@Q\x80\x91\x03\x90\xFD[\x82\x82`\x07\x01\x81\x90UPPPPV[_3\x90P\x90V[_a6.a6IV[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[a6xa:]V[a6\x81\x81a:\x9DV[PV[_a6\x8Da2\x16V[\x90P_\x81`\x06\x01\x80T\x90P\x90P_\x83\x03a6\xD3W`@Q\x7F\xE6\nrq\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x83\x11\x15a7\x1AW\x82\x81`@Q\x7F\xD2S^\x11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a7\x11\x92\x91\x90a^\x03V[`@Q\x80\x91\x03\x90\xFD[\x82\x82`\t\x01\x81\x90UPPPPV[_\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90P\x90V[_\x7F#~\x15\x82\"\xE3\xE6\x96\x8Br\xB9\xDB\r\x80C\xAA\xCF\x07J\xD9\xF6P\xF0\xD1`kM\x82\xEEC,\0\x90P\x90V[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a7\xD2Wz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a7\xC8Wa7\xC7aP\xD9V[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a8\x0FWm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a8\x05Wa8\x04aP\xD9V[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a8>Wf#\x86\xF2o\xC1\0\0\x83\x81a84Wa83aP\xD9V[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a8gWc\x05\xF5\xE1\0\x83\x81a8]Wa8\\aP\xD9V[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a8\x8CWa'\x10\x83\x81a8\x82Wa8\x81aP\xD9V[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a8\xAFW`d\x83\x81a8\xA5Wa8\xA4aP\xD9V[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a8\xBEW`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a8\xF3\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba;!V[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a9#\x82a;*V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a9\x7FWa9y\x82\x82a;\xF3V[Pa9\x88V[a9\x87a v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba;!V[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa<\x1C\x91\x90a^\xB9V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14aa\xF8V[\x90PaDP\x82\x82aD\nV[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aDoWaDnaC\xDDV[[aDx\x82a?\xA9V[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_aD\xA5aD\xA0\x84aDUV[aD;V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15aD\xC1WaD\xC0aC\xD9V[[aD\xCC\x84\x82\x85aD\x85V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aD\xE8WaD\xE7aC\xD5V[[\x815aD\xF8\x84\x82` \x86\x01aD\x93V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15aE\x17WaE\x16a?\x01V[[_aE$\x85\x82\x86\x01aA.V[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aEEWaEDa?\x05V[[aEQ\x85\x82\x86\x01aD\xD4V[\x91PP\x92P\x92\x90PV[_\x81\x90P\x91\x90PV[aEm\x81aE[V[\x82RPPV[_` \x82\x01\x90PaE\x86_\x83\x01\x84aEdV[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aE\xAEWaE\xADaC\xDDV[[aE\xB7\x82a?\xA9V[\x90P` \x81\x01\x90P\x91\x90PV[_aE\xD6aE\xD1\x84aE\x94V[aD;V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15aE\xF2WaE\xF1aC\xD9V[[aE\xFD\x84\x82\x85aD\x85V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aF\x19WaF\x18aC\xD5V[[\x815aF)\x84\x82` \x86\x01aE\xC4V[\x91PP\x92\x91PPV[_`@\x82\x84\x03\x12\x15aFGWaFFaE\x8CV[[aFQ`@aD;V[\x90P_\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aFpWaFoaE\x90V[[aF|\x84\x82\x85\x01aF\x05V[_\x83\x01RP` \x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aF\x9FWaF\x9EaE\x90V[[aF\xAB\x84\x82\x85\x01aF\x05V[` \x83\x01RP\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aF\xD1WaF\xD0aC\xDDV[[` \x82\x02\x90P` \x81\x01\x90P\x91\x90PV[_\x80\xFD[_`\x80\x82\x84\x03\x12\x15aF\xFBWaF\xFAaE\x8CV[[aG\x05`\x80aD;V[\x90P_aG\x14\x84\x82\x85\x01aA.V[_\x83\x01RP` aG'\x84\x82\x85\x01aA.V[` \x83\x01RP`@\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aGKWaGJaE\x90V[[aGW\x84\x82\x85\x01aF\x05V[`@\x83\x01RP``\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aG{WaGzaE\x90V[[aG\x87\x84\x82\x85\x01aF\x05V[``\x83\x01RP\x92\x91PPV[_aG\xA5aG\xA0\x84aF\xB7V[aD;V[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15aG\xC8WaG\xC7aF\xE2V[[\x83[\x81\x81\x10\x15aH\x0FW\x805g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aG\xEDWaG\xECaC\xD5V[[\x80\x86\x01aG\xFA\x89\x82aF\xE6V[\x85R` \x85\x01\x94PPP` \x81\x01\x90PaG\xCAV[PPP\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aH-WaH,aC\xD5V[[\x815aH=\x84\x82` \x86\x01aG\x93V[\x91PP\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aH`WaH_aC\xDDV[[` \x82\x02\x90P` \x81\x01\x90P\x91\x90PV[_``\x82\x84\x03\x12\x15aH\x86WaH\x85aE\x8CV[[aH\x90``aD;V[\x90P_aH\x9F\x84\x82\x85\x01aA.V[_\x83\x01RP` aH\xB2\x84\x82\x85\x01aA.V[` \x83\x01RP`@\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aH\xD6WaH\xD5aE\x90V[[aH\xE2\x84\x82\x85\x01aF\x05V[`@\x83\x01RP\x92\x91PPV[_aI\0aH\xFB\x84aHFV[aD;V[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15aI#WaI\"aF\xE2V[[\x83[\x81\x81\x10\x15aIjW\x805g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aIHWaIGaC\xD5V[[\x80\x86\x01aIU\x89\x82aHqV[\x85R` \x85\x01\x94PPP` \x81\x01\x90PaI%V[PPP\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aI\x88WaI\x87aC\xD5V[[\x815aI\x98\x84\x82` \x86\x01aH\xEEV[\x91PP\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aI\xBBWaI\xBAaC\xDDV[[` \x82\x02\x90P` \x81\x01\x90P\x91\x90PV[_``\x82\x84\x03\x12\x15aI\xE1WaI\xE0aE\x8CV[[aI\xEB``aD;V[\x90P_aI\xFA\x84\x82\x85\x01aA.V[_\x83\x01RP` aJ\r\x84\x82\x85\x01aA.V[` \x83\x01RP`@\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ1WaJ0aE\x90V[[aJ=\x84\x82\x85\x01aD\xD4V[`@\x83\x01RP\x92\x91PPV[_aJ[aJV\x84aI\xA1V[aD;V[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15aJ~WaJ}aF\xE2V[[\x83[\x81\x81\x10\x15aJ\xC5W\x805g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ\xA3WaJ\xA2aC\xD5V[[\x80\x86\x01aJ\xB0\x89\x82aI\xCCV[\x85R` \x85\x01\x94PPP` \x81\x01\x90PaJ\x80V[PPP\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aJ\xE3WaJ\xE2aC\xD5V[[\x815aJ\xF3\x84\x82` \x86\x01aJIV[\x91PP\x92\x91PPV[_\x80_\x80_\x80_\x80a\x01\0\x89\x8B\x03\x12\x15aK\x19WaK\x18a?\x01V[[_\x89\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aK6WaK5a?\x05V[[aKB\x8B\x82\x8C\x01aF2V[\x98PP` aKS\x8B\x82\x8C\x01a?(V[\x97PP`@aKd\x8B\x82\x8C\x01a?(V[\x96PP``aKu\x8B\x82\x8C\x01a?(V[\x95PP`\x80aK\x86\x8B\x82\x8C\x01a?(V[\x94PP`\xA0\x89\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aK\xA7WaK\xA6a?\x05V[[aK\xB3\x8B\x82\x8C\x01aH\x19V[\x93PP`\xC0\x89\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aK\xD4WaK\xD3a?\x05V[[aK\xE0\x8B\x82\x8C\x01aItV[\x92PP`\xE0\x89\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aL\x01WaL\0a?\x05V[[aL\r\x8B\x82\x8C\x01aJ\xCFV[\x91PP\x92\x95\x98P\x92\x95\x98\x90\x93\x96PV[aL&\x81a@YV[\x82RPPV[_` \x82\x01\x90PaL?_\x83\x01\x84aL\x1DV[\x92\x91PPV[_\x80\xFD[_`\xA0\x82\x84\x03\x12\x15aL^WaL]aLEV[[\x81\x90P\x92\x91PPV[_` \x82\x84\x03\x12\x15aL|WaL{a?\x01V[[_\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aL\x99WaL\x98a?\x05V[[aL\xA5\x84\x82\x85\x01aLIV[\x91PP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aL\xD2\x82aL\xAEV[aL\xDC\x81\x85aL\xB8V[\x93PaL\xEC\x81\x85` \x86\x01a?\x81V[aL\xF5\x81a?\xA9V[\x84\x01\x91PP\x92\x91PPV[_``\x83\x01_\x83\x01QaM\x15_\x86\x01\x82a@jV[P` \x83\x01QaM(` \x86\x01\x82a@jV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaM@\x82\x82aL\xC8V[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaMe\x81\x84aM\0V[\x90P\x92\x91PPV[_`\xA0\x83\x01_\x83\x01QaM\x82_\x86\x01\x82aA\xC9V[P` \x83\x01QaM\x95` \x86\x01\x82a@jV[P`@\x83\x01QaM\xA8`@\x86\x01\x82a@jV[P``\x83\x01Q\x84\x82\x03``\x86\x01RaM\xC0\x82\x82aA\xE8V[\x91PP`\x80\x83\x01Q\x84\x82\x03`\x80\x86\x01RaM\xDA\x82\x82aA\xE8V[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaM\xFF\x81\x84aMmV[\x90P\x92\x91PPV[_`\x80\x83\x01_\x83\x01QaN\x1C_\x86\x01\x82a@jV[P` \x83\x01QaN/` \x86\x01\x82a@jV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaNG\x82\x82aA\xE8V[\x91PP``\x83\x01Q\x84\x82\x03``\x86\x01RaNa\x82\x82aA\xE8V[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaN\x86\x81\x84aN\x07V[\x90P\x92\x91PPV[_``\x83\x01_\x83\x01QaN\xA3_\x86\x01\x82a@jV[P` \x83\x01QaN\xB6` \x86\x01\x82a@jV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaN\xCE\x82\x82aA\xE8V[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaN\xF3\x81\x84aN\x8EV[\x90P\x92\x91PPV[_\x81\x90P\x92\x91PPV[_aO\x0F\x82a?gV[aO\x19\x81\x85aN\xFBV[\x93PaO)\x81\x85` \x86\x01a?\x81V[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aOi`\x02\x83aN\xFBV[\x91PaOt\x82aO5V[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aO\xB3`\x01\x83aN\xFBV[\x91PaO\xBE\x82aO\x7FV[`\x01\x82\x01\x90P\x91\x90PV[_aO\xD4\x82\x87aO\x05V[\x91PaO\xDF\x82aO]V[\x91PaO\xEB\x82\x86aO\x05V[\x91PaO\xF6\x82aO\xA7V[\x91PaP\x02\x82\x85aO\x05V[\x91PaP\r\x82aO\xA7V[\x91PaP\x19\x82\x84aO\x05V[\x91P\x81\x90P\x95\x94PPPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\"`\x04R`$_\xFD[_`\x02\x82\x04\x90P`\x01\x82\x16\x80aPkW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aP~WaP}aP'V[[P\x91\x90PV[aP\x8D\x81aAmV[\x81\x14aP\x97W_\x80\xFD[PV[_\x81Q\x90PaP\xA8\x81aP\x84V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aP\xC3WaP\xC2a?\x01V[[_aP\xD0\x84\x82\x85\x01aP\x9AV[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_aQ=\x82a?\tV[\x91PaQH\x83a?\tV[\x92P\x82aQXWaQWaP\xD9V[[\x82\x82\x04\x90P\x92\x91PPV[_aQm\x82a?\tV[\x91PaQx\x83a?\tV[\x92P\x82\x82\x01\x90P\x80\x82\x11\x15aQ\x90WaQ\x8FaQ\x06V[[\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_` `\x1F\x83\x01\x04\x90P\x91\x90PV[_\x82\x82\x1B\x90P\x92\x91PPV[_`\x08\x83\x02aQ\xF2\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82aQ\xB7V[aQ\xFC\x86\x83aQ\xB7V[\x95P\x80\x19\x84\x16\x93P\x80\x86\x16\x84\x17\x92PPP\x93\x92PPPV[_\x81\x90P\x91\x90PV[_aR7aR2aR-\x84a?\tV[aR\x14V[a?\tV[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[aRP\x83aR\x1DV[aRdaR\\\x82aR>V[\x84\x84TaQ\xC3V[\x82UPPPPV[_\x90V[aRxaRlV[aR\x83\x81\x84\x84aRGV[PPPV[[\x81\x81\x10\x15aR\xA6WaR\x9B_\x82aRpV[`\x01\x81\x01\x90PaR\x89V[PPV[`\x1F\x82\x11\x15aR\xEBWaR\xBC\x81aQ\x96V[aR\xC5\x84aQ\xA8V[\x81\x01` \x85\x10\x15aR\xD4W\x81\x90P[aR\xE8aR\xE0\x85aQ\xA8V[\x83\x01\x82aR\x88V[PP[PPPV[_\x82\x82\x1C\x90P\x92\x91PPV[_aS\x0B_\x19\x84`\x08\x02aR\xF0V[\x19\x80\x83\x16\x91PP\x92\x91PPV[_aS#\x83\x83aR\xFCV[\x91P\x82`\x02\x02\x82\x17\x90P\x92\x91PPV[aS<\x82a?gV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aSUWaSTaC\xDDV[[aS_\x82TaPTV[aSj\x82\x82\x85aR\xAAV[_` \x90P`\x1F\x83\x11`\x01\x81\x14aS\x9BW_\x84\x15aS\x89W\x82\x87\x01Q\x90P[aS\x93\x85\x82aS\x18V[\x86UPaS\xFAV[`\x1F\x19\x84\x16aS\xA9\x86aQ\x96V[_[\x82\x81\x10\x15aS\xD0W\x84\x89\x01Q\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90PaS\xABV[\x86\x83\x10\x15aS\xEDW\x84\x89\x01QaS\xE9`\x1F\x89\x16\x82aR\xFCV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`2`\x04R`$_\xFD[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[`\x1F\x82\x11\x15aT\x82WaTS\x81aT/V[aT\\\x84aQ\xA8V[\x81\x01` \x85\x10\x15aTkW\x81\x90P[aT\x7FaTw\x85aQ\xA8V[\x83\x01\x82aR\x88V[PP[PPPV[aT\x90\x82aL\xAEV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aT\xA9WaT\xA8aC\xDDV[[aT\xB3\x82TaPTV[aT\xBE\x82\x82\x85aTAV[_` \x90P`\x1F\x83\x11`\x01\x81\x14aT\xEFW_\x84\x15aT\xDDW\x82\x87\x01Q\x90P[aT\xE7\x85\x82aS\x18V[\x86UPaUNV[`\x1F\x19\x84\x16aT\xFD\x86aT/V[_[\x82\x81\x10\x15aU$W\x84\x89\x01Q\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90PaT\xFFV[\x86\x83\x10\x15aUAW\x84\x89\x01QaU=`\x1F\x89\x16\x82aR\xFCV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_`\x80\x83\x01_\x83\x01QaU\x94_\x86\x01\x82a@jV[P` \x83\x01QaU\xA7` \x86\x01\x82a@jV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaU\xBF\x82\x82aA\xE8V[\x91PP``\x83\x01Q\x84\x82\x03``\x86\x01RaU\xD9\x82\x82aA\xE8V[\x91PP\x80\x91PP\x92\x91PPV[_aU\xF1\x83\x83aU\x7FV[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aV\x0F\x82aUVV[aV\x19\x81\x85aU`V[\x93P\x83` \x82\x02\x85\x01aV+\x85aUpV[\x80_[\x85\x81\x10\x15aVfW\x84\x84\x03\x89R\x81QaVG\x85\x82aU\xE6V[\x94PaVR\x83aU\xF9V[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaV.V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_``\x83\x01_\x83\x01QaV\xB6_\x86\x01\x82a@jV[P` \x83\x01QaV\xC9` \x86\x01\x82a@jV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaV\xE1\x82\x82aA\xE8V[\x91PP\x80\x91PP\x92\x91PPV[_aV\xF9\x83\x83aV\xA1V[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aW\x17\x82aVxV[aW!\x81\x85aV\x82V[\x93P\x83` \x82\x02\x85\x01aW3\x85aV\x92V[\x80_[\x85\x81\x10\x15aWnW\x84\x84\x03\x89R\x81QaWO\x85\x82aV\xEEV[\x94PaWZ\x83aW\x01V[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaW6V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_``\x83\x01_\x83\x01QaW\xBE_\x86\x01\x82a@jV[P` \x83\x01QaW\xD1` \x86\x01\x82a@jV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaW\xE9\x82\x82aL\xC8V[\x91PP\x80\x91PP\x92\x91PPV[_aX\x01\x83\x83aW\xA9V[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aX\x1F\x82aW\x80V[aX)\x81\x85aW\x8AV[\x93P\x83` \x82\x02\x85\x01aX;\x85aW\x9AV[\x80_[\x85\x81\x10\x15aXvW\x84\x84\x03\x89R\x81QaXW\x85\x82aW\xF6V[\x94PaXb\x83aX\tV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaX>V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_`\xA0\x82\x01\x90P\x81\x81\x03_\x83\x01RaX\xA0\x81\x88aCtV[\x90PaX\xAF` \x83\x01\x87aCLV[\x81\x81\x03`@\x83\x01RaX\xC1\x81\x86aV\x05V[\x90P\x81\x81\x03``\x83\x01RaX\xD5\x81\x85aW\rV[\x90P\x81\x81\x03`\x80\x83\x01RaX\xE9\x81\x84aX\x15V[\x90P\x96\x95PPPPPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[aY\x11\x81aX\xF5V[\x82RPPV[_` \x82\x01\x90PaY*_\x83\x01\x84aY\x08V[\x92\x91PPV[_\x815aY<\x81a?\x12V[\x80\x91PP\x91\x90PV[_\x81_\x1B\x90P\x91\x90PV[_\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFFaY{\x84aYEV[\x93P\x80\x19\x83\x16\x92P\x80\x84\x16\x83\x17\x91PP\x92\x91PPV[aY\x9A\x82aR\x1DV[aY\xADaY\xA6\x82aR>V[\x83TaYPV[\x82UPPPV[_\x815aY\xC0\x81aA\x18V[\x80\x91PP\x91\x90PV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFFaY\xE8\x84aYEV[\x93P\x80\x19\x83\x16\x92P\x80\x84\x16\x83\x17\x91PP\x92\x91PPV[_aZ\x18aZ\x13aZ\x0E\x84a@:V[aR\x14V[a@:V[\x90P\x91\x90PV[_aZ)\x82aY\xFEV[\x90P\x91\x90PV[_aZ:\x82aZ\x1FV[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[aZS\x82aZ0V[aZfaZ_\x82aZAV[\x83TaY\xC9V[\x82UPPPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x835`\x01` \x03\x846\x03\x03\x81\x12aZ\x95WaZ\x94aZmV[[\x80\x84\x01\x92P\x825\x91Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aZ\xB7WaZ\xB6aZqV[[` \x83\x01\x92P`\x01\x82\x026\x03\x83\x13\x15aZ\xD3WaZ\xD2aZuV[[P\x92P\x92\x90PV[_\x82\x90P\x92\x91PPV[aZ\xEF\x83\x83aZ\xDBV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a[\x08Wa[\x07aC\xDDV[[a[\x12\x82TaPTV[a[\x1D\x82\x82\x85aR\xAAV[_`\x1F\x83\x11`\x01\x81\x14a[JW_\x84\x15a[8W\x82\x87\x015\x90P[a[B\x85\x82aS\x18V[\x86UPa[\xA9V[`\x1F\x19\x84\x16a[X\x86aQ\x96V[_[\x82\x81\x10\x15a[\x7FW\x84\x89\x015\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90Pa[ZV[\x86\x83\x10\x15a[\x9CW\x84\x89\x015a[\x98`\x1F\x89\x16\x82aR\xFCV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPPV[a[\xBD\x83\x83\x83aZ\xE5V[PPPV[_\x81\x01_\x83\x01\x80a[\xD2\x81aY0V[\x90Pa[\xDE\x81\x84aY\x91V[PPP`\x01\x81\x01` \x83\x01\x80a[\xF3\x81aY\xB4V[\x90Pa[\xFF\x81\x84aZJV[PPP`\x02\x81\x01`@\x83\x01\x80a\\\x14\x81aY\xB4V[\x90Pa\\ \x81\x84aZJV[PPP`\x03\x81\x01``\x83\x01a\\5\x81\x85aZyV[a\\@\x81\x83\x86a[\xB2V[PPPP`\x04\x81\x01`\x80\x83\x01a\\V\x81\x85aZyV[a\\a\x81\x83\x86a[\xB2V[PPPPPPV[a\\s\x82\x82a[\xC2V[PPV[_a\\\x85` \x84\x01\x84a?(V[\x90P\x92\x91PPV[_a\\\x9B` \x84\x01\x84aA.V[\x90P\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x835`\x01` \x03\x846\x03\x03\x81\x12a\\\xCBWa\\\xCAa\\\xABV[[\x83\x81\x01\x92P\x825\x91P` \x83\x01\x92Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\\\xF3Wa\\\xF2a\\\xA3V[[`\x01\x82\x026\x03\x83\x13\x15a]\tWa]\x08a\\\xA7V[[P\x92P\x92\x90PV[_a]\x1C\x83\x85aA\xD8V[\x93Pa])\x83\x85\x84aD\x85V[a]2\x83a?\xA9V[\x84\x01\x90P\x93\x92PPPV[_`\xA0\x83\x01a]N_\x84\x01\x84a\\wV[a]Z_\x86\x01\x82aA\xC9V[Pa]h` \x84\x01\x84a\\\x8DV[a]u` \x86\x01\x82a@jV[Pa]\x83`@\x84\x01\x84a\\\x8DV[a]\x90`@\x86\x01\x82a@jV[Pa]\x9E``\x84\x01\x84a\\\xAFV[\x85\x83\x03``\x87\x01Ra]\xB1\x83\x82\x84a]\x11V[\x92PPPa]\xC2`\x80\x84\x01\x84a\\\xAFV[\x85\x83\x03`\x80\x87\x01Ra]\xD5\x83\x82\x84a]\x11V[\x92PPP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra]\xFB\x81\x84a]=V[\x90P\x92\x91PPV[_`@\x82\x01\x90Pa^\x16_\x83\x01\x85aCLV[a^#` \x83\x01\x84aCLV[\x93\x92PPPV[a^3\x81aE[V[\x81\x14a^=W_\x80\xFD[PV[_\x81Q\x90Pa^N\x81a^*V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a^iWa^ha?\x01V[[_a^v\x84\x82\x85\x01a^@V[\x91PP\x92\x91PPV[_\x81\x90P\x92\x91PPV[_a^\x93\x82aL\xAEV[a^\x9D\x81\x85a^\x7FV[\x93Pa^\xAD\x81\x85` \x86\x01a?\x81V[\x80\x84\x01\x91PP\x92\x91PPV[_a^\xC4\x82\x84a^\x89V[\x91P\x81\x90P\x92\x91PPV", + b"`\xA0`@R0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x80\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP4\x80\x15b\0\0CW_\x80\xFD[Pb\0\0Tb\0\0Z` \x1B` \x1CV[b\0\x01\xC4V[_b\0\0kb\0\x01^` \x1B` \x1CV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15b\0\0\xB6W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14b\0\x01[Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`@Qb\0\x01R\x91\x90b\0\x01\xA9V[`@Q\x80\x91\x03\x90\xA1[PV[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[b\0\x01\xA3\x81b\0\x01\x85V[\x82RPPV[_` \x82\x01\x90Pb\0\x01\xBE_\x83\x01\x84b\0\x01\x98V[\x92\x91PPV[`\x80QaS\x97b\0\x01\xEB_9_\x81\x81a+\x9B\x01R\x81\x81a+\xF0\x01Ra-\xAA\x01RaS\x97_\xF3\xFE`\x80`@R`\x046\x10a\x02\x19W_5`\xE0\x1C\x80c~\xAA\xC8\xF2\x11a\x01\"W\x80c\xC2\xB4)\x86\x11a\0\xAAW\x80c\xE3\x0C9x\x11a\0nW\x80c\xE3\x0C9x\x14a\x07_W\x80c\xE3\xB2\xA8t\x14a\x07\x89W\x80c\xE5'^\xAF\x14a\x07\xC5W\x80c\xEB\x84<\xF6\x14a\x08\x01W\x80c\xF2\xFD\xE3\x8B\x14a\x08)Wa\x02\x19V[\x80c\xC2\xB4)\x86\x14a\x06\x7FW\x80c\xC4\x11Xt\x14a\x06\xA9W\x80c\xC8\x0B3\xCA\x14a\x06\xBFW\x80c\xCBZ\xA7\xE9\x14a\x06\xE7W\x80c\xD1\x0F\x7F\xF9\x14a\x07#Wa\x02\x19V[\x80c\xAD<\xB1\xCC\x11a\0\xF1W\x80c\xAD<\xB1\xCC\x14a\x05\x9DW\x80c\xAE\xB1\xA2\x1C\x14a\x05\xC7W\x80c\xB4r+\xC4\x14a\x05\xEFW\x80c\xBA\x1F1\xD2\x14a\x06\x19W\x80c\xBF\xF3\xAA\xBA\x14a\x06CWa\x02\x19V[\x80c~\xAA\xC8\xF2\x14a\x04\xF7W\x80c\x88-}\xD3\x14a\x05!W\x80c\x8D\xA5\xCB[\x14a\x05]W\x80c\x9AZ;\xC4\x14a\x05\x87Wa\x02\x19V[\x80cH\x14La\x11a\x01\xA5W\x80cqP\x18\xA6\x11a\x01tW\x80cqP\x18\xA6\x14a\x04cW\x80ct \xF3\xD4\x14a\x04yW\x80cw-/\xE9\x14a\x04\xA3W\x80cy\x8BX\xA6\x14a\x04\xCBW\x80cy\xBAP\x97\x14a\x04\xE1Wa\x02\x19V[\x80cH\x14La\x14a\x03\xB7W\x80cO\x1E\xF2\x86\x14a\x03\xE1W\x80cR\xD1\x90-\x14a\x03\xFDW\x80c[\xAC\xE7\xFF\x14a\x04'Wa\x02\x19V[\x80c&\xCF]\xEF\x11a\x01\xECW\x80c&\xCF]\xEF\x14a\x02\xD5W\x80c*8\x89\x98\x14a\x02\xFFW\x80c*\x8B\x9D\xE9\x14a\x03)W\x80c.-:\x82\x14a\x03SW\x80cF\xFB\xF6\x8E\x14a\x03{Wa\x02\x19V[\x80c\x07$\xDD#\x14a\x02\x1DW\x80c\r\x8En,\x14a\x02EW\x80c =\x01\x14\x14a\x02oW\x80c%\x85\xBBe\x14a\x02\xABW[_\x80\xFD[4\x80\x15a\x02(W_\x80\xFD[Pa\x02C`\x04\x806\x03\x81\x01\x90a\x02>\x91\x90a7\xA9V[a\x08QV[\0[4\x80\x15a\x02PW_\x80\xFD[Pa\x02Ya\x08\x9CV[`@Qa\x02f\x91\x90a8^V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02zW_\x80\xFD[Pa\x02\x95`\x04\x806\x03\x81\x01\x90a\x02\x90\x91\x90a8\xD8V[a\t\x17V[`@Qa\x02\xA2\x91\x90a9\x1DV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xB6W_\x80\xFD[Pa\x02\xBFa\twV[`@Qa\x02\xCC\x91\x90a:\xD1V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xE0W_\x80\xFD[Pa\x02\xE9a\x0B\xB4V[`@Qa\x02\xF6\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03\nW_\x80\xFD[Pa\x03\x13a\x0B\xCBV[`@Qa\x03 \x91\x90a;\0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x034W_\x80\xFD[Pa\x03=a\x0B\xE2V[`@Qa\x03J\x91\x90a;\xC1V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03^W_\x80\xFD[Pa\x03y`\x04\x806\x03\x81\x01\x90a\x03t\x91\x90a7\xA9V[a\x0C{V[\0[4\x80\x15a\x03\x86W_\x80\xFD[Pa\x03\xA1`\x04\x806\x03\x81\x01\x90a\x03\x9C\x91\x90a8\xD8V[a\x0C\xC6V[`@Qa\x03\xAE\x91\x90a9\x1DV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03\xC2W_\x80\xFD[Pa\x03\xCBa\rZV[`@Qa\x03\xD8\x91\x90a<\"V[`@Q\x80\x91\x03\x90\xF3[a\x03\xFB`\x04\x806\x03\x81\x01\x90a\x03\xF6\x91\x90a=nV[a\x0E\xA0V[\0[4\x80\x15a\x04\x08W_\x80\xFD[Pa\x04\x11a\x0E\xBFV[`@Qa\x04\x1E\x91\x90a=\xE0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x042W_\x80\xFD[Pa\x04M`\x04\x806\x03\x81\x01\x90a\x04H\x91\x90a8\xD8V[a\x0E\xF0V[`@Qa\x04Z\x91\x90a9\x1DV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x04nW_\x80\xFD[Pa\x04wa\x0FPV[\0[4\x80\x15a\x04\x84W_\x80\xFD[Pa\x04\x8Da\x0FcV[`@Qa\x04\x9A\x91\x90a;\xC1V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x04\xAEW_\x80\xFD[Pa\x04\xC9`\x04\x806\x03\x81\x01\x90a\x04\xC4\x91\x90a7\xA9V[a\x0F\xFCV[\0[4\x80\x15a\x04\xD6W_\x80\xFD[Pa\x04\xDFa\x10GV[\0[4\x80\x15a\x04\xECW_\x80\xFD[Pa\x04\xF5a\x11[V[\0[4\x80\x15a\x05\x02W_\x80\xFD[Pa\x05\x0Ba\x11\xE9V[`@Qa\x05\x18\x91\x90a;\xC1V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x05,W_\x80\xFD[Pa\x05G`\x04\x806\x03\x81\x01\x90a\x05B\x91\x90a8\xD8V[a\x12\x82V[`@Qa\x05T\x91\x90a9\x1DV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x05hW_\x80\xFD[Pa\x05qa\x12\xE2V[`@Qa\x05~\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x05\x92W_\x80\xFD[Pa\x05\x9Ba\x13\x17V[\0[4\x80\x15a\x05\xA8W_\x80\xFD[Pa\x05\xB1a\x14mV[`@Qa\x05\xBE\x91\x90a8^V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x05\xD2W_\x80\xFD[Pa\x05\xED`\x04\x806\x03\x81\x01\x90a\x05\xE8\x91\x90aB6V[a\x14\xA6V[\0[4\x80\x15a\x05\xFAW_\x80\xFD[Pa\x06\x03a\x1D\x8BV[`@Qa\x06\x10\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x06$W_\x80\xFD[Pa\x06-a\x1D\xA2V[`@Qa\x06:\x91\x90a;\xC1V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x06NW_\x80\xFD[Pa\x06i`\x04\x806\x03\x81\x01\x90a\x06d\x91\x90a7\xA9V[a\x1E;V[`@Qa\x06v\x91\x90a9\x1DV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x06\x8AW_\x80\xFD[Pa\x06\x93a\x1EoV[`@Qa\x06\xA0\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x06\xB4W_\x80\xFD[Pa\x06\xBDa\x1E\x86V[\0[4\x80\x15a\x06\xCAW_\x80\xFD[Pa\x06\xE5`\x04\x806\x03\x81\x01\x90a\x06\xE0\x91\x90aCIV[a\x1F\xABV[\0[4\x80\x15a\x06\xF2W_\x80\xFD[Pa\x07\r`\x04\x806\x03\x81\x01\x90a\x07\x08\x91\x90a8\xD8V[a!YV[`@Qa\x07\x1A\x91\x90aD/V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x07.W_\x80\xFD[Pa\x07I`\x04\x806\x03\x81\x01\x90a\x07D\x91\x90a7\xA9V[a\"\xF7V[`@Qa\x07V\x91\x90aD\xC9V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x07jW_\x80\xFD[Pa\x07sa%\x12V[`@Qa\x07\x80\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x07\x94W_\x80\xFD[Pa\x07\xAF`\x04\x806\x03\x81\x01\x90a\x07\xAA\x91\x90a8\xD8V[a%GV[`@Qa\x07\xBC\x91\x90aEPV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x07\xD0W_\x80\xFD[Pa\x07\xEB`\x04\x806\x03\x81\x01\x90a\x07\xE6\x91\x90a8\xD8V[a'uV[`@Qa\x07\xF8\x91\x90a9\x1DV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x08\x0CW_\x80\xFD[Pa\x08'`\x04\x806\x03\x81\x01\x90a\x08\"\x91\x90a7\xA9V[a'\xD5V[\0[4\x80\x15a\x084W_\x80\xFD[Pa\x08O`\x04\x806\x03\x81\x01\x90a\x08J\x91\x90a8\xD8V[a( V[\0[a\x08Ya(\xD9V[a\x08b\x81a)`V[\x7F0\xC9\xB1\xD0\x04\xF5~\xAEV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x90V[_\x80a\t!a*\xCEV[\x90P\x80`\x03\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[``_a\t\x82a*\xCEV[\x90P\x80`\x10\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01_\x90[\x82\x82\x10\x15a\x0B\xAAW\x83\x82\x90_R` _ \x90`\x05\x02\x01`@Q\x80`\xA0\x01`@R\x90\x81_\x82\x01T\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x03\x82\x01\x80Ta\n\x8B\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\n\xB7\x90aF\xC9V[\x80\x15a\x0B\x02W\x80`\x1F\x10a\n\xD9Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x0B\x02V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\n\xE5W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x04\x82\x01\x80Ta\x0B\x1B\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x0BG\x90aF\xC9V[\x80\x15a\x0B\x92W\x80`\x1F\x10a\x0BiWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x0B\x92V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x0BuW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x81R` \x01\x90`\x01\x01\x90a\t\xA7V[PPPP\x91PP\x90V[_\x80a\x0B\xBEa*\xCEV[\x90P\x80`\x07\x01T\x91PP\x90V[_\x80a\x0B\xD5a*\xCEV[\x90P\x80`\x08\x01T\x91PP\x90V[``_a\x0B\xEDa*\xCEV[\x90P\x80`\x12\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x0CpW` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x0C'W[PPPPP\x91PP\x90V[a\x0C\x83a(\xD9V[a\x0C\x8C\x81a*\xF5V[\x7F\xE4\x18\x02\xAFrW)\xAD\xCB\x8C\x15\x1E)78\n%\xC6\x91Uu~:\xF5\xD3\x97\x9A\xDA\xB5\x03X\0\x81`@Qa\x0C\xBB\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xA1PV[_s\xC1\xD73\x11i\x90\xCE=\x9ET\xF9\xEC\xF4\x8A\x1C\xDDD\x1A\xF4\xF9s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cF\xFB\xF6\x8E\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\x14\x91\x90a>\x08V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r/W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\rS\x91\x90aG#V[\x90P\x91\x90PV[a\rba6VV[_a\rka*\xCEV[\x90P\x80_\x01`@Q\x80`@\x01`@R\x90\x81_\x82\x01\x80Ta\r\x8A\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\r\xB6\x90aF\xC9V[\x80\x15a\x0E\x01W\x80`\x1F\x10a\r\xD8Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x0E\x01V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\r\xE4W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01\x80Ta\x0E\x1A\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x0EF\x90aF\xC9V[\x80\x15a\x0E\x91W\x80`\x1F\x10a\x0EhWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x0E\x91V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x0EtW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x90V[a\x0E\xA8a+\x99V[a\x0E\xB1\x82a,\x7FV[a\x0E\xBB\x82\x82a,\x8AV[PPV[_a\x0E\xC8a-\xA8V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[_\x80a\x0E\xFAa*\xCEV[\x90P\x80`\x14\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[a\x0FXa(\xD9V[a\x0Fa_a./V[V[``_a\x0Fna*\xCEV[\x90P\x80`\x05\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x0F\xF1W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x0F\xA8W[PPPPP\x91PP\x90V[a\x10\x04a(\xD9V[a\x10\r\x81a.lV[\x7F5q\x17*I\xE7-w$\xBE8L\xDDY\xF4\xF2\x1A!lp5.\xA5\x9C\xB0%C\xFCv0\x847\x81`@Qa\x10<\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xA1PV[a\x10Oa(\xD9V[s\xDE@\x91\t\xE0\xFC\xCA\xAE{\x87\xDEQ\x8Fa\xD6\x17\xA3\xFD\xA0\x94s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c?K\xA8:`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x10\xA8W_\x80\xFD[PZ\xF1\x15\x80\x15a\x10\xBAW=_\x80>=_\xFD[PPPPs\x81z(_\x1F\xCA;\xB4\x08L\xBF\xC7}K\xAB\xC28\xAD`\x9Cs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c?K\xA8:`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x11\x17W_\x80\xFD[PZ\xF1\x15\x80\x15a\x11)W=_\x80>=_\xFD[PPPP\x7F\xBEOe]\xAA\xE0\xDB\xAE\xF6:kR\\\xAB/\xA6\xAC\xE4\xAA[\x94\xB8\x83K$\x117\xCD\xFEs\xA5\xB0`@Q`@Q\x80\x91\x03\x90\xA1V[_a\x11da.\xD6V[\x90P\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x11\x85a%\x12V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x11\xDDW\x80`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x11\xD4\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xFD[a\x11\xE6\x81a./V[PV[``_a\x11\xF4a*\xCEV[\x90P\x80`\x06\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x12wW` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x12.W[PPPPP\x91PP\x90V[_\x80a\x12\x8Ca*\xCEV[\x90P\x80`\x15\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x80a\x12\xECa.\xDDV[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x91PP\x90V[a\x13 3a\x0C\xC6V[a\x13aW3`@Q\x7F j4n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x13X\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xFD[s\xDE@\x91\t\xE0\xFC\xCA\xAE{\x87\xDEQ\x8Fa\xD6\x17\xA3\xFD\xA0\x94s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x84V\xCBY`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x13\xBAW_\x80\xFD[PZ\xF1\x15\x80\x15a\x13\xCCW=_\x80>=_\xFD[PPPPs\x81z(_\x1F\xCA;\xB4\x08L\xBF\xC7}K\xAB\xC28\xAD`\x9Cs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x84V\xCBY`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x14)W_\x80\xFD[PZ\xF1\x15\x80\x15a\x14;W=_\x80>=_\xFD[PPPP\x7F\x13\xDB\xE8\x822\x19\xE2&\xDD\x05%\xAE\xB0q\xE1\xD2g\x9F\x898+\xA7\x99\xF7\xF6D\x86~e\xB6\xF3\xA6`@Q`@Q\x80\x91\x03\x90\xA1V[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[`\x01a\x14\xB0a/\x04V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x14\xF1W`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03_a\x14\xFCa/(V[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x15DWP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x15{W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UPa\x15\xD0a\x15\xCBa\x12\xE2V[a/OV[_\x84Q\x03a\x16\nW`@Q\x7F\x06\x8C\x8D@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x83Q\x03a\x16DW`@Q\x7F\xCA\xD1\xD54\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a\x16Ma*\xCEV[\x90P\x89\x81_\x01_\x82\x01Q\x81_\x01\x90\x81a\x16f\x91\x90aH\xEBV[P` \x82\x01Q\x81`\x01\x01\x90\x81a\x16|\x91\x90aH\xEBV[P\x90PP_[\x85Q\x81\x10\x15a\x19\xB0W`\x01\x82`\x02\x01_\x88\x84\x81Q\x81\x10a\x16\xA5Wa\x16\xA4aI\xBAV[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x85\x81\x81Q\x81\x10a\x17\x12Wa\x17\x11aI\xBAV[[` \x02` \x01\x01Q\x82`\x04\x01_\x88\x84\x81Q\x81\x10a\x172Wa\x171aI\xBAV[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\x01\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x02\x01\x90\x81a\x18\x15\x91\x90aH\xEBV[P``\x82\x01Q\x81`\x03\x01\x90\x81a\x18+\x91\x90aH\xEBV[P\x90PP\x81`\x05\x01\x86\x82\x81Q\x81\x10a\x18FWa\x18EaI\xBAV[[` \x02` \x01\x01Q_\x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x82`\x03\x01_\x88\x84\x81Q\x81\x10a\x18\xC8Wa\x18\xC7aI\xBAV[[` \x02` \x01\x01Q` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x06\x01\x86\x82\x81Q\x81\x10a\x19:Wa\x199aI\xBAV[[` \x02` \x01\x01Q` \x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x80\x80`\x01\x01\x91PPa\x16\x82V[Pa\x19\xBA\x89a.lV[a\x19\xC3\x88a*\xF5V[a\x19\xCC\x87a/cV[a\x19\xD5\x86a)`V[_[\x84Q\x81\x10\x15a\x1C\xEFW\x84\x81\x81Q\x81\x10a\x19\xF3Wa\x19\xF2aI\xBAV[[` \x02` \x01\x01Q\x82`\x11\x01_\x87\x84\x81Q\x81\x10a\x1A\x13Wa\x1A\x12aI\xBAV[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\x01\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x02\x01\x90\x81a\x1A\xF6\x91\x90aJ?V[P\x90PP\x81`\x12\x01\x85\x82\x81Q\x81\x10a\x1B\x11Wa\x1B\x10aI\xBAV[[` \x02` \x01\x01Q_\x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x82`\x14\x01_\x87\x84\x81Q\x81\x10a\x1B\x93Wa\x1B\x92aI\xBAV[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x13\x01\x85\x82\x81Q\x81\x10a\x1C\x04Wa\x1C\x03aI\xBAV[[` \x02` \x01\x01Q` \x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x82`\x15\x01_\x87\x84\x81Q\x81\x10a\x1C\x87Wa\x1C\x86aI\xBAV[[` \x02` \x01\x01Q` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x80\x80`\x01\x01\x91PPa\x19\xD7V[P\x7F\xABX\xAB\x93\x88\x92\xA1\x85]\t\xC7\xC19\x0C\xAB\xD4\xCA\x04\x05\xEA\xAB2,Z\x82W\x07p\xA7\x19\x82n\x8A\x8A\x87\x87`@Qa\x1D%\x94\x93\x92\x91\x90aM8V[`@Q\x80\x91\x03\x90\xA1P_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x1Dx\x91\x90aM\xB2V[`@Q\x80\x91\x03\x90\xA1PPPPPPPPPV[_\x80a\x1D\x95a*\xCEV[\x90P\x80`\x16\x01T\x91PP\x90V[``_a\x1D\xADa*\xCEV[\x90P\x80`\x13\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x1E0W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x1D\xE7W[PPPPP\x91PP\x90V[_\x80a\x1EEa*\xCEV[\x90P\x80`\x0F\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x80a\x1Eya*\xCEV[\x90P\x80`\t\x01T\x91PP\x90V[`\x03_a\x1E\x91a/(V[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x1E\xD9WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x1F\x10W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x1F\x9F\x91\x90aM\xB2V[`@Q\x80\x91\x03\x90\xA1PPV[a\x1F\xB3a(\xD9V[_\x81_\x015\x03a\x1F\xEFW`@Q\x7F\"\xF7?\xEA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x015\x11\x15a DW\x80_\x015`@Q\x7FAx\xDEB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a ;\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xFD[_a Ma*\xCEV[\x90P\x80`\x0F\x01_\x83_\x015\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a \xB7W\x81_\x015`@Q\x7F\x96\xA5h(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a \xAE\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xFD[\x80`\x10\x01\x82\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x90`\x05\x02\x01_\x90\x91\x90\x91\x90\x91P\x81\x81a \xEE\x91\x90aQ\x04V[PP`\x01\x81`\x0F\x01_\x84_\x015\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7Ffv\x93A\xEF\xFD&\x8F\xC4\xE9\xA9\xC8\xF2{\xFC\x96\x85\x07\xB5\x19\xB0\xDD\xB9\xB4\xAD=\xED_\x03\x01h7\x82`@Qa!M\x91\x90aR~V[`@Q\x80\x91\x03\x90\xA1PPV[a!aa6pV[_a!ja*\xCEV[\x90P\x80`\x11\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ `@Q\x80``\x01`@R\x90\x81_\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01\x80Ta\"o\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\"\x9B\x90aF\xC9V[\x80\x15a\"\xE6W\x80`\x1F\x10a\"\xBDWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\"\xE6V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\"\xC9W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[a\"\xFFa6\xBBV[_a#\x08a*\xCEV[\x90P\x80`\x10\x01\x83\x81T\x81\x10a# Wa#\x1FaI\xBAV[[\x90_R` _ \x90`\x05\x02\x01`@Q\x80`\xA0\x01`@R\x90\x81_\x82\x01T\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x03\x82\x01\x80Ta#\xFA\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta$&\x90aF\xC9V[\x80\x15a$qW\x80`\x1F\x10a$HWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a$qV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a$TW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x04\x82\x01\x80Ta$\x8A\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta$\xB6\x90aF\xC9V[\x80\x15a%\x01W\x80`\x1F\x10a$\xD8Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a%\x01V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a$\xE4W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[_\x80a%\x1Ca0\x07V[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x91PP\x90V[a%Oa7\x13V[_a%Xa*\xCEV[\x90P\x80`\x04\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ `@Q\x80`\x80\x01`@R\x90\x81_\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01\x80Ta&]\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta&\x89\x90aF\xC9V[\x80\x15a&\xD4W\x80`\x1F\x10a&\xABWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a&\xD4V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a&\xB7W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x03\x82\x01\x80Ta&\xED\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta'\x19\x90aF\xC9V[\x80\x15a'dW\x80`\x1F\x10a';Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a'dV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a'GW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[_\x80a'\x7Fa*\xCEV[\x90P\x80`\x02\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[a'\xDDa(\xD9V[a'\xE6\x81a/cV[\x7F\x83~\ne(\xDA\xDF\xA2\xDCy&\x92\xC5\x18.R\xA9\xF5\xBB\xDE\xED{#r\x92z&\xC6\x95\x83\x96\x13\x81`@Qa(\x15\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xA1PV[a((a(\xD9V[_a(1a0\x07V[\x90P\x81\x81_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a(\x93a\x12\xE2V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F8\xD1k\x8C\xAC\"\xD9\x9F\xC7\xC1$\xB9\xCD\r\xE2\xD3\xFA\x1F\xAE\xF4 \xBF\xE7\x91\xD8\xC3b\xD7e\xE2'\0`@Q`@Q\x80\x91\x03\x90\xA3PPV[a(\xE1a.\xD6V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a(\xFFa\x12\xE2V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a)^Wa)\"a.\xD6V[`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a)U\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xFD[V[_a)ia*\xCEV[\x90P_\x81`\x06\x01\x80T\x90P\x90P_\x83\x03a)\xAFW`@Q\x7F>\xE5\x07t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x83\x11\x15a)\xF6W\x82\x81`@Q\x7F\x0Fi\xCB\xFC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a)\xED\x92\x91\x90aR\x9EV[`@Q\x80\x91\x03\x90\xFD[\x82\x82`\x16\x01\x81\x90UPPPPV[``_`\x01a*\x12\x84a0.V[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a*0Wa*/a\x08V[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a-\x99W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a-\x90\x91\x90a=\xE0V[`@Q\x80\x91\x03\x90\xFD[a-\xA3\x83\x83a1\xD2V[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a.-W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_a.8a0\x07V[\x90P\x80_\x01_a\x01\0\n\x81T\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90Ua.h\x82a2DV[PPV[_a.ua*\xCEV[\x90P_\x81`\x06\x01\x80T\x90P\x90P\x80\x83\x10a.\xC8W\x82\x81`@Q\x7F\x90~f\x81\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a.\xBF\x92\x91\x90aR\x9EV[`@Q\x80\x91\x03\x90\xFD[\x82\x82`\x07\x01\x81\x90UPPPPV[_3\x90P\x90V[_\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90P\x90V[_a/\ra/(V[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[a/Wa3\x15V[a/`\x81a3UV[PV[_a/la*\xCEV[\x90P_\x81`\x06\x01\x80T\x90P\x90P_\x83\x03a/\xB2W`@Q\x7F\xE6\nrq\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x83\x11\x15a/\xF9W\x82\x81`@Q\x7F\xD2S^\x11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a/\xF0\x92\x91\x90aR\x9EV[`@Q\x80\x91\x03\x90\xFD[\x82\x82`\t\x01\x81\x90UPPPPV[_\x7F#~\x15\x82\"\xE3\xE6\x96\x8Br\xB9\xDB\r\x80C\xAA\xCF\x07J\xD9\xF6P\xF0\xD1`kM\x82\xEEC,\0\x90P\x90V[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a0\x8AWz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a0\x80Wa0\x7FaR\xC5V[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a0\xC7Wm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a0\xBDWa0\xBCaR\xC5V[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a0\xF6Wf#\x86\xF2o\xC1\0\0\x83\x81a0\xECWa0\xEBaR\xC5V[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a1\x1FWc\x05\xF5\xE1\0\x83\x81a1\x15Wa1\x14aR\xC5V[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a1DWa'\x10\x83\x81a1:Wa19aR\xC5V[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a1gW`d\x83\x81a1]Wa1\\aR\xC5V[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a1vW`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a1\xAB\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba3\xD9V[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a1\xDB\x82a3\xE2V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a27Wa21\x82\x82a4\xABV[Pa2@V[a2?a5+V[[PPV[_a2Ma.\xDDV[\x90P_\x81_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x82\x82_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0`@Q`@Q\x80\x91\x03\x90\xA3PPPV[a3\x1Da5gV[a3SW`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a3]a3\x15V[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a3\xCDW_`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a3\xC4\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xFD[a3\xD6\x81a./V[PV[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a4=W\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a44\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xFD[\x80a4i\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba3\xD9V[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa4\xD4\x91\x90aS\x81V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a5\x0CW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a5\x11V[``\x91P[P\x91P\x91Pa5!\x85\x83\x83a5\x85V[\x92PPP\x92\x91PPV[_4\x11\x15a5eW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_a5pa/(V[_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x90P\x90V[``\x82a5\x9AWa5\x95\x82a6\x12V[a6\nV[_\x82Q\x14\x80\x15a5\xC0WP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a6\x02W\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a5\xF9\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa6\x0BV[[\x93\x92PPPV[_\x81Q\x11\x15a6$W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80`@\x01`@R\x80``\x81R` \x01``\x81RP\x90V[`@Q\x80``\x01`@R\x80_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01``\x81RP\x90V[`@Q\x80`\xA0\x01`@R\x80_\x81R` \x01_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01``\x81R` \x01``\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01``\x81R` \x01``\x81RP\x90V[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[a7\x88\x81a7vV[\x81\x14a7\x92W_\x80\xFD[PV[_\x815\x90Pa7\xA3\x81a7\x7FV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a7\xBEWa7\xBDa7nV[[_a7\xCB\x84\x82\x85\x01a7\x95V[\x91PP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a8\x0BW\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa7\xF0V[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a80\x82a7\xD4V[a8:\x81\x85a7\xDEV[\x93Pa8J\x81\x85` \x86\x01a7\xEEV[a8S\x81a8\x16V[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra8v\x81\x84a8&V[\x90P\x92\x91PPV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a8\xA7\x82a8~V[\x90P\x91\x90PV[a8\xB7\x81a8\x9DV[\x81\x14a8\xC1W_\x80\xFD[PV[_\x815\x90Pa8\xD2\x81a8\xAEV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a8\xEDWa8\xECa7nV[[_a8\xFA\x84\x82\x85\x01a8\xC4V[\x91PP\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[a9\x17\x81a9\x03V[\x82RPPV[_` \x82\x01\x90Pa90_\x83\x01\x84a9\x0EV[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a9h\x81a7vV[\x82RPPV[a9w\x81a8\x9DV[\x82RPPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_a9\x97\x82a7\xD4V[a9\xA1\x81\x85a9}V[\x93Pa9\xB1\x81\x85` \x86\x01a7\xEEV[a9\xBA\x81a8\x16V[\x84\x01\x91PP\x92\x91PPV[_`\xA0\x83\x01_\x83\x01Qa9\xDA_\x86\x01\x82a9_V[P` \x83\x01Qa9\xED` \x86\x01\x82a9nV[P`@\x83\x01Qa:\0`@\x86\x01\x82a9nV[P``\x83\x01Q\x84\x82\x03``\x86\x01Ra:\x18\x82\x82a9\x8DV[\x91PP`\x80\x83\x01Q\x84\x82\x03`\x80\x86\x01Ra:2\x82\x82a9\x8DV[\x91PP\x80\x91PP\x92\x91PPV[_a:J\x83\x83a9\xC5V[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a:h\x82a96V[a:r\x81\x85a9@V[\x93P\x83` \x82\x02\x85\x01a:\x84\x85a9PV[\x80_[\x85\x81\x10\x15a:\xBFW\x84\x84\x03\x89R\x81Qa:\xA0\x85\x82a:?V[\x94Pa:\xAB\x83a:RV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90Pa:\x87V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra:\xE9\x81\x84a:^V[\x90P\x92\x91PPV[a:\xFA\x81a7vV[\x82RPPV[_` \x82\x01\x90Pa;\x13_\x83\x01\x84a:\xF1V[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_a;M\x83\x83a9nV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a;o\x82a;\x19V[a;y\x81\x85a;#V[\x93Pa;\x84\x83a;3V[\x80_[\x83\x81\x10\x15a;\xB4W\x81Qa;\x9B\x88\x82a;BV[\x97Pa;\xA6\x83a;YV[\x92PP`\x01\x81\x01\x90Pa;\x87V[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra;\xD9\x81\x84a;eV[\x90P\x92\x91PPV[_`@\x83\x01_\x83\x01Q\x84\x82\x03_\x86\x01Ra;\xFB\x82\x82a9\x8DV[\x91PP` \x83\x01Q\x84\x82\x03` \x86\x01Ra<\x15\x82\x82a9\x8DV[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra<:\x81\x84a;\xE1V[\x90P\x92\x91PPV[_\x80\xFD[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a<\x80\x82a8\x16V[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a<\x9FWa<\x9Ea\x02\x81a8\x9DV[\x82RPPV[_` \x82\x01\x90Pa>\x1B_\x83\x01\x84a=\xF9V[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a>CWa>BaL\x82a8\x16V[\x90P` \x81\x01\x90P\x91\x90PV[_a>ka>f\x84a>)V[a<\xA8V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a>\x87Wa>\x86a\x92\x84\x82\x85a<\xF2V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a>\xAEWa>\xADa\xBE\x84\x82` \x86\x01a>YV[\x91PP\x92\x91PPV[_`@\x82\x84\x03\x12\x15a>\xDCWa>\xDBa>!V[[a>\xE6`@a<\xA8V[\x90P_\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a?\x05Wa?\x04a>%V[[a?\x11\x84\x82\x85\x01a>\x9AV[_\x83\x01RP` \x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a?4Wa?3a>%V[[a?@\x84\x82\x85\x01a>\x9AV[` \x83\x01RP\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a?fWa?ea!V[[a?\x9A`\x80a<\xA8V[\x90P_a?\xA9\x84\x82\x85\x01a8\xC4V[_\x83\x01RP` a?\xBC\x84\x82\x85\x01a8\xC4V[` \x83\x01RP`@\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a?\xE0Wa?\xDFa>%V[[a?\xEC\x84\x82\x85\x01a>\x9AV[`@\x83\x01RP``\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a@\x10Wa@\x0Fa>%V[[a@\x1C\x84\x82\x85\x01a>\x9AV[``\x83\x01RP\x92\x91PPV[_a@:a@5\x84a?LV[a<\xA8V[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15a@]Wa@\\a?wV[[\x83[\x81\x81\x10\x15a@\xA4W\x805g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a@\x82Wa@\x81a!V[[aA%``a<\xA8V[\x90P_aA4\x84\x82\x85\x01a8\xC4V[_\x83\x01RP` aAG\x84\x82\x85\x01a8\xC4V[` \x83\x01RP`@\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aAkWaAja>%V[[aAw\x84\x82\x85\x01a=AV[`@\x83\x01RP\x92\x91PPV[_aA\x95aA\x90\x84a@\xDBV[a<\xA8V[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15aA\xB8WaA\xB7a?wV[[\x83[\x81\x81\x10\x15aA\xFFW\x805g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aA\xDDWaA\xDCa\xC7V[\x97PP` aB\x8B\x8A\x82\x8B\x01a7\x95V[\x96PP`@aB\x9C\x8A\x82\x8B\x01a7\x95V[\x95PP``aB\xAD\x8A\x82\x8B\x01a7\x95V[\x94PP`\x80aB\xBE\x8A\x82\x8B\x01a7\x95V[\x93PP`\xA0\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aB\xDFWaB\xDEa7rV[[aB\xEB\x8A\x82\x8B\x01a@\xAEV[\x92PP`\xC0\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aC\x0CWaC\x0Ba7rV[[aC\x18\x8A\x82\x8B\x01aB\tV[\x91PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[_\x80\xFD[_`\xA0\x82\x84\x03\x12\x15aC@WaC?aC'V[[\x81\x90P\x92\x91PPV[_` \x82\x84\x03\x12\x15aC^WaC]a7nV[[_\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aC{WaCza7rV[[aC\x87\x84\x82\x85\x01aC+V[\x91PP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aC\xB4\x82aC\x90V[aC\xBE\x81\x85aC\x9AV[\x93PaC\xCE\x81\x85` \x86\x01a7\xEEV[aC\xD7\x81a8\x16V[\x84\x01\x91PP\x92\x91PPV[_``\x83\x01_\x83\x01QaC\xF7_\x86\x01\x82a9nV[P` \x83\x01QaD\n` \x86\x01\x82a9nV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaD\"\x82\x82aC\xAAV[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaDG\x81\x84aC\xE2V[\x90P\x92\x91PPV[_`\xA0\x83\x01_\x83\x01QaDd_\x86\x01\x82a9_V[P` \x83\x01QaDw` \x86\x01\x82a9nV[P`@\x83\x01QaD\x8A`@\x86\x01\x82a9nV[P``\x83\x01Q\x84\x82\x03``\x86\x01RaD\xA2\x82\x82a9\x8DV[\x91PP`\x80\x83\x01Q\x84\x82\x03`\x80\x86\x01RaD\xBC\x82\x82a9\x8DV[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaD\xE1\x81\x84aDOV[\x90P\x92\x91PPV[_`\x80\x83\x01_\x83\x01QaD\xFE_\x86\x01\x82a9nV[P` \x83\x01QaE\x11` \x86\x01\x82a9nV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaE)\x82\x82a9\x8DV[\x91PP``\x83\x01Q\x84\x82\x03``\x86\x01RaEC\x82\x82a9\x8DV[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaEh\x81\x84aD\xE9V[\x90P\x92\x91PPV[_\x81\x90P\x92\x91PPV[_aE\x84\x82a7\xD4V[aE\x8E\x81\x85aEpV[\x93PaE\x9E\x81\x85` \x86\x01a7\xEEV[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aE\xDE`\x02\x83aEpV[\x91PaE\xE9\x82aE\xAAV[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aF(`\x01\x83aEpV[\x91PaF3\x82aE\xF4V[`\x01\x82\x01\x90P\x91\x90PV[_aFI\x82\x87aEzV[\x91PaFT\x82aE\xD2V[\x91PaF`\x82\x86aEzV[\x91PaFk\x82aF\x1CV[\x91PaFw\x82\x85aEzV[\x91PaF\x82\x82aF\x1CV[\x91PaF\x8E\x82\x84aEzV[\x91P\x81\x90P\x95\x94PPPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\"`\x04R`$_\xFD[_`\x02\x82\x04\x90P`\x01\x82\x16\x80aF\xE0W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aF\xF3WaF\xF2aF\x9CV[[P\x91\x90PV[aG\x02\x81a9\x03V[\x81\x14aG\x0CW_\x80\xFD[PV[_\x81Q\x90PaG\x1D\x81aF\xF9V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aG8WaG7a7nV[[_aGE\x84\x82\x85\x01aG\x0FV[\x91PP\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_` `\x1F\x83\x01\x04\x90P\x91\x90PV[_\x82\x82\x1B\x90P\x92\x91PPV[_`\x08\x83\x02aG\xAA\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82aGoV[aG\xB4\x86\x83aGoV[\x95P\x80\x19\x84\x16\x93P\x80\x86\x16\x84\x17\x92PPP\x93\x92PPPV[_\x81\x90P\x91\x90PV[_aG\xEFaG\xEAaG\xE5\x84a7vV[aG\xCCV[a7vV[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[aH\x08\x83aG\xD5V[aH\x1CaH\x14\x82aG\xF6V[\x84\x84TaG{V[\x82UPPPPV[_\x90V[aH0aH$V[aH;\x81\x84\x84aG\xFFV[PPPV[[\x81\x81\x10\x15aH^WaHS_\x82aH(V[`\x01\x81\x01\x90PaHAV[PPV[`\x1F\x82\x11\x15aH\xA3WaHt\x81aGNV[aH}\x84aG`V[\x81\x01` \x85\x10\x15aH\x8CW\x81\x90P[aH\xA0aH\x98\x85aG`V[\x83\x01\x82aH@V[PP[PPPV[_\x82\x82\x1C\x90P\x92\x91PPV[_aH\xC3_\x19\x84`\x08\x02aH\xA8V[\x19\x80\x83\x16\x91PP\x92\x91PPV[_aH\xDB\x83\x83aH\xB4V[\x91P\x82`\x02\x02\x82\x17\x90P\x92\x91PPV[aH\xF4\x82a7\xD4V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aI\rWaI\x0CaV[[`\x01\x82\x026\x03\x83\x13\x15aQ\xA4WaQ\xA3aQBV[[P\x92P\x92\x90PV[_aQ\xB7\x83\x85a9}V[\x93PaQ\xC4\x83\x85\x84a<\xF2V[aQ\xCD\x83a8\x16V[\x84\x01\x90P\x93\x92PPPV[_`\xA0\x83\x01aQ\xE9_\x84\x01\x84aQ\x12V[aQ\xF5_\x86\x01\x82a9_V[PaR\x03` \x84\x01\x84aQ(V[aR\x10` \x86\x01\x82a9nV[PaR\x1E`@\x84\x01\x84aQ(V[aR+`@\x86\x01\x82a9nV[PaR9``\x84\x01\x84aQJV[\x85\x83\x03``\x87\x01RaRL\x83\x82\x84aQ\xACV[\x92PPPaR]`\x80\x84\x01\x84aQJV[\x85\x83\x03`\x80\x87\x01RaRp\x83\x82\x84aQ\xACV[\x92PPP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaR\x96\x81\x84aQ\xD8V[\x90P\x92\x91PPV[_`@\x82\x01\x90PaR\xB1_\x83\x01\x85a:\xF1V[aR\xBE` \x83\x01\x84a:\xF1V[\x93\x92PPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[aR\xFB\x81a=\xC8V[\x81\x14aS\x05W_\x80\xFD[PV[_\x81Q\x90PaS\x16\x81aR\xF2V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aS1WaS0a7nV[[_aS>\x84\x82\x85\x01aS\x08V[\x91PP\x92\x91PPV[_\x81\x90P\x92\x91PPV[_aS[\x82aC\x90V[aSe\x81\x85aSGV[\x93PaSu\x81\x85` \x86\x01a7\xEEV[\x80\x84\x01\x91PP\x92\x91PPV[_aS\x8C\x82\x84aSQV[\x91P\x81\x90P\x92\x91PPV", ); /// The runtime bytecode of the contract, as deployed on the network. /// /// ```text - ///0x608060405260043610610250575f3560e01c806379ba509711610138578063bff3aaba116100b5578063e30c397811610079578063e30c397814610876578063e3b2a874146108a0578063e5275eaf146108dc578063eb843cf614610918578063ef6997f914610940578063f2fde38b1461097c57610250565b8063bff3aaba14610770578063c2b42986146107ac578063c80b33ca146107d6578063cb5aa7e9146107fe578063d10f7ff91461083a57610250565b80639164d0ae116100fc5780639164d0ae146106b25780639a5a3bc4146106dc578063ad3cb1cc146106f2578063b4722bc41461071c578063ba1f31d21461074657610250565b806379ba5097146105e45780637eaac8f2146105fa578063882d7dd3146106245780638b8dd876146106605780638da5cb5b1461068857610250565b80632e2d3a82116101d15780635bace7ff116101955780635bace7ff146105005780636799ef521461053c578063715018a6146105665780637420f3d41461057c578063772d2fe9146105a6578063798b58a6146105ce57610250565b80632e2d3a821461042c57806346fbf68e1461045457806348144c61146104905780634f1ef286146104ba57806352d1902d146104d657610250565b806326cf5def1161021857806326cf5def146103365780632a388998146103605780632a8b9de91461038a5780632b101c03146103b45780632dd3edfe146103f057610250565b80630724dd23146102545780630d8e6e2c1461027c5780631ea5bd42146102a6578063203d0114146102d05780632585bb651461030c575b5f80fd5b34801561025f575f80fd5b5061027a60048036038101906102759190613f3c565b6109a4565b005b348015610287575f80fd5b506102906109ef565b60405161029d9190613ff1565b60405180910390f35b3480156102b1575f80fd5b506102ba610a6a565b6040516102c791906140f8565b60405180910390f35b3480156102db575f80fd5b506102f660048036038101906102f19190614142565b610b03565b6040516103039190614187565b60405180910390f35b348015610317575f80fd5b50610320610b63565b60405161032d919061432c565b60405180910390f35b348015610341575f80fd5b5061034a610da0565b604051610357919061435b565b60405180910390f35b34801561036b575f80fd5b50610374610db7565b604051610381919061435b565b60405180910390f35b348015610395575f80fd5b5061039e610dce565b6040516103ab91906140f8565b60405180910390f35b3480156103bf575f80fd5b506103da60048036038101906103d59190614142565b610e67565b6040516103e79190614187565b60405180910390f35b3480156103fb575f80fd5b5061041660048036038101906104119190614142565b610ec7565b6040516104239190614187565b60405180910390f35b348015610437575f80fd5b50610452600480360381019061044d9190613f3c565b610f27565b005b34801561045f575f80fd5b5061047a60048036038101906104759190614142565b610f72565b6040516104879190614187565b60405180910390f35b34801561049b575f80fd5b506104a4611006565b6040516104b191906143b5565b60405180910390f35b6104d460048036038101906104cf9190614501565b61114c565b005b3480156104e1575f80fd5b506104ea61116b565b6040516104f79190614573565b60405180910390f35b34801561050b575f80fd5b5061052660048036038101906105219190614142565b61119c565b6040516105339190614187565b60405180910390f35b348015610547575f80fd5b506105506111fc565b60405161055d919061435b565b60405180910390f35b348015610571575f80fd5b5061057a61122e565b005b348015610587575f80fd5b50610590611241565b60405161059d91906140f8565b60405180910390f35b3480156105b1575f80fd5b506105cc60048036038101906105c79190613f3c565b6112da565b005b3480156105d9575f80fd5b506105e2611325565b005b3480156105ef575f80fd5b506105f8611439565b005b348015610605575f80fd5b5061060e6114c7565b60405161061b91906140f8565b60405180910390f35b34801561062f575f80fd5b5061064a60048036038101906106459190614142565b611560565b6040516106579190614187565b60405180910390f35b34801561066b575f80fd5b5061068660048036038101906106819190614afc565b6115c0565b005b348015610693575f80fd5b5061069c6121fd565b6040516106a99190614c2c565b60405180910390f35b3480156106bd575f80fd5b506106c6612232565b6040516106d391906140f8565b60405180910390f35b3480156106e7575f80fd5b506106f06122cb565b005b3480156106fd575f80fd5b50610706612421565b6040516107139190613ff1565b60405180910390f35b348015610727575f80fd5b5061073061245a565b60405161073d919061435b565b60405180910390f35b348015610751575f80fd5b5061075a612471565b60405161076791906140f8565b60405180910390f35b34801561077b575f80fd5b5061079660048036038101906107919190613f3c565b61250a565b6040516107a39190614187565b60405180910390f35b3480156107b7575f80fd5b506107c061253e565b6040516107cd919061435b565b60405180910390f35b3480156107e1575f80fd5b506107fc60048036038101906107f79190614c67565b612555565b005b348015610809575f80fd5b50610824600480360381019061081f9190614142565b612703565b6040516108319190614d4d565b60405180910390f35b348015610845575f80fd5b50610860600480360381019061085b9190613f3c565b6128a1565b60405161086d9190614de7565b60405180910390f35b348015610881575f80fd5b5061088a612abc565b6040516108979190614c2c565b60405180910390f35b3480156108ab575f80fd5b506108c660048036038101906108c19190614142565b612af1565b6040516108d39190614e6e565b60405180910390f35b3480156108e7575f80fd5b5061090260048036038101906108fd9190614142565b612d1f565b60405161090f9190614187565b60405180910390f35b348015610923575f80fd5b5061093e60048036038101906109399190613f3c565b612d7f565b005b34801561094b575f80fd5b5061096660048036038101906109619190614142565b612dca565b6040516109739190614edb565b60405180910390f35b348015610987575f80fd5b506109a2600480360381019061099d9190614142565b612f68565b005b6109ac613021565b6109b5816130a8565b7f30c9b1d004f57eae3c6cc3a3752bcb4c8ea2e57c8241a782aa9b65fbc604ec5b816040516109e4919061435b565b60405180910390a150565b60606040518060400160405280600d81526020017f47617465776179436f6e66696700000000000000000000000000000000000000815250610a305f61314c565b610a3a600161314c565b610a435f61314c565b604051602001610a569493929190614fc9565b604051602081830303815290604052905090565b60605f610a75613216565b905080600d01805480602002602001604051908101604052809291908181526020018280548015610af857602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610aaf575b505050505091505090565b5f80610b0d613216565b9050806003015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b60605f610b6e613216565b905080601001805480602002602001604051908101604052809291908181526020015f905b82821015610d96578382905f5260205f2090600502016040518060a00160405290815f8201548152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382018054610c7790615054565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca390615054565b8015610cee5780601f10610cc557610100808354040283529160200191610cee565b820191905f5260205f20905b815481529060010190602001808311610cd157829003601f168201915b50505050508152602001600482018054610d0790615054565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3390615054565b8015610d7e5780601f10610d5557610100808354040283529160200191610d7e565b820191905f5260205f20905b815481529060010190602001808311610d6157829003601f168201915b50505050508152505081526020019060010190610b93565b5050505091505090565b5f80610daa613216565b9050806007015491505090565b5f80610dc1613216565b9050806008015491505090565b60605f610dd9613216565b905080601201805480602002602001604051908101604052809291908181526020018280548015610e5c57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610e13575b505050505091505090565b5f80610e71613216565b905080600b015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b5f80610ed1613216565b905080600a015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b610f2f613021565b610f388161323d565b7fe41802af725729adcb8c151e2937380a25c69155757e3af5d3979adab503580081604051610f67919061435b565b60405180910390a150565b5f73c1d733116990ce3d9e54f9ecf48a1cdd441af4f973ffffffffffffffffffffffffffffffffffffffff166346fbf68e836040518263ffffffff1660e01b8152600401610fc09190614c2c565b602060405180830381865afa158015610fdb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fff91906150ae565b9050919050565b61100e613d9e565b5f611017613216565b9050805f016040518060400160405290815f8201805461103690615054565b80601f016020809104026020016040519081016040528092919081815260200182805461106290615054565b80156110ad5780601f10611084576101008083540402835291602001916110ad565b820191905f5260205f20905b81548152906001019060200180831161109057829003601f168201915b505050505081526020016001820180546110c690615054565b80601f01602080910402602001604051908101604052809291908181526020018280546110f290615054565b801561113d5780601f106111145761010080835404028352916020019161113d565b820191905f5260205f20905b81548152906001019060200180831161112057829003601f168201915b50505050508152505091505090565b6111546132e1565b61115d826133c7565b61116782826133d2565b5050565b5f6111746134f0565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f806111a6613216565b9050806014015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b5f80611206613216565b90506001600282600d018054905061121e9190615133565b6112289190615163565b91505090565b611236613021565b61123f5f613577565b565b60605f61124c613216565b9050806005018054806020026020016040519081016040528092919081815260200182805480156112cf57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611286575b505050505091505090565b6112e2613021565b6112eb816135b4565b7f3571172a49e72d7724be384cdd59f4f21a216c70352ea59cb02543fc763084378160405161131a919061435b565b60405180910390a150565b61132d613021565b73de409109e0fccaae7b87de518f61d617a3fda09473ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611386575f80fd5b505af1158015611398573d5f803e3d5ffd5b5050505073817a285f1fca3bb4084cbfc77d4babc238ad609c73ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156113f5575f80fd5b505af1158015611407573d5f803e3d5ffd5b505050507fbe4f655daae0dbaef63a6b525cab2fa6ace4aa5b94b8834b241137cdfe73a5b060405160405180910390a1565b5f61144261361e565b90508073ffffffffffffffffffffffffffffffffffffffff16611463612abc565b73ffffffffffffffffffffffffffffffffffffffff16146114bb57806040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016114b29190614c2c565b60405180910390fd5b6114c481613577565b50565b60605f6114d2613216565b90508060060180548060200260200160405190810160405280929190818152602001828054801561155557602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161150c575b505050505091505090565b5f8061156a613216565b9050806015015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b60016115ca613625565b67ffffffffffffffff161461160b576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f611616613649565b9050805f0160089054906101000a900460ff168061165e57508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15611695576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055506116ea6116e56121fd565b613670565b5f855103611724576040517f068c8d4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84510361175e576040517f8af082ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835103611798576040517fcad1d53400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6117a1613216565b90508a815f015f820151815f0190816117ba9190615333565b5060208201518160010190816117d09190615333565b509050505f5b8651811015611b04576001826002015f8984815181106117f9576117f8615402565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555086818151811061186657611865615402565b5b6020026020010151826004015f89848151811061188657611885615402565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020190816119699190615333565b50606082015181600301908161197f9190615333565b509050508160050187828151811061199a57611999615402565b5b60200260200101515f0151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001826003015f898481518110611a1c57611a1b615402565b5b60200260200101516020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555081600601878281518110611a8e57611a8d615402565b5b602002602001015160200151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080806001019150506117d6565b50611b0e8a6135b4565b611b178961323d565b611b2088613684565b611b29876130a8565b5f5b8551811015611e4357600182600a015f888481518110611b4e57611b4d615402565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550858181518110611bbb57611bba615402565b5b602002602001015182600c015f888481518110611bdb57611bda615402565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019081611cbe9190615333565b5090505081600d01868281518110611cd957611cd8615402565b5b60200260200101515f0151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182600b015f888481518110611d5b57611d5a615402565b5b60200260200101516020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555081600e01868281518110611dcd57611dcc615402565b5b602002602001015160200151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080600101915050611b2b565b505f5b845181101561215e57848181518110611e6257611e61615402565b5b6020026020010151826011015f878481518110611e8257611e81615402565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019081611f659190615487565b5090505081601201858281518110611f8057611f7f615402565b5b60200260200101515f0151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001826014015f87848151811061200257612001615402565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508160130185828151811061207357612072615402565b5b602002602001015160200151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001826015015f8784815181106120f6576120f5615402565b5b60200260200101516020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508080600101915050611e46565b507f3a7c54b1195d44a288f9c3c9a0679aed9325068e0d0d5b69e96047355cc717458b8b888888604051612196959493929190615888565b60405180910390a1505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2826040516121e99190615917565b60405180910390a150505050505050505050565b5f80612207613728565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b60605f61223d613216565b905080600e018054806020026020016040519081016040528092919081815260200182805480156122c057602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612277575b505050505091505090565b6122d433610f72565b61231557336040517f206a346e00000000000000000000000000000000000000000000000000000000815260040161230c9190614c2c565b60405180910390fd5b73de409109e0fccaae7b87de518f61d617a3fda09473ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561236e575f80fd5b505af1158015612380573d5f803e3d5ffd5b5050505073817a285f1fca3bb4084cbfc77d4babc238ad609c73ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156123dd575f80fd5b505af11580156123ef573d5f803e3d5ffd5b505050507f13dbe8823219e226dd0525aeb071e1d2679f89382ba799f7f644867e65b6f3a660405160405180910390a1565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b5f80612464613216565b9050806016015491505090565b60605f61247c613216565b9050806013018054806020026020016040519081016040528092919081815260200182805480156124ff57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116124b6575b505050505091505090565b5f80612514613216565b905080600f015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b5f80612548613216565b9050806009015491505090565b61255d613021565b5f815f013503612599576040517f22f73fea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f013511156125ee57805f01356040517f4178de420000000000000000000000000000000000000000000000000000000081526004016125e5919061435b565b60405180910390fd5b5f6125f7613216565b905080600f015f835f013581526020019081526020015f205f9054906101000a900460ff161561266157815f01356040517f96a56828000000000000000000000000000000000000000000000000000000008152600401612658919061435b565b60405180910390fd5b8060100182908060018154018082558091505060019003905f5260205f2090600502015f9091909190915081816126989190615c69565b5050600181600f015f845f013581526020019081526020015f205f6101000a81548160ff0219169083151502179055507f66769341effd268fc4e9a9c8f27bfc968507b519b0ddb9b4ad3ded5f03016837826040516126f79190615de3565b60405180910390a15050565b61270b613db8565b5f612714613216565b9050806011015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201805461281990615054565b80601f016020809104026020016040519081016040528092919081815260200182805461284590615054565b80156128905780601f1061286757610100808354040283529160200191612890565b820191905f5260205f20905b81548152906001019060200180831161287357829003601f168201915b505050505081525050915050919050565b6128a9613e03565b5f6128b2613216565b90508060100183815481106128ca576128c9615402565b5b905f5260205f2090600502016040518060a00160405290815f8201548152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820180546129a490615054565b80601f01602080910402602001604051908101604052809291908181526020018280546129d090615054565b8015612a1b5780601f106129f257610100808354040283529160200191612a1b565b820191905f5260205f20905b8154815290600101906020018083116129fe57829003601f168201915b50505050508152602001600482018054612a3490615054565b80601f0160208091040260200160405190810160405280929190818152602001828054612a6090615054565b8015612aab5780601f10612a8257610100808354040283529160200191612aab565b820191905f5260205f20905b815481529060010190602001808311612a8e57829003601f168201915b505050505081525050915050919050565b5f80612ac661374f565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b612af9613e5b565b5f612b02613216565b9050806004015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060800160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282018054612c0790615054565b80601f0160208091040260200160405190810160405280929190818152602001828054612c3390615054565b8015612c7e5780601f10612c5557610100808354040283529160200191612c7e565b820191905f5260205f20905b815481529060010190602001808311612c6157829003601f168201915b50505050508152602001600382018054612c9790615054565b80601f0160208091040260200160405190810160405280929190818152602001828054612cc390615054565b8015612d0e5780601f10612ce557610100808354040283529160200191612d0e565b820191905f5260205f20905b815481529060010190602001808311612cf157829003601f168201915b505050505081525050915050919050565b5f80612d29613216565b9050806002015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b612d87613021565b612d9081613684565b7f837e0a6528dadfa2dc792692c5182e52a9f5bbdeed7b2372927a26c69583961381604051612dbf919061435b565b60405180910390a150565b612dd2613ead565b5f612ddb613216565b905080600c015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282018054612ee090615054565b80601f0160208091040260200160405190810160405280929190818152602001828054612f0c90615054565b8015612f575780601f10612f2e57610100808354040283529160200191612f57565b820191905f5260205f20905b815481529060010190602001808311612f3a57829003601f168201915b505050505081525050915050919050565b612f70613021565b5f612f7961374f565b905081815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16612fdb6121fd565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b61302961361e565b73ffffffffffffffffffffffffffffffffffffffff166130476121fd565b73ffffffffffffffffffffffffffffffffffffffff16146130a65761306a61361e565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161309d9190614c2c565b60405180910390fd5b565b5f6130b1613216565b90505f816006018054905090505f83036130f7576040517f3ee5077400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8083111561313e5782816040517f0f69cbfc000000000000000000000000000000000000000000000000000000008152600401613135929190615e03565b60405180910390fd5b828260160181905550505050565b60605f600161315a84613776565b0190505f8167ffffffffffffffff811115613178576131776143dd565b5b6040519080825280601f01601f1916602001820160405280156131aa5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561320b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581613200576131ff6150d9565b5b0494505f85036131b7575b819350505050919050565b5f7f86d3070a8993f6b209bee6185186d38a07fce8bbd97c750d934451b72f35b400905090565b5f613246613216565b90505f816006018054905090505f830361328c576040517fb1ae92ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156132d35782816040517f84208f230000000000000000000000000000000000000000000000000000000081526004016132ca929190615e03565b60405180910390fd5b828260080181905550505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148061338e57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166133756138c7565b73ffffffffffffffffffffffffffffffffffffffff1614155b156133c5576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6133cf613021565b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561343a57506040513d601f19601f820116820180604052508101906134379190615e54565b60015b61347b57816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016134729190614c2c565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b81146134e157806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016134d89190614573565b60405180910390fd5b6134eb838361391a565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614613575576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f61358061374f565b9050805f015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556135b08261398c565b5050565b5f6135bd613216565b90505f816006018054905090508083106136105782816040517f907e6681000000000000000000000000000000000000000000000000000000008152600401613607929190615e03565b60405180910390fd5b828260070181905550505050565b5f33905090565b5f61362e613649565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b613678613a5d565b61368181613a9d565b50565b5f61368d613216565b90505f816006018054905090505f83036136d3576040517fe60a727100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8083111561371a5782816040517fd2535e11000000000000000000000000000000000000000000000000000000008152600401613711929190615e03565b60405180910390fd5b828260090181905550505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00905090565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106137d2577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816137c8576137c76150d9565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061380f576d04ee2d6d415b85acef81000000008381613805576138046150d9565b5b0492506020810190505b662386f26fc10000831061383e57662386f26fc100008381613834576138336150d9565b5b0492506010810190505b6305f5e1008310613867576305f5e100838161385d5761385c6150d9565b5b0492506008810190505b612710831061388c576127108381613882576138816150d9565b5b0492506004810190505b606483106138af57606483816138a5576138a46150d9565b5b0492506002810190505b600a83106138be576001810190505b80915050919050565b5f6138f37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613b21565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61392382613b2a565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f8151111561397f576139798282613bf3565b50613988565b613987613c73565b5b5050565b5f613995613728565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b613a65613caf565b613a9b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b613aa5613a5d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613b15575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401613b0c9190614c2c565b60405180910390fd5b613b1e81613577565b50565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03613b8557806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401613b7c9190614c2c565b60405180910390fd5b80613bb17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613b21565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051613c1c9190615eb9565b5f60405180830381855af49150503d805f8114613c54576040519150601f19603f3d011682016040523d82523d5f602084013e613c59565b606091505b5091509150613c69858383613ccd565b9250505092915050565b5f341115613cad576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f613cb8613649565b5f0160089054906101000a900460ff16905090565b606082613ce257613cdd82613d5a565b613d52565b5f8251148015613d0857505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15613d4a57836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401613d419190614c2c565b60405180910390fd5b819050613d53565b5b9392505050565b5f81511115613d6c5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806040016040528060608152602001606081525090565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060a001604052805f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081525090565b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081525090565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b613f1b81613f09565b8114613f25575f80fd5b50565b5f81359050613f3681613f12565b92915050565b5f60208284031215613f5157613f50613f01565b5b5f613f5e84828501613f28565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613f9e578082015181840152602081019050613f83565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613fc382613f67565b613fcd8185613f71565b9350613fdd818560208601613f81565b613fe681613fa9565b840191505092915050565b5f6020820190508181035f8301526140098184613fb9565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6140638261403a565b9050919050565b61407381614059565b82525050565b5f614084838361406a565b60208301905092915050565b5f602082019050919050565b5f6140a682614011565b6140b0818561401b565b93506140bb8361402b565b805f5b838110156140eb5781516140d28882614079565b97506140dd83614090565b9250506001810190506140be565b5085935050505092915050565b5f6020820190508181035f830152614110818461409c565b905092915050565b61412181614059565b811461412b575f80fd5b50565b5f8135905061413c81614118565b92915050565b5f6020828403121561415757614156613f01565b5b5f6141648482850161412e565b91505092915050565b5f8115159050919050565b6141818161416d565b82525050565b5f60208201905061419a5f830184614178565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6141d281613f09565b82525050565b5f82825260208201905092915050565b5f6141f282613f67565b6141fc81856141d8565b935061420c818560208601613f81565b61421581613fa9565b840191505092915050565b5f60a083015f8301516142355f8601826141c9565b506020830151614248602086018261406a565b50604083015161425b604086018261406a565b506060830151848203606086015261427382826141e8565b9150506080830151848203608086015261428d82826141e8565b9150508091505092915050565b5f6142a58383614220565b905092915050565b5f602082019050919050565b5f6142c3826141a0565b6142cd81856141aa565b9350836020820285016142df856141ba565b805f5b8581101561431a57848403895281516142fb858261429a565b9450614306836142ad565b925060208a019950506001810190506142e2565b50829750879550505050505092915050565b5f6020820190508181035f83015261434481846142b9565b905092915050565b61435581613f09565b82525050565b5f60208201905061436e5f83018461434c565b92915050565b5f604083015f8301518482035f86015261438e82826141e8565b915050602083015184820360208601526143a882826141e8565b9150508091505092915050565b5f6020820190508181035f8301526143cd8184614374565b905092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61441382613fa9565b810181811067ffffffffffffffff82111715614432576144316143dd565b5b80604052505050565b5f614444613ef8565b9050614450828261440a565b919050565b5f67ffffffffffffffff82111561446f5761446e6143dd565b5b61447882613fa9565b9050602081019050919050565b828183375f83830152505050565b5f6144a56144a084614455565b61443b565b9050828152602081018484840111156144c1576144c06143d9565b5b6144cc848285614485565b509392505050565b5f82601f8301126144e8576144e76143d5565b5b81356144f8848260208601614493565b91505092915050565b5f806040838503121561451757614516613f01565b5b5f6145248582860161412e565b925050602083013567ffffffffffffffff81111561454557614544613f05565b5b614551858286016144d4565b9150509250929050565b5f819050919050565b61456d8161455b565b82525050565b5f6020820190506145865f830184614564565b92915050565b5f80fd5b5f80fd5b5f67ffffffffffffffff8211156145ae576145ad6143dd565b5b6145b782613fa9565b9050602081019050919050565b5f6145d66145d184614594565b61443b565b9050828152602081018484840111156145f2576145f16143d9565b5b6145fd848285614485565b509392505050565b5f82601f830112614619576146186143d5565b5b81356146298482602086016145c4565b91505092915050565b5f604082840312156146475761464661458c565b5b614651604061443b565b90505f82013567ffffffffffffffff8111156146705761466f614590565b5b61467c84828501614605565b5f83015250602082013567ffffffffffffffff81111561469f5761469e614590565b5b6146ab84828501614605565b60208301525092915050565b5f67ffffffffffffffff8211156146d1576146d06143dd565b5b602082029050602081019050919050565b5f80fd5b5f608082840312156146fb576146fa61458c565b5b614705608061443b565b90505f6147148482850161412e565b5f8301525060206147278482850161412e565b602083015250604082013567ffffffffffffffff81111561474b5761474a614590565b5b61475784828501614605565b604083015250606082013567ffffffffffffffff81111561477b5761477a614590565b5b61478784828501614605565b60608301525092915050565b5f6147a56147a0846146b7565b61443b565b905080838252602082019050602084028301858111156147c8576147c76146e2565b5b835b8181101561480f57803567ffffffffffffffff8111156147ed576147ec6143d5565b5b8086016147fa89826146e6565b855260208501945050506020810190506147ca565b5050509392505050565b5f82601f83011261482d5761482c6143d5565b5b813561483d848260208601614793565b91505092915050565b5f67ffffffffffffffff8211156148605761485f6143dd565b5b602082029050602081019050919050565b5f606082840312156148865761488561458c565b5b614890606061443b565b90505f61489f8482850161412e565b5f8301525060206148b28482850161412e565b602083015250604082013567ffffffffffffffff8111156148d6576148d5614590565b5b6148e284828501614605565b60408301525092915050565b5f6149006148fb84614846565b61443b565b90508083825260208201905060208402830185811115614923576149226146e2565b5b835b8181101561496a57803567ffffffffffffffff811115614948576149476143d5565b5b8086016149558982614871565b85526020850194505050602081019050614925565b5050509392505050565b5f82601f830112614988576149876143d5565b5b81356149988482602086016148ee565b91505092915050565b5f67ffffffffffffffff8211156149bb576149ba6143dd565b5b602082029050602081019050919050565b5f606082840312156149e1576149e061458c565b5b6149eb606061443b565b90505f6149fa8482850161412e565b5f830152506020614a0d8482850161412e565b602083015250604082013567ffffffffffffffff811115614a3157614a30614590565b5b614a3d848285016144d4565b60408301525092915050565b5f614a5b614a56846149a1565b61443b565b90508083825260208201905060208402830185811115614a7e57614a7d6146e2565b5b835b81811015614ac557803567ffffffffffffffff811115614aa357614aa26143d5565b5b808601614ab089826149cc565b85526020850194505050602081019050614a80565b5050509392505050565b5f82601f830112614ae357614ae26143d5565b5b8135614af3848260208601614a49565b91505092915050565b5f805f805f805f80610100898b031215614b1957614b18613f01565b5b5f89013567ffffffffffffffff811115614b3657614b35613f05565b5b614b428b828c01614632565b9850506020614b538b828c01613f28565b9750506040614b648b828c01613f28565b9650506060614b758b828c01613f28565b9550506080614b868b828c01613f28565b94505060a089013567ffffffffffffffff811115614ba757614ba6613f05565b5b614bb38b828c01614819565b93505060c089013567ffffffffffffffff811115614bd457614bd3613f05565b5b614be08b828c01614974565b92505060e089013567ffffffffffffffff811115614c0157614c00613f05565b5b614c0d8b828c01614acf565b9150509295985092959890939650565b614c2681614059565b82525050565b5f602082019050614c3f5f830184614c1d565b92915050565b5f80fd5b5f60a08284031215614c5e57614c5d614c45565b5b81905092915050565b5f60208284031215614c7c57614c7b613f01565b5b5f82013567ffffffffffffffff811115614c9957614c98613f05565b5b614ca584828501614c49565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f614cd282614cae565b614cdc8185614cb8565b9350614cec818560208601613f81565b614cf581613fa9565b840191505092915050565b5f606083015f830151614d155f86018261406a565b506020830151614d28602086018261406a565b5060408301518482036040860152614d408282614cc8565b9150508091505092915050565b5f6020820190508181035f830152614d658184614d00565b905092915050565b5f60a083015f830151614d825f8601826141c9565b506020830151614d95602086018261406a565b506040830151614da8604086018261406a565b5060608301518482036060860152614dc082826141e8565b91505060808301518482036080860152614dda82826141e8565b9150508091505092915050565b5f6020820190508181035f830152614dff8184614d6d565b905092915050565b5f608083015f830151614e1c5f86018261406a565b506020830151614e2f602086018261406a565b5060408301518482036040860152614e4782826141e8565b91505060608301518482036060860152614e6182826141e8565b9150508091505092915050565b5f6020820190508181035f830152614e868184614e07565b905092915050565b5f606083015f830151614ea35f86018261406a565b506020830151614eb6602086018261406a565b5060408301518482036040860152614ece82826141e8565b9150508091505092915050565b5f6020820190508181035f830152614ef38184614e8e565b905092915050565b5f81905092915050565b5f614f0f82613f67565b614f198185614efb565b9350614f29818560208601613f81565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f614f69600283614efb565b9150614f7482614f35565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f614fb3600183614efb565b9150614fbe82614f7f565b600182019050919050565b5f614fd48287614f05565b9150614fdf82614f5d565b9150614feb8286614f05565b9150614ff682614fa7565b91506150028285614f05565b915061500d82614fa7565b91506150198284614f05565b915081905095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061506b57607f821691505b60208210810361507e5761507d615027565b5b50919050565b61508d8161416d565b8114615097575f80fd5b50565b5f815190506150a881615084565b92915050565b5f602082840312156150c3576150c2613f01565b5b5f6150d08482850161509a565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61513d82613f09565b915061514883613f09565b925082615158576151576150d9565b5b828204905092915050565b5f61516d82613f09565b915061517883613f09565b92508282019050808211156151905761518f615106565b5b92915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026151f27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826151b7565b6151fc86836151b7565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61523761523261522d84613f09565b615214565b613f09565b9050919050565b5f819050919050565b6152508361521d565b61526461525c8261523e565b8484546151c3565b825550505050565b5f90565b61527861526c565b615283818484615247565b505050565b5b818110156152a65761529b5f82615270565b600181019050615289565b5050565b601f8211156152eb576152bc81615196565b6152c5846151a8565b810160208510156152d4578190505b6152e86152e0856151a8565b830182615288565b50505b505050565b5f82821c905092915050565b5f61530b5f19846008026152f0565b1980831691505092915050565b5f61532383836152fc565b9150826002028217905092915050565b61533c82613f67565b67ffffffffffffffff811115615355576153546143dd565b5b61535f8254615054565b61536a8282856152aa565b5f60209050601f83116001811461539b575f8415615389578287015190505b6153938582615318565b8655506153fa565b601f1984166153a986615196565b5f5b828110156153d0578489015182556001820191506020850194506020810190506153ab565b868310156153ed57848901516153e9601f8916826152fc565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050815f5260205f209050919050565b601f821115615482576154538161542f565b61545c846151a8565b8101602085101561546b578190505b61547f615477856151a8565b830182615288565b50505b505050565b61549082614cae565b67ffffffffffffffff8111156154a9576154a86143dd565b5b6154b38254615054565b6154be828285615441565b5f60209050601f8311600181146154ef575f84156154dd578287015190505b6154e78582615318565b86555061554e565b601f1984166154fd8661542f565b5f5b82811015615524578489015182556001820191506020850194506020810190506154ff565b86831015615541578489015161553d601f8916826152fc565b8355505b6001600288020188555050505b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f608083015f8301516155945f86018261406a565b5060208301516155a7602086018261406a565b50604083015184820360408601526155bf82826141e8565b915050606083015184820360608601526155d982826141e8565b9150508091505092915050565b5f6155f1838361557f565b905092915050565b5f602082019050919050565b5f61560f82615556565b6156198185615560565b93508360208202850161562b85615570565b805f5b85811015615666578484038952815161564785826155e6565b9450615652836155f9565b925060208a0199505060018101905061562e565b50829750879550505050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f606083015f8301516156b65f86018261406a565b5060208301516156c9602086018261406a565b50604083015184820360408601526156e182826141e8565b9150508091505092915050565b5f6156f983836156a1565b905092915050565b5f602082019050919050565b5f61571782615678565b6157218185615682565b93508360208202850161573385615692565b805f5b8581101561576e578484038952815161574f85826156ee565b945061575a83615701565b925060208a01995050600181019050615736565b50829750879550505050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f606083015f8301516157be5f86018261406a565b5060208301516157d1602086018261406a565b50604083015184820360408601526157e98282614cc8565b9150508091505092915050565b5f61580183836157a9565b905092915050565b5f602082019050919050565b5f61581f82615780565b615829818561578a565b93508360208202850161583b8561579a565b805f5b85811015615876578484038952815161585785826157f6565b945061586283615809565b925060208a0199505060018101905061583e565b50829750879550505050505092915050565b5f60a0820190508181035f8301526158a08188614374565b90506158af602083018761434c565b81810360408301526158c18186615605565b905081810360608301526158d5818561570d565b905081810360808301526158e98184615815565b90509695505050505050565b5f67ffffffffffffffff82169050919050565b615911816158f5565b82525050565b5f60208201905061592a5f830184615908565b92915050565b5f813561593c81613f12565b80915050919050565b5f815f1b9050919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61597b84615945565b9350801983169250808416831791505092915050565b61599a8261521d565b6159ad6159a68261523e565b8354615950565b8255505050565b5f81356159c081614118565b80915050919050565b5f73ffffffffffffffffffffffffffffffffffffffff6159e884615945565b9350801983169250808416831791505092915050565b5f615a18615a13615a0e8461403a565b615214565b61403a565b9050919050565b5f615a29826159fe565b9050919050565b5f615a3a82615a1f565b9050919050565b5f819050919050565b615a5382615a30565b615a66615a5f82615a41565b83546159c9565b8255505050565b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112615a9557615a94615a6d565b5b80840192508235915067ffffffffffffffff821115615ab757615ab6615a71565b5b602083019250600182023603831315615ad357615ad2615a75565b5b509250929050565b5f82905092915050565b615aef8383615adb565b67ffffffffffffffff811115615b0857615b076143dd565b5b615b128254615054565b615b1d8282856152aa565b5f601f831160018114615b4a575f8415615b38578287013590505b615b428582615318565b865550615ba9565b601f198416615b5886615196565b5f5b82811015615b7f57848901358255600182019150602085019450602081019050615b5a565b86831015615b9c5784890135615b98601f8916826152fc565b8355505b6001600288020188555050505b50505050505050565b615bbd838383615ae5565b505050565b5f81015f830180615bd281615930565b9050615bde8184615991565b505050600181016020830180615bf3816159b4565b9050615bff8184615a4a565b505050600281016040830180615c14816159b4565b9050615c208184615a4a565b5050506003810160608301615c358185615a79565b615c40818386615bb2565b505050506004810160808301615c568185615a79565b615c61818386615bb2565b505050505050565b615c738282615bc2565b5050565b5f615c856020840184613f28565b905092915050565b5f615c9b602084018461412e565b905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112615ccb57615cca615cab565b5b83810192508235915060208301925067ffffffffffffffff821115615cf357615cf2615ca3565b5b600182023603831315615d0957615d08615ca7565b5b509250929050565b5f615d1c83856141d8565b9350615d29838584614485565b615d3283613fa9565b840190509392505050565b5f60a08301615d4e5f840184615c77565b615d5a5f8601826141c9565b50615d686020840184615c8d565b615d75602086018261406a565b50615d836040840184615c8d565b615d90604086018261406a565b50615d9e6060840184615caf565b8583036060870152615db1838284615d11565b92505050615dc26080840184615caf565b8583036080870152615dd5838284615d11565b925050508091505092915050565b5f6020820190508181035f830152615dfb8184615d3d565b905092915050565b5f604082019050615e165f83018561434c565b615e23602083018461434c565b9392505050565b615e338161455b565b8114615e3d575f80fd5b50565b5f81519050615e4e81615e2a565b92915050565b5f60208284031215615e6957615e68613f01565b5b5f615e7684828501615e40565b91505092915050565b5f81905092915050565b5f615e9382614cae565b615e9d8185615e7f565b9350615ead818560208601613f81565b80840191505092915050565b5f615ec48284615e89565b91508190509291505056 + ///0x608060405260043610610219575f3560e01c80637eaac8f211610122578063c2b42986116100aa578063e30c39781161006e578063e30c39781461075f578063e3b2a87414610789578063e5275eaf146107c5578063eb843cf614610801578063f2fde38b1461082957610219565b8063c2b429861461067f578063c4115874146106a9578063c80b33ca146106bf578063cb5aa7e9146106e7578063d10f7ff91461072357610219565b8063ad3cb1cc116100f1578063ad3cb1cc1461059d578063aeb1a21c146105c7578063b4722bc4146105ef578063ba1f31d214610619578063bff3aaba1461064357610219565b80637eaac8f2146104f7578063882d7dd3146105215780638da5cb5b1461055d5780639a5a3bc41461058757610219565b806348144c61116101a5578063715018a611610174578063715018a6146104635780637420f3d414610479578063772d2fe9146104a3578063798b58a6146104cb57806379ba5097146104e157610219565b806348144c61146103b75780634f1ef286146103e157806352d1902d146103fd5780635bace7ff1461042757610219565b806326cf5def116101ec57806326cf5def146102d55780632a388998146102ff5780632a8b9de9146103295780632e2d3a821461035357806346fbf68e1461037b57610219565b80630724dd231461021d5780630d8e6e2c14610245578063203d01141461026f5780632585bb65146102ab575b5f80fd5b348015610228575f80fd5b50610243600480360381019061023e91906137a9565b610851565b005b348015610250575f80fd5b5061025961089c565b604051610266919061385e565b60405180910390f35b34801561027a575f80fd5b50610295600480360381019061029091906138d8565b610917565b6040516102a2919061391d565b60405180910390f35b3480156102b6575f80fd5b506102bf610977565b6040516102cc9190613ad1565b60405180910390f35b3480156102e0575f80fd5b506102e9610bb4565b6040516102f69190613b00565b60405180910390f35b34801561030a575f80fd5b50610313610bcb565b6040516103209190613b00565b60405180910390f35b348015610334575f80fd5b5061033d610be2565b60405161034a9190613bc1565b60405180910390f35b34801561035e575f80fd5b50610379600480360381019061037491906137a9565b610c7b565b005b348015610386575f80fd5b506103a1600480360381019061039c91906138d8565b610cc6565b6040516103ae919061391d565b60405180910390f35b3480156103c2575f80fd5b506103cb610d5a565b6040516103d89190613c22565b60405180910390f35b6103fb60048036038101906103f69190613d6e565b610ea0565b005b348015610408575f80fd5b50610411610ebf565b60405161041e9190613de0565b60405180910390f35b348015610432575f80fd5b5061044d600480360381019061044891906138d8565b610ef0565b60405161045a919061391d565b60405180910390f35b34801561046e575f80fd5b50610477610f50565b005b348015610484575f80fd5b5061048d610f63565b60405161049a9190613bc1565b60405180910390f35b3480156104ae575f80fd5b506104c960048036038101906104c491906137a9565b610ffc565b005b3480156104d6575f80fd5b506104df611047565b005b3480156104ec575f80fd5b506104f561115b565b005b348015610502575f80fd5b5061050b6111e9565b6040516105189190613bc1565b60405180910390f35b34801561052c575f80fd5b50610547600480360381019061054291906138d8565b611282565b604051610554919061391d565b60405180910390f35b348015610568575f80fd5b506105716112e2565b60405161057e9190613e08565b60405180910390f35b348015610592575f80fd5b5061059b611317565b005b3480156105a8575f80fd5b506105b161146d565b6040516105be919061385e565b60405180910390f35b3480156105d2575f80fd5b506105ed60048036038101906105e89190614236565b6114a6565b005b3480156105fa575f80fd5b50610603611d8b565b6040516106109190613b00565b60405180910390f35b348015610624575f80fd5b5061062d611da2565b60405161063a9190613bc1565b60405180910390f35b34801561064e575f80fd5b50610669600480360381019061066491906137a9565b611e3b565b604051610676919061391d565b60405180910390f35b34801561068a575f80fd5b50610693611e6f565b6040516106a09190613b00565b60405180910390f35b3480156106b4575f80fd5b506106bd611e86565b005b3480156106ca575f80fd5b506106e560048036038101906106e09190614349565b611fab565b005b3480156106f2575f80fd5b5061070d600480360381019061070891906138d8565b612159565b60405161071a919061442f565b60405180910390f35b34801561072e575f80fd5b50610749600480360381019061074491906137a9565b6122f7565b60405161075691906144c9565b60405180910390f35b34801561076a575f80fd5b50610773612512565b6040516107809190613e08565b60405180910390f35b348015610794575f80fd5b506107af60048036038101906107aa91906138d8565b612547565b6040516107bc9190614550565b60405180910390f35b3480156107d0575f80fd5b506107eb60048036038101906107e691906138d8565b612775565b6040516107f8919061391d565b60405180910390f35b34801561080c575f80fd5b50610827600480360381019061082291906137a9565b6127d5565b005b348015610834575f80fd5b5061084f600480360381019061084a91906138d8565b612820565b005b6108596128d9565b61086281612960565b7f30c9b1d004f57eae3c6cc3a3752bcb4c8ea2e57c8241a782aa9b65fbc604ec5b816040516108919190613b00565b60405180910390a150565b60606040518060400160405280600d81526020017f47617465776179436f6e666967000000000000000000000000000000000000008152506108dd5f612a04565b6108e76002612a04565b6108f05f612a04565b604051602001610903949392919061463e565b604051602081830303815290604052905090565b5f80610921612ace565b9050806003015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b60605f610982612ace565b905080601001805480602002602001604051908101604052809291908181526020015f905b82821015610baa578382905f5260205f2090600502016040518060a00160405290815f8201548152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382018054610a8b906146c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab7906146c9565b8015610b025780601f10610ad957610100808354040283529160200191610b02565b820191905f5260205f20905b815481529060010190602001808311610ae557829003601f168201915b50505050508152602001600482018054610b1b906146c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b47906146c9565b8015610b925780601f10610b6957610100808354040283529160200191610b92565b820191905f5260205f20905b815481529060010190602001808311610b7557829003601f168201915b505050505081525050815260200190600101906109a7565b5050505091505090565b5f80610bbe612ace565b9050806007015491505090565b5f80610bd5612ace565b9050806008015491505090565b60605f610bed612ace565b905080601201805480602002602001604051908101604052809291908181526020018280548015610c7057602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610c27575b505050505091505090565b610c836128d9565b610c8c81612af5565b7fe41802af725729adcb8c151e2937380a25c69155757e3af5d3979adab503580081604051610cbb9190613b00565b60405180910390a150565b5f73c1d733116990ce3d9e54f9ecf48a1cdd441af4f973ffffffffffffffffffffffffffffffffffffffff166346fbf68e836040518263ffffffff1660e01b8152600401610d149190613e08565b602060405180830381865afa158015610d2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d539190614723565b9050919050565b610d62613656565b5f610d6b612ace565b9050805f016040518060400160405290815f82018054610d8a906146c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610db6906146c9565b8015610e015780601f10610dd857610100808354040283529160200191610e01565b820191905f5260205f20905b815481529060010190602001808311610de457829003601f168201915b50505050508152602001600182018054610e1a906146c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e46906146c9565b8015610e915780601f10610e6857610100808354040283529160200191610e91565b820191905f5260205f20905b815481529060010190602001808311610e7457829003601f168201915b50505050508152505091505090565b610ea8612b99565b610eb182612c7f565b610ebb8282612c8a565b5050565b5f610ec8612da8565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f80610efa612ace565b9050806014015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b610f586128d9565b610f615f612e2f565b565b60605f610f6e612ace565b905080600501805480602002602001604051908101604052809291908181526020018280548015610ff157602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610fa8575b505050505091505090565b6110046128d9565b61100d81612e6c565b7f3571172a49e72d7724be384cdd59f4f21a216c70352ea59cb02543fc763084378160405161103c9190613b00565b60405180910390a150565b61104f6128d9565b73de409109e0fccaae7b87de518f61d617a3fda09473ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156110a8575f80fd5b505af11580156110ba573d5f803e3d5ffd5b5050505073817a285f1fca3bb4084cbfc77d4babc238ad609c73ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611117575f80fd5b505af1158015611129573d5f803e3d5ffd5b505050507fbe4f655daae0dbaef63a6b525cab2fa6ace4aa5b94b8834b241137cdfe73a5b060405160405180910390a1565b5f611164612ed6565b90508073ffffffffffffffffffffffffffffffffffffffff16611185612512565b73ffffffffffffffffffffffffffffffffffffffff16146111dd57806040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016111d49190613e08565b60405180910390fd5b6111e681612e2f565b50565b60605f6111f4612ace565b90508060060180548060200260200160405190810160405280929190818152602001828054801561127757602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161122e575b505050505091505090565b5f8061128c612ace565b9050806015015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b5f806112ec612edd565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b61132033610cc6565b61136157336040517f206a346e0000000000000000000000000000000000000000000000000000000081526004016113589190613e08565b60405180910390fd5b73de409109e0fccaae7b87de518f61d617a3fda09473ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156113ba575f80fd5b505af11580156113cc573d5f803e3d5ffd5b5050505073817a285f1fca3bb4084cbfc77d4babc238ad609c73ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611429575f80fd5b505af115801561143b573d5f803e3d5ffd5b505050507f13dbe8823219e226dd0525aeb071e1d2679f89382ba799f7f644867e65b6f3a660405160405180910390a1565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60016114b0612f04565b67ffffffffffffffff16146114f1576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f6114fc612f28565b9050805f0160089054906101000a900460ff168061154457508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b1561157b576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055506115d06115cb6112e2565b612f4f565b5f84510361160a576040517f068c8d4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835103611644576040517fcad1d53400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61164d612ace565b905089815f015f820151815f01908161166691906148eb565b50602082015181600101908161167c91906148eb565b509050505f5b85518110156119b0576001826002015f8884815181106116a5576116a46149ba565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550858181518110611712576117116149ba565b5b6020026020010151826004015f888481518110611732576117316149ba565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201908161181591906148eb565b50606082015181600301908161182b91906148eb565b5090505081600501868281518110611846576118456149ba565b5b60200260200101515f0151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001826003015f8884815181106118c8576118c76149ba565b5b60200260200101516020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508160060186828151811061193a576119396149ba565b5b602002602001015160200151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080600101915050611682565b506119ba89612e6c565b6119c388612af5565b6119cc87612f63565b6119d586612960565b5f5b8451811015611cef578481815181106119f3576119f26149ba565b5b6020026020010151826011015f878481518110611a1357611a126149ba565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019081611af69190614a3f565b5090505081601201858281518110611b1157611b106149ba565b5b60200260200101515f0151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001826014015f878481518110611b9357611b926149ba565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555081601301858281518110611c0457611c036149ba565b5b602002602001015160200151908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001826015015f878481518110611c8757611c866149ba565b5b60200260200101516020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080806001019150506119d7565b507fab58ab938892a1855d09c7c1390cabd4ca0405eaab322c5a82570770a719826e8a8a8787604051611d259493929190614d38565b60405180910390a1505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d282604051611d789190614db2565b60405180910390a1505050505050505050565b5f80611d95612ace565b9050806016015491505090565b60605f611dad612ace565b905080601301805480602002602001604051908101604052809291908181526020018280548015611e3057602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611de7575b505050505091505090565b5f80611e45612ace565b905080600f015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b5f80611e79612ace565b9050806009015491505090565b60035f611e91612f28565b9050805f0160089054906101000a900460ff1680611ed957508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15611f10576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d282604051611f9f9190614db2565b60405180910390a15050565b611fb36128d9565b5f815f013503611fef576040517f22f73fea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f0135111561204457805f01356040517f4178de4200000000000000000000000000000000000000000000000000000000815260040161203b9190613b00565b60405180910390fd5b5f61204d612ace565b905080600f015f835f013581526020019081526020015f205f9054906101000a900460ff16156120b757815f01356040517f96a568280000000000000000000000000000000000000000000000000000000081526004016120ae9190613b00565b60405180910390fd5b8060100182908060018154018082558091505060019003905f5260205f2090600502015f9091909190915081816120ee9190615104565b5050600181600f015f845f013581526020019081526020015f205f6101000a81548160ff0219169083151502179055507f66769341effd268fc4e9a9c8f27bfc968507b519b0ddb9b4ad3ded5f030168378260405161214d919061527e565b60405180910390a15050565b612161613670565b5f61216a612ace565b9050806011015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201805461226f906146c9565b80601f016020809104026020016040519081016040528092919081815260200182805461229b906146c9565b80156122e65780601f106122bd576101008083540402835291602001916122e6565b820191905f5260205f20905b8154815290600101906020018083116122c957829003601f168201915b505050505081525050915050919050565b6122ff6136bb565b5f612308612ace565b90508060100183815481106123205761231f6149ba565b5b905f5260205f2090600502016040518060a00160405290815f8201548152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820180546123fa906146c9565b80601f0160208091040260200160405190810160405280929190818152602001828054612426906146c9565b80156124715780601f1061244857610100808354040283529160200191612471565b820191905f5260205f20905b81548152906001019060200180831161245457829003601f168201915b5050505050815260200160048201805461248a906146c9565b80601f01602080910402602001604051908101604052809291908181526020018280546124b6906146c9565b80156125015780601f106124d857610100808354040283529160200191612501565b820191905f5260205f20905b8154815290600101906020018083116124e457829003601f168201915b505050505081525050915050919050565b5f8061251c613007565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b61254f613713565b5f612558612ace565b9050806004015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060800160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201805461265d906146c9565b80601f0160208091040260200160405190810160405280929190818152602001828054612689906146c9565b80156126d45780601f106126ab576101008083540402835291602001916126d4565b820191905f5260205f20905b8154815290600101906020018083116126b757829003601f168201915b505050505081526020016003820180546126ed906146c9565b80601f0160208091040260200160405190810160405280929190818152602001828054612719906146c9565b80156127645780601f1061273b57610100808354040283529160200191612764565b820191905f5260205f20905b81548152906001019060200180831161274757829003601f168201915b505050505081525050915050919050565b5f8061277f612ace565b9050806002015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b6127dd6128d9565b6127e681612f63565b7f837e0a6528dadfa2dc792692c5182e52a9f5bbdeed7b2372927a26c695839613816040516128159190613b00565b60405180910390a150565b6128286128d9565b5f612831613007565b905081815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff166128936112e2565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b6128e1612ed6565b73ffffffffffffffffffffffffffffffffffffffff166128ff6112e2565b73ffffffffffffffffffffffffffffffffffffffff161461295e57612922612ed6565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016129559190613e08565b60405180910390fd5b565b5f612969612ace565b90505f816006018054905090505f83036129af576040517f3ee5077400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156129f65782816040517f0f69cbfc0000000000000000000000000000000000000000000000000000000081526004016129ed92919061529e565b60405180910390fd5b828260160181905550505050565b60605f6001612a128461302e565b0190505f8167ffffffffffffffff811115612a3057612a2f613c4a565b5b6040519080825280601f01601f191660200182016040528015612a625781602001600182028036833780820191505090505b5090505f82602001820190505b600115612ac3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612ab857612ab76152c5565b5b0494505f8503612a6f575b819350505050919050565b5f7f86d3070a8993f6b209bee6185186d38a07fce8bbd97c750d934451b72f35b400905090565b5f612afe612ace565b90505f816006018054905090505f8303612b44576040517fb1ae92ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115612b8b5782816040517f84208f23000000000000000000000000000000000000000000000000000000008152600401612b8292919061529e565b60405180910390fd5b828260080181905550505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480612c4657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612c2d61317f565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612c7d576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b612c876128d9565b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612cf257506040513d601f19601f82011682018060405250810190612cef919061531c565b60015b612d3357816040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401612d2a9190613e08565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114612d9957806040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600401612d909190613de0565b60405180910390fd5b612da383836131d2565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614612e2d576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f612e38613007565b9050805f015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055612e6882613244565b5050565b5f612e75612ace565b90505f81600601805490509050808310612ec85782816040517f907e6681000000000000000000000000000000000000000000000000000000008152600401612ebf92919061529e565b60405180910390fd5b828260070181905550505050565b5f33905090565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f612f0d612f28565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b612f57613315565b612f6081613355565b50565b5f612f6c612ace565b90505f816006018054905090505f8303612fb2576040517fe60a727100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115612ff95782816040517fd2535e11000000000000000000000000000000000000000000000000000000008152600401612ff092919061529e565b60405180910390fd5b828260090181905550505050565b5f7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00905090565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061308a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816130805761307f6152c5565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106130c7576d04ee2d6d415b85acef810000000083816130bd576130bc6152c5565b5b0492506020810190505b662386f26fc1000083106130f657662386f26fc1000083816130ec576130eb6152c5565b5b0492506010810190505b6305f5e100831061311f576305f5e1008381613115576131146152c5565b5b0492506008810190505b612710831061314457612710838161313a576131396152c5565b5b0492506004810190505b60648310613167576064838161315d5761315c6152c5565b5b0492506002810190505b600a8310613176576001810190505b80915050919050565b5f6131ab7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6133d9565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6131db826133e2565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156132375761323182826134ab565b50613240565b61323f61352b565b5b5050565b5f61324d612edd565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b61331d613567565b613353576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61335d613315565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036133cd575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016133c49190613e08565b60405180910390fd5b6133d681612e2f565b50565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361343d57806040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016134349190613e08565b60405180910390fd5b806134697f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6133d9565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040516134d49190615381565b5f60405180830381855af49150503d805f811461350c576040519150601f19603f3d011682016040523d82523d5f602084013e613511565b606091505b5091509150613521858383613585565b9250505092915050565b5f341115613565576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f613570612f28565b5f0160089054906101000a900460ff16905090565b60608261359a5761359582613612565b61360a565b5f82511480156135c057505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561360257836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016135f99190613e08565b60405180910390fd5b81905061360b565b5b9392505050565b5f815111156136245780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806040016040528060608152602001606081525090565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060a001604052805f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081525090565b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61378881613776565b8114613792575f80fd5b50565b5f813590506137a38161377f565b92915050565b5f602082840312156137be576137bd61376e565b5b5f6137cb84828501613795565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561380b5780820151818401526020810190506137f0565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613830826137d4565b61383a81856137de565b935061384a8185602086016137ee565b61385381613816565b840191505092915050565b5f6020820190508181035f8301526138768184613826565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6138a78261387e565b9050919050565b6138b78161389d565b81146138c1575f80fd5b50565b5f813590506138d2816138ae565b92915050565b5f602082840312156138ed576138ec61376e565b5b5f6138fa848285016138c4565b91505092915050565b5f8115159050919050565b61391781613903565b82525050565b5f6020820190506139305f83018461390e565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61396881613776565b82525050565b6139778161389d565b82525050565b5f82825260208201905092915050565b5f613997826137d4565b6139a1818561397d565b93506139b18185602086016137ee565b6139ba81613816565b840191505092915050565b5f60a083015f8301516139da5f86018261395f565b5060208301516139ed602086018261396e565b506040830151613a00604086018261396e565b5060608301518482036060860152613a18828261398d565b91505060808301518482036080860152613a32828261398d565b9150508091505092915050565b5f613a4a83836139c5565b905092915050565b5f602082019050919050565b5f613a6882613936565b613a728185613940565b935083602082028501613a8485613950565b805f5b85811015613abf5784840389528151613aa08582613a3f565b9450613aab83613a52565b925060208a01995050600181019050613a87565b50829750879550505050505092915050565b5f6020820190508181035f830152613ae98184613a5e565b905092915050565b613afa81613776565b82525050565b5f602082019050613b135f830184613af1565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f613b4d838361396e565b60208301905092915050565b5f602082019050919050565b5f613b6f82613b19565b613b798185613b23565b9350613b8483613b33565b805f5b83811015613bb4578151613b9b8882613b42565b9750613ba683613b59565b925050600181019050613b87565b5085935050505092915050565b5f6020820190508181035f830152613bd98184613b65565b905092915050565b5f604083015f8301518482035f860152613bfb828261398d565b91505060208301518482036020860152613c15828261398d565b9150508091505092915050565b5f6020820190508181035f830152613c3a8184613be1565b905092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613c8082613816565b810181811067ffffffffffffffff82111715613c9f57613c9e613c4a565b5b80604052505050565b5f613cb1613765565b9050613cbd8282613c77565b919050565b5f67ffffffffffffffff821115613cdc57613cdb613c4a565b5b613ce582613816565b9050602081019050919050565b828183375f83830152505050565b5f613d12613d0d84613cc2565b613ca8565b905082815260208101848484011115613d2e57613d2d613c46565b5b613d39848285613cf2565b509392505050565b5f82601f830112613d5557613d54613c42565b5b8135613d65848260208601613d00565b91505092915050565b5f8060408385031215613d8457613d8361376e565b5b5f613d91858286016138c4565b925050602083013567ffffffffffffffff811115613db257613db1613772565b5b613dbe85828601613d41565b9150509250929050565b5f819050919050565b613dda81613dc8565b82525050565b5f602082019050613df35f830184613dd1565b92915050565b613e028161389d565b82525050565b5f602082019050613e1b5f830184613df9565b92915050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115613e4357613e42613c4a565b5b613e4c82613816565b9050602081019050919050565b5f613e6b613e6684613e29565b613ca8565b905082815260208101848484011115613e8757613e86613c46565b5b613e92848285613cf2565b509392505050565b5f82601f830112613eae57613ead613c42565b5b8135613ebe848260208601613e59565b91505092915050565b5f60408284031215613edc57613edb613e21565b5b613ee66040613ca8565b90505f82013567ffffffffffffffff811115613f0557613f04613e25565b5b613f1184828501613e9a565b5f83015250602082013567ffffffffffffffff811115613f3457613f33613e25565b5b613f4084828501613e9a565b60208301525092915050565b5f67ffffffffffffffff821115613f6657613f65613c4a565b5b602082029050602081019050919050565b5f80fd5b5f60808284031215613f9057613f8f613e21565b5b613f9a6080613ca8565b90505f613fa9848285016138c4565b5f830152506020613fbc848285016138c4565b602083015250604082013567ffffffffffffffff811115613fe057613fdf613e25565b5b613fec84828501613e9a565b604083015250606082013567ffffffffffffffff8111156140105761400f613e25565b5b61401c84828501613e9a565b60608301525092915050565b5f61403a61403584613f4c565b613ca8565b9050808382526020820190506020840283018581111561405d5761405c613f77565b5b835b818110156140a457803567ffffffffffffffff81111561408257614081613c42565b5b80860161408f8982613f7b565b8552602085019450505060208101905061405f565b5050509392505050565b5f82601f8301126140c2576140c1613c42565b5b81356140d2848260208601614028565b91505092915050565b5f67ffffffffffffffff8211156140f5576140f4613c4a565b5b602082029050602081019050919050565b5f6060828403121561411b5761411a613e21565b5b6141256060613ca8565b90505f614134848285016138c4565b5f830152506020614147848285016138c4565b602083015250604082013567ffffffffffffffff81111561416b5761416a613e25565b5b61417784828501613d41565b60408301525092915050565b5f614195614190846140db565b613ca8565b905080838252602082019050602084028301858111156141b8576141b7613f77565b5b835b818110156141ff57803567ffffffffffffffff8111156141dd576141dc613c42565b5b8086016141ea8982614106565b855260208501945050506020810190506141ba565b5050509392505050565b5f82601f83011261421d5761421c613c42565b5b813561422d848260208601614183565b91505092915050565b5f805f805f805f60e0888a0312156142515761425061376e565b5b5f88013567ffffffffffffffff81111561426e5761426d613772565b5b61427a8a828b01613ec7565b975050602061428b8a828b01613795565b965050604061429c8a828b01613795565b95505060606142ad8a828b01613795565b94505060806142be8a828b01613795565b93505060a088013567ffffffffffffffff8111156142df576142de613772565b5b6142eb8a828b016140ae565b92505060c088013567ffffffffffffffff81111561430c5761430b613772565b5b6143188a828b01614209565b91505092959891949750929550565b5f80fd5b5f60a082840312156143405761433f614327565b5b81905092915050565b5f6020828403121561435e5761435d61376e565b5b5f82013567ffffffffffffffff81111561437b5761437a613772565b5b6143878482850161432b565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6143b482614390565b6143be818561439a565b93506143ce8185602086016137ee565b6143d781613816565b840191505092915050565b5f606083015f8301516143f75f86018261396e565b50602083015161440a602086018261396e565b506040830151848203604086015261442282826143aa565b9150508091505092915050565b5f6020820190508181035f83015261444781846143e2565b905092915050565b5f60a083015f8301516144645f86018261395f565b506020830151614477602086018261396e565b50604083015161448a604086018261396e565b50606083015184820360608601526144a2828261398d565b915050608083015184820360808601526144bc828261398d565b9150508091505092915050565b5f6020820190508181035f8301526144e1818461444f565b905092915050565b5f608083015f8301516144fe5f86018261396e565b506020830151614511602086018261396e565b5060408301518482036040860152614529828261398d565b91505060608301518482036060860152614543828261398d565b9150508091505092915050565b5f6020820190508181035f83015261456881846144e9565b905092915050565b5f81905092915050565b5f614584826137d4565b61458e8185614570565b935061459e8185602086016137ee565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f6145de600283614570565b91506145e9826145aa565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f614628600183614570565b9150614633826145f4565b600182019050919050565b5f614649828761457a565b9150614654826145d2565b9150614660828661457a565b915061466b8261461c565b9150614677828561457a565b91506146828261461c565b915061468e828461457a565b915081905095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806146e057607f821691505b6020821081036146f3576146f261469c565b5b50919050565b61470281613903565b811461470c575f80fd5b50565b5f8151905061471d816146f9565b92915050565b5f602082840312156147385761473761376e565b5b5f6147458482850161470f565b91505092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026147aa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261476f565b6147b4868361476f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6147ef6147ea6147e584613776565b6147cc565b613776565b9050919050565b5f819050919050565b614808836147d5565b61481c614814826147f6565b84845461477b565b825550505050565b5f90565b614830614824565b61483b8184846147ff565b505050565b5b8181101561485e576148535f82614828565b600181019050614841565b5050565b601f8211156148a3576148748161474e565b61487d84614760565b8101602085101561488c578190505b6148a061489885614760565b830182614840565b50505b505050565b5f82821c905092915050565b5f6148c35f19846008026148a8565b1980831691505092915050565b5f6148db83836148b4565b9150826002028217905092915050565b6148f4826137d4565b67ffffffffffffffff81111561490d5761490c613c4a565b5b61491782546146c9565b614922828285614862565b5f60209050601f831160018114614953575f8415614941578287015190505b61494b85826148d0565b8655506149b2565b601f1984166149618661474e565b5f5b8281101561498857848901518255600182019150602085019450602081019050614963565b868310156149a557848901516149a1601f8916826148b4565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050815f5260205f209050919050565b601f821115614a3a57614a0b816149e7565b614a1484614760565b81016020851015614a23578190505b614a37614a2f85614760565b830182614840565b50505b505050565b614a4882614390565b67ffffffffffffffff811115614a6157614a60613c4a565b5b614a6b82546146c9565b614a768282856149f9565b5f60209050601f831160018114614aa7575f8415614a95578287015190505b614a9f85826148d0565b865550614b06565b601f198416614ab5866149e7565b5f5b82811015614adc57848901518255600182019150602085019450602081019050614ab7565b86831015614af95784890151614af5601f8916826148b4565b8355505b6001600288020188555050505b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f608083015f830151614b4c5f86018261396e565b506020830151614b5f602086018261396e565b5060408301518482036040860152614b77828261398d565b91505060608301518482036060860152614b91828261398d565b9150508091505092915050565b5f614ba98383614b37565b905092915050565b5f602082019050919050565b5f614bc782614b0e565b614bd18185614b18565b935083602082028501614be385614b28565b805f5b85811015614c1e5784840389528151614bff8582614b9e565b9450614c0a83614bb1565b925060208a01995050600181019050614be6565b50829750879550505050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f606083015f830151614c6e5f86018261396e565b506020830151614c81602086018261396e565b5060408301518482036040860152614c9982826143aa565b9150508091505092915050565b5f614cb18383614c59565b905092915050565b5f602082019050919050565b5f614ccf82614c30565b614cd98185614c3a565b935083602082028501614ceb85614c4a565b805f5b85811015614d265784840389528151614d078582614ca6565b9450614d1283614cb9565b925060208a01995050600181019050614cee565b50829750879550505050505092915050565b5f6080820190508181035f830152614d508187613be1565b9050614d5f6020830186613af1565b8181036040830152614d718185614bbd565b90508181036060830152614d858184614cc5565b905095945050505050565b5f67ffffffffffffffff82169050919050565b614dac81614d90565b82525050565b5f602082019050614dc55f830184614da3565b92915050565b5f8135614dd78161377f565b80915050919050565b5f815f1b9050919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614e1684614de0565b9350801983169250808416831791505092915050565b614e35826147d5565b614e48614e41826147f6565b8354614deb565b8255505050565b5f8135614e5b816138ae565b80915050919050565b5f73ffffffffffffffffffffffffffffffffffffffff614e8384614de0565b9350801983169250808416831791505092915050565b5f614eb3614eae614ea98461387e565b6147cc565b61387e565b9050919050565b5f614ec482614e99565b9050919050565b5f614ed582614eba565b9050919050565b5f819050919050565b614eee82614ecb565b614f01614efa82614edc565b8354614e64565b8255505050565b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112614f3057614f2f614f08565b5b80840192508235915067ffffffffffffffff821115614f5257614f51614f0c565b5b602083019250600182023603831315614f6e57614f6d614f10565b5b509250929050565b5f82905092915050565b614f8a8383614f76565b67ffffffffffffffff811115614fa357614fa2613c4a565b5b614fad82546146c9565b614fb8828285614862565b5f601f831160018114614fe5575f8415614fd3578287013590505b614fdd85826148d0565b865550615044565b601f198416614ff38661474e565b5f5b8281101561501a57848901358255600182019150602085019450602081019050614ff5565b868310156150375784890135615033601f8916826148b4565b8355505b6001600288020188555050505b50505050505050565b615058838383614f80565b505050565b5f81015f83018061506d81614dcb565b90506150798184614e2c565b50505060018101602083018061508e81614e4f565b905061509a8184614ee5565b5050506002810160408301806150af81614e4f565b90506150bb8184614ee5565b50505060038101606083016150d08185614f14565b6150db81838661504d565b5050505060048101608083016150f18185614f14565b6150fc81838661504d565b505050505050565b61510e828261505d565b5050565b5f6151206020840184613795565b905092915050565b5f61513660208401846138c4565b905092915050565b5f80fd5b5f80fd5b5f80fd5b5f808335600160200384360303811261516657615165615146565b5b83810192508235915060208301925067ffffffffffffffff82111561518e5761518d61513e565b5b6001820236038313156151a4576151a3615142565b5b509250929050565b5f6151b7838561397d565b93506151c4838584613cf2565b6151cd83613816565b840190509392505050565b5f60a083016151e95f840184615112565b6151f55f86018261395f565b506152036020840184615128565b615210602086018261396e565b5061521e6040840184615128565b61522b604086018261396e565b50615239606084018461514a565b858303606087015261524c8382846151ac565b9250505061525d608084018461514a565b85830360808701526152708382846151ac565b925050508091505092915050565b5f6020820190508181035f83015261529681846151d8565b905092915050565b5f6040820190506152b15f830185613af1565b6152be6020830184613af1565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b6152fb81613dc8565b8114615305575f80fd5b50565b5f81519050615316816152f2565b92915050565b5f602082840312156153315761533061376e565b5b5f61533e84828501615308565b91505092915050565b5f81905092915050565b5f61535b82614390565b6153658185615347565b93506153758185602086016137ee565b80840191505092915050565b5f61538c8284615351565b91508190509291505056 /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\x80`@R`\x046\x10a\x02PW_5`\xE0\x1C\x80cy\xBAP\x97\x11a\x018W\x80c\xBF\xF3\xAA\xBA\x11a\0\xB5W\x80c\xE3\x0C9x\x11a\0yW\x80c\xE3\x0C9x\x14a\x08vW\x80c\xE3\xB2\xA8t\x14a\x08\xA0W\x80c\xE5'^\xAF\x14a\x08\xDCW\x80c\xEB\x84<\xF6\x14a\t\x18W\x80c\xEFi\x97\xF9\x14a\t@W\x80c\xF2\xFD\xE3\x8B\x14a\t|Wa\x02PV[\x80c\xBF\xF3\xAA\xBA\x14a\x07pW\x80c\xC2\xB4)\x86\x14a\x07\xACW\x80c\xC8\x0B3\xCA\x14a\x07\xD6W\x80c\xCBZ\xA7\xE9\x14a\x07\xFEW\x80c\xD1\x0F\x7F\xF9\x14a\x08:Wa\x02PV[\x80c\x91d\xD0\xAE\x11a\0\xFCW\x80c\x91d\xD0\xAE\x14a\x06\xB2W\x80c\x9AZ;\xC4\x14a\x06\xDCW\x80c\xAD<\xB1\xCC\x14a\x06\xF2W\x80c\xB4r+\xC4\x14a\x07\x1CW\x80c\xBA\x1F1\xD2\x14a\x07FWa\x02PV[\x80cy\xBAP\x97\x14a\x05\xE4W\x80c~\xAA\xC8\xF2\x14a\x05\xFAW\x80c\x88-}\xD3\x14a\x06$W\x80c\x8B\x8D\xD8v\x14a\x06`W\x80c\x8D\xA5\xCB[\x14a\x06\x88Wa\x02PV[\x80c.-:\x82\x11a\x01\xD1W\x80c[\xAC\xE7\xFF\x11a\x01\x95W\x80c[\xAC\xE7\xFF\x14a\x05\0W\x80cg\x99\xEFR\x14a\x05V[`@Qa\x07\xCD\x91\x90aC[V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x07\xE1W_\x80\xFD[Pa\x07\xFC`\x04\x806\x03\x81\x01\x90a\x07\xF7\x91\x90aLgV[a%UV[\0[4\x80\x15a\x08\tW_\x80\xFD[Pa\x08$`\x04\x806\x03\x81\x01\x90a\x08\x1F\x91\x90aABV[a'\x03V[`@Qa\x081\x91\x90aMMV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x08EW_\x80\xFD[Pa\x08``\x04\x806\x03\x81\x01\x90a\x08[\x91\x90a?`\x04\x806\x03\x81\x01\x90a\t9\x91\x90a?=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0F\xFF\x91\x90aP\xAEV[\x90P\x91\x90PV[a\x10\x0Ea=\x9EV[_a\x10\x17a2\x16V[\x90P\x80_\x01`@Q\x80`@\x01`@R\x90\x81_\x82\x01\x80Ta\x106\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x10b\x90aPTV[\x80\x15a\x10\xADW\x80`\x1F\x10a\x10\x84Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x10\xADV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x10\x90W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01\x80Ta\x10\xC6\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x10\xF2\x90aPTV[\x80\x15a\x11=W\x80`\x1F\x10a\x11\x14Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x11=V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x11 W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x90V[a\x11Ta2\xE1V[a\x11]\x82a3\xC7V[a\x11g\x82\x82a3\xD2V[PPV[_a\x11ta4\xF0V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[_\x80a\x11\xA6a2\x16V[\x90P\x80`\x14\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x80a\x12\x06a2\x16V[\x90P`\x01`\x02\x82`\r\x01\x80T\x90Pa\x12\x1E\x91\x90aQ3V[a\x12(\x91\x90aQcV[\x91PP\x90V[a\x126a0!V[a\x12?_a5wV[V[``_a\x12La2\x16V[\x90P\x80`\x05\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x12\xCFW` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x12\x86W[PPPPP\x91PP\x90V[a\x12\xE2a0!V[a\x12\xEB\x81a5\xB4V[\x7F5q\x17*I\xE7-w$\xBE8L\xDDY\xF4\xF2\x1A!lp5.\xA5\x9C\xB0%C\xFCv0\x847\x81`@Qa\x13\x1A\x91\x90aC[V[`@Q\x80\x91\x03\x90\xA1PV[a\x13-a0!V[s\xDE@\x91\t\xE0\xFC\xCA\xAE{\x87\xDEQ\x8Fa\xD6\x17\xA3\xFD\xA0\x94s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c?K\xA8:`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x13\x86W_\x80\xFD[PZ\xF1\x15\x80\x15a\x13\x98W=_\x80>=_\xFD[PPPPs\x81z(_\x1F\xCA;\xB4\x08L\xBF\xC7}K\xAB\xC28\xAD`\x9Cs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c?K\xA8:`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x13\xF5W_\x80\xFD[PZ\xF1\x15\x80\x15a\x14\x07W=_\x80>=_\xFD[PPPP\x7F\xBEOe]\xAA\xE0\xDB\xAE\xF6:kR\\\xAB/\xA6\xAC\xE4\xAA[\x94\xB8\x83K$\x117\xCD\xFEs\xA5\xB0`@Q`@Q\x80\x91\x03\x90\xA1V[_a\x14Ba6\x1EV[\x90P\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x14ca*\xBCV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x14\xBBW\x80`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14\xB2\x91\x90aL,V[`@Q\x80\x91\x03\x90\xFD[a\x14\xC4\x81a5wV[PV[``_a\x14\xD2a2\x16V[\x90P\x80`\x06\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x15UW` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x15\x0CW[PPPPP\x91PP\x90V[_\x80a\x15ja2\x16V[\x90P\x80`\x15\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[`\x01a\x15\xCAa6%V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x16\x0BW`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02_a\x16\x16a6IV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x16^WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x16\x95W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UPa\x16\xEAa\x16\xE5a!\xFDV[a6pV[_\x85Q\x03a\x17$W`@Q\x7F\x06\x8C\x8D@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x84Q\x03a\x17^W`@Q\x7F\x8A\xF0\x82\xEF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x83Q\x03a\x17\x98W`@Q\x7F\xCA\xD1\xD54\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a\x17\xA1a2\x16V[\x90P\x8A\x81_\x01_\x82\x01Q\x81_\x01\x90\x81a\x17\xBA\x91\x90aS3V[P` \x82\x01Q\x81`\x01\x01\x90\x81a\x17\xD0\x91\x90aS3V[P\x90PP_[\x86Q\x81\x10\x15a\x1B\x04W`\x01\x82`\x02\x01_\x89\x84\x81Q\x81\x10a\x17\xF9Wa\x17\xF8aT\x02V[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x86\x81\x81Q\x81\x10a\x18fWa\x18eaT\x02V[[` \x02` \x01\x01Q\x82`\x04\x01_\x89\x84\x81Q\x81\x10a\x18\x86Wa\x18\x85aT\x02V[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\x01\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x02\x01\x90\x81a\x19i\x91\x90aS3V[P``\x82\x01Q\x81`\x03\x01\x90\x81a\x19\x7F\x91\x90aS3V[P\x90PP\x81`\x05\x01\x87\x82\x81Q\x81\x10a\x19\x9AWa\x19\x99aT\x02V[[` \x02` \x01\x01Q_\x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x82`\x03\x01_\x89\x84\x81Q\x81\x10a\x1A\x1CWa\x1A\x1BaT\x02V[[` \x02` \x01\x01Q` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x06\x01\x87\x82\x81Q\x81\x10a\x1A\x8EWa\x1A\x8DaT\x02V[[` \x02` \x01\x01Q` \x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x80\x80`\x01\x01\x91PPa\x17\xD6V[Pa\x1B\x0E\x8Aa5\xB4V[a\x1B\x17\x89a2=V[a\x1B \x88a6\x84V[a\x1B)\x87a0\xA8V[_[\x85Q\x81\x10\x15a\x1ECW`\x01\x82`\n\x01_\x88\x84\x81Q\x81\x10a\x1BNWa\x1BMaT\x02V[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x85\x81\x81Q\x81\x10a\x1B\xBBWa\x1B\xBAaT\x02V[[` \x02` \x01\x01Q\x82`\x0C\x01_\x88\x84\x81Q\x81\x10a\x1B\xDBWa\x1B\xDAaT\x02V[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\x01\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x02\x01\x90\x81a\x1C\xBE\x91\x90aS3V[P\x90PP\x81`\r\x01\x86\x82\x81Q\x81\x10a\x1C\xD9Wa\x1C\xD8aT\x02V[[` \x02` \x01\x01Q_\x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x82`\x0B\x01_\x88\x84\x81Q\x81\x10a\x1D[Wa\x1DZaT\x02V[[` \x02` \x01\x01Q` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x0E\x01\x86\x82\x81Q\x81\x10a\x1D\xCDWa\x1D\xCCaT\x02V[[` \x02` \x01\x01Q` \x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x80\x80`\x01\x01\x91PPa\x1B+V[P_[\x84Q\x81\x10\x15a!^W\x84\x81\x81Q\x81\x10a\x1EbWa\x1EaaT\x02V[[` \x02` \x01\x01Q\x82`\x11\x01_\x87\x84\x81Q\x81\x10a\x1E\x82Wa\x1E\x81aT\x02V[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\x01\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x02\x01\x90\x81a\x1Fe\x91\x90aT\x87V[P\x90PP\x81`\x12\x01\x85\x82\x81Q\x81\x10a\x1F\x80Wa\x1F\x7FaT\x02V[[` \x02` \x01\x01Q_\x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x82`\x14\x01_\x87\x84\x81Q\x81\x10a \x02Wa \x01aT\x02V[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x13\x01\x85\x82\x81Q\x81\x10a sWa raT\x02V[[` \x02` \x01\x01Q` \x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x82`\x15\x01_\x87\x84\x81Q\x81\x10a \xF6Wa \xF5aT\x02V[[` \x02` \x01\x01Q` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x80\x80`\x01\x01\x91PPa\x1EFV[P\x7F:|T\xB1\x19]D\xA2\x88\xF9\xC3\xC9\xA0g\x9A\xED\x93%\x06\x8E\r\r[i\xE9`G5\\\xC7\x17E\x8B\x8B\x88\x88\x88`@Qa!\x96\x95\x94\x93\x92\x91\x90aX\x88V[`@Q\x80\x91\x03\x90\xA1P_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa!\xE9\x91\x90aY\x17V[`@Q\x80\x91\x03\x90\xA1PPPPPPPPPPV[_\x80a\"\x07a7(V[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x91PP\x90V[``_a\"=a2\x16V[\x90P\x80`\x0E\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\"\xC0W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\"wW[PPPPP\x91PP\x90V[a\"\xD43a\x0FrV[a#\x15W3`@Q\x7F j4n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a#\x0C\x91\x90aL,V[`@Q\x80\x91\x03\x90\xFD[s\xDE@\x91\t\xE0\xFC\xCA\xAE{\x87\xDEQ\x8Fa\xD6\x17\xA3\xFD\xA0\x94s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x84V\xCBY`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a#nW_\x80\xFD[PZ\xF1\x15\x80\x15a#\x80W=_\x80>=_\xFD[PPPPs\x81z(_\x1F\xCA;\xB4\x08L\xBF\xC7}K\xAB\xC28\xAD`\x9Cs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x84V\xCBY`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a#\xDDW_\x80\xFD[PZ\xF1\x15\x80\x15a#\xEFW=_\x80>=_\xFD[PPPP\x7F\x13\xDB\xE8\x822\x19\xE2&\xDD\x05%\xAE\xB0q\xE1\xD2g\x9F\x898+\xA7\x99\xF7\xF6D\x86~e\xB6\xF3\xA6`@Q`@Q\x80\x91\x03\x90\xA1V[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[_\x80a$da2\x16V[\x90P\x80`\x16\x01T\x91PP\x90V[``_a$|a2\x16V[\x90P\x80`\x13\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a$\xFFW` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a$\xB6W[PPPPP\x91PP\x90V[_\x80a%\x14a2\x16V[\x90P\x80`\x0F\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x80a%Ha2\x16V[\x90P\x80`\t\x01T\x91PP\x90V[a%]a0!V[_\x81_\x015\x03a%\x99W`@Q\x7F\"\xF7?\xEA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x015\x11\x15a%\xEEW\x80_\x015`@Q\x7FAx\xDEB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%\xE5\x91\x90aC[V[`@Q\x80\x91\x03\x90\xFD[_a%\xF7a2\x16V[\x90P\x80`\x0F\x01_\x83_\x015\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a&aW\x81_\x015`@Q\x7F\x96\xA5h(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a&X\x91\x90aC[V[`@Q\x80\x91\x03\x90\xFD[\x80`\x10\x01\x82\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x90`\x05\x02\x01_\x90\x91\x90\x91\x90\x91P\x81\x81a&\x98\x91\x90a\\iV[PP`\x01\x81`\x0F\x01_\x84_\x015\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7Ffv\x93A\xEF\xFD&\x8F\xC4\xE9\xA9\xC8\xF2{\xFC\x96\x85\x07\xB5\x19\xB0\xDD\xB9\xB4\xAD=\xED_\x03\x01h7\x82`@Qa&\xF7\x91\x90a]\xE3V[`@Q\x80\x91\x03\x90\xA1PPV[a'\x0Ba=\xB8V[_a'\x14a2\x16V[\x90P\x80`\x11\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ `@Q\x80``\x01`@R\x90\x81_\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01\x80Ta(\x19\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta(E\x90aPTV[\x80\x15a(\x90W\x80`\x1F\x10a(gWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a(\x90V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a(sW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[a(\xA9a>\x03V[_a(\xB2a2\x16V[\x90P\x80`\x10\x01\x83\x81T\x81\x10a(\xCAWa(\xC9aT\x02V[[\x90_R` _ \x90`\x05\x02\x01`@Q\x80`\xA0\x01`@R\x90\x81_\x82\x01T\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x03\x82\x01\x80Ta)\xA4\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta)\xD0\x90aPTV[\x80\x15a*\x1BW\x80`\x1F\x10a)\xF2Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a*\x1BV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a)\xFEW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x04\x82\x01\x80Ta*4\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta*`\x90aPTV[\x80\x15a*\xABW\x80`\x1F\x10a*\x82Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a*\xABV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a*\x8EW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[_\x80a*\xC6a7OV[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x91PP\x90V[a*\xF9a>[V[_a+\x02a2\x16V[\x90P\x80`\x04\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ `@Q\x80`\x80\x01`@R\x90\x81_\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01\x80Ta,\x07\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta,3\x90aPTV[\x80\x15a,~W\x80`\x1F\x10a,UWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a,~V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a,aW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x03\x82\x01\x80Ta,\x97\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta,\xC3\x90aPTV[\x80\x15a-\x0EW\x80`\x1F\x10a,\xE5Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a-\x0EV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a,\xF1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[_\x80a-)a2\x16V[\x90P\x80`\x02\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[a-\x87a0!V[a-\x90\x81a6\x84V[\x7F\x83~\ne(\xDA\xDF\xA2\xDCy&\x92\xC5\x18.R\xA9\xF5\xBB\xDE\xED{#r\x92z&\xC6\x95\x83\x96\x13\x81`@Qa-\xBF\x91\x90aC[V[`@Q\x80\x91\x03\x90\xA1PV[a-\xD2a>\xADV[_a-\xDBa2\x16V[\x90P\x80`\x0C\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ `@Q\x80``\x01`@R\x90\x81_\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01\x80Ta.\xE0\x90aPTV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta/\x0C\x90aPTV[\x80\x15a/WW\x80`\x1F\x10a/.Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a/WV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a/:W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[a/pa0!V[_a/ya7OV[\x90P\x81\x81_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a/\xDBa!\xFDV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F8\xD1k\x8C\xAC\"\xD9\x9F\xC7\xC1$\xB9\xCD\r\xE2\xD3\xFA\x1F\xAE\xF4 \xBF\xE7\x91\xD8\xC3b\xD7e\xE2'\0`@Q`@Q\x80\x91\x03\x90\xA3PPV[a0)a6\x1EV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a0Ga!\xFDV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a0\xA6Wa0ja6\x1EV[`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a0\x9D\x91\x90aL,V[`@Q\x80\x91\x03\x90\xFD[V[_a0\xB1a2\x16V[\x90P_\x81`\x06\x01\x80T\x90P\x90P_\x83\x03a0\xF7W`@Q\x7F>\xE5\x07t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x83\x11\x15a1>W\x82\x81`@Q\x7F\x0Fi\xCB\xFC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a15\x92\x91\x90a^\x03V[`@Q\x80\x91\x03\x90\xFD[\x82\x82`\x16\x01\x81\x90UPPPPV[``_`\x01a1Z\x84a7vV[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a1xWa1waC\xDDV[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a1\xAAW\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a2\x0BW\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a2\0Wa1\xFFaP\xD9V[[\x04\x94P_\x85\x03a1\xB7W[\x81\x93PPPP\x91\x90PV[_\x7F\x86\xD3\x07\n\x89\x93\xF6\xB2\t\xBE\xE6\x18Q\x86\xD3\x8A\x07\xFC\xE8\xBB\xD9|u\r\x93DQ\xB7/5\xB4\0\x90P\x90V[_a2Fa2\x16V[\x90P_\x81`\x06\x01\x80T\x90P\x90P_\x83\x03a2\x8CW`@Q\x7F\xB1\xAE\x92\xEA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x83\x11\x15a2\xD3W\x82\x81`@Q\x7F\x84 \x8F#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a2\xCA\x92\x91\x90a^\x03V[`@Q\x80\x91\x03\x90\xFD[\x82\x82`\x08\x01\x81\x90UPPPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a3\x8EWP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a3ua8\xC7V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a3\xC5W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a3\xCFa0!V[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a4:WP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a47\x91\x90a^TV[`\x01[a4{W\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a4r\x91\x90aL,V[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a4\xE1W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a4\xD8\x91\x90aEsV[`@Q\x80\x91\x03\x90\xFD[a4\xEB\x83\x83a9\x1AV[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a5uW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_a5\x80a7OV[\x90P\x80_\x01_a\x01\0\n\x81T\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90Ua5\xB0\x82a9\x8CV[PPV[_a5\xBDa2\x16V[\x90P_\x81`\x06\x01\x80T\x90P\x90P\x80\x83\x10a6\x10W\x82\x81`@Q\x7F\x90~f\x81\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a6\x07\x92\x91\x90a^\x03V[`@Q\x80\x91\x03\x90\xFD[\x82\x82`\x07\x01\x81\x90UPPPPV[_3\x90P\x90V[_a6.a6IV[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[a6xa:]V[a6\x81\x81a:\x9DV[PV[_a6\x8Da2\x16V[\x90P_\x81`\x06\x01\x80T\x90P\x90P_\x83\x03a6\xD3W`@Q\x7F\xE6\nrq\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x83\x11\x15a7\x1AW\x82\x81`@Q\x7F\xD2S^\x11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a7\x11\x92\x91\x90a^\x03V[`@Q\x80\x91\x03\x90\xFD[\x82\x82`\t\x01\x81\x90UPPPPV[_\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90P\x90V[_\x7F#~\x15\x82\"\xE3\xE6\x96\x8Br\xB9\xDB\r\x80C\xAA\xCF\x07J\xD9\xF6P\xF0\xD1`kM\x82\xEEC,\0\x90P\x90V[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a7\xD2Wz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a7\xC8Wa7\xC7aP\xD9V[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a8\x0FWm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a8\x05Wa8\x04aP\xD9V[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a8>Wf#\x86\xF2o\xC1\0\0\x83\x81a84Wa83aP\xD9V[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a8gWc\x05\xF5\xE1\0\x83\x81a8]Wa8\\aP\xD9V[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a8\x8CWa'\x10\x83\x81a8\x82Wa8\x81aP\xD9V[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a8\xAFW`d\x83\x81a8\xA5Wa8\xA4aP\xD9V[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a8\xBEW`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a8\xF3\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba;!V[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a9#\x82a;*V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a9\x7FWa9y\x82\x82a;\xF3V[Pa9\x88V[a9\x87a v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba;!V[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa<\x1C\x91\x90a^\xB9V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14aa\xF8V[\x90PaDP\x82\x82aD\nV[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aDoWaDnaC\xDDV[[aDx\x82a?\xA9V[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_aD\xA5aD\xA0\x84aDUV[aD;V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15aD\xC1WaD\xC0aC\xD9V[[aD\xCC\x84\x82\x85aD\x85V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aD\xE8WaD\xE7aC\xD5V[[\x815aD\xF8\x84\x82` \x86\x01aD\x93V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15aE\x17WaE\x16a?\x01V[[_aE$\x85\x82\x86\x01aA.V[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aEEWaEDa?\x05V[[aEQ\x85\x82\x86\x01aD\xD4V[\x91PP\x92P\x92\x90PV[_\x81\x90P\x91\x90PV[aEm\x81aE[V[\x82RPPV[_` \x82\x01\x90PaE\x86_\x83\x01\x84aEdV[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aE\xAEWaE\xADaC\xDDV[[aE\xB7\x82a?\xA9V[\x90P` \x81\x01\x90P\x91\x90PV[_aE\xD6aE\xD1\x84aE\x94V[aD;V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15aE\xF2WaE\xF1aC\xD9V[[aE\xFD\x84\x82\x85aD\x85V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aF\x19WaF\x18aC\xD5V[[\x815aF)\x84\x82` \x86\x01aE\xC4V[\x91PP\x92\x91PPV[_`@\x82\x84\x03\x12\x15aFGWaFFaE\x8CV[[aFQ`@aD;V[\x90P_\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aFpWaFoaE\x90V[[aF|\x84\x82\x85\x01aF\x05V[_\x83\x01RP` \x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aF\x9FWaF\x9EaE\x90V[[aF\xAB\x84\x82\x85\x01aF\x05V[` \x83\x01RP\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aF\xD1WaF\xD0aC\xDDV[[` \x82\x02\x90P` \x81\x01\x90P\x91\x90PV[_\x80\xFD[_`\x80\x82\x84\x03\x12\x15aF\xFBWaF\xFAaE\x8CV[[aG\x05`\x80aD;V[\x90P_aG\x14\x84\x82\x85\x01aA.V[_\x83\x01RP` aG'\x84\x82\x85\x01aA.V[` \x83\x01RP`@\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aGKWaGJaE\x90V[[aGW\x84\x82\x85\x01aF\x05V[`@\x83\x01RP``\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aG{WaGzaE\x90V[[aG\x87\x84\x82\x85\x01aF\x05V[``\x83\x01RP\x92\x91PPV[_aG\xA5aG\xA0\x84aF\xB7V[aD;V[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15aG\xC8WaG\xC7aF\xE2V[[\x83[\x81\x81\x10\x15aH\x0FW\x805g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aG\xEDWaG\xECaC\xD5V[[\x80\x86\x01aG\xFA\x89\x82aF\xE6V[\x85R` \x85\x01\x94PPP` \x81\x01\x90PaG\xCAV[PPP\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aH-WaH,aC\xD5V[[\x815aH=\x84\x82` \x86\x01aG\x93V[\x91PP\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aH`WaH_aC\xDDV[[` \x82\x02\x90P` \x81\x01\x90P\x91\x90PV[_``\x82\x84\x03\x12\x15aH\x86WaH\x85aE\x8CV[[aH\x90``aD;V[\x90P_aH\x9F\x84\x82\x85\x01aA.V[_\x83\x01RP` aH\xB2\x84\x82\x85\x01aA.V[` \x83\x01RP`@\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aH\xD6WaH\xD5aE\x90V[[aH\xE2\x84\x82\x85\x01aF\x05V[`@\x83\x01RP\x92\x91PPV[_aI\0aH\xFB\x84aHFV[aD;V[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15aI#WaI\"aF\xE2V[[\x83[\x81\x81\x10\x15aIjW\x805g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aIHWaIGaC\xD5V[[\x80\x86\x01aIU\x89\x82aHqV[\x85R` \x85\x01\x94PPP` \x81\x01\x90PaI%V[PPP\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aI\x88WaI\x87aC\xD5V[[\x815aI\x98\x84\x82` \x86\x01aH\xEEV[\x91PP\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aI\xBBWaI\xBAaC\xDDV[[` \x82\x02\x90P` \x81\x01\x90P\x91\x90PV[_``\x82\x84\x03\x12\x15aI\xE1WaI\xE0aE\x8CV[[aI\xEB``aD;V[\x90P_aI\xFA\x84\x82\x85\x01aA.V[_\x83\x01RP` aJ\r\x84\x82\x85\x01aA.V[` \x83\x01RP`@\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ1WaJ0aE\x90V[[aJ=\x84\x82\x85\x01aD\xD4V[`@\x83\x01RP\x92\x91PPV[_aJ[aJV\x84aI\xA1V[aD;V[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15aJ~WaJ}aF\xE2V[[\x83[\x81\x81\x10\x15aJ\xC5W\x805g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aJ\xA3WaJ\xA2aC\xD5V[[\x80\x86\x01aJ\xB0\x89\x82aI\xCCV[\x85R` \x85\x01\x94PPP` \x81\x01\x90PaJ\x80V[PPP\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aJ\xE3WaJ\xE2aC\xD5V[[\x815aJ\xF3\x84\x82` \x86\x01aJIV[\x91PP\x92\x91PPV[_\x80_\x80_\x80_\x80a\x01\0\x89\x8B\x03\x12\x15aK\x19WaK\x18a?\x01V[[_\x89\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aK6WaK5a?\x05V[[aKB\x8B\x82\x8C\x01aF2V[\x98PP` aKS\x8B\x82\x8C\x01a?(V[\x97PP`@aKd\x8B\x82\x8C\x01a?(V[\x96PP``aKu\x8B\x82\x8C\x01a?(V[\x95PP`\x80aK\x86\x8B\x82\x8C\x01a?(V[\x94PP`\xA0\x89\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aK\xA7WaK\xA6a?\x05V[[aK\xB3\x8B\x82\x8C\x01aH\x19V[\x93PP`\xC0\x89\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aK\xD4WaK\xD3a?\x05V[[aK\xE0\x8B\x82\x8C\x01aItV[\x92PP`\xE0\x89\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aL\x01WaL\0a?\x05V[[aL\r\x8B\x82\x8C\x01aJ\xCFV[\x91PP\x92\x95\x98P\x92\x95\x98\x90\x93\x96PV[aL&\x81a@YV[\x82RPPV[_` \x82\x01\x90PaL?_\x83\x01\x84aL\x1DV[\x92\x91PPV[_\x80\xFD[_`\xA0\x82\x84\x03\x12\x15aL^WaL]aLEV[[\x81\x90P\x92\x91PPV[_` \x82\x84\x03\x12\x15aL|WaL{a?\x01V[[_\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aL\x99WaL\x98a?\x05V[[aL\xA5\x84\x82\x85\x01aLIV[\x91PP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aL\xD2\x82aL\xAEV[aL\xDC\x81\x85aL\xB8V[\x93PaL\xEC\x81\x85` \x86\x01a?\x81V[aL\xF5\x81a?\xA9V[\x84\x01\x91PP\x92\x91PPV[_``\x83\x01_\x83\x01QaM\x15_\x86\x01\x82a@jV[P` \x83\x01QaM(` \x86\x01\x82a@jV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaM@\x82\x82aL\xC8V[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaMe\x81\x84aM\0V[\x90P\x92\x91PPV[_`\xA0\x83\x01_\x83\x01QaM\x82_\x86\x01\x82aA\xC9V[P` \x83\x01QaM\x95` \x86\x01\x82a@jV[P`@\x83\x01QaM\xA8`@\x86\x01\x82a@jV[P``\x83\x01Q\x84\x82\x03``\x86\x01RaM\xC0\x82\x82aA\xE8V[\x91PP`\x80\x83\x01Q\x84\x82\x03`\x80\x86\x01RaM\xDA\x82\x82aA\xE8V[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaM\xFF\x81\x84aMmV[\x90P\x92\x91PPV[_`\x80\x83\x01_\x83\x01QaN\x1C_\x86\x01\x82a@jV[P` \x83\x01QaN/` \x86\x01\x82a@jV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaNG\x82\x82aA\xE8V[\x91PP``\x83\x01Q\x84\x82\x03``\x86\x01RaNa\x82\x82aA\xE8V[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaN\x86\x81\x84aN\x07V[\x90P\x92\x91PPV[_``\x83\x01_\x83\x01QaN\xA3_\x86\x01\x82a@jV[P` \x83\x01QaN\xB6` \x86\x01\x82a@jV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaN\xCE\x82\x82aA\xE8V[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaN\xF3\x81\x84aN\x8EV[\x90P\x92\x91PPV[_\x81\x90P\x92\x91PPV[_aO\x0F\x82a?gV[aO\x19\x81\x85aN\xFBV[\x93PaO)\x81\x85` \x86\x01a?\x81V[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aOi`\x02\x83aN\xFBV[\x91PaOt\x82aO5V[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aO\xB3`\x01\x83aN\xFBV[\x91PaO\xBE\x82aO\x7FV[`\x01\x82\x01\x90P\x91\x90PV[_aO\xD4\x82\x87aO\x05V[\x91PaO\xDF\x82aO]V[\x91PaO\xEB\x82\x86aO\x05V[\x91PaO\xF6\x82aO\xA7V[\x91PaP\x02\x82\x85aO\x05V[\x91PaP\r\x82aO\xA7V[\x91PaP\x19\x82\x84aO\x05V[\x91P\x81\x90P\x95\x94PPPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\"`\x04R`$_\xFD[_`\x02\x82\x04\x90P`\x01\x82\x16\x80aPkW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aP~WaP}aP'V[[P\x91\x90PV[aP\x8D\x81aAmV[\x81\x14aP\x97W_\x80\xFD[PV[_\x81Q\x90PaP\xA8\x81aP\x84V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aP\xC3WaP\xC2a?\x01V[[_aP\xD0\x84\x82\x85\x01aP\x9AV[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_aQ=\x82a?\tV[\x91PaQH\x83a?\tV[\x92P\x82aQXWaQWaP\xD9V[[\x82\x82\x04\x90P\x92\x91PPV[_aQm\x82a?\tV[\x91PaQx\x83a?\tV[\x92P\x82\x82\x01\x90P\x80\x82\x11\x15aQ\x90WaQ\x8FaQ\x06V[[\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_` `\x1F\x83\x01\x04\x90P\x91\x90PV[_\x82\x82\x1B\x90P\x92\x91PPV[_`\x08\x83\x02aQ\xF2\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82aQ\xB7V[aQ\xFC\x86\x83aQ\xB7V[\x95P\x80\x19\x84\x16\x93P\x80\x86\x16\x84\x17\x92PPP\x93\x92PPPV[_\x81\x90P\x91\x90PV[_aR7aR2aR-\x84a?\tV[aR\x14V[a?\tV[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[aRP\x83aR\x1DV[aRdaR\\\x82aR>V[\x84\x84TaQ\xC3V[\x82UPPPPV[_\x90V[aRxaRlV[aR\x83\x81\x84\x84aRGV[PPPV[[\x81\x81\x10\x15aR\xA6WaR\x9B_\x82aRpV[`\x01\x81\x01\x90PaR\x89V[PPV[`\x1F\x82\x11\x15aR\xEBWaR\xBC\x81aQ\x96V[aR\xC5\x84aQ\xA8V[\x81\x01` \x85\x10\x15aR\xD4W\x81\x90P[aR\xE8aR\xE0\x85aQ\xA8V[\x83\x01\x82aR\x88V[PP[PPPV[_\x82\x82\x1C\x90P\x92\x91PPV[_aS\x0B_\x19\x84`\x08\x02aR\xF0V[\x19\x80\x83\x16\x91PP\x92\x91PPV[_aS#\x83\x83aR\xFCV[\x91P\x82`\x02\x02\x82\x17\x90P\x92\x91PPV[aS<\x82a?gV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aSUWaSTaC\xDDV[[aS_\x82TaPTV[aSj\x82\x82\x85aR\xAAV[_` \x90P`\x1F\x83\x11`\x01\x81\x14aS\x9BW_\x84\x15aS\x89W\x82\x87\x01Q\x90P[aS\x93\x85\x82aS\x18V[\x86UPaS\xFAV[`\x1F\x19\x84\x16aS\xA9\x86aQ\x96V[_[\x82\x81\x10\x15aS\xD0W\x84\x89\x01Q\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90PaS\xABV[\x86\x83\x10\x15aS\xEDW\x84\x89\x01QaS\xE9`\x1F\x89\x16\x82aR\xFCV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`2`\x04R`$_\xFD[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[`\x1F\x82\x11\x15aT\x82WaTS\x81aT/V[aT\\\x84aQ\xA8V[\x81\x01` \x85\x10\x15aTkW\x81\x90P[aT\x7FaTw\x85aQ\xA8V[\x83\x01\x82aR\x88V[PP[PPPV[aT\x90\x82aL\xAEV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aT\xA9WaT\xA8aC\xDDV[[aT\xB3\x82TaPTV[aT\xBE\x82\x82\x85aTAV[_` \x90P`\x1F\x83\x11`\x01\x81\x14aT\xEFW_\x84\x15aT\xDDW\x82\x87\x01Q\x90P[aT\xE7\x85\x82aS\x18V[\x86UPaUNV[`\x1F\x19\x84\x16aT\xFD\x86aT/V[_[\x82\x81\x10\x15aU$W\x84\x89\x01Q\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90PaT\xFFV[\x86\x83\x10\x15aUAW\x84\x89\x01QaU=`\x1F\x89\x16\x82aR\xFCV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_`\x80\x83\x01_\x83\x01QaU\x94_\x86\x01\x82a@jV[P` \x83\x01QaU\xA7` \x86\x01\x82a@jV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaU\xBF\x82\x82aA\xE8V[\x91PP``\x83\x01Q\x84\x82\x03``\x86\x01RaU\xD9\x82\x82aA\xE8V[\x91PP\x80\x91PP\x92\x91PPV[_aU\xF1\x83\x83aU\x7FV[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aV\x0F\x82aUVV[aV\x19\x81\x85aU`V[\x93P\x83` \x82\x02\x85\x01aV+\x85aUpV[\x80_[\x85\x81\x10\x15aVfW\x84\x84\x03\x89R\x81QaVG\x85\x82aU\xE6V[\x94PaVR\x83aU\xF9V[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaV.V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_``\x83\x01_\x83\x01QaV\xB6_\x86\x01\x82a@jV[P` \x83\x01QaV\xC9` \x86\x01\x82a@jV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaV\xE1\x82\x82aA\xE8V[\x91PP\x80\x91PP\x92\x91PPV[_aV\xF9\x83\x83aV\xA1V[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aW\x17\x82aVxV[aW!\x81\x85aV\x82V[\x93P\x83` \x82\x02\x85\x01aW3\x85aV\x92V[\x80_[\x85\x81\x10\x15aWnW\x84\x84\x03\x89R\x81QaWO\x85\x82aV\xEEV[\x94PaWZ\x83aW\x01V[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaW6V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_``\x83\x01_\x83\x01QaW\xBE_\x86\x01\x82a@jV[P` \x83\x01QaW\xD1` \x86\x01\x82a@jV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaW\xE9\x82\x82aL\xC8V[\x91PP\x80\x91PP\x92\x91PPV[_aX\x01\x83\x83aW\xA9V[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aX\x1F\x82aW\x80V[aX)\x81\x85aW\x8AV[\x93P\x83` \x82\x02\x85\x01aX;\x85aW\x9AV[\x80_[\x85\x81\x10\x15aXvW\x84\x84\x03\x89R\x81QaXW\x85\x82aW\xF6V[\x94PaXb\x83aX\tV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90PaX>V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_`\xA0\x82\x01\x90P\x81\x81\x03_\x83\x01RaX\xA0\x81\x88aCtV[\x90PaX\xAF` \x83\x01\x87aCLV[\x81\x81\x03`@\x83\x01RaX\xC1\x81\x86aV\x05V[\x90P\x81\x81\x03``\x83\x01RaX\xD5\x81\x85aW\rV[\x90P\x81\x81\x03`\x80\x83\x01RaX\xE9\x81\x84aX\x15V[\x90P\x96\x95PPPPPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[aY\x11\x81aX\xF5V[\x82RPPV[_` \x82\x01\x90PaY*_\x83\x01\x84aY\x08V[\x92\x91PPV[_\x815aY<\x81a?\x12V[\x80\x91PP\x91\x90PV[_\x81_\x1B\x90P\x91\x90PV[_\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFFaY{\x84aYEV[\x93P\x80\x19\x83\x16\x92P\x80\x84\x16\x83\x17\x91PP\x92\x91PPV[aY\x9A\x82aR\x1DV[aY\xADaY\xA6\x82aR>V[\x83TaYPV[\x82UPPPV[_\x815aY\xC0\x81aA\x18V[\x80\x91PP\x91\x90PV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFFaY\xE8\x84aYEV[\x93P\x80\x19\x83\x16\x92P\x80\x84\x16\x83\x17\x91PP\x92\x91PPV[_aZ\x18aZ\x13aZ\x0E\x84a@:V[aR\x14V[a@:V[\x90P\x91\x90PV[_aZ)\x82aY\xFEV[\x90P\x91\x90PV[_aZ:\x82aZ\x1FV[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[aZS\x82aZ0V[aZfaZ_\x82aZAV[\x83TaY\xC9V[\x82UPPPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x835`\x01` \x03\x846\x03\x03\x81\x12aZ\x95WaZ\x94aZmV[[\x80\x84\x01\x92P\x825\x91Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aZ\xB7WaZ\xB6aZqV[[` \x83\x01\x92P`\x01\x82\x026\x03\x83\x13\x15aZ\xD3WaZ\xD2aZuV[[P\x92P\x92\x90PV[_\x82\x90P\x92\x91PPV[aZ\xEF\x83\x83aZ\xDBV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a[\x08Wa[\x07aC\xDDV[[a[\x12\x82TaPTV[a[\x1D\x82\x82\x85aR\xAAV[_`\x1F\x83\x11`\x01\x81\x14a[JW_\x84\x15a[8W\x82\x87\x015\x90P[a[B\x85\x82aS\x18V[\x86UPa[\xA9V[`\x1F\x19\x84\x16a[X\x86aQ\x96V[_[\x82\x81\x10\x15a[\x7FW\x84\x89\x015\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90Pa[ZV[\x86\x83\x10\x15a[\x9CW\x84\x89\x015a[\x98`\x1F\x89\x16\x82aR\xFCV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPPV[a[\xBD\x83\x83\x83aZ\xE5V[PPPV[_\x81\x01_\x83\x01\x80a[\xD2\x81aY0V[\x90Pa[\xDE\x81\x84aY\x91V[PPP`\x01\x81\x01` \x83\x01\x80a[\xF3\x81aY\xB4V[\x90Pa[\xFF\x81\x84aZJV[PPP`\x02\x81\x01`@\x83\x01\x80a\\\x14\x81aY\xB4V[\x90Pa\\ \x81\x84aZJV[PPP`\x03\x81\x01``\x83\x01a\\5\x81\x85aZyV[a\\@\x81\x83\x86a[\xB2V[PPPP`\x04\x81\x01`\x80\x83\x01a\\V\x81\x85aZyV[a\\a\x81\x83\x86a[\xB2V[PPPPPPV[a\\s\x82\x82a[\xC2V[PPV[_a\\\x85` \x84\x01\x84a?(V[\x90P\x92\x91PPV[_a\\\x9B` \x84\x01\x84aA.V[\x90P\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x835`\x01` \x03\x846\x03\x03\x81\x12a\\\xCBWa\\\xCAa\\\xABV[[\x83\x81\x01\x92P\x825\x91P` \x83\x01\x92Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\\\xF3Wa\\\xF2a\\\xA3V[[`\x01\x82\x026\x03\x83\x13\x15a]\tWa]\x08a\\\xA7V[[P\x92P\x92\x90PV[_a]\x1C\x83\x85aA\xD8V[\x93Pa])\x83\x85\x84aD\x85V[a]2\x83a?\xA9V[\x84\x01\x90P\x93\x92PPPV[_`\xA0\x83\x01a]N_\x84\x01\x84a\\wV[a]Z_\x86\x01\x82aA\xC9V[Pa]h` \x84\x01\x84a\\\x8DV[a]u` \x86\x01\x82a@jV[Pa]\x83`@\x84\x01\x84a\\\x8DV[a]\x90`@\x86\x01\x82a@jV[Pa]\x9E``\x84\x01\x84a\\\xAFV[\x85\x83\x03``\x87\x01Ra]\xB1\x83\x82\x84a]\x11V[\x92PPPa]\xC2`\x80\x84\x01\x84a\\\xAFV[\x85\x83\x03`\x80\x87\x01Ra]\xD5\x83\x82\x84a]\x11V[\x92PPP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra]\xFB\x81\x84a]=V[\x90P\x92\x91PPV[_`@\x82\x01\x90Pa^\x16_\x83\x01\x85aCLV[a^#` \x83\x01\x84aCLV[\x93\x92PPPV[a^3\x81aE[V[\x81\x14a^=W_\x80\xFD[PV[_\x81Q\x90Pa^N\x81a^*V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a^iWa^ha?\x01V[[_a^v\x84\x82\x85\x01a^@V[\x91PP\x92\x91PPV[_\x81\x90P\x92\x91PPV[_a^\x93\x82aL\xAEV[a^\x9D\x81\x85a^\x7FV[\x93Pa^\xAD\x81\x85` \x86\x01a?\x81V[\x80\x84\x01\x91PP\x92\x91PPV[_a^\xC4\x82\x84a^\x89V[\x91P\x81\x90P\x92\x91PPV", + b"`\x80`@R`\x046\x10a\x02\x19W_5`\xE0\x1C\x80c~\xAA\xC8\xF2\x11a\x01\"W\x80c\xC2\xB4)\x86\x11a\0\xAAW\x80c\xE3\x0C9x\x11a\0nW\x80c\xE3\x0C9x\x14a\x07_W\x80c\xE3\xB2\xA8t\x14a\x07\x89W\x80c\xE5'^\xAF\x14a\x07\xC5W\x80c\xEB\x84<\xF6\x14a\x08\x01W\x80c\xF2\xFD\xE3\x8B\x14a\x08)Wa\x02\x19V[\x80c\xC2\xB4)\x86\x14a\x06\x7FW\x80c\xC4\x11Xt\x14a\x06\xA9W\x80c\xC8\x0B3\xCA\x14a\x06\xBFW\x80c\xCBZ\xA7\xE9\x14a\x06\xE7W\x80c\xD1\x0F\x7F\xF9\x14a\x07#Wa\x02\x19V[\x80c\xAD<\xB1\xCC\x11a\0\xF1W\x80c\xAD<\xB1\xCC\x14a\x05\x9DW\x80c\xAE\xB1\xA2\x1C\x14a\x05\xC7W\x80c\xB4r+\xC4\x14a\x05\xEFW\x80c\xBA\x1F1\xD2\x14a\x06\x19W\x80c\xBF\xF3\xAA\xBA\x14a\x06CWa\x02\x19V[\x80c~\xAA\xC8\xF2\x14a\x04\xF7W\x80c\x88-}\xD3\x14a\x05!W\x80c\x8D\xA5\xCB[\x14a\x05]W\x80c\x9AZ;\xC4\x14a\x05\x87Wa\x02\x19V[\x80cH\x14La\x11a\x01\xA5W\x80cqP\x18\xA6\x11a\x01tW\x80cqP\x18\xA6\x14a\x04cW\x80ct \xF3\xD4\x14a\x04yW\x80cw-/\xE9\x14a\x04\xA3W\x80cy\x8BX\xA6\x14a\x04\xCBW\x80cy\xBAP\x97\x14a\x04\xE1Wa\x02\x19V[\x80cH\x14La\x14a\x03\xB7W\x80cO\x1E\xF2\x86\x14a\x03\xE1W\x80cR\xD1\x90-\x14a\x03\xFDW\x80c[\xAC\xE7\xFF\x14a\x04'Wa\x02\x19V[\x80c&\xCF]\xEF\x11a\x01\xECW\x80c&\xCF]\xEF\x14a\x02\xD5W\x80c*8\x89\x98\x14a\x02\xFFW\x80c*\x8B\x9D\xE9\x14a\x03)W\x80c.-:\x82\x14a\x03SW\x80cF\xFB\xF6\x8E\x14a\x03{Wa\x02\x19V[\x80c\x07$\xDD#\x14a\x02\x1DW\x80c\r\x8En,\x14a\x02EW\x80c =\x01\x14\x14a\x02oW\x80c%\x85\xBBe\x14a\x02\xABW[_\x80\xFD[4\x80\x15a\x02(W_\x80\xFD[Pa\x02C`\x04\x806\x03\x81\x01\x90a\x02>\x91\x90a7\xA9V[a\x08QV[\0[4\x80\x15a\x02PW_\x80\xFD[Pa\x02Ya\x08\x9CV[`@Qa\x02f\x91\x90a8^V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02zW_\x80\xFD[Pa\x02\x95`\x04\x806\x03\x81\x01\x90a\x02\x90\x91\x90a8\xD8V[a\t\x17V[`@Qa\x02\xA2\x91\x90a9\x1DV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xB6W_\x80\xFD[Pa\x02\xBFa\twV[`@Qa\x02\xCC\x91\x90a:\xD1V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xE0W_\x80\xFD[Pa\x02\xE9a\x0B\xB4V[`@Qa\x02\xF6\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03\nW_\x80\xFD[Pa\x03\x13a\x0B\xCBV[`@Qa\x03 \x91\x90a;\0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x034W_\x80\xFD[Pa\x03=a\x0B\xE2V[`@Qa\x03J\x91\x90a;\xC1V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03^W_\x80\xFD[Pa\x03y`\x04\x806\x03\x81\x01\x90a\x03t\x91\x90a7\xA9V[a\x0C{V[\0[4\x80\x15a\x03\x86W_\x80\xFD[Pa\x03\xA1`\x04\x806\x03\x81\x01\x90a\x03\x9C\x91\x90a8\xD8V[a\x0C\xC6V[`@Qa\x03\xAE\x91\x90a9\x1DV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03\xC2W_\x80\xFD[Pa\x03\xCBa\rZV[`@Qa\x03\xD8\x91\x90a<\"V[`@Q\x80\x91\x03\x90\xF3[a\x03\xFB`\x04\x806\x03\x81\x01\x90a\x03\xF6\x91\x90a=nV[a\x0E\xA0V[\0[4\x80\x15a\x04\x08W_\x80\xFD[Pa\x04\x11a\x0E\xBFV[`@Qa\x04\x1E\x91\x90a=\xE0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x042W_\x80\xFD[Pa\x04M`\x04\x806\x03\x81\x01\x90a\x04H\x91\x90a8\xD8V[a\x0E\xF0V[`@Qa\x04Z\x91\x90a9\x1DV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x04nW_\x80\xFD[Pa\x04wa\x0FPV[\0[4\x80\x15a\x04\x84W_\x80\xFD[Pa\x04\x8Da\x0FcV[`@Qa\x04\x9A\x91\x90a;\xC1V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x04\xAEW_\x80\xFD[Pa\x04\xC9`\x04\x806\x03\x81\x01\x90a\x04\xC4\x91\x90a7\xA9V[a\x0F\xFCV[\0[4\x80\x15a\x04\xD6W_\x80\xFD[Pa\x04\xDFa\x10GV[\0[4\x80\x15a\x04\xECW_\x80\xFD[Pa\x04\xF5a\x11[V[\0[4\x80\x15a\x05\x02W_\x80\xFD[Pa\x05\x0Ba\x11\xE9V[`@Qa\x05\x18\x91\x90a;\xC1V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x05,W_\x80\xFD[Pa\x05G`\x04\x806\x03\x81\x01\x90a\x05B\x91\x90a8\xD8V[a\x12\x82V[`@Qa\x05T\x91\x90a9\x1DV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x05hW_\x80\xFD[Pa\x05qa\x12\xE2V[`@Qa\x05~\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x05\x92W_\x80\xFD[Pa\x05\x9Ba\x13\x17V[\0[4\x80\x15a\x05\xA8W_\x80\xFD[Pa\x05\xB1a\x14mV[`@Qa\x05\xBE\x91\x90a8^V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x05\xD2W_\x80\xFD[Pa\x05\xED`\x04\x806\x03\x81\x01\x90a\x05\xE8\x91\x90aB6V[a\x14\xA6V[\0[4\x80\x15a\x05\xFAW_\x80\xFD[Pa\x06\x03a\x1D\x8BV[`@Qa\x06\x10\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x06$W_\x80\xFD[Pa\x06-a\x1D\xA2V[`@Qa\x06:\x91\x90a;\xC1V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x06NW_\x80\xFD[Pa\x06i`\x04\x806\x03\x81\x01\x90a\x06d\x91\x90a7\xA9V[a\x1E;V[`@Qa\x06v\x91\x90a9\x1DV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x06\x8AW_\x80\xFD[Pa\x06\x93a\x1EoV[`@Qa\x06\xA0\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x06\xB4W_\x80\xFD[Pa\x06\xBDa\x1E\x86V[\0[4\x80\x15a\x06\xCAW_\x80\xFD[Pa\x06\xE5`\x04\x806\x03\x81\x01\x90a\x06\xE0\x91\x90aCIV[a\x1F\xABV[\0[4\x80\x15a\x06\xF2W_\x80\xFD[Pa\x07\r`\x04\x806\x03\x81\x01\x90a\x07\x08\x91\x90a8\xD8V[a!YV[`@Qa\x07\x1A\x91\x90aD/V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x07.W_\x80\xFD[Pa\x07I`\x04\x806\x03\x81\x01\x90a\x07D\x91\x90a7\xA9V[a\"\xF7V[`@Qa\x07V\x91\x90aD\xC9V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x07jW_\x80\xFD[Pa\x07sa%\x12V[`@Qa\x07\x80\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x07\x94W_\x80\xFD[Pa\x07\xAF`\x04\x806\x03\x81\x01\x90a\x07\xAA\x91\x90a8\xD8V[a%GV[`@Qa\x07\xBC\x91\x90aEPV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x07\xD0W_\x80\xFD[Pa\x07\xEB`\x04\x806\x03\x81\x01\x90a\x07\xE6\x91\x90a8\xD8V[a'uV[`@Qa\x07\xF8\x91\x90a9\x1DV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x08\x0CW_\x80\xFD[Pa\x08'`\x04\x806\x03\x81\x01\x90a\x08\"\x91\x90a7\xA9V[a'\xD5V[\0[4\x80\x15a\x084W_\x80\xFD[Pa\x08O`\x04\x806\x03\x81\x01\x90a\x08J\x91\x90a8\xD8V[a( V[\0[a\x08Ya(\xD9V[a\x08b\x81a)`V[\x7F0\xC9\xB1\xD0\x04\xF5~\xAEV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x90V[_\x80a\t!a*\xCEV[\x90P\x80`\x03\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[``_a\t\x82a*\xCEV[\x90P\x80`\x10\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01_\x90[\x82\x82\x10\x15a\x0B\xAAW\x83\x82\x90_R` _ \x90`\x05\x02\x01`@Q\x80`\xA0\x01`@R\x90\x81_\x82\x01T\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x03\x82\x01\x80Ta\n\x8B\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\n\xB7\x90aF\xC9V[\x80\x15a\x0B\x02W\x80`\x1F\x10a\n\xD9Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x0B\x02V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\n\xE5W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x04\x82\x01\x80Ta\x0B\x1B\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x0BG\x90aF\xC9V[\x80\x15a\x0B\x92W\x80`\x1F\x10a\x0BiWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x0B\x92V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x0BuW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x81R` \x01\x90`\x01\x01\x90a\t\xA7V[PPPP\x91PP\x90V[_\x80a\x0B\xBEa*\xCEV[\x90P\x80`\x07\x01T\x91PP\x90V[_\x80a\x0B\xD5a*\xCEV[\x90P\x80`\x08\x01T\x91PP\x90V[``_a\x0B\xEDa*\xCEV[\x90P\x80`\x12\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x0CpW` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x0C'W[PPPPP\x91PP\x90V[a\x0C\x83a(\xD9V[a\x0C\x8C\x81a*\xF5V[\x7F\xE4\x18\x02\xAFrW)\xAD\xCB\x8C\x15\x1E)78\n%\xC6\x91Uu~:\xF5\xD3\x97\x9A\xDA\xB5\x03X\0\x81`@Qa\x0C\xBB\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xA1PV[_s\xC1\xD73\x11i\x90\xCE=\x9ET\xF9\xEC\xF4\x8A\x1C\xDDD\x1A\xF4\xF9s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cF\xFB\xF6\x8E\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\x14\x91\x90a>\x08V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r/W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\rS\x91\x90aG#V[\x90P\x91\x90PV[a\rba6VV[_a\rka*\xCEV[\x90P\x80_\x01`@Q\x80`@\x01`@R\x90\x81_\x82\x01\x80Ta\r\x8A\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\r\xB6\x90aF\xC9V[\x80\x15a\x0E\x01W\x80`\x1F\x10a\r\xD8Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x0E\x01V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\r\xE4W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01\x80Ta\x0E\x1A\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x0EF\x90aF\xC9V[\x80\x15a\x0E\x91W\x80`\x1F\x10a\x0EhWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x0E\x91V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x0EtW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x90V[a\x0E\xA8a+\x99V[a\x0E\xB1\x82a,\x7FV[a\x0E\xBB\x82\x82a,\x8AV[PPV[_a\x0E\xC8a-\xA8V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[_\x80a\x0E\xFAa*\xCEV[\x90P\x80`\x14\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[a\x0FXa(\xD9V[a\x0Fa_a./V[V[``_a\x0Fna*\xCEV[\x90P\x80`\x05\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x0F\xF1W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x0F\xA8W[PPPPP\x91PP\x90V[a\x10\x04a(\xD9V[a\x10\r\x81a.lV[\x7F5q\x17*I\xE7-w$\xBE8L\xDDY\xF4\xF2\x1A!lp5.\xA5\x9C\xB0%C\xFCv0\x847\x81`@Qa\x10<\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xA1PV[a\x10Oa(\xD9V[s\xDE@\x91\t\xE0\xFC\xCA\xAE{\x87\xDEQ\x8Fa\xD6\x17\xA3\xFD\xA0\x94s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c?K\xA8:`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x10\xA8W_\x80\xFD[PZ\xF1\x15\x80\x15a\x10\xBAW=_\x80>=_\xFD[PPPPs\x81z(_\x1F\xCA;\xB4\x08L\xBF\xC7}K\xAB\xC28\xAD`\x9Cs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c?K\xA8:`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x11\x17W_\x80\xFD[PZ\xF1\x15\x80\x15a\x11)W=_\x80>=_\xFD[PPPP\x7F\xBEOe]\xAA\xE0\xDB\xAE\xF6:kR\\\xAB/\xA6\xAC\xE4\xAA[\x94\xB8\x83K$\x117\xCD\xFEs\xA5\xB0`@Q`@Q\x80\x91\x03\x90\xA1V[_a\x11da.\xD6V[\x90P\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x11\x85a%\x12V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x11\xDDW\x80`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x11\xD4\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xFD[a\x11\xE6\x81a./V[PV[``_a\x11\xF4a*\xCEV[\x90P\x80`\x06\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x12wW` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x12.W[PPPPP\x91PP\x90V[_\x80a\x12\x8Ca*\xCEV[\x90P\x80`\x15\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x80a\x12\xECa.\xDDV[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x91PP\x90V[a\x13 3a\x0C\xC6V[a\x13aW3`@Q\x7F j4n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x13X\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xFD[s\xDE@\x91\t\xE0\xFC\xCA\xAE{\x87\xDEQ\x8Fa\xD6\x17\xA3\xFD\xA0\x94s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x84V\xCBY`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x13\xBAW_\x80\xFD[PZ\xF1\x15\x80\x15a\x13\xCCW=_\x80>=_\xFD[PPPPs\x81z(_\x1F\xCA;\xB4\x08L\xBF\xC7}K\xAB\xC28\xAD`\x9Cs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x84V\xCBY`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x14)W_\x80\xFD[PZ\xF1\x15\x80\x15a\x14;W=_\x80>=_\xFD[PPPP\x7F\x13\xDB\xE8\x822\x19\xE2&\xDD\x05%\xAE\xB0q\xE1\xD2g\x9F\x898+\xA7\x99\xF7\xF6D\x86~e\xB6\xF3\xA6`@Q`@Q\x80\x91\x03\x90\xA1V[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[`\x01a\x14\xB0a/\x04V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x14\xF1W`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03_a\x14\xFCa/(V[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x15DWP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x15{W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UPa\x15\xD0a\x15\xCBa\x12\xE2V[a/OV[_\x84Q\x03a\x16\nW`@Q\x7F\x06\x8C\x8D@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x83Q\x03a\x16DW`@Q\x7F\xCA\xD1\xD54\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a\x16Ma*\xCEV[\x90P\x89\x81_\x01_\x82\x01Q\x81_\x01\x90\x81a\x16f\x91\x90aH\xEBV[P` \x82\x01Q\x81`\x01\x01\x90\x81a\x16|\x91\x90aH\xEBV[P\x90PP_[\x85Q\x81\x10\x15a\x19\xB0W`\x01\x82`\x02\x01_\x88\x84\x81Q\x81\x10a\x16\xA5Wa\x16\xA4aI\xBAV[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x85\x81\x81Q\x81\x10a\x17\x12Wa\x17\x11aI\xBAV[[` \x02` \x01\x01Q\x82`\x04\x01_\x88\x84\x81Q\x81\x10a\x172Wa\x171aI\xBAV[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\x01\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x02\x01\x90\x81a\x18\x15\x91\x90aH\xEBV[P``\x82\x01Q\x81`\x03\x01\x90\x81a\x18+\x91\x90aH\xEBV[P\x90PP\x81`\x05\x01\x86\x82\x81Q\x81\x10a\x18FWa\x18EaI\xBAV[[` \x02` \x01\x01Q_\x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x82`\x03\x01_\x88\x84\x81Q\x81\x10a\x18\xC8Wa\x18\xC7aI\xBAV[[` \x02` \x01\x01Q` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x06\x01\x86\x82\x81Q\x81\x10a\x19:Wa\x199aI\xBAV[[` \x02` \x01\x01Q` \x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x80\x80`\x01\x01\x91PPa\x16\x82V[Pa\x19\xBA\x89a.lV[a\x19\xC3\x88a*\xF5V[a\x19\xCC\x87a/cV[a\x19\xD5\x86a)`V[_[\x84Q\x81\x10\x15a\x1C\xEFW\x84\x81\x81Q\x81\x10a\x19\xF3Wa\x19\xF2aI\xBAV[[` \x02` \x01\x01Q\x82`\x11\x01_\x87\x84\x81Q\x81\x10a\x1A\x13Wa\x1A\x12aI\xBAV[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\x01\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x02\x01\x90\x81a\x1A\xF6\x91\x90aJ?V[P\x90PP\x81`\x12\x01\x85\x82\x81Q\x81\x10a\x1B\x11Wa\x1B\x10aI\xBAV[[` \x02` \x01\x01Q_\x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x82`\x14\x01_\x87\x84\x81Q\x81\x10a\x1B\x93Wa\x1B\x92aI\xBAV[[` \x02` \x01\x01Q_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x13\x01\x85\x82\x81Q\x81\x10a\x1C\x04Wa\x1C\x03aI\xBAV[[` \x02` \x01\x01Q` \x01Q\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x82`\x15\x01_\x87\x84\x81Q\x81\x10a\x1C\x87Wa\x1C\x86aI\xBAV[[` \x02` \x01\x01Q` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x80\x80`\x01\x01\x91PPa\x19\xD7V[P\x7F\xABX\xAB\x93\x88\x92\xA1\x85]\t\xC7\xC19\x0C\xAB\xD4\xCA\x04\x05\xEA\xAB2,Z\x82W\x07p\xA7\x19\x82n\x8A\x8A\x87\x87`@Qa\x1D%\x94\x93\x92\x91\x90aM8V[`@Q\x80\x91\x03\x90\xA1P_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x1Dx\x91\x90aM\xB2V[`@Q\x80\x91\x03\x90\xA1PPPPPPPPPV[_\x80a\x1D\x95a*\xCEV[\x90P\x80`\x16\x01T\x91PP\x90V[``_a\x1D\xADa*\xCEV[\x90P\x80`\x13\x01\x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x1E0W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x1D\xE7W[PPPPP\x91PP\x90V[_\x80a\x1EEa*\xCEV[\x90P\x80`\x0F\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x80a\x1Eya*\xCEV[\x90P\x80`\t\x01T\x91PP\x90V[`\x03_a\x1E\x91a/(V[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x1E\xD9WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x1F\x10W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x1F\x9F\x91\x90aM\xB2V[`@Q\x80\x91\x03\x90\xA1PPV[a\x1F\xB3a(\xD9V[_\x81_\x015\x03a\x1F\xEFW`@Q\x7F\"\xF7?\xEA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x015\x11\x15a DW\x80_\x015`@Q\x7FAx\xDEB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a ;\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xFD[_a Ma*\xCEV[\x90P\x80`\x0F\x01_\x83_\x015\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a \xB7W\x81_\x015`@Q\x7F\x96\xA5h(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a \xAE\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xFD[\x80`\x10\x01\x82\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x90`\x05\x02\x01_\x90\x91\x90\x91\x90\x91P\x81\x81a \xEE\x91\x90aQ\x04V[PP`\x01\x81`\x0F\x01_\x84_\x015\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7Ffv\x93A\xEF\xFD&\x8F\xC4\xE9\xA9\xC8\xF2{\xFC\x96\x85\x07\xB5\x19\xB0\xDD\xB9\xB4\xAD=\xED_\x03\x01h7\x82`@Qa!M\x91\x90aR~V[`@Q\x80\x91\x03\x90\xA1PPV[a!aa6pV[_a!ja*\xCEV[\x90P\x80`\x11\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ `@Q\x80``\x01`@R\x90\x81_\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01\x80Ta\"o\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\"\x9B\x90aF\xC9V[\x80\x15a\"\xE6W\x80`\x1F\x10a\"\xBDWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\"\xE6V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\"\xC9W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[a\"\xFFa6\xBBV[_a#\x08a*\xCEV[\x90P\x80`\x10\x01\x83\x81T\x81\x10a# Wa#\x1FaI\xBAV[[\x90_R` _ \x90`\x05\x02\x01`@Q\x80`\xA0\x01`@R\x90\x81_\x82\x01T\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x03\x82\x01\x80Ta#\xFA\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta$&\x90aF\xC9V[\x80\x15a$qW\x80`\x1F\x10a$HWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a$qV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a$TW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x04\x82\x01\x80Ta$\x8A\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta$\xB6\x90aF\xC9V[\x80\x15a%\x01W\x80`\x1F\x10a$\xD8Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a%\x01V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a$\xE4W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[_\x80a%\x1Ca0\x07V[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x91PP\x90V[a%Oa7\x13V[_a%Xa*\xCEV[\x90P\x80`\x04\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ `@Q\x80`\x80\x01`@R\x90\x81_\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01\x80Ta&]\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta&\x89\x90aF\xC9V[\x80\x15a&\xD4W\x80`\x1F\x10a&\xABWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a&\xD4V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a&\xB7W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x03\x82\x01\x80Ta&\xED\x90aF\xC9V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta'\x19\x90aF\xC9V[\x80\x15a'dW\x80`\x1F\x10a';Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a'dV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a'GW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[_\x80a'\x7Fa*\xCEV[\x90P\x80`\x02\x01_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[a'\xDDa(\xD9V[a'\xE6\x81a/cV[\x7F\x83~\ne(\xDA\xDF\xA2\xDCy&\x92\xC5\x18.R\xA9\xF5\xBB\xDE\xED{#r\x92z&\xC6\x95\x83\x96\x13\x81`@Qa(\x15\x91\x90a;\0V[`@Q\x80\x91\x03\x90\xA1PV[a((a(\xD9V[_a(1a0\x07V[\x90P\x81\x81_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a(\x93a\x12\xE2V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F8\xD1k\x8C\xAC\"\xD9\x9F\xC7\xC1$\xB9\xCD\r\xE2\xD3\xFA\x1F\xAE\xF4 \xBF\xE7\x91\xD8\xC3b\xD7e\xE2'\0`@Q`@Q\x80\x91\x03\x90\xA3PPV[a(\xE1a.\xD6V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a(\xFFa\x12\xE2V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a)^Wa)\"a.\xD6V[`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a)U\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xFD[V[_a)ia*\xCEV[\x90P_\x81`\x06\x01\x80T\x90P\x90P_\x83\x03a)\xAFW`@Q\x7F>\xE5\x07t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x83\x11\x15a)\xF6W\x82\x81`@Q\x7F\x0Fi\xCB\xFC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a)\xED\x92\x91\x90aR\x9EV[`@Q\x80\x91\x03\x90\xFD[\x82\x82`\x16\x01\x81\x90UPPPPV[``_`\x01a*\x12\x84a0.V[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a*0Wa*/a\x08V[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a-\x99W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a-\x90\x91\x90a=\xE0V[`@Q\x80\x91\x03\x90\xFD[a-\xA3\x83\x83a1\xD2V[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a.-W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_a.8a0\x07V[\x90P\x80_\x01_a\x01\0\n\x81T\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90Ua.h\x82a2DV[PPV[_a.ua*\xCEV[\x90P_\x81`\x06\x01\x80T\x90P\x90P\x80\x83\x10a.\xC8W\x82\x81`@Q\x7F\x90~f\x81\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a.\xBF\x92\x91\x90aR\x9EV[`@Q\x80\x91\x03\x90\xFD[\x82\x82`\x07\x01\x81\x90UPPPPV[_3\x90P\x90V[_\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90P\x90V[_a/\ra/(V[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[a/Wa3\x15V[a/`\x81a3UV[PV[_a/la*\xCEV[\x90P_\x81`\x06\x01\x80T\x90P\x90P_\x83\x03a/\xB2W`@Q\x7F\xE6\nrq\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x83\x11\x15a/\xF9W\x82\x81`@Q\x7F\xD2S^\x11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a/\xF0\x92\x91\x90aR\x9EV[`@Q\x80\x91\x03\x90\xFD[\x82\x82`\t\x01\x81\x90UPPPPV[_\x7F#~\x15\x82\"\xE3\xE6\x96\x8Br\xB9\xDB\r\x80C\xAA\xCF\x07J\xD9\xF6P\xF0\xD1`kM\x82\xEEC,\0\x90P\x90V[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a0\x8AWz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a0\x80Wa0\x7FaR\xC5V[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a0\xC7Wm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a0\xBDWa0\xBCaR\xC5V[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a0\xF6Wf#\x86\xF2o\xC1\0\0\x83\x81a0\xECWa0\xEBaR\xC5V[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a1\x1FWc\x05\xF5\xE1\0\x83\x81a1\x15Wa1\x14aR\xC5V[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a1DWa'\x10\x83\x81a1:Wa19aR\xC5V[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a1gW`d\x83\x81a1]Wa1\\aR\xC5V[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a1vW`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a1\xAB\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba3\xD9V[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a1\xDB\x82a3\xE2V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a27Wa21\x82\x82a4\xABV[Pa2@V[a2?a5+V[[PPV[_a2Ma.\xDDV[\x90P_\x81_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x82\x82_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0`@Q`@Q\x80\x91\x03\x90\xA3PPPV[a3\x1Da5gV[a3SW`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a3]a3\x15V[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a3\xCDW_`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a3\xC4\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xFD[a3\xD6\x81a./V[PV[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a4=W\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a44\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xFD[\x80a4i\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba3\xD9V[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa4\xD4\x91\x90aS\x81V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a5\x0CW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a5\x11V[``\x91P[P\x91P\x91Pa5!\x85\x83\x83a5\x85V[\x92PPP\x92\x91PPV[_4\x11\x15a5eW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_a5pa/(V[_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x90P\x90V[``\x82a5\x9AWa5\x95\x82a6\x12V[a6\nV[_\x82Q\x14\x80\x15a5\xC0WP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a6\x02W\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a5\xF9\x91\x90a>\x08V[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa6\x0BV[[\x93\x92PPPV[_\x81Q\x11\x15a6$W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80`@\x01`@R\x80``\x81R` \x01``\x81RP\x90V[`@Q\x80``\x01`@R\x80_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01``\x81RP\x90V[`@Q\x80`\xA0\x01`@R\x80_\x81R` \x01_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01``\x81R` \x01``\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01``\x81R` \x01``\x81RP\x90V[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[a7\x88\x81a7vV[\x81\x14a7\x92W_\x80\xFD[PV[_\x815\x90Pa7\xA3\x81a7\x7FV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a7\xBEWa7\xBDa7nV[[_a7\xCB\x84\x82\x85\x01a7\x95V[\x91PP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a8\x0BW\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa7\xF0V[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a80\x82a7\xD4V[a8:\x81\x85a7\xDEV[\x93Pa8J\x81\x85` \x86\x01a7\xEEV[a8S\x81a8\x16V[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra8v\x81\x84a8&V[\x90P\x92\x91PPV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a8\xA7\x82a8~V[\x90P\x91\x90PV[a8\xB7\x81a8\x9DV[\x81\x14a8\xC1W_\x80\xFD[PV[_\x815\x90Pa8\xD2\x81a8\xAEV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a8\xEDWa8\xECa7nV[[_a8\xFA\x84\x82\x85\x01a8\xC4V[\x91PP\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[a9\x17\x81a9\x03V[\x82RPPV[_` \x82\x01\x90Pa90_\x83\x01\x84a9\x0EV[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a9h\x81a7vV[\x82RPPV[a9w\x81a8\x9DV[\x82RPPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_a9\x97\x82a7\xD4V[a9\xA1\x81\x85a9}V[\x93Pa9\xB1\x81\x85` \x86\x01a7\xEEV[a9\xBA\x81a8\x16V[\x84\x01\x91PP\x92\x91PPV[_`\xA0\x83\x01_\x83\x01Qa9\xDA_\x86\x01\x82a9_V[P` \x83\x01Qa9\xED` \x86\x01\x82a9nV[P`@\x83\x01Qa:\0`@\x86\x01\x82a9nV[P``\x83\x01Q\x84\x82\x03``\x86\x01Ra:\x18\x82\x82a9\x8DV[\x91PP`\x80\x83\x01Q\x84\x82\x03`\x80\x86\x01Ra:2\x82\x82a9\x8DV[\x91PP\x80\x91PP\x92\x91PPV[_a:J\x83\x83a9\xC5V[\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a:h\x82a96V[a:r\x81\x85a9@V[\x93P\x83` \x82\x02\x85\x01a:\x84\x85a9PV[\x80_[\x85\x81\x10\x15a:\xBFW\x84\x84\x03\x89R\x81Qa:\xA0\x85\x82a:?V[\x94Pa:\xAB\x83a:RV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90Pa:\x87V[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra:\xE9\x81\x84a:^V[\x90P\x92\x91PPV[a:\xFA\x81a7vV[\x82RPPV[_` \x82\x01\x90Pa;\x13_\x83\x01\x84a:\xF1V[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_a;M\x83\x83a9nV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a;o\x82a;\x19V[a;y\x81\x85a;#V[\x93Pa;\x84\x83a;3V[\x80_[\x83\x81\x10\x15a;\xB4W\x81Qa;\x9B\x88\x82a;BV[\x97Pa;\xA6\x83a;YV[\x92PP`\x01\x81\x01\x90Pa;\x87V[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra;\xD9\x81\x84a;eV[\x90P\x92\x91PPV[_`@\x83\x01_\x83\x01Q\x84\x82\x03_\x86\x01Ra;\xFB\x82\x82a9\x8DV[\x91PP` \x83\x01Q\x84\x82\x03` \x86\x01Ra<\x15\x82\x82a9\x8DV[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra<:\x81\x84a;\xE1V[\x90P\x92\x91PPV[_\x80\xFD[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a<\x80\x82a8\x16V[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a<\x9FWa<\x9Ea\x02\x81a8\x9DV[\x82RPPV[_` \x82\x01\x90Pa>\x1B_\x83\x01\x84a=\xF9V[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a>CWa>BaL\x82a8\x16V[\x90P` \x81\x01\x90P\x91\x90PV[_a>ka>f\x84a>)V[a<\xA8V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a>\x87Wa>\x86a\x92\x84\x82\x85a<\xF2V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a>\xAEWa>\xADa\xBE\x84\x82` \x86\x01a>YV[\x91PP\x92\x91PPV[_`@\x82\x84\x03\x12\x15a>\xDCWa>\xDBa>!V[[a>\xE6`@a<\xA8V[\x90P_\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a?\x05Wa?\x04a>%V[[a?\x11\x84\x82\x85\x01a>\x9AV[_\x83\x01RP` \x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a?4Wa?3a>%V[[a?@\x84\x82\x85\x01a>\x9AV[` \x83\x01RP\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a?fWa?ea!V[[a?\x9A`\x80a<\xA8V[\x90P_a?\xA9\x84\x82\x85\x01a8\xC4V[_\x83\x01RP` a?\xBC\x84\x82\x85\x01a8\xC4V[` \x83\x01RP`@\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a?\xE0Wa?\xDFa>%V[[a?\xEC\x84\x82\x85\x01a>\x9AV[`@\x83\x01RP``\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a@\x10Wa@\x0Fa>%V[[a@\x1C\x84\x82\x85\x01a>\x9AV[``\x83\x01RP\x92\x91PPV[_a@:a@5\x84a?LV[a<\xA8V[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15a@]Wa@\\a?wV[[\x83[\x81\x81\x10\x15a@\xA4W\x805g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a@\x82Wa@\x81a!V[[aA%``a<\xA8V[\x90P_aA4\x84\x82\x85\x01a8\xC4V[_\x83\x01RP` aAG\x84\x82\x85\x01a8\xC4V[` \x83\x01RP`@\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aAkWaAja>%V[[aAw\x84\x82\x85\x01a=AV[`@\x83\x01RP\x92\x91PPV[_aA\x95aA\x90\x84a@\xDBV[a<\xA8V[\x90P\x80\x83\x82R` \x82\x01\x90P` \x84\x02\x83\x01\x85\x81\x11\x15aA\xB8WaA\xB7a?wV[[\x83[\x81\x81\x10\x15aA\xFFW\x805g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aA\xDDWaA\xDCa\xC7V[\x97PP` aB\x8B\x8A\x82\x8B\x01a7\x95V[\x96PP`@aB\x9C\x8A\x82\x8B\x01a7\x95V[\x95PP``aB\xAD\x8A\x82\x8B\x01a7\x95V[\x94PP`\x80aB\xBE\x8A\x82\x8B\x01a7\x95V[\x93PP`\xA0\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aB\xDFWaB\xDEa7rV[[aB\xEB\x8A\x82\x8B\x01a@\xAEV[\x92PP`\xC0\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aC\x0CWaC\x0Ba7rV[[aC\x18\x8A\x82\x8B\x01aB\tV[\x91PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[_\x80\xFD[_`\xA0\x82\x84\x03\x12\x15aC@WaC?aC'V[[\x81\x90P\x92\x91PPV[_` \x82\x84\x03\x12\x15aC^WaC]a7nV[[_\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aC{WaCza7rV[[aC\x87\x84\x82\x85\x01aC+V[\x91PP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aC\xB4\x82aC\x90V[aC\xBE\x81\x85aC\x9AV[\x93PaC\xCE\x81\x85` \x86\x01a7\xEEV[aC\xD7\x81a8\x16V[\x84\x01\x91PP\x92\x91PPV[_``\x83\x01_\x83\x01QaC\xF7_\x86\x01\x82a9nV[P` \x83\x01QaD\n` \x86\x01\x82a9nV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaD\"\x82\x82aC\xAAV[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaDG\x81\x84aC\xE2V[\x90P\x92\x91PPV[_`\xA0\x83\x01_\x83\x01QaDd_\x86\x01\x82a9_V[P` \x83\x01QaDw` \x86\x01\x82a9nV[P`@\x83\x01QaD\x8A`@\x86\x01\x82a9nV[P``\x83\x01Q\x84\x82\x03``\x86\x01RaD\xA2\x82\x82a9\x8DV[\x91PP`\x80\x83\x01Q\x84\x82\x03`\x80\x86\x01RaD\xBC\x82\x82a9\x8DV[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaD\xE1\x81\x84aDOV[\x90P\x92\x91PPV[_`\x80\x83\x01_\x83\x01QaD\xFE_\x86\x01\x82a9nV[P` \x83\x01QaE\x11` \x86\x01\x82a9nV[P`@\x83\x01Q\x84\x82\x03`@\x86\x01RaE)\x82\x82a9\x8DV[\x91PP``\x83\x01Q\x84\x82\x03``\x86\x01RaEC\x82\x82a9\x8DV[\x91PP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaEh\x81\x84aD\xE9V[\x90P\x92\x91PPV[_\x81\x90P\x92\x91PPV[_aE\x84\x82a7\xD4V[aE\x8E\x81\x85aEpV[\x93PaE\x9E\x81\x85` \x86\x01a7\xEEV[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aE\xDE`\x02\x83aEpV[\x91PaE\xE9\x82aE\xAAV[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aF(`\x01\x83aEpV[\x91PaF3\x82aE\xF4V[`\x01\x82\x01\x90P\x91\x90PV[_aFI\x82\x87aEzV[\x91PaFT\x82aE\xD2V[\x91PaF`\x82\x86aEzV[\x91PaFk\x82aF\x1CV[\x91PaFw\x82\x85aEzV[\x91PaF\x82\x82aF\x1CV[\x91PaF\x8E\x82\x84aEzV[\x91P\x81\x90P\x95\x94PPPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\"`\x04R`$_\xFD[_`\x02\x82\x04\x90P`\x01\x82\x16\x80aF\xE0W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aF\xF3WaF\xF2aF\x9CV[[P\x91\x90PV[aG\x02\x81a9\x03V[\x81\x14aG\x0CW_\x80\xFD[PV[_\x81Q\x90PaG\x1D\x81aF\xF9V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aG8WaG7a7nV[[_aGE\x84\x82\x85\x01aG\x0FV[\x91PP\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_` `\x1F\x83\x01\x04\x90P\x91\x90PV[_\x82\x82\x1B\x90P\x92\x91PPV[_`\x08\x83\x02aG\xAA\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82aGoV[aG\xB4\x86\x83aGoV[\x95P\x80\x19\x84\x16\x93P\x80\x86\x16\x84\x17\x92PPP\x93\x92PPPV[_\x81\x90P\x91\x90PV[_aG\xEFaG\xEAaG\xE5\x84a7vV[aG\xCCV[a7vV[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[aH\x08\x83aG\xD5V[aH\x1CaH\x14\x82aG\xF6V[\x84\x84TaG{V[\x82UPPPPV[_\x90V[aH0aH$V[aH;\x81\x84\x84aG\xFFV[PPPV[[\x81\x81\x10\x15aH^WaHS_\x82aH(V[`\x01\x81\x01\x90PaHAV[PPV[`\x1F\x82\x11\x15aH\xA3WaHt\x81aGNV[aH}\x84aG`V[\x81\x01` \x85\x10\x15aH\x8CW\x81\x90P[aH\xA0aH\x98\x85aG`V[\x83\x01\x82aH@V[PP[PPPV[_\x82\x82\x1C\x90P\x92\x91PPV[_aH\xC3_\x19\x84`\x08\x02aH\xA8V[\x19\x80\x83\x16\x91PP\x92\x91PPV[_aH\xDB\x83\x83aH\xB4V[\x91P\x82`\x02\x02\x82\x17\x90P\x92\x91PPV[aH\xF4\x82a7\xD4V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aI\rWaI\x0CaV[[`\x01\x82\x026\x03\x83\x13\x15aQ\xA4WaQ\xA3aQBV[[P\x92P\x92\x90PV[_aQ\xB7\x83\x85a9}V[\x93PaQ\xC4\x83\x85\x84a<\xF2V[aQ\xCD\x83a8\x16V[\x84\x01\x90P\x93\x92PPPV[_`\xA0\x83\x01aQ\xE9_\x84\x01\x84aQ\x12V[aQ\xF5_\x86\x01\x82a9_V[PaR\x03` \x84\x01\x84aQ(V[aR\x10` \x86\x01\x82a9nV[PaR\x1E`@\x84\x01\x84aQ(V[aR+`@\x86\x01\x82a9nV[PaR9``\x84\x01\x84aQJV[\x85\x83\x03``\x87\x01RaRL\x83\x82\x84aQ\xACV[\x92PPPaR]`\x80\x84\x01\x84aQJV[\x85\x83\x03`\x80\x87\x01RaRp\x83\x82\x84aQ\xACV[\x92PPP\x80\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaR\x96\x81\x84aQ\xD8V[\x90P\x92\x91PPV[_`@\x82\x01\x90PaR\xB1_\x83\x01\x85a:\xF1V[aR\xBE` \x83\x01\x84a:\xF1V[\x93\x92PPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[aR\xFB\x81a=\xC8V[\x81\x14aS\x05W_\x80\xFD[PV[_\x81Q\x90PaS\x16\x81aR\xF2V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aS1WaS0a7nV[[_aS>\x84\x82\x85\x01aS\x08V[\x91PP\x92\x91PPV[_\x81\x90P\x92\x91PPV[_aS[\x82aC\x90V[aSe\x81\x85aSGV[\x93PaSu\x81\x85` \x86\x01a7\xEEV[\x80\x84\x01\x91PP\x92\x91PPV[_aS\x8C\x82\x84aSQV[\x91P\x81\x90P\x92\x91PPV", ); #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] /**```solidity -struct Coprocessor { address txSenderAddress; address signerAddress; string s3BucketUrl; } +struct Custodian { address txSenderAddress; address signerAddress; bytes encryptionKey; } ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct Coprocessor { + pub struct Custodian { #[allow(missing_docs)] pub txSenderAddress: alloy::sol_types::private::Address, #[allow(missing_docs)] pub signerAddress: alloy::sol_types::private::Address, #[allow(missing_docs)] - pub s3BucketUrl: alloy::sol_types::private::String, + pub encryptionKey: alloy::sol_types::private::Bytes, } #[allow( non_camel_case_types, @@ -1525,13 +1358,13 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu type UnderlyingSolTuple<'a> = ( alloy::sol_types::sol_data::Address, alloy::sol_types::sol_data::Address, - alloy::sol_types::sol_data::String, + alloy::sol_types::sol_data::Bytes, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( alloy::sol_types::private::Address, alloy::sol_types::private::Address, - alloy::sol_types::private::String, + alloy::sol_types::private::Bytes, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -1546,28 +1379,28 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: Coprocessor) -> Self { - (value.txSenderAddress, value.signerAddress, value.s3BucketUrl) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: Custodian) -> Self { + (value.txSenderAddress, value.signerAddress, value.encryptionKey) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for Coprocessor { + impl ::core::convert::From> for Custodian { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { txSenderAddress: tuple.0, signerAddress: tuple.1, - s3BucketUrl: tuple.2, + encryptionKey: tuple.2, } } } #[automatically_derived] - impl alloy_sol_types::SolValue for Coprocessor { + impl alloy_sol_types::SolValue for Custodian { type SolType = Self; } #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for Coprocessor { + impl alloy_sol_types::private::SolTypeValue for Custodian { #[inline] fn stv_to_tokens(&self) -> ::Token<'_> { ( @@ -1577,8 +1410,8 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu ::tokenize( &self.signerAddress, ), - ::tokenize( - &self.s3BucketUrl, + ::tokenize( + &self.encryptionKey, ), ) } @@ -1624,7 +1457,7 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu } } #[automatically_derived] - impl alloy_sol_types::SolType for Coprocessor { + impl alloy_sol_types::SolType for Custodian { type RustType = Self; type Token<'a> = alloy_sol_types::private::Cow<'static, str> { alloy_sol_types::private::Cow::Borrowed( - "Coprocessor(address txSenderAddress,address signerAddress,string s3BucketUrl)", + "Custodian(address txSenderAddress,address signerAddress,bytes encryptionKey)", ) } #[inline] @@ -1678,8 +1511,8 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu &self.signerAddress, ) .0, - ::eip712_data_word( - &self.s3BucketUrl, + ::eip712_data_word( + &self.encryptionKey, ) .0, ] @@ -1687,7 +1520,7 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu } } #[automatically_derived] - impl alloy_sol_types::EventTopic for Coprocessor { + impl alloy_sol_types::EventTopic for Custodian { #[inline] fn topic_preimage_length(rust: &Self::RustType) -> usize { 0usize @@ -1697,8 +1530,8 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu + ::topic_preimage_length( &rust.signerAddress, ) - + ::topic_preimage_length( - &rust.s3BucketUrl, + + ::topic_preimage_length( + &rust.encryptionKey, ) } #[inline] @@ -1717,8 +1550,8 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu &rust.signerAddress, out, ); - ::encode_topic_preimage( - &rust.s3BucketUrl, + ::encode_topic_preimage( + &rust.encryptionKey, out, ); } @@ -1740,17 +1573,21 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] /**```solidity -struct Custodian { address txSenderAddress; address signerAddress; bytes encryptionKey; } +struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAddress; string name; string website; } ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct Custodian { + pub struct HostChain { #[allow(missing_docs)] - pub txSenderAddress: alloy::sol_types::private::Address, + pub chainId: alloy::sol_types::private::primitives::aliases::U256, #[allow(missing_docs)] - pub signerAddress: alloy::sol_types::private::Address, + pub fhevmExecutorAddress: alloy::sol_types::private::Address, #[allow(missing_docs)] - pub encryptionKey: alloy::sol_types::private::Bytes, + pub aclAddress: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub name: alloy::sol_types::private::String, + #[allow(missing_docs)] + pub website: alloy::sol_types::private::String, } #[allow( non_camel_case_types, @@ -1762,15 +1599,19 @@ struct Custodian { address txSenderAddress; address signerAddress; bytes encrypt use alloy::sol_types as alloy_sol_types; #[doc(hidden)] type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, alloy::sol_types::sol_data::Address, alloy::sol_types::sol_data::Address, - alloy::sol_types::sol_data::Bytes, + alloy::sol_types::sol_data::String, + alloy::sol_types::sol_data::String, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, alloy::sol_types::private::Address, alloy::sol_types::private::Address, - alloy::sol_types::private::Bytes, + alloy::sol_types::private::String, + alloy::sol_types::private::String, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -1785,39 +1626,53 @@ struct Custodian { address txSenderAddress; address signerAddress; bytes encrypt } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: Custodian) -> Self { - (value.txSenderAddress, value.signerAddress, value.encryptionKey) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: HostChain) -> Self { + ( + value.chainId, + value.fhevmExecutorAddress, + value.aclAddress, + value.name, + value.website, + ) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for Custodian { + impl ::core::convert::From> for HostChain { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { - txSenderAddress: tuple.0, - signerAddress: tuple.1, - encryptionKey: tuple.2, + chainId: tuple.0, + fhevmExecutorAddress: tuple.1, + aclAddress: tuple.2, + name: tuple.3, + website: tuple.4, } } } #[automatically_derived] - impl alloy_sol_types::SolValue for Custodian { + impl alloy_sol_types::SolValue for HostChain { type SolType = Self; } #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for Custodian { + impl alloy_sol_types::private::SolTypeValue for HostChain { #[inline] fn stv_to_tokens(&self) -> ::Token<'_> { ( + as alloy_sol_types::SolType>::tokenize(&self.chainId), ::tokenize( - &self.txSenderAddress, + &self.fhevmExecutorAddress, ), ::tokenize( - &self.signerAddress, + &self.aclAddress, ), - ::tokenize( - &self.encryptionKey, + ::tokenize( + &self.name, + ), + ::tokenize( + &self.website, ), ) } @@ -1863,7 +1718,7 @@ struct Custodian { address txSenderAddress; address signerAddress; bytes encrypt } } #[automatically_derived] - impl alloy_sol_types::SolType for Custodian { + impl alloy_sol_types::SolType for HostChain { type RustType = Self; type Token<'a> = alloy_sol_types::private::Cow<'static, str> { alloy_sol_types::private::Cow::Borrowed( - "Custodian(address txSenderAddress,address signerAddress,bytes encryptionKey)", + "HostChain(uint256 chainId,address fhevmExecutorAddress,address aclAddress,string name,string website)", ) } #[inline] @@ -1909,16 +1764,24 @@ struct Custodian { address txSenderAddress; address signerAddress; bytes encrypt #[inline] fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { [ + as alloy_sol_types::SolType>::eip712_data_word(&self.chainId) + .0, ::eip712_data_word( - &self.txSenderAddress, + &self.fhevmExecutorAddress, ) .0, ::eip712_data_word( - &self.signerAddress, + &self.aclAddress, ) .0, - ::eip712_data_word( - &self.encryptionKey, + ::eip712_data_word( + &self.name, + ) + .0, + ::eip712_data_word( + &self.website, ) .0, ] @@ -1926,18 +1789,26 @@ struct Custodian { address txSenderAddress; address signerAddress; bytes encrypt } } #[automatically_derived] - impl alloy_sol_types::EventTopic for Custodian { + impl alloy_sol_types::EventTopic for HostChain { #[inline] fn topic_preimage_length(rust: &Self::RustType) -> usize { 0usize + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.chainId, + ) + ::topic_preimage_length( - &rust.txSenderAddress, + &rust.fhevmExecutorAddress, ) + ::topic_preimage_length( - &rust.signerAddress, + &rust.aclAddress, ) - + ::topic_preimage_length( - &rust.encryptionKey, + + ::topic_preimage_length( + &rust.name, + ) + + ::topic_preimage_length( + &rust.website, ) } #[inline] @@ -1948,16 +1819,26 @@ struct Custodian { address txSenderAddress; address signerAddress; bytes encrypt out.reserve( ::topic_preimage_length(rust), ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.chainId, + out, + ); ::encode_topic_preimage( - &rust.txSenderAddress, + &rust.fhevmExecutorAddress, out, ); ::encode_topic_preimage( - &rust.signerAddress, + &rust.aclAddress, out, ); - ::encode_topic_preimage( - &rust.encryptionKey, + ::encode_topic_preimage( + &rust.name, + out, + ); + ::encode_topic_preimage( + &rust.website, out, ); } @@ -1979,21 +1860,19 @@ struct Custodian { address txSenderAddress; address signerAddress; bytes encrypt #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] /**```solidity -struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAddress; string name; string website; } +struct KmsNode { address txSenderAddress; address signerAddress; string ipAddress; string storageUrl; } ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct HostChain { - #[allow(missing_docs)] - pub chainId: alloy::sol_types::private::primitives::aliases::U256, + pub struct KmsNode { #[allow(missing_docs)] - pub fhevmExecutorAddress: alloy::sol_types::private::Address, + pub txSenderAddress: alloy::sol_types::private::Address, #[allow(missing_docs)] - pub aclAddress: alloy::sol_types::private::Address, + pub signerAddress: alloy::sol_types::private::Address, #[allow(missing_docs)] - pub name: alloy::sol_types::private::String, + pub ipAddress: alloy::sol_types::private::String, #[allow(missing_docs)] - pub website: alloy::sol_types::private::String, + pub storageUrl: alloy::sol_types::private::String, } #[allow( non_camel_case_types, @@ -2005,7 +1884,6 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd use alloy::sol_types as alloy_sol_types; #[doc(hidden)] type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Uint<256>, alloy::sol_types::sol_data::Address, alloy::sol_types::sol_data::Address, alloy::sol_types::sol_data::String, @@ -2013,7 +1891,6 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, alloy::sol_types::private::Address, alloy::sol_types::private::Address, alloy::sol_types::private::String, @@ -2032,53 +1909,48 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: HostChain) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: KmsNode) -> Self { ( - value.chainId, - value.fhevmExecutorAddress, - value.aclAddress, - value.name, - value.website, + value.txSenderAddress, + value.signerAddress, + value.ipAddress, + value.storageUrl, ) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for HostChain { + impl ::core::convert::From> for KmsNode { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { - chainId: tuple.0, - fhevmExecutorAddress: tuple.1, - aclAddress: tuple.2, - name: tuple.3, - website: tuple.4, + txSenderAddress: tuple.0, + signerAddress: tuple.1, + ipAddress: tuple.2, + storageUrl: tuple.3, } } } #[automatically_derived] - impl alloy_sol_types::SolValue for HostChain { + impl alloy_sol_types::SolValue for KmsNode { type SolType = Self; } #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for HostChain { + impl alloy_sol_types::private::SolTypeValue for KmsNode { #[inline] fn stv_to_tokens(&self) -> ::Token<'_> { ( - as alloy_sol_types::SolType>::tokenize(&self.chainId), ::tokenize( - &self.fhevmExecutorAddress, + &self.txSenderAddress, ), ::tokenize( - &self.aclAddress, + &self.signerAddress, ), ::tokenize( - &self.name, + &self.ipAddress, ), ::tokenize( - &self.website, + &self.storageUrl, ), ) } @@ -2124,7 +1996,7 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd } } #[automatically_derived] - impl alloy_sol_types::SolType for HostChain { + impl alloy_sol_types::SolType for KmsNode { type RustType = Self; type Token<'a> = alloy_sol_types::private::Cow<'static, str> { alloy_sol_types::private::Cow::Borrowed( - "HostChain(uint256 chainId,address fhevmExecutorAddress,address aclAddress,string name,string website)", + "KmsNode(address txSenderAddress,address signerAddress,string ipAddress,string storageUrl)", ) } #[inline] @@ -2170,24 +2042,20 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd #[inline] fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { [ - as alloy_sol_types::SolType>::eip712_data_word(&self.chainId) - .0, ::eip712_data_word( - &self.fhevmExecutorAddress, + &self.txSenderAddress, ) .0, ::eip712_data_word( - &self.aclAddress, + &self.signerAddress, ) .0, ::eip712_data_word( - &self.name, + &self.ipAddress, ) .0, ::eip712_data_word( - &self.website, + &self.storageUrl, ) .0, ] @@ -2195,26 +2063,21 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd } } #[automatically_derived] - impl alloy_sol_types::EventTopic for HostChain { + impl alloy_sol_types::EventTopic for KmsNode { #[inline] fn topic_preimage_length(rust: &Self::RustType) -> usize { 0usize - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.chainId, - ) + ::topic_preimage_length( - &rust.fhevmExecutorAddress, + &rust.txSenderAddress, ) + ::topic_preimage_length( - &rust.aclAddress, + &rust.signerAddress, ) + ::topic_preimage_length( - &rust.name, + &rust.ipAddress, ) + ::topic_preimage_length( - &rust.website, + &rust.storageUrl, ) } #[inline] @@ -2225,26 +2088,20 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd out.reserve( ::topic_preimage_length(rust), ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.chainId, - out, - ); ::encode_topic_preimage( - &rust.fhevmExecutorAddress, + &rust.txSenderAddress, out, ); ::encode_topic_preimage( - &rust.aclAddress, + &rust.signerAddress, out, ); ::encode_topic_preimage( - &rust.name, + &rust.ipAddress, out, ); ::encode_topic_preimage( - &rust.website, + &rust.storageUrl, out, ); } @@ -2266,19 +2123,15 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] /**```solidity -struct KmsNode { address txSenderAddress; address signerAddress; string ipAddress; string storageUrl; } +struct ProtocolMetadata { string name; string website; } ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct KmsNode { - #[allow(missing_docs)] - pub txSenderAddress: alloy::sol_types::private::Address, - #[allow(missing_docs)] - pub signerAddress: alloy::sol_types::private::Address, + pub struct ProtocolMetadata { #[allow(missing_docs)] - pub ipAddress: alloy::sol_types::private::String, + pub name: alloy::sol_types::private::String, #[allow(missing_docs)] - pub storageUrl: alloy::sol_types::private::String, + pub website: alloy::sol_types::private::String, } #[allow( non_camel_case_types, @@ -2290,15 +2143,11 @@ struct KmsNode { address txSenderAddress; address signerAddress; string ipAddres use alloy::sol_types as alloy_sol_types; #[doc(hidden)] type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Address, - alloy::sol_types::sol_data::Address, alloy::sol_types::sol_data::String, alloy::sol_types::sol_data::String, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Address, - alloy::sol_types::private::Address, alloy::sol_types::private::String, alloy::sol_types::private::String, ); @@ -2315,48 +2164,35 @@ struct KmsNode { address txSenderAddress; address signerAddress; string ipAddres } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: KmsNode) -> Self { - ( - value.txSenderAddress, - value.signerAddress, - value.ipAddress, - value.storageUrl, - ) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ProtocolMetadata) -> Self { + (value.name, value.website) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for KmsNode { + impl ::core::convert::From> for ProtocolMetadata { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { - txSenderAddress: tuple.0, - signerAddress: tuple.1, - ipAddress: tuple.2, - storageUrl: tuple.3, + name: tuple.0, + website: tuple.1, } } } #[automatically_derived] - impl alloy_sol_types::SolValue for KmsNode { + impl alloy_sol_types::SolValue for ProtocolMetadata { type SolType = Self; } #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for KmsNode { + impl alloy_sol_types::private::SolTypeValue for ProtocolMetadata { #[inline] fn stv_to_tokens(&self) -> ::Token<'_> { ( - ::tokenize( - &self.txSenderAddress, - ), - ::tokenize( - &self.signerAddress, - ), ::tokenize( - &self.ipAddress, + &self.name, ), ::tokenize( - &self.storageUrl, + &self.website, ), ) } @@ -2402,7 +2238,7 @@ struct KmsNode { address txSenderAddress; address signerAddress; string ipAddres } } #[automatically_derived] - impl alloy_sol_types::SolType for KmsNode { + impl alloy_sol_types::SolType for ProtocolMetadata { type RustType = Self; type Token<'a> = alloy_sol_types::private::Cow<'static, str> { alloy_sol_types::private::Cow::Borrowed( - "KmsNode(address txSenderAddress,address signerAddress,string ipAddress,string storageUrl)", + "ProtocolMetadata(string name,string website)", ) } #[inline] @@ -2448,20 +2284,12 @@ struct KmsNode { address txSenderAddress; address signerAddress; string ipAddres #[inline] fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { [ - ::eip712_data_word( - &self.txSenderAddress, - ) - .0, - ::eip712_data_word( - &self.signerAddress, - ) - .0, ::eip712_data_word( - &self.ipAddress, + &self.name, ) .0, ::eip712_data_word( - &self.storageUrl, + &self.website, ) .0, ] @@ -2469,21 +2297,15 @@ struct KmsNode { address txSenderAddress; address signerAddress; string ipAddres } } #[automatically_derived] - impl alloy_sol_types::EventTopic for KmsNode { + impl alloy_sol_types::EventTopic for ProtocolMetadata { #[inline] fn topic_preimage_length(rust: &Self::RustType) -> usize { 0usize - + ::topic_preimage_length( - &rust.txSenderAddress, - ) - + ::topic_preimage_length( - &rust.signerAddress, - ) + ::topic_preimage_length( - &rust.ipAddress, + &rust.name, ) + ::topic_preimage_length( - &rust.storageUrl, + &rust.website, ) } #[inline] @@ -2494,20 +2316,12 @@ struct KmsNode { address txSenderAddress; address signerAddress; string ipAddres out.reserve( ::topic_preimage_length(rust), ); - ::encode_topic_preimage( - &rust.txSenderAddress, - out, - ); - ::encode_topic_preimage( - &rust.signerAddress, - out, - ); ::encode_topic_preimage( - &rust.ipAddress, + &rust.name, out, ); ::encode_topic_preimage( - &rust.storageUrl, + &rust.website, out, ); } @@ -2528,229 +2342,9 @@ struct KmsNode { address txSenderAddress; address signerAddress; string ipAddres }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**```solidity -struct ProtocolMetadata { string name; string website; } -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct ProtocolMetadata { - #[allow(missing_docs)] - pub name: alloy::sol_types::private::String, - #[allow(missing_docs)] - pub website: alloy::sol_types::private::String, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::String, - alloy::sol_types::sol_data::String, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::String, - alloy::sol_types::private::String, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: ProtocolMetadata) -> Self { - (value.name, value.website) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for ProtocolMetadata { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - name: tuple.0, - website: tuple.1, - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolValue for ProtocolMetadata { - type SolType = Self; - } - #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for ProtocolMetadata { - #[inline] - fn stv_to_tokens(&self) -> ::Token<'_> { - ( - ::tokenize( - &self.name, - ), - ::tokenize( - &self.website, - ), - ) - } - #[inline] - fn stv_abi_encoded_size(&self) -> usize { - if let Some(size) = ::ENCODED_SIZE { - return size; - } - let tuple = as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encoded_size(&tuple) - } - #[inline] - fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { - ::eip712_hash_struct(self) - } - #[inline] - fn stv_abi_encode_packed_to( - &self, - out: &mut alloy_sol_types::private::Vec, - ) { - let tuple = as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encode_packed_to(&tuple, out) - } - #[inline] - fn stv_abi_packed_encoded_size(&self) -> usize { - if let Some(size) = ::PACKED_ENCODED_SIZE { - return size; - } - let tuple = as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_packed_encoded_size(&tuple) - } - } - #[automatically_derived] - impl alloy_sol_types::SolType for ProtocolMetadata { - type RustType = Self; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SOL_NAME: &'static str = ::NAME; - const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; - const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; - #[inline] - fn valid_token(token: &Self::Token<'_>) -> bool { - as alloy_sol_types::SolType>::valid_token(token) - } - #[inline] - fn detokenize(token: Self::Token<'_>) -> Self::RustType { - let tuple = as alloy_sol_types::SolType>::detokenize(token); - >>::from(tuple) - } - } - #[automatically_derived] - impl alloy_sol_types::SolStruct for ProtocolMetadata { - const NAME: &'static str = "ProtocolMetadata"; - #[inline] - fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { - alloy_sol_types::private::Cow::Borrowed( - "ProtocolMetadata(string name,string website)", - ) - } - #[inline] - fn eip712_components() -> alloy_sol_types::private::Vec< - alloy_sol_types::private::Cow<'static, str>, - > { - alloy_sol_types::private::Vec::new() - } - #[inline] - fn eip712_encode_type() -> alloy_sol_types::private::Cow<'static, str> { - ::eip712_root_type() - } - #[inline] - fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { - [ - ::eip712_data_word( - &self.name, - ) - .0, - ::eip712_data_word( - &self.website, - ) - .0, - ] - .concat() - } - } - #[automatically_derived] - impl alloy_sol_types::EventTopic for ProtocolMetadata { - #[inline] - fn topic_preimage_length(rust: &Self::RustType) -> usize { - 0usize - + ::topic_preimage_length( - &rust.name, - ) - + ::topic_preimage_length( - &rust.website, - ) - } - #[inline] - fn encode_topic_preimage( - rust: &Self::RustType, - out: &mut alloy_sol_types::private::Vec, - ) { - out.reserve( - ::topic_preimage_length(rust), - ); - ::encode_topic_preimage( - &rust.name, - out, - ); - ::encode_topic_preimage( - &rust.website, - out, - ); - } - #[inline] - fn encode_topic( - rust: &Self::RustType, - ) -> alloy_sol_types::abi::token::WordToken { - let mut out = alloy_sol_types::private::Vec::new(); - ::encode_topic_preimage( - rust, - &mut out, - ); - alloy_sol_types::abi::token::WordToken( - alloy_sol_types::private::keccak256(out), - ) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `AddressEmptyCode(address)` and selector `0x9996b315`. -```solidity -error AddressEmptyCode(address target); + /**Custom error with signature `AddressEmptyCode(address)` and selector `0x9996b315`. +```solidity +error AddressEmptyCode(address target); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] @@ -3065,13 +2659,13 @@ error ERC1967NonPayable(); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `EmptyCoprocessors()` and selector `0x8af082ef`. + /**Custom error with signature `EmptyCustodians()` and selector `0xcad1d534`. ```solidity -error EmptyCoprocessors(); +error EmptyCustodians(); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct EmptyCoprocessors; + pub struct EmptyCustodians; #[allow( non_camel_case_types, non_snake_case, @@ -3097,26 +2691,26 @@ error EmptyCoprocessors(); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: EmptyCoprocessors) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: EmptyCustodians) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for EmptyCoprocessors { + impl ::core::convert::From> for EmptyCustodians { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } } #[automatically_derived] - impl alloy_sol_types::SolError for EmptyCoprocessors { + impl alloy_sol_types::SolError for EmptyCustodians { type Parameters<'a> = UnderlyingSolTuple<'a>; type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "EmptyCoprocessors()"; - const SELECTOR: [u8; 4] = [138u8, 240u8, 130u8, 239u8]; + const SIGNATURE: &'static str = "EmptyCustodians()"; + const SELECTOR: [u8; 4] = [202u8, 209u8, 213u8, 52u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -3138,13 +2732,13 @@ error EmptyCoprocessors(); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `EmptyCustodians()` and selector `0xcad1d534`. + /**Custom error with signature `EmptyKmsNodes()` and selector `0x068c8d40`. ```solidity -error EmptyCustodians(); +error EmptyKmsNodes(); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct EmptyCustodians; + pub struct EmptyKmsNodes; #[allow( non_camel_case_types, non_snake_case, @@ -3170,26 +2764,26 @@ error EmptyCustodians(); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: EmptyCustodians) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: EmptyKmsNodes) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for EmptyCustodians { + impl ::core::convert::From> for EmptyKmsNodes { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } } #[automatically_derived] - impl alloy_sol_types::SolError for EmptyCustodians { + impl alloy_sol_types::SolError for EmptyKmsNodes { type Parameters<'a> = UnderlyingSolTuple<'a>; type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "EmptyCustodians()"; - const SELECTOR: [u8; 4] = [202u8, 209u8, 213u8, 52u8]; + const SIGNATURE: &'static str = "EmptyKmsNodes()"; + const SELECTOR: [u8; 4] = [6u8, 140u8, 141u8, 64u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -3211,86 +2805,13 @@ error EmptyCustodians(); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `EmptyKmsNodes()` and selector `0x068c8d40`. + /**Custom error with signature `FailedCall()` and selector `0xd6bda275`. ```solidity -error EmptyKmsNodes(); +error FailedCall(); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct EmptyKmsNodes; - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: EmptyKmsNodes) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for EmptyKmsNodes { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for EmptyKmsNodes { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "EmptyKmsNodes()"; - const SELECTOR: [u8; 4] = [6u8, 140u8, 141u8, 64u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(Self::new) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `FailedCall()` and selector `0xd6bda275`. -```solidity -error FailedCall(); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct FailedCall; + pub struct FailedCall; #[allow( non_camel_case_types, non_snake_case, @@ -4846,9 +4367,9 @@ event AddHostChain(HostChain hostChain); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,string)[],(address,address,bytes)[])` and selector `0x3a7c54b1195d44a288f9c3c9a0679aed9325068e0d0d5b69e96047355cc71745`. + /**Event with signature `InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,bytes)[])` and selector `0xab58ab938892a1855d09c7c1390cabd4ca0405eaab322c5a82570770a719826e`. ```solidity -event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, KmsNode[] kmsNodes, Coprocessor[] coprocessors, Custodian[] custodians); +event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, KmsNode[] kmsNodes, Custodian[] custodians); ```*/ #[allow( non_camel_case_types, @@ -4867,10 +4388,6 @@ event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, K ::RustType, >, #[allow(missing_docs)] - pub coprocessors: alloy::sol_types::private::Vec< - ::RustType, - >, - #[allow(missing_docs)] pub custodians: alloy::sol_types::private::Vec< ::RustType, >, @@ -4889,18 +4406,17 @@ event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, K ProtocolMetadata, alloy::sol_types::sol_data::Uint<256>, alloy::sol_types::sol_data::Array, - alloy::sol_types::sol_data::Array, alloy::sol_types::sol_data::Array, ); type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); - const SIGNATURE: &'static str = "InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,string)[],(address,address,bytes)[])"; + const SIGNATURE: &'static str = "InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,bytes)[])"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 58u8, 124u8, 84u8, 177u8, 25u8, 93u8, 68u8, 162u8, 136u8, 249u8, 195u8, - 201u8, 160u8, 103u8, 154u8, 237u8, 147u8, 37u8, 6u8, 142u8, 13u8, 13u8, - 91u8, 105u8, 233u8, 96u8, 71u8, 53u8, 92u8, 199u8, 23u8, 69u8, + 171u8, 88u8, 171u8, 147u8, 136u8, 146u8, 161u8, 133u8, 93u8, 9u8, 199u8, + 193u8, 57u8, 12u8, 171u8, 212u8, 202u8, 4u8, 5u8, 234u8, 171u8, 50u8, + 44u8, 90u8, 130u8, 87u8, 7u8, 112u8, 167u8, 25u8, 130u8, 110u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -4913,8 +4429,7 @@ event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, K metadata: data.0, mpcThreshold: data.1, kmsNodes: data.2, - coprocessors: data.3, - custodians: data.4, + custodians: data.3, } } #[inline] @@ -4944,9 +4459,6 @@ event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, K as alloy_sol_types::SolType>::tokenize(&self.kmsNodes), - as alloy_sol_types::SolType>::tokenize(&self.coprocessors), as alloy_sol_types::SolType>::tokenize(&self.custodians), @@ -6561,24 +6073,24 @@ function addHostChain(HostChain memory hostChain) external; }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCoprocessor(address)` and selector `0xef6997f9`. + /**Function with signature `getCustodian(address)` and selector `0xcb5aa7e9`. ```solidity -function getCoprocessor(address coprocessorTxSenderAddress) external view returns (Coprocessor memory); +function getCustodian(address custodianTxSenderAddress) external view returns (Custodian memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCoprocessorCall { + pub struct getCustodianCall { #[allow(missing_docs)] - pub coprocessorTxSenderAddress: alloy::sol_types::private::Address, + pub custodianTxSenderAddress: alloy::sol_types::private::Address, } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCoprocessor(address)`](getCoprocessorCall) function. + ///Container type for the return parameters of the [`getCustodian(address)`](getCustodianCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCoprocessorReturn { + pub struct getCustodianReturn { #[allow(missing_docs)] - pub _0: ::RustType, + pub _0: ::RustType, } #[allow( non_camel_case_types, @@ -6606,27 +6118,27 @@ function getCoprocessor(address coprocessorTxSenderAddress) external view return } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorCall) -> Self { - (value.coprocessorTxSenderAddress,) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getCustodianCall) -> Self { + (value.custodianTxSenderAddress,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getCoprocessorCall { + impl ::core::convert::From> for getCustodianCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { - coprocessorTxSenderAddress: tuple.0, + custodianTxSenderAddress: tuple.0, } } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (Coprocessor,); + type UnderlyingSolTuple<'a> = (Custodian,); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - ::RustType, + ::RustType, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -6641,34 +6153,32 @@ function getCoprocessor(address coprocessorTxSenderAddress) external view return } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorReturn) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getCustodianReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getCoprocessorReturn { + impl ::core::convert::From> for getCustodianReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getCoprocessorCall { + impl alloy_sol_types::SolCall for getCustodianCall { type Parameters<'a> = (alloy::sol_types::sol_data::Address,); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = ::RustType; - type ReturnTuple<'a> = (Coprocessor,); + type Return = ::RustType; + type ReturnTuple<'a> = (Custodian,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCoprocessor(address)"; - const SELECTOR: [u8; 4] = [239u8, 105u8, 151u8, 249u8]; + const SIGNATURE: &'static str = "getCustodian(address)"; + const SELECTOR: [u8; 4] = [203u8, 90u8, 167u8, 233u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6679,13 +6189,13 @@ function getCoprocessor(address coprocessorTxSenderAddress) external view return fn tokenize(&self) -> Self::Token<'_> { ( ::tokenize( - &self.coprocessorTxSenderAddress, + &self.custodianTxSenderAddress, ), ) } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) + (::tokenize(ret),) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { @@ -6693,7 +6203,7 @@ function getCoprocessor(address coprocessorTxSenderAddress) external view return '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getCoprocessorReturn = r.into(); + let r: getCustodianReturn = r.into(); r._0 }) } @@ -6705,7 +6215,7 @@ function getCoprocessor(address coprocessorTxSenderAddress) external view return '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getCoprocessorReturn = r.into(); + let r: getCustodianReturn = r.into(); r._0 }) } @@ -6713,21 +6223,21 @@ function getCoprocessor(address coprocessorTxSenderAddress) external view return }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCoprocessorMajorityThreshold()` and selector `0x6799ef52`. + /**Function with signature `getCustodianSigners()` and selector `0xba1f31d2`. ```solidity -function getCoprocessorMajorityThreshold() external view returns (uint256); +function getCustodianSigners() external view returns (address[] memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCoprocessorMajorityThresholdCall; + pub struct getCustodianSignersCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCoprocessorMajorityThreshold()`](getCoprocessorMajorityThresholdCall) function. + ///Container type for the return parameters of the [`getCustodianSigners()`](getCustodianSignersCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCoprocessorMajorityThresholdReturn { + pub struct getCustodianSignersReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::primitives::aliases::U256, + pub _0: alloy::sol_types::private::Vec, } #[allow( non_camel_case_types, @@ -6755,16 +6265,16 @@ function getCoprocessorMajorityThreshold() external view returns (uint256); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorMajorityThresholdCall) -> Self { + fn from(value: getCustodianSignersCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getCoprocessorMajorityThresholdCall { + for getCustodianSignersCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -6772,10 +6282,12 @@ function getCoprocessorMajorityThreshold() external view returns (uint256); } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Vec, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -6790,34 +6302,38 @@ function getCoprocessorMajorityThreshold() external view returns (uint256); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorMajorityThresholdReturn) -> Self { + fn from(value: getCustodianSignersReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getCoprocessorMajorityThresholdReturn { + for getCustodianSignersReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getCoprocessorMajorityThresholdCall { + impl alloy_sol_types::SolCall for getCustodianSignersCall { type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::primitives::aliases::U256; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Return = alloy::sol_types::private::Vec< + alloy::sol_types::private::Address, + >; + type ReturnTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCoprocessorMajorityThreshold()"; - const SELECTOR: [u8; 4] = [103u8, 153u8, 239u8, 82u8]; + const SIGNATURE: &'static str = "getCustodianSigners()"; + const SELECTOR: [u8; 4] = [186u8, 31u8, 49u8, 210u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6831,8 +6347,8 @@ function getCoprocessorMajorityThreshold() external view returns (uint256); #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( - as alloy_sol_types::SolType>::tokenize(ret), ) } @@ -6842,7 +6358,7 @@ function getCoprocessorMajorityThreshold() external view returns (uint256); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getCoprocessorMajorityThresholdReturn = r.into(); + let r: getCustodianSignersReturn = r.into(); r._0 }) } @@ -6854,7 +6370,7 @@ function getCoprocessorMajorityThreshold() external view returns (uint256); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getCoprocessorMajorityThresholdReturn = r.into(); + let r: getCustodianSignersReturn = r.into(); r._0 }) } @@ -6862,19 +6378,19 @@ function getCoprocessorMajorityThreshold() external view returns (uint256); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCoprocessorSigners()` and selector `0x9164d0ae`. + /**Function with signature `getCustodianTxSenders()` and selector `0x2a8b9de9`. ```solidity -function getCoprocessorSigners() external view returns (address[] memory); +function getCustodianTxSenders() external view returns (address[] memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCoprocessorSignersCall; + pub struct getCustodianTxSendersCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCoprocessorSigners()`](getCoprocessorSignersCall) function. + ///Container type for the return parameters of the [`getCustodianTxSenders()`](getCustodianTxSendersCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCoprocessorSignersReturn { + pub struct getCustodianTxSendersReturn { #[allow(missing_docs)] pub _0: alloy::sol_types::private::Vec, } @@ -6904,16 +6420,16 @@ function getCoprocessorSigners() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorSignersCall) -> Self { + fn from(value: getCustodianTxSendersCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getCoprocessorSignersCall { + for getCustodianTxSendersCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -6941,23 +6457,23 @@ function getCoprocessorSigners() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorSignersReturn) -> Self { + fn from(value: getCustodianTxSendersReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getCoprocessorSignersReturn { + for getCustodianTxSendersReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getCoprocessorSignersCall { + impl alloy_sol_types::SolCall for getCustodianTxSendersCall { type Parameters<'a> = (); type Token<'a> = = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCoprocessorSigners()"; - const SELECTOR: [u8; 4] = [145u8, 100u8, 208u8, 174u8]; + const SIGNATURE: &'static str = "getCustodianTxSenders()"; + const SELECTOR: [u8; 4] = [42u8, 139u8, 157u8, 233u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6997,7 +6513,7 @@ function getCoprocessorSigners() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getCoprocessorSignersReturn = r.into(); + let r: getCustodianTxSendersReturn = r.into(); r._0 }) } @@ -7009,7 +6525,7 @@ function getCoprocessorSigners() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getCoprocessorSignersReturn = r.into(); + let r: getCustodianTxSendersReturn = r.into(); r._0 }) } @@ -7017,21 +6533,24 @@ function getCoprocessorSigners() external view returns (address[] memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCoprocessorTxSenders()` and selector `0x1ea5bd42`. + /**Function with signature `getHostChain(uint256)` and selector `0xd10f7ff9`. ```solidity -function getCoprocessorTxSenders() external view returns (address[] memory); +function getHostChain(uint256 index) external view returns (HostChain memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCoprocessorTxSendersCall; + pub struct getHostChainCall { + #[allow(missing_docs)] + pub index: alloy::sol_types::private::primitives::aliases::U256, + } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCoprocessorTxSenders()`](getCoprocessorTxSendersCall) function. + ///Container type for the return parameters of the [`getHostChain(uint256)`](getHostChainCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCoprocessorTxSendersReturn { + pub struct getHostChainReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec, + pub _0: ::RustType, } #[allow( non_camel_case_types, @@ -7043,9 +6562,11 @@ function getCoprocessorTxSenders() external view returns (address[] memory); use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -7059,29 +6580,25 @@ function getCoprocessorTxSenders() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorTxSendersCall) -> Self { - () + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getHostChainCall) -> Self { + (value.index,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getCoprocessorTxSendersCall { + impl ::core::convert::From> for getHostChainCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self + Self { index: tuple.0 } } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type UnderlyingSolTuple<'a> = (HostChain,); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec, + ::RustType, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -7096,38 +6613,32 @@ function getCoprocessorTxSenders() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorTxSendersReturn) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getHostChainReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getCoprocessorTxSendersReturn { + impl ::core::convert::From> for getHostChainReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getCoprocessorTxSendersCall { - type Parameters<'a> = (); + impl alloy_sol_types::SolCall for getHostChainCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, - >; - type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type Return = ::RustType; + type ReturnTuple<'a> = (HostChain,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCoprocessorTxSenders()"; - const SELECTOR: [u8; 4] = [30u8, 165u8, 189u8, 66u8]; + const SIGNATURE: &'static str = "getHostChain(uint256)"; + const SELECTOR: [u8; 4] = [209u8, 15u8, 127u8, 249u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -7136,15 +6647,15 @@ function getCoprocessorTxSenders() external view returns (address[] memory); } #[inline] fn tokenize(&self) -> Self::Token<'_> { - () + ( + as alloy_sol_types::SolType>::tokenize(&self.index), + ) } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) + (::tokenize(ret),) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { @@ -7152,7 +6663,7 @@ function getCoprocessorTxSenders() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getCoprocessorTxSendersReturn = r.into(); + let r: getHostChainReturn = r.into(); r._0 }) } @@ -7164,7 +6675,7 @@ function getCoprocessorTxSenders() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getCoprocessorTxSendersReturn = r.into(); + let r: getHostChainReturn = r.into(); r._0 }) } @@ -7172,24 +6683,23 @@ function getCoprocessorTxSenders() external view returns (address[] memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCustodian(address)` and selector `0xcb5aa7e9`. + /**Function with signature `getHostChains()` and selector `0x2585bb65`. ```solidity -function getCustodian(address custodianTxSenderAddress) external view returns (Custodian memory); +function getHostChains() external view returns (HostChain[] memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCustodianCall { - #[allow(missing_docs)] - pub custodianTxSenderAddress: alloy::sol_types::private::Address, - } + pub struct getHostChainsCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCustodian(address)`](getCustodianCall) function. + ///Container type for the return parameters of the [`getHostChains()`](getHostChainsCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCustodianReturn { + pub struct getHostChainsReturn { #[allow(missing_docs)] - pub _0: ::RustType, + pub _0: alloy::sol_types::private::Vec< + ::RustType, + >, } #[allow( non_camel_case_types, @@ -7201,9 +6711,9 @@ function getCustodian(address custodianTxSenderAddress) external view returns (C use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + type UnderlyingSolTuple<'a> = (); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + type UnderlyingRustTuple<'a> = (); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -7217,29 +6727,31 @@ function getCustodian(address custodianTxSenderAddress) external view returns (C } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCustodianCall) -> Self { - (value.custodianTxSenderAddress,) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getHostChainsCall) -> Self { + () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getCustodianCall { + impl ::core::convert::From> for getHostChainsCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - custodianTxSenderAddress: tuple.0, - } + Self } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (Custodian,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - ::RustType, - ); - #[cfg(test)] + alloy::sol_types::private::Vec< + ::RustType, + >, + ); + #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( _t: alloy_sol_types::private::AssertTypeEq, @@ -7252,32 +6764,34 @@ function getCustodian(address custodianTxSenderAddress) external view returns (C } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCustodianReturn) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getHostChainsReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getCustodianReturn { + impl ::core::convert::From> for getHostChainsReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getCustodianCall { - type Parameters<'a> = (alloy::sol_types::sol_data::Address,); + impl alloy_sol_types::SolCall for getHostChainsCall { + type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = ::RustType; - type ReturnTuple<'a> = (Custodian,); + type Return = alloy::sol_types::private::Vec< + ::RustType, + >; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Array,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCustodian(address)"; - const SELECTOR: [u8; 4] = [203u8, 90u8, 167u8, 233u8]; + const SIGNATURE: &'static str = "getHostChains()"; + const SELECTOR: [u8; 4] = [37u8, 133u8, 187u8, 101u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -7286,15 +6800,15 @@ function getCustodian(address custodianTxSenderAddress) external view returns (C } #[inline] fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.custodianTxSenderAddress, - ), - ) + () } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { @@ -7302,7 +6816,7 @@ function getCustodian(address custodianTxSenderAddress) external view returns (C '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getCustodianReturn = r.into(); + let r: getHostChainsReturn = r.into(); r._0 }) } @@ -7314,7 +6828,7 @@ function getCustodian(address custodianTxSenderAddress) external view returns (C '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getCustodianReturn = r.into(); + let r: getHostChainsReturn = r.into(); r._0 }) } @@ -7322,21 +6836,21 @@ function getCustodian(address custodianTxSenderAddress) external view returns (C }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCustodianSigners()` and selector `0xba1f31d2`. + /**Function with signature `getKmsGenThreshold()` and selector `0xb4722bc4`. ```solidity -function getCustodianSigners() external view returns (address[] memory); +function getKmsGenThreshold() external view returns (uint256); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCustodianSignersCall; + pub struct getKmsGenThresholdCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCustodianSigners()`](getCustodianSignersCall) function. + ///Container type for the return parameters of the [`getKmsGenThreshold()`](getKmsGenThresholdCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCustodianSignersReturn { + pub struct getKmsGenThresholdReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec, + pub _0: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -7364,16 +6878,16 @@ function getCustodianSigners() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCustodianSignersCall) -> Self { + fn from(value: getKmsGenThresholdCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getCustodianSignersCall { + for getKmsGenThresholdCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -7381,12 +6895,10 @@ function getCustodianSigners() external view returns (address[] memory); } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec, + alloy::sol_types::private::primitives::aliases::U256, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -7401,38 +6913,34 @@ function getCustodianSigners() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCustodianSignersReturn) -> Self { + fn from(value: getKmsGenThresholdReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getCustodianSignersReturn { + for getKmsGenThresholdReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getCustodianSignersCall { + impl alloy_sol_types::SolCall for getKmsGenThresholdCall { type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, - >; - type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCustodianSigners()"; - const SELECTOR: [u8; 4] = [186u8, 31u8, 49u8, 210u8]; + const SIGNATURE: &'static str = "getKmsGenThreshold()"; + const SELECTOR: [u8; 4] = [180u8, 114u8, 43u8, 196u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -7446,8 +6954,8 @@ function getCustodianSigners() external view returns (address[] memory); #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( - as alloy_sol_types::SolType>::tokenize(ret), ) } @@ -7457,7 +6965,7 @@ function getCustodianSigners() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getCustodianSignersReturn = r.into(); + let r: getKmsGenThresholdReturn = r.into(); r._0 }) } @@ -7469,7 +6977,7 @@ function getCustodianSigners() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getCustodianSignersReturn = r.into(); + let r: getKmsGenThresholdReturn = r.into(); r._0 }) } @@ -7477,21 +6985,24 @@ function getCustodianSigners() external view returns (address[] memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCustodianTxSenders()` and selector `0x2a8b9de9`. + /**Function with signature `getKmsNode(address)` and selector `0xe3b2a874`. ```solidity -function getCustodianTxSenders() external view returns (address[] memory); +function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCustodianTxSendersCall; + pub struct getKmsNodeCall { + #[allow(missing_docs)] + pub kmsTxSenderAddress: alloy::sol_types::private::Address, + } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCustodianTxSenders()`](getCustodianTxSendersCall) function. + ///Container type for the return parameters of the [`getKmsNode(address)`](getKmsNodeCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCustodianTxSendersReturn { + pub struct getKmsNodeReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec, + pub _0: ::RustType, } #[allow( non_camel_case_types, @@ -7503,9 +7014,9 @@ function getCustodianTxSenders() external view returns (address[] memory); use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -7519,29 +7030,27 @@ function getCustodianTxSenders() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCustodianTxSendersCall) -> Self { - () + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getKmsNodeCall) -> Self { + (value.kmsTxSenderAddress,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getCustodianTxSendersCall { + impl ::core::convert::From> for getKmsNodeCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self + Self { + kmsTxSenderAddress: tuple.0, + } } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type UnderlyingSolTuple<'a> = (KmsNode,); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec, + ::RustType, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -7556,38 +7065,32 @@ function getCustodianTxSenders() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCustodianTxSendersReturn) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getKmsNodeReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getCustodianTxSendersReturn { + impl ::core::convert::From> for getKmsNodeReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getCustodianTxSendersCall { - type Parameters<'a> = (); + impl alloy_sol_types::SolCall for getKmsNodeCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Address,); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, - >; - type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type Return = ::RustType; + type ReturnTuple<'a> = (KmsNode,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCustodianTxSenders()"; - const SELECTOR: [u8; 4] = [42u8, 139u8, 157u8, 233u8]; + const SIGNATURE: &'static str = "getKmsNode(address)"; + const SELECTOR: [u8; 4] = [227u8, 178u8, 168u8, 116u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -7596,15 +7099,15 @@ function getCustodianTxSenders() external view returns (address[] memory); } #[inline] fn tokenize(&self) -> Self::Token<'_> { - () + ( + ::tokenize( + &self.kmsTxSenderAddress, + ), + ) } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) + (::tokenize(ret),) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { @@ -7612,7 +7115,7 @@ function getCustodianTxSenders() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getCustodianTxSendersReturn = r.into(); + let r: getKmsNodeReturn = r.into(); r._0 }) } @@ -7624,7 +7127,7 @@ function getCustodianTxSenders() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getCustodianTxSendersReturn = r.into(); + let r: getKmsNodeReturn = r.into(); r._0 }) } @@ -7632,24 +7135,21 @@ function getCustodianTxSenders() external view returns (address[] memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getHostChain(uint256)` and selector `0xd10f7ff9`. + /**Function with signature `getKmsSigners()` and selector `0x7eaac8f2`. ```solidity -function getHostChain(uint256 index) external view returns (HostChain memory); +function getKmsSigners() external view returns (address[] memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getHostChainCall { - #[allow(missing_docs)] - pub index: alloy::sol_types::private::primitives::aliases::U256, - } + pub struct getKmsSignersCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getHostChain(uint256)`](getHostChainCall) function. + ///Container type for the return parameters of the [`getKmsSigners()`](getKmsSignersCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getHostChainReturn { + pub struct getKmsSignersReturn { #[allow(missing_docs)] - pub _0: ::RustType, + pub _0: alloy::sol_types::private::Vec, } #[allow( non_camel_case_types, @@ -7661,11 +7161,9 @@ function getHostChain(uint256 index) external view returns (HostChain memory); use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type UnderlyingSolTuple<'a> = (); #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, - ); + type UnderlyingRustTuple<'a> = (); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -7679,25 +7177,27 @@ function getHostChain(uint256 index) external view returns (HostChain memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getHostChainCall) -> Self { - (value.index,) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getKmsSignersCall) -> Self { + () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getHostChainCall { + impl ::core::convert::From> for getKmsSignersCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { index: tuple.0 } + Self } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (HostChain,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - ::RustType, + alloy::sol_types::private::Vec, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -7712,32 +7212,36 @@ function getHostChain(uint256 index) external view returns (HostChain memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getHostChainReturn) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getKmsSignersReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getHostChainReturn { + impl ::core::convert::From> for getKmsSignersReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getHostChainCall { - type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + impl alloy_sol_types::SolCall for getKmsSignersCall { + type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = ::RustType; - type ReturnTuple<'a> = (HostChain,); + type Return = alloy::sol_types::private::Vec< + alloy::sol_types::private::Address, + >; + type ReturnTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getHostChain(uint256)"; - const SELECTOR: [u8; 4] = [209u8, 15u8, 127u8, 249u8]; + const SIGNATURE: &'static str = "getKmsSigners()"; + const SELECTOR: [u8; 4] = [126u8, 170u8, 200u8, 242u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -7746,15 +7250,15 @@ function getHostChain(uint256 index) external view returns (HostChain memory); } #[inline] fn tokenize(&self) -> Self::Token<'_> { - ( - as alloy_sol_types::SolType>::tokenize(&self.index), - ) + () } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { @@ -7762,7 +7266,7 @@ function getHostChain(uint256 index) external view returns (HostChain memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getHostChainReturn = r.into(); + let r: getKmsSignersReturn = r.into(); r._0 }) } @@ -7774,7 +7278,7 @@ function getHostChain(uint256 index) external view returns (HostChain memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getHostChainReturn = r.into(); + let r: getKmsSignersReturn = r.into(); r._0 }) } @@ -7782,23 +7286,21 @@ function getHostChain(uint256 index) external view returns (HostChain memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getHostChains()` and selector `0x2585bb65`. + /**Function with signature `getKmsTxSenders()` and selector `0x7420f3d4`. ```solidity -function getHostChains() external view returns (HostChain[] memory); +function getKmsTxSenders() external view returns (address[] memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getHostChainsCall; + pub struct getKmsTxSendersCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getHostChains()`](getHostChainsCall) function. + ///Container type for the return parameters of the [`getKmsTxSenders()`](getKmsTxSendersCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getHostChainsReturn { + pub struct getKmsTxSendersReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec< - ::RustType, - >, + pub _0: alloy::sol_types::private::Vec, } #[allow( non_camel_case_types, @@ -7826,14 +7328,14 @@ function getHostChains() external view returns (HostChain[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getHostChainsCall) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getKmsTxSendersCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getHostChainsCall { + impl ::core::convert::From> for getKmsTxSendersCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -7842,13 +7344,11 @@ function getHostChains() external view returns (HostChain[] memory); { #[doc(hidden)] type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Array, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec< - ::RustType, - >, + alloy::sol_types::private::Vec, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -7863,34 +7363,38 @@ function getHostChains() external view returns (HostChain[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getHostChainsReturn) -> Self { + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getKmsTxSendersReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getHostChainsReturn { + impl ::core::convert::From> + for getKmsTxSendersReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getHostChainsCall { + impl alloy_sol_types::SolCall for getKmsTxSendersCall { type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; type Return = alloy::sol_types::private::Vec< - ::RustType, + alloy::sol_types::private::Address, >; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Array,); + type ReturnTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getHostChains()"; - const SELECTOR: [u8; 4] = [37u8, 133u8, 187u8, 101u8]; + const SIGNATURE: &'static str = "getKmsTxSenders()"; + const SELECTOR: [u8; 4] = [116u8, 32u8, 243u8, 212u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -7905,7 +7409,7 @@ function getHostChains() external view returns (HostChain[] memory); fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( as alloy_sol_types::SolType>::tokenize(ret), ) } @@ -7915,7 +7419,7 @@ function getHostChains() external view returns (HostChain[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getHostChainsReturn = r.into(); + let r: getKmsTxSendersReturn = r.into(); r._0 }) } @@ -7927,7 +7431,7 @@ function getHostChains() external view returns (HostChain[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getHostChainsReturn = r.into(); + let r: getKmsTxSendersReturn = r.into(); r._0 }) } @@ -7935,19 +7439,19 @@ function getHostChains() external view returns (HostChain[] memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getKmsGenThreshold()` and selector `0xb4722bc4`. + /**Function with signature `getMpcThreshold()` and selector `0x26cf5def`. ```solidity -function getKmsGenThreshold() external view returns (uint256); +function getMpcThreshold() external view returns (uint256); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsGenThresholdCall; + pub struct getMpcThresholdCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getKmsGenThreshold()`](getKmsGenThresholdCall) function. + ///Container type for the return parameters of the [`getMpcThreshold()`](getMpcThresholdCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsGenThresholdReturn { + pub struct getMpcThresholdReturn { #[allow(missing_docs)] pub _0: alloy::sol_types::private::primitives::aliases::U256, } @@ -7977,16 +7481,14 @@ function getKmsGenThreshold() external view returns (uint256); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getKmsGenThresholdCall) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getMpcThresholdCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getKmsGenThresholdCall { + impl ::core::convert::From> for getMpcThresholdCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -8012,23 +7514,23 @@ function getKmsGenThreshold() external view returns (uint256); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getKmsGenThresholdReturn) -> Self { + fn from(value: getMpcThresholdReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getKmsGenThresholdReturn { + for getMpcThresholdReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getKmsGenThresholdCall { + impl alloy_sol_types::SolCall for getMpcThresholdCall { type Parameters<'a> = (); type Token<'a> = = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getKmsGenThreshold()"; - const SELECTOR: [u8; 4] = [180u8, 114u8, 43u8, 196u8]; + const SIGNATURE: &'static str = "getMpcThreshold()"; + const SELECTOR: [u8; 4] = [38u8, 207u8, 93u8, 239u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -8064,7 +7566,7 @@ function getKmsGenThreshold() external view returns (uint256); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getKmsGenThresholdReturn = r.into(); + let r: getMpcThresholdReturn = r.into(); r._0 }) } @@ -8076,7 +7578,7 @@ function getKmsGenThreshold() external view returns (uint256); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getKmsGenThresholdReturn = r.into(); + let r: getMpcThresholdReturn = r.into(); r._0 }) } @@ -8084,24 +7586,21 @@ function getKmsGenThreshold() external view returns (uint256); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getKmsNode(address)` and selector `0xe3b2a874`. + /**Function with signature `getProtocolMetadata()` and selector `0x48144c61`. ```solidity -function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode memory); +function getProtocolMetadata() external view returns (ProtocolMetadata memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsNodeCall { - #[allow(missing_docs)] - pub kmsTxSenderAddress: alloy::sol_types::private::Address, - } + pub struct getProtocolMetadataCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getKmsNode(address)`](getKmsNodeCall) function. + ///Container type for the return parameters of the [`getProtocolMetadata()`](getProtocolMetadataCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsNodeReturn { + pub struct getProtocolMetadataReturn { #[allow(missing_docs)] - pub _0: ::RustType, + pub _0: ::RustType, } #[allow( non_camel_case_types, @@ -8113,9 +7612,9 @@ function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode m use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + type UnderlyingSolTuple<'a> = (); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + type UnderlyingRustTuple<'a> = (); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -8129,27 +7628,27 @@ function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode m } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getKmsNodeCall) -> Self { - (value.kmsTxSenderAddress,) + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getProtocolMetadataCall) -> Self { + () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getKmsNodeCall { + impl ::core::convert::From> + for getProtocolMetadataCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - kmsTxSenderAddress: tuple.0, - } + Self } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (KmsNode,); + type UnderlyingSolTuple<'a> = (ProtocolMetadata,); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - ::RustType, + ::RustType, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -8164,32 +7663,34 @@ function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode m } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getKmsNodeReturn) -> Self { + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getProtocolMetadataReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getKmsNodeReturn { + impl ::core::convert::From> + for getProtocolMetadataReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getKmsNodeCall { - type Parameters<'a> = (alloy::sol_types::sol_data::Address,); + impl alloy_sol_types::SolCall for getProtocolMetadataCall { + type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = ::RustType; - type ReturnTuple<'a> = (KmsNode,); + type Return = ::RustType; + type ReturnTuple<'a> = (ProtocolMetadata,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getKmsNode(address)"; - const SELECTOR: [u8; 4] = [227u8, 178u8, 168u8, 116u8]; + const SIGNATURE: &'static str = "getProtocolMetadata()"; + const SELECTOR: [u8; 4] = [72u8, 20u8, 76u8, 97u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -8198,15 +7699,11 @@ function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode m } #[inline] fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.kmsTxSenderAddress, - ), - ) + () } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) + (::tokenize(ret),) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { @@ -8214,7 +7711,7 @@ function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode m '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getKmsNodeReturn = r.into(); + let r: getProtocolMetadataReturn = r.into(); r._0 }) } @@ -8226,7 +7723,7 @@ function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode m '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getKmsNodeReturn = r.into(); + let r: getProtocolMetadataReturn = r.into(); r._0 }) } @@ -8234,21 +7731,21 @@ function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode m }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getKmsSigners()` and selector `0x7eaac8f2`. + /**Function with signature `getPublicDecryptionThreshold()` and selector `0x2a388998`. ```solidity -function getKmsSigners() external view returns (address[] memory); +function getPublicDecryptionThreshold() external view returns (uint256); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsSignersCall; + pub struct getPublicDecryptionThresholdCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getKmsSigners()`](getKmsSignersCall) function. + ///Container type for the return parameters of the [`getPublicDecryptionThreshold()`](getPublicDecryptionThresholdCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsSignersReturn { + pub struct getPublicDecryptionThresholdReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec, + pub _0: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -8276,14 +7773,16 @@ function getKmsSigners() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getKmsSignersCall) -> Self { + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getPublicDecryptionThresholdCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getKmsSignersCall { + impl ::core::convert::From> + for getPublicDecryptionThresholdCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -8291,12 +7790,10 @@ function getKmsSigners() external view returns (address[] memory); } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec, + alloy::sol_types::private::primitives::aliases::U256, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -8311,36 +7808,34 @@ function getKmsSigners() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getKmsSignersReturn) -> Self { + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getPublicDecryptionThresholdReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getKmsSignersReturn { + impl ::core::convert::From> + for getPublicDecryptionThresholdReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getKmsSignersCall { + impl alloy_sol_types::SolCall for getPublicDecryptionThresholdCall { type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, - >; - type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getKmsSigners()"; - const SELECTOR: [u8; 4] = [126u8, 170u8, 200u8, 242u8]; + const SIGNATURE: &'static str = "getPublicDecryptionThreshold()"; + const SELECTOR: [u8; 4] = [42u8, 56u8, 137u8, 152u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -8354,8 +7849,8 @@ function getKmsSigners() external view returns (address[] memory); #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( - as alloy_sol_types::SolType>::tokenize(ret), ) } @@ -8365,7 +7860,7 @@ function getKmsSigners() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getKmsSignersReturn = r.into(); + let r: getPublicDecryptionThresholdReturn = r.into(); r._0 }) } @@ -8377,7 +7872,7 @@ function getKmsSigners() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getKmsSignersReturn = r.into(); + let r: getPublicDecryptionThresholdReturn = r.into(); r._0 }) } @@ -8385,21 +7880,21 @@ function getKmsSigners() external view returns (address[] memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getKmsTxSenders()` and selector `0x7420f3d4`. + /**Function with signature `getUserDecryptionThreshold()` and selector `0xc2b42986`. ```solidity -function getKmsTxSenders() external view returns (address[] memory); +function getUserDecryptionThreshold() external view returns (uint256); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsTxSendersCall; + pub struct getUserDecryptionThresholdCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getKmsTxSenders()`](getKmsTxSendersCall) function. + ///Container type for the return parameters of the [`getUserDecryptionThreshold()`](getUserDecryptionThresholdCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsTxSendersReturn { + pub struct getUserDecryptionThresholdReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec, + pub _0: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -8427,14 +7922,16 @@ function getKmsTxSenders() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getKmsTxSendersCall) -> Self { + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getUserDecryptionThresholdCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getKmsTxSendersCall { + impl ::core::convert::From> + for getUserDecryptionThresholdCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -8442,12 +7939,10 @@ function getKmsTxSenders() external view returns (address[] memory); } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec, + alloy::sol_types::private::primitives::aliases::U256, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -8462,38 +7957,34 @@ function getKmsTxSenders() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getKmsTxSendersReturn) -> Self { + fn from(value: getUserDecryptionThresholdReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getKmsTxSendersReturn { + for getUserDecryptionThresholdReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getKmsTxSendersCall { + impl alloy_sol_types::SolCall for getUserDecryptionThresholdCall { type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, - >; - type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getKmsTxSenders()"; - const SELECTOR: [u8; 4] = [116u8, 32u8, 243u8, 212u8]; + const SIGNATURE: &'static str = "getUserDecryptionThreshold()"; + const SELECTOR: [u8; 4] = [194u8, 180u8, 41u8, 134u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -8507,8 +7998,8 @@ function getKmsTxSenders() external view returns (address[] memory); #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( - as alloy_sol_types::SolType>::tokenize(ret), ) } @@ -8518,7 +8009,7 @@ function getKmsTxSenders() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getKmsTxSendersReturn = r.into(); + let r: getUserDecryptionThresholdReturn = r.into(); r._0 }) } @@ -8530,7 +8021,7 @@ function getKmsTxSenders() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getKmsTxSendersReturn = r.into(); + let r: getUserDecryptionThresholdReturn = r.into(); r._0 }) } @@ -8538,21 +8029,21 @@ function getKmsTxSenders() external view returns (address[] memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getMpcThreshold()` and selector `0x26cf5def`. + /**Function with signature `getVersion()` and selector `0x0d8e6e2c`. ```solidity -function getMpcThreshold() external view returns (uint256); +function getVersion() external pure returns (string memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getMpcThresholdCall; + pub struct getVersionCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getMpcThreshold()`](getMpcThresholdCall) function. + ///Container type for the return parameters of the [`getVersion()`](getVersionCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getMpcThresholdReturn { + pub struct getVersionReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::primitives::aliases::U256, + pub _0: alloy::sol_types::private::String, } #[allow( non_camel_case_types, @@ -8580,14 +8071,14 @@ function getMpcThreshold() external view returns (uint256); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getMpcThresholdCall) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getVersionCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getMpcThresholdCall { + impl ::core::convert::From> for getVersionCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -8595,11 +8086,9 @@ function getMpcThreshold() external view returns (uint256); } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::String,); #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, - ); + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::String,); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -8613,34 +8102,32 @@ function getMpcThreshold() external view returns (uint256); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getMpcThresholdReturn) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getVersionReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getMpcThresholdReturn { + impl ::core::convert::From> for getVersionReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getMpcThresholdCall { + impl alloy_sol_types::SolCall for getVersionCall { type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::primitives::aliases::U256; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Return = alloy::sol_types::private::String; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::String,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getMpcThreshold()"; - const SELECTOR: [u8; 4] = [38u8, 207u8, 93u8, 239u8]; + const SIGNATURE: &'static str = "getVersion()"; + const SELECTOR: [u8; 4] = [13u8, 142u8, 110u8, 44u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -8654,9 +8141,9 @@ function getMpcThreshold() external view returns (uint256); #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( - as alloy_sol_types::SolType>::tokenize(ret), + ::tokenize( + ret, + ), ) } #[inline] @@ -8665,7 +8152,7 @@ function getMpcThreshold() external view returns (uint256); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getMpcThresholdReturn = r.into(); + let r: getVersionReturn = r.into(); r._0 }) } @@ -8677,7 +8164,7 @@ function getMpcThreshold() external view returns (uint256); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getMpcThresholdReturn = r.into(); + let r: getVersionReturn = r.into(); r._0 }) } @@ -8685,1011 +8172,36 @@ function getMpcThreshold() external view returns (uint256); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getProtocolMetadata()` and selector `0x48144c61`. + /**Function with signature `initializeFromEmptyProxy((string,string),uint256,uint256,uint256,uint256,(address,address,string,string)[],(address,address,bytes)[])` and selector `0xaeb1a21c`. ```solidity -function getProtocolMetadata() external view returns (ProtocolMetadata memory); +function initializeFromEmptyProxy(ProtocolMetadata memory initialMetadata, uint256 initialMpcThreshold, uint256 initialPublicDecryptionThreshold, uint256 initialUserDecryptionThreshold, uint256 initialKmsGenThreshold, KmsNode[] memory initialKmsNodes, Custodian[] memory initialCustodians) external; ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getProtocolMetadataCall; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getProtocolMetadata()`](getProtocolMetadataCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getProtocolMetadataReturn { + pub struct initializeFromEmptyProxyCall { #[allow(missing_docs)] - pub _0: ::RustType, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getProtocolMetadataCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getProtocolMetadataCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (ProtocolMetadata,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - ::RustType, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getProtocolMetadataReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getProtocolMetadataReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for getProtocolMetadataCall { - type Parameters<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = ::RustType; - type ReturnTuple<'a> = (ProtocolMetadata,); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getProtocolMetadata()"; - const SELECTOR: [u8; 4] = [72u8, 20u8, 76u8, 97u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) - } - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(|r| { - let r: getProtocolMetadataReturn = r.into(); - r._0 - }) - } - #[inline] - fn abi_decode_returns_validate( - data: &[u8], - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(|r| { - let r: getProtocolMetadataReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getPublicDecryptionThreshold()` and selector `0x2a388998`. -```solidity -function getPublicDecryptionThreshold() external view returns (uint256); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getPublicDecryptionThresholdCall; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getPublicDecryptionThreshold()`](getPublicDecryptionThresholdCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getPublicDecryptionThresholdReturn { + pub initialMetadata: ::RustType, #[allow(missing_docs)] - pub _0: alloy::sol_types::private::primitives::aliases::U256, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getPublicDecryptionThresholdCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getPublicDecryptionThresholdCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getPublicDecryptionThresholdReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getPublicDecryptionThresholdReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for getPublicDecryptionThresholdCall { - type Parameters<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::primitives::aliases::U256; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getPublicDecryptionThreshold()"; - const SELECTOR: [u8; 4] = [42u8, 56u8, 137u8, 152u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) - } - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(|r| { - let r: getPublicDecryptionThresholdReturn = r.into(); - r._0 - }) - } - #[inline] - fn abi_decode_returns_validate( - data: &[u8], - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(|r| { - let r: getPublicDecryptionThresholdReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getUserDecryptionThreshold()` and selector `0xc2b42986`. -```solidity -function getUserDecryptionThreshold() external view returns (uint256); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getUserDecryptionThresholdCall; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getUserDecryptionThreshold()`](getUserDecryptionThresholdCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getUserDecryptionThresholdReturn { - #[allow(missing_docs)] - pub _0: alloy::sol_types::private::primitives::aliases::U256, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getUserDecryptionThresholdCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getUserDecryptionThresholdCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getUserDecryptionThresholdReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getUserDecryptionThresholdReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for getUserDecryptionThresholdCall { - type Parameters<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::primitives::aliases::U256; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getUserDecryptionThreshold()"; - const SELECTOR: [u8; 4] = [194u8, 180u8, 41u8, 134u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) - } - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(|r| { - let r: getUserDecryptionThresholdReturn = r.into(); - r._0 - }) - } - #[inline] - fn abi_decode_returns_validate( - data: &[u8], - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(|r| { - let r: getUserDecryptionThresholdReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getVersion()` and selector `0x0d8e6e2c`. -```solidity -function getVersion() external pure returns (string memory); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getVersionCall; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getVersion()`](getVersionCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getVersionReturn { - #[allow(missing_docs)] - pub _0: alloy::sol_types::private::String, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getVersionCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for getVersionCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::String,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::String,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getVersionReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for getVersionReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for getVersionCall { - type Parameters<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::String; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::String,); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getVersion()"; - const SELECTOR: [u8; 4] = [13u8, 142u8, 110u8, 44u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - ::tokenize( - ret, - ), - ) - } - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(|r| { - let r: getVersionReturn = r.into(); - r._0 - }) - } - #[inline] - fn abi_decode_returns_validate( - data: &[u8], - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(|r| { - let r: getVersionReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `initializeFromEmptyProxy((string,string),uint256,uint256,uint256,uint256,(address,address,string,string)[],(address,address,string)[],(address,address,bytes)[])` and selector `0x8b8dd876`. -```solidity -function initializeFromEmptyProxy(ProtocolMetadata memory initialMetadata, uint256 initialMpcThreshold, uint256 initialPublicDecryptionThreshold, uint256 initialUserDecryptionThreshold, uint256 initialKmsGenThreshold, KmsNode[] memory initialKmsNodes, Coprocessor[] memory initialCoprocessors, Custodian[] memory initialCustodians) external; -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct initializeFromEmptyProxyCall { - #[allow(missing_docs)] - pub initialMetadata: ::RustType, - #[allow(missing_docs)] - pub initialMpcThreshold: alloy::sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub initialPublicDecryptionThreshold: alloy::sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub initialUserDecryptionThreshold: alloy::sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub initialKmsGenThreshold: alloy::sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub initialKmsNodes: alloy::sol_types::private::Vec< - ::RustType, - >, - #[allow(missing_docs)] - pub initialCoprocessors: alloy::sol_types::private::Vec< - ::RustType, - >, - #[allow(missing_docs)] - pub initialCustodians: alloy::sol_types::private::Vec< - ::RustType, - >, - } - ///Container type for the return parameters of the [`initializeFromEmptyProxy((string,string),uint256,uint256,uint256,uint256,(address,address,string,string)[],(address,address,string)[],(address,address,bytes)[])`](initializeFromEmptyProxyCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct initializeFromEmptyProxyReturn {} - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - ProtocolMetadata, - alloy::sol_types::sol_data::Uint<256>, - alloy::sol_types::sol_data::Uint<256>, - alloy::sol_types::sol_data::Uint<256>, - alloy::sol_types::sol_data::Uint<256>, - alloy::sol_types::sol_data::Array, - alloy::sol_types::sol_data::Array, - alloy::sol_types::sol_data::Array, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - ::RustType, - alloy::sol_types::private::primitives::aliases::U256, - alloy::sol_types::private::primitives::aliases::U256, - alloy::sol_types::private::primitives::aliases::U256, - alloy::sol_types::private::primitives::aliases::U256, - alloy::sol_types::private::Vec< - ::RustType, - >, - alloy::sol_types::private::Vec< - ::RustType, - >, - alloy::sol_types::private::Vec< - ::RustType, - >, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: initializeFromEmptyProxyCall) -> Self { - ( - value.initialMetadata, - value.initialMpcThreshold, - value.initialPublicDecryptionThreshold, - value.initialUserDecryptionThreshold, - value.initialKmsGenThreshold, - value.initialKmsNodes, - value.initialCoprocessors, - value.initialCustodians, - ) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for initializeFromEmptyProxyCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - initialMetadata: tuple.0, - initialMpcThreshold: tuple.1, - initialPublicDecryptionThreshold: tuple.2, - initialUserDecryptionThreshold: tuple.3, - initialKmsGenThreshold: tuple.4, - initialKmsNodes: tuple.5, - initialCoprocessors: tuple.6, - initialCustodians: tuple.7, - } - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: initializeFromEmptyProxyReturn) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for initializeFromEmptyProxyReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} - } - } - } - impl initializeFromEmptyProxyReturn { - fn _tokenize( - &self, - ) -> ::ReturnToken< - '_, - > { - () - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for initializeFromEmptyProxyCall { - type Parameters<'a> = ( - ProtocolMetadata, - alloy::sol_types::sol_data::Uint<256>, - alloy::sol_types::sol_data::Uint<256>, - alloy::sol_types::sol_data::Uint<256>, - alloy::sol_types::sol_data::Uint<256>, - alloy::sol_types::sol_data::Array, - alloy::sol_types::sol_data::Array, - alloy::sol_types::sol_data::Array, - ); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = initializeFromEmptyProxyReturn; - type ReturnTuple<'a> = (); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "initializeFromEmptyProxy((string,string),uint256,uint256,uint256,uint256,(address,address,string,string)[],(address,address,string)[],(address,address,bytes)[])"; - const SELECTOR: [u8; 4] = [139u8, 141u8, 216u8, 118u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.initialMetadata, - ), - as alloy_sol_types::SolType>::tokenize(&self.initialMpcThreshold), - as alloy_sol_types::SolType>::tokenize( - &self.initialPublicDecryptionThreshold, - ), - as alloy_sol_types::SolType>::tokenize( - &self.initialUserDecryptionThreshold, - ), - as alloy_sol_types::SolType>::tokenize( - &self.initialKmsGenThreshold, - ), - as alloy_sol_types::SolType>::tokenize(&self.initialKmsNodes), - as alloy_sol_types::SolType>::tokenize(&self.initialCoprocessors), - as alloy_sol_types::SolType>::tokenize(&self.initialCustodians), - ) - } - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - initializeFromEmptyProxyReturn::_tokenize(ret) - } - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(Into::into) - } - #[inline] - fn abi_decode_returns_validate( - data: &[u8], - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(Into::into) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `isCoprocessorSigner(address)` and selector `0x2b101c03`. -```solidity -function isCoprocessorSigner(address signerAddress) external view returns (bool); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct isCoprocessorSignerCall { + pub initialMpcThreshold: alloy::sol_types::private::primitives::aliases::U256, #[allow(missing_docs)] - pub signerAddress: alloy::sol_types::private::Address, - } - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`isCoprocessorSigner(address)`](isCoprocessorSignerCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct isCoprocessorSignerReturn { + pub initialPublicDecryptionThreshold: alloy::sol_types::private::primitives::aliases::U256, #[allow(missing_docs)] - pub _0: bool, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: isCoprocessorSignerCall) -> Self { - (value.signerAddress,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for isCoprocessorSignerCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { signerAddress: tuple.0 } - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Bool,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (bool,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: isCoprocessorSignerReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for isCoprocessorSignerReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for isCoprocessorSignerCall { - type Parameters<'a> = (alloy::sol_types::sol_data::Address,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = bool; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "isCoprocessorSigner(address)"; - const SELECTOR: [u8; 4] = [43u8, 16u8, 28u8, 3u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.signerAddress, - ), - ) - } - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - ::tokenize( - ret, - ), - ) - } - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(|r| { - let r: isCoprocessorSignerReturn = r.into(); - r._0 - }) - } - #[inline] - fn abi_decode_returns_validate( - data: &[u8], - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(|r| { - let r: isCoprocessorSignerReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `isCoprocessorTxSender(address)` and selector `0x2dd3edfe`. -```solidity -function isCoprocessorTxSender(address txSenderAddress) external view returns (bool); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct isCoprocessorTxSenderCall { + pub initialUserDecryptionThreshold: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub initialKmsGenThreshold: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub initialKmsNodes: alloy::sol_types::private::Vec< + ::RustType, + >, #[allow(missing_docs)] - pub txSenderAddress: alloy::sol_types::private::Address, + pub initialCustodians: alloy::sol_types::private::Vec< + ::RustType, + >, } - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`isCoprocessorTxSender(address)`](isCoprocessorTxSenderCall) function. + ///Container type for the return parameters of the [`initializeFromEmptyProxy((string,string),uint256,uint256,uint256,uint256,(address,address,string,string)[],(address,address,bytes)[])`](initializeFromEmptyProxyCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct isCoprocessorTxSenderReturn { - #[allow(missing_docs)] - pub _0: bool, - } + pub struct initializeFromEmptyProxyReturn {} #[allow( non_camel_case_types, non_snake_case, @@ -9700,9 +8212,29 @@ function isCoprocessorTxSender(address txSenderAddress) external view returns (b use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + type UnderlyingSolTuple<'a> = ( + ProtocolMetadata, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Array, + ); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + type UnderlyingRustTuple<'a> = ( + ::RustType, + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Vec< + ::RustType, + >, + alloy::sol_types::private::Vec< + ::RustType, + >, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -9716,26 +8248,42 @@ function isCoprocessorTxSender(address txSenderAddress) external view returns (b } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: isCoprocessorTxSenderCall) -> Self { - (value.txSenderAddress,) + fn from(value: initializeFromEmptyProxyCall) -> Self { + ( + value.initialMetadata, + value.initialMpcThreshold, + value.initialPublicDecryptionThreshold, + value.initialUserDecryptionThreshold, + value.initialKmsGenThreshold, + value.initialKmsNodes, + value.initialCustodians, + ) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for isCoprocessorTxSenderCall { + for initializeFromEmptyProxyCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { txSenderAddress: tuple.0 } + Self { + initialMetadata: tuple.0, + initialMpcThreshold: tuple.1, + initialPublicDecryptionThreshold: tuple.2, + initialUserDecryptionThreshold: tuple.3, + initialKmsGenThreshold: tuple.4, + initialKmsNodes: tuple.5, + initialCustodians: tuple.6, + } } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Bool,); + type UnderlyingSolTuple<'a> = (); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (bool,); + type UnderlyingRustTuple<'a> = (); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -9749,34 +8297,51 @@ function isCoprocessorTxSender(address txSenderAddress) external view returns (b } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: isCoprocessorTxSenderReturn) -> Self { - (value._0,) + fn from(value: initializeFromEmptyProxyReturn) -> Self { + () } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for isCoprocessorTxSenderReturn { + for initializeFromEmptyProxyReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } + Self {} } } } + impl initializeFromEmptyProxyReturn { + fn _tokenize( + &self, + ) -> ::ReturnToken< + '_, + > { + () + } + } #[automatically_derived] - impl alloy_sol_types::SolCall for isCoprocessorTxSenderCall { - type Parameters<'a> = (alloy::sol_types::sol_data::Address,); + impl alloy_sol_types::SolCall for initializeFromEmptyProxyCall { + type Parameters<'a> = ( + ProtocolMetadata, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Array, + ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = bool; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); + type Return = initializeFromEmptyProxyReturn; + type ReturnTuple<'a> = (); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "isCoprocessorTxSender(address)"; - const SELECTOR: [u8; 4] = [45u8, 211u8, 237u8, 254u8]; + const SIGNATURE: &'static str = "initializeFromEmptyProxy((string,string),uint256,uint256,uint256,uint256,(address,address,string,string)[],(address,address,bytes)[])"; + const SELECTOR: [u8; 4] = [174u8, 177u8, 162u8, 28u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -9786,28 +8351,45 @@ function isCoprocessorTxSender(address txSenderAddress) external view returns (b #[inline] fn tokenize(&self) -> Self::Token<'_> { ( - ::tokenize( - &self.txSenderAddress, + ::tokenize( + &self.initialMetadata, + ), + as alloy_sol_types::SolType>::tokenize(&self.initialMpcThreshold), + as alloy_sol_types::SolType>::tokenize( + &self.initialPublicDecryptionThreshold, + ), + as alloy_sol_types::SolType>::tokenize( + &self.initialUserDecryptionThreshold, + ), + as alloy_sol_types::SolType>::tokenize( + &self.initialKmsGenThreshold, ), + as alloy_sol_types::SolType>::tokenize(&self.initialKmsNodes), + as alloy_sol_types::SolType>::tokenize(&self.initialCustodians), ) } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - ::tokenize( - ret, - ), - ) + initializeFromEmptyProxyReturn::_tokenize(ret) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(|r| { - let r: isCoprocessorTxSenderReturn = r.into(); - r._0 - }) + .map(Into::into) } #[inline] fn abi_decode_returns_validate( @@ -9816,10 +8398,7 @@ function isCoprocessorTxSender(address txSenderAddress) external view returns (b as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(|r| { - let r: isCoprocessorTxSenderReturn = r.into(); - r._0 - }) + .map(Into::into) } } }; @@ -11309,6 +9888,143 @@ function proxiableUUID() external view returns (bytes32); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `reinitializeV2()` and selector `0xc4115874`. +```solidity +function reinitializeV2() external; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct reinitializeV2Call; + ///Container type for the return parameters of the [`reinitializeV2()`](reinitializeV2Call) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct reinitializeV2Return {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: reinitializeV2Call) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for reinitializeV2Call { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: reinitializeV2Return) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for reinitializeV2Return { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl reinitializeV2Return { + fn _tokenize( + &self, + ) -> ::ReturnToken<'_> { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for reinitializeV2Call { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = reinitializeV2Return; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "reinitializeV2()"; + const SELECTOR: [u8; 4] = [196u8, 17u8, 88u8, 116u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + reinitializeV2Return::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Function with signature `renounceOwnership()` and selector `0x715018a6`. ```solidity function renounceOwnership() external; @@ -12515,14 +11231,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external #[allow(missing_docs)] addHostChain(addHostChainCall), #[allow(missing_docs)] - getCoprocessor(getCoprocessorCall), - #[allow(missing_docs)] - getCoprocessorMajorityThreshold(getCoprocessorMajorityThresholdCall), - #[allow(missing_docs)] - getCoprocessorSigners(getCoprocessorSignersCall), - #[allow(missing_docs)] - getCoprocessorTxSenders(getCoprocessorTxSendersCall), - #[allow(missing_docs)] getCustodian(getCustodianCall), #[allow(missing_docs)] getCustodianSigners(getCustodianSignersCall), @@ -12553,10 +11261,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external #[allow(missing_docs)] initializeFromEmptyProxy(initializeFromEmptyProxyCall), #[allow(missing_docs)] - isCoprocessorSigner(isCoprocessorSignerCall), - #[allow(missing_docs)] - isCoprocessorTxSender(isCoprocessorTxSenderCall), - #[allow(missing_docs)] isCustodianSigner(isCustodianSignerCall), #[allow(missing_docs)] isCustodianTxSender(isCustodianTxSenderCall), @@ -12577,6 +11281,8 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external #[allow(missing_docs)] proxiableUUID(proxiableUUIDCall), #[allow(missing_docs)] + reinitializeV2(reinitializeV2Call), + #[allow(missing_docs)] renounceOwnership(renounceOwnershipCall), #[allow(missing_docs)] transferOwnership(transferOwnershipCall), @@ -12604,21 +11310,17 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external pub const SELECTORS: &'static [[u8; 4usize]] = &[ [7u8, 36u8, 221u8, 35u8], [13u8, 142u8, 110u8, 44u8], - [30u8, 165u8, 189u8, 66u8], [32u8, 61u8, 1u8, 20u8], [37u8, 133u8, 187u8, 101u8], [38u8, 207u8, 93u8, 239u8], [42u8, 56u8, 137u8, 152u8], [42u8, 139u8, 157u8, 233u8], - [43u8, 16u8, 28u8, 3u8], - [45u8, 211u8, 237u8, 254u8], [46u8, 45u8, 58u8, 130u8], [70u8, 251u8, 246u8, 142u8], [72u8, 20u8, 76u8, 97u8], [79u8, 30u8, 242u8, 134u8], [82u8, 209u8, 144u8, 45u8], [91u8, 172u8, 231u8, 255u8], - [103u8, 153u8, 239u8, 82u8], [113u8, 80u8, 24u8, 166u8], [116u8, 32u8, 243u8, 212u8], [119u8, 45u8, 47u8, 233u8], @@ -12626,15 +11328,15 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external [121u8, 186u8, 80u8, 151u8], [126u8, 170u8, 200u8, 242u8], [136u8, 45u8, 125u8, 211u8], - [139u8, 141u8, 216u8, 118u8], [141u8, 165u8, 203u8, 91u8], - [145u8, 100u8, 208u8, 174u8], [154u8, 90u8, 59u8, 196u8], [173u8, 60u8, 177u8, 204u8], + [174u8, 177u8, 162u8, 28u8], [180u8, 114u8, 43u8, 196u8], [186u8, 31u8, 49u8, 210u8], [191u8, 243u8, 170u8, 186u8], [194u8, 180u8, 41u8, 134u8], + [196u8, 17u8, 88u8, 116u8], [200u8, 11u8, 51u8, 202u8], [203u8, 90u8, 167u8, 233u8], [209u8, 15u8, 127u8, 249u8], @@ -12642,7 +11344,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external [227u8, 178u8, 168u8, 116u8], [229u8, 39u8, 94u8, 175u8], [235u8, 132u8, 60u8, 246u8], - [239u8, 105u8, 151u8, 249u8], [242u8, 253u8, 227u8, 139u8], ]; } @@ -12650,7 +11351,7 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external impl alloy_sol_types::SolInterface for GatewayConfigCalls { const NAME: &'static str = "GatewayConfigCalls"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 42usize; + const COUNT: usize = 37usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -12663,18 +11364,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external Self::addHostChain(_) => { ::SELECTOR } - Self::getCoprocessor(_) => { - ::SELECTOR - } - Self::getCoprocessorMajorityThreshold(_) => { - ::SELECTOR - } - Self::getCoprocessorSigners(_) => { - ::SELECTOR - } - Self::getCoprocessorTxSenders(_) => { - ::SELECTOR - } Self::getCustodian(_) => { ::SELECTOR } @@ -12720,12 +11409,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external Self::initializeFromEmptyProxy(_) => { ::SELECTOR } - Self::isCoprocessorSigner(_) => { - ::SELECTOR - } - Self::isCoprocessorTxSender(_) => { - ::SELECTOR - } Self::isCustodianSigner(_) => { ::SELECTOR } @@ -12752,6 +11435,9 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external Self::proxiableUUID(_) => { ::SELECTOR } + Self::reinitializeV2(_) => { + ::SELECTOR + } Self::renounceOwnership(_) => { ::SELECTOR } @@ -12817,17 +11503,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } getVersion }, - { - fn getCoprocessorTxSenders( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(GatewayConfigCalls::getCoprocessorTxSenders) - } - getCoprocessorTxSenders - }, { fn isKmsSigner( data: &[u8], @@ -12883,28 +11558,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } getCustodianTxSenders }, - { - fn isCoprocessorSigner( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(GatewayConfigCalls::isCoprocessorSigner) - } - isCoprocessorSigner - }, - { - fn isCoprocessorTxSender( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(GatewayConfigCalls::isCoprocessorTxSender) - } - isCoprocessorTxSender - }, { fn updatePublicDecryptionThreshold( data: &[u8], @@ -12969,17 +11622,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } isCustodianTxSender }, - { - fn getCoprocessorMajorityThreshold( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(GatewayConfigCalls::getCoprocessorMajorityThreshold) - } - getCoprocessorMajorityThreshold - }, { fn renounceOwnership( data: &[u8], @@ -13057,17 +11699,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } isCustodianSigner }, - { - fn initializeFromEmptyProxy( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(GatewayConfigCalls::initializeFromEmptyProxy) - } - initializeFromEmptyProxy - }, { fn owner( data: &[u8], @@ -13077,17 +11708,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } owner }, - { - fn getCoprocessorSigners( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(GatewayConfigCalls::getCoprocessorSigners) - } - getCoprocessorSigners - }, { fn pauseAllGatewayContracts( data: &[u8], @@ -13110,6 +11730,17 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } UPGRADE_INTERFACE_VERSION }, + { + fn initializeFromEmptyProxy( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(GatewayConfigCalls::initializeFromEmptyProxy) + } + initializeFromEmptyProxy + }, { fn getKmsGenThreshold( data: &[u8], @@ -13154,6 +11785,17 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } getUserDecryptionThreshold }, + { + fn reinitializeV2( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(GatewayConfigCalls::reinitializeV2) + } + reinitializeV2 + }, { fn addHostChain( data: &[u8], @@ -13231,17 +11873,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } updateUserDecryptionThreshold }, - { - fn getCoprocessor( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(GatewayConfigCalls::getCoprocessor) - } - getCoprocessor - }, { fn transferOwnership( data: &[u8], @@ -13295,17 +11926,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } getVersion }, - { - fn getCoprocessorTxSenders( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(GatewayConfigCalls::getCoprocessorTxSenders) - } - getCoprocessorTxSenders - }, { fn isKmsSigner( data: &[u8], @@ -13361,28 +11981,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } getCustodianTxSenders }, - { - fn isCoprocessorSigner( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(GatewayConfigCalls::isCoprocessorSigner) - } - isCoprocessorSigner - }, - { - fn isCoprocessorTxSender( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(GatewayConfigCalls::isCoprocessorTxSender) - } - isCoprocessorTxSender - }, { fn updatePublicDecryptionThreshold( data: &[u8], @@ -13449,17 +12047,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } isCustodianTxSender }, - { - fn getCoprocessorMajorityThreshold( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(GatewayConfigCalls::getCoprocessorMajorityThreshold) - } - getCoprocessorMajorityThreshold - }, { fn renounceOwnership( data: &[u8], @@ -13537,17 +12124,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } isCustodianSigner }, - { - fn initializeFromEmptyProxy( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(GatewayConfigCalls::initializeFromEmptyProxy) - } - initializeFromEmptyProxy - }, { fn owner( data: &[u8], @@ -13559,17 +12135,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } owner }, - { - fn getCoprocessorSigners( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(GatewayConfigCalls::getCoprocessorSigners) - } - getCoprocessorSigners - }, { fn pauseAllGatewayContracts( data: &[u8], @@ -13592,6 +12157,17 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } UPGRADE_INTERFACE_VERSION }, + { + fn initializeFromEmptyProxy( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(GatewayConfigCalls::initializeFromEmptyProxy) + } + initializeFromEmptyProxy + }, { fn getKmsGenThreshold( data: &[u8], @@ -13636,6 +12212,17 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } getUserDecryptionThreshold }, + { + fn reinitializeV2( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(GatewayConfigCalls::reinitializeV2) + } + reinitializeV2 + }, { fn addHostChain( data: &[u8], @@ -13713,17 +12300,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } updateUserDecryptionThreshold }, - { - fn getCoprocessor( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(GatewayConfigCalls::getCoprocessor) - } - getCoprocessor - }, { fn transferOwnership( data: &[u8], @@ -13764,26 +12340,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external inner, ) } - Self::getCoprocessor(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::getCoprocessorMajorityThreshold(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::getCoprocessorSigners(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::getCoprocessorTxSenders(inner) => { - ::abi_encoded_size( - inner, - ) - } Self::getCustodian(inner) => { ::abi_encoded_size( inner, @@ -13855,16 +12411,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external inner, ) } - Self::isCoprocessorSigner(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::isCoprocessorTxSender(inner) => { - ::abi_encoded_size( - inner, - ) - } Self::isCustodianSigner(inner) => { ::abi_encoded_size( inner, @@ -13911,6 +12457,11 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external inner, ) } + Self::reinitializeV2(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::renounceOwnership(inner) => { ::abi_encoded_size( inner, @@ -13974,30 +12525,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external out, ) } - Self::getCoprocessor(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::getCoprocessorMajorityThreshold(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::getCoprocessorSigners(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::getCoprocessorTxSenders(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } Self::getCustodian(inner) => { ::abi_encode_raw( inner, @@ -14088,18 +12615,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external out, ) } - Self::isCoprocessorSigner(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::isCoprocessorTxSender(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } Self::isCustodianSigner(inner) => { ::abi_encode_raw( inner, @@ -14157,6 +12672,12 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external out, ) } + Self::reinitializeV2(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::renounceOwnership(inner) => { ::abi_encode_raw( inner, @@ -14221,8 +12742,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external #[allow(missing_docs)] ERC1967NonPayable(ERC1967NonPayable), #[allow(missing_docs)] - EmptyCoprocessors(EmptyCoprocessors), - #[allow(missing_docs)] EmptyCustodians(EmptyCustodians), #[allow(missing_docs)] EmptyKmsNodes(EmptyKmsNodes), @@ -14283,7 +12802,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external [76u8, 156u8, 140u8, 227u8], [111u8, 79u8, 115u8, 31u8], [132u8, 32u8, 143u8, 35u8], - [138u8, 240u8, 130u8, 239u8], [144u8, 126u8, 102u8, 129u8], [150u8, 165u8, 104u8, 40u8], [153u8, 150u8, 179u8, 21u8], @@ -14303,7 +12821,7 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external impl alloy_sol_types::SolInterface for GatewayConfigErrors { const NAME: &'static str = "GatewayConfigErrors"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 25usize; + const COUNT: usize = 24usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -14319,9 +12837,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external Self::ERC1967NonPayable(_) => { ::SELECTOR } - Self::EmptyCoprocessors(_) => { - ::SELECTOR - } Self::EmptyCustodians(_) => { ::SELECTOR } @@ -14520,17 +13035,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } InvalidHighPublicDecryptionThreshold }, - { - fn EmptyCoprocessors( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(GatewayConfigErrors::EmptyCoprocessors) - } - EmptyCoprocessors - }, { fn InvalidHighMpcThreshold( data: &[u8], @@ -14817,17 +13321,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } InvalidHighPublicDecryptionThreshold }, - { - fn EmptyCoprocessors( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(GatewayConfigErrors::EmptyCoprocessors) - } - EmptyCoprocessors - }, { fn InvalidHighMpcThreshold( data: &[u8], @@ -15007,11 +13500,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external inner, ) } - Self::EmptyCoprocessors(inner) => { - ::abi_encoded_size( - inner, - ) - } Self::EmptyCustodians(inner) => { ::abi_encoded_size( inner, @@ -15135,12 +13623,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external out, ) } - Self::EmptyCoprocessors(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } Self::EmptyCustodians(inner) => { ::abi_encode_raw( inner, @@ -15317,11 +13799,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external 185u8, 205u8, 13u8, 226u8, 211u8, 250u8, 31u8, 174u8, 244u8, 32u8, 191u8, 231u8, 145u8, 216u8, 195u8, 98u8, 215u8, 101u8, 226u8, 39u8, 0u8, ], - [ - 58u8, 124u8, 84u8, 177u8, 25u8, 93u8, 68u8, 162u8, 136u8, 249u8, 195u8, - 201u8, 160u8, 103u8, 154u8, 237u8, 147u8, 37u8, 6u8, 142u8, 13u8, 13u8, - 91u8, 105u8, 233u8, 96u8, 71u8, 53u8, 92u8, 199u8, 23u8, 69u8, - ], [ 102u8, 118u8, 147u8, 65u8, 239u8, 253u8, 38u8, 143u8, 196u8, 233u8, 169u8, 200u8, 242u8, 123u8, 252u8, 150u8, 133u8, 7u8, 181u8, 25u8, 176u8, @@ -15337,6 +13814,11 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external 31u8, 208u8, 164u8, 242u8, 132u8, 25u8, 73u8, 127u8, 151u8, 34u8, 163u8, 218u8, 175u8, 227u8, 180u8, 24u8, 111u8, 107u8, 100u8, 87u8, 224u8, ], + [ + 171u8, 88u8, 171u8, 147u8, 136u8, 146u8, 161u8, 133u8, 93u8, 9u8, 199u8, + 193u8, 57u8, 12u8, 171u8, 212u8, 202u8, 4u8, 5u8, 234u8, 171u8, 50u8, + 44u8, 90u8, 130u8, 87u8, 7u8, 112u8, 167u8, 25u8, 130u8, 110u8, + ], [ 188u8, 124u8, 215u8, 90u8, 32u8, 238u8, 39u8, 253u8, 154u8, 222u8, 186u8, 179u8, 32u8, 65u8, 247u8, 85u8, 33u8, 77u8, 188u8, 107u8, 255u8, 169u8, @@ -15742,35 +14224,6 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ ) -> alloy_contract::SolCallBuilder<&P, addHostChainCall, N> { self.call_builder(&addHostChainCall { hostChain }) } - ///Creates a new call builder for the [`getCoprocessor`] function. - pub fn getCoprocessor( - &self, - coprocessorTxSenderAddress: alloy::sol_types::private::Address, - ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorCall, N> { - self.call_builder( - &getCoprocessorCall { - coprocessorTxSenderAddress, - }, - ) - } - ///Creates a new call builder for the [`getCoprocessorMajorityThreshold`] function. - pub fn getCoprocessorMajorityThreshold( - &self, - ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorMajorityThresholdCall, N> { - self.call_builder(&getCoprocessorMajorityThresholdCall) - } - ///Creates a new call builder for the [`getCoprocessorSigners`] function. - pub fn getCoprocessorSigners( - &self, - ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorSignersCall, N> { - self.call_builder(&getCoprocessorSignersCall) - } - ///Creates a new call builder for the [`getCoprocessorTxSenders`] function. - pub fn getCoprocessorTxSenders( - &self, - ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorTxSendersCall, N> { - self.call_builder(&getCoprocessorTxSendersCall) - } ///Creates a new call builder for the [`getCustodian`] function. pub fn getCustodian( &self, @@ -15877,9 +14330,6 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ initialKmsNodes: alloy::sol_types::private::Vec< ::RustType, >, - initialCoprocessors: alloy::sol_types::private::Vec< - ::RustType, - >, initialCustodians: alloy::sol_types::private::Vec< ::RustType, >, @@ -15892,33 +14342,10 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ initialUserDecryptionThreshold, initialKmsGenThreshold, initialKmsNodes, - initialCoprocessors, initialCustodians, }, ) } - ///Creates a new call builder for the [`isCoprocessorSigner`] function. - pub fn isCoprocessorSigner( - &self, - signerAddress: alloy::sol_types::private::Address, - ) -> alloy_contract::SolCallBuilder<&P, isCoprocessorSignerCall, N> { - self.call_builder( - &isCoprocessorSignerCall { - signerAddress, - }, - ) - } - ///Creates a new call builder for the [`isCoprocessorTxSender`] function. - pub fn isCoprocessorTxSender( - &self, - txSenderAddress: alloy::sol_types::private::Address, - ) -> alloy_contract::SolCallBuilder<&P, isCoprocessorTxSenderCall, N> { - self.call_builder( - &isCoprocessorTxSenderCall { - txSenderAddress, - }, - ) - } ///Creates a new call builder for the [`isCustodianSigner`] function. pub fn isCustodianSigner( &self, @@ -15999,6 +14426,12 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ ) -> alloy_contract::SolCallBuilder<&P, proxiableUUIDCall, N> { self.call_builder(&proxiableUUIDCall) } + ///Creates a new call builder for the [`reinitializeV2`] function. + pub fn reinitializeV2( + &self, + ) -> alloy_contract::SolCallBuilder<&P, reinitializeV2Call, N> { + self.call_builder(&reinitializeV2Call) + } ///Creates a new call builder for the [`renounceOwnership`] function. pub fn renounceOwnership( &self, diff --git a/gateway-contracts/rust_bindings/src/gateway_config_checks.rs b/gateway-contracts/rust_bindings/src/gateway_config_checks.rs index 501cbebf55..324f006de0 100644 --- a/gateway-contracts/rust_bindings/src/gateway_config_checks.rs +++ b/gateway-contracts/rust_bindings/src/gateway_config_checks.rs @@ -4,8 +4,6 @@ Generated by the following Solidity interface... ```solidity interface GatewayConfigChecks { error HostChainNotRegistered(uint256 chainId); - error NotCoprocessorSigner(address signerAddress); - error NotCoprocessorTxSender(address txSenderAddress); error NotCustodianSigner(address signerAddress); error NotCustodianTxSender(address txSenderAddress); error NotKmsSigner(address signerAddress); @@ -27,28 +25,6 @@ interface GatewayConfigChecks { } ] }, - { - "type": "error", - "name": "NotCoprocessorSigner", - "inputs": [ - { - "name": "signerAddress", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "NotCoprocessorTxSender", - "inputs": [ - { - "name": "txSenderAddress", - "type": "address", - "internalType": "address" - } - ] - }, { "type": "error", "name": "NotCustodianSigner", @@ -209,166 +185,6 @@ error HostChainNotRegistered(uint256 chainId); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `NotCoprocessorSigner(address)` and selector `0x26cd75dc`. -```solidity -error NotCoprocessorSigner(address signerAddress); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct NotCoprocessorSigner { - #[allow(missing_docs)] - pub signerAddress: alloy::sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: NotCoprocessorSigner) -> Self { - (value.signerAddress,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for NotCoprocessorSigner { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { signerAddress: tuple.0 } - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for NotCoprocessorSigner { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "NotCoprocessorSigner(address)"; - const SELECTOR: [u8; 4] = [38u8, 205u8, 117u8, 220u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.signerAddress, - ), - ) - } - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(Self::new) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `NotCoprocessorTxSender(address)` and selector `0x52d725f5`. -```solidity -error NotCoprocessorTxSender(address txSenderAddress); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct NotCoprocessorTxSender { - #[allow(missing_docs)] - pub txSenderAddress: alloy::sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: NotCoprocessorTxSender) -> Self { - (value.txSenderAddress,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for NotCoprocessorTxSender { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { txSenderAddress: tuple.0 } - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for NotCoprocessorTxSender { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "NotCoprocessorTxSender(address)"; - const SELECTOR: [u8; 4] = [82u8, 215u8, 37u8, 245u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.txSenderAddress, - ), - ) - } - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(Self::new) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Custom error with signature `NotCustodianSigner(address)` and selector `0x391672a7`. ```solidity error NotCustodianSigner(address signerAddress); @@ -694,10 +510,6 @@ error NotKmsTxSender(address txSenderAddress); #[allow(missing_docs)] HostChainNotRegistered(HostChainNotRegistered), #[allow(missing_docs)] - NotCoprocessorSigner(NotCoprocessorSigner), - #[allow(missing_docs)] - NotCoprocessorTxSender(NotCoprocessorTxSender), - #[allow(missing_docs)] NotCustodianSigner(NotCustodianSigner), #[allow(missing_docs)] NotCustodianTxSender(NotCustodianTxSender), @@ -715,10 +527,8 @@ error NotKmsTxSender(address txSenderAddress); /// /// Prefer using `SolInterface` methods instead. pub const SELECTORS: &'static [[u8; 4usize]] = &[ - [38u8, 205u8, 117u8, 220u8], [42u8, 124u8, 110u8, 246u8], [57u8, 22u8, 114u8, 167u8], - [82u8, 215u8, 37u8, 245u8], [174u8, 232u8, 99u8, 35u8], [182u8, 103u8, 156u8, 59u8], [249u8, 36u8, 160u8, 207u8], @@ -728,19 +538,13 @@ error NotKmsTxSender(address txSenderAddress); impl alloy_sol_types::SolInterface for GatewayConfigChecksErrors { const NAME: &'static str = "GatewayConfigChecksErrors"; const MIN_DATA_LENGTH: usize = 32usize; - const COUNT: usize = 7usize; + const COUNT: usize = 5usize; #[inline] fn selector(&self) -> [u8; 4] { match self { Self::HostChainNotRegistered(_) => { ::SELECTOR } - Self::NotCoprocessorSigner(_) => { - ::SELECTOR - } - Self::NotCoprocessorTxSender(_) => { - ::SELECTOR - } Self::NotCustodianSigner(_) => { ::SELECTOR } @@ -772,17 +576,6 @@ error NotKmsTxSender(address txSenderAddress); static DECODE_SHIMS: &[fn( &[u8], ) -> alloy_sol_types::Result] = &[ - { - fn NotCoprocessorSigner( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(GatewayConfigChecksErrors::NotCoprocessorSigner) - } - NotCoprocessorSigner - }, { fn NotKmsSigner( data: &[u8], @@ -803,17 +596,6 @@ error NotKmsTxSender(address txSenderAddress); } NotCustodianSigner }, - { - fn NotCoprocessorTxSender( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(GatewayConfigChecksErrors::NotCoprocessorTxSender) - } - NotCoprocessorTxSender - }, { fn NotKmsTxSender( data: &[u8], @@ -867,17 +649,6 @@ error NotKmsTxSender(address txSenderAddress); static DECODE_VALIDATE_SHIMS: &[fn( &[u8], ) -> alloy_sol_types::Result] = &[ - { - fn NotCoprocessorSigner( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(GatewayConfigChecksErrors::NotCoprocessorSigner) - } - NotCoprocessorSigner - }, { fn NotKmsSigner( data: &[u8], @@ -900,17 +671,6 @@ error NotKmsTxSender(address txSenderAddress); } NotCustodianSigner }, - { - fn NotCoprocessorTxSender( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(GatewayConfigChecksErrors::NotCoprocessorTxSender) - } - NotCoprocessorTxSender - }, { fn NotKmsTxSender( data: &[u8], @@ -963,16 +723,6 @@ error NotKmsTxSender(address txSenderAddress); inner, ) } - Self::NotCoprocessorSigner(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::NotCoprocessorTxSender(inner) => { - ::abi_encoded_size( - inner, - ) - } Self::NotCustodianSigner(inner) => { ::abi_encoded_size( inner, @@ -1002,18 +752,6 @@ error NotKmsTxSender(address txSenderAddress); out, ) } - Self::NotCoprocessorSigner(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::NotCoprocessorTxSender(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } Self::NotCustodianSigner(inner) => { ::abi_encode_raw( inner, diff --git a/gateway-contracts/rust_bindings/src/i_ciphertext_commits.rs b/gateway-contracts/rust_bindings/src/i_ciphertext_commits.rs index c23bc8e3e9..f7905b41f1 100644 --- a/gateway-contracts/rust_bindings/src/i_ciphertext_commits.rs +++ b/gateway-contracts/rust_bindings/src/i_ciphertext_commits.rs @@ -3,27 +3,31 @@ Generated by the following Solidity interface... ```solidity interface ICiphertextCommits { + type ContextStatus is uint8; struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextDigest; address[] coprocessorTxSenderAddresses; + uint256 contextId; } struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphertextDigest; address[] coprocessorTxSenderAddresses; + uint256 contextId; } error CiphertextMaterialNotFound(bytes32 ctHandle); error CoprocessorAlreadyAdded(bytes32 ctHandle, address txSender); + error InvalidCoprocessorContextAddCiphertext(bytes32 ctHandle, uint256 contextId, ContextStatus contextStatus); - event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, bytes32 snsCiphertextDigest, address[] coprocessorTxSenders); + event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, bytes32 snsCiphertextDigest, uint256 coprocessorContextId); function addCiphertextMaterial(bytes32 ctHandle, uint256 keyId, bytes32 ciphertextDigest, bytes32 snsCiphertextDigest) external; - function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external view returns (address[] memory); function getCiphertextMaterials(bytes32[] memory ctHandles) external view returns (CiphertextMaterial[] memory); + function getConsensusCoprocessorTxSenders(bytes32 ctHandle) external view returns (address[] memory, uint256 contextId, bool); function getSnsCiphertextMaterials(bytes32[] memory ctHandles) external view returns (SnsCiphertextMaterial[] memory); function getVersion() external pure returns (string memory); function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool); @@ -61,25 +65,6 @@ interface ICiphertextCommits { "outputs": [], "stateMutability": "nonpayable" }, - { - "type": "function", - "name": "getAddCiphertextMaterialConsensusTxSenders", - "inputs": [ - { - "name": "ctHandle", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "address[]", - "internalType": "address[]" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "getCiphertextMaterials", @@ -115,12 +100,46 @@ interface ICiphertextCommits { "name": "coprocessorTxSenderAddresses", "type": "address[]", "internalType": "address[]" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" } ] } ], "stateMutability": "view" }, + { + "type": "function", + "name": "getConsensusCoprocessorTxSenders", + "inputs": [ + { + "name": "ctHandle", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "getSnsCiphertextMaterials", @@ -156,6 +175,11 @@ interface ICiphertextCommits { "name": "coprocessorTxSenderAddresses", "type": "address[]", "internalType": "address[]" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" } ] } @@ -217,10 +241,10 @@ interface ICiphertextCommits { "internalType": "bytes32" }, { - "name": "coprocessorTxSenders", - "type": "address[]", + "name": "coprocessorContextId", + "type": "uint256", "indexed": false, - "internalType": "address[]" + "internalType": "uint256" } ], "anonymous": false @@ -251,6 +275,27 @@ interface ICiphertextCommits { "internalType": "address" } ] + }, + { + "type": "error", + "name": "InvalidCoprocessorContextAddCiphertext", + "inputs": [ + { + "name": "ctHandle", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contextStatus", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ] } ] ```*/ @@ -286,8 +331,146 @@ pub mod ICiphertextCommits { ); #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextStatus(u8); + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::private::SolTypeValue for u8 { + #[inline] + fn stv_to_tokens( + &self, + ) -> as alloy_sol_types::SolType>::Token<'_> { + alloy_sol_types::private::SolTypeValue::< + alloy::sol_types::sol_data::Uint<8>, + >::stv_to_tokens(self) + } + #[inline] + fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { + as alloy_sol_types::SolType>::tokenize(self) + .0 + } + #[inline] + fn stv_abi_encode_packed_to( + &self, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::SolType>::abi_encode_packed_to(self, out) + } + #[inline] + fn stv_abi_packed_encoded_size(&self) -> usize { + as alloy_sol_types::SolType>::abi_encoded_size(self) + } + } + #[automatically_derived] + impl ContextStatus { + /// The Solidity type name. + pub const NAME: &'static str = stringify!(@ name); + /// Convert from the underlying value type. + #[inline] + pub const fn from_underlying(value: u8) -> Self { + Self(value) + } + /// Return the underlying value. + #[inline] + pub const fn into_underlying(self) -> u8 { + self.0 + } + /// Return the single encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode(&self) -> alloy_sol_types::private::Vec { + ::abi_encode(&self.0) + } + /// Return the packed encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode_packed(&self) -> alloy_sol_types::private::Vec { + ::abi_encode_packed(&self.0) + } + } + #[automatically_derived] + impl From for ContextStatus { + fn from(value: u8) -> Self { + Self::from_underlying(value) + } + } + #[automatically_derived] + impl From for u8 { + fn from(value: ContextStatus) -> Self { + value.into_underlying() + } + } + #[automatically_derived] + impl alloy_sol_types::SolType for ContextStatus { + type RustType = u8; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SOL_NAME: &'static str = Self::NAME; + const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; + const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; + #[inline] + fn valid_token(token: &Self::Token<'_>) -> bool { + Self::type_check(token).is_ok() + } + #[inline] + fn type_check(token: &Self::Token<'_>) -> alloy_sol_types::Result<()> { + as alloy_sol_types::SolType>::type_check(token) + } + #[inline] + fn detokenize(token: Self::Token<'_>) -> Self::RustType { + as alloy_sol_types::SolType>::detokenize(token) + } + } + #[automatically_derived] + impl alloy_sol_types::EventTopic for ContextStatus { + #[inline] + fn topic_preimage_length(rust: &Self::RustType) -> usize { + as alloy_sol_types::EventTopic>::topic_preimage_length(rust) + } + #[inline] + fn encode_topic_preimage( + rust: &Self::RustType, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::EventTopic>::encode_topic_preimage(rust, out) + } + #[inline] + fn encode_topic( + rust: &Self::RustType, + ) -> alloy_sol_types::abi::token::WordToken { + as alloy_sol_types::EventTopic>::encode_topic(rust) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**```solidity -struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextDigest; address[] coprocessorTxSenderAddresses; } +struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextDigest; address[] coprocessorTxSenderAddresses; uint256 contextId; } ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] @@ -302,6 +485,8 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD pub coprocessorTxSenderAddresses: alloy::sol_types::private::Vec< alloy::sol_types::private::Address, >, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -317,6 +502,7 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD alloy::sol_types::sol_data::Uint<256>, alloy::sol_types::sol_data::FixedBytes<32>, alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Uint<256>, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( @@ -324,6 +510,7 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD alloy::sol_types::private::primitives::aliases::U256, alloy::sol_types::private::FixedBytes<32>, alloy::sol_types::private::Vec, + alloy::sol_types::private::primitives::aliases::U256, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -345,6 +532,7 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD value.keyId, value.ciphertextDigest, value.coprocessorTxSenderAddresses, + value.contextId, ) } } @@ -357,6 +545,7 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD keyId: tuple.1, ciphertextDigest: tuple.2, coprocessorTxSenderAddresses: tuple.3, + contextId: tuple.4, } } } @@ -383,6 +572,9 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD > as alloy_sol_types::SolType>::tokenize( &self.coprocessorTxSenderAddresses, ), + as alloy_sol_types::SolType>::tokenize(&self.contextId), ) } #[inline] @@ -457,7 +649,7 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD #[inline] fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { alloy_sol_types::private::Cow::Borrowed( - "CiphertextMaterial(bytes32 ctHandle,uint256 keyId,bytes32 ciphertextDigest,address[] coprocessorTxSenderAddresses)", + "CiphertextMaterial(bytes32 ctHandle,uint256 keyId,bytes32 ciphertextDigest,address[] coprocessorTxSenderAddresses,uint256 contextId)", ) } #[inline] @@ -493,6 +685,10 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD &self.coprocessorTxSenderAddresses, ) .0, + as alloy_sol_types::SolType>::eip712_data_word(&self.contextId) + .0, ] .concat() } @@ -520,6 +716,11 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD > as alloy_sol_types::EventTopic>::topic_preimage_length( &rust.coprocessorTxSenderAddresses, ) + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.contextId, + ) } #[inline] fn encode_topic_preimage( @@ -553,6 +754,12 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD &rust.coprocessorTxSenderAddresses, out, ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.contextId, + out, + ); } #[inline] fn encode_topic( @@ -572,7 +779,7 @@ struct CiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 ciphertextD #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] /**```solidity -struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphertextDigest; address[] coprocessorTxSenderAddresses; } +struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphertextDigest; address[] coprocessorTxSenderAddresses; uint256 contextId; } ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] @@ -587,6 +794,8 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe pub coprocessorTxSenderAddresses: alloy::sol_types::private::Vec< alloy::sol_types::private::Address, >, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -602,6 +811,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe alloy::sol_types::sol_data::Uint<256>, alloy::sol_types::sol_data::FixedBytes<32>, alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Uint<256>, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( @@ -609,6 +819,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe alloy::sol_types::private::primitives::aliases::U256, alloy::sol_types::private::FixedBytes<32>, alloy::sol_types::private::Vec, + alloy::sol_types::private::primitives::aliases::U256, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -630,6 +841,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe value.keyId, value.snsCiphertextDigest, value.coprocessorTxSenderAddresses, + value.contextId, ) } } @@ -642,6 +854,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe keyId: tuple.1, snsCiphertextDigest: tuple.2, coprocessorTxSenderAddresses: tuple.3, + contextId: tuple.4, } } } @@ -668,6 +881,9 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe > as alloy_sol_types::SolType>::tokenize( &self.coprocessorTxSenderAddresses, ), + as alloy_sol_types::SolType>::tokenize(&self.contextId), ) } #[inline] @@ -742,7 +958,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe #[inline] fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { alloy_sol_types::private::Cow::Borrowed( - "SnsCiphertextMaterial(bytes32 ctHandle,uint256 keyId,bytes32 snsCiphertextDigest,address[] coprocessorTxSenderAddresses)", + "SnsCiphertextMaterial(bytes32 ctHandle,uint256 keyId,bytes32 snsCiphertextDigest,address[] coprocessorTxSenderAddresses,uint256 contextId)", ) } #[inline] @@ -778,6 +994,10 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe &self.coprocessorTxSenderAddresses, ) .0, + as alloy_sol_types::SolType>::eip712_data_word(&self.contextId) + .0, ] .concat() } @@ -805,6 +1025,11 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe > as alloy_sol_types::EventTopic>::topic_preimage_length( &rust.coprocessorTxSenderAddresses, ) + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.contextId, + ) } #[inline] fn encode_topic_preimage( @@ -838,6 +1063,12 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe &rust.coprocessorTxSenderAddresses, out, ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.contextId, + out, + ); } #[inline] fn encode_topic( @@ -1032,9 +1263,113 @@ error CoprocessorAlreadyAdded(bytes32 ctHandle, address txSender); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `AddCiphertextMaterial(bytes32,bytes32,bytes32,address[])` and selector `0xcb89ccb347018d7f282bb4c048e135e19bc1d13660fa0f2850e10518422536de`. + /**Custom error with signature `InvalidCoprocessorContextAddCiphertext(bytes32,uint256,uint8)` and selector `0x96346431`. +```solidity +error InvalidCoprocessorContextAddCiphertext(bytes32 ctHandle, uint256 contextId, ContextStatus contextStatus); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidCoprocessorContextAddCiphertext { + #[allow(missing_docs)] + pub ctHandle: alloy::sol_types::private::FixedBytes<32>, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub contextStatus: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::FixedBytes<32>, + alloy::sol_types::sol_data::Uint<256>, + ContextStatus, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::FixedBytes<32>, + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: InvalidCoprocessorContextAddCiphertext) -> Self { + (value.ctHandle, value.contextId, value.contextStatus) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for InvalidCoprocessorContextAddCiphertext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + ctHandle: tuple.0, + contextId: tuple.1, + contextStatus: tuple.2, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InvalidCoprocessorContextAddCiphertext { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InvalidCoprocessorContextAddCiphertext(bytes32,uint256,uint8)"; + const SELECTOR: [u8; 4] = [150u8, 52u8, 100u8, 49u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.ctHandle), + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.contextStatus, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `AddCiphertextMaterial(bytes32,bytes32,bytes32,uint256)` and selector `0xc3113162bedb887e086a25724f966348968a75efd447615ebfd0f715939ad964`. ```solidity -event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, bytes32 snsCiphertextDigest, address[] coprocessorTxSenders); +event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, bytes32 snsCiphertextDigest, uint256 coprocessorContextId); ```*/ #[allow( non_camel_case_types, @@ -1051,9 +1386,7 @@ event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, #[allow(missing_docs)] pub snsCiphertextDigest: alloy::sol_types::private::FixedBytes<32>, #[allow(missing_docs)] - pub coprocessorTxSenders: alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, - >, + pub coprocessorContextId: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -1068,7 +1401,7 @@ event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, type DataTuple<'a> = ( alloy::sol_types::sol_data::FixedBytes<32>, alloy::sol_types::sol_data::FixedBytes<32>, - alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Uint<256>, ); type DataToken<'a> = , alloy::sol_types::sol_data::FixedBytes<32>, ); - const SIGNATURE: &'static str = "AddCiphertextMaterial(bytes32,bytes32,bytes32,address[])"; + const SIGNATURE: &'static str = "AddCiphertextMaterial(bytes32,bytes32,bytes32,uint256)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 203u8, 137u8, 204u8, 179u8, 71u8, 1u8, 141u8, 127u8, 40u8, 43u8, 180u8, - 192u8, 72u8, 225u8, 53u8, 225u8, 155u8, 193u8, 209u8, 54u8, 96u8, 250u8, - 15u8, 40u8, 80u8, 225u8, 5u8, 24u8, 66u8, 37u8, 54u8, 222u8, + 195u8, 17u8, 49u8, 98u8, 190u8, 219u8, 136u8, 126u8, 8u8, 106u8, 37u8, + 114u8, 79u8, 150u8, 99u8, 72u8, 150u8, 138u8, 117u8, 239u8, 212u8, 71u8, + 97u8, 94u8, 191u8, 208u8, 247u8, 21u8, 147u8, 154u8, 217u8, 100u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -1094,7 +1427,7 @@ event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, ctHandle: topics.1, ciphertextDigest: data.0, snsCiphertextDigest: data.1, - coprocessorTxSenders: data.2, + coprocessorContextId: data.2, } } #[inline] @@ -1121,9 +1454,9 @@ event AddCiphertextMaterial(bytes32 indexed ctHandle, bytes32 ciphertextDigest, as alloy_sol_types::SolType>::tokenize(&self.snsCiphertextDigest), - as alloy_sol_types::SolType>::tokenize(&self.coprocessorTxSenders), + as alloy_sol_types::SolType>::tokenize(&self.coprocessorContextId), ) } #[inline] @@ -1354,24 +1687,28 @@ function addCiphertextMaterial(bytes32 ctHandle, uint256 keyId, bytes32 cipherte }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getAddCiphertextMaterialConsensusTxSenders(bytes32)` and selector `0xe6f6ab94`. + /**Function with signature `getCiphertextMaterials(bytes32[])` and selector `0x55c4d997`. ```solidity -function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external view returns (address[] memory); +function getCiphertextMaterials(bytes32[] memory ctHandles) external view returns (CiphertextMaterial[] memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getAddCiphertextMaterialConsensusTxSendersCall { + pub struct getCiphertextMaterialsCall { #[allow(missing_docs)] - pub ctHandle: alloy::sol_types::private::FixedBytes<32>, + pub ctHandles: alloy::sol_types::private::Vec< + alloy::sol_types::private::FixedBytes<32>, + >, } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getAddCiphertextMaterialConsensusTxSenders(bytes32)`](getAddCiphertextMaterialConsensusTxSendersCall) function. + ///Container type for the return parameters of the [`getCiphertextMaterials(bytes32[])`](getCiphertextMaterialsCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getAddCiphertextMaterialConsensusTxSendersReturn { + pub struct getCiphertextMaterialsReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec, + pub _0: alloy::sol_types::private::Vec< + ::RustType, + >, } #[allow( non_camel_case_types, @@ -1383,9 +1720,17 @@ function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external v use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::FixedBytes<32>,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Array< + alloy::sol_types::sol_data::FixedBytes<32>, + >, + ); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::FixedBytes<32>,); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Vec< + alloy::sol_types::private::FixedBytes<32>, + >, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -1399,29 +1744,31 @@ function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external v } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getAddCiphertextMaterialConsensusTxSendersCall) -> Self { - (value.ctHandle,) + fn from(value: getCiphertextMaterialsCall) -> Self { + (value.ctHandles,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getAddCiphertextMaterialConsensusTxSendersCall { + for getCiphertextMaterialsCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { ctHandle: tuple.0 } + Self { ctHandles: tuple.0 } } } } { #[doc(hidden)] type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Array, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec, + alloy::sol_types::private::Vec< + ::RustType, + >, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -1436,41 +1783,42 @@ function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external v } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from( - value: getAddCiphertextMaterialConsensusTxSendersReturn, - ) -> Self { + fn from(value: getCiphertextMaterialsReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getAddCiphertextMaterialConsensusTxSendersReturn { + for getCiphertextMaterialsReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall - for getAddCiphertextMaterialConsensusTxSendersCall { - type Parameters<'a> = (alloy::sol_types::sol_data::FixedBytes<32>,); + impl alloy_sol_types::SolCall for getCiphertextMaterialsCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Array< + alloy::sol_types::sol_data::FixedBytes<32>, + >, + ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; type Return = alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, + ::RustType, >; type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Array, ); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getAddCiphertextMaterialConsensusTxSenders(bytes32)"; - const SELECTOR: [u8; 4] = [230u8, 246u8, 171u8, 148u8]; + const SIGNATURE: &'static str = "getCiphertextMaterials(bytes32[])"; + const SELECTOR: [u8; 4] = [85u8, 196u8, 217u8, 151u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -1480,16 +1828,16 @@ function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external v #[inline] fn tokenize(&self) -> Self::Token<'_> { ( - as alloy_sol_types::SolType>::tokenize(&self.ctHandle), + , + > as alloy_sol_types::SolType>::tokenize(&self.ctHandles), ) } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( as alloy_sol_types::SolType>::tokenize(ret), ) } @@ -1499,8 +1847,7 @@ function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external v '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getAddCiphertextMaterialConsensusTxSendersReturn = r - .into(); + let r: getCiphertextMaterialsReturn = r.into(); r._0 }) } @@ -1512,8 +1859,7 @@ function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external v '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getAddCiphertextMaterialConsensusTxSendersReturn = r - .into(); + let r: getCiphertextMaterialsReturn = r.into(); r._0 }) } @@ -1521,28 +1867,28 @@ function getAddCiphertextMaterialConsensusTxSenders(bytes32 ctHandle) external v }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCiphertextMaterials(bytes32[])` and selector `0x55c4d997`. + /**Function with signature `getConsensusCoprocessorTxSenders(bytes32)` and selector `0xe4bb288c`. ```solidity -function getCiphertextMaterials(bytes32[] memory ctHandles) external view returns (CiphertextMaterial[] memory); +function getConsensusCoprocessorTxSenders(bytes32 ctHandle) external view returns (address[] memory, uint256 contextId, bool); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCiphertextMaterialsCall { + pub struct getConsensusCoprocessorTxSendersCall { #[allow(missing_docs)] - pub ctHandles: alloy::sol_types::private::Vec< - alloy::sol_types::private::FixedBytes<32>, - >, + pub ctHandle: alloy::sol_types::private::FixedBytes<32>, } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCiphertextMaterials(bytes32[])`](getCiphertextMaterialsCall) function. + ///Container type for the return parameters of the [`getConsensusCoprocessorTxSenders(bytes32)`](getConsensusCoprocessorTxSendersCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCiphertextMaterialsReturn { + pub struct getConsensusCoprocessorTxSendersReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec< - ::RustType, - >, + pub _0: alloy::sol_types::private::Vec, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub _2: bool, } #[allow( non_camel_case_types, @@ -1554,17 +1900,9 @@ function getCiphertextMaterials(bytes32[] memory ctHandles) external view return use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array< - alloy::sol_types::sol_data::FixedBytes<32>, - >, - ); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::FixedBytes<32>,); #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec< - alloy::sol_types::private::FixedBytes<32>, - >, - ); + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::FixedBytes<32>,); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -1578,31 +1916,33 @@ function getCiphertextMaterials(bytes32[] memory ctHandles) external view return } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCiphertextMaterialsCall) -> Self { - (value.ctHandles,) + fn from(value: getConsensusCoprocessorTxSendersCall) -> Self { + (value.ctHandle,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getCiphertextMaterialsCall { + for getConsensusCoprocessorTxSendersCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { ctHandles: tuple.0 } + Self { ctHandle: tuple.0 } } } } { #[doc(hidden)] type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Bool, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec< - ::RustType, - >, + alloy::sol_types::private::Vec, + alloy::sol_types::private::primitives::aliases::U256, + bool, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -1617,42 +1957,61 @@ function getCiphertextMaterials(bytes32[] memory ctHandles) external view return } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCiphertextMaterialsReturn) -> Self { - (value._0,) + fn from(value: getConsensusCoprocessorTxSendersReturn) -> Self { + (value._0, value.contextId, value._2) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getCiphertextMaterialsReturn { + for getConsensusCoprocessorTxSendersReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } + Self { + _0: tuple.0, + contextId: tuple.1, + _2: tuple.2, + } } } } + impl getConsensusCoprocessorTxSendersReturn { + fn _tokenize( + &self, + ) -> ::ReturnToken< + '_, + > { + ( + as alloy_sol_types::SolType>::tokenize(&self._0), + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self._2, + ), + ) + } + } #[automatically_derived] - impl alloy_sol_types::SolCall for getCiphertextMaterialsCall { - type Parameters<'a> = ( - alloy::sol_types::sol_data::Array< - alloy::sol_types::sol_data::FixedBytes<32>, - >, - ); + impl alloy_sol_types::SolCall for getConsensusCoprocessorTxSendersCall { + type Parameters<'a> = (alloy::sol_types::sol_data::FixedBytes<32>,); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::Vec< - ::RustType, - >; + type Return = getConsensusCoprocessorTxSendersReturn; type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Bool, ); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCiphertextMaterials(bytes32[])"; - const SELECTOR: [u8; 4] = [85u8, 196u8, 217u8, 151u8]; + const SIGNATURE: &'static str = "getConsensusCoprocessorTxSenders(bytes32)"; + const SELECTOR: [u8; 4] = [228u8, 187u8, 40u8, 140u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -1662,28 +2021,21 @@ function getCiphertextMaterials(bytes32[] memory ctHandles) external view return #[inline] fn tokenize(&self) -> Self::Token<'_> { ( - , - > as alloy_sol_types::SolType>::tokenize(&self.ctHandles), + as alloy_sol_types::SolType>::tokenize(&self.ctHandle), ) } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) + getConsensusCoprocessorTxSendersReturn::_tokenize(ret) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(|r| { - let r: getCiphertextMaterialsReturn = r.into(); - r._0 - }) + .map(Into::into) } #[inline] fn abi_decode_returns_validate( @@ -1692,10 +2044,7 @@ function getCiphertextMaterials(bytes32[] memory ctHandles) external view return as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(|r| { - let r: getCiphertextMaterialsReturn = r.into(); - r._0 - }) + .map(Into::into) } } }; @@ -2183,12 +2532,10 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool #[allow(missing_docs)] addCiphertextMaterial(addCiphertextMaterialCall), #[allow(missing_docs)] - getAddCiphertextMaterialConsensusTxSenders( - getAddCiphertextMaterialConsensusTxSendersCall, - ), - #[allow(missing_docs)] getCiphertextMaterials(getCiphertextMaterialsCall), #[allow(missing_docs)] + getConsensusCoprocessorTxSenders(getConsensusCoprocessorTxSendersCall), + #[allow(missing_docs)] getSnsCiphertextMaterials(getSnsCiphertextMaterialsCall), #[allow(missing_docs)] getVersion(getVersionCall), @@ -2209,7 +2556,7 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool [85u8, 196u8, 217u8, 151u8], [144u8, 243u8, 3u8, 84u8], [161u8, 79u8, 137u8, 113u8], - [230u8, 246u8, 171u8, 148u8], + [228u8, 187u8, 40u8, 140u8], ]; } #[automatically_derived] @@ -2223,12 +2570,12 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool Self::addCiphertextMaterial(_) => { ::SELECTOR } - Self::getAddCiphertextMaterialConsensusTxSenders(_) => { - ::SELECTOR - } Self::getCiphertextMaterials(_) => { ::SELECTOR } + Self::getConsensusCoprocessorTxSenders(_) => { + ::SELECTOR + } Self::getSnsCiphertextMaterials(_) => { ::SELECTOR } @@ -2313,17 +2660,17 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool getSnsCiphertextMaterials }, { - fn getAddCiphertextMaterialConsensusTxSenders( + fn getConsensusCoprocessorTxSenders( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw( + ::abi_decode_raw( data, ) .map( - ICiphertextCommitsCalls::getAddCiphertextMaterialConsensusTxSenders, + ICiphertextCommitsCalls::getConsensusCoprocessorTxSenders, ) } - getAddCiphertextMaterialConsensusTxSenders + getConsensusCoprocessorTxSenders }, ]; let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { @@ -2401,17 +2748,17 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool getSnsCiphertextMaterials }, { - fn getAddCiphertextMaterialConsensusTxSenders( + fn getConsensusCoprocessorTxSenders( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( + ::abi_decode_raw_validate( data, ) .map( - ICiphertextCommitsCalls::getAddCiphertextMaterialConsensusTxSenders, + ICiphertextCommitsCalls::getConsensusCoprocessorTxSenders, ) } - getAddCiphertextMaterialConsensusTxSenders + getConsensusCoprocessorTxSenders }, ]; let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { @@ -2432,13 +2779,13 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool inner, ) } - Self::getAddCiphertextMaterialConsensusTxSenders(inner) => { - ::abi_encoded_size( + Self::getCiphertextMaterials(inner) => { + ::abi_encoded_size( inner, ) } - Self::getCiphertextMaterials(inner) => { - ::abi_encoded_size( + Self::getConsensusCoprocessorTxSenders(inner) => { + ::abi_encoded_size( inner, ) } @@ -2466,14 +2813,14 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool out, ) } - Self::getAddCiphertextMaterialConsensusTxSenders(inner) => { - ::abi_encode_raw( + Self::getCiphertextMaterials(inner) => { + ::abi_encode_raw( inner, out, ) } - Self::getCiphertextMaterials(inner) => { - ::abi_encode_raw( + Self::getConsensusCoprocessorTxSenders(inner) => { + ::abi_encode_raw( inner, out, ) @@ -2507,6 +2854,8 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool CiphertextMaterialNotFound(CiphertextMaterialNotFound), #[allow(missing_docs)] CoprocessorAlreadyAdded(CoprocessorAlreadyAdded), + #[allow(missing_docs)] + InvalidCoprocessorContextAddCiphertext(InvalidCoprocessorContextAddCiphertext), } #[automatically_derived] impl ICiphertextCommitsErrors { @@ -2519,13 +2868,14 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool pub const SELECTORS: &'static [[u8; 4usize]] = &[ [6u8, 102u8, 203u8, 223u8], [29u8, 215u8, 37u8, 12u8], + [150u8, 52u8, 100u8, 49u8], ]; } #[automatically_derived] impl alloy_sol_types::SolInterface for ICiphertextCommitsErrors { const NAME: &'static str = "ICiphertextCommitsErrors"; const MIN_DATA_LENGTH: usize = 32usize; - const COUNT: usize = 2usize; + const COUNT: usize = 3usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -2535,6 +2885,9 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool Self::CoprocessorAlreadyAdded(_) => { ::SELECTOR } + Self::InvalidCoprocessorContextAddCiphertext(_) => { + ::SELECTOR + } } } #[inline] @@ -2576,6 +2929,19 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool } CoprocessorAlreadyAdded }, + { + fn InvalidCoprocessorContextAddCiphertext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICiphertextCommitsErrors::InvalidCoprocessorContextAddCiphertext, + ) + } + InvalidCoprocessorContextAddCiphertext + }, ]; let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { return Err( @@ -2618,6 +2984,19 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool } CoprocessorAlreadyAdded }, + { + fn InvalidCoprocessorContextAddCiphertext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICiphertextCommitsErrors::InvalidCoprocessorContextAddCiphertext, + ) + } + InvalidCoprocessorContextAddCiphertext + }, ]; let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { return Err( @@ -2642,6 +3021,11 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool inner, ) } + Self::InvalidCoprocessorContextAddCiphertext(inner) => { + ::abi_encoded_size( + inner, + ) + } } } #[inline] @@ -2659,6 +3043,12 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool out, ) } + Self::InvalidCoprocessorContextAddCiphertext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } } } } @@ -2679,9 +3069,9 @@ function isCiphertextMaterialAdded(bytes32 ctHandle) external view returns (bool /// Prefer using `SolInterface` methods instead. pub const SELECTORS: &'static [[u8; 32usize]] = &[ [ - 203u8, 137u8, 204u8, 179u8, 71u8, 1u8, 141u8, 127u8, 40u8, 43u8, 180u8, - 192u8, 72u8, 225u8, 53u8, 225u8, 155u8, 193u8, 209u8, 54u8, 96u8, 250u8, - 15u8, 40u8, 80u8, 225u8, 5u8, 24u8, 66u8, 37u8, 54u8, 222u8, + 195u8, 17u8, 49u8, 98u8, 190u8, 219u8, 136u8, 126u8, 8u8, 106u8, 37u8, + 114u8, 79u8, 150u8, 99u8, 72u8, 150u8, 138u8, 117u8, 239u8, 212u8, 71u8, + 97u8, 94u8, 191u8, 208u8, 247u8, 21u8, 147u8, 154u8, 217u8, 100u8, ], ]; } @@ -2910,21 +3300,6 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ }, ) } - ///Creates a new call builder for the [`getAddCiphertextMaterialConsensusTxSenders`] function. - pub fn getAddCiphertextMaterialConsensusTxSenders( - &self, - ctHandle: alloy::sol_types::private::FixedBytes<32>, - ) -> alloy_contract::SolCallBuilder< - &P, - getAddCiphertextMaterialConsensusTxSendersCall, - N, - > { - self.call_builder( - &getAddCiphertextMaterialConsensusTxSendersCall { - ctHandle, - }, - ) - } ///Creates a new call builder for the [`getCiphertextMaterials`] function. pub fn getCiphertextMaterials( &self, @@ -2938,6 +3313,21 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ }, ) } + ///Creates a new call builder for the [`getConsensusCoprocessorTxSenders`] function. + pub fn getConsensusCoprocessorTxSenders( + &self, + ctHandle: alloy::sol_types::private::FixedBytes<32>, + ) -> alloy_contract::SolCallBuilder< + &P, + getConsensusCoprocessorTxSendersCall, + N, + > { + self.call_builder( + &getConsensusCoprocessorTxSendersCall { + ctHandle, + }, + ) + } ///Creates a new call builder for the [`getSnsCiphertextMaterials`] function. pub fn getSnsCiphertextMaterials( &self, diff --git a/gateway-contracts/rust_bindings/src/i_coprocessor_contexts.rs b/gateway-contracts/rust_bindings/src/i_coprocessor_contexts.rs new file mode 100644 index 0000000000..1bb27d0c39 --- /dev/null +++ b/gateway-contracts/rust_bindings/src/i_coprocessor_contexts.rs @@ -0,0 +1,8955 @@ +/** + +Generated by the following Solidity interface... +```solidity +interface ICoprocessorContexts { + type ContextStatus is uint8; + struct CoprocessorContext { + uint256 contextId; + uint256 previousContextId; + bytes blob; + CoprocessorV2[] coprocessors; + } + struct CoprocessorContextTimePeriods { + uint256 preActivationTimePeriod; + uint256 suspendedTimePeriod; + } + struct CoprocessorV2 { + string name; + address txSenderAddress; + address signerAddress; + string storageUrl; + } + + error CoprocessorContextNotInitialized(uint256 contextId); + error CoprocessorSignerAddressesNotUnique(address signerAddress, uint256 coprocessorIndex, CoprocessorV2[] coprocessors); + error CoprocessorTxSenderAddressesNotUnique(address txSenderAddress, uint256 coprocessorIndex, CoprocessorV2[] coprocessors); + error EmptyCoprocessors(); + error InvalidContextStatusForceUpdate(uint256 contextId, ContextStatus status); + error NoActiveCoprocessorContext(); + error NoPreActivationCoprocessorContext(); + error NoSuspendedCoprocessorContext(); + error NotCoprocessorFromContext(uint256 contextId, address coprocessorTxSenderAddress); + error NullCoprocessorSignerAddress(uint256 coprocessorIndex, CoprocessorV2[] coprocessors); + error NullCoprocessorTxSenderAddress(uint256 coprocessorIndex, CoprocessorV2[] coprocessors); + + event ActivateCoprocessorContext(uint256 contextId); + event CompromiseCoprocessorContext(uint256 contextId); + event DeactivateCoprocessorContext(uint256 contextId); + event DestroyCoprocessorContext(uint256 contextId); + event InitializeCoprocessorContexts(bytes blob, CoprocessorV2[] coprocessors); + event NewCoprocessorContext(CoprocessorContext activeCoprocessorContext, CoprocessorContext newCoprocessorContext, CoprocessorContextTimePeriods timePeriods); + event PreActivateCoprocessorContext(CoprocessorContext newCoprocessorContext, uint256 activationBlockTimestamp); + event SuspendCoprocessorContext(uint256 contextId, uint256 deactivatedBlockTimestamp); + + function addCoprocessorContext(bytes memory blob, CoprocessorV2[] memory coprocessors, CoprocessorContextTimePeriods memory timePeriods) external; + function forceUpdateCoprocessorContextToStatus(uint256 contextId, ContextStatus status) external; + function getActiveCoprocessorContext() external view returns (CoprocessorContext memory); + function getActiveCoprocessorContextId() external view returns (uint256); + function getCoprocessor(uint256 contextId, address coprocessorTxSenderAddress) external view returns (CoprocessorV2 memory); + function getCoprocessorActivationBlockTimestamp(uint256 contextId) external view returns (uint256); + function getCoprocessorContextStatus(uint256 contextId) external view returns (ContextStatus); + function getCoprocessorDeactivatedBlockTimestamp(uint256 contextId) external view returns (uint256); + function getCoprocessorMajorityThreshold(uint256 contextId) external view returns (uint256); + function getCoprocessorSigners(uint256 contextId) external view returns (address[] memory); + function getCoprocessorTxSenders(uint256 contextId) external view returns (address[] memory); + function getPreActivationCoprocessorContextId() external view returns (uint256); + function getSuspendedCoprocessorContextId() external view returns (uint256); + function getVersion() external pure returns (string memory); + function isCoprocessorContextOperating(uint256 contextId) external view returns (bool); + function isCoprocessorSigner(uint256 contextId, address signerAddress) external view returns (bool); + function isCoprocessorTxSender(uint256 contextId, address txSenderAddress) external view returns (bool); + function refreshCoprocessorContextStatuses() external; + function swapSuspendedCoprocessorContextWithActive(uint256 suspendedTimePeriod) external; +} +``` + +...which was generated by the following JSON ABI: +```json +[ + { + "type": "function", + "name": "addCoprocessorContext", + "inputs": [ + { + "name": "blob", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + }, + { + "name": "timePeriods", + "type": "tuple", + "internalType": "struct CoprocessorContextTimePeriods", + "components": [ + { + "name": "preActivationTimePeriod", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "suspendedTimePeriod", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "forceUpdateCoprocessorContextToStatus", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getActiveCoprocessorContext", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct CoprocessorContext", + "components": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "previousContextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blob", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getActiveCoprocessorContextId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getCoprocessor", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "coprocessorTxSenderAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct CoprocessorV2", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getCoprocessorActivationBlockTimestamp", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getCoprocessorContextStatus", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getCoprocessorDeactivatedBlockTimestamp", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getCoprocessorMajorityThreshold", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getCoprocessorSigners", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getCoprocessorTxSenders", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPreActivationCoprocessorContextId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSuspendedCoprocessorContextId", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getVersion", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "isCoprocessorContextOperating", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isCoprocessorSigner", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isCoprocessorTxSender", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "refreshCoprocessorContextStatuses", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "swapSuspendedCoprocessorContextWithActive", + "inputs": [ + { + "name": "suspendedTimePeriod", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "ActivateCoprocessorContext", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "CompromiseCoprocessorContext", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DeactivateCoprocessorContext", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DestroyCoprocessorContext", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "InitializeCoprocessorContexts", + "inputs": [ + { + "name": "blob", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "indexed": false, + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NewCoprocessorContext", + "inputs": [ + { + "name": "activeCoprocessorContext", + "type": "tuple", + "indexed": false, + "internalType": "struct CoprocessorContext", + "components": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "previousContextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blob", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + }, + { + "name": "newCoprocessorContext", + "type": "tuple", + "indexed": false, + "internalType": "struct CoprocessorContext", + "components": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "previousContextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blob", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + }, + { + "name": "timePeriods", + "type": "tuple", + "indexed": false, + "internalType": "struct CoprocessorContextTimePeriods", + "components": [ + { + "name": "preActivationTimePeriod", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "suspendedTimePeriod", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "PreActivateCoprocessorContext", + "inputs": [ + { + "name": "newCoprocessorContext", + "type": "tuple", + "indexed": false, + "internalType": "struct CoprocessorContext", + "components": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "previousContextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blob", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + }, + { + "name": "activationBlockTimestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SuspendCoprocessorContext", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "deactivatedBlockTimestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "CoprocessorContextNotInitialized", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "CoprocessorSignerAddressesNotUnique", + "inputs": [ + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "coprocessorIndex", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + }, + { + "type": "error", + "name": "CoprocessorTxSenderAddressesNotUnique", + "inputs": [ + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "coprocessorIndex", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + }, + { + "type": "error", + "name": "EmptyCoprocessors", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidContextStatusForceUpdate", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ] + }, + { + "type": "error", + "name": "NoActiveCoprocessorContext", + "inputs": [] + }, + { + "type": "error", + "name": "NoPreActivationCoprocessorContext", + "inputs": [] + }, + { + "type": "error", + "name": "NoSuspendedCoprocessorContext", + "inputs": [] + }, + { + "type": "error", + "name": "NotCoprocessorFromContext", + "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "coprocessorTxSenderAddress", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "NullCoprocessorSignerAddress", + "inputs": [ + { + "name": "coprocessorIndex", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + }, + { + "type": "error", + "name": "NullCoprocessorTxSenderAddress", + "inputs": [ + { + "name": "coprocessorIndex", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "coprocessors", + "type": "tuple[]", + "internalType": "struct CoprocessorV2[]", + "components": [ + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "txSenderAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "signerAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "storageUrl", + "type": "string", + "internalType": "string" + } + ] + } + ] + } +] +```*/ +#[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style, + clippy::empty_structs_with_brackets +)] +pub mod ICoprocessorContexts { + use super::*; + use alloy::sol_types as alloy_sol_types; + /// The creation / init bytecode of the contract. + /// + /// ```text + ///0x + /// ``` + #[rustfmt::skip] + #[allow(clippy::all)] + pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( + b"", + ); + /// The runtime bytecode of the contract, as deployed on the network. + /// + /// ```text + ///0x + /// ``` + #[rustfmt::skip] + #[allow(clippy::all)] + pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( + b"", + ); + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextStatus(u8); + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::private::SolTypeValue for u8 { + #[inline] + fn stv_to_tokens( + &self, + ) -> as alloy_sol_types::SolType>::Token<'_> { + alloy_sol_types::private::SolTypeValue::< + alloy::sol_types::sol_data::Uint<8>, + >::stv_to_tokens(self) + } + #[inline] + fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { + as alloy_sol_types::SolType>::tokenize(self) + .0 + } + #[inline] + fn stv_abi_encode_packed_to( + &self, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::SolType>::abi_encode_packed_to(self, out) + } + #[inline] + fn stv_abi_packed_encoded_size(&self) -> usize { + as alloy_sol_types::SolType>::abi_encoded_size(self) + } + } + #[automatically_derived] + impl ContextStatus { + /// The Solidity type name. + pub const NAME: &'static str = stringify!(@ name); + /// Convert from the underlying value type. + #[inline] + pub const fn from_underlying(value: u8) -> Self { + Self(value) + } + /// Return the underlying value. + #[inline] + pub const fn into_underlying(self) -> u8 { + self.0 + } + /// Return the single encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode(&self) -> alloy_sol_types::private::Vec { + ::abi_encode(&self.0) + } + /// Return the packed encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode_packed(&self) -> alloy_sol_types::private::Vec { + ::abi_encode_packed(&self.0) + } + } + #[automatically_derived] + impl From for ContextStatus { + fn from(value: u8) -> Self { + Self::from_underlying(value) + } + } + #[automatically_derived] + impl From for u8 { + fn from(value: ContextStatus) -> Self { + value.into_underlying() + } + } + #[automatically_derived] + impl alloy_sol_types::SolType for ContextStatus { + type RustType = u8; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SOL_NAME: &'static str = Self::NAME; + const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; + const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; + #[inline] + fn valid_token(token: &Self::Token<'_>) -> bool { + Self::type_check(token).is_ok() + } + #[inline] + fn type_check(token: &Self::Token<'_>) -> alloy_sol_types::Result<()> { + as alloy_sol_types::SolType>::type_check(token) + } + #[inline] + fn detokenize(token: Self::Token<'_>) -> Self::RustType { + as alloy_sol_types::SolType>::detokenize(token) + } + } + #[automatically_derived] + impl alloy_sol_types::EventTopic for ContextStatus { + #[inline] + fn topic_preimage_length(rust: &Self::RustType) -> usize { + as alloy_sol_types::EventTopic>::topic_preimage_length(rust) + } + #[inline] + fn encode_topic_preimage( + rust: &Self::RustType, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::EventTopic>::encode_topic_preimage(rust, out) + } + #[inline] + fn encode_topic( + rust: &Self::RustType, + ) -> alloy_sol_types::abi::token::WordToken { + as alloy_sol_types::EventTopic>::encode_topic(rust) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**```solidity +struct CoprocessorContext { uint256 contextId; uint256 previousContextId; bytes blob; CoprocessorV2[] coprocessors; } +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct CoprocessorContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub previousContextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub blob: alloy::sol_types::private::Bytes, + #[allow(missing_docs)] + pub coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Bytes, + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Bytes, + alloy::sol_types::private::Vec< + ::RustType, + >, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: CoprocessorContext) -> Self { + ( + value.contextId, + value.previousContextId, + value.blob, + value.coprocessors, + ) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for CoprocessorContext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + previousContextId: tuple.1, + blob: tuple.2, + coprocessors: tuple.3, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolValue for CoprocessorContext { + type SolType = Self; + } + #[automatically_derived] + impl alloy_sol_types::private::SolTypeValue for CoprocessorContext { + #[inline] + fn stv_to_tokens(&self) -> ::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + as alloy_sol_types::SolType>::tokenize(&self.previousContextId), + ::tokenize( + &self.blob, + ), + as alloy_sol_types::SolType>::tokenize(&self.coprocessors), + ) + } + #[inline] + fn stv_abi_encoded_size(&self) -> usize { + if let Some(size) = ::ENCODED_SIZE { + return size; + } + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_encoded_size(&tuple) + } + #[inline] + fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { + ::eip712_hash_struct(self) + } + #[inline] + fn stv_abi_encode_packed_to( + &self, + out: &mut alloy_sol_types::private::Vec, + ) { + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_encode_packed_to(&tuple, out) + } + #[inline] + fn stv_abi_packed_encoded_size(&self) -> usize { + if let Some(size) = ::PACKED_ENCODED_SIZE { + return size; + } + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_packed_encoded_size(&tuple) + } + } + #[automatically_derived] + impl alloy_sol_types::SolType for CoprocessorContext { + type RustType = Self; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SOL_NAME: &'static str = ::NAME; + const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; + const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; + #[inline] + fn valid_token(token: &Self::Token<'_>) -> bool { + as alloy_sol_types::SolType>::valid_token(token) + } + #[inline] + fn detokenize(token: Self::Token<'_>) -> Self::RustType { + let tuple = as alloy_sol_types::SolType>::detokenize(token); + >>::from(tuple) + } + } + #[automatically_derived] + impl alloy_sol_types::SolStruct for CoprocessorContext { + const NAME: &'static str = "CoprocessorContext"; + #[inline] + fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { + alloy_sol_types::private::Cow::Borrowed( + "CoprocessorContext(uint256 contextId,uint256 previousContextId,bytes blob,CoprocessorV2[] coprocessors)", + ) + } + #[inline] + fn eip712_components() -> alloy_sol_types::private::Vec< + alloy_sol_types::private::Cow<'static, str>, + > { + let mut components = alloy_sol_types::private::Vec::with_capacity(1); + components + .push( + ::eip712_root_type(), + ); + components + .extend( + ::eip712_components(), + ); + components + } + #[inline] + fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { + [ + as alloy_sol_types::SolType>::eip712_data_word(&self.contextId) + .0, + as alloy_sol_types::SolType>::eip712_data_word( + &self.previousContextId, + ) + .0, + ::eip712_data_word( + &self.blob, + ) + .0, + as alloy_sol_types::SolType>::eip712_data_word(&self.coprocessors) + .0, + ] + .concat() + } + } + #[automatically_derived] + impl alloy_sol_types::EventTopic for CoprocessorContext { + #[inline] + fn topic_preimage_length(rust: &Self::RustType) -> usize { + 0usize + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.contextId, + ) + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.previousContextId, + ) + + ::topic_preimage_length( + &rust.blob, + ) + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.coprocessors, + ) + } + #[inline] + fn encode_topic_preimage( + rust: &Self::RustType, + out: &mut alloy_sol_types::private::Vec, + ) { + out.reserve( + ::topic_preimage_length(rust), + ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.contextId, + out, + ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.previousContextId, + out, + ); + ::encode_topic_preimage( + &rust.blob, + out, + ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.coprocessors, + out, + ); + } + #[inline] + fn encode_topic( + rust: &Self::RustType, + ) -> alloy_sol_types::abi::token::WordToken { + let mut out = alloy_sol_types::private::Vec::new(); + ::encode_topic_preimage( + rust, + &mut out, + ); + alloy_sol_types::abi::token::WordToken( + alloy_sol_types::private::keccak256(out), + ) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**```solidity +struct CoprocessorContextTimePeriods { uint256 preActivationTimePeriod; uint256 suspendedTimePeriod; } +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct CoprocessorContextTimePeriods { + #[allow(missing_docs)] + pub preActivationTimePeriod: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub suspendedTimePeriod: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: CoprocessorContextTimePeriods) -> Self { + (value.preActivationTimePeriod, value.suspendedTimePeriod) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for CoprocessorContextTimePeriods { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + preActivationTimePeriod: tuple.0, + suspendedTimePeriod: tuple.1, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolValue for CoprocessorContextTimePeriods { + type SolType = Self; + } + #[automatically_derived] + impl alloy_sol_types::private::SolTypeValue + for CoprocessorContextTimePeriods { + #[inline] + fn stv_to_tokens(&self) -> ::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize( + &self.preActivationTimePeriod, + ), + as alloy_sol_types::SolType>::tokenize(&self.suspendedTimePeriod), + ) + } + #[inline] + fn stv_abi_encoded_size(&self) -> usize { + if let Some(size) = ::ENCODED_SIZE { + return size; + } + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_encoded_size(&tuple) + } + #[inline] + fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { + ::eip712_hash_struct(self) + } + #[inline] + fn stv_abi_encode_packed_to( + &self, + out: &mut alloy_sol_types::private::Vec, + ) { + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_encode_packed_to(&tuple, out) + } + #[inline] + fn stv_abi_packed_encoded_size(&self) -> usize { + if let Some(size) = ::PACKED_ENCODED_SIZE { + return size; + } + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_packed_encoded_size(&tuple) + } + } + #[automatically_derived] + impl alloy_sol_types::SolType for CoprocessorContextTimePeriods { + type RustType = Self; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SOL_NAME: &'static str = ::NAME; + const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; + const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; + #[inline] + fn valid_token(token: &Self::Token<'_>) -> bool { + as alloy_sol_types::SolType>::valid_token(token) + } + #[inline] + fn detokenize(token: Self::Token<'_>) -> Self::RustType { + let tuple = as alloy_sol_types::SolType>::detokenize(token); + >>::from(tuple) + } + } + #[automatically_derived] + impl alloy_sol_types::SolStruct for CoprocessorContextTimePeriods { + const NAME: &'static str = "CoprocessorContextTimePeriods"; + #[inline] + fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { + alloy_sol_types::private::Cow::Borrowed( + "CoprocessorContextTimePeriods(uint256 preActivationTimePeriod,uint256 suspendedTimePeriod)", + ) + } + #[inline] + fn eip712_components() -> alloy_sol_types::private::Vec< + alloy_sol_types::private::Cow<'static, str>, + > { + alloy_sol_types::private::Vec::new() + } + #[inline] + fn eip712_encode_type() -> alloy_sol_types::private::Cow<'static, str> { + ::eip712_root_type() + } + #[inline] + fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { + [ + as alloy_sol_types::SolType>::eip712_data_word( + &self.preActivationTimePeriod, + ) + .0, + as alloy_sol_types::SolType>::eip712_data_word( + &self.suspendedTimePeriod, + ) + .0, + ] + .concat() + } + } + #[automatically_derived] + impl alloy_sol_types::EventTopic for CoprocessorContextTimePeriods { + #[inline] + fn topic_preimage_length(rust: &Self::RustType) -> usize { + 0usize + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.preActivationTimePeriod, + ) + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.suspendedTimePeriod, + ) + } + #[inline] + fn encode_topic_preimage( + rust: &Self::RustType, + out: &mut alloy_sol_types::private::Vec, + ) { + out.reserve( + ::topic_preimage_length(rust), + ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.preActivationTimePeriod, + out, + ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.suspendedTimePeriod, + out, + ); + } + #[inline] + fn encode_topic( + rust: &Self::RustType, + ) -> alloy_sol_types::abi::token::WordToken { + let mut out = alloy_sol_types::private::Vec::new(); + ::encode_topic_preimage( + rust, + &mut out, + ); + alloy_sol_types::abi::token::WordToken( + alloy_sol_types::private::keccak256(out), + ) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**```solidity +struct CoprocessorV2 { string name; address txSenderAddress; address signerAddress; string storageUrl; } +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct CoprocessorV2 { + #[allow(missing_docs)] + pub name: alloy::sol_types::private::String, + #[allow(missing_docs)] + pub txSenderAddress: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub signerAddress: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub storageUrl: alloy::sol_types::private::String, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::String, + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::String, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::String, + alloy::sol_types::private::Address, + alloy::sol_types::private::Address, + alloy::sol_types::private::String, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: CoprocessorV2) -> Self { + ( + value.name, + value.txSenderAddress, + value.signerAddress, + value.storageUrl, + ) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for CoprocessorV2 { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + name: tuple.0, + txSenderAddress: tuple.1, + signerAddress: tuple.2, + storageUrl: tuple.3, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolValue for CoprocessorV2 { + type SolType = Self; + } + #[automatically_derived] + impl alloy_sol_types::private::SolTypeValue for CoprocessorV2 { + #[inline] + fn stv_to_tokens(&self) -> ::Token<'_> { + ( + ::tokenize( + &self.name, + ), + ::tokenize( + &self.txSenderAddress, + ), + ::tokenize( + &self.signerAddress, + ), + ::tokenize( + &self.storageUrl, + ), + ) + } + #[inline] + fn stv_abi_encoded_size(&self) -> usize { + if let Some(size) = ::ENCODED_SIZE { + return size; + } + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_encoded_size(&tuple) + } + #[inline] + fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { + ::eip712_hash_struct(self) + } + #[inline] + fn stv_abi_encode_packed_to( + &self, + out: &mut alloy_sol_types::private::Vec, + ) { + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_encode_packed_to(&tuple, out) + } + #[inline] + fn stv_abi_packed_encoded_size(&self) -> usize { + if let Some(size) = ::PACKED_ENCODED_SIZE { + return size; + } + let tuple = as ::core::convert::From>::from(self.clone()); + as alloy_sol_types::SolType>::abi_packed_encoded_size(&tuple) + } + } + #[automatically_derived] + impl alloy_sol_types::SolType for CoprocessorV2 { + type RustType = Self; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SOL_NAME: &'static str = ::NAME; + const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; + const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; + #[inline] + fn valid_token(token: &Self::Token<'_>) -> bool { + as alloy_sol_types::SolType>::valid_token(token) + } + #[inline] + fn detokenize(token: Self::Token<'_>) -> Self::RustType { + let tuple = as alloy_sol_types::SolType>::detokenize(token); + >>::from(tuple) + } + } + #[automatically_derived] + impl alloy_sol_types::SolStruct for CoprocessorV2 { + const NAME: &'static str = "CoprocessorV2"; + #[inline] + fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { + alloy_sol_types::private::Cow::Borrowed( + "CoprocessorV2(string name,address txSenderAddress,address signerAddress,string storageUrl)", + ) + } + #[inline] + fn eip712_components() -> alloy_sol_types::private::Vec< + alloy_sol_types::private::Cow<'static, str>, + > { + alloy_sol_types::private::Vec::new() + } + #[inline] + fn eip712_encode_type() -> alloy_sol_types::private::Cow<'static, str> { + ::eip712_root_type() + } + #[inline] + fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { + [ + ::eip712_data_word( + &self.name, + ) + .0, + ::eip712_data_word( + &self.txSenderAddress, + ) + .0, + ::eip712_data_word( + &self.signerAddress, + ) + .0, + ::eip712_data_word( + &self.storageUrl, + ) + .0, + ] + .concat() + } + } + #[automatically_derived] + impl alloy_sol_types::EventTopic for CoprocessorV2 { + #[inline] + fn topic_preimage_length(rust: &Self::RustType) -> usize { + 0usize + + ::topic_preimage_length( + &rust.name, + ) + + ::topic_preimage_length( + &rust.txSenderAddress, + ) + + ::topic_preimage_length( + &rust.signerAddress, + ) + + ::topic_preimage_length( + &rust.storageUrl, + ) + } + #[inline] + fn encode_topic_preimage( + rust: &Self::RustType, + out: &mut alloy_sol_types::private::Vec, + ) { + out.reserve( + ::topic_preimage_length(rust), + ); + ::encode_topic_preimage( + &rust.name, + out, + ); + ::encode_topic_preimage( + &rust.txSenderAddress, + out, + ); + ::encode_topic_preimage( + &rust.signerAddress, + out, + ); + ::encode_topic_preimage( + &rust.storageUrl, + out, + ); + } + #[inline] + fn encode_topic( + rust: &Self::RustType, + ) -> alloy_sol_types::abi::token::WordToken { + let mut out = alloy_sol_types::private::Vec::new(); + ::encode_topic_preimage( + rust, + &mut out, + ); + alloy_sol_types::abi::token::WordToken( + alloy_sol_types::private::keccak256(out), + ) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `CoprocessorContextNotInitialized(uint256)` and selector `0xabf9e7b0`. +```solidity +error CoprocessorContextNotInitialized(uint256 contextId); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct CoprocessorContextNotInitialized { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: CoprocessorContextNotInitialized) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for CoprocessorContextNotInitialized { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for CoprocessorContextNotInitialized { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "CoprocessorContextNotInitialized(uint256)"; + const SELECTOR: [u8; 4] = [171u8, 249u8, 231u8, 176u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `CoprocessorSignerAddressesNotUnique(address,uint256,(string,address,address,string)[])` and selector `0xc826e1a2`. +```solidity +error CoprocessorSignerAddressesNotUnique(address signerAddress, uint256 coprocessorIndex, CoprocessorV2[] coprocessors); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct CoprocessorSignerAddressesNotUnique { + #[allow(missing_docs)] + pub signerAddress: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub coprocessorIndex: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Address, + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Vec< + ::RustType, + >, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: CoprocessorSignerAddressesNotUnique) -> Self { + (value.signerAddress, value.coprocessorIndex, value.coprocessors) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for CoprocessorSignerAddressesNotUnique { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + signerAddress: tuple.0, + coprocessorIndex: tuple.1, + coprocessors: tuple.2, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for CoprocessorSignerAddressesNotUnique { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "CoprocessorSignerAddressesNotUnique(address,uint256,(string,address,address,string)[])"; + const SELECTOR: [u8; 4] = [200u8, 38u8, 225u8, 162u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.signerAddress, + ), + as alloy_sol_types::SolType>::tokenize(&self.coprocessorIndex), + as alloy_sol_types::SolType>::tokenize(&self.coprocessors), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `CoprocessorTxSenderAddressesNotUnique(address,uint256,(string,address,address,string)[])` and selector `0x64d52759`. +```solidity +error CoprocessorTxSenderAddressesNotUnique(address txSenderAddress, uint256 coprocessorIndex, CoprocessorV2[] coprocessors); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct CoprocessorTxSenderAddressesNotUnique { + #[allow(missing_docs)] + pub txSenderAddress: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub coprocessorIndex: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Address, + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Vec< + ::RustType, + >, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: CoprocessorTxSenderAddressesNotUnique) -> Self { + (value.txSenderAddress, value.coprocessorIndex, value.coprocessors) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for CoprocessorTxSenderAddressesNotUnique { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + txSenderAddress: tuple.0, + coprocessorIndex: tuple.1, + coprocessors: tuple.2, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for CoprocessorTxSenderAddressesNotUnique { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "CoprocessorTxSenderAddressesNotUnique(address,uint256,(string,address,address,string)[])"; + const SELECTOR: [u8; 4] = [100u8, 213u8, 39u8, 89u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.txSenderAddress, + ), + as alloy_sol_types::SolType>::tokenize(&self.coprocessorIndex), + as alloy_sol_types::SolType>::tokenize(&self.coprocessors), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `EmptyCoprocessors()` and selector `0x8af082ef`. +```solidity +error EmptyCoprocessors(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct EmptyCoprocessors; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: EmptyCoprocessors) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for EmptyCoprocessors { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for EmptyCoprocessors { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "EmptyCoprocessors()"; + const SELECTOR: [u8; 4] = [138u8, 240u8, 130u8, 239u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InvalidContextStatusForceUpdate(uint256,uint8)` and selector `0xf0bed68f`. +```solidity +error InvalidContextStatusForceUpdate(uint256 contextId, ContextStatus status); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidContextStatusForceUpdate { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub status: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + ContextStatus, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: InvalidContextStatusForceUpdate) -> Self { + (value.contextId, value.status) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for InvalidContextStatusForceUpdate { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + status: tuple.1, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InvalidContextStatusForceUpdate { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InvalidContextStatusForceUpdate(uint256,uint8)"; + const SELECTOR: [u8; 4] = [240u8, 190u8, 214u8, 143u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize(&self.status), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NoActiveCoprocessorContext()` and selector `0x046593ea`. +```solidity +error NoActiveCoprocessorContext(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NoActiveCoprocessorContext; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NoActiveCoprocessorContext) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NoActiveCoprocessorContext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NoActiveCoprocessorContext { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NoActiveCoprocessorContext()"; + const SELECTOR: [u8; 4] = [4u8, 101u8, 147u8, 234u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NoPreActivationCoprocessorContext()` and selector `0xb9e861b2`. +```solidity +error NoPreActivationCoprocessorContext(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NoPreActivationCoprocessorContext; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NoPreActivationCoprocessorContext) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NoPreActivationCoprocessorContext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NoPreActivationCoprocessorContext { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NoPreActivationCoprocessorContext()"; + const SELECTOR: [u8; 4] = [185u8, 232u8, 97u8, 178u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NoSuspendedCoprocessorContext()` and selector `0x21fb08f9`. +```solidity +error NoSuspendedCoprocessorContext(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NoSuspendedCoprocessorContext; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NoSuspendedCoprocessorContext) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NoSuspendedCoprocessorContext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NoSuspendedCoprocessorContext { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NoSuspendedCoprocessorContext()"; + const SELECTOR: [u8; 4] = [33u8, 251u8, 8u8, 249u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NotCoprocessorFromContext(uint256,address)` and selector `0xc312e73e`. +```solidity +error NotCoprocessorFromContext(uint256 contextId, address coprocessorTxSenderAddress); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NotCoprocessorFromContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub coprocessorTxSenderAddress: alloy::sol_types::private::Address, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NotCoprocessorFromContext) -> Self { + (value.contextId, value.coprocessorTxSenderAddress) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NotCoprocessorFromContext { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + coprocessorTxSenderAddress: tuple.1, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NotCoprocessorFromContext { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NotCoprocessorFromContext(uint256,address)"; + const SELECTOR: [u8; 4] = [195u8, 18u8, 231u8, 62u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.coprocessorTxSenderAddress, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NullCoprocessorSignerAddress(uint256,(string,address,address,string)[])` and selector `0x4a6c5974`. +```solidity +error NullCoprocessorSignerAddress(uint256 coprocessorIndex, CoprocessorV2[] coprocessors); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NullCoprocessorSignerAddress { + #[allow(missing_docs)] + pub coprocessorIndex: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Vec< + ::RustType, + >, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NullCoprocessorSignerAddress) -> Self { + (value.coprocessorIndex, value.coprocessors) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NullCoprocessorSignerAddress { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + coprocessorIndex: tuple.0, + coprocessors: tuple.1, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NullCoprocessorSignerAddress { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NullCoprocessorSignerAddress(uint256,(string,address,address,string)[])"; + const SELECTOR: [u8; 4] = [74u8, 108u8, 89u8, 116u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.coprocessorIndex), + as alloy_sol_types::SolType>::tokenize(&self.coprocessors), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `NullCoprocessorTxSenderAddress(uint256,(string,address,address,string)[])` and selector `0x9edb7861`. +```solidity +error NullCoprocessorTxSenderAddress(uint256 coprocessorIndex, CoprocessorV2[] coprocessors); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct NullCoprocessorTxSenderAddress { + #[allow(missing_docs)] + pub coprocessorIndex: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Vec< + ::RustType, + >, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NullCoprocessorTxSenderAddress) -> Self { + (value.coprocessorIndex, value.coprocessors) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for NullCoprocessorTxSenderAddress { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + coprocessorIndex: tuple.0, + coprocessors: tuple.1, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for NullCoprocessorTxSenderAddress { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "NullCoprocessorTxSenderAddress(uint256,(string,address,address,string)[])"; + const SELECTOR: [u8; 4] = [158u8, 219u8, 120u8, 97u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.coprocessorIndex), + as alloy_sol_types::SolType>::tokenize(&self.coprocessors), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `ActivateCoprocessorContext(uint256)` and selector `0x6c8c04c9fea337720b7dfadca365e850035114fd081b58d030afbe8b5dc3be71`. +```solidity +event ActivateCoprocessorContext(uint256 contextId); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct ActivateCoprocessorContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for ActivateCoprocessorContext { + type DataTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "ActivateCoprocessorContext(uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 108u8, 140u8, 4u8, 201u8, 254u8, 163u8, 55u8, 114u8, 11u8, 125u8, 250u8, + 220u8, 163u8, 101u8, 232u8, 80u8, 3u8, 81u8, 20u8, 253u8, 8u8, 27u8, + 88u8, 208u8, 48u8, 175u8, 190u8, 139u8, 93u8, 195u8, 190u8, 113u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { contextId: data.0 } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for ActivateCoprocessorContext { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&ActivateCoprocessorContext> for alloy_sol_types::private::LogData { + #[inline] + fn from( + this: &ActivateCoprocessorContext, + ) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `CompromiseCoprocessorContext(uint256)` and selector `0xee7ef83963417125d27430789fc6e94194381e82c3cda68260d0e7cfc31eaf21`. +```solidity +event CompromiseCoprocessorContext(uint256 contextId); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct CompromiseCoprocessorContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for CompromiseCoprocessorContext { + type DataTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "CompromiseCoprocessorContext(uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 238u8, 126u8, 248u8, 57u8, 99u8, 65u8, 113u8, 37u8, 210u8, 116u8, 48u8, + 120u8, 159u8, 198u8, 233u8, 65u8, 148u8, 56u8, 30u8, 130u8, 195u8, 205u8, + 166u8, 130u8, 96u8, 208u8, 231u8, 207u8, 195u8, 30u8, 175u8, 33u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { contextId: data.0 } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for CompromiseCoprocessorContext { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&CompromiseCoprocessorContext> for alloy_sol_types::private::LogData { + #[inline] + fn from( + this: &CompromiseCoprocessorContext, + ) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `DeactivateCoprocessorContext(uint256)` and selector `0x1baa08d8de18e8e2287691b1309748010981ebdfd12a173d8574657548a52898`. +```solidity +event DeactivateCoprocessorContext(uint256 contextId); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct DeactivateCoprocessorContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for DeactivateCoprocessorContext { + type DataTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "DeactivateCoprocessorContext(uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 27u8, 170u8, 8u8, 216u8, 222u8, 24u8, 232u8, 226u8, 40u8, 118u8, 145u8, + 177u8, 48u8, 151u8, 72u8, 1u8, 9u8, 129u8, 235u8, 223u8, 209u8, 42u8, + 23u8, 61u8, 133u8, 116u8, 101u8, 117u8, 72u8, 165u8, 40u8, 152u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { contextId: data.0 } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for DeactivateCoprocessorContext { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&DeactivateCoprocessorContext> for alloy_sol_types::private::LogData { + #[inline] + fn from( + this: &DeactivateCoprocessorContext, + ) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `DestroyCoprocessorContext(uint256)` and selector `0xf20b299804c9c1d6da3b82414c7aa0a845cdbabae2d90e46e360a379a77b7be5`. +```solidity +event DestroyCoprocessorContext(uint256 contextId); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct DestroyCoprocessorContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for DestroyCoprocessorContext { + type DataTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "DestroyCoprocessorContext(uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 242u8, 11u8, 41u8, 152u8, 4u8, 201u8, 193u8, 214u8, 218u8, 59u8, 130u8, + 65u8, 76u8, 122u8, 160u8, 168u8, 69u8, 205u8, 186u8, 186u8, 226u8, 217u8, + 14u8, 70u8, 227u8, 96u8, 163u8, 121u8, 167u8, 123u8, 123u8, 229u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { contextId: data.0 } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for DestroyCoprocessorContext { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&DestroyCoprocessorContext> for alloy_sol_types::private::LogData { + #[inline] + fn from( + this: &DestroyCoprocessorContext, + ) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `InitializeCoprocessorContexts(bytes,(string,address,address,string)[])` and selector `0xd474068ecf914caa04868493bcefa56bfb049a54f1612c2726d112e1e60663b9`. +```solidity +event InitializeCoprocessorContexts(bytes blob, CoprocessorV2[] coprocessors); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct InitializeCoprocessorContexts { + #[allow(missing_docs)] + pub blob: alloy::sol_types::private::Bytes, + #[allow(missing_docs)] + pub coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for InitializeCoprocessorContexts { + type DataTuple<'a> = ( + alloy::sol_types::sol_data::Bytes, + alloy::sol_types::sol_data::Array, + ); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "InitializeCoprocessorContexts(bytes,(string,address,address,string)[])"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 212u8, 116u8, 6u8, 142u8, 207u8, 145u8, 76u8, 170u8, 4u8, 134u8, 132u8, + 147u8, 188u8, 239u8, 165u8, 107u8, 251u8, 4u8, 154u8, 84u8, 241u8, 97u8, + 44u8, 39u8, 38u8, 209u8, 18u8, 225u8, 230u8, 6u8, 99u8, 185u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { + blob: data.0, + coprocessors: data.1, + } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + ::tokenize( + &self.blob, + ), + as alloy_sol_types::SolType>::tokenize(&self.coprocessors), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for InitializeCoprocessorContexts { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&InitializeCoprocessorContexts> for alloy_sol_types::private::LogData { + #[inline] + fn from( + this: &InitializeCoprocessorContexts, + ) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `NewCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256))` and selector `0xbbb104c495886e5daa3efb6b281ec2840c69385af5cbfc1582fcf700de1ecd4b`. +```solidity +event NewCoprocessorContext(CoprocessorContext activeCoprocessorContext, CoprocessorContext newCoprocessorContext, CoprocessorContextTimePeriods timePeriods); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct NewCoprocessorContext { + #[allow(missing_docs)] + pub activeCoprocessorContext: ::RustType, + #[allow(missing_docs)] + pub newCoprocessorContext: ::RustType, + #[allow(missing_docs)] + pub timePeriods: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for NewCoprocessorContext { + type DataTuple<'a> = ( + CoprocessorContext, + CoprocessorContext, + CoprocessorContextTimePeriods, + ); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "NewCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256))"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 187u8, 177u8, 4u8, 196u8, 149u8, 136u8, 110u8, 93u8, 170u8, 62u8, 251u8, + 107u8, 40u8, 30u8, 194u8, 132u8, 12u8, 105u8, 56u8, 90u8, 245u8, 203u8, + 252u8, 21u8, 130u8, 252u8, 247u8, 0u8, 222u8, 30u8, 205u8, 75u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { + activeCoprocessorContext: data.0, + newCoprocessorContext: data.1, + timePeriods: data.2, + } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + ::tokenize( + &self.activeCoprocessorContext, + ), + ::tokenize( + &self.newCoprocessorContext, + ), + ::tokenize( + &self.timePeriods, + ), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for NewCoprocessorContext { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&NewCoprocessorContext> for alloy_sol_types::private::LogData { + #[inline] + fn from(this: &NewCoprocessorContext) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `PreActivateCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),uint256)` and selector `0x0425f54e602cbcf87fafd6a0b557fa5c4bc4bc6c251686255eb3bd775f452377`. +```solidity +event PreActivateCoprocessorContext(CoprocessorContext newCoprocessorContext, uint256 activationBlockTimestamp); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct PreActivateCoprocessorContext { + #[allow(missing_docs)] + pub newCoprocessorContext: ::RustType, + #[allow(missing_docs)] + pub activationBlockTimestamp: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for PreActivateCoprocessorContext { + type DataTuple<'a> = ( + CoprocessorContext, + alloy::sol_types::sol_data::Uint<256>, + ); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "PreActivateCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 4u8, 37u8, 245u8, 78u8, 96u8, 44u8, 188u8, 248u8, 127u8, 175u8, 214u8, + 160u8, 181u8, 87u8, 250u8, 92u8, 75u8, 196u8, 188u8, 108u8, 37u8, 22u8, + 134u8, 37u8, 94u8, 179u8, 189u8, 119u8, 95u8, 69u8, 35u8, 119u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { + newCoprocessorContext: data.0, + activationBlockTimestamp: data.1, + } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + ::tokenize( + &self.newCoprocessorContext, + ), + as alloy_sol_types::SolType>::tokenize( + &self.activationBlockTimestamp, + ), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for PreActivateCoprocessorContext { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&PreActivateCoprocessorContext> for alloy_sol_types::private::LogData { + #[inline] + fn from( + this: &PreActivateCoprocessorContext, + ) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Event with signature `SuspendCoprocessorContext(uint256,uint256)` and selector `0x3080f2b80dda4748ca2926a641fa5007735058dc5f5ab2594eeca74197a3accc`. +```solidity +event SuspendCoprocessorContext(uint256 contextId, uint256 deactivatedBlockTimestamp); +```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct SuspendCoprocessorContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub deactivatedBlockTimestamp: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for SuspendCoprocessorContext { + type DataTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + ); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "SuspendCoprocessorContext(uint256,uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ + 48u8, 128u8, 242u8, 184u8, 13u8, 218u8, 71u8, 72u8, 202u8, 41u8, 38u8, + 166u8, 65u8, 250u8, 80u8, 7u8, 115u8, 80u8, 88u8, 220u8, 95u8, 90u8, + 178u8, 89u8, 78u8, 236u8, 167u8, 65u8, 151u8, 163u8, 172u8, 204u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { + contextId: data.0, + deactivatedBlockTimestamp: data.1, + } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err( + alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + ), + ); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + as alloy_sol_types::SolType>::tokenize( + &self.deactivatedBlockTimestamp, + ), + ) + } + #[inline] + fn topics(&self) -> ::RustType { + (Self::SIGNATURE_HASH.into(),) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken( + Self::SIGNATURE_HASH, + ); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for SuspendCoprocessorContext { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&SuspendCoprocessorContext> for alloy_sol_types::private::LogData { + #[inline] + fn from( + this: &SuspendCoprocessorContext, + ) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `addCoprocessorContext(bytes,(string,address,address,string)[],(uint256,uint256))` and selector `0xa1364d79`. +```solidity +function addCoprocessorContext(bytes memory blob, CoprocessorV2[] memory coprocessors, CoprocessorContextTimePeriods memory timePeriods) external; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct addCoprocessorContextCall { + #[allow(missing_docs)] + pub blob: alloy::sol_types::private::Bytes, + #[allow(missing_docs)] + pub coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + #[allow(missing_docs)] + pub timePeriods: ::RustType, + } + ///Container type for the return parameters of the [`addCoprocessorContext(bytes,(string,address,address,string)[],(uint256,uint256))`](addCoprocessorContextCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct addCoprocessorContextReturn {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Bytes, + alloy::sol_types::sol_data::Array, + CoprocessorContextTimePeriods, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Bytes, + alloy::sol_types::private::Vec< + ::RustType, + >, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: addCoprocessorContextCall) -> Self { + (value.blob, value.coprocessors, value.timePeriods) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for addCoprocessorContextCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + blob: tuple.0, + coprocessors: tuple.1, + timePeriods: tuple.2, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: addCoprocessorContextReturn) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for addCoprocessorContextReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl addCoprocessorContextReturn { + fn _tokenize( + &self, + ) -> ::ReturnToken< + '_, + > { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for addCoprocessorContextCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Bytes, + alloy::sol_types::sol_data::Array, + CoprocessorContextTimePeriods, + ); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = addCoprocessorContextReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "addCoprocessorContext(bytes,(string,address,address,string)[],(uint256,uint256))"; + const SELECTOR: [u8; 4] = [161u8, 54u8, 77u8, 121u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.blob, + ), + as alloy_sol_types::SolType>::tokenize(&self.coprocessors), + ::tokenize( + &self.timePeriods, + ), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + addCoprocessorContextReturn::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `forceUpdateCoprocessorContextToStatus(uint256,uint8)` and selector `0xcac6a5a8`. +```solidity +function forceUpdateCoprocessorContextToStatus(uint256 contextId, ContextStatus status) external; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct forceUpdateCoprocessorContextToStatusCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub status: ::RustType, + } + ///Container type for the return parameters of the [`forceUpdateCoprocessorContextToStatus(uint256,uint8)`](forceUpdateCoprocessorContextToStatusCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct forceUpdateCoprocessorContextToStatusReturn {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + ContextStatus, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: forceUpdateCoprocessorContextToStatusCall) -> Self { + (value.contextId, value.status) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for forceUpdateCoprocessorContextToStatusCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + status: tuple.1, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: forceUpdateCoprocessorContextToStatusReturn) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for forceUpdateCoprocessorContextToStatusReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl forceUpdateCoprocessorContextToStatusReturn { + fn _tokenize( + &self, + ) -> ::ReturnToken< + '_, + > { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for forceUpdateCoprocessorContextToStatusCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>, ContextStatus); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = forceUpdateCoprocessorContextToStatusReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "forceUpdateCoprocessorContextToStatus(uint256,uint8)"; + const SELECTOR: [u8; 4] = [202u8, 198u8, 165u8, 168u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize(&self.status), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + forceUpdateCoprocessorContextToStatusReturn::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getActiveCoprocessorContext()` and selector `0xfed9716b`. +```solidity +function getActiveCoprocessorContext() external view returns (CoprocessorContext memory); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getActiveCoprocessorContextCall; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getActiveCoprocessorContext()`](getActiveCoprocessorContextCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getActiveCoprocessorContextReturn { + #[allow(missing_docs)] + pub _0: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getActiveCoprocessorContextCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getActiveCoprocessorContextCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (CoprocessorContext,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getActiveCoprocessorContextReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getActiveCoprocessorContextReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getActiveCoprocessorContextCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = ::RustType; + type ReturnTuple<'a> = (CoprocessorContext,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getActiveCoprocessorContext()"; + const SELECTOR: [u8; 4] = [254u8, 217u8, 113u8, 107u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + (::tokenize(ret),) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getActiveCoprocessorContextReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getActiveCoprocessorContextReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getActiveCoprocessorContextId()` and selector `0x991dc36d`. +```solidity +function getActiveCoprocessorContextId() external view returns (uint256); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getActiveCoprocessorContextIdCall; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getActiveCoprocessorContextId()`](getActiveCoprocessorContextIdCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getActiveCoprocessorContextIdReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getActiveCoprocessorContextIdCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getActiveCoprocessorContextIdCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getActiveCoprocessorContextIdReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getActiveCoprocessorContextIdReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getActiveCoprocessorContextIdCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getActiveCoprocessorContextId()"; + const SELECTOR: [u8; 4] = [153u8, 29u8, 195u8, 109u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getActiveCoprocessorContextIdReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getActiveCoprocessorContextIdReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getCoprocessor(uint256,address)` and selector `0x820a91f8`. +```solidity +function getCoprocessor(uint256 contextId, address coprocessorTxSenderAddress) external view returns (CoprocessorV2 memory); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub coprocessorTxSenderAddress: alloy::sol_types::private::Address, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getCoprocessor(uint256,address)`](getCoprocessorCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorReturn { + #[allow(missing_docs)] + pub _0: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorCall) -> Self { + (value.contextId, value.coprocessorTxSenderAddress) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for getCoprocessorCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + coprocessorTxSenderAddress: tuple.1, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (CoprocessorV2,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getCoprocessorCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = ::RustType; + type ReturnTuple<'a> = (CoprocessorV2,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getCoprocessor(uint256,address)"; + const SELECTOR: [u8; 4] = [130u8, 10u8, 145u8, 248u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.coprocessorTxSenderAddress, + ), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + (::tokenize(ret),) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getCoprocessorReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getCoprocessorReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getCoprocessorActivationBlockTimestamp(uint256)` and selector `0xb3f5403a`. +```solidity +function getCoprocessorActivationBlockTimestamp(uint256 contextId) external view returns (uint256); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorActivationBlockTimestampCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getCoprocessorActivationBlockTimestamp(uint256)`](getCoprocessorActivationBlockTimestampCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorActivationBlockTimestampReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorActivationBlockTimestampCall) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorActivationBlockTimestampCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorActivationBlockTimestampReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorActivationBlockTimestampReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getCoprocessorActivationBlockTimestampCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getCoprocessorActivationBlockTimestamp(uint256)"; + const SELECTOR: [u8; 4] = [179u8, 245u8, 64u8, 58u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getCoprocessorActivationBlockTimestampReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getCoprocessorActivationBlockTimestampReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getCoprocessorContextStatus(uint256)` and selector `0x888b99e0`. +```solidity +function getCoprocessorContextStatus(uint256 contextId) external view returns (ContextStatus); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorContextStatusCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getCoprocessorContextStatus(uint256)`](getCoprocessorContextStatusCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorContextStatusReturn { + #[allow(missing_docs)] + pub _0: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorContextStatusCall) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorContextStatusCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (ContextStatus,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorContextStatusReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorContextStatusReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getCoprocessorContextStatusCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = ::RustType; + type ReturnTuple<'a> = (ContextStatus,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getCoprocessorContextStatus(uint256)"; + const SELECTOR: [u8; 4] = [136u8, 139u8, 153u8, 224u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + (::tokenize(ret),) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getCoprocessorContextStatusReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getCoprocessorContextStatusReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getCoprocessorDeactivatedBlockTimestamp(uint256)` and selector `0xa9b4d071`. +```solidity +function getCoprocessorDeactivatedBlockTimestamp(uint256 contextId) external view returns (uint256); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorDeactivatedBlockTimestampCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getCoprocessorDeactivatedBlockTimestamp(uint256)`](getCoprocessorDeactivatedBlockTimestampCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorDeactivatedBlockTimestampReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorDeactivatedBlockTimestampCall) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorDeactivatedBlockTimestampCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorDeactivatedBlockTimestampReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorDeactivatedBlockTimestampReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getCoprocessorDeactivatedBlockTimestampCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getCoprocessorDeactivatedBlockTimestamp(uint256)"; + const SELECTOR: [u8; 4] = [169u8, 180u8, 208u8, 113u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getCoprocessorDeactivatedBlockTimestampReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getCoprocessorDeactivatedBlockTimestampReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getCoprocessorMajorityThreshold(uint256)` and selector `0xf88174ea`. +```solidity +function getCoprocessorMajorityThreshold(uint256 contextId) external view returns (uint256); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorMajorityThresholdCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getCoprocessorMajorityThreshold(uint256)`](getCoprocessorMajorityThresholdCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorMajorityThresholdReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorMajorityThresholdCall) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorMajorityThresholdCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorMajorityThresholdReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorMajorityThresholdReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getCoprocessorMajorityThresholdCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getCoprocessorMajorityThreshold(uint256)"; + const SELECTOR: [u8; 4] = [248u8, 129u8, 116u8, 234u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getCoprocessorMajorityThresholdReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getCoprocessorMajorityThresholdReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getCoprocessorSigners(uint256)` and selector `0x41618fe9`. +```solidity +function getCoprocessorSigners(uint256 contextId) external view returns (address[] memory); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorSignersCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getCoprocessorSigners(uint256)`](getCoprocessorSignersCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorSignersReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::Vec, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorSignersCall) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorSignersCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Vec, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorSignersReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorSignersReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getCoprocessorSignersCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::Vec< + alloy::sol_types::private::Address, + >; + type ReturnTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getCoprocessorSigners(uint256)"; + const SELECTOR: [u8; 4] = [65u8, 97u8, 143u8, 233u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getCoprocessorSignersReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getCoprocessorSignersReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getCoprocessorTxSenders(uint256)` and selector `0x049f25ef`. +```solidity +function getCoprocessorTxSenders(uint256 contextId) external view returns (address[] memory); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorTxSendersCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getCoprocessorTxSenders(uint256)`](getCoprocessorTxSendersCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getCoprocessorTxSendersReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::Vec, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorTxSendersCall) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorTxSendersCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Vec, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCoprocessorTxSendersReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getCoprocessorTxSendersReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getCoprocessorTxSendersCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::Vec< + alloy::sol_types::private::Address, + >; + type ReturnTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getCoprocessorTxSenders(uint256)"; + const SELECTOR: [u8; 4] = [4u8, 159u8, 37u8, 239u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getCoprocessorTxSendersReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getCoprocessorTxSendersReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getPreActivationCoprocessorContextId()` and selector `0xbe91187b`. +```solidity +function getPreActivationCoprocessorContextId() external view returns (uint256); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getPreActivationCoprocessorContextIdCall; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getPreActivationCoprocessorContextId()`](getPreActivationCoprocessorContextIdCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getPreActivationCoprocessorContextIdReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getPreActivationCoprocessorContextIdCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getPreActivationCoprocessorContextIdCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getPreActivationCoprocessorContextIdReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getPreActivationCoprocessorContextIdReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getPreActivationCoprocessorContextIdCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getPreActivationCoprocessorContextId()"; + const SELECTOR: [u8; 4] = [190u8, 145u8, 24u8, 123u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getPreActivationCoprocessorContextIdReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getPreActivationCoprocessorContextIdReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getSuspendedCoprocessorContextId()` and selector `0x086e4e1c`. +```solidity +function getSuspendedCoprocessorContextId() external view returns (uint256); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getSuspendedCoprocessorContextIdCall; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getSuspendedCoprocessorContextId()`](getSuspendedCoprocessorContextIdCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getSuspendedCoprocessorContextIdReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getSuspendedCoprocessorContextIdCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getSuspendedCoprocessorContextIdCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getSuspendedCoprocessorContextIdReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for getSuspendedCoprocessorContextIdReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getSuspendedCoprocessorContextIdCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getSuspendedCoprocessorContextId()"; + const SELECTOR: [u8; 4] = [8u8, 110u8, 78u8, 28u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getSuspendedCoprocessorContextIdReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getSuspendedCoprocessorContextIdReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `getVersion()` and selector `0x0d8e6e2c`. +```solidity +function getVersion() external pure returns (string memory); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getVersionCall; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`getVersion()`](getVersionCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct getVersionReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::String, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getVersionCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for getVersionCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::String,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::String,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getVersionReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for getVersionReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for getVersionCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::String; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::String,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "getVersion()"; + const SELECTOR: [u8; 4] = [13u8, 142u8, 110u8, 44u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + ::tokenize( + ret, + ), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: getVersionReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: getVersionReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `isCoprocessorContextOperating(uint256)` and selector `0xcd8e993c`. +```solidity +function isCoprocessorContextOperating(uint256 contextId) external view returns (bool); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isCoprocessorContextOperatingCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`isCoprocessorContextOperating(uint256)`](isCoprocessorContextOperatingCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isCoprocessorContextOperatingReturn { + #[allow(missing_docs)] + pub _0: bool, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: isCoprocessorContextOperatingCall) -> Self { + (value.contextId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for isCoprocessorContextOperatingCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { contextId: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Bool,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (bool,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: isCoprocessorContextOperatingReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for isCoprocessorContextOperatingReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for isCoprocessorContextOperatingCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = bool; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "isCoprocessorContextOperating(uint256)"; + const SELECTOR: [u8; 4] = [205u8, 142u8, 153u8, 60u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + ::tokenize( + ret, + ), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: isCoprocessorContextOperatingReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: isCoprocessorContextOperatingReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `isCoprocessorSigner(uint256,address)` and selector `0xcdbb5a82`. +```solidity +function isCoprocessorSigner(uint256 contextId, address signerAddress) external view returns (bool); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isCoprocessorSignerCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub signerAddress: alloy::sol_types::private::Address, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`isCoprocessorSigner(uint256,address)`](isCoprocessorSignerCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isCoprocessorSignerReturn { + #[allow(missing_docs)] + pub _0: bool, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: isCoprocessorSignerCall) -> Self { + (value.contextId, value.signerAddress) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for isCoprocessorSignerCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + signerAddress: tuple.1, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Bool,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (bool,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: isCoprocessorSignerReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for isCoprocessorSignerReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for isCoprocessorSignerCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = bool; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "isCoprocessorSigner(uint256,address)"; + const SELECTOR: [u8; 4] = [205u8, 187u8, 90u8, 130u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.signerAddress, + ), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + ::tokenize( + ret, + ), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: isCoprocessorSignerReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: isCoprocessorSignerReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `isCoprocessorTxSender(uint256,address)` and selector `0x8625e876`. +```solidity +function isCoprocessorTxSender(uint256 contextId, address txSenderAddress) external view returns (bool); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isCoprocessorTxSenderCall { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub txSenderAddress: alloy::sol_types::private::Address, + } + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`isCoprocessorTxSender(uint256,address)`](isCoprocessorTxSenderCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isCoprocessorTxSenderReturn { + #[allow(missing_docs)] + pub _0: bool, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: isCoprocessorTxSenderCall) -> Self { + (value.contextId, value.txSenderAddress) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for isCoprocessorTxSenderCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + contextId: tuple.0, + txSenderAddress: tuple.1, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Bool,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (bool,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: isCoprocessorTxSenderReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for isCoprocessorTxSenderReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for isCoprocessorTxSenderCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = bool; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "isCoprocessorTxSender(uint256,address)"; + const SELECTOR: [u8; 4] = [134u8, 37u8, 232u8, 118u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.txSenderAddress, + ), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + ::tokenize( + ret, + ), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: isCoprocessorTxSenderReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: isCoprocessorTxSenderReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `refreshCoprocessorContextStatuses()` and selector `0x3a5162e6`. +```solidity +function refreshCoprocessorContextStatuses() external; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct refreshCoprocessorContextStatusesCall; + ///Container type for the return parameters of the [`refreshCoprocessorContextStatuses()`](refreshCoprocessorContextStatusesCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct refreshCoprocessorContextStatusesReturn {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: refreshCoprocessorContextStatusesCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for refreshCoprocessorContextStatusesCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: refreshCoprocessorContextStatusesReturn) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for refreshCoprocessorContextStatusesReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl refreshCoprocessorContextStatusesReturn { + fn _tokenize( + &self, + ) -> ::ReturnToken< + '_, + > { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for refreshCoprocessorContextStatusesCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = refreshCoprocessorContextStatusesReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "refreshCoprocessorContextStatuses()"; + const SELECTOR: [u8; 4] = [58u8, 81u8, 98u8, 230u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + refreshCoprocessorContextStatusesReturn::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `swapSuspendedCoprocessorContextWithActive(uint256)` and selector `0x86dfc7de`. +```solidity +function swapSuspendedCoprocessorContextWithActive(uint256 suspendedTimePeriod) external; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct swapSuspendedCoprocessorContextWithActiveCall { + #[allow(missing_docs)] + pub suspendedTimePeriod: alloy::sol_types::private::primitives::aliases::U256, + } + ///Container type for the return parameters of the [`swapSuspendedCoprocessorContextWithActive(uint256)`](swapSuspendedCoprocessorContextWithActiveCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct swapSuspendedCoprocessorContextWithActiveReturn {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: swapSuspendedCoprocessorContextWithActiveCall) -> Self { + (value.suspendedTimePeriod,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for swapSuspendedCoprocessorContextWithActiveCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + suspendedTimePeriod: tuple.0, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: swapSuspendedCoprocessorContextWithActiveReturn) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for swapSuspendedCoprocessorContextWithActiveReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl swapSuspendedCoprocessorContextWithActiveReturn { + fn _tokenize( + &self, + ) -> ::ReturnToken< + '_, + > { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for swapSuspendedCoprocessorContextWithActiveCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = swapSuspendedCoprocessorContextWithActiveReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "swapSuspendedCoprocessorContextWithActive(uint256)"; + const SELECTOR: [u8; 4] = [134u8, 223u8, 199u8, 222u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.suspendedTimePeriod), + ) + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + swapSuspendedCoprocessorContextWithActiveReturn::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + ///Container for all the [`ICoprocessorContexts`](self) function calls. + #[derive(serde::Serialize, serde::Deserialize)] + #[derive()] + pub enum ICoprocessorContextsCalls { + #[allow(missing_docs)] + addCoprocessorContext(addCoprocessorContextCall), + #[allow(missing_docs)] + forceUpdateCoprocessorContextToStatus(forceUpdateCoprocessorContextToStatusCall), + #[allow(missing_docs)] + getActiveCoprocessorContext(getActiveCoprocessorContextCall), + #[allow(missing_docs)] + getActiveCoprocessorContextId(getActiveCoprocessorContextIdCall), + #[allow(missing_docs)] + getCoprocessor(getCoprocessorCall), + #[allow(missing_docs)] + getCoprocessorActivationBlockTimestamp( + getCoprocessorActivationBlockTimestampCall, + ), + #[allow(missing_docs)] + getCoprocessorContextStatus(getCoprocessorContextStatusCall), + #[allow(missing_docs)] + getCoprocessorDeactivatedBlockTimestamp( + getCoprocessorDeactivatedBlockTimestampCall, + ), + #[allow(missing_docs)] + getCoprocessorMajorityThreshold(getCoprocessorMajorityThresholdCall), + #[allow(missing_docs)] + getCoprocessorSigners(getCoprocessorSignersCall), + #[allow(missing_docs)] + getCoprocessorTxSenders(getCoprocessorTxSendersCall), + #[allow(missing_docs)] + getPreActivationCoprocessorContextId(getPreActivationCoprocessorContextIdCall), + #[allow(missing_docs)] + getSuspendedCoprocessorContextId(getSuspendedCoprocessorContextIdCall), + #[allow(missing_docs)] + getVersion(getVersionCall), + #[allow(missing_docs)] + isCoprocessorContextOperating(isCoprocessorContextOperatingCall), + #[allow(missing_docs)] + isCoprocessorSigner(isCoprocessorSignerCall), + #[allow(missing_docs)] + isCoprocessorTxSender(isCoprocessorTxSenderCall), + #[allow(missing_docs)] + refreshCoprocessorContextStatuses(refreshCoprocessorContextStatusesCall), + #[allow(missing_docs)] + swapSuspendedCoprocessorContextWithActive( + swapSuspendedCoprocessorContextWithActiveCall, + ), + } + #[automatically_derived] + impl ICoprocessorContextsCalls { + /// All the selectors of this enum. + /// + /// Note that the selectors might not be in the same order as the variants. + /// No guarantees are made about the order of the selectors. + /// + /// Prefer using `SolInterface` methods instead. + pub const SELECTORS: &'static [[u8; 4usize]] = &[ + [4u8, 159u8, 37u8, 239u8], + [8u8, 110u8, 78u8, 28u8], + [13u8, 142u8, 110u8, 44u8], + [58u8, 81u8, 98u8, 230u8], + [65u8, 97u8, 143u8, 233u8], + [130u8, 10u8, 145u8, 248u8], + [134u8, 37u8, 232u8, 118u8], + [134u8, 223u8, 199u8, 222u8], + [136u8, 139u8, 153u8, 224u8], + [153u8, 29u8, 195u8, 109u8], + [161u8, 54u8, 77u8, 121u8], + [169u8, 180u8, 208u8, 113u8], + [179u8, 245u8, 64u8, 58u8], + [190u8, 145u8, 24u8, 123u8], + [202u8, 198u8, 165u8, 168u8], + [205u8, 142u8, 153u8, 60u8], + [205u8, 187u8, 90u8, 130u8], + [248u8, 129u8, 116u8, 234u8], + [254u8, 217u8, 113u8, 107u8], + ]; + } + #[automatically_derived] + impl alloy_sol_types::SolInterface for ICoprocessorContextsCalls { + const NAME: &'static str = "ICoprocessorContextsCalls"; + const MIN_DATA_LENGTH: usize = 0usize; + const COUNT: usize = 19usize; + #[inline] + fn selector(&self) -> [u8; 4] { + match self { + Self::addCoprocessorContext(_) => { + ::SELECTOR + } + Self::forceUpdateCoprocessorContextToStatus(_) => { + ::SELECTOR + } + Self::getActiveCoprocessorContext(_) => { + ::SELECTOR + } + Self::getActiveCoprocessorContextId(_) => { + ::SELECTOR + } + Self::getCoprocessor(_) => { + ::SELECTOR + } + Self::getCoprocessorActivationBlockTimestamp(_) => { + ::SELECTOR + } + Self::getCoprocessorContextStatus(_) => { + ::SELECTOR + } + Self::getCoprocessorDeactivatedBlockTimestamp(_) => { + ::SELECTOR + } + Self::getCoprocessorMajorityThreshold(_) => { + ::SELECTOR + } + Self::getCoprocessorSigners(_) => { + ::SELECTOR + } + Self::getCoprocessorTxSenders(_) => { + ::SELECTOR + } + Self::getPreActivationCoprocessorContextId(_) => { + ::SELECTOR + } + Self::getSuspendedCoprocessorContextId(_) => { + ::SELECTOR + } + Self::getVersion(_) => { + ::SELECTOR + } + Self::isCoprocessorContextOperating(_) => { + ::SELECTOR + } + Self::isCoprocessorSigner(_) => { + ::SELECTOR + } + Self::isCoprocessorTxSender(_) => { + ::SELECTOR + } + Self::refreshCoprocessorContextStatuses(_) => { + ::SELECTOR + } + Self::swapSuspendedCoprocessorContextWithActive(_) => { + ::SELECTOR + } + } + } + #[inline] + fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { + Self::SELECTORS.get(i).copied() + } + #[inline] + fn valid_selector(selector: [u8; 4]) -> bool { + Self::SELECTORS.binary_search(&selector).is_ok() + } + #[inline] + #[allow(non_snake_case)] + fn abi_decode_raw( + selector: [u8; 4], + data: &[u8], + ) -> alloy_sol_types::Result { + static DECODE_SHIMS: &[fn( + &[u8], + ) -> alloy_sol_types::Result] = &[ + { + fn getCoprocessorTxSenders( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ICoprocessorContextsCalls::getCoprocessorTxSenders) + } + getCoprocessorTxSenders + }, + { + fn getSuspendedCoprocessorContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsCalls::getSuspendedCoprocessorContextId, + ) + } + getSuspendedCoprocessorContextId + }, + { + fn getVersion( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ICoprocessorContextsCalls::getVersion) + } + getVersion + }, + { + fn refreshCoprocessorContextStatuses( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsCalls::refreshCoprocessorContextStatuses, + ) + } + refreshCoprocessorContextStatuses + }, + { + fn getCoprocessorSigners( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ICoprocessorContextsCalls::getCoprocessorSigners) + } + getCoprocessorSigners + }, + { + fn getCoprocessor( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ICoprocessorContextsCalls::getCoprocessor) + } + getCoprocessor + }, + { + fn isCoprocessorTxSender( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ICoprocessorContextsCalls::isCoprocessorTxSender) + } + isCoprocessorTxSender + }, + { + fn swapSuspendedCoprocessorContextWithActive( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsCalls::swapSuspendedCoprocessorContextWithActive, + ) + } + swapSuspendedCoprocessorContextWithActive + }, + { + fn getCoprocessorContextStatus( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ICoprocessorContextsCalls::getCoprocessorContextStatus) + } + getCoprocessorContextStatus + }, + { + fn getActiveCoprocessorContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsCalls::getActiveCoprocessorContextId, + ) + } + getActiveCoprocessorContextId + }, + { + fn addCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ICoprocessorContextsCalls::addCoprocessorContext) + } + addCoprocessorContext + }, + { + fn getCoprocessorDeactivatedBlockTimestamp( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsCalls::getCoprocessorDeactivatedBlockTimestamp, + ) + } + getCoprocessorDeactivatedBlockTimestamp + }, + { + fn getCoprocessorActivationBlockTimestamp( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsCalls::getCoprocessorActivationBlockTimestamp, + ) + } + getCoprocessorActivationBlockTimestamp + }, + { + fn getPreActivationCoprocessorContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsCalls::getPreActivationCoprocessorContextId, + ) + } + getPreActivationCoprocessorContextId + }, + { + fn forceUpdateCoprocessorContextToStatus( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsCalls::forceUpdateCoprocessorContextToStatus, + ) + } + forceUpdateCoprocessorContextToStatus + }, + { + fn isCoprocessorContextOperating( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsCalls::isCoprocessorContextOperating, + ) + } + isCoprocessorContextOperating + }, + { + fn isCoprocessorSigner( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ICoprocessorContextsCalls::isCoprocessorSigner) + } + isCoprocessorSigner + }, + { + fn getCoprocessorMajorityThreshold( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsCalls::getCoprocessorMajorityThreshold, + ) + } + getCoprocessorMajorityThreshold + }, + { + fn getActiveCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ICoprocessorContextsCalls::getActiveCoprocessorContext) + } + getActiveCoprocessorContext + }, + ]; + let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { + return Err( + alloy_sol_types::Error::unknown_selector( + ::NAME, + selector, + ), + ); + }; + DECODE_SHIMS[idx](data) + } + #[inline] + #[allow(non_snake_case)] + fn abi_decode_raw_validate( + selector: [u8; 4], + data: &[u8], + ) -> alloy_sol_types::Result { + static DECODE_VALIDATE_SHIMS: &[fn( + &[u8], + ) -> alloy_sol_types::Result] = &[ + { + fn getCoprocessorTxSenders( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ICoprocessorContextsCalls::getCoprocessorTxSenders) + } + getCoprocessorTxSenders + }, + { + fn getSuspendedCoprocessorContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsCalls::getSuspendedCoprocessorContextId, + ) + } + getSuspendedCoprocessorContextId + }, + { + fn getVersion( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ICoprocessorContextsCalls::getVersion) + } + getVersion + }, + { + fn refreshCoprocessorContextStatuses( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsCalls::refreshCoprocessorContextStatuses, + ) + } + refreshCoprocessorContextStatuses + }, + { + fn getCoprocessorSigners( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ICoprocessorContextsCalls::getCoprocessorSigners) + } + getCoprocessorSigners + }, + { + fn getCoprocessor( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ICoprocessorContextsCalls::getCoprocessor) + } + getCoprocessor + }, + { + fn isCoprocessorTxSender( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ICoprocessorContextsCalls::isCoprocessorTxSender) + } + isCoprocessorTxSender + }, + { + fn swapSuspendedCoprocessorContextWithActive( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsCalls::swapSuspendedCoprocessorContextWithActive, + ) + } + swapSuspendedCoprocessorContextWithActive + }, + { + fn getCoprocessorContextStatus( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ICoprocessorContextsCalls::getCoprocessorContextStatus) + } + getCoprocessorContextStatus + }, + { + fn getActiveCoprocessorContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsCalls::getActiveCoprocessorContextId, + ) + } + getActiveCoprocessorContextId + }, + { + fn addCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ICoprocessorContextsCalls::addCoprocessorContext) + } + addCoprocessorContext + }, + { + fn getCoprocessorDeactivatedBlockTimestamp( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsCalls::getCoprocessorDeactivatedBlockTimestamp, + ) + } + getCoprocessorDeactivatedBlockTimestamp + }, + { + fn getCoprocessorActivationBlockTimestamp( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsCalls::getCoprocessorActivationBlockTimestamp, + ) + } + getCoprocessorActivationBlockTimestamp + }, + { + fn getPreActivationCoprocessorContextId( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsCalls::getPreActivationCoprocessorContextId, + ) + } + getPreActivationCoprocessorContextId + }, + { + fn forceUpdateCoprocessorContextToStatus( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsCalls::forceUpdateCoprocessorContextToStatus, + ) + } + forceUpdateCoprocessorContextToStatus + }, + { + fn isCoprocessorContextOperating( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsCalls::isCoprocessorContextOperating, + ) + } + isCoprocessorContextOperating + }, + { + fn isCoprocessorSigner( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ICoprocessorContextsCalls::isCoprocessorSigner) + } + isCoprocessorSigner + }, + { + fn getCoprocessorMajorityThreshold( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsCalls::getCoprocessorMajorityThreshold, + ) + } + getCoprocessorMajorityThreshold + }, + { + fn getActiveCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ICoprocessorContextsCalls::getActiveCoprocessorContext) + } + getActiveCoprocessorContext + }, + ]; + let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { + return Err( + alloy_sol_types::Error::unknown_selector( + ::NAME, + selector, + ), + ); + }; + DECODE_VALIDATE_SHIMS[idx](data) + } + #[inline] + fn abi_encoded_size(&self) -> usize { + match self { + Self::addCoprocessorContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::forceUpdateCoprocessorContextToStatus(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getActiveCoprocessorContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getActiveCoprocessorContextId(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getCoprocessor(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getCoprocessorActivationBlockTimestamp(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getCoprocessorContextStatus(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getCoprocessorDeactivatedBlockTimestamp(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getCoprocessorMajorityThreshold(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getCoprocessorSigners(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getCoprocessorTxSenders(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getPreActivationCoprocessorContextId(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getSuspendedCoprocessorContextId(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::getVersion(inner) => { + ::abi_encoded_size(inner) + } + Self::isCoprocessorContextOperating(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::isCoprocessorSigner(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::isCoprocessorTxSender(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::refreshCoprocessorContextStatuses(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::swapSuspendedCoprocessorContextWithActive(inner) => { + ::abi_encoded_size( + inner, + ) + } + } + } + #[inline] + fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { + match self { + Self::addCoprocessorContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::forceUpdateCoprocessorContextToStatus(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getActiveCoprocessorContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getActiveCoprocessorContextId(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getCoprocessor(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getCoprocessorActivationBlockTimestamp(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getCoprocessorContextStatus(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getCoprocessorDeactivatedBlockTimestamp(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getCoprocessorMajorityThreshold(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getCoprocessorSigners(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getCoprocessorTxSenders(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getPreActivationCoprocessorContextId(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getSuspendedCoprocessorContextId(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::getVersion(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::isCoprocessorContextOperating(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::isCoprocessorSigner(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::isCoprocessorTxSender(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::refreshCoprocessorContextStatuses(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::swapSuspendedCoprocessorContextWithActive(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + } + } + } + ///Container for all the [`ICoprocessorContexts`](self) custom errors. + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Debug, PartialEq, Eq, Hash)] + pub enum ICoprocessorContextsErrors { + #[allow(missing_docs)] + CoprocessorContextNotInitialized(CoprocessorContextNotInitialized), + #[allow(missing_docs)] + CoprocessorSignerAddressesNotUnique(CoprocessorSignerAddressesNotUnique), + #[allow(missing_docs)] + CoprocessorTxSenderAddressesNotUnique(CoprocessorTxSenderAddressesNotUnique), + #[allow(missing_docs)] + EmptyCoprocessors(EmptyCoprocessors), + #[allow(missing_docs)] + InvalidContextStatusForceUpdate(InvalidContextStatusForceUpdate), + #[allow(missing_docs)] + NoActiveCoprocessorContext(NoActiveCoprocessorContext), + #[allow(missing_docs)] + NoPreActivationCoprocessorContext(NoPreActivationCoprocessorContext), + #[allow(missing_docs)] + NoSuspendedCoprocessorContext(NoSuspendedCoprocessorContext), + #[allow(missing_docs)] + NotCoprocessorFromContext(NotCoprocessorFromContext), + #[allow(missing_docs)] + NullCoprocessorSignerAddress(NullCoprocessorSignerAddress), + #[allow(missing_docs)] + NullCoprocessorTxSenderAddress(NullCoprocessorTxSenderAddress), + } + #[automatically_derived] + impl ICoprocessorContextsErrors { + /// All the selectors of this enum. + /// + /// Note that the selectors might not be in the same order as the variants. + /// No guarantees are made about the order of the selectors. + /// + /// Prefer using `SolInterface` methods instead. + pub const SELECTORS: &'static [[u8; 4usize]] = &[ + [4u8, 101u8, 147u8, 234u8], + [33u8, 251u8, 8u8, 249u8], + [74u8, 108u8, 89u8, 116u8], + [100u8, 213u8, 39u8, 89u8], + [138u8, 240u8, 130u8, 239u8], + [158u8, 219u8, 120u8, 97u8], + [171u8, 249u8, 231u8, 176u8], + [185u8, 232u8, 97u8, 178u8], + [195u8, 18u8, 231u8, 62u8], + [200u8, 38u8, 225u8, 162u8], + [240u8, 190u8, 214u8, 143u8], + ]; + } + #[automatically_derived] + impl alloy_sol_types::SolInterface for ICoprocessorContextsErrors { + const NAME: &'static str = "ICoprocessorContextsErrors"; + const MIN_DATA_LENGTH: usize = 0usize; + const COUNT: usize = 11usize; + #[inline] + fn selector(&self) -> [u8; 4] { + match self { + Self::CoprocessorContextNotInitialized(_) => { + ::SELECTOR + } + Self::CoprocessorSignerAddressesNotUnique(_) => { + ::SELECTOR + } + Self::CoprocessorTxSenderAddressesNotUnique(_) => { + ::SELECTOR + } + Self::EmptyCoprocessors(_) => { + ::SELECTOR + } + Self::InvalidContextStatusForceUpdate(_) => { + ::SELECTOR + } + Self::NoActiveCoprocessorContext(_) => { + ::SELECTOR + } + Self::NoPreActivationCoprocessorContext(_) => { + ::SELECTOR + } + Self::NoSuspendedCoprocessorContext(_) => { + ::SELECTOR + } + Self::NotCoprocessorFromContext(_) => { + ::SELECTOR + } + Self::NullCoprocessorSignerAddress(_) => { + ::SELECTOR + } + Self::NullCoprocessorTxSenderAddress(_) => { + ::SELECTOR + } + } + } + #[inline] + fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { + Self::SELECTORS.get(i).copied() + } + #[inline] + fn valid_selector(selector: [u8; 4]) -> bool { + Self::SELECTORS.binary_search(&selector).is_ok() + } + #[inline] + #[allow(non_snake_case)] + fn abi_decode_raw( + selector: [u8; 4], + data: &[u8], + ) -> alloy_sol_types::Result { + static DECODE_SHIMS: &[fn( + &[u8], + ) -> alloy_sol_types::Result] = &[ + { + fn NoActiveCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ICoprocessorContextsErrors::NoActiveCoprocessorContext) + } + NoActiveCoprocessorContext + }, + { + fn NoSuspendedCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsErrors::NoSuspendedCoprocessorContext, + ) + } + NoSuspendedCoprocessorContext + }, + { + fn NullCoprocessorSignerAddress( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsErrors::NullCoprocessorSignerAddress, + ) + } + NullCoprocessorSignerAddress + }, + { + fn CoprocessorTxSenderAddressesNotUnique( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsErrors::CoprocessorTxSenderAddressesNotUnique, + ) + } + CoprocessorTxSenderAddressesNotUnique + }, + { + fn EmptyCoprocessors( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ICoprocessorContextsErrors::EmptyCoprocessors) + } + EmptyCoprocessors + }, + { + fn NullCoprocessorTxSenderAddress( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsErrors::NullCoprocessorTxSenderAddress, + ) + } + NullCoprocessorTxSenderAddress + }, + { + fn CoprocessorContextNotInitialized( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsErrors::CoprocessorContextNotInitialized, + ) + } + CoprocessorContextNotInitialized + }, + { + fn NoPreActivationCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsErrors::NoPreActivationCoprocessorContext, + ) + } + NoPreActivationCoprocessorContext + }, + { + fn NotCoprocessorFromContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(ICoprocessorContextsErrors::NotCoprocessorFromContext) + } + NotCoprocessorFromContext + }, + { + fn CoprocessorSignerAddressesNotUnique( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsErrors::CoprocessorSignerAddressesNotUnique, + ) + } + CoprocessorSignerAddressesNotUnique + }, + { + fn InvalidContextStatusForceUpdate( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + ICoprocessorContextsErrors::InvalidContextStatusForceUpdate, + ) + } + InvalidContextStatusForceUpdate + }, + ]; + let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { + return Err( + alloy_sol_types::Error::unknown_selector( + ::NAME, + selector, + ), + ); + }; + DECODE_SHIMS[idx](data) + } + #[inline] + #[allow(non_snake_case)] + fn abi_decode_raw_validate( + selector: [u8; 4], + data: &[u8], + ) -> alloy_sol_types::Result { + static DECODE_VALIDATE_SHIMS: &[fn( + &[u8], + ) -> alloy_sol_types::Result] = &[ + { + fn NoActiveCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ICoprocessorContextsErrors::NoActiveCoprocessorContext) + } + NoActiveCoprocessorContext + }, + { + fn NoSuspendedCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsErrors::NoSuspendedCoprocessorContext, + ) + } + NoSuspendedCoprocessorContext + }, + { + fn NullCoprocessorSignerAddress( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsErrors::NullCoprocessorSignerAddress, + ) + } + NullCoprocessorSignerAddress + }, + { + fn CoprocessorTxSenderAddressesNotUnique( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsErrors::CoprocessorTxSenderAddressesNotUnique, + ) + } + CoprocessorTxSenderAddressesNotUnique + }, + { + fn EmptyCoprocessors( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ICoprocessorContextsErrors::EmptyCoprocessors) + } + EmptyCoprocessors + }, + { + fn NullCoprocessorTxSenderAddress( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsErrors::NullCoprocessorTxSenderAddress, + ) + } + NullCoprocessorTxSenderAddress + }, + { + fn CoprocessorContextNotInitialized( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsErrors::CoprocessorContextNotInitialized, + ) + } + CoprocessorContextNotInitialized + }, + { + fn NoPreActivationCoprocessorContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsErrors::NoPreActivationCoprocessorContext, + ) + } + NoPreActivationCoprocessorContext + }, + { + fn NotCoprocessorFromContext( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(ICoprocessorContextsErrors::NotCoprocessorFromContext) + } + NotCoprocessorFromContext + }, + { + fn CoprocessorSignerAddressesNotUnique( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsErrors::CoprocessorSignerAddressesNotUnique, + ) + } + CoprocessorSignerAddressesNotUnique + }, + { + fn InvalidContextStatusForceUpdate( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + ICoprocessorContextsErrors::InvalidContextStatusForceUpdate, + ) + } + InvalidContextStatusForceUpdate + }, + ]; + let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { + return Err( + alloy_sol_types::Error::unknown_selector( + ::NAME, + selector, + ), + ); + }; + DECODE_VALIDATE_SHIMS[idx](data) + } + #[inline] + fn abi_encoded_size(&self) -> usize { + match self { + Self::CoprocessorContextNotInitialized(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::CoprocessorSignerAddressesNotUnique(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::CoprocessorTxSenderAddressesNotUnique(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::EmptyCoprocessors(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::InvalidContextStatusForceUpdate(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NoActiveCoprocessorContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NoPreActivationCoprocessorContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NoSuspendedCoprocessorContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NotCoprocessorFromContext(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NullCoprocessorSignerAddress(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::NullCoprocessorTxSenderAddress(inner) => { + ::abi_encoded_size( + inner, + ) + } + } + } + #[inline] + fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { + match self { + Self::CoprocessorContextNotInitialized(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::CoprocessorSignerAddressesNotUnique(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::CoprocessorTxSenderAddressesNotUnique(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::EmptyCoprocessors(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::InvalidContextStatusForceUpdate(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NoActiveCoprocessorContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NoPreActivationCoprocessorContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NoSuspendedCoprocessorContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NotCoprocessorFromContext(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NullCoprocessorSignerAddress(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::NullCoprocessorTxSenderAddress(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + } + } + } + ///Container for all the [`ICoprocessorContexts`](self) events. + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Debug, PartialEq, Eq, Hash)] + pub enum ICoprocessorContextsEvents { + #[allow(missing_docs)] + ActivateCoprocessorContext(ActivateCoprocessorContext), + #[allow(missing_docs)] + CompromiseCoprocessorContext(CompromiseCoprocessorContext), + #[allow(missing_docs)] + DeactivateCoprocessorContext(DeactivateCoprocessorContext), + #[allow(missing_docs)] + DestroyCoprocessorContext(DestroyCoprocessorContext), + #[allow(missing_docs)] + InitializeCoprocessorContexts(InitializeCoprocessorContexts), + #[allow(missing_docs)] + NewCoprocessorContext(NewCoprocessorContext), + #[allow(missing_docs)] + PreActivateCoprocessorContext(PreActivateCoprocessorContext), + #[allow(missing_docs)] + SuspendCoprocessorContext(SuspendCoprocessorContext), + } + #[automatically_derived] + impl ICoprocessorContextsEvents { + /// All the selectors of this enum. + /// + /// Note that the selectors might not be in the same order as the variants. + /// No guarantees are made about the order of the selectors. + /// + /// Prefer using `SolInterface` methods instead. + pub const SELECTORS: &'static [[u8; 32usize]] = &[ + [ + 4u8, 37u8, 245u8, 78u8, 96u8, 44u8, 188u8, 248u8, 127u8, 175u8, 214u8, + 160u8, 181u8, 87u8, 250u8, 92u8, 75u8, 196u8, 188u8, 108u8, 37u8, 22u8, + 134u8, 37u8, 94u8, 179u8, 189u8, 119u8, 95u8, 69u8, 35u8, 119u8, + ], + [ + 27u8, 170u8, 8u8, 216u8, 222u8, 24u8, 232u8, 226u8, 40u8, 118u8, 145u8, + 177u8, 48u8, 151u8, 72u8, 1u8, 9u8, 129u8, 235u8, 223u8, 209u8, 42u8, + 23u8, 61u8, 133u8, 116u8, 101u8, 117u8, 72u8, 165u8, 40u8, 152u8, + ], + [ + 48u8, 128u8, 242u8, 184u8, 13u8, 218u8, 71u8, 72u8, 202u8, 41u8, 38u8, + 166u8, 65u8, 250u8, 80u8, 7u8, 115u8, 80u8, 88u8, 220u8, 95u8, 90u8, + 178u8, 89u8, 78u8, 236u8, 167u8, 65u8, 151u8, 163u8, 172u8, 204u8, + ], + [ + 108u8, 140u8, 4u8, 201u8, 254u8, 163u8, 55u8, 114u8, 11u8, 125u8, 250u8, + 220u8, 163u8, 101u8, 232u8, 80u8, 3u8, 81u8, 20u8, 253u8, 8u8, 27u8, + 88u8, 208u8, 48u8, 175u8, 190u8, 139u8, 93u8, 195u8, 190u8, 113u8, + ], + [ + 187u8, 177u8, 4u8, 196u8, 149u8, 136u8, 110u8, 93u8, 170u8, 62u8, 251u8, + 107u8, 40u8, 30u8, 194u8, 132u8, 12u8, 105u8, 56u8, 90u8, 245u8, 203u8, + 252u8, 21u8, 130u8, 252u8, 247u8, 0u8, 222u8, 30u8, 205u8, 75u8, + ], + [ + 212u8, 116u8, 6u8, 142u8, 207u8, 145u8, 76u8, 170u8, 4u8, 134u8, 132u8, + 147u8, 188u8, 239u8, 165u8, 107u8, 251u8, 4u8, 154u8, 84u8, 241u8, 97u8, + 44u8, 39u8, 38u8, 209u8, 18u8, 225u8, 230u8, 6u8, 99u8, 185u8, + ], + [ + 238u8, 126u8, 248u8, 57u8, 99u8, 65u8, 113u8, 37u8, 210u8, 116u8, 48u8, + 120u8, 159u8, 198u8, 233u8, 65u8, 148u8, 56u8, 30u8, 130u8, 195u8, 205u8, + 166u8, 130u8, 96u8, 208u8, 231u8, 207u8, 195u8, 30u8, 175u8, 33u8, + ], + [ + 242u8, 11u8, 41u8, 152u8, 4u8, 201u8, 193u8, 214u8, 218u8, 59u8, 130u8, + 65u8, 76u8, 122u8, 160u8, 168u8, 69u8, 205u8, 186u8, 186u8, 226u8, 217u8, + 14u8, 70u8, 227u8, 96u8, 163u8, 121u8, 167u8, 123u8, 123u8, 229u8, + ], + ]; + } + #[automatically_derived] + impl alloy_sol_types::SolEventInterface for ICoprocessorContextsEvents { + const NAME: &'static str = "ICoprocessorContextsEvents"; + const COUNT: usize = 8usize; + fn decode_raw_log( + topics: &[alloy_sol_types::Word], + data: &[u8], + ) -> alloy_sol_types::Result { + match topics.first().copied() { + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::ActivateCoprocessorContext) + } + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::CompromiseCoprocessorContext) + } + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::DeactivateCoprocessorContext) + } + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::DestroyCoprocessorContext) + } + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::InitializeCoprocessorContexts) + } + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::NewCoprocessorContext) + } + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::PreActivateCoprocessorContext) + } + Some( + ::SIGNATURE_HASH, + ) => { + ::decode_raw_log( + topics, + data, + ) + .map(Self::SuspendCoprocessorContext) + } + _ => { + alloy_sol_types::private::Err(alloy_sol_types::Error::InvalidLog { + name: ::NAME, + log: alloy_sol_types::private::Box::new( + alloy_sol_types::private::LogData::new_unchecked( + topics.to_vec(), + data.to_vec().into(), + ), + ), + }) + } + } + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for ICoprocessorContextsEvents { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + match self { + Self::ActivateCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::CompromiseCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::DeactivateCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::DestroyCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::InitializeCoprocessorContexts(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::NewCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::PreActivateCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + Self::SuspendCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::to_log_data(inner) + } + } + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + match self { + Self::ActivateCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::CompromiseCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::DeactivateCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::DestroyCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::InitializeCoprocessorContexts(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::NewCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::PreActivateCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + Self::SuspendCoprocessorContext(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } + } + } + } + use alloy::contract as alloy_contract; + /**Creates a new wrapper around an on-chain [`ICoprocessorContexts`](self) contract instance. + +See the [wrapper's documentation](`ICoprocessorContextsInstance`) for more details.*/ + #[inline] + pub const fn new< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >( + address: alloy_sol_types::private::Address, + provider: P, + ) -> ICoprocessorContextsInstance { + ICoprocessorContextsInstance::::new(address, provider) + } + /**Deploys this contract using the given `provider` and constructor arguments, if any. + +Returns a new instance of the contract, if the deployment was successful. + +For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ + #[inline] + pub fn deploy< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >( + provider: P, + ) -> impl ::core::future::Future< + Output = alloy_contract::Result>, + > { + ICoprocessorContextsInstance::::deploy(provider) + } + /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` +and constructor arguments, if any. + +This is a simple wrapper around creating a `RawCallBuilder` with the data set to +the bytecode concatenated with the constructor's ABI-encoded arguments.*/ + #[inline] + pub fn deploy_builder< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + >(provider: P) -> alloy_contract::RawCallBuilder { + ICoprocessorContextsInstance::::deploy_builder(provider) + } + /**A [`ICoprocessorContexts`](self) instance. + +Contains type-safe methods for interacting with an on-chain instance of the +[`ICoprocessorContexts`](self) contract located at a given `address`, using a given +provider `P`. + +If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) +documentation on how to provide it), the `deploy` and `deploy_builder` methods can +be used to deploy a new instance of the contract. + +See the [module-level documentation](self) for all the available methods.*/ + #[derive(Clone)] + pub struct ICoprocessorContextsInstance { + address: alloy_sol_types::private::Address, + provider: P, + _network: ::core::marker::PhantomData, + } + #[automatically_derived] + impl ::core::fmt::Debug for ICoprocessorContextsInstance { + #[inline] + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.debug_tuple("ICoprocessorContextsInstance").field(&self.address).finish() + } + } + /// Instantiation and getters/setters. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > ICoprocessorContextsInstance { + /**Creates a new wrapper around an on-chain [`ICoprocessorContexts`](self) contract instance. + +See the [wrapper's documentation](`ICoprocessorContextsInstance`) for more details.*/ + #[inline] + pub const fn new( + address: alloy_sol_types::private::Address, + provider: P, + ) -> Self { + Self { + address, + provider, + _network: ::core::marker::PhantomData, + } + } + /**Deploys this contract using the given `provider` and constructor arguments, if any. + +Returns a new instance of the contract, if the deployment was successful. + +For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ + #[inline] + pub async fn deploy( + provider: P, + ) -> alloy_contract::Result> { + let call_builder = Self::deploy_builder(provider); + let contract_address = call_builder.deploy().await?; + Ok(Self::new(contract_address, call_builder.provider)) + } + /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` +and constructor arguments, if any. + +This is a simple wrapper around creating a `RawCallBuilder` with the data set to +the bytecode concatenated with the constructor's ABI-encoded arguments.*/ + #[inline] + pub fn deploy_builder(provider: P) -> alloy_contract::RawCallBuilder { + alloy_contract::RawCallBuilder::new_raw_deploy( + provider, + ::core::clone::Clone::clone(&BYTECODE), + ) + } + /// Returns a reference to the address. + #[inline] + pub const fn address(&self) -> &alloy_sol_types::private::Address { + &self.address + } + /// Sets the address. + #[inline] + pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { + self.address = address; + } + /// Sets the address and returns `self`. + pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { + self.set_address(address); + self + } + /// Returns a reference to the provider. + #[inline] + pub const fn provider(&self) -> &P { + &self.provider + } + } + impl ICoprocessorContextsInstance<&P, N> { + /// Clones the provider and returns a new instance with the cloned provider. + #[inline] + pub fn with_cloned_provider(self) -> ICoprocessorContextsInstance { + ICoprocessorContextsInstance { + address: self.address, + provider: ::core::clone::Clone::clone(&self.provider), + _network: ::core::marker::PhantomData, + } + } + } + /// Function calls. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > ICoprocessorContextsInstance { + /// Creates a new call builder using this contract instance's provider and address. + /// + /// Note that the call can be any function call, not just those defined in this + /// contract. Prefer using the other methods for building type-safe contract calls. + pub fn call_builder( + &self, + call: &C, + ) -> alloy_contract::SolCallBuilder<&P, C, N> { + alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) + } + ///Creates a new call builder for the [`addCoprocessorContext`] function. + pub fn addCoprocessorContext( + &self, + blob: alloy::sol_types::private::Bytes, + coprocessors: alloy::sol_types::private::Vec< + ::RustType, + >, + timePeriods: ::RustType, + ) -> alloy_contract::SolCallBuilder<&P, addCoprocessorContextCall, N> { + self.call_builder( + &addCoprocessorContextCall { + blob, + coprocessors, + timePeriods, + }, + ) + } + ///Creates a new call builder for the [`forceUpdateCoprocessorContextToStatus`] function. + pub fn forceUpdateCoprocessorContextToStatus( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + status: ::RustType, + ) -> alloy_contract::SolCallBuilder< + &P, + forceUpdateCoprocessorContextToStatusCall, + N, + > { + self.call_builder( + &forceUpdateCoprocessorContextToStatusCall { + contextId, + status, + }, + ) + } + ///Creates a new call builder for the [`getActiveCoprocessorContext`] function. + pub fn getActiveCoprocessorContext( + &self, + ) -> alloy_contract::SolCallBuilder<&P, getActiveCoprocessorContextCall, N> { + self.call_builder(&getActiveCoprocessorContextCall) + } + ///Creates a new call builder for the [`getActiveCoprocessorContextId`] function. + pub fn getActiveCoprocessorContextId( + &self, + ) -> alloy_contract::SolCallBuilder<&P, getActiveCoprocessorContextIdCall, N> { + self.call_builder(&getActiveCoprocessorContextIdCall) + } + ///Creates a new call builder for the [`getCoprocessor`] function. + pub fn getCoprocessor( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + coprocessorTxSenderAddress: alloy::sol_types::private::Address, + ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorCall, N> { + self.call_builder( + &getCoprocessorCall { + contextId, + coprocessorTxSenderAddress, + }, + ) + } + ///Creates a new call builder for the [`getCoprocessorActivationBlockTimestamp`] function. + pub fn getCoprocessorActivationBlockTimestamp( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder< + &P, + getCoprocessorActivationBlockTimestampCall, + N, + > { + self.call_builder( + &getCoprocessorActivationBlockTimestampCall { + contextId, + }, + ) + } + ///Creates a new call builder for the [`getCoprocessorContextStatus`] function. + pub fn getCoprocessorContextStatus( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorContextStatusCall, N> { + self.call_builder( + &getCoprocessorContextStatusCall { + contextId, + }, + ) + } + ///Creates a new call builder for the [`getCoprocessorDeactivatedBlockTimestamp`] function. + pub fn getCoprocessorDeactivatedBlockTimestamp( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder< + &P, + getCoprocessorDeactivatedBlockTimestampCall, + N, + > { + self.call_builder( + &getCoprocessorDeactivatedBlockTimestampCall { + contextId, + }, + ) + } + ///Creates a new call builder for the [`getCoprocessorMajorityThreshold`] function. + pub fn getCoprocessorMajorityThreshold( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorMajorityThresholdCall, N> { + self.call_builder( + &getCoprocessorMajorityThresholdCall { + contextId, + }, + ) + } + ///Creates a new call builder for the [`getCoprocessorSigners`] function. + pub fn getCoprocessorSigners( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorSignersCall, N> { + self.call_builder( + &getCoprocessorSignersCall { + contextId, + }, + ) + } + ///Creates a new call builder for the [`getCoprocessorTxSenders`] function. + pub fn getCoprocessorTxSenders( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorTxSendersCall, N> { + self.call_builder( + &getCoprocessorTxSendersCall { + contextId, + }, + ) + } + ///Creates a new call builder for the [`getPreActivationCoprocessorContextId`] function. + pub fn getPreActivationCoprocessorContextId( + &self, + ) -> alloy_contract::SolCallBuilder< + &P, + getPreActivationCoprocessorContextIdCall, + N, + > { + self.call_builder(&getPreActivationCoprocessorContextIdCall) + } + ///Creates a new call builder for the [`getSuspendedCoprocessorContextId`] function. + pub fn getSuspendedCoprocessorContextId( + &self, + ) -> alloy_contract::SolCallBuilder< + &P, + getSuspendedCoprocessorContextIdCall, + N, + > { + self.call_builder(&getSuspendedCoprocessorContextIdCall) + } + ///Creates a new call builder for the [`getVersion`] function. + pub fn getVersion( + &self, + ) -> alloy_contract::SolCallBuilder<&P, getVersionCall, N> { + self.call_builder(&getVersionCall) + } + ///Creates a new call builder for the [`isCoprocessorContextOperating`] function. + pub fn isCoprocessorContextOperating( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder<&P, isCoprocessorContextOperatingCall, N> { + self.call_builder( + &isCoprocessorContextOperatingCall { + contextId, + }, + ) + } + ///Creates a new call builder for the [`isCoprocessorSigner`] function. + pub fn isCoprocessorSigner( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + signerAddress: alloy::sol_types::private::Address, + ) -> alloy_contract::SolCallBuilder<&P, isCoprocessorSignerCall, N> { + self.call_builder( + &isCoprocessorSignerCall { + contextId, + signerAddress, + }, + ) + } + ///Creates a new call builder for the [`isCoprocessorTxSender`] function. + pub fn isCoprocessorTxSender( + &self, + contextId: alloy::sol_types::private::primitives::aliases::U256, + txSenderAddress: alloy::sol_types::private::Address, + ) -> alloy_contract::SolCallBuilder<&P, isCoprocessorTxSenderCall, N> { + self.call_builder( + &isCoprocessorTxSenderCall { + contextId, + txSenderAddress, + }, + ) + } + ///Creates a new call builder for the [`refreshCoprocessorContextStatuses`] function. + pub fn refreshCoprocessorContextStatuses( + &self, + ) -> alloy_contract::SolCallBuilder< + &P, + refreshCoprocessorContextStatusesCall, + N, + > { + self.call_builder(&refreshCoprocessorContextStatusesCall) + } + ///Creates a new call builder for the [`swapSuspendedCoprocessorContextWithActive`] function. + pub fn swapSuspendedCoprocessorContextWithActive( + &self, + suspendedTimePeriod: alloy::sol_types::private::primitives::aliases::U256, + ) -> alloy_contract::SolCallBuilder< + &P, + swapSuspendedCoprocessorContextWithActiveCall, + N, + > { + self.call_builder( + &swapSuspendedCoprocessorContextWithActiveCall { + suspendedTimePeriod, + }, + ) + } + } + /// Event filters. + #[automatically_derived] + impl< + P: alloy_contract::private::Provider, + N: alloy_contract::private::Network, + > ICoprocessorContextsInstance { + /// Creates a new event filter using this contract instance's provider and address. + /// + /// Note that the type can be any event, not just those defined in this contract. + /// Prefer using the other methods for building type-safe event filters. + pub fn event_filter( + &self, + ) -> alloy_contract::Event<&P, E, N> { + alloy_contract::Event::new_sol(&self.provider, &self.address) + } + ///Creates a new event filter for the [`ActivateCoprocessorContext`] event. + pub fn ActivateCoprocessorContext_filter( + &self, + ) -> alloy_contract::Event<&P, ActivateCoprocessorContext, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`CompromiseCoprocessorContext`] event. + pub fn CompromiseCoprocessorContext_filter( + &self, + ) -> alloy_contract::Event<&P, CompromiseCoprocessorContext, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`DeactivateCoprocessorContext`] event. + pub fn DeactivateCoprocessorContext_filter( + &self, + ) -> alloy_contract::Event<&P, DeactivateCoprocessorContext, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`DestroyCoprocessorContext`] event. + pub fn DestroyCoprocessorContext_filter( + &self, + ) -> alloy_contract::Event<&P, DestroyCoprocessorContext, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`InitializeCoprocessorContexts`] event. + pub fn InitializeCoprocessorContexts_filter( + &self, + ) -> alloy_contract::Event<&P, InitializeCoprocessorContexts, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`NewCoprocessorContext`] event. + pub fn NewCoprocessorContext_filter( + &self, + ) -> alloy_contract::Event<&P, NewCoprocessorContext, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`PreActivateCoprocessorContext`] event. + pub fn PreActivateCoprocessorContext_filter( + &self, + ) -> alloy_contract::Event<&P, PreActivateCoprocessorContext, N> { + self.event_filter::() + } + ///Creates a new event filter for the [`SuspendCoprocessorContext`] event. + pub fn SuspendCoprocessorContext_filter( + &self, + ) -> alloy_contract::Event<&P, SuspendCoprocessorContext, N> { + self.event_filter::() + } + } +} diff --git a/gateway-contracts/rust_bindings/src/i_decryption.rs b/gateway-contracts/rust_bindings/src/i_decryption.rs index e2ecde0206..336e52a1d6 100644 --- a/gateway-contracts/rust_bindings/src/i_decryption.rs +++ b/gateway-contracts/rust_bindings/src/i_decryption.rs @@ -20,6 +20,7 @@ interface IDecryption { uint256 keyId; bytes32 snsCiphertextDigest; address[] coprocessorTxSenderAddresses; + uint256 contextId; } error ContractAddressesMaxLengthExceeded(uint256 maxLength, uint256 actualLength); @@ -363,6 +364,11 @@ interface IDecryption { "name": "coprocessorTxSenderAddresses", "type": "address[]", "internalType": "address[]" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" } ] }, @@ -441,6 +447,11 @@ interface IDecryption { "name": "coprocessorTxSenderAddresses", "type": "address[]", "internalType": "address[]" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" } ] }, @@ -586,6 +597,11 @@ interface IDecryption { "name": "coprocessorTxSenderAddresses", "type": "address[]", "internalType": "address[]" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" } ] }, @@ -613,6 +629,11 @@ interface IDecryption { "name": "coprocessorTxSenderAddresses", "type": "address[]", "internalType": "address[]" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" } ] } @@ -1476,7 +1497,7 @@ struct RequestValidity { uint256 startTimestamp; uint256 durationDays; } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] /**```solidity -struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphertextDigest; address[] coprocessorTxSenderAddresses; } +struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphertextDigest; address[] coprocessorTxSenderAddresses; uint256 contextId; } ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] @@ -1491,6 +1512,8 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe pub coprocessorTxSenderAddresses: alloy::sol_types::private::Vec< alloy::sol_types::private::Address, >, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -1506,6 +1529,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe alloy::sol_types::sol_data::Uint<256>, alloy::sol_types::sol_data::FixedBytes<32>, alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Uint<256>, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( @@ -1513,6 +1537,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe alloy::sol_types::private::primitives::aliases::U256, alloy::sol_types::private::FixedBytes<32>, alloy::sol_types::private::Vec, + alloy::sol_types::private::primitives::aliases::U256, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -1534,6 +1559,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe value.keyId, value.snsCiphertextDigest, value.coprocessorTxSenderAddresses, + value.contextId, ) } } @@ -1546,6 +1572,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe keyId: tuple.1, snsCiphertextDigest: tuple.2, coprocessorTxSenderAddresses: tuple.3, + contextId: tuple.4, } } } @@ -1572,6 +1599,9 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe > as alloy_sol_types::SolType>::tokenize( &self.coprocessorTxSenderAddresses, ), + as alloy_sol_types::SolType>::tokenize(&self.contextId), ) } #[inline] @@ -1646,7 +1676,7 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe #[inline] fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { alloy_sol_types::private::Cow::Borrowed( - "SnsCiphertextMaterial(bytes32 ctHandle,uint256 keyId,bytes32 snsCiphertextDigest,address[] coprocessorTxSenderAddresses)", + "SnsCiphertextMaterial(bytes32 ctHandle,uint256 keyId,bytes32 snsCiphertextDigest,address[] coprocessorTxSenderAddresses,uint256 contextId)", ) } #[inline] @@ -1682,6 +1712,10 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe &self.coprocessorTxSenderAddresses, ) .0, + as alloy_sol_types::SolType>::eip712_data_word(&self.contextId) + .0, ] .concat() } @@ -1709,6 +1743,11 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe > as alloy_sol_types::EventTopic>::topic_preimage_length( &rust.coprocessorTxSenderAddresses, ) + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.contextId, + ) } #[inline] fn encode_topic_preimage( @@ -1742,6 +1781,12 @@ struct SnsCiphertextMaterial { bytes32 ctHandle; uint256 keyId; bytes32 snsCiphe &rust.coprocessorTxSenderAddresses, out, ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.contextId, + out, + ); } #[inline] fn encode_topic( @@ -2036,7 +2081,7 @@ error DecryptionNotRequested(uint256 decryptionId); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `DifferentKeyIdsNotAllowed((bytes32,uint256,bytes32,address[]),(bytes32,uint256,bytes32,address[]))` and selector `0xcfae921f`. + /**Custom error with signature `DifferentKeyIdsNotAllowed((bytes32,uint256,bytes32,address[],uint256),(bytes32,uint256,bytes32,address[],uint256))` and selector `0xc2eddf9d`. ```solidity error DifferentKeyIdsNotAllowed(SnsCiphertextMaterial firstSnsCtMaterial, SnsCiphertextMaterial invalidSnsCtMaterial); ```*/ @@ -2099,8 +2144,8 @@ error DifferentKeyIdsNotAllowed(SnsCiphertextMaterial firstSnsCtMaterial, SnsCip type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "DifferentKeyIdsNotAllowed((bytes32,uint256,bytes32,address[]),(bytes32,uint256,bytes32,address[]))"; - const SELECTOR: [u8; 4] = [207u8, 174u8, 146u8, 31u8]; + const SIGNATURE: &'static str = "DifferentKeyIdsNotAllowed((bytes32,uint256,bytes32,address[],uint256),(bytes32,uint256,bytes32,address[],uint256))"; + const SELECTOR: [u8; 4] = [194u8, 237u8, 223u8, 157u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -3075,7 +3120,7 @@ error UserDecryptionRequestExpired(uint256 currentTimestamp, RequestValidity req }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],bytes)` and selector `0x22db480a39bd72556438aadb4a32a3d2a6638b87c03bbec5fef6997e109587ff`. + /**Event with signature `PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],bytes)` and selector `0xf1b11be50c03123b97d816b2941afe78c72cbaefeff5531fd1ef80ed6d2ecca8`. ```solidity event PublicDecryptionRequest(uint256 indexed decryptionId, SnsCiphertextMaterial[] snsCtMaterials, bytes extraData); ```*/ @@ -3117,11 +3162,11 @@ event PublicDecryptionRequest(uint256 indexed decryptionId, SnsCiphertextMateria alloy_sol_types::sol_data::FixedBytes<32>, alloy::sol_types::sol_data::Uint<256>, ); - const SIGNATURE: &'static str = "PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],bytes)"; + const SIGNATURE: &'static str = "PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],bytes)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 34u8, 219u8, 72u8, 10u8, 57u8, 189u8, 114u8, 85u8, 100u8, 56u8, 170u8, - 219u8, 74u8, 50u8, 163u8, 210u8, 166u8, 99u8, 139u8, 135u8, 192u8, 59u8, - 190u8, 197u8, 254u8, 246u8, 153u8, 126u8, 16u8, 149u8, 135u8, 255u8, + 241u8, 177u8, 27u8, 229u8, 12u8, 3u8, 18u8, 59u8, 151u8, 216u8, 22u8, + 178u8, 148u8, 26u8, 254u8, 120u8, 199u8, 44u8, 186u8, 239u8, 239u8, + 245u8, 83u8, 31u8, 209u8, 239u8, 128u8, 237u8, 109u8, 46u8, 204u8, 168u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -3338,7 +3383,7 @@ event PublicDecryptionResponse(uint256 indexed decryptionId, bytes decryptedResu }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],address,bytes,bytes)` and selector `0xf9011bd6ba0da6049c520d70fe5971f17ed7ab795486052544b51019896c596b`. + /**Event with signature `UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],address,bytes,bytes)` and selector `0x953b685968a1a7c5f0dfb3ded7daa9f4f6b8f2d81fe33e4d272623d10e783eb8`. ```solidity event UserDecryptionRequest(uint256 indexed decryptionId, SnsCiphertextMaterial[] snsCtMaterials, address userAddress, bytes publicKey, bytes extraData); ```*/ @@ -3386,11 +3431,12 @@ event UserDecryptionRequest(uint256 indexed decryptionId, SnsCiphertextMaterial[ alloy_sol_types::sol_data::FixedBytes<32>, alloy::sol_types::sol_data::Uint<256>, ); - const SIGNATURE: &'static str = "UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],address,bytes,bytes)"; + const SIGNATURE: &'static str = "UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],address,bytes,bytes)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 249u8, 1u8, 27u8, 214u8, 186u8, 13u8, 166u8, 4u8, 156u8, 82u8, 13u8, - 112u8, 254u8, 89u8, 113u8, 241u8, 126u8, 215u8, 171u8, 121u8, 84u8, - 134u8, 5u8, 37u8, 68u8, 181u8, 16u8, 25u8, 137u8, 108u8, 89u8, 107u8, + 149u8, 59u8, 104u8, 89u8, 104u8, 161u8, 167u8, 197u8, 240u8, 223u8, + 179u8, 222u8, 215u8, 218u8, 169u8, 244u8, 246u8, 184u8, 242u8, 216u8, + 31u8, 227u8, 62u8, 77u8, 39u8, 38u8, 35u8, 209u8, 14u8, 120u8, 62u8, + 184u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -5815,7 +5861,7 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted [164u8, 195u8, 3u8, 145u8], [166u8, 166u8, 203u8, 33u8], [175u8, 31u8, 4u8, 149u8], - [207u8, 174u8, 146u8, 31u8], + [194u8, 237u8, 223u8, 157u8], [212u8, 138u8, 249u8, 66u8], [220u8, 77u8, 120u8, 177u8], [222u8, 40u8, 89u8, 193u8], @@ -6456,16 +6502,17 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted /// /// Prefer using `SolInterface` methods instead. pub const SELECTORS: &'static [[u8; 32usize]] = &[ - [ - 34u8, 219u8, 72u8, 10u8, 57u8, 189u8, 114u8, 85u8, 100u8, 56u8, 170u8, - 219u8, 74u8, 50u8, 163u8, 210u8, 166u8, 99u8, 139u8, 135u8, 192u8, 59u8, - 190u8, 197u8, 254u8, 246u8, 153u8, 126u8, 16u8, 149u8, 135u8, 255u8, - ], [ 127u8, 205u8, 251u8, 83u8, 129u8, 145u8, 127u8, 85u8, 74u8, 113u8, 125u8, 10u8, 84u8, 112u8, 163u8, 63u8, 90u8, 73u8, 186u8, 100u8, 69u8, 240u8, 94u8, 196u8, 60u8, 116u8, 192u8, 188u8, 44u8, 198u8, 8u8, 178u8, ], + [ + 149u8, 59u8, 104u8, 89u8, 104u8, 161u8, 167u8, 197u8, 240u8, 223u8, + 179u8, 222u8, 215u8, 218u8, 169u8, 244u8, 246u8, 184u8, 242u8, 216u8, + 31u8, 227u8, 62u8, 77u8, 39u8, 38u8, 35u8, 209u8, 14u8, 120u8, 62u8, + 184u8, + ], [ 215u8, 229u8, 138u8, 54u8, 122u8, 10u8, 108u8, 41u8, 142u8, 118u8, 173u8, 93u8, 36u8, 0u8, 4u8, 227u8, 39u8, 170u8, 20u8, 35u8, 203u8, 228u8, @@ -6477,9 +6524,9 @@ function userDecryptionResponse(uint256 decryptionId, bytes memory userDecrypted 34u8, 116u8, 197u8, 136u8, 30u8, 72u8, 238u8, 161u8, 237u8, 37u8, ], [ - 249u8, 1u8, 27u8, 214u8, 186u8, 13u8, 166u8, 4u8, 156u8, 82u8, 13u8, - 112u8, 254u8, 89u8, 113u8, 241u8, 126u8, 215u8, 171u8, 121u8, 84u8, - 134u8, 5u8, 37u8, 68u8, 181u8, 16u8, 25u8, 137u8, 108u8, 89u8, 107u8, + 241u8, 177u8, 27u8, 229u8, 12u8, 3u8, 18u8, 59u8, 151u8, 216u8, 22u8, + 178u8, 148u8, 26u8, 254u8, 120u8, 199u8, 44u8, 186u8, 239u8, 239u8, + 245u8, 83u8, 31u8, 209u8, 239u8, 128u8, 237u8, 109u8, 46u8, 204u8, 168u8, ], ]; } diff --git a/gateway-contracts/rust_bindings/src/i_gateway_config.rs b/gateway-contracts/rust_bindings/src/i_gateway_config.rs index 0c6102a299..81b164f0d7 100644 --- a/gateway-contracts/rust_bindings/src/i_gateway_config.rs +++ b/gateway-contracts/rust_bindings/src/i_gateway_config.rs @@ -3,11 +3,6 @@ Generated by the following Solidity interface... ```solidity interface IGatewayConfig { - struct Coprocessor { - address txSenderAddress; - address signerAddress; - string s3BucketUrl; - } struct Custodian { address txSenderAddress; address signerAddress; @@ -32,7 +27,6 @@ interface IGatewayConfig { } error ChainIdNotUint64(uint256 chainId); - error EmptyCoprocessors(); error EmptyCustodians(); error EmptyKmsNodes(); error HostChainAlreadyRegistered(uint256 chainId); @@ -47,7 +41,7 @@ interface IGatewayConfig { error NotPauser(address account); event AddHostChain(HostChain hostChain); - event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, KmsNode[] kmsNodes, Coprocessor[] coprocessors, Custodian[] custodians); + event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, KmsNode[] kmsNodes, Custodian[] custodians); event PauseAllGatewayContracts(); event UnpauseAllGatewayContracts(); event UpdateKmsGenThreshold(uint256 newKmsGenThreshold); @@ -56,10 +50,6 @@ interface IGatewayConfig { event UpdateUserDecryptionThreshold(uint256 newUserDecryptionThreshold); function addHostChain(HostChain memory hostChain) external; - function getCoprocessor(address coprocessorTxSenderAddress) external view returns (Coprocessor memory); - function getCoprocessorMajorityThreshold() external view returns (uint256); - function getCoprocessorSigners() external view returns (address[] memory); - function getCoprocessorTxSenders() external view returns (address[] memory); function getCustodian(address custodianTxSender) external view returns (Custodian memory); function getCustodianSigners() external view returns (address[] memory); function getCustodianTxSenders() external view returns (address[] memory); @@ -74,8 +64,6 @@ interface IGatewayConfig { function getPublicDecryptionThreshold() external view returns (uint256); function getUserDecryptionThreshold() external view returns (uint256); function getVersion() external pure returns (string memory); - function isCoprocessorSigner(address signerAddress) external view returns (bool); - function isCoprocessorTxSender(address coprocessorTxSenderAddress) external view returns (bool); function isCustodianSigner(address signerAddress) external view returns (bool); function isCustodianTxSender(address txSenderAddress) external view returns (bool); function isHostChainRegistered(uint256 chainId) external view returns (bool); @@ -134,81 +122,6 @@ interface IGatewayConfig { "outputs": [], "stateMutability": "nonpayable" }, - { - "type": "function", - "name": "getCoprocessor", - "inputs": [ - { - "name": "coprocessorTxSenderAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct Coprocessor", - "components": [ - { - "name": "txSenderAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "signerAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "s3BucketUrl", - "type": "string", - "internalType": "string" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getCoprocessorMajorityThreshold", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getCoprocessorSigners", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address[]", - "internalType": "address[]" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getCoprocessorTxSenders", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address[]", - "internalType": "address[]" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "getCustodian", @@ -514,44 +427,6 @@ interface IGatewayConfig { ], "stateMutability": "pure" }, - { - "type": "function", - "name": "isCoprocessorSigner", - "inputs": [ - { - "name": "signerAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "isCoprocessorTxSender", - "inputs": [ - { - "name": "coprocessorTxSenderAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "isCustodianSigner", @@ -828,29 +703,6 @@ interface IGatewayConfig { } ] }, - { - "name": "coprocessors", - "type": "tuple[]", - "indexed": false, - "internalType": "struct Coprocessor[]", - "components": [ - { - "name": "txSenderAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "signerAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "s3BucketUrl", - "type": "string", - "internalType": "string" - } - ] - }, { "name": "custodians", "type": "tuple[]", @@ -952,11 +804,6 @@ interface IGatewayConfig { } ] }, - { - "type": "error", - "name": "EmptyCoprocessors", - "inputs": [] - }, { "type": "error", "name": "EmptyCustodians", @@ -1108,17 +955,17 @@ pub mod IGatewayConfig { #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] /**```solidity -struct Coprocessor { address txSenderAddress; address signerAddress; string s3BucketUrl; } +struct Custodian { address txSenderAddress; address signerAddress; bytes encryptionKey; } ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct Coprocessor { + pub struct Custodian { #[allow(missing_docs)] pub txSenderAddress: alloy::sol_types::private::Address, #[allow(missing_docs)] pub signerAddress: alloy::sol_types::private::Address, #[allow(missing_docs)] - pub s3BucketUrl: alloy::sol_types::private::String, + pub encryptionKey: alloy::sol_types::private::Bytes, } #[allow( non_camel_case_types, @@ -1132,13 +979,13 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu type UnderlyingSolTuple<'a> = ( alloy::sol_types::sol_data::Address, alloy::sol_types::sol_data::Address, - alloy::sol_types::sol_data::String, + alloy::sol_types::sol_data::Bytes, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( alloy::sol_types::private::Address, alloy::sol_types::private::Address, - alloy::sol_types::private::String, + alloy::sol_types::private::Bytes, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -1153,28 +1000,28 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: Coprocessor) -> Self { - (value.txSenderAddress, value.signerAddress, value.s3BucketUrl) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: Custodian) -> Self { + (value.txSenderAddress, value.signerAddress, value.encryptionKey) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for Coprocessor { + impl ::core::convert::From> for Custodian { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { txSenderAddress: tuple.0, signerAddress: tuple.1, - s3BucketUrl: tuple.2, + encryptionKey: tuple.2, } } } #[automatically_derived] - impl alloy_sol_types::SolValue for Coprocessor { + impl alloy_sol_types::SolValue for Custodian { type SolType = Self; } #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for Coprocessor { + impl alloy_sol_types::private::SolTypeValue for Custodian { #[inline] fn stv_to_tokens(&self) -> ::Token<'_> { ( @@ -1184,8 +1031,8 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu ::tokenize( &self.signerAddress, ), - ::tokenize( - &self.s3BucketUrl, + ::tokenize( + &self.encryptionKey, ), ) } @@ -1231,7 +1078,7 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu } } #[automatically_derived] - impl alloy_sol_types::SolType for Coprocessor { + impl alloy_sol_types::SolType for Custodian { type RustType = Self; type Token<'a> = alloy_sol_types::private::Cow<'static, str> { alloy_sol_types::private::Cow::Borrowed( - "Coprocessor(address txSenderAddress,address signerAddress,string s3BucketUrl)", + "Custodian(address txSenderAddress,address signerAddress,bytes encryptionKey)", ) } #[inline] @@ -1285,8 +1132,8 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu &self.signerAddress, ) .0, - ::eip712_data_word( - &self.s3BucketUrl, + ::eip712_data_word( + &self.encryptionKey, ) .0, ] @@ -1294,7 +1141,7 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu } } #[automatically_derived] - impl alloy_sol_types::EventTopic for Coprocessor { + impl alloy_sol_types::EventTopic for Custodian { #[inline] fn topic_preimage_length(rust: &Self::RustType) -> usize { 0usize @@ -1304,8 +1151,8 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu + ::topic_preimage_length( &rust.signerAddress, ) - + ::topic_preimage_length( - &rust.s3BucketUrl, + + ::topic_preimage_length( + &rust.encryptionKey, ) } #[inline] @@ -1324,8 +1171,8 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu &rust.signerAddress, out, ); - ::encode_topic_preimage( - &rust.s3BucketUrl, + ::encode_topic_preimage( + &rust.encryptionKey, out, ); } @@ -1347,17 +1194,21 @@ struct Coprocessor { address txSenderAddress; address signerAddress; string s3Bu #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] /**```solidity -struct Custodian { address txSenderAddress; address signerAddress; bytes encryptionKey; } +struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAddress; string name; string website; } ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct Custodian { + pub struct HostChain { #[allow(missing_docs)] - pub txSenderAddress: alloy::sol_types::private::Address, + pub chainId: alloy::sol_types::private::primitives::aliases::U256, #[allow(missing_docs)] - pub signerAddress: alloy::sol_types::private::Address, + pub fhevmExecutorAddress: alloy::sol_types::private::Address, #[allow(missing_docs)] - pub encryptionKey: alloy::sol_types::private::Bytes, + pub aclAddress: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub name: alloy::sol_types::private::String, + #[allow(missing_docs)] + pub website: alloy::sol_types::private::String, } #[allow( non_camel_case_types, @@ -1369,15 +1220,19 @@ struct Custodian { address txSenderAddress; address signerAddress; bytes encrypt use alloy::sol_types as alloy_sol_types; #[doc(hidden)] type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, alloy::sol_types::sol_data::Address, alloy::sol_types::sol_data::Address, - alloy::sol_types::sol_data::Bytes, + alloy::sol_types::sol_data::String, + alloy::sol_types::sol_data::String, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, alloy::sol_types::private::Address, alloy::sol_types::private::Address, - alloy::sol_types::private::Bytes, + alloy::sol_types::private::String, + alloy::sol_types::private::String, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -1392,39 +1247,53 @@ struct Custodian { address txSenderAddress; address signerAddress; bytes encrypt } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: Custodian) -> Self { - (value.txSenderAddress, value.signerAddress, value.encryptionKey) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: HostChain) -> Self { + ( + value.chainId, + value.fhevmExecutorAddress, + value.aclAddress, + value.name, + value.website, + ) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for Custodian { + impl ::core::convert::From> for HostChain { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { - txSenderAddress: tuple.0, - signerAddress: tuple.1, - encryptionKey: tuple.2, + chainId: tuple.0, + fhevmExecutorAddress: tuple.1, + aclAddress: tuple.2, + name: tuple.3, + website: tuple.4, } } } #[automatically_derived] - impl alloy_sol_types::SolValue for Custodian { + impl alloy_sol_types::SolValue for HostChain { type SolType = Self; } #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for Custodian { + impl alloy_sol_types::private::SolTypeValue for HostChain { #[inline] fn stv_to_tokens(&self) -> ::Token<'_> { ( + as alloy_sol_types::SolType>::tokenize(&self.chainId), ::tokenize( - &self.txSenderAddress, + &self.fhevmExecutorAddress, ), ::tokenize( - &self.signerAddress, + &self.aclAddress, ), - ::tokenize( - &self.encryptionKey, + ::tokenize( + &self.name, + ), + ::tokenize( + &self.website, ), ) } @@ -1470,7 +1339,7 @@ struct Custodian { address txSenderAddress; address signerAddress; bytes encrypt } } #[automatically_derived] - impl alloy_sol_types::SolType for Custodian { + impl alloy_sol_types::SolType for HostChain { type RustType = Self; type Token<'a> = alloy_sol_types::private::Cow<'static, str> { alloy_sol_types::private::Cow::Borrowed( - "Custodian(address txSenderAddress,address signerAddress,bytes encryptionKey)", + "HostChain(uint256 chainId,address fhevmExecutorAddress,address aclAddress,string name,string website)", ) } #[inline] @@ -1516,16 +1385,24 @@ struct Custodian { address txSenderAddress; address signerAddress; bytes encrypt #[inline] fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { [ + as alloy_sol_types::SolType>::eip712_data_word(&self.chainId) + .0, ::eip712_data_word( - &self.txSenderAddress, + &self.fhevmExecutorAddress, ) .0, ::eip712_data_word( - &self.signerAddress, + &self.aclAddress, ) .0, - ::eip712_data_word( - &self.encryptionKey, + ::eip712_data_word( + &self.name, + ) + .0, + ::eip712_data_word( + &self.website, ) .0, ] @@ -1533,18 +1410,26 @@ struct Custodian { address txSenderAddress; address signerAddress; bytes encrypt } } #[automatically_derived] - impl alloy_sol_types::EventTopic for Custodian { + impl alloy_sol_types::EventTopic for HostChain { #[inline] fn topic_preimage_length(rust: &Self::RustType) -> usize { 0usize + + as alloy_sol_types::EventTopic>::topic_preimage_length( + &rust.chainId, + ) + ::topic_preimage_length( - &rust.txSenderAddress, + &rust.fhevmExecutorAddress, ) + ::topic_preimage_length( - &rust.signerAddress, + &rust.aclAddress, ) - + ::topic_preimage_length( - &rust.encryptionKey, + + ::topic_preimage_length( + &rust.name, + ) + + ::topic_preimage_length( + &rust.website, ) } #[inline] @@ -1555,16 +1440,26 @@ struct Custodian { address txSenderAddress; address signerAddress; bytes encrypt out.reserve( ::topic_preimage_length(rust), ); + as alloy_sol_types::EventTopic>::encode_topic_preimage( + &rust.chainId, + out, + ); ::encode_topic_preimage( - &rust.txSenderAddress, + &rust.fhevmExecutorAddress, out, ); ::encode_topic_preimage( - &rust.signerAddress, + &rust.aclAddress, out, ); - ::encode_topic_preimage( - &rust.encryptionKey, + ::encode_topic_preimage( + &rust.name, + out, + ); + ::encode_topic_preimage( + &rust.website, out, ); } @@ -1586,21 +1481,19 @@ struct Custodian { address txSenderAddress; address signerAddress; bytes encrypt #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] /**```solidity -struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAddress; string name; string website; } +struct KmsNode { address txSenderAddress; address signerAddress; string ipAddress; string storageUrl; } ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct HostChain { - #[allow(missing_docs)] - pub chainId: alloy::sol_types::private::primitives::aliases::U256, + pub struct KmsNode { #[allow(missing_docs)] - pub fhevmExecutorAddress: alloy::sol_types::private::Address, + pub txSenderAddress: alloy::sol_types::private::Address, #[allow(missing_docs)] - pub aclAddress: alloy::sol_types::private::Address, + pub signerAddress: alloy::sol_types::private::Address, #[allow(missing_docs)] - pub name: alloy::sol_types::private::String, + pub ipAddress: alloy::sol_types::private::String, #[allow(missing_docs)] - pub website: alloy::sol_types::private::String, + pub storageUrl: alloy::sol_types::private::String, } #[allow( non_camel_case_types, @@ -1612,7 +1505,6 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd use alloy::sol_types as alloy_sol_types; #[doc(hidden)] type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Uint<256>, alloy::sol_types::sol_data::Address, alloy::sol_types::sol_data::Address, alloy::sol_types::sol_data::String, @@ -1620,7 +1512,6 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, alloy::sol_types::private::Address, alloy::sol_types::private::Address, alloy::sol_types::private::String, @@ -1639,53 +1530,48 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: HostChain) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: KmsNode) -> Self { ( - value.chainId, - value.fhevmExecutorAddress, - value.aclAddress, - value.name, - value.website, + value.txSenderAddress, + value.signerAddress, + value.ipAddress, + value.storageUrl, ) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for HostChain { + impl ::core::convert::From> for KmsNode { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { - chainId: tuple.0, - fhevmExecutorAddress: tuple.1, - aclAddress: tuple.2, - name: tuple.3, - website: tuple.4, + txSenderAddress: tuple.0, + signerAddress: tuple.1, + ipAddress: tuple.2, + storageUrl: tuple.3, } } } #[automatically_derived] - impl alloy_sol_types::SolValue for HostChain { + impl alloy_sol_types::SolValue for KmsNode { type SolType = Self; } #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for HostChain { + impl alloy_sol_types::private::SolTypeValue for KmsNode { #[inline] fn stv_to_tokens(&self) -> ::Token<'_> { ( - as alloy_sol_types::SolType>::tokenize(&self.chainId), ::tokenize( - &self.fhevmExecutorAddress, + &self.txSenderAddress, ), ::tokenize( - &self.aclAddress, + &self.signerAddress, ), ::tokenize( - &self.name, + &self.ipAddress, ), ::tokenize( - &self.website, + &self.storageUrl, ), ) } @@ -1731,7 +1617,7 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd } } #[automatically_derived] - impl alloy_sol_types::SolType for HostChain { + impl alloy_sol_types::SolType for KmsNode { type RustType = Self; type Token<'a> = alloy_sol_types::private::Cow<'static, str> { alloy_sol_types::private::Cow::Borrowed( - "HostChain(uint256 chainId,address fhevmExecutorAddress,address aclAddress,string name,string website)", + "KmsNode(address txSenderAddress,address signerAddress,string ipAddress,string storageUrl)", ) } #[inline] @@ -1777,24 +1663,20 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd #[inline] fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { [ - as alloy_sol_types::SolType>::eip712_data_word(&self.chainId) - .0, ::eip712_data_word( - &self.fhevmExecutorAddress, + &self.txSenderAddress, ) .0, ::eip712_data_word( - &self.aclAddress, + &self.signerAddress, ) .0, ::eip712_data_word( - &self.name, + &self.ipAddress, ) .0, ::eip712_data_word( - &self.website, + &self.storageUrl, ) .0, ] @@ -1802,26 +1684,21 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd } } #[automatically_derived] - impl alloy_sol_types::EventTopic for HostChain { + impl alloy_sol_types::EventTopic for KmsNode { #[inline] fn topic_preimage_length(rust: &Self::RustType) -> usize { 0usize - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.chainId, - ) + ::topic_preimage_length( - &rust.fhevmExecutorAddress, + &rust.txSenderAddress, ) + ::topic_preimage_length( - &rust.aclAddress, + &rust.signerAddress, ) + ::topic_preimage_length( - &rust.name, + &rust.ipAddress, ) + ::topic_preimage_length( - &rust.website, + &rust.storageUrl, ) } #[inline] @@ -1832,26 +1709,20 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd out.reserve( ::topic_preimage_length(rust), ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.chainId, - out, - ); ::encode_topic_preimage( - &rust.fhevmExecutorAddress, + &rust.txSenderAddress, out, ); ::encode_topic_preimage( - &rust.aclAddress, + &rust.signerAddress, out, ); ::encode_topic_preimage( - &rust.name, + &rust.ipAddress, out, ); ::encode_topic_preimage( - &rust.website, + &rust.storageUrl, out, ); } @@ -1873,19 +1744,15 @@ struct HostChain { uint256 chainId; address fhevmExecutorAddress; address aclAdd #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] /**```solidity -struct KmsNode { address txSenderAddress; address signerAddress; string ipAddress; string storageUrl; } +struct ProtocolMetadata { string name; string website; } ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct KmsNode { - #[allow(missing_docs)] - pub txSenderAddress: alloy::sol_types::private::Address, - #[allow(missing_docs)] - pub signerAddress: alloy::sol_types::private::Address, + pub struct ProtocolMetadata { #[allow(missing_docs)] - pub ipAddress: alloy::sol_types::private::String, + pub name: alloy::sol_types::private::String, #[allow(missing_docs)] - pub storageUrl: alloy::sol_types::private::String, + pub website: alloy::sol_types::private::String, } #[allow( non_camel_case_types, @@ -1897,15 +1764,11 @@ struct KmsNode { address txSenderAddress; address signerAddress; string ipAddres use alloy::sol_types as alloy_sol_types; #[doc(hidden)] type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Address, - alloy::sol_types::sol_data::Address, alloy::sol_types::sol_data::String, alloy::sol_types::sol_data::String, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Address, - alloy::sol_types::private::Address, alloy::sol_types::private::String, alloy::sol_types::private::String, ); @@ -1922,48 +1785,35 @@ struct KmsNode { address txSenderAddress; address signerAddress; string ipAddres } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: KmsNode) -> Self { - ( - value.txSenderAddress, - value.signerAddress, - value.ipAddress, - value.storageUrl, - ) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ProtocolMetadata) -> Self { + (value.name, value.website) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for KmsNode { + impl ::core::convert::From> for ProtocolMetadata { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { - txSenderAddress: tuple.0, - signerAddress: tuple.1, - ipAddress: tuple.2, - storageUrl: tuple.3, + name: tuple.0, + website: tuple.1, } } } #[automatically_derived] - impl alloy_sol_types::SolValue for KmsNode { + impl alloy_sol_types::SolValue for ProtocolMetadata { type SolType = Self; } #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for KmsNode { + impl alloy_sol_types::private::SolTypeValue for ProtocolMetadata { #[inline] fn stv_to_tokens(&self) -> ::Token<'_> { ( - ::tokenize( - &self.txSenderAddress, - ), - ::tokenize( - &self.signerAddress, - ), ::tokenize( - &self.ipAddress, + &self.name, ), ::tokenize( - &self.storageUrl, + &self.website, ), ) } @@ -2009,7 +1859,7 @@ struct KmsNode { address txSenderAddress; address signerAddress; string ipAddres } } #[automatically_derived] - impl alloy_sol_types::SolType for KmsNode { + impl alloy_sol_types::SolType for ProtocolMetadata { type RustType = Self; type Token<'a> = alloy_sol_types::private::Cow<'static, str> { alloy_sol_types::private::Cow::Borrowed( - "KmsNode(address txSenderAddress,address signerAddress,string ipAddress,string storageUrl)", + "ProtocolMetadata(string name,string website)", ) } #[inline] @@ -2055,20 +1905,12 @@ struct KmsNode { address txSenderAddress; address signerAddress; string ipAddres #[inline] fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { [ - ::eip712_data_word( - &self.txSenderAddress, - ) - .0, - ::eip712_data_word( - &self.signerAddress, - ) - .0, ::eip712_data_word( - &self.ipAddress, + &self.name, ) .0, ::eip712_data_word( - &self.storageUrl, + &self.website, ) .0, ] @@ -2076,21 +1918,15 @@ struct KmsNode { address txSenderAddress; address signerAddress; string ipAddres } } #[automatically_derived] - impl alloy_sol_types::EventTopic for KmsNode { + impl alloy_sol_types::EventTopic for ProtocolMetadata { #[inline] fn topic_preimage_length(rust: &Self::RustType) -> usize { 0usize - + ::topic_preimage_length( - &rust.txSenderAddress, - ) - + ::topic_preimage_length( - &rust.signerAddress, - ) + ::topic_preimage_length( - &rust.ipAddress, + &rust.name, ) + ::topic_preimage_length( - &rust.storageUrl, + &rust.website, ) } #[inline] @@ -2101,20 +1937,12 @@ struct KmsNode { address txSenderAddress; address signerAddress; string ipAddres out.reserve( ::topic_preimage_length(rust), ); - ::encode_topic_preimage( - &rust.txSenderAddress, - out, - ); - ::encode_topic_preimage( - &rust.signerAddress, - out, - ); ::encode_topic_preimage( - &rust.ipAddress, + &rust.name, out, ); ::encode_topic_preimage( - &rust.storageUrl, + &rust.website, out, ); } @@ -2135,16 +1963,15 @@ struct KmsNode { address txSenderAddress; address signerAddress; string ipAddres }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**```solidity -struct ProtocolMetadata { string name; string website; } + /**Custom error with signature `ChainIdNotUint64(uint256)` and selector `0x4178de42`. +```solidity +error ChainIdNotUint64(uint256 chainId); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct ProtocolMetadata { - #[allow(missing_docs)] - pub name: alloy::sol_types::private::String, + pub struct ChainIdNotUint64 { #[allow(missing_docs)] - pub website: alloy::sol_types::private::String, + pub chainId: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -2155,14 +1982,10 @@ struct ProtocolMetadata { string name; string website; } const _: () = { use alloy::sol_types as alloy_sol_types; #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::String, - alloy::sol_types::sol_data::String, - ); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::String, - alloy::sol_types::private::String, + alloy::sol_types::private::primitives::aliases::U256, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -2177,194 +2000,58 @@ struct ProtocolMetadata { string name; string website; } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: ProtocolMetadata) -> Self { - (value.name, value.website) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: ChainIdNotUint64) -> Self { + (value.chainId,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for ProtocolMetadata { + impl ::core::convert::From> for ChainIdNotUint64 { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - name: tuple.0, - website: tuple.1, - } + Self { chainId: tuple.0 } } } #[automatically_derived] - impl alloy_sol_types::SolValue for ProtocolMetadata { - type SolType = Self; - } - #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for ProtocolMetadata { - #[inline] - fn stv_to_tokens(&self) -> ::Token<'_> { - ( - ::tokenize( - &self.name, - ), - ::tokenize( - &self.website, - ), - ) - } - #[inline] - fn stv_abi_encoded_size(&self) -> usize { - if let Some(size) = ::ENCODED_SIZE { - return size; - } - let tuple = as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encoded_size(&tuple) - } - #[inline] - fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { - ::eip712_hash_struct(self) - } - #[inline] - fn stv_abi_encode_packed_to( - &self, - out: &mut alloy_sol_types::private::Vec, - ) { - let tuple = as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encode_packed_to(&tuple, out) - } - #[inline] - fn stv_abi_packed_encoded_size(&self) -> usize { - if let Some(size) = ::PACKED_ENCODED_SIZE { - return size; - } - let tuple = as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_packed_encoded_size(&tuple) - } - } - #[automatically_derived] - impl alloy_sol_types::SolType for ProtocolMetadata { - type RustType = Self; - type Token<'a> = = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SOL_NAME: &'static str = ::NAME; - const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; - const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; - #[inline] - fn valid_token(token: &Self::Token<'_>) -> bool { - as alloy_sol_types::SolType>::valid_token(token) - } + const SIGNATURE: &'static str = "ChainIdNotUint64(uint256)"; + const SELECTOR: [u8; 4] = [65u8, 120u8, 222u8, 66u8]; #[inline] - fn detokenize(token: Self::Token<'_>) -> Self::RustType { - let tuple = as alloy_sol_types::SolType>::detokenize(token); - >>::from(tuple) + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() } - } - #[automatically_derived] - impl alloy_sol_types::SolStruct for ProtocolMetadata { - const NAME: &'static str = "ProtocolMetadata"; #[inline] - fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { - alloy_sol_types::private::Cow::Borrowed( - "ProtocolMetadata(string name,string website)", + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.chainId), ) } #[inline] - fn eip712_components() -> alloy_sol_types::private::Vec< - alloy_sol_types::private::Cow<'static, str>, - > { - alloy_sol_types::private::Vec::new() - } - #[inline] - fn eip712_encode_type() -> alloy_sol_types::private::Cow<'static, str> { - ::eip712_root_type() - } - #[inline] - fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { - [ - ::eip712_data_word( - &self.name, - ) - .0, - ::eip712_data_word( - &self.website, - ) - .0, - ] - .concat() - } - } - #[automatically_derived] - impl alloy_sol_types::EventTopic for ProtocolMetadata { - #[inline] - fn topic_preimage_length(rust: &Self::RustType) -> usize { - 0usize - + ::topic_preimage_length( - &rust.name, - ) - + ::topic_preimage_length( - &rust.website, - ) - } - #[inline] - fn encode_topic_preimage( - rust: &Self::RustType, - out: &mut alloy_sol_types::private::Vec, - ) { - out.reserve( - ::topic_preimage_length(rust), - ); - ::encode_topic_preimage( - &rust.name, - out, - ); - ::encode_topic_preimage( - &rust.website, - out, - ); - } - #[inline] - fn encode_topic( - rust: &Self::RustType, - ) -> alloy_sol_types::abi::token::WordToken { - let mut out = alloy_sol_types::private::Vec::new(); - ::encode_topic_preimage( - rust, - &mut out, - ); - alloy_sol_types::abi::token::WordToken( - alloy_sol_types::private::keccak256(out), - ) + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) } } }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `ChainIdNotUint64(uint256)` and selector `0x4178de42`. + /**Custom error with signature `EmptyCustodians()` and selector `0xcad1d534`. ```solidity -error ChainIdNotUint64(uint256 chainId); +error EmptyCustodians(); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct ChainIdNotUint64 { - #[allow(missing_docs)] - pub chainId: alloy::sol_types::private::primitives::aliases::U256, - } + pub struct EmptyCustodians; #[allow( non_camel_case_types, non_snake_case, @@ -2374,11 +2061,9 @@ error ChainIdNotUint64(uint256 chainId); const _: () = { use alloy::sol_types as alloy_sol_types; #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type UnderlyingSolTuple<'a> = (); #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, - ); + type UnderlyingRustTuple<'a> = (); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -2392,26 +2077,26 @@ error ChainIdNotUint64(uint256 chainId); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: ChainIdNotUint64) -> Self { - (value.chainId,) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: EmptyCustodians) -> Self { + () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for ChainIdNotUint64 { + impl ::core::convert::From> for EmptyCustodians { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { chainId: tuple.0 } + Self } } #[automatically_derived] - impl alloy_sol_types::SolError for ChainIdNotUint64 { + impl alloy_sol_types::SolError for EmptyCustodians { type Parameters<'a> = UnderlyingSolTuple<'a>; type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "ChainIdNotUint64(uint256)"; - const SELECTOR: [u8; 4] = [65u8, 120u8, 222u8, 66u8]; + const SIGNATURE: &'static str = "EmptyCustodians()"; + const SELECTOR: [u8; 4] = [202u8, 209u8, 213u8, 52u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -2420,11 +2105,7 @@ error ChainIdNotUint64(uint256 chainId); } #[inline] fn tokenize(&self) -> Self::Token<'_> { - ( - as alloy_sol_types::SolType>::tokenize(&self.chainId), - ) + () } #[inline] fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { @@ -2437,13 +2118,13 @@ error ChainIdNotUint64(uint256 chainId); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `EmptyCoprocessors()` and selector `0x8af082ef`. + /**Custom error with signature `EmptyKmsNodes()` and selector `0x068c8d40`. ```solidity -error EmptyCoprocessors(); +error EmptyKmsNodes(); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct EmptyCoprocessors; + pub struct EmptyKmsNodes; #[allow( non_camel_case_types, non_snake_case, @@ -2469,26 +2150,26 @@ error EmptyCoprocessors(); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: EmptyCoprocessors) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: EmptyKmsNodes) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for EmptyCoprocessors { + impl ::core::convert::From> for EmptyKmsNodes { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } } #[automatically_derived] - impl alloy_sol_types::SolError for EmptyCoprocessors { + impl alloy_sol_types::SolError for EmptyKmsNodes { type Parameters<'a> = UnderlyingSolTuple<'a>; type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "EmptyCoprocessors()"; - const SELECTOR: [u8; 4] = [138u8, 240u8, 130u8, 239u8]; + const SIGNATURE: &'static str = "EmptyKmsNodes()"; + const SELECTOR: [u8; 4] = [6u8, 140u8, 141u8, 64u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -2510,13 +2191,16 @@ error EmptyCoprocessors(); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `EmptyCustodians()` and selector `0xcad1d534`. + /**Custom error with signature `HostChainAlreadyRegistered(uint256)` and selector `0x96a56828`. ```solidity -error EmptyCustodians(); +error HostChainAlreadyRegistered(uint256 chainId); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct EmptyCustodians; + pub struct HostChainAlreadyRegistered { + #[allow(missing_docs)] + pub chainId: alloy::sol_types::private::primitives::aliases::U256, + } #[allow( non_camel_case_types, non_snake_case, @@ -2526,9 +2210,11 @@ error EmptyCustodians(); const _: () = { use alloy::sol_types as alloy_sol_types; #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -2542,26 +2228,28 @@ error EmptyCustodians(); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: EmptyCustodians) -> Self { - () + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: HostChainAlreadyRegistered) -> Self { + (value.chainId,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for EmptyCustodians { + impl ::core::convert::From> + for HostChainAlreadyRegistered { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self + Self { chainId: tuple.0 } } } #[automatically_derived] - impl alloy_sol_types::SolError for EmptyCustodians { + impl alloy_sol_types::SolError for HostChainAlreadyRegistered { type Parameters<'a> = UnderlyingSolTuple<'a>; type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "EmptyCustodians()"; - const SELECTOR: [u8; 4] = [202u8, 209u8, 213u8, 52u8]; + const SIGNATURE: &'static str = "HostChainAlreadyRegistered(uint256)"; + const SELECTOR: [u8; 4] = [150u8, 165u8, 104u8, 40u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -2570,7 +2258,11 @@ error EmptyCustodians(); } #[inline] fn tokenize(&self) -> Self::Token<'_> { - () + ( + as alloy_sol_types::SolType>::tokenize(&self.chainId), + ) } #[inline] fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { @@ -2583,164 +2275,7 @@ error EmptyCustodians(); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `EmptyKmsNodes()` and selector `0x068c8d40`. -```solidity -error EmptyKmsNodes(); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct EmptyKmsNodes; - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: EmptyKmsNodes) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for EmptyKmsNodes { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for EmptyKmsNodes { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "EmptyKmsNodes()"; - const SELECTOR: [u8; 4] = [6u8, 140u8, 141u8, 64u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(Self::new) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `HostChainAlreadyRegistered(uint256)` and selector `0x96a56828`. -```solidity -error HostChainAlreadyRegistered(uint256 chainId); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct HostChainAlreadyRegistered { - #[allow(missing_docs)] - pub chainId: alloy::sol_types::private::primitives::aliases::U256, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: HostChainAlreadyRegistered) -> Self { - (value.chainId,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for HostChainAlreadyRegistered { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { chainId: tuple.0 } - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for HostChainAlreadyRegistered { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "HostChainAlreadyRegistered(uint256)"; - const SELECTOR: [u8; 4] = [150u8, 165u8, 104u8, 40u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - as alloy_sol_types::SolType>::tokenize(&self.chainId), - ) - } - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(Self::new) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `InvalidHighKmsGenThreshold(uint256,uint256)` and selector `0x0f69cbfc`. + /**Custom error with signature `InvalidHighKmsGenThreshold(uint256,uint256)` and selector `0x0f69cbfc`. ```solidity error InvalidHighKmsGenThreshold(uint256 kmsGenThreshold, uint256 nKmsNodes); ```*/ @@ -3605,9 +3140,9 @@ event AddHostChain(HostChain hostChain); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,string)[],(address,address,bytes)[])` and selector `0x3a7c54b1195d44a288f9c3c9a0679aed9325068e0d0d5b69e96047355cc71745`. + /**Event with signature `InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,bytes)[])` and selector `0xab58ab938892a1855d09c7c1390cabd4ca0405eaab322c5a82570770a719826e`. ```solidity -event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, KmsNode[] kmsNodes, Coprocessor[] coprocessors, Custodian[] custodians); +event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, KmsNode[] kmsNodes, Custodian[] custodians); ```*/ #[allow( non_camel_case_types, @@ -3626,10 +3161,6 @@ event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, K ::RustType, >, #[allow(missing_docs)] - pub coprocessors: alloy::sol_types::private::Vec< - ::RustType, - >, - #[allow(missing_docs)] pub custodians: alloy::sol_types::private::Vec< ::RustType, >, @@ -3648,18 +3179,17 @@ event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, K ProtocolMetadata, alloy::sol_types::sol_data::Uint<256>, alloy::sol_types::sol_data::Array, - alloy::sol_types::sol_data::Array, alloy::sol_types::sol_data::Array, ); type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); - const SIGNATURE: &'static str = "InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,string)[],(address,address,bytes)[])"; + const SIGNATURE: &'static str = "InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,bytes)[])"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 58u8, 124u8, 84u8, 177u8, 25u8, 93u8, 68u8, 162u8, 136u8, 249u8, 195u8, - 201u8, 160u8, 103u8, 154u8, 237u8, 147u8, 37u8, 6u8, 142u8, 13u8, 13u8, - 91u8, 105u8, 233u8, 96u8, 71u8, 53u8, 92u8, 199u8, 23u8, 69u8, + 171u8, 88u8, 171u8, 147u8, 136u8, 146u8, 161u8, 133u8, 93u8, 9u8, 199u8, + 193u8, 57u8, 12u8, 171u8, 212u8, 202u8, 4u8, 5u8, 234u8, 171u8, 50u8, + 44u8, 90u8, 130u8, 87u8, 7u8, 112u8, 167u8, 25u8, 130u8, 110u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -3672,8 +3202,7 @@ event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, K metadata: data.0, mpcThreshold: data.1, kmsNodes: data.2, - coprocessors: data.3, - custodians: data.4, + custodians: data.3, } } #[inline] @@ -3703,9 +3232,6 @@ event InitializeGatewayConfig(ProtocolMetadata metadata, uint256 mpcThreshold, K as alloy_sol_types::SolType>::tokenize(&self.kmsNodes), - as alloy_sol_types::SolType>::tokenize(&self.coprocessors), as alloy_sol_types::SolType>::tokenize(&self.custodians), @@ -4524,935 +4050,24 @@ function addHostChain(HostChain memory hostChain) external; }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCoprocessor(address)` and selector `0xef6997f9`. + /**Function with signature `getCustodian(address)` and selector `0xcb5aa7e9`. ```solidity -function getCoprocessor(address coprocessorTxSenderAddress) external view returns (Coprocessor memory); +function getCustodian(address custodianTxSender) external view returns (Custodian memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCoprocessorCall { - #[allow(missing_docs)] - pub coprocessorTxSenderAddress: alloy::sol_types::private::Address, - } - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCoprocessor(address)`](getCoprocessorCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getCoprocessorReturn { + pub struct getCustodianCall { #[allow(missing_docs)] - pub _0: ::RustType, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorCall) -> Self { - (value.coprocessorTxSenderAddress,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for getCoprocessorCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - coprocessorTxSenderAddress: tuple.0, - } - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (Coprocessor,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - ::RustType, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getCoprocessorReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for getCoprocessorCall { - type Parameters<'a> = (alloy::sol_types::sol_data::Address,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = ::RustType; - type ReturnTuple<'a> = (Coprocessor,); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCoprocessor(address)"; - const SELECTOR: [u8; 4] = [239u8, 105u8, 151u8, 249u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.coprocessorTxSenderAddress, - ), - ) - } - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) - } - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(|r| { - let r: getCoprocessorReturn = r.into(); - r._0 - }) - } - #[inline] - fn abi_decode_returns_validate( - data: &[u8], - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(|r| { - let r: getCoprocessorReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCoprocessorMajorityThreshold()` and selector `0x6799ef52`. -```solidity -function getCoprocessorMajorityThreshold() external view returns (uint256); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getCoprocessorMajorityThresholdCall; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCoprocessorMajorityThreshold()`](getCoprocessorMajorityThresholdCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getCoprocessorMajorityThresholdReturn { - #[allow(missing_docs)] - pub _0: alloy::sol_types::private::primitives::aliases::U256, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorMajorityThresholdCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getCoprocessorMajorityThresholdCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorMajorityThresholdReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getCoprocessorMajorityThresholdReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for getCoprocessorMajorityThresholdCall { - type Parameters<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::primitives::aliases::U256; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCoprocessorMajorityThreshold()"; - const SELECTOR: [u8; 4] = [103u8, 153u8, 239u8, 82u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) - } - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(|r| { - let r: getCoprocessorMajorityThresholdReturn = r.into(); - r._0 - }) - } - #[inline] - fn abi_decode_returns_validate( - data: &[u8], - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(|r| { - let r: getCoprocessorMajorityThresholdReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCoprocessorSigners()` and selector `0x9164d0ae`. -```solidity -function getCoprocessorSigners() external view returns (address[] memory); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getCoprocessorSignersCall; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCoprocessorSigners()`](getCoprocessorSignersCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getCoprocessorSignersReturn { - #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorSignersCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getCoprocessorSignersCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorSignersReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getCoprocessorSignersReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for getCoprocessorSignersCall { - type Parameters<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, - >; - type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCoprocessorSigners()"; - const SELECTOR: [u8; 4] = [145u8, 100u8, 208u8, 174u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) - } - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(|r| { - let r: getCoprocessorSignersReturn = r.into(); - r._0 - }) - } - #[inline] - fn abi_decode_returns_validate( - data: &[u8], - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(|r| { - let r: getCoprocessorSignersReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCoprocessorTxSenders()` and selector `0x1ea5bd42`. -```solidity -function getCoprocessorTxSenders() external view returns (address[] memory); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getCoprocessorTxSendersCall; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCoprocessorTxSenders()`](getCoprocessorTxSendersCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getCoprocessorTxSendersReturn { - #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorTxSendersCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getCoprocessorTxSendersCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCoprocessorTxSendersReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getCoprocessorTxSendersReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for getCoprocessorTxSendersCall { - type Parameters<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, - >; - type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCoprocessorTxSenders()"; - const SELECTOR: [u8; 4] = [30u8, 165u8, 189u8, 66u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) - } - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(|r| { - let r: getCoprocessorTxSendersReturn = r.into(); - r._0 - }) - } - #[inline] - fn abi_decode_returns_validate( - data: &[u8], - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(|r| { - let r: getCoprocessorTxSendersReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCustodian(address)` and selector `0xcb5aa7e9`. -```solidity -function getCustodian(address custodianTxSender) external view returns (Custodian memory); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getCustodianCall { - #[allow(missing_docs)] - pub custodianTxSender: alloy::sol_types::private::Address, - } - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCustodian(address)`](getCustodianCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getCustodianReturn { - #[allow(missing_docs)] - pub _0: ::RustType, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCustodianCall) -> Self { - (value.custodianTxSender,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for getCustodianCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { custodianTxSender: tuple.0 } - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (Custodian,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - ::RustType, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getCustodianReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for getCustodianReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for getCustodianCall { - type Parameters<'a> = (alloy::sol_types::sol_data::Address,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = ::RustType; - type ReturnTuple<'a> = (Custodian,); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCustodian(address)"; - const SELECTOR: [u8; 4] = [203u8, 90u8, 167u8, 233u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.custodianTxSender, - ), - ) - } - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) - } - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(|r| { - let r: getCustodianReturn = r.into(); - r._0 - }) - } - #[inline] - fn abi_decode_returns_validate( - data: &[u8], - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(|r| { - let r: getCustodianReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCustodianSigners()` and selector `0xba1f31d2`. -```solidity -function getCustodianSigners() external view returns (address[] memory); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getCustodianSignersCall; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCustodianSigners()`](getCustodianSignersCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getCustodianSignersReturn { - #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCustodianSignersCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getCustodianSignersCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCustodianSignersReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> - for getCustodianSignersReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for getCustodianSignersCall { - type Parameters<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, - >; - type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCustodianSigners()"; - const SELECTOR: [u8; 4] = [186u8, 31u8, 49u8, 210u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) - } - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(|r| { - let r: getCustodianSignersReturn = r.into(); - r._0 - }) - } - #[inline] - fn abi_decode_returns_validate( - data: &[u8], - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(|r| { - let r: getCustodianSignersReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getCustodianTxSenders()` and selector `0x2a8b9de9`. -```solidity -function getCustodianTxSenders() external view returns (address[] memory); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct getCustodianTxSendersCall; + pub custodianTxSender: alloy::sol_types::private::Address, + } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getCustodianTxSenders()`](getCustodianTxSendersCall) function. + ///Container type for the return parameters of the [`getCustodian(address)`](getCustodianCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getCustodianTxSendersReturn { + pub struct getCustodianReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec, + pub _0: ::RustType, } #[allow( non_camel_case_types, @@ -5464,9 +4079,9 @@ function getCustodianTxSenders() external view returns (address[] memory); use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -5480,29 +4095,25 @@ function getCustodianTxSenders() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCustodianTxSendersCall) -> Self { - () + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getCustodianCall) -> Self { + (value.custodianTxSender,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getCustodianTxSendersCall { + impl ::core::convert::From> for getCustodianCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self + Self { custodianTxSender: tuple.0 } } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type UnderlyingSolTuple<'a> = (Custodian,); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec, + ::RustType, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -5517,38 +4128,32 @@ function getCustodianTxSenders() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getCustodianTxSendersReturn) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getCustodianReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getCustodianTxSendersReturn { + impl ::core::convert::From> for getCustodianReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getCustodianTxSendersCall { - type Parameters<'a> = (); + impl alloy_sol_types::SolCall for getCustodianCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Address,); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, - >; - type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type Return = ::RustType; + type ReturnTuple<'a> = (Custodian,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getCustodianTxSenders()"; - const SELECTOR: [u8; 4] = [42u8, 139u8, 157u8, 233u8]; + const SIGNATURE: &'static str = "getCustodian(address)"; + const SELECTOR: [u8; 4] = [203u8, 90u8, 167u8, 233u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -5557,15 +4162,15 @@ function getCustodianTxSenders() external view returns (address[] memory); } #[inline] fn tokenize(&self) -> Self::Token<'_> { - () + ( + ::tokenize( + &self.custodianTxSender, + ), + ) } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) + (::tokenize(ret),) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { @@ -5573,7 +4178,7 @@ function getCustodianTxSenders() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getCustodianTxSendersReturn = r.into(); + let r: getCustodianReturn = r.into(); r._0 }) } @@ -5585,7 +4190,7 @@ function getCustodianTxSenders() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getCustodianTxSendersReturn = r.into(); + let r: getCustodianReturn = r.into(); r._0 }) } @@ -5593,24 +4198,21 @@ function getCustodianTxSenders() external view returns (address[] memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getHostChain(uint256)` and selector `0xd10f7ff9`. + /**Function with signature `getCustodianSigners()` and selector `0xba1f31d2`. ```solidity -function getHostChain(uint256 index) external view returns (HostChain memory); +function getCustodianSigners() external view returns (address[] memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getHostChainCall { - #[allow(missing_docs)] - pub index: alloy::sol_types::private::primitives::aliases::U256, - } + pub struct getCustodianSignersCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getHostChain(uint256)`](getHostChainCall) function. + ///Container type for the return parameters of the [`getCustodianSigners()`](getCustodianSignersCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getHostChainReturn { + pub struct getCustodianSignersReturn { #[allow(missing_docs)] - pub _0: ::RustType, + pub _0: alloy::sol_types::private::Vec, } #[allow( non_camel_case_types, @@ -5622,11 +4224,9 @@ function getHostChain(uint256 index) external view returns (HostChain memory); use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type UnderlyingSolTuple<'a> = (); #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, - ); + type UnderlyingRustTuple<'a> = (); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -5640,25 +4240,29 @@ function getHostChain(uint256 index) external view returns (HostChain memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getHostChainCall) -> Self { - (value.index,) + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCustodianSignersCall) -> Self { + () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getHostChainCall { + impl ::core::convert::From> + for getCustodianSignersCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { index: tuple.0 } + Self } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (HostChain,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - ::RustType, + alloy::sol_types::private::Vec, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -5673,32 +4277,38 @@ function getHostChain(uint256 index) external view returns (HostChain memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getHostChainReturn) -> Self { + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCustodianSignersReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getHostChainReturn { + impl ::core::convert::From> + for getCustodianSignersReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getHostChainCall { - type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); + impl alloy_sol_types::SolCall for getCustodianSignersCall { + type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = ::RustType; - type ReturnTuple<'a> = (HostChain,); + type Return = alloy::sol_types::private::Vec< + alloy::sol_types::private::Address, + >; + type ReturnTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getHostChain(uint256)"; - const SELECTOR: [u8; 4] = [209u8, 15u8, 127u8, 249u8]; + const SIGNATURE: &'static str = "getCustodianSigners()"; + const SELECTOR: [u8; 4] = [186u8, 31u8, 49u8, 210u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -5707,15 +4317,15 @@ function getHostChain(uint256 index) external view returns (HostChain memory); } #[inline] fn tokenize(&self) -> Self::Token<'_> { - ( - as alloy_sol_types::SolType>::tokenize(&self.index), - ) + () } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { @@ -5723,7 +4333,7 @@ function getHostChain(uint256 index) external view returns (HostChain memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getHostChainReturn = r.into(); + let r: getCustodianSignersReturn = r.into(); r._0 }) } @@ -5735,7 +4345,7 @@ function getHostChain(uint256 index) external view returns (HostChain memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getHostChainReturn = r.into(); + let r: getCustodianSignersReturn = r.into(); r._0 }) } @@ -5743,23 +4353,21 @@ function getHostChain(uint256 index) external view returns (HostChain memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getHostChains()` and selector `0x2585bb65`. + /**Function with signature `getCustodianTxSenders()` and selector `0x2a8b9de9`. ```solidity -function getHostChains() external view returns (HostChain[] memory); +function getCustodianTxSenders() external view returns (address[] memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getHostChainsCall; + pub struct getCustodianTxSendersCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getHostChains()`](getHostChainsCall) function. + ///Container type for the return parameters of the [`getCustodianTxSenders()`](getCustodianTxSendersCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getHostChainsReturn { + pub struct getCustodianTxSendersReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec< - ::RustType, - >, + pub _0: alloy::sol_types::private::Vec, } #[allow( non_camel_case_types, @@ -5787,14 +4395,16 @@ function getHostChains() external view returns (HostChain[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getHostChainsCall) -> Self { + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCustodianTxSendersCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getHostChainsCall { + impl ::core::convert::From> + for getCustodianTxSendersCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -5803,13 +4413,11 @@ function getHostChains() external view returns (HostChain[] memory); { #[doc(hidden)] type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Array, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec< - ::RustType, - >, + alloy::sol_types::private::Vec, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -5824,34 +4432,38 @@ function getHostChains() external view returns (HostChain[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getHostChainsReturn) -> Self { + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getCustodianTxSendersReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getHostChainsReturn { + impl ::core::convert::From> + for getCustodianTxSendersReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getHostChainsCall { + impl alloy_sol_types::SolCall for getCustodianTxSendersCall { type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; type Return = alloy::sol_types::private::Vec< - ::RustType, + alloy::sol_types::private::Address, >; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Array,); + type ReturnTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getHostChains()"; - const SELECTOR: [u8; 4] = [37u8, 133u8, 187u8, 101u8]; + const SIGNATURE: &'static str = "getCustodianTxSenders()"; + const SELECTOR: [u8; 4] = [42u8, 139u8, 157u8, 233u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -5866,7 +4478,7 @@ function getHostChains() external view returns (HostChain[] memory); fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( as alloy_sol_types::SolType>::tokenize(ret), ) } @@ -5876,7 +4488,7 @@ function getHostChains() external view returns (HostChain[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getHostChainsReturn = r.into(); + let r: getCustodianTxSendersReturn = r.into(); r._0 }) } @@ -5888,7 +4500,7 @@ function getHostChains() external view returns (HostChain[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getHostChainsReturn = r.into(); + let r: getCustodianTxSendersReturn = r.into(); r._0 }) } @@ -5896,21 +4508,24 @@ function getHostChains() external view returns (HostChain[] memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getKmsGenThreshold()` and selector `0xb4722bc4`. + /**Function with signature `getHostChain(uint256)` and selector `0xd10f7ff9`. ```solidity -function getKmsGenThreshold() external view returns (uint256); +function getHostChain(uint256 index) external view returns (HostChain memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsGenThresholdCall; + pub struct getHostChainCall { + #[allow(missing_docs)] + pub index: alloy::sol_types::private::primitives::aliases::U256, + } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getKmsGenThreshold()`](getKmsGenThresholdCall) function. + ///Container type for the return parameters of the [`getHostChain(uint256)`](getHostChainCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsGenThresholdReturn { + pub struct getHostChainReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::primitives::aliases::U256, + pub _0: ::RustType, } #[allow( non_camel_case_types, @@ -5922,9 +4537,11 @@ function getKmsGenThreshold() external view returns (uint256); use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -5938,27 +4555,25 @@ function getKmsGenThreshold() external view returns (uint256); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getKmsGenThresholdCall) -> Self { - () + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getHostChainCall) -> Self { + (value.index,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getKmsGenThresholdCall { + impl ::core::convert::From> for getHostChainCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self + Self { index: tuple.0 } } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type UnderlyingSolTuple<'a> = (HostChain,); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, + ::RustType, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -5973,34 +4588,32 @@ function getKmsGenThreshold() external view returns (uint256); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getKmsGenThresholdReturn) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getHostChainReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getKmsGenThresholdReturn { + impl ::core::convert::From> for getHostChainReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getKmsGenThresholdCall { - type Parameters<'a> = (); + impl alloy_sol_types::SolCall for getHostChainCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<256>,); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::primitives::aliases::U256; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Return = ::RustType; + type ReturnTuple<'a> = (HostChain,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getKmsGenThreshold()"; - const SELECTOR: [u8; 4] = [180u8, 114u8, 43u8, 196u8]; + const SIGNATURE: &'static str = "getHostChain(uint256)"; + const SELECTOR: [u8; 4] = [209u8, 15u8, 127u8, 249u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6009,23 +4622,23 @@ function getKmsGenThreshold() external view returns (uint256); } #[inline] fn tokenize(&self) -> Self::Token<'_> { - () - } - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( as alloy_sol_types::SolType>::tokenize(ret), + > as alloy_sol_types::SolType>::tokenize(&self.index), ) } #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + (::tokenize(ret),) + } + #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getKmsGenThresholdReturn = r.into(); + let r: getHostChainReturn = r.into(); r._0 }) } @@ -6037,7 +4650,7 @@ function getKmsGenThreshold() external view returns (uint256); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getKmsGenThresholdReturn = r.into(); + let r: getHostChainReturn = r.into(); r._0 }) } @@ -6045,24 +4658,23 @@ function getKmsGenThreshold() external view returns (uint256); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getKmsNode(address)` and selector `0xe3b2a874`. + /**Function with signature `getHostChains()` and selector `0x2585bb65`. ```solidity -function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode memory); +function getHostChains() external view returns (HostChain[] memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsNodeCall { - #[allow(missing_docs)] - pub kmsTxSenderAddress: alloy::sol_types::private::Address, - } + pub struct getHostChainsCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getKmsNode(address)`](getKmsNodeCall) function. + ///Container type for the return parameters of the [`getHostChains()`](getHostChainsCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsNodeReturn { + pub struct getHostChainsReturn { #[allow(missing_docs)] - pub _0: ::RustType, + pub _0: alloy::sol_types::private::Vec< + ::RustType, + >, } #[allow( non_camel_case_types, @@ -6074,9 +4686,9 @@ function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode m use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + type UnderlyingSolTuple<'a> = (); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + type UnderlyingRustTuple<'a> = (); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -6090,27 +4702,29 @@ function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode m } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getKmsNodeCall) -> Self { - (value.kmsTxSenderAddress,) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getHostChainsCall) -> Self { + () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getKmsNodeCall { + impl ::core::convert::From> for getHostChainsCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - kmsTxSenderAddress: tuple.0, - } + Self } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (KmsNode,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - ::RustType, + alloy::sol_types::private::Vec< + ::RustType, + >, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -6125,32 +4739,34 @@ function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode m } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getKmsNodeReturn) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getHostChainsReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getKmsNodeReturn { + impl ::core::convert::From> for getHostChainsReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getKmsNodeCall { - type Parameters<'a> = (alloy::sol_types::sol_data::Address,); + impl alloy_sol_types::SolCall for getHostChainsCall { + type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = ::RustType; - type ReturnTuple<'a> = (KmsNode,); + type Return = alloy::sol_types::private::Vec< + ::RustType, + >; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Array,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getKmsNode(address)"; - const SELECTOR: [u8; 4] = [227u8, 178u8, 168u8, 116u8]; + const SIGNATURE: &'static str = "getHostChains()"; + const SELECTOR: [u8; 4] = [37u8, 133u8, 187u8, 101u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6159,15 +4775,15 @@ function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode m } #[inline] fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.kmsTxSenderAddress, - ), - ) + () } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { @@ -6175,7 +4791,7 @@ function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode m '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getKmsNodeReturn = r.into(); + let r: getHostChainsReturn = r.into(); r._0 }) } @@ -6187,7 +4803,7 @@ function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode m '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getKmsNodeReturn = r.into(); + let r: getHostChainsReturn = r.into(); r._0 }) } @@ -6195,21 +4811,21 @@ function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode m }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getKmsSigners()` and selector `0x7eaac8f2`. + /**Function with signature `getKmsGenThreshold()` and selector `0xb4722bc4`. ```solidity -function getKmsSigners() external view returns (address[] memory); +function getKmsGenThreshold() external view returns (uint256); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsSignersCall; + pub struct getKmsGenThresholdCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getKmsSigners()`](getKmsSignersCall) function. + ///Container type for the return parameters of the [`getKmsGenThreshold()`](getKmsGenThresholdCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsSignersReturn { + pub struct getKmsGenThresholdReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec, + pub _0: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -6237,14 +4853,16 @@ function getKmsSigners() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getKmsSignersCall) -> Self { + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getKmsGenThresholdCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getKmsSignersCall { + impl ::core::convert::From> + for getKmsGenThresholdCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -6252,12 +4870,10 @@ function getKmsSigners() external view returns (address[] memory); } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec, + alloy::sol_types::private::primitives::aliases::U256, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -6272,36 +4888,34 @@ function getKmsSigners() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getKmsSignersReturn) -> Self { + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getKmsGenThresholdReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getKmsSignersReturn { + impl ::core::convert::From> + for getKmsGenThresholdReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getKmsSignersCall { + impl alloy_sol_types::SolCall for getKmsGenThresholdCall { type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, - >; - type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getKmsSigners()"; - const SELECTOR: [u8; 4] = [126u8, 170u8, 200u8, 242u8]; + const SIGNATURE: &'static str = "getKmsGenThreshold()"; + const SELECTOR: [u8; 4] = [180u8, 114u8, 43u8, 196u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6315,8 +4929,8 @@ function getKmsSigners() external view returns (address[] memory); #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( - as alloy_sol_types::SolType>::tokenize(ret), ) } @@ -6326,7 +4940,7 @@ function getKmsSigners() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getKmsSignersReturn = r.into(); + let r: getKmsGenThresholdReturn = r.into(); r._0 }) } @@ -6338,7 +4952,7 @@ function getKmsSigners() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getKmsSignersReturn = r.into(); + let r: getKmsGenThresholdReturn = r.into(); r._0 }) } @@ -6346,21 +4960,24 @@ function getKmsSigners() external view returns (address[] memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getKmsTxSenders()` and selector `0x7420f3d4`. + /**Function with signature `getKmsNode(address)` and selector `0xe3b2a874`. ```solidity -function getKmsTxSenders() external view returns (address[] memory); +function getKmsNode(address kmsTxSenderAddress) external view returns (KmsNode memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsTxSendersCall; + pub struct getKmsNodeCall { + #[allow(missing_docs)] + pub kmsTxSenderAddress: alloy::sol_types::private::Address, + } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getKmsTxSenders()`](getKmsTxSendersCall) function. + ///Container type for the return parameters of the [`getKmsNode(address)`](getKmsNodeCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getKmsTxSendersReturn { + pub struct getKmsNodeReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::Vec, + pub _0: ::RustType, } #[allow( non_camel_case_types, @@ -6372,9 +4989,9 @@ function getKmsTxSenders() external view returns (address[] memory); use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -6388,27 +5005,27 @@ function getKmsTxSenders() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getKmsTxSendersCall) -> Self { - () + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getKmsNodeCall) -> Self { + (value.kmsTxSenderAddress,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getKmsTxSendersCall { + impl ::core::convert::From> for getKmsNodeCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self + Self { + kmsTxSenderAddress: tuple.0, + } } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type UnderlyingSolTuple<'a> = (KmsNode,); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Vec, + ::RustType, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -6423,38 +5040,32 @@ function getKmsTxSenders() external view returns (address[] memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getKmsTxSendersReturn) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getKmsNodeReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getKmsTxSendersReturn { + impl ::core::convert::From> for getKmsNodeReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getKmsTxSendersCall { - type Parameters<'a> = (); + impl alloy_sol_types::SolCall for getKmsNodeCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Address,); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::Vec< - alloy::sol_types::private::Address, - >; - type ReturnTuple<'a> = ( - alloy::sol_types::sol_data::Array, - ); + type Return = ::RustType; + type ReturnTuple<'a> = (KmsNode,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getKmsTxSenders()"; - const SELECTOR: [u8; 4] = [116u8, 32u8, 243u8, 212u8]; + const SIGNATURE: &'static str = "getKmsNode(address)"; + const SELECTOR: [u8; 4] = [227u8, 178u8, 168u8, 116u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6463,15 +5074,15 @@ function getKmsTxSenders() external view returns (address[] memory); } #[inline] fn tokenize(&self) -> Self::Token<'_> { - () + ( + ::tokenize( + &self.kmsTxSenderAddress, + ), + ) } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) + (::tokenize(ret),) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { @@ -6479,7 +5090,7 @@ function getKmsTxSenders() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getKmsTxSendersReturn = r.into(); + let r: getKmsNodeReturn = r.into(); r._0 }) } @@ -6491,7 +5102,7 @@ function getKmsTxSenders() external view returns (address[] memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getKmsTxSendersReturn = r.into(); + let r: getKmsNodeReturn = r.into(); r._0 }) } @@ -6499,21 +5110,21 @@ function getKmsTxSenders() external view returns (address[] memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getMpcThreshold()` and selector `0x26cf5def`. + /**Function with signature `getKmsSigners()` and selector `0x7eaac8f2`. ```solidity -function getMpcThreshold() external view returns (uint256); +function getKmsSigners() external view returns (address[] memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getMpcThresholdCall; + pub struct getKmsSignersCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getMpcThreshold()`](getMpcThresholdCall) function. + ///Container type for the return parameters of the [`getKmsSigners()`](getKmsSignersCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getMpcThresholdReturn { + pub struct getKmsSignersReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::primitives::aliases::U256, + pub _0: alloy::sol_types::private::Vec, } #[allow( non_camel_case_types, @@ -6541,14 +5152,14 @@ function getMpcThreshold() external view returns (uint256); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getMpcThresholdCall) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getKmsSignersCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getMpcThresholdCall { + impl ::core::convert::From> for getKmsSignersCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -6556,10 +5167,12 @@ function getMpcThreshold() external view returns (uint256); } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Vec, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -6573,35 +5186,37 @@ function getMpcThreshold() external view returns (uint256); } } #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getMpcThresholdReturn) -> Self { + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getKmsSignersReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getMpcThresholdReturn { + impl ::core::convert::From> for getKmsSignersReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getMpcThresholdCall { + impl alloy_sol_types::SolCall for getKmsSignersCall { type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::primitives::aliases::U256; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Return = alloy::sol_types::private::Vec< + alloy::sol_types::private::Address, + >; + type ReturnTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getMpcThreshold()"; - const SELECTOR: [u8; 4] = [38u8, 207u8, 93u8, 239u8]; + const SIGNATURE: &'static str = "getKmsSigners()"; + const SELECTOR: [u8; 4] = [126u8, 170u8, 200u8, 242u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6615,8 +5230,8 @@ function getMpcThreshold() external view returns (uint256); #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( - as alloy_sol_types::SolType>::tokenize(ret), ) } @@ -6626,7 +5241,7 @@ function getMpcThreshold() external view returns (uint256); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getMpcThresholdReturn = r.into(); + let r: getKmsSignersReturn = r.into(); r._0 }) } @@ -6638,7 +5253,7 @@ function getMpcThreshold() external view returns (uint256); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getMpcThresholdReturn = r.into(); + let r: getKmsSignersReturn = r.into(); r._0 }) } @@ -6646,21 +5261,21 @@ function getMpcThreshold() external view returns (uint256); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getProtocolMetadata()` and selector `0x48144c61`. + /**Function with signature `getKmsTxSenders()` and selector `0x7420f3d4`. ```solidity -function getProtocolMetadata() external view returns (ProtocolMetadata memory); +function getKmsTxSenders() external view returns (address[] memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getProtocolMetadataCall; + pub struct getKmsTxSendersCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getProtocolMetadata()`](getProtocolMetadataCall) function. + ///Container type for the return parameters of the [`getKmsTxSenders()`](getKmsTxSendersCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getProtocolMetadataReturn { + pub struct getKmsTxSendersReturn { #[allow(missing_docs)] - pub _0: ::RustType, + pub _0: alloy::sol_types::private::Vec, } #[allow( non_camel_case_types, @@ -6688,16 +5303,14 @@ function getProtocolMetadata() external view returns (ProtocolMetadata memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getProtocolMetadataCall) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getKmsTxSendersCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getProtocolMetadataCall { + impl ::core::convert::From> for getKmsTxSendersCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -6705,10 +5318,12 @@ function getProtocolMetadata() external view returns (ProtocolMetadata memory); } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (ProtocolMetadata,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - ::RustType, + alloy::sol_types::private::Vec, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -6723,34 +5338,38 @@ function getProtocolMetadata() external view returns (ProtocolMetadata memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getProtocolMetadataReturn) -> Self { + fn from(value: getKmsTxSendersReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getProtocolMetadataReturn { + for getKmsTxSendersReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getProtocolMetadataCall { + impl alloy_sol_types::SolCall for getKmsTxSendersCall { type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = ::RustType; - type ReturnTuple<'a> = (ProtocolMetadata,); + type Return = alloy::sol_types::private::Vec< + alloy::sol_types::private::Address, + >; + type ReturnTuple<'a> = ( + alloy::sol_types::sol_data::Array, + ); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getProtocolMetadata()"; - const SELECTOR: [u8; 4] = [72u8, 20u8, 76u8, 97u8]; + const SIGNATURE: &'static str = "getKmsTxSenders()"; + const SELECTOR: [u8; 4] = [116u8, 32u8, 243u8, 212u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6763,7 +5382,11 @@ function getProtocolMetadata() external view returns (ProtocolMetadata memory); } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { @@ -6771,7 +5394,7 @@ function getProtocolMetadata() external view returns (ProtocolMetadata memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getProtocolMetadataReturn = r.into(); + let r: getKmsTxSendersReturn = r.into(); r._0 }) } @@ -6783,7 +5406,7 @@ function getProtocolMetadata() external view returns (ProtocolMetadata memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getProtocolMetadataReturn = r.into(); + let r: getKmsTxSendersReturn = r.into(); r._0 }) } @@ -6791,19 +5414,19 @@ function getProtocolMetadata() external view returns (ProtocolMetadata memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getPublicDecryptionThreshold()` and selector `0x2a388998`. + /**Function with signature `getMpcThreshold()` and selector `0x26cf5def`. ```solidity -function getPublicDecryptionThreshold() external view returns (uint256); +function getMpcThreshold() external view returns (uint256); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getPublicDecryptionThresholdCall; + pub struct getMpcThresholdCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getPublicDecryptionThreshold()`](getPublicDecryptionThresholdCall) function. + ///Container type for the return parameters of the [`getMpcThreshold()`](getMpcThresholdCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getPublicDecryptionThresholdReturn { + pub struct getMpcThresholdReturn { #[allow(missing_docs)] pub _0: alloy::sol_types::private::primitives::aliases::U256, } @@ -6833,16 +5456,14 @@ function getPublicDecryptionThreshold() external view returns (uint256); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: getPublicDecryptionThresholdCall) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getMpcThresholdCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for getPublicDecryptionThresholdCall { + impl ::core::convert::From> for getMpcThresholdCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -6868,23 +5489,23 @@ function getPublicDecryptionThreshold() external view returns (uint256); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getPublicDecryptionThresholdReturn) -> Self { + fn from(value: getMpcThresholdReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getPublicDecryptionThresholdReturn { + for getMpcThresholdReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getPublicDecryptionThresholdCall { + impl alloy_sol_types::SolCall for getMpcThresholdCall { type Parameters<'a> = (); type Token<'a> = = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getPublicDecryptionThreshold()"; - const SELECTOR: [u8; 4] = [42u8, 56u8, 137u8, 152u8]; + const SIGNATURE: &'static str = "getMpcThreshold()"; + const SELECTOR: [u8; 4] = [38u8, 207u8, 93u8, 239u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6920,7 +5541,7 @@ function getPublicDecryptionThreshold() external view returns (uint256); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getPublicDecryptionThresholdReturn = r.into(); + let r: getMpcThresholdReturn = r.into(); r._0 }) } @@ -6932,7 +5553,7 @@ function getPublicDecryptionThreshold() external view returns (uint256); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getPublicDecryptionThresholdReturn = r.into(); + let r: getMpcThresholdReturn = r.into(); r._0 }) } @@ -6940,21 +5561,21 @@ function getPublicDecryptionThreshold() external view returns (uint256); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getUserDecryptionThreshold()` and selector `0xc2b42986`. + /**Function with signature `getProtocolMetadata()` and selector `0x48144c61`. ```solidity -function getUserDecryptionThreshold() external view returns (uint256); +function getProtocolMetadata() external view returns (ProtocolMetadata memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getUserDecryptionThresholdCall; + pub struct getProtocolMetadataCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getUserDecryptionThreshold()`](getUserDecryptionThresholdCall) function. + ///Container type for the return parameters of the [`getProtocolMetadata()`](getProtocolMetadataCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getUserDecryptionThresholdReturn { + pub struct getProtocolMetadataReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::primitives::aliases::U256, + pub _0: ::RustType, } #[allow( non_camel_case_types, @@ -6982,16 +5603,16 @@ function getUserDecryptionThreshold() external view returns (uint256); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getUserDecryptionThresholdCall) -> Self { + fn from(value: getProtocolMetadataCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getUserDecryptionThresholdCall { + for getProtocolMetadataCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -6999,10 +5620,10 @@ function getUserDecryptionThreshold() external view returns (uint256); } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type UnderlyingSolTuple<'a> = (ProtocolMetadata,); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, + ::RustType, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -7017,34 +5638,34 @@ function getUserDecryptionThreshold() external view returns (uint256); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getUserDecryptionThresholdReturn) -> Self { + fn from(value: getProtocolMetadataReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for getUserDecryptionThresholdReturn { + for getProtocolMetadataReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getUserDecryptionThresholdCall { + impl alloy_sol_types::SolCall for getProtocolMetadataCall { type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::primitives::aliases::U256; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Return = ::RustType; + type ReturnTuple<'a> = (ProtocolMetadata,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getUserDecryptionThreshold()"; - const SELECTOR: [u8; 4] = [194u8, 180u8, 41u8, 134u8]; + const SIGNATURE: &'static str = "getProtocolMetadata()"; + const SELECTOR: [u8; 4] = [72u8, 20u8, 76u8, 97u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -7057,11 +5678,7 @@ function getUserDecryptionThreshold() external view returns (uint256); } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) + (::tokenize(ret),) } #[inline] fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { @@ -7069,7 +5686,7 @@ function getUserDecryptionThreshold() external view returns (uint256); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getUserDecryptionThresholdReturn = r.into(); + let r: getProtocolMetadataReturn = r.into(); r._0 }) } @@ -7081,7 +5698,7 @@ function getUserDecryptionThreshold() external view returns (uint256); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getUserDecryptionThresholdReturn = r.into(); + let r: getProtocolMetadataReturn = r.into(); r._0 }) } @@ -7089,21 +5706,21 @@ function getUserDecryptionThreshold() external view returns (uint256); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `getVersion()` and selector `0x0d8e6e2c`. + /**Function with signature `getPublicDecryptionThreshold()` and selector `0x2a388998`. ```solidity -function getVersion() external pure returns (string memory); +function getPublicDecryptionThreshold() external view returns (uint256); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getVersionCall; + pub struct getPublicDecryptionThresholdCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`getVersion()`](getVersionCall) function. + ///Container type for the return parameters of the [`getPublicDecryptionThreshold()`](getPublicDecryptionThresholdCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct getVersionReturn { + pub struct getPublicDecryptionThresholdReturn { #[allow(missing_docs)] - pub _0: alloy::sol_types::private::String, + pub _0: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -7131,14 +5748,16 @@ function getVersion() external pure returns (string memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getVersionCall) -> Self { + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getPublicDecryptionThresholdCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getVersionCall { + impl ::core::convert::From> + for getPublicDecryptionThresholdCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self } @@ -7146,9 +5765,11 @@ function getVersion() external pure returns (string memory); } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::String,); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::String,); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -7162,32 +5783,34 @@ function getVersion() external pure returns (string memory); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: getVersionReturn) -> Self { + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: getPublicDecryptionThresholdReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for getVersionReturn { + impl ::core::convert::From> + for getPublicDecryptionThresholdReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for getVersionCall { + impl alloy_sol_types::SolCall for getPublicDecryptionThresholdCall { type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = alloy::sol_types::private::String; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::String,); + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "getVersion()"; - const SELECTOR: [u8; 4] = [13u8, 142u8, 110u8, 44u8]; + const SIGNATURE: &'static str = "getPublicDecryptionThreshold()"; + const SELECTOR: [u8; 4] = [42u8, 56u8, 137u8, 152u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -7201,9 +5824,9 @@ function getVersion() external pure returns (string memory); #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( - ::tokenize( - ret, - ), + as alloy_sol_types::SolType>::tokenize(ret), ) } #[inline] @@ -7212,7 +5835,7 @@ function getVersion() external pure returns (string memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: getVersionReturn = r.into(); + let r: getPublicDecryptionThresholdReturn = r.into(); r._0 }) } @@ -7224,7 +5847,7 @@ function getVersion() external pure returns (string memory); '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: getVersionReturn = r.into(); + let r: getPublicDecryptionThresholdReturn = r.into(); r._0 }) } @@ -7232,24 +5855,21 @@ function getVersion() external pure returns (string memory); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `isCoprocessorSigner(address)` and selector `0x2b101c03`. + /**Function with signature `getUserDecryptionThreshold()` and selector `0xc2b42986`. ```solidity -function isCoprocessorSigner(address signerAddress) external view returns (bool); +function getUserDecryptionThreshold() external view returns (uint256); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct isCoprocessorSignerCall { - #[allow(missing_docs)] - pub signerAddress: alloy::sol_types::private::Address, - } + pub struct getUserDecryptionThresholdCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`isCoprocessorSigner(address)`](isCoprocessorSignerCall) function. + ///Container type for the return parameters of the [`getUserDecryptionThreshold()`](getUserDecryptionThresholdCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct isCoprocessorSignerReturn { + pub struct getUserDecryptionThresholdReturn { #[allow(missing_docs)] - pub _0: bool, + pub _0: alloy::sol_types::private::primitives::aliases::U256, } #[allow( non_camel_case_types, @@ -7261,9 +5881,9 @@ function isCoprocessorSigner(address signerAddress) external view returns (bool) use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + type UnderlyingSolTuple<'a> = (); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + type UnderlyingRustTuple<'a> = (); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -7277,26 +5897,28 @@ function isCoprocessorSigner(address signerAddress) external view returns (bool) } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: isCoprocessorSignerCall) -> Self { - (value.signerAddress,) + fn from(value: getUserDecryptionThresholdCall) -> Self { + () } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for isCoprocessorSignerCall { + for getUserDecryptionThresholdCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { signerAddress: tuple.0 } + Self } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Bool,); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (bool,); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -7310,34 +5932,34 @@ function isCoprocessorSigner(address signerAddress) external view returns (bool) } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From + impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: isCoprocessorSignerReturn) -> Self { + fn from(value: getUserDecryptionThresholdReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] impl ::core::convert::From> - for isCoprocessorSignerReturn { + for getUserDecryptionThresholdReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for isCoprocessorSignerCall { - type Parameters<'a> = (alloy::sol_types::sol_data::Address,); + impl alloy_sol_types::SolCall for getUserDecryptionThresholdCall { + type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = bool; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); + > as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "isCoprocessorSigner(address)"; - const SELECTOR: [u8; 4] = [43u8, 16u8, 28u8, 3u8]; + const SIGNATURE: &'static str = "getUserDecryptionThreshold()"; + const SELECTOR: [u8; 4] = [194u8, 180u8, 41u8, 134u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -7346,18 +5968,14 @@ function isCoprocessorSigner(address signerAddress) external view returns (bool) } #[inline] fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.signerAddress, - ), - ) + () } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( - ::tokenize( - ret, - ), + as alloy_sol_types::SolType>::tokenize(ret), ) } #[inline] @@ -7366,7 +5984,7 @@ function isCoprocessorSigner(address signerAddress) external view returns (bool) '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: isCoprocessorSignerReturn = r.into(); + let r: getUserDecryptionThresholdReturn = r.into(); r._0 }) } @@ -7378,7 +5996,7 @@ function isCoprocessorSigner(address signerAddress) external view returns (bool) '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: isCoprocessorSignerReturn = r.into(); + let r: getUserDecryptionThresholdReturn = r.into(); r._0 }) } @@ -7386,24 +6004,21 @@ function isCoprocessorSigner(address signerAddress) external view returns (bool) }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `isCoprocessorTxSender(address)` and selector `0x2dd3edfe`. + /**Function with signature `getVersion()` and selector `0x0d8e6e2c`. ```solidity -function isCoprocessorTxSender(address coprocessorTxSenderAddress) external view returns (bool); +function getVersion() external pure returns (string memory); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct isCoprocessorTxSenderCall { - #[allow(missing_docs)] - pub coprocessorTxSenderAddress: alloy::sol_types::private::Address, - } + pub struct getVersionCall; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`isCoprocessorTxSender(address)`](isCoprocessorTxSenderCall) function. + ///Container type for the return parameters of the [`getVersion()`](getVersionCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct isCoprocessorTxSenderReturn { + pub struct getVersionReturn { #[allow(missing_docs)] - pub _0: bool, + pub _0: alloy::sol_types::private::String, } #[allow( non_camel_case_types, @@ -7415,9 +6030,9 @@ function isCoprocessorTxSender(address coprocessorTxSenderAddress) external view use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + type UnderlyingSolTuple<'a> = (); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + type UnderlyingRustTuple<'a> = (); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -7431,28 +6046,24 @@ function isCoprocessorTxSender(address coprocessorTxSenderAddress) external view } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: isCoprocessorTxSenderCall) -> Self { - (value.coprocessorTxSenderAddress,) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getVersionCall) -> Self { + () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for isCoprocessorTxSenderCall { + impl ::core::convert::From> for getVersionCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - coprocessorTxSenderAddress: tuple.0, - } + Self } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Bool,); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::String,); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (bool,); + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::String,); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -7466,34 +6077,32 @@ function isCoprocessorTxSender(address coprocessorTxSenderAddress) external view } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From - for UnderlyingRustTuple<'_> { - fn from(value: isCoprocessorTxSenderReturn) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: getVersionReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> - for isCoprocessorTxSenderReturn { + impl ::core::convert::From> for getVersionReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for isCoprocessorTxSenderCall { - type Parameters<'a> = (alloy::sol_types::sol_data::Address,); + impl alloy_sol_types::SolCall for getVersionCall { + type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = bool; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); + type Return = alloy::sol_types::private::String; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::String,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "isCoprocessorTxSender(address)"; - const SELECTOR: [u8; 4] = [45u8, 211u8, 237u8, 254u8]; + const SIGNATURE: &'static str = "getVersion()"; + const SELECTOR: [u8; 4] = [13u8, 142u8, 110u8, 44u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -7502,16 +6111,12 @@ function isCoprocessorTxSender(address coprocessorTxSenderAddress) external view } #[inline] fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.coprocessorTxSenderAddress, - ), - ) + () } #[inline] fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { ( - ::tokenize( + ::tokenize( ret, ), ) @@ -7522,7 +6127,7 @@ function isCoprocessorTxSender(address coprocessorTxSenderAddress) external view '_, > as alloy_sol_types::SolType>::abi_decode_sequence(data) .map(|r| { - let r: isCoprocessorTxSenderReturn = r.into(); + let r: getVersionReturn = r.into(); r._0 }) } @@ -7534,7 +6139,7 @@ function isCoprocessorTxSender(address coprocessorTxSenderAddress) external view '_, > as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) .map(|r| { - let r: isCoprocessorTxSenderReturn = r.into(); + let r: getVersionReturn = r.into(); r._0 }) } @@ -9353,14 +7958,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter #[allow(missing_docs)] addHostChain(addHostChainCall), #[allow(missing_docs)] - getCoprocessor(getCoprocessorCall), - #[allow(missing_docs)] - getCoprocessorMajorityThreshold(getCoprocessorMajorityThresholdCall), - #[allow(missing_docs)] - getCoprocessorSigners(getCoprocessorSignersCall), - #[allow(missing_docs)] - getCoprocessorTxSenders(getCoprocessorTxSendersCall), - #[allow(missing_docs)] getCustodian(getCustodianCall), #[allow(missing_docs)] getCustodianSigners(getCustodianSignersCall), @@ -9389,10 +7986,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter #[allow(missing_docs)] getVersion(getVersionCall), #[allow(missing_docs)] - isCoprocessorSigner(isCoprocessorSignerCall), - #[allow(missing_docs)] - isCoprocessorTxSender(isCoprocessorTxSenderCall), - #[allow(missing_docs)] isCustodianSigner(isCustodianSignerCall), #[allow(missing_docs)] isCustodianTxSender(isCustodianTxSenderCall), @@ -9428,25 +8021,20 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter pub const SELECTORS: &'static [[u8; 4usize]] = &[ [7u8, 36u8, 221u8, 35u8], [13u8, 142u8, 110u8, 44u8], - [30u8, 165u8, 189u8, 66u8], [32u8, 61u8, 1u8, 20u8], [37u8, 133u8, 187u8, 101u8], [38u8, 207u8, 93u8, 239u8], [42u8, 56u8, 137u8, 152u8], [42u8, 139u8, 157u8, 233u8], - [43u8, 16u8, 28u8, 3u8], - [45u8, 211u8, 237u8, 254u8], [46u8, 45u8, 58u8, 130u8], [70u8, 251u8, 246u8, 142u8], [72u8, 20u8, 76u8, 97u8], [91u8, 172u8, 231u8, 255u8], - [103u8, 153u8, 239u8, 82u8], [116u8, 32u8, 243u8, 212u8], [119u8, 45u8, 47u8, 233u8], [121u8, 139u8, 88u8, 166u8], [126u8, 170u8, 200u8, 242u8], [136u8, 45u8, 125u8, 211u8], - [145u8, 100u8, 208u8, 174u8], [154u8, 90u8, 59u8, 196u8], [180u8, 114u8, 43u8, 196u8], [186u8, 31u8, 49u8, 210u8], @@ -9458,32 +8046,19 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter [227u8, 178u8, 168u8, 116u8], [229u8, 39u8, 94u8, 175u8], [235u8, 132u8, 60u8, 246u8], - [239u8, 105u8, 151u8, 249u8], ]; } #[automatically_derived] impl alloy_sol_types::SolInterface for IGatewayConfigCalls { const NAME: &'static str = "IGatewayConfigCalls"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 33usize; + const COUNT: usize = 27usize; #[inline] fn selector(&self) -> [u8; 4] { match self { Self::addHostChain(_) => { ::SELECTOR } - Self::getCoprocessor(_) => { - ::SELECTOR - } - Self::getCoprocessorMajorityThreshold(_) => { - ::SELECTOR - } - Self::getCoprocessorSigners(_) => { - ::SELECTOR - } - Self::getCoprocessorTxSenders(_) => { - ::SELECTOR - } Self::getCustodian(_) => { ::SELECTOR } @@ -9526,12 +8101,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter Self::getVersion(_) => { ::SELECTOR } - Self::isCoprocessorSigner(_) => { - ::SELECTOR - } - Self::isCoprocessorTxSender(_) => { - ::SELECTOR - } Self::isCustodianSigner(_) => { ::SELECTOR } @@ -9607,17 +8176,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter } getVersion }, - { - fn getCoprocessorTxSenders( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(IGatewayConfigCalls::getCoprocessorTxSenders) - } - getCoprocessorTxSenders - }, { fn isKmsSigner( data: &[u8], @@ -9673,28 +8231,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter } getCustodianTxSenders }, - { - fn isCoprocessorSigner( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(IGatewayConfigCalls::isCoprocessorSigner) - } - isCoprocessorSigner - }, - { - fn isCoprocessorTxSender( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(IGatewayConfigCalls::isCoprocessorTxSender) - } - isCoprocessorTxSender - }, { fn updatePublicDecryptionThreshold( data: &[u8], @@ -9737,17 +8273,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter } isCustodianTxSender }, - { - fn getCoprocessorMajorityThreshold( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(IGatewayConfigCalls::getCoprocessorMajorityThreshold) - } - getCoprocessorMajorityThreshold - }, { fn getKmsTxSenders( data: &[u8], @@ -9803,17 +8328,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter } isCustodianSigner }, - { - fn getCoprocessorSigners( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(IGatewayConfigCalls::getCoprocessorSigners) - } - getCoprocessorSigners - }, { fn pauseAllGatewayContracts( data: &[u8], @@ -9935,17 +8449,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter } updateUserDecryptionThreshold }, - { - fn getCoprocessor( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(IGatewayConfigCalls::getCoprocessor) - } - getCoprocessor - }, ]; let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { return Err( @@ -9988,17 +8491,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter } getVersion }, - { - fn getCoprocessorTxSenders( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(IGatewayConfigCalls::getCoprocessorTxSenders) - } - getCoprocessorTxSenders - }, { fn isKmsSigner( data: &[u8], @@ -10054,28 +8546,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter } getCustodianTxSenders }, - { - fn isCoprocessorSigner( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(IGatewayConfigCalls::isCoprocessorSigner) - } - isCoprocessorSigner - }, - { - fn isCoprocessorTxSender( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(IGatewayConfigCalls::isCoprocessorTxSender) - } - isCoprocessorTxSender - }, { fn updatePublicDecryptionThreshold( data: &[u8], @@ -10120,17 +8590,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter } isCustodianTxSender }, - { - fn getCoprocessorMajorityThreshold( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(IGatewayConfigCalls::getCoprocessorMajorityThreshold) - } - getCoprocessorMajorityThreshold - }, { fn getKmsTxSenders( data: &[u8], @@ -10186,17 +8645,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter } isCustodianSigner }, - { - fn getCoprocessorSigners( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(IGatewayConfigCalls::getCoprocessorSigners) - } - getCoprocessorSigners - }, { fn pauseAllGatewayContracts( data: &[u8], @@ -10318,17 +8766,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter } updateUserDecryptionThreshold }, - { - fn getCoprocessor( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(IGatewayConfigCalls::getCoprocessor) - } - getCoprocessor - }, ]; let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { return Err( @@ -10348,26 +8785,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter inner, ) } - Self::getCoprocessor(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::getCoprocessorMajorityThreshold(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::getCoprocessorSigners(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::getCoprocessorTxSenders(inner) => { - ::abi_encoded_size( - inner, - ) - } Self::getCustodian(inner) => { ::abi_encoded_size( inner, @@ -10434,16 +8851,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter Self::getVersion(inner) => { ::abi_encoded_size(inner) } - Self::isCoprocessorSigner(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::isCoprocessorTxSender(inner) => { - ::abi_encoded_size( - inner, - ) - } Self::isCustodianSigner(inner) => { ::abi_encoded_size( inner, @@ -10513,30 +8920,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter out, ) } - Self::getCoprocessor(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::getCoprocessorMajorityThreshold(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::getCoprocessorSigners(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::getCoprocessorTxSenders(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } Self::getCustodian(inner) => { ::abi_encode_raw( inner, @@ -10621,18 +9004,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter out, ) } - Self::isCoprocessorSigner(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::isCoprocessorTxSender(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } Self::isCustodianSigner(inner) => { ::abi_encode_raw( inner, @@ -10715,8 +9086,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter #[allow(missing_docs)] ChainIdNotUint64(ChainIdNotUint64), #[allow(missing_docs)] - EmptyCoprocessors(EmptyCoprocessors), - #[allow(missing_docs)] EmptyCustodians(EmptyCustodians), #[allow(missing_docs)] EmptyKmsNodes(EmptyKmsNodes), @@ -10757,7 +9126,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter [62u8, 229u8, 7u8, 116u8], [65u8, 120u8, 222u8, 66u8], [132u8, 32u8, 143u8, 35u8], - [138u8, 240u8, 130u8, 239u8], [144u8, 126u8, 102u8, 129u8], [150u8, 165u8, 104u8, 40u8], [177u8, 174u8, 146u8, 234u8], @@ -10770,16 +9138,13 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter impl alloy_sol_types::SolInterface for IGatewayConfigErrors { const NAME: &'static str = "IGatewayConfigErrors"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 14usize; + const COUNT: usize = 13usize; #[inline] fn selector(&self) -> [u8; 4] { match self { Self::ChainIdNotUint64(_) => { ::SELECTOR } - Self::EmptyCoprocessors(_) => { - ::SELECTOR - } Self::EmptyCustodians(_) => { ::SELECTOR } @@ -10910,17 +9275,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter } InvalidHighPublicDecryptionThreshold }, - { - fn EmptyCoprocessors( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(IGatewayConfigErrors::EmptyCoprocessors) - } - EmptyCoprocessors - }, { fn InvalidHighMpcThreshold( data: &[u8], @@ -11092,17 +9446,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter } InvalidHighPublicDecryptionThreshold }, - { - fn EmptyCoprocessors( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(IGatewayConfigErrors::EmptyCoprocessors) - } - EmptyCoprocessors - }, { fn InvalidHighMpcThreshold( data: &[u8], @@ -11194,11 +9537,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter inner, ) } - Self::EmptyCoprocessors(inner) => { - ::abi_encoded_size( - inner, - ) - } Self::EmptyCustodians(inner) => { ::abi_encoded_size( inner, @@ -11266,12 +9604,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter out, ) } - Self::EmptyCoprocessors(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } Self::EmptyCustodians(inner) => { ::abi_encode_raw( inner, @@ -11390,11 +9722,6 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter 76u8, 221u8, 89u8, 244u8, 242u8, 26u8, 33u8, 108u8, 112u8, 53u8, 46u8, 165u8, 156u8, 176u8, 37u8, 67u8, 252u8, 118u8, 48u8, 132u8, 55u8, ], - [ - 58u8, 124u8, 84u8, 177u8, 25u8, 93u8, 68u8, 162u8, 136u8, 249u8, 195u8, - 201u8, 160u8, 103u8, 154u8, 237u8, 147u8, 37u8, 6u8, 142u8, 13u8, 13u8, - 91u8, 105u8, 233u8, 96u8, 71u8, 53u8, 92u8, 199u8, 23u8, 69u8, - ], [ 102u8, 118u8, 147u8, 65u8, 239u8, 253u8, 38u8, 143u8, 196u8, 233u8, 169u8, 200u8, 242u8, 123u8, 252u8, 150u8, 133u8, 7u8, 181u8, 25u8, 176u8, @@ -11405,6 +9732,11 @@ function updateUserDecryptionThreshold(uint256 newUserDecryptionThreshold) exter 146u8, 197u8, 24u8, 46u8, 82u8, 169u8, 245u8, 187u8, 222u8, 237u8, 123u8, 35u8, 114u8, 146u8, 122u8, 38u8, 198u8, 149u8, 131u8, 150u8, 19u8, ], + [ + 171u8, 88u8, 171u8, 147u8, 136u8, 146u8, 161u8, 133u8, 93u8, 9u8, 199u8, + 193u8, 57u8, 12u8, 171u8, 212u8, 202u8, 4u8, 5u8, 234u8, 171u8, 50u8, + 44u8, 90u8, 130u8, 87u8, 7u8, 112u8, 167u8, 25u8, 130u8, 110u8, + ], [ 190u8, 79u8, 101u8, 93u8, 170u8, 224u8, 219u8, 174u8, 246u8, 58u8, 107u8, 82u8, 92u8, 171u8, 47u8, 166u8, 172u8, 228u8, 170u8, 91u8, 148u8, 184u8, @@ -11735,35 +10067,6 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ ) -> alloy_contract::SolCallBuilder<&P, addHostChainCall, N> { self.call_builder(&addHostChainCall { hostChain }) } - ///Creates a new call builder for the [`getCoprocessor`] function. - pub fn getCoprocessor( - &self, - coprocessorTxSenderAddress: alloy::sol_types::private::Address, - ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorCall, N> { - self.call_builder( - &getCoprocessorCall { - coprocessorTxSenderAddress, - }, - ) - } - ///Creates a new call builder for the [`getCoprocessorMajorityThreshold`] function. - pub fn getCoprocessorMajorityThreshold( - &self, - ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorMajorityThresholdCall, N> { - self.call_builder(&getCoprocessorMajorityThresholdCall) - } - ///Creates a new call builder for the [`getCoprocessorSigners`] function. - pub fn getCoprocessorSigners( - &self, - ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorSignersCall, N> { - self.call_builder(&getCoprocessorSignersCall) - } - ///Creates a new call builder for the [`getCoprocessorTxSenders`] function. - pub fn getCoprocessorTxSenders( - &self, - ) -> alloy_contract::SolCallBuilder<&P, getCoprocessorTxSendersCall, N> { - self.call_builder(&getCoprocessorTxSendersCall) - } ///Creates a new call builder for the [`getCustodian`] function. pub fn getCustodian( &self, @@ -11859,28 +10162,6 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ ) -> alloy_contract::SolCallBuilder<&P, getVersionCall, N> { self.call_builder(&getVersionCall) } - ///Creates a new call builder for the [`isCoprocessorSigner`] function. - pub fn isCoprocessorSigner( - &self, - signerAddress: alloy::sol_types::private::Address, - ) -> alloy_contract::SolCallBuilder<&P, isCoprocessorSignerCall, N> { - self.call_builder( - &isCoprocessorSignerCall { - signerAddress, - }, - ) - } - ///Creates a new call builder for the [`isCoprocessorTxSender`] function. - pub fn isCoprocessorTxSender( - &self, - coprocessorTxSenderAddress: alloy::sol_types::private::Address, - ) -> alloy_contract::SolCallBuilder<&P, isCoprocessorTxSenderCall, N> { - self.call_builder( - &isCoprocessorTxSenderCall { - coprocessorTxSenderAddress, - }, - ) - } ///Creates a new call builder for the [`isCustodianSigner`] function. pub fn isCustodianSigner( &self, diff --git a/gateway-contracts/rust_bindings/src/i_input_verification.rs b/gateway-contracts/rust_bindings/src/i_input_verification.rs index 0ff4d15d02..ac771a4d42 100644 --- a/gateway-contracts/rust_bindings/src/i_input_verification.rs +++ b/gateway-contracts/rust_bindings/src/i_input_verification.rs @@ -3,13 +3,17 @@ Generated by the following Solidity interface... ```solidity interface IInputVerification { + type ContextStatus is uint8; + error CoprocessorAlreadyRejected(uint256 zkProofId, address txSender, address signer); error CoprocessorAlreadyVerified(uint256 zkProofId, address txSender, address signer); + error InvalidCoprocessorContextProofRejection(uint256 zkProofId, uint256 contextId, ContextStatus contextStatus); + error InvalidCoprocessorContextProofVerification(uint256 zkProofId, uint256 contextId, ContextStatus contextStatus); error VerifyProofNotRequested(uint256 zkProofId); - event RejectProofResponse(uint256 indexed zkProofId); + event RejectProofResponse(uint256 indexed zkProofId, bytes extraData); event VerifyProofRequest(uint256 indexed zkProofId, uint256 indexed coprocessorContextId, uint256 indexed contractChainId, address contractAddress, address userAddress, bytes ciphertextWithZKProof, bytes extraData); - event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[] signatures); + event VerifyProofResponse(uint256 indexed zkProofId, uint256 indexed coprocessorContextId, bytes32[] ctHandles, bytes[] signatures, bytes extraData); function getRejectProofConsensusTxSenders(uint256 zkProofId) external view returns (address[] memory); function getVerifyProofConsensusTxSenders(uint256 zkProofId) external view returns (address[] memory); @@ -202,6 +206,12 @@ interface IInputVerification { "type": "uint256", "indexed": true, "internalType": "uint256" + }, + { + "name": "extraData", + "type": "bytes", + "indexed": false, + "internalType": "bytes" } ], "anonymous": false @@ -265,6 +275,12 @@ interface IInputVerification { "indexed": true, "internalType": "uint256" }, + { + "name": "coprocessorContextId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, { "name": "ctHandles", "type": "bytes32[]", @@ -276,6 +292,12 @@ interface IInputVerification { "type": "bytes[]", "indexed": false, "internalType": "bytes[]" + }, + { + "name": "extraData", + "type": "bytes", + "indexed": false, + "internalType": "bytes" } ], "anonymous": false @@ -322,6 +344,48 @@ interface IInputVerification { } ] }, + { + "type": "error", + "name": "InvalidCoprocessorContextProofRejection", + "inputs": [ + { + "name": "zkProofId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contextStatus", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ] + }, + { + "type": "error", + "name": "InvalidCoprocessorContextProofVerification", + "inputs": [ + { + "name": "zkProofId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contextStatus", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ] + }, { "type": "error", "name": "VerifyProofNotRequested", @@ -367,6 +431,144 @@ pub mod IInputVerification { ); #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextStatus(u8); + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::private::SolTypeValue for u8 { + #[inline] + fn stv_to_tokens( + &self, + ) -> as alloy_sol_types::SolType>::Token<'_> { + alloy_sol_types::private::SolTypeValue::< + alloy::sol_types::sol_data::Uint<8>, + >::stv_to_tokens(self) + } + #[inline] + fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { + as alloy_sol_types::SolType>::tokenize(self) + .0 + } + #[inline] + fn stv_abi_encode_packed_to( + &self, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::SolType>::abi_encode_packed_to(self, out) + } + #[inline] + fn stv_abi_packed_encoded_size(&self) -> usize { + as alloy_sol_types::SolType>::abi_encoded_size(self) + } + } + #[automatically_derived] + impl ContextStatus { + /// The Solidity type name. + pub const NAME: &'static str = stringify!(@ name); + /// Convert from the underlying value type. + #[inline] + pub const fn from_underlying(value: u8) -> Self { + Self(value) + } + /// Return the underlying value. + #[inline] + pub const fn into_underlying(self) -> u8 { + self.0 + } + /// Return the single encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode(&self) -> alloy_sol_types::private::Vec { + ::abi_encode(&self.0) + } + /// Return the packed encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode_packed(&self) -> alloy_sol_types::private::Vec { + ::abi_encode_packed(&self.0) + } + } + #[automatically_derived] + impl From for ContextStatus { + fn from(value: u8) -> Self { + Self::from_underlying(value) + } + } + #[automatically_derived] + impl From for u8 { + fn from(value: ContextStatus) -> Self { + value.into_underlying() + } + } + #[automatically_derived] + impl alloy_sol_types::SolType for ContextStatus { + type RustType = u8; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SOL_NAME: &'static str = Self::NAME; + const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; + const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; + #[inline] + fn valid_token(token: &Self::Token<'_>) -> bool { + Self::type_check(token).is_ok() + } + #[inline] + fn type_check(token: &Self::Token<'_>) -> alloy_sol_types::Result<()> { + as alloy_sol_types::SolType>::type_check(token) + } + #[inline] + fn detokenize(token: Self::Token<'_>) -> Self::RustType { + as alloy_sol_types::SolType>::detokenize(token) + } + } + #[automatically_derived] + impl alloy_sol_types::EventTopic for ContextStatus { + #[inline] + fn topic_preimage_length(rust: &Self::RustType) -> usize { + as alloy_sol_types::EventTopic>::topic_preimage_length(rust) + } + #[inline] + fn encode_topic_preimage( + rust: &Self::RustType, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::EventTopic>::encode_topic_preimage(rust, out) + } + #[inline] + fn encode_topic( + rust: &Self::RustType, + ) -> alloy_sol_types::abi::token::WordToken { + as alloy_sol_types::EventTopic>::encode_topic(rust) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Custom error with signature `CoprocessorAlreadyRejected(uint256,address,address)` and selector `0x2fa73174`. ```solidity error CoprocessorAlreadyRejected(uint256 zkProofId, address txSender, address signer); @@ -575,6 +777,214 @@ error CoprocessorAlreadyVerified(uint256 zkProofId, address txSender, address si }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InvalidCoprocessorContextProofRejection(uint256,uint256,uint8)` and selector `0xf3225893`. +```solidity +error InvalidCoprocessorContextProofRejection(uint256 zkProofId, uint256 contextId, ContextStatus contextStatus); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidCoprocessorContextProofRejection { + #[allow(missing_docs)] + pub zkProofId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub contextStatus: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + ContextStatus, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: InvalidCoprocessorContextProofRejection) -> Self { + (value.zkProofId, value.contextId, value.contextStatus) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for InvalidCoprocessorContextProofRejection { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + zkProofId: tuple.0, + contextId: tuple.1, + contextStatus: tuple.2, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InvalidCoprocessorContextProofRejection { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InvalidCoprocessorContextProofRejection(uint256,uint256,uint8)"; + const SELECTOR: [u8; 4] = [243u8, 34u8, 88u8, 147u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.zkProofId), + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.contextStatus, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InvalidCoprocessorContextProofVerification(uint256,uint256,uint8)` and selector `0xc0eedb7b`. +```solidity +error InvalidCoprocessorContextProofVerification(uint256 zkProofId, uint256 contextId, ContextStatus contextStatus); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidCoprocessorContextProofVerification { + #[allow(missing_docs)] + pub zkProofId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub contextStatus: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + ContextStatus, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: InvalidCoprocessorContextProofVerification) -> Self { + (value.zkProofId, value.contextId, value.contextStatus) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for InvalidCoprocessorContextProofVerification { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + zkProofId: tuple.0, + contextId: tuple.1, + contextStatus: tuple.2, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InvalidCoprocessorContextProofVerification { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InvalidCoprocessorContextProofVerification(uint256,uint256,uint8)"; + const SELECTOR: [u8; 4] = [192u8, 238u8, 219u8, 123u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.zkProofId), + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.contextStatus, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Custom error with signature `VerifyProofNotRequested(uint256)` and selector `0x4711083f`. ```solidity error VerifyProofNotRequested(uint256 zkProofId); @@ -657,9 +1067,9 @@ error VerifyProofNotRequested(uint256 zkProofId); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `RejectProofResponse(uint256)` and selector `0xe465e141fa8abd95ab7e0855543307f8506ab0170ef664420fb71ab7de0183de`. + /**Event with signature `RejectProofResponse(uint256,bytes)` and selector `0x6f4b137679536c6081c7f024870327aa89b62a64182f2d41e4fbdee5e2248e86`. ```solidity -event RejectProofResponse(uint256 indexed zkProofId); +event RejectProofResponse(uint256 indexed zkProofId, bytes extraData); ```*/ #[allow( non_camel_case_types, @@ -671,6 +1081,8 @@ event RejectProofResponse(uint256 indexed zkProofId); pub struct RejectProofResponse { #[allow(missing_docs)] pub zkProofId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub extraData: alloy::sol_types::private::Bytes, } #[allow( non_camel_case_types, @@ -682,7 +1094,7 @@ event RejectProofResponse(uint256 indexed zkProofId); use alloy::sol_types as alloy_sol_types; #[automatically_derived] impl alloy_sol_types::SolEvent for RejectProofResponse { - type DataTuple<'a> = (); + type DataTuple<'a> = (alloy::sol_types::sol_data::Bytes,); type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; @@ -690,11 +1102,11 @@ event RejectProofResponse(uint256 indexed zkProofId); alloy_sol_types::sol_data::FixedBytes<32>, alloy::sol_types::sol_data::Uint<256>, ); - const SIGNATURE: &'static str = "RejectProofResponse(uint256)"; + const SIGNATURE: &'static str = "RejectProofResponse(uint256,bytes)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 228u8, 101u8, 225u8, 65u8, 250u8, 138u8, 189u8, 149u8, 171u8, 126u8, 8u8, - 85u8, 84u8, 51u8, 7u8, 248u8, 80u8, 106u8, 176u8, 23u8, 14u8, 246u8, - 100u8, 66u8, 15u8, 183u8, 26u8, 183u8, 222u8, 1u8, 131u8, 222u8, + 111u8, 75u8, 19u8, 118u8, 121u8, 83u8, 108u8, 96u8, 129u8, 199u8, 240u8, + 36u8, 135u8, 3u8, 39u8, 170u8, 137u8, 182u8, 42u8, 100u8, 24u8, 47u8, + 45u8, 65u8, 228u8, 251u8, 222u8, 229u8, 226u8, 36u8, 142u8, 134u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -703,7 +1115,10 @@ event RejectProofResponse(uint256 indexed zkProofId); topics: ::RustType, data: as alloy_sol_types::SolType>::RustType, ) -> Self { - Self { zkProofId: topics.1 } + Self { + zkProofId: topics.1, + extraData: data.0, + } } #[inline] fn check_signature( @@ -722,7 +1137,11 @@ event RejectProofResponse(uint256 indexed zkProofId); } #[inline] fn tokenize_body(&self) -> Self::DataToken<'_> { - () + ( + ::tokenize( + &self.extraData, + ), + ) } #[inline] fn topics(&self) -> ::RustType { @@ -924,9 +1343,9 @@ event VerifyProofRequest(uint256 indexed zkProofId, uint256 indexed coprocessorC }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `VerifyProofResponse(uint256,bytes32[],bytes[])` and selector `0xfe2c43585786a5a658d2ec5df5dea3fb3385b77c94f60f724ff810896f419835`. + /**Event with signature `VerifyProofResponse(uint256,uint256,bytes32[],bytes[],bytes)` and selector `0xf96a66bb08cf5450f5789d7343fa3b58d4a00a66ef2d0d0494f424b03b0abff2`. ```solidity -event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[] signatures); +event VerifyProofResponse(uint256 indexed zkProofId, uint256 indexed coprocessorContextId, bytes32[] ctHandles, bytes[] signatures, bytes extraData); ```*/ #[allow( non_camel_case_types, @@ -939,11 +1358,15 @@ event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[ #[allow(missing_docs)] pub zkProofId: alloy::sol_types::private::primitives::aliases::U256, #[allow(missing_docs)] + pub coprocessorContextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] pub ctHandles: alloy::sol_types::private::Vec< alloy::sol_types::private::FixedBytes<32>, >, #[allow(missing_docs)] pub signatures: alloy::sol_types::private::Vec, + #[allow(missing_docs)] + pub extraData: alloy::sol_types::private::Bytes, } #[allow( non_camel_case_types, @@ -960,6 +1383,7 @@ event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[ alloy::sol_types::sol_data::FixedBytes<32>, >, alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Bytes, ); type DataToken<'a> = , alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, ); - const SIGNATURE: &'static str = "VerifyProofResponse(uint256,bytes32[],bytes[])"; + const SIGNATURE: &'static str = "VerifyProofResponse(uint256,uint256,bytes32[],bytes[],bytes)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 254u8, 44u8, 67u8, 88u8, 87u8, 134u8, 165u8, 166u8, 88u8, 210u8, 236u8, - 93u8, 245u8, 222u8, 163u8, 251u8, 51u8, 133u8, 183u8, 124u8, 148u8, - 246u8, 15u8, 114u8, 79u8, 248u8, 16u8, 137u8, 111u8, 65u8, 152u8, 53u8, + 249u8, 106u8, 102u8, 187u8, 8u8, 207u8, 84u8, 80u8, 245u8, 120u8, 157u8, + 115u8, 67u8, 250u8, 59u8, 88u8, 212u8, 160u8, 10u8, 102u8, 239u8, 45u8, + 13u8, 4u8, 148u8, 244u8, 36u8, 176u8, 59u8, 10u8, 191u8, 242u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -983,8 +1408,10 @@ event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[ ) -> Self { Self { zkProofId: topics.1, + coprocessorContextId: topics.2, ctHandles: data.0, signatures: data.1, + extraData: data.2, } } #[inline] @@ -1011,11 +1438,18 @@ event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[ as alloy_sol_types::SolType>::tokenize(&self.signatures), + ::tokenize( + &self.extraData, + ), ) } #[inline] fn topics(&self) -> ::RustType { - (Self::SIGNATURE_HASH.into(), self.zkProofId.clone()) + ( + Self::SIGNATURE_HASH.into(), + self.zkProofId.clone(), + self.coprocessorContextId.clone(), + ) } #[inline] fn encode_topics_raw( @@ -1031,6 +1465,11 @@ event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[ out[1usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.zkProofId); + out[2usize] = as alloy_sol_types::EventTopic>::encode_topic( + &self.coprocessorContextId, + ); Ok(()) } } @@ -2790,6 +3229,12 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte #[allow(missing_docs)] CoprocessorAlreadyVerified(CoprocessorAlreadyVerified), #[allow(missing_docs)] + InvalidCoprocessorContextProofRejection(InvalidCoprocessorContextProofRejection), + #[allow(missing_docs)] + InvalidCoprocessorContextProofVerification( + InvalidCoprocessorContextProofVerification, + ), + #[allow(missing_docs)] VerifyProofNotRequested(VerifyProofNotRequested), } #[automatically_derived] @@ -2803,6 +3248,8 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte pub const SELECTORS: &'static [[u8; 4usize]] = &[ [47u8, 167u8, 49u8, 116u8], [71u8, 17u8, 8u8, 63u8], + [192u8, 238u8, 219u8, 123u8], + [243u8, 34u8, 88u8, 147u8], [249u8, 237u8, 67u8, 31u8], ]; } @@ -2810,7 +3257,7 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte impl alloy_sol_types::SolInterface for IInputVerificationErrors { const NAME: &'static str = "IInputVerificationErrors"; const MIN_DATA_LENGTH: usize = 32usize; - const COUNT: usize = 3usize; + const COUNT: usize = 5usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -2820,6 +3267,12 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte Self::CoprocessorAlreadyVerified(_) => { ::SELECTOR } + Self::InvalidCoprocessorContextProofRejection(_) => { + ::SELECTOR + } + Self::InvalidCoprocessorContextProofVerification(_) => { + ::SELECTOR + } Self::VerifyProofNotRequested(_) => { ::SELECTOR } @@ -2864,6 +3317,32 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte } VerifyProofNotRequested }, + { + fn InvalidCoprocessorContextProofVerification( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + IInputVerificationErrors::InvalidCoprocessorContextProofVerification, + ) + } + InvalidCoprocessorContextProofVerification + }, + { + fn InvalidCoprocessorContextProofRejection( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + IInputVerificationErrors::InvalidCoprocessorContextProofRejection, + ) + } + InvalidCoprocessorContextProofRejection + }, { fn CoprocessorAlreadyVerified( data: &[u8], @@ -2917,6 +3396,32 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte } VerifyProofNotRequested }, + { + fn InvalidCoprocessorContextProofVerification( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + IInputVerificationErrors::InvalidCoprocessorContextProofVerification, + ) + } + InvalidCoprocessorContextProofVerification + }, + { + fn InvalidCoprocessorContextProofRejection( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + IInputVerificationErrors::InvalidCoprocessorContextProofRejection, + ) + } + InvalidCoprocessorContextProofRejection + }, { fn CoprocessorAlreadyVerified( data: &[u8], @@ -2952,6 +3457,16 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte inner, ) } + Self::InvalidCoprocessorContextProofRejection(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::InvalidCoprocessorContextProofVerification(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::VerifyProofNotRequested(inner) => { ::abi_encoded_size( inner, @@ -2974,6 +3489,18 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte out, ) } + Self::InvalidCoprocessorContextProofRejection(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::InvalidCoprocessorContextProofVerification(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::VerifyProofNotRequested(inner) => { ::abi_encode_raw( inner, @@ -3003,20 +3530,20 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte /// /// Prefer using `SolInterface` methods instead. pub const SELECTORS: &'static [[u8; 32usize]] = &[ + [ + 111u8, 75u8, 19u8, 118u8, 121u8, 83u8, 108u8, 96u8, 129u8, 199u8, 240u8, + 36u8, 135u8, 3u8, 39u8, 170u8, 137u8, 182u8, 42u8, 100u8, 24u8, 47u8, + 45u8, 65u8, 228u8, 251u8, 222u8, 229u8, 226u8, 36u8, 142u8, 134u8, + ], [ 226u8, 202u8, 250u8, 27u8, 130u8, 67u8, 49u8, 28u8, 8u8, 40u8, 131u8, 60u8, 125u8, 223u8, 147u8, 86u8, 201u8, 42u8, 81u8, 162u8, 36u8, 107u8, 207u8, 104u8, 225u8, 63u8, 34u8, 177u8, 93u8, 239u8, 221u8, 153u8, ], [ - 228u8, 101u8, 225u8, 65u8, 250u8, 138u8, 189u8, 149u8, 171u8, 126u8, 8u8, - 85u8, 84u8, 51u8, 7u8, 248u8, 80u8, 106u8, 176u8, 23u8, 14u8, 246u8, - 100u8, 66u8, 15u8, 183u8, 26u8, 183u8, 222u8, 1u8, 131u8, 222u8, - ], - [ - 254u8, 44u8, 67u8, 88u8, 87u8, 134u8, 165u8, 166u8, 88u8, 210u8, 236u8, - 93u8, 245u8, 222u8, 163u8, 251u8, 51u8, 133u8, 183u8, 124u8, 148u8, - 246u8, 15u8, 114u8, 79u8, 248u8, 16u8, 137u8, 111u8, 65u8, 152u8, 53u8, + 249u8, 106u8, 102u8, 187u8, 8u8, 207u8, 84u8, 80u8, 245u8, 120u8, 157u8, + 115u8, 67u8, 250u8, 59u8, 88u8, 212u8, 160u8, 10u8, 102u8, 239u8, 45u8, + 13u8, 4u8, 148u8, 244u8, 36u8, 176u8, 59u8, 10u8, 191u8, 242u8, ], ]; } diff --git a/gateway-contracts/rust_bindings/src/i_multichain_acl.rs b/gateway-contracts/rust_bindings/src/i_multichain_acl.rs index 9a4c0f38f2..54e796a47c 100644 --- a/gateway-contracts/rust_bindings/src/i_multichain_acl.rs +++ b/gateway-contracts/rust_bindings/src/i_multichain_acl.rs @@ -3,10 +3,14 @@ Generated by the following Solidity interface... ```solidity interface IMultichainACL { + type ContextStatus is uint8; + error ContractsMaxLengthExceeded(uint256 maxLength, uint256 actualLength); error CoprocessorAlreadyAllowedAccount(bytes32 ctHandle, address account, address txSender); error CoprocessorAlreadyAllowedPublicDecrypt(bytes32 ctHandle, address txSender); error EmptyContractAddresses(); + error InvalidCoprocessorContextAllowAccount(bytes32 ctHandle, address accountAddress, uint256 contextId, ContextStatus contextStatus); + error InvalidCoprocessorContextAllowPublicDecrypt(bytes32 ctHandle, uint256 contextId, ContextStatus contextStatus); event AllowAccount(bytes32 indexed ctHandle, address accountAddress); event AllowPublicDecrypt(bytes32 indexed ctHandle); @@ -253,6 +257,53 @@ interface IMultichainACL { "type": "error", "name": "EmptyContractAddresses", "inputs": [] + }, + { + "type": "error", + "name": "InvalidCoprocessorContextAllowAccount", + "inputs": [ + { + "name": "ctHandle", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "accountAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contextStatus", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ] + }, + { + "type": "error", + "name": "InvalidCoprocessorContextAllowPublicDecrypt", + "inputs": [ + { + "name": "ctHandle", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contextStatus", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ] } ] ```*/ @@ -288,6 +339,144 @@ pub mod IMultichainACL { ); #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextStatus(u8); + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::private::SolTypeValue for u8 { + #[inline] + fn stv_to_tokens( + &self, + ) -> as alloy_sol_types::SolType>::Token<'_> { + alloy_sol_types::private::SolTypeValue::< + alloy::sol_types::sol_data::Uint<8>, + >::stv_to_tokens(self) + } + #[inline] + fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { + as alloy_sol_types::SolType>::tokenize(self) + .0 + } + #[inline] + fn stv_abi_encode_packed_to( + &self, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::SolType>::abi_encode_packed_to(self, out) + } + #[inline] + fn stv_abi_packed_encoded_size(&self) -> usize { + as alloy_sol_types::SolType>::abi_encoded_size(self) + } + } + #[automatically_derived] + impl ContextStatus { + /// The Solidity type name. + pub const NAME: &'static str = stringify!(@ name); + /// Convert from the underlying value type. + #[inline] + pub const fn from_underlying(value: u8) -> Self { + Self(value) + } + /// Return the underlying value. + #[inline] + pub const fn into_underlying(self) -> u8 { + self.0 + } + /// Return the single encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode(&self) -> alloy_sol_types::private::Vec { + ::abi_encode(&self.0) + } + /// Return the packed encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode_packed(&self) -> alloy_sol_types::private::Vec { + ::abi_encode_packed(&self.0) + } + } + #[automatically_derived] + impl From for ContextStatus { + fn from(value: u8) -> Self { + Self::from_underlying(value) + } + } + #[automatically_derived] + impl From for u8 { + fn from(value: ContextStatus) -> Self { + value.into_underlying() + } + } + #[automatically_derived] + impl alloy_sol_types::SolType for ContextStatus { + type RustType = u8; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SOL_NAME: &'static str = Self::NAME; + const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; + const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; + #[inline] + fn valid_token(token: &Self::Token<'_>) -> bool { + Self::type_check(token).is_ok() + } + #[inline] + fn type_check(token: &Self::Token<'_>) -> alloy_sol_types::Result<()> { + as alloy_sol_types::SolType>::type_check(token) + } + #[inline] + fn detokenize(token: Self::Token<'_>) -> Self::RustType { + as alloy_sol_types::SolType>::detokenize(token) + } + } + #[automatically_derived] + impl alloy_sol_types::EventTopic for ContextStatus { + #[inline] + fn topic_preimage_length(rust: &Self::RustType) -> usize { + as alloy_sol_types::EventTopic>::topic_preimage_length(rust) + } + #[inline] + fn encode_topic_preimage( + rust: &Self::RustType, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::EventTopic>::encode_topic_preimage(rust, out) + } + #[inline] + fn encode_topic( + rust: &Self::RustType, + ) -> alloy_sol_types::abi::token::WordToken { + as alloy_sol_types::EventTopic>::encode_topic(rust) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Custom error with signature `ContractsMaxLengthExceeded(uint256,uint256)` and selector `0xa7db2751`. ```solidity error ContractsMaxLengthExceeded(uint256 maxLength, uint256 actualLength); @@ -657,6 +846,227 @@ error EmptyContractAddresses(); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InvalidCoprocessorContextAllowAccount(bytes32,address,uint256,uint8)` and selector `0x13c95d8d`. +```solidity +error InvalidCoprocessorContextAllowAccount(bytes32 ctHandle, address accountAddress, uint256 contextId, ContextStatus contextStatus); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidCoprocessorContextAllowAccount { + #[allow(missing_docs)] + pub ctHandle: alloy::sol_types::private::FixedBytes<32>, + #[allow(missing_docs)] + pub accountAddress: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub contextStatus: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::FixedBytes<32>, + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<256>, + ContextStatus, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::FixedBytes<32>, + alloy::sol_types::private::Address, + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: InvalidCoprocessorContextAllowAccount) -> Self { + ( + value.ctHandle, + value.accountAddress, + value.contextId, + value.contextStatus, + ) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for InvalidCoprocessorContextAllowAccount { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + ctHandle: tuple.0, + accountAddress: tuple.1, + contextId: tuple.2, + contextStatus: tuple.3, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InvalidCoprocessorContextAllowAccount { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InvalidCoprocessorContextAllowAccount(bytes32,address,uint256,uint8)"; + const SELECTOR: [u8; 4] = [19u8, 201u8, 93u8, 141u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.ctHandle), + ::tokenize( + &self.accountAddress, + ), + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.contextStatus, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InvalidCoprocessorContextAllowPublicDecrypt(bytes32,uint256,uint8)` and selector `0xaa7a2a97`. +```solidity +error InvalidCoprocessorContextAllowPublicDecrypt(bytes32 ctHandle, uint256 contextId, ContextStatus contextStatus); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidCoprocessorContextAllowPublicDecrypt { + #[allow(missing_docs)] + pub ctHandle: alloy::sol_types::private::FixedBytes<32>, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub contextStatus: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::FixedBytes<32>, + alloy::sol_types::sol_data::Uint<256>, + ContextStatus, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::FixedBytes<32>, + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: InvalidCoprocessorContextAllowPublicDecrypt) -> Self { + (value.ctHandle, value.contextId, value.contextStatus) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for InvalidCoprocessorContextAllowPublicDecrypt { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + ctHandle: tuple.0, + contextId: tuple.1, + contextStatus: tuple.2, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InvalidCoprocessorContextAllowPublicDecrypt { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InvalidCoprocessorContextAllowPublicDecrypt(bytes32,uint256,uint8)"; + const SELECTOR: [u8; 4] = [170u8, 122u8, 42u8, 151u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.ctHandle), + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.contextStatus, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Event with signature `AllowAccount(bytes32,address)` and selector `0x18f825f318ffa4ed5bf3f6ed24fd54d33378b0e9f16ddb37c3419691b2e16566`. ```solidity event AllowAccount(bytes32 indexed ctHandle, address accountAddress); @@ -2392,6 +2802,12 @@ function isPublicDecryptAllowed(bytes32 ctHandle) external view returns (bool); CoprocessorAlreadyAllowedPublicDecrypt(CoprocessorAlreadyAllowedPublicDecrypt), #[allow(missing_docs)] EmptyContractAddresses(EmptyContractAddresses), + #[allow(missing_docs)] + InvalidCoprocessorContextAllowAccount(InvalidCoprocessorContextAllowAccount), + #[allow(missing_docs)] + InvalidCoprocessorContextAllowPublicDecrypt( + InvalidCoprocessorContextAllowPublicDecrypt, + ), } #[automatically_derived] impl IMultichainACLErrors { @@ -2402,17 +2818,19 @@ function isPublicDecryptAllowed(bytes32 ctHandle) external view returns (bool); /// /// Prefer using `SolInterface` methods instead. pub const SELECTORS: &'static [[u8; 4usize]] = &[ + [19u8, 201u8, 93u8, 141u8], [87u8, 207u8, 162u8, 23u8], [102u8, 55u8, 227u8, 45u8], [166u8, 240u8, 77u8, 38u8], [167u8, 219u8, 39u8, 81u8], + [170u8, 122u8, 42u8, 151u8], ]; } #[automatically_derived] impl alloy_sol_types::SolInterface for IMultichainACLErrors { const NAME: &'static str = "IMultichainACLErrors"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 4usize; + const COUNT: usize = 6usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -2428,6 +2846,12 @@ function isPublicDecryptAllowed(bytes32 ctHandle) external view returns (bool); Self::EmptyContractAddresses(_) => { ::SELECTOR } + Self::InvalidCoprocessorContextAllowAccount(_) => { + ::SELECTOR + } + Self::InvalidCoprocessorContextAllowPublicDecrypt(_) => { + ::SELECTOR + } } } #[inline] @@ -2447,6 +2871,19 @@ function isPublicDecryptAllowed(bytes32 ctHandle) external view returns (bool); static DECODE_SHIMS: &[fn( &[u8], ) -> alloy_sol_types::Result] = &[ + { + fn InvalidCoprocessorContextAllowAccount( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + IMultichainACLErrors::InvalidCoprocessorContextAllowAccount, + ) + } + InvalidCoprocessorContextAllowAccount + }, { fn EmptyContractAddresses( data: &[u8], @@ -2493,6 +2930,19 @@ function isPublicDecryptAllowed(bytes32 ctHandle) external view returns (bool); } ContractsMaxLengthExceeded }, + { + fn InvalidCoprocessorContextAllowPublicDecrypt( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + IMultichainACLErrors::InvalidCoprocessorContextAllowPublicDecrypt, + ) + } + InvalidCoprocessorContextAllowPublicDecrypt + }, ]; let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { return Err( @@ -2513,6 +2963,19 @@ function isPublicDecryptAllowed(bytes32 ctHandle) external view returns (bool); static DECODE_VALIDATE_SHIMS: &[fn( &[u8], ) -> alloy_sol_types::Result] = &[ + { + fn InvalidCoprocessorContextAllowAccount( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + IMultichainACLErrors::InvalidCoprocessorContextAllowAccount, + ) + } + InvalidCoprocessorContextAllowAccount + }, { fn EmptyContractAddresses( data: &[u8], @@ -2559,6 +3022,19 @@ function isPublicDecryptAllowed(bytes32 ctHandle) external view returns (bool); } ContractsMaxLengthExceeded }, + { + fn InvalidCoprocessorContextAllowPublicDecrypt( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + IMultichainACLErrors::InvalidCoprocessorContextAllowPublicDecrypt, + ) + } + InvalidCoprocessorContextAllowPublicDecrypt + }, ]; let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { return Err( @@ -2593,6 +3069,16 @@ function isPublicDecryptAllowed(bytes32 ctHandle) external view returns (bool); inner, ) } + Self::InvalidCoprocessorContextAllowAccount(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::InvalidCoprocessorContextAllowPublicDecrypt(inner) => { + ::abi_encoded_size( + inner, + ) + } } } #[inline] @@ -2622,6 +3108,18 @@ function isPublicDecryptAllowed(bytes32 ctHandle) external view returns (bool); out, ) } + Self::InvalidCoprocessorContextAllowAccount(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::InvalidCoprocessorContextAllowPublicDecrypt(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } } } } diff --git a/gateway-contracts/rust_bindings/src/input_verification.rs b/gateway-contracts/rust_bindings/src/input_verification.rs index 61a29f00a7..1749751133 100644 --- a/gateway-contracts/rust_bindings/src/input_verification.rs +++ b/gateway-contracts/rust_bindings/src/input_verification.rs @@ -3,6 +3,8 @@ Generated by the following Solidity interface... ```solidity interface InputVerification { + type ContextStatus is uint8; + error AddressEmptyCode(address target); error CoprocessorAlreadyRejected(uint256 zkProofId, address txSender, address signer); error CoprocessorAlreadyVerified(uint256 zkProofId, address txSender, address signer); @@ -15,9 +17,11 @@ interface InputVerification { error ExpectedPause(); error FailedCall(); error HostChainNotRegistered(uint256 chainId); + error InvalidCoprocessorContextProofRejection(uint256 zkProofId, uint256 contextId, ContextStatus contextStatus); + error InvalidCoprocessorContextProofVerification(uint256 zkProofId, uint256 contextId, ContextStatus contextStatus); error InvalidInitialization(); - error NotCoprocessorSigner(address signerAddress); - error NotCoprocessorTxSender(address txSenderAddress); + error NotCoprocessorSignerFromContext(uint256 contextId, address signerAddress); + error NotCoprocessorTxSenderFromContext(uint256 contextId, address txSenderAddress); error NotCustodianSigner(address signerAddress); error NotCustodianTxSender(address txSenderAddress); error NotGatewayOwner(address sender); @@ -34,11 +38,11 @@ interface InputVerification { event EIP712DomainChanged(); event Initialized(uint64 version); event Paused(address account); - event RejectProofResponse(uint256 indexed zkProofId); + event RejectProofResponse(uint256 indexed zkProofId, bytes extraData); event Unpaused(address account); event Upgraded(address indexed implementation); event VerifyProofRequest(uint256 indexed zkProofId, uint256 indexed coprocessorContextId, uint256 indexed contractChainId, address contractAddress, address userAddress, bytes ciphertextWithZKProof, bytes extraData); - event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[] signatures); + event VerifyProofResponse(uint256 indexed zkProofId, uint256 indexed coprocessorContextId, bytes32[] ctHandles, bytes[] signatures, bytes extraData); constructor(); @@ -53,7 +57,8 @@ interface InputVerification { function pause() external; function paused() external view returns (bool); function proxiableUUID() external view returns (bytes32); - function rejectProofResponse(uint256 zkProofId, bytes memory) external; + function reinitializeV2() external; + function rejectProofResponse(uint256 zkProofId, bytes memory extraData) external; function unpause() external; function upgradeToAndCall(address newImplementation, bytes memory data) external payable; function verifyProofRequest(uint256 contractChainId, address contractAddress, address userAddress, bytes memory ciphertextWithZKProof, bytes memory extraData) external; @@ -254,6 +259,13 @@ interface InputVerification { ], "stateMutability": "view" }, + { + "type": "function", + "name": "reinitializeV2", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "rejectProofResponse", @@ -264,7 +276,7 @@ interface InputVerification { "internalType": "uint256" }, { - "name": "", + "name": "extraData", "type": "bytes", "internalType": "bytes" } @@ -399,6 +411,12 @@ interface InputVerification { "type": "uint256", "indexed": true, "internalType": "uint256" + }, + { + "name": "extraData", + "type": "bytes", + "indexed": false, + "internalType": "bytes" } ], "anonymous": false @@ -488,6 +506,12 @@ interface InputVerification { "indexed": true, "internalType": "uint256" }, + { + "name": "coprocessorContextId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, { "name": "ctHandles", "type": "bytes32[]", @@ -499,6 +523,12 @@ interface InputVerification { "type": "bytes[]", "indexed": false, "internalType": "bytes[]" + }, + { + "name": "extraData", + "type": "bytes", + "indexed": false, + "internalType": "bytes" } ], "anonymous": false @@ -625,6 +655,48 @@ interface InputVerification { } ] }, + { + "type": "error", + "name": "InvalidCoprocessorContextProofRejection", + "inputs": [ + { + "name": "zkProofId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contextStatus", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ] + }, + { + "type": "error", + "name": "InvalidCoprocessorContextProofVerification", + "inputs": [ + { + "name": "zkProofId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contextStatus", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ] + }, { "type": "error", "name": "InvalidInitialization", @@ -632,8 +704,13 @@ interface InputVerification { }, { "type": "error", - "name": "NotCoprocessorSigner", + "name": "NotCoprocessorSignerFromContext", "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, { "name": "signerAddress", "type": "address", @@ -643,8 +720,13 @@ interface InputVerification { }, { "type": "error", - "name": "NotCoprocessorTxSender", + "name": "NotCoprocessorTxSenderFromContext", "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, { "name": "txSenderAddress", "type": "address", @@ -781,25 +863,163 @@ pub mod InputVerification { /// The creation / init bytecode of the contract. /// /// ```text - ///0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000043575f80fd5b50620000546200005a60201b60201c565b620001c4565b5f6200006b6200015e60201b60201c565b9050805f0160089054906101000a900460ff1615620000b6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146200015b5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051620001529190620001a9565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b620001a38162000185565b82525050565b5f602082019050620001be5f83018462000198565b92915050565b608051614364620001eb5f395f8181611ca401528181611cf90152611f9b01526143645ff3fe6080604052600436106100f2575f3560e01c806352d1902d11610089578063a700499611610058578063a7004996146102ca578063ad3cb1cc146102f2578063ce7e42571461031c578063e96f88ea14610358576100f2565b806352d1902d146102305780635c975abb1461025a5780638456cb591461028457806384b0196e1461029a576100f2565b8063338007fc116100c5578063338007fc146101c057806339f73810146101e85780633f4ba83a146101fe5780634f1ef28614610214576100f2565b80630c615839146100f65780630d8e6e2c146101325780631bbe9fae1461015c57806331bedea314610198575b5f80fd5b348015610101575f80fd5b5061011c60048036038101906101179190612c8e565b610394565b6040516101299190612cd3565b60405180910390f35b34801561013d575f80fd5b506101466103c8565b6040516101539190612d76565b60405180910390f35b348015610167575f80fd5b50610182600480360381019061017d9190612c8e565b610443565b60405161018f9190612e7d565b60405180910390f35b3480156101a3575f80fd5b506101be60048036038101906101b99190612f53565b6104ed565b005b3480156101cb575f80fd5b506101e660048036038101906101e19190613017565b610a4e565b005b3480156101f3575f80fd5b506101fc610dc7565b005b348015610209575f80fd5b50610212610fb3565b005b61022e600480360381019061022991906131c6565b6110fb565b005b34801561023b575f80fd5b5061024461111a565b6040516102519190613238565b60405180910390f35b348015610265575f80fd5b5061026e61114b565b60405161027b9190612cd3565b60405180910390f35b34801561028f575f80fd5b5061029861116d565b005b3480156102a5575f80fd5b506102ae611292565b6040516102c19796959493929190613360565b60405180910390f35b3480156102d5575f80fd5b506102f060048036038101906102eb91906133e2565b61139b565b005b3480156102fd575f80fd5b506103066115f5565b6040516103139190612d76565b60405180910390f35b348015610327575f80fd5b50610342600480360381019061033d9190612c8e565b61162e565b60405161034f9190612e7d565b60405180910390f35b348015610363575f80fd5b5061037e60048036038101906103799190612c8e565b6116ff565b60405161038b9190612cd3565b60405180910390f35b5f8061039e611733565b9050806007015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b60606040518060400160405280601181526020017f496e707574566572696669636174696f6e0000000000000000000000000000008152506104095f61175a565b610413600161175a565b61041c5f61175a565b60405160200161042f9493929190613567565b604051602081830303815290604052905090565b60605f61044e611733565b905080600a015f8481526020019081526020015f208054806020026020016040519081016040528092919081815260200182805480156104e057602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610497575b5050505050915050919050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16632dd3edfe336040518263ffffffff1660e01b815260040161053a91906135c5565b602060405180830381865afa158015610555573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105799190613608565b6105ba57336040517f52d725f50000000000000000000000000000000000000000000000000000000081526004016105b191906135c5565b60405180910390fd5b5f6105c3611733565b9050805f01548811806105d557505f88145b1561061757876040517f4711083f00000000000000000000000000000000000000000000000000000000815260040161060e9190613633565b60405180910390fd5b5f816001015f8a81526020019081526020015f206040518060600160405290815f8201548152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090505f6040518060a001604052808a8a808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508152602001836040015173ffffffffffffffffffffffffffffffffffffffff168152602001836020015173ffffffffffffffffffffffffffffffffffffffff168152602001835f0151815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081525090505f6107d982611824565b90505f610829828a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506118e3565b90506108348161190d565b61083f8c33836119dd565b5f856002015f8e81526020019081526020015f205f8481526020019081526020015f209050808a8a90918060018154018082558091505060019003905f5260205f20015f90919290919290919290919250918261089d929190613850565b506001866005015f8f81526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550856003015f8e81526020019081526020015f205f8481526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550856004015f8e81526020019081526020015f205f9054906101000a900460ff161580156109ba57506109b98180549050611b30565b5b15610a3f576001866004015f8f81526020019081526020015f205f6101000a81548160ff02191690831515021790555082866006015f8f81526020019081526020015f20819055508c7ffe2c43585786a5a658d2ec5df5dea3fb3385b77c94f60f724ff810896f4198358d8d84604051610a3693929190613ae3565b60405180910390a25b50505050505050505050505050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16632dd3edfe336040518263ffffffff1660e01b8152600401610a9b91906135c5565b602060405180830381865afa158015610ab6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ada9190613608565b610b1b57336040517f52d725f5000000000000000000000000000000000000000000000000000000008152600401610b1291906135c5565b60405180910390fd5b5f610b24611733565b9050805f0154841180610b3657505f84145b15610b7857836040517f4711083f000000000000000000000000000000000000000000000000000000008152600401610b6f9190613633565b60405180910390fd5b5f73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663ef6997f9336040518263ffffffff1660e01b8152600401610bc691906135c5565b5f60405180830381865afa158015610be0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c089190613c51565b90505f81602001519050610c1d8633836119dd565b826008015f8781526020019081526020015f205f815480929190610c4090613cc5565b91905055506001836009015f8881526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555082600a015f8781526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826007015f8781526020019081526020015f205f9054906101000a900460ff16158015610d615750610d60836008015f8881526020019081526020015f2054611b30565b5b15610dbf576001836007015f8881526020019081526020015f205f6101000a81548160ff021916908315150217905550857fe465e141fa8abd95ab7e0855543307f8506ab0170ef664420fb71ab7de0183de60405160405180910390a25b505050505050565b6001610dd1611bc1565b67ffffffffffffffff1614610e12576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f610e1d611be5565b9050805f0160089054906101000a900460ff1680610e6557508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15610e9c576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff021916908315150217905550610f556040518060400160405280601181526020017f496e707574566572696669636174696f6e0000000000000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611c0c565b610f5d611c22565b5f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d282604051610fa79190613d2e565b60405180910390a15050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611010573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110349190613d47565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156110af575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156110f157336040517fe19166ee0000000000000000000000000000000000000000000000000000000081526004016110e891906135c5565b60405180910390fd5b6110f9611c34565b565b611103611ca2565b61110c82611d88565b6111168282611e7b565b5050565b5f611123611f99565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f80611155612020565b9050805f015f9054906101000a900460ff1691505090565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016111ba91906135c5565b602060405180830381865afa1580156111d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f99190613608565b158015611246575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561128857336040517f388916bb00000000000000000000000000000000000000000000000000000000815260040161127f91906135c5565b60405180910390fd5b611290612047565b565b5f6060805f805f60605f6112a46120b6565b90505f801b815f01541480156112bf57505f801b8160010154145b6112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590613dbc565b60405180910390fd5b6113066120dd565b61130e61217b565b46305f801b5f67ffffffffffffffff81111561132d5761132c6130a2565b5b60405190808252806020026020018201604052801561135b5781602001602082028036833780820191505090505b507f0f0000000000000000000000000000000000000000000000000000000000000095949392919097509750975097509750975097505090919293949596565b8673a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663bff3aaba826040518263ffffffff1660e01b81526004016113e99190613633565b602060405180830381865afa158015611404573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114289190613608565b61146957806040517fb6679c3b0000000000000000000000000000000000000000000000000000000081526004016114609190613633565b60405180910390fd5b611471612219565b5f61147a611733565b9050805f015f81548092919061148f90613cc5565b91905055505f815f0154905060405180606001604052808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff16815250826001015f8381526020019081526020015f205f820151815f01556020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600182600b015f8381526020019081526020015f2081905550895f827fe2cafa1b8243311c0828833c7ddf9356c92a51a2246bcf68e13f22b15defdd998c8c8c8c8c8c6040516115e196959493929190613e16565b60405180910390a450505050505050505050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60605f611639611733565b90505f816006015f8581526020019081526020015f20549050816003015f8581526020019081526020015f205f8281526020019081526020015f208054806020026020016040519081016040528092919081815260200182805480156116f157602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116116a8575b505050505092505050919050565b5f80611709611733565b9050806004015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b5f7f4544165ce1653264fdcb09b029891e3d4c8d8583486821172f882e19a149a800905090565b60605f60016117688461225a565b0190505f8167ffffffffffffffff811115611786576117856130a2565b5b6040519080825280601f01601f1916602001820160405280156117b85781602001600182028036833780820191505090505b5090505f82602001820190505b600115611819578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161180e5761180d613e6b565b5b0494505f85036117c5575b819350505050919050565b5f6118dc6040518060a00160405280607f81526020016142e5607f913980519060200120835f015160405160200161185c9190613f49565b6040516020818303038152906040528051906020012084602001518560400151866060015187608001516040516020016118969190613fa3565b604051602081830303815290604052805190602001206040516020016118c196959493929190613fb9565b604051602081830303815290604052805190602001206123ab565b9050919050565b5f805f806118f186866123c4565b9250925092506119018282612419565b82935050505092915050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16632b101c03826040518263ffffffff1660e01b815260040161195a91906135c5565b602060405180830381865afa158015611975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119999190613608565b6119da57806040517f26cd75dc0000000000000000000000000000000000000000000000000000000081526004016119d191906135c5565b60405180910390fd5b50565b5f6119e6611733565b9050806005015f8581526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611a89578383836040517ff9ed431f000000000000000000000000000000000000000000000000000000008152600401611a8093929190614018565b60405180910390fd5b806009015f8581526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611b2a578383836040517f2fa73174000000000000000000000000000000000000000000000000000000008152600401611b2193929190614018565b60405180910390fd5b50505050565b5f8073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16636799ef526040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bb39190614061565b905080831015915050919050565b5f611bca611be5565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b611c1461257b565b611c1e82826125bb565b5050565b611c2a61257b565b611c3261260c565b565b611c3c61263c565b5f611c45612020565b90505f815f015f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c8a61267c565b604051611c9791906135c5565b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480611d4f57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611d36612683565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611d86576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611de5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e099190613d47565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e7857336040517f0e56cf3d000000000000000000000000000000000000000000000000000000008152600401611e6f91906135c5565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ee357506040513d601f19601f82011682018060405250810190611ee091906140b6565b60015b611f2457816040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401611f1b91906135c5565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114611f8a57806040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600401611f819190613238565b60405180910390fd5b611f9483836126d6565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161461201e576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b61204f612219565b5f612058612020565b90506001815f015f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861209e61267c565b6040516120ab91906135c5565b60405180910390a150565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100905090565b60605f6120e86120b6565b90508060020180546120f990613683565b80601f016020809104026020016040519081016040528092919081815260200182805461212590613683565b80156121705780601f1061214757610100808354040283529160200191612170565b820191905f5260205f20905b81548152906001019060200180831161215357829003601f168201915b505050505091505090565b60605f6121866120b6565b905080600301805461219790613683565b80601f01602080910402602001604051908101604052809291908181526020018280546121c390613683565b801561220e5780601f106121e55761010080835404028352916020019161220e565b820191905f5260205f20905b8154815290600101906020018083116121f157829003601f168201915b505050505091505090565b61222161114b565b15612258576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106122b6577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816122ac576122ab613e6b565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106122f3576d04ee2d6d415b85acef810000000083816122e9576122e8613e6b565b5b0492506020810190505b662386f26fc10000831061232257662386f26fc10000838161231857612317613e6b565b5b0492506010810190505b6305f5e100831061234b576305f5e100838161234157612340613e6b565b5b0492506008810190505b612710831061237057612710838161236657612365613e6b565b5b0492506004810190505b60648310612393576064838161238957612388613e6b565b5b0492506002810190505b600a83106123a2576001810190505b80915050919050565b5f6123bd6123b7612748565b83612756565b9050919050565b5f805f6041845103612404575f805f602087015192506040870151915060608701515f1a90506123f688828585612796565b955095509550505050612412565b5f600285515f1b9250925092505b9250925092565b5f600381111561242c5761242b6140e1565b5b82600381111561243f5761243e6140e1565b5b03156125775760016003811115612459576124586140e1565b5b82600381111561246c5761246b6140e1565b5b036124a3576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260038111156124b7576124b66140e1565b5b8260038111156124ca576124c96140e1565b5b0361250e57805f1c6040517ffce698f70000000000000000000000000000000000000000000000000000000081526004016125059190613633565b60405180910390fd5b600380811115612521576125206140e1565b5b826003811115612534576125336140e1565b5b0361257657806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161256d9190613238565b60405180910390fd5b5b5050565b61258361287d565b6125b9576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6125c361257b565b5f6125cc6120b6565b9050828160020190816125df9190614166565b50818160030190816125f19190614166565b505f801b815f01819055505f801b8160010181905550505050565b61261461257b565b5f61261d612020565b90505f815f015f6101000a81548160ff02191690831515021790555050565b61264461114b565b61267a576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f33905090565b5f6126af7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61289b565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6126df826128a4565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f8151111561273b57612735828261296d565b50612744565b6127436129ed565b5b5050565b5f612751612a29565b905090565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c11156127d2575f600385925092509250612873565b5f6001888888886040515f81526020016040526040516127f59493929190614250565b6020604051602081039080840390855afa158015612815573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612866575f60015f801b93509350935050612873565b805f805f1b935093509350505b9450945094915050565b5f612886611be5565b5f0160089054906101000a900460ff16905090565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b036128ff57806040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016128f691906135c5565b60405180910390fd5b8061292b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61289b565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040516129969190613fa3565b5f60405180830381855af49150503d805f81146129ce576040519150601f19603f3d011682016040523d82523d5f602084013e6129d3565b606091505b50915091506129e3858383612a8c565b9250505092915050565b5f341115612a27576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f612a53612b19565b612a5b612b8f565b4630604051602001612a71959493929190614293565b60405160208183030381529060405280519060200120905090565b606082612aa157612a9c82612c06565b612b11565b5f8251148015612ac757505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15612b0957836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401612b0091906135c5565b60405180910390fd5b819050612b12565b5b9392505050565b5f80612b236120b6565b90505f612b2e6120dd565b90505f81511115612b4a57808051906020012092505050612b8c565b5f825f015490505f801b8114612b6557809350505050612b8c565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f80612b996120b6565b90505f612ba461217b565b90505f81511115612bc057808051906020012092505050612c03565b5f826001015490505f801b8114612bdc57809350505050612c03565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f81511115612c185780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b612c6d81612c5b565b8114612c77575f80fd5b50565b5f81359050612c8881612c64565b92915050565b5f60208284031215612ca357612ca2612c53565b5b5f612cb084828501612c7a565b91505092915050565b5f8115159050919050565b612ccd81612cb9565b82525050565b5f602082019050612ce65f830184612cc4565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612d23578082015181840152602081019050612d08565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612d4882612cec565b612d528185612cf6565b9350612d62818560208601612d06565b612d6b81612d2e565b840191505092915050565b5f6020820190508181035f830152612d8e8184612d3e565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612de882612dbf565b9050919050565b612df881612dde565b82525050565b5f612e098383612def565b60208301905092915050565b5f602082019050919050565b5f612e2b82612d96565b612e358185612da0565b9350612e4083612db0565b805f5b83811015612e70578151612e578882612dfe565b9750612e6283612e15565b925050600181019050612e43565b5085935050505092915050565b5f6020820190508181035f830152612e958184612e21565b905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112612ebe57612ebd612e9d565b5b8235905067ffffffffffffffff811115612edb57612eda612ea1565b5b602083019150836020820283011115612ef757612ef6612ea5565b5b9250929050565b5f8083601f840112612f1357612f12612e9d565b5b8235905067ffffffffffffffff811115612f3057612f2f612ea1565b5b602083019150836001820283011115612f4c57612f4b612ea5565b5b9250929050565b5f805f805f805f6080888a031215612f6e57612f6d612c53565b5b5f612f7b8a828b01612c7a565b975050602088013567ffffffffffffffff811115612f9c57612f9b612c57565b5b612fa88a828b01612ea9565b9650965050604088013567ffffffffffffffff811115612fcb57612fca612c57565b5b612fd78a828b01612efe565b9450945050606088013567ffffffffffffffff811115612ffa57612ff9612c57565b5b6130068a828b01612efe565b925092505092959891949750929550565b5f805f6040848603121561302e5761302d612c53565b5b5f61303b86828701612c7a565b935050602084013567ffffffffffffffff81111561305c5761305b612c57565b5b61306886828701612efe565b92509250509250925092565b61307d81612dde565b8114613087575f80fd5b50565b5f8135905061309881613074565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6130d882612d2e565b810181811067ffffffffffffffff821117156130f7576130f66130a2565b5b80604052505050565b5f613109612c4a565b905061311582826130cf565b919050565b5f67ffffffffffffffff821115613134576131336130a2565b5b61313d82612d2e565b9050602081019050919050565b828183375f83830152505050565b5f61316a6131658461311a565b613100565b9050828152602081018484840111156131865761318561309e565b5b61319184828561314a565b509392505050565b5f82601f8301126131ad576131ac612e9d565b5b81356131bd848260208601613158565b91505092915050565b5f80604083850312156131dc576131db612c53565b5b5f6131e98582860161308a565b925050602083013567ffffffffffffffff81111561320a57613209612c57565b5b61321685828601613199565b9150509250929050565b5f819050919050565b61323281613220565b82525050565b5f60208201905061324b5f830184613229565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b61328581613251565b82525050565b61329481612c5b565b82525050565b6132a381612dde565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6132db81612c5b565b82525050565b5f6132ec83836132d2565b60208301905092915050565b5f602082019050919050565b5f61330e826132a9565b61331881856132b3565b9350613323836132c3565b805f5b8381101561335357815161333a88826132e1565b9750613345836132f8565b925050600181019050613326565b5085935050505092915050565b5f60e0820190506133735f83018a61327c565b81810360208301526133858189612d3e565b905081810360408301526133998188612d3e565b90506133a8606083018761328b565b6133b5608083018661329a565b6133c260a0830185613229565b81810360c08301526133d48184613304565b905098975050505050505050565b5f805f805f805f60a0888a0312156133fd576133fc612c53565b5b5f61340a8a828b01612c7a565b975050602061341b8a828b0161308a565b965050604061342c8a828b0161308a565b955050606088013567ffffffffffffffff81111561344d5761344c612c57565b5b6134598a828b01612efe565b9450945050608088013567ffffffffffffffff81111561347c5761347b612c57565b5b6134888a828b01612efe565b925092505092959891949750929550565b5f81905092915050565b5f6134ad82612cec565b6134b78185613499565b93506134c7818560208601612d06565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f613507600283613499565b9150613512826134d3565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f613551600183613499565b915061355c8261351d565b600182019050919050565b5f61357282876134a3565b915061357d826134fb565b915061358982866134a3565b915061359482613545565b91506135a082856134a3565b91506135ab82613545565b91506135b782846134a3565b915081905095945050505050565b5f6020820190506135d85f83018461329a565b92915050565b6135e781612cb9565b81146135f1575f80fd5b50565b5f81519050613602816135de565b92915050565b5f6020828403121561361d5761361c612c53565b5b5f61362a848285016135f4565b91505092915050565b5f6020820190506136465f83018461328b565b92915050565b5f82905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061369a57607f821691505b6020821081036136ad576136ac613656565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261370f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826136d4565b61371986836136d4565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61375461374f61374a84612c5b565b613731565b612c5b565b9050919050565b5f819050919050565b61376d8361373a565b6137816137798261375b565b8484546136e0565b825550505050565b5f90565b613795613789565b6137a0818484613764565b505050565b5b818110156137c3576137b85f8261378d565b6001810190506137a6565b5050565b601f821115613808576137d9816136b3565b6137e2846136c5565b810160208510156137f1578190505b6138056137fd856136c5565b8301826137a5565b50505b505050565b5f82821c905092915050565b5f6138285f198460080261380d565b1980831691505092915050565b5f6138408383613819565b9150826002028217905092915050565b61385a838361364c565b67ffffffffffffffff811115613873576138726130a2565b5b61387d8254613683565b6138888282856137c7565b5f601f8311600181146138b5575f84156138a3578287013590505b6138ad8582613835565b865550613914565b601f1984166138c3866136b3565b5f5b828110156138ea578489013582556001820191506020850194506020810190506138c5565b868310156139075784890135613903601f891682613819565b8355505b6001600288020188555050505b50505050505050565b5f82825260208201905092915050565b5f80fd5b82818337505050565b5f613945838561391d565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156139785761397761392d565b5b602083029250613989838584613931565b82840190509392505050565b5f81549050919050565b5f82825260208201905092915050565b5f819050815f5260205f209050919050565b5f82825260208201905092915050565b5f81546139dd81613683565b6139e781866139c1565b9450600182165f8114613a015760018114613a1757613a49565b60ff198316865281151560200286019350613a49565b613a20856136b3565b5f5b83811015613a4157815481890152600182019150602081019050613a22565b808801955050505b50505092915050565b5f613a5d83836139d1565b905092915050565b5f600182019050919050565b5f613a7b82613995565b613a85818561399f565b935083602082028501613a97856139af565b805f5b85811015613ad157848403895281613ab28582613a52565b9450613abd83613a65565b925060208a01995050600181019050613a9a565b50829750879550505050505092915050565b5f6040820190508181035f830152613afc81858761393a565b90508181036020830152613b108184613a71565b9050949350505050565b5f80fd5b5f80fd5b5f81519050613b3081613074565b92915050565b5f67ffffffffffffffff821115613b5057613b4f6130a2565b5b613b5982612d2e565b9050602081019050919050565b5f613b78613b7384613b36565b613100565b905082815260208101848484011115613b9457613b9361309e565b5b613b9f848285612d06565b509392505050565b5f82601f830112613bbb57613bba612e9d565b5b8151613bcb848260208601613b66565b91505092915050565b5f60608284031215613be957613be8613b1a565b5b613bf36060613100565b90505f613c0284828501613b22565b5f830152506020613c1584828501613b22565b602083015250604082015167ffffffffffffffff811115613c3957613c38613b1e565b5b613c4584828501613ba7565b60408301525092915050565b5f60208284031215613c6657613c65612c53565b5b5f82015167ffffffffffffffff811115613c8357613c82612c57565b5b613c8f84828501613bd4565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613ccf82612c5b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d0157613d00613c98565b5b600182019050919050565b5f67ffffffffffffffff82169050919050565b613d2881613d0c565b82525050565b5f602082019050613d415f830184613d1f565b92915050565b5f60208284031215613d5c57613d5b612c53565b5b5f613d6984828501613b22565b91505092915050565b7f4549503731323a20556e696e697469616c697a656400000000000000000000005f82015250565b5f613da6601583612cf6565b9150613db182613d72565b602082019050919050565b5f6020820190508181035f830152613dd381613d9a565b9050919050565b5f82825260208201905092915050565b5f613df58385613dda565b9350613e0283858461314a565b613e0b83612d2e565b840190509392505050565b5f608082019050613e295f83018961329a565b613e36602083018861329a565b8181036040830152613e49818688613dea565b90508181036060830152613e5e818486613dea565b9050979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81519050919050565b5f81905092915050565b5f819050602082019050919050565b613ec481613220565b82525050565b5f613ed58383613ebb565b60208301905092915050565b5f602082019050919050565b5f613ef782613e98565b613f018185613ea2565b9350613f0c83613eac565b805f5b83811015613f3c578151613f238882613eca565b9750613f2e83613ee1565b925050600181019050613f0f565b5085935050505092915050565b5f613f548284613eed565b915081905092915050565b5f81519050919050565b5f81905092915050565b5f613f7d82613f5f565b613f878185613f69565b9350613f97818560208601612d06565b80840191505092915050565b5f613fae8284613f73565b915081905092915050565b5f60c082019050613fcc5f830189613229565b613fd96020830188613229565b613fe6604083018761329a565b613ff3606083018661329a565b614000608083018561328b565b61400d60a0830184613229565b979650505050505050565b5f60608201905061402b5f83018661328b565b614038602083018561329a565b614045604083018461329a565b949350505050565b5f8151905061405b81612c64565b92915050565b5f6020828403121561407657614075612c53565b5b5f6140838482850161404d565b91505092915050565b61409581613220565b811461409f575f80fd5b50565b5f815190506140b08161408c565b92915050565b5f602082840312156140cb576140ca612c53565b5b5f6140d8848285016140a2565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f819050815f5260205f209050919050565b601f821115614161576141328161410e565b61413b846136c5565b8101602085101561414a578190505b61415e614156856136c5565b8301826137a5565b50505b505050565b61416f82612cec565b67ffffffffffffffff811115614188576141876130a2565b5b6141928254613683565b61419d828285614120565b5f60209050601f8311600181146141ce575f84156141bc578287015190505b6141c68582613835565b86555061422d565b601f1984166141dc8661410e565b5f5b82811015614203578489015182556001820191506020850194506020810190506141de565b86831015614220578489015161421c601f891682613819565b8355505b6001600288020188555050505b505050505050565b5f60ff82169050919050565b61424a81614235565b82525050565b5f6080820190506142635f830187613229565b6142706020830186614241565b61427d6040830185613229565b61428a6060830184613229565b95945050505050565b5f60a0820190506142a65f830188613229565b6142b36020830187613229565b6142c06040830186613229565b6142cd606083018561328b565b6142da608083018461329a565b969550505050505056fe43697068657274657874566572696669636174696f6e28627974657333325b5d20637448616e646c65732c616464726573732075736572416464726573732c6164647265737320636f6e7472616374416464726573732c75696e7432353620636f6e7472616374436861696e49642c62797465732065787472614461746129 + ///0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000043575f80fd5b50620000546200005a60201b60201c565b620001c4565b5f6200006b6200015e60201b60201c565b9050805f0160089054906101000a900460ff1615620000b6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146200015b5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051620001529190620001a9565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b620001a38162000185565b82525050565b5f602082019050620001be5f83018462000198565b92915050565b608051614a10620001eb5f395f81816121cc0152818161222101526124c30152614a105ff3fe6080604052600436106100fd575f3560e01c806352d1902d11610094578063a700499611610063578063a7004996146102d5578063ad3cb1cc146102fd578063c411587414610327578063ce7e42571461033d578063e96f88ea14610379576100fd565b806352d1902d1461023b5780635c975abb146102655780638456cb591461028f57806384b0196e146102a5576100fd565b8063338007fc116100d0578063338007fc146101cb57806339f73810146101f35780633f4ba83a146102095780634f1ef2861461021f576100fd565b80630c615839146101015780630d8e6e2c1461013d5780631bbe9fae1461016757806331bedea3146101a3575b5f80fd5b34801561010c575f80fd5b50610127600480360381019061012291906131b6565b6103b5565b60405161013491906131fb565b60405180910390f35b348015610148575f80fd5b506101516103e9565b60405161015e919061329e565b60405180910390f35b348015610172575f80fd5b5061018d600480360381019061018891906131b6565b610464565b60405161019a91906133a5565b60405180910390f35b3480156101ae575f80fd5b506101c960048036038101906101c4919061347b565b61050e565b005b3480156101d6575f80fd5b506101f160048036038101906101ec919061353f565b610a66565b005b3480156101fe575f80fd5b50610207610f13565b005b348015610214575f80fd5b5061021d6110ff565b005b610239600480360381019061023491906136ee565b611247565b005b348015610246575f80fd5b5061024f611266565b60405161025c9190613760565b60405180910390f35b348015610270575f80fd5b50610279611297565b60405161028691906131fb565b60405180910390f35b34801561029a575f80fd5b506102a36112b9565b005b3480156102b0575f80fd5b506102b96113de565b6040516102cc9796959493929190613888565b60405180910390f35b3480156102e0575f80fd5b506102fb60048036038101906102f6919061390a565b6114e7565b005b348015610308575f80fd5b50610311611834565b60405161031e919061329e565b60405180910390f35b348015610332575f80fd5b5061033b61186d565b005b348015610348575f80fd5b50610363600480360381019061035e91906131b6565b611992565b60405161037091906133a5565b60405180910390f35b348015610384575f80fd5b5061039f600480360381019061039a91906131b6565b611a63565b6040516103ac91906131fb565b60405180910390f35b5f806103bf611a97565b9050806007015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b60606040518060400160405280601181526020017f496e707574566572696669636174696f6e00000000000000000000000000000081525061042a5f611abe565b6104346002611abe565b61043d5f611abe565b6040516020016104509493929190613a8f565b604051602081830303815290604052905090565b60605f61046f611a97565b905080600a015f8481526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561050157602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116104b8575b5050505050915050919050565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16633a5162e66040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610567575f80fd5b505af1158015610579573d5f803e3d5ffd5b505050505f610586611a97565b9050805f015488118061059857505f88145b156105da57876040517f4711083f0000000000000000000000000000000000000000000000000000000081526004016105d19190613aed565b60405180910390fd5b5f81600b015f8a81526020019081526020015f205490506105fb8133611b88565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663cd8e993c826040518263ffffffff1660e01b81526004016106489190613aed565b602060405180830381865afa158015610663573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106879190613b30565b61075b575f7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663888b99e0836040518263ffffffff1660e01b81526004016106d99190613aed565b602060405180830381865afa1580156106f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107189190613b7e565b90508982826040517fc0eedb7b00000000000000000000000000000000000000000000000000000000815260040161075293929190613c1c565b60405180910390fd5b5f6107eb8a8a8a808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508488888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611c5d565b90505f61083b8289898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611dfa565b90506108478382611e24565b6108528b3383611ef9565b5f846002015f8d81526020019081526020015f205f8481526020019081526020015f20905080898990918060018154018082558091505060019003905f5260205f20015f9091929091929091929091925091826108b0929190613e55565b506001856005015f8e81526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550846003015f8d81526020019081526020015f205f8481526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550846004015f8d81526020019081526020015f205f9054906101000a900460ff161580156109ce57506109cd84828054905061204c565b5b15610a58576001856004015f8e81526020019081526020015f205f6101000a81548160ff02191690831515021790555082856006015f8e81526020019081526020015f2081905550838c7ff96a66bb08cf5450f5789d7343fa3b58d4a00a66ef2d0d0494f424b03b0abff28d8d858c8c604051610a4f959493929190614124565b60405180910390a35b505050505050505050505050565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16633a5162e66040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610abf575f80fd5b505af1158015610ad1573d5f803e3d5ffd5b505050505f610ade611a97565b9050805f0154841180610af057505f84145b15610b3257836040517f4711083f000000000000000000000000000000000000000000000000000000008152600401610b299190613aed565b60405180910390fd5b5f81600b015f8681526020019081526020015f20549050610b538133611b88565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663cd8e993c826040518263ffffffff1660e01b8152600401610ba09190613aed565b602060405180830381865afa158015610bbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bdf9190613b30565b610cb3575f7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663888b99e0836040518263ffffffff1660e01b8152600401610c319190613aed565b602060405180830381865afa158015610c4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c709190613b7e565b90508582826040517ff3225893000000000000000000000000000000000000000000000000000000008152600401610caa93929190613c1c565b60405180910390fd5b5f7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663820a91f883336040518363ffffffff1660e01b8152600401610d03929190614172565b5f60405180830381865afa158015610d1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610d459190614300565b90505f81604001519050610d5a873383611ef9565b836008015f8881526020019081526020015f205f815480929190610d7d90614374565b91905055506001846009015f8981526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555083600a015f8881526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836007015f8881526020019081526020015f205f9054906101000a900460ff16158015610e9f5750610e9e83856008015f8a81526020019081526020015f205461204c565b5b15610f0a576001846007015f8981526020019081526020015f205f6101000a81548160ff021916908315150217905550867f6f4b137679536c6081c7f024870327aa89b62a64182f2d41e4fbdee5e2248e868787604051610f019291906143bb565b60405180910390a25b50505050505050565b6001610f1d6120e9565b67ffffffffffffffff1614610f5e576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f610f6961210d565b9050805f0160089054906101000a900460ff1680610fb157508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15610fe8576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055506110a16040518060400160405280601181526020017f496e707574566572696669636174696f6e0000000000000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250612134565b6110a961214a565b5f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2826040516110f391906143ff565b60405180910390a15050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561115c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111809190614418565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156111fb575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561123d57336040517fe19166ee0000000000000000000000000000000000000000000000000000000081526004016112349190614443565b60405180910390fd5b61124561215c565b565b61124f6121ca565b611258826122b0565b61126282826123a3565b5050565b5f61126f6124c1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f806112a1612548565b9050805f015f9054906101000a900460ff1691505090565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016113069190614443565b602060405180830381865afa158015611321573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113459190613b30565b158015611392575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156113d457336040517f388916bb0000000000000000000000000000000000000000000000000000000081526004016113cb9190614443565b60405180910390fd5b6113dc61256f565b565b5f6060805f805f60605f6113f06125de565b90505f801b815f015414801561140b57505f801b8160010154145b61144a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611441906144a6565b60405180910390fd5b611452612605565b61145a6126a3565b46305f801b5f67ffffffffffffffff811115611479576114786135ca565b5b6040519080825280602002602001820160405280156114a75781602001602082028036833780820191505090505b507f0f0000000000000000000000000000000000000000000000000000000000000095949392919097509750975097509750975097505090919293949596565b8673a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663bff3aaba826040518263ffffffff1660e01b81526004016115359190613aed565b602060405180830381865afa158015611550573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115749190613b30565b6115b557806040517fb6679c3b0000000000000000000000000000000000000000000000000000000081526004016115ac9190613aed565b60405180910390fd5b6115bd612741565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16633a5162e66040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611616575f80fd5b505af1158015611628573d5f803e3d5ffd5b505050505f611635611a97565b9050805f015f81548092919061164a90614374565b91905055505f815f0154905060405180606001604052808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff16815250826001015f8381526020019081526020015f205f820151815f01556020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050505f7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663991dc36d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117c991906144d8565b90508083600b015f8481526020019081526020015f20819055508a81837fe2cafa1b8243311c0828833c7ddf9356c92a51a2246bcf68e13f22b15defdd998d8d8d8d8d8d60405161181f96959493929190614503565b60405180910390a45050505050505050505050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60035f61187861210d565b9050805f0160089054906101000a900460ff16806118c057508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b156118f7576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d28260405161198691906143ff565b60405180910390a15050565b60605f61199d611a97565b90505f816006015f8581526020019081526020015f20549050816003015f8581526020019081526020015f205f8281526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015611a5557602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611a0c575b505050505092505050919050565b5f80611a6d611a97565b9050806004015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b5f7f4544165ce1653264fdcb09b029891e3d4c8d8583486821172f882e19a149a800905090565b60605f6001611acc84612782565b0190505f8167ffffffffffffffff811115611aea57611ae96135ca565b5b6040519080825280601f01601f191660200182016040528015611b1c5781602001600182028036833780820191505090505b5090505f82602001820190505b600115611b7d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611b7257611b71614558565b5b0494505f8503611b29575b819350505050919050565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16638625e87683836040518363ffffffff1660e01b8152600401611bd7929190614172565b602060405180830381865afa158015611bf2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c169190613b30565b611c595781816040517f29a993c1000000000000000000000000000000000000000000000000000000008152600401611c50929190614172565b60405180910390fd5b5050565b5f80611c67611a97565b90505f816001015f8881526020019081526020015f206040518060600160405290815f8201548152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050611dee6040518060c00160405280609c8152602001614974609c91398051906020012087604051602001611d719190614636565b6040516020818303038152906040528051906020012083604001518460200151855f01518a8a604051602001611da79190614690565b60405160208183030381529060405280519060200120604051602001611dd397969594939291906146a6565b604051602081830303815290604052805190602001206128d3565b92505050949350505050565b5f805f80611e0886866128ec565b925092509250611e188282612941565b82935050505092915050565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663cdbb5a8283836040518363ffffffff1660e01b8152600401611e73929190614172565b602060405180830381865afa158015611e8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eb29190613b30565b611ef55781816040517f554f8c5f000000000000000000000000000000000000000000000000000000008152600401611eec929190614172565b60405180910390fd5b5050565b5f611f02611a97565b9050806005015f8581526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611fa5578383836040517ff9ed431f000000000000000000000000000000000000000000000000000000008152600401611f9c93929190614713565b60405180910390fd5b806009015f8581526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612046578383836040517f2fa7317400000000000000000000000000000000000000000000000000000000815260040161203d93929190614713565b60405180910390fd5b50505050565b5f807333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663f88174ea856040518263ffffffff1660e01b815260040161209b9190613aed565b602060405180830381865afa1580156120b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120da91906144d8565b90508083101591505092915050565b5f6120f261210d565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b61213c612aa3565b6121468282612ae3565b5050565b612152612aa3565b61215a612b34565b565b612164612b64565b5f61216d612548565b90505f815f015f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6121b2612ba4565b6040516121bf9190614443565b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148061227757507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661225e612bab565b73ffffffffffffffffffffffffffffffffffffffff1614155b156122ae576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561230d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123319190614418565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123a057336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016123979190614443565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561240b57506040513d601f19601f820116820180604052508101906124089190614772565b60015b61244c57816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016124439190614443565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b81146124b257806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016124a99190613760565b60405180910390fd5b6124bc8383612bfe565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614612546576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b612577612741565b5f612580612548565b90506001815f015f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125c6612ba4565b6040516125d39190614443565b60405180910390a150565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100905090565b60605f6126106125de565b905080600201805461262190613c88565b80601f016020809104026020016040519081016040528092919081815260200182805461264d90613c88565b80156126985780601f1061266f57610100808354040283529160200191612698565b820191905f5260205f20905b81548152906001019060200180831161267b57829003601f168201915b505050505091505090565b60605f6126ae6125de565b90508060030180546126bf90613c88565b80601f01602080910402602001604051908101604052809291908181526020018280546126eb90613c88565b80156127365780601f1061270d57610100808354040283529160200191612736565b820191905f5260205f20905b81548152906001019060200180831161271957829003601f168201915b505050505091505090565b612749611297565b15612780576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127de577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127d4576127d3614558565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061281b576d04ee2d6d415b85acef8100000000838161281157612810614558565b5b0492506020810190505b662386f26fc10000831061284a57662386f26fc1000083816128405761283f614558565b5b0492506010810190505b6305f5e1008310612873576305f5e100838161286957612868614558565b5b0492506008810190505b612710831061289857612710838161288e5761288d614558565b5b0492506004810190505b606483106128bb57606483816128b1576128b0614558565b5b0492506002810190505b600a83106128ca576001810190505b80915050919050565b5f6128e56128df612c70565b83612c7e565b9050919050565b5f805f604184510361292c575f805f602087015192506040870151915060608701515f1a905061291e88828585612cbe565b95509550955050505061293a565b5f600285515f1b9250925092505b9250925092565b5f600381111561295457612953613ba9565b5b82600381111561296757612966613ba9565b5b0315612a9f576001600381111561298157612980613ba9565b5b82600381111561299457612993613ba9565b5b036129cb576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260038111156129df576129de613ba9565b5b8260038111156129f2576129f1613ba9565b5b03612a3657805f1c6040517ffce698f7000000000000000000000000000000000000000000000000000000008152600401612a2d9190613aed565b60405180910390fd5b600380811115612a4957612a48613ba9565b5b826003811115612a5c57612a5b613ba9565b5b03612a9e57806040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600401612a959190613760565b60405180910390fd5b5b5050565b612aab612da5565b612ae1576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b612aeb612aa3565b5f612af46125de565b905082816002019081612b0791906147f5565b5081816003019081612b1991906147f5565b505f801b815f01819055505f801b8160010181905550505050565b612b3c612aa3565b5f612b45612548565b90505f815f015f6101000a81548160ff02191690831515021790555050565b612b6c611297565b612ba2576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f33905090565b5f612bd77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b612dc3565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612c0782612dcc565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f81511115612c6357612c5d8282612e95565b50612c6c565b612c6b612f15565b5b5050565b5f612c79612f51565b905090565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115612cfa575f600385925092509250612d9b565b5f6001888888886040515f8152602001604052604051612d1d94939291906148df565b6020604051602081039080840390855afa158015612d3d573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d8e575f60015f801b93509350935050612d9b565b805f805f1b935093509350505b9450945094915050565b5f612dae61210d565b5f0160089054906101000a900460ff16905090565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03612e2757806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401612e1e9190614443565b60405180910390fd5b80612e537f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b612dc3565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051612ebe9190614690565b5f60405180830381855af49150503d805f8114612ef6576040519150601f19603f3d011682016040523d82523d5f602084013e612efb565b606091505b5091509150612f0b858383612fb4565b9250505092915050565b5f341115612f4f576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f612f7b613041565b612f836130b7565b4630604051602001612f99959493929190614922565b60405160208183030381529060405280519060200120905090565b606082612fc957612fc48261312e565b613039565b5f8251148015612fef57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561303157836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016130289190614443565b60405180910390fd5b81905061303a565b5b9392505050565b5f8061304b6125de565b90505f613056612605565b90505f81511115613072578080519060200120925050506130b4565b5f825f015490505f801b811461308d578093505050506130b4565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f806130c16125de565b90505f6130cc6126a3565b90505f815111156130e85780805190602001209250505061312b565b5f826001015490505f801b81146131045780935050505061312b565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f815111156131405780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61319581613183565b811461319f575f80fd5b50565b5f813590506131b08161318c565b92915050565b5f602082840312156131cb576131ca61317b565b5b5f6131d8848285016131a2565b91505092915050565b5f8115159050919050565b6131f5816131e1565b82525050565b5f60208201905061320e5f8301846131ec565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561324b578082015181840152602081019050613230565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61327082613214565b61327a818561321e565b935061328a81856020860161322e565b61329381613256565b840191505092915050565b5f6020820190508181035f8301526132b68184613266565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613310826132e7565b9050919050565b61332081613306565b82525050565b5f6133318383613317565b60208301905092915050565b5f602082019050919050565b5f613353826132be565b61335d81856132c8565b9350613368836132d8565b805f5b8381101561339857815161337f8882613326565b975061338a8361333d565b92505060018101905061336b565b5085935050505092915050565b5f6020820190508181035f8301526133bd8184613349565b905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126133e6576133e56133c5565b5b8235905067ffffffffffffffff811115613403576134026133c9565b5b60208301915083602082028301111561341f5761341e6133cd565b5b9250929050565b5f8083601f84011261343b5761343a6133c5565b5b8235905067ffffffffffffffff811115613458576134576133c9565b5b602083019150836001820283011115613474576134736133cd565b5b9250929050565b5f805f805f805f6080888a0312156134965761349561317b565b5b5f6134a38a828b016131a2565b975050602088013567ffffffffffffffff8111156134c4576134c361317f565b5b6134d08a828b016133d1565b9650965050604088013567ffffffffffffffff8111156134f3576134f261317f565b5b6134ff8a828b01613426565b9450945050606088013567ffffffffffffffff8111156135225761352161317f565b5b61352e8a828b01613426565b925092505092959891949750929550565b5f805f604084860312156135565761355561317b565b5b5f613563868287016131a2565b935050602084013567ffffffffffffffff8111156135845761358361317f565b5b61359086828701613426565b92509250509250925092565b6135a581613306565b81146135af575f80fd5b50565b5f813590506135c08161359c565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61360082613256565b810181811067ffffffffffffffff8211171561361f5761361e6135ca565b5b80604052505050565b5f613631613172565b905061363d82826135f7565b919050565b5f67ffffffffffffffff82111561365c5761365b6135ca565b5b61366582613256565b9050602081019050919050565b828183375f83830152505050565b5f61369261368d84613642565b613628565b9050828152602081018484840111156136ae576136ad6135c6565b5b6136b9848285613672565b509392505050565b5f82601f8301126136d5576136d46133c5565b5b81356136e5848260208601613680565b91505092915050565b5f80604083850312156137045761370361317b565b5b5f613711858286016135b2565b925050602083013567ffffffffffffffff8111156137325761373161317f565b5b61373e858286016136c1565b9150509250929050565b5f819050919050565b61375a81613748565b82525050565b5f6020820190506137735f830184613751565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6137ad81613779565b82525050565b6137bc81613183565b82525050565b6137cb81613306565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61380381613183565b82525050565b5f61381483836137fa565b60208301905092915050565b5f602082019050919050565b5f613836826137d1565b61384081856137db565b935061384b836137eb565b805f5b8381101561387b5781516138628882613809565b975061386d83613820565b92505060018101905061384e565b5085935050505092915050565b5f60e08201905061389b5f83018a6137a4565b81810360208301526138ad8189613266565b905081810360408301526138c18188613266565b90506138d060608301876137b3565b6138dd60808301866137c2565b6138ea60a0830185613751565b81810360c08301526138fc818461382c565b905098975050505050505050565b5f805f805f805f60a0888a0312156139255761392461317b565b5b5f6139328a828b016131a2565b97505060206139438a828b016135b2565b96505060406139548a828b016135b2565b955050606088013567ffffffffffffffff8111156139755761397461317f565b5b6139818a828b01613426565b9450945050608088013567ffffffffffffffff8111156139a4576139a361317f565b5b6139b08a828b01613426565b925092505092959891949750929550565b5f81905092915050565b5f6139d582613214565b6139df81856139c1565b93506139ef81856020860161322e565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f613a2f6002836139c1565b9150613a3a826139fb565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f613a796001836139c1565b9150613a8482613a45565b600182019050919050565b5f613a9a82876139cb565b9150613aa582613a23565b9150613ab182866139cb565b9150613abc82613a6d565b9150613ac882856139cb565b9150613ad382613a6d565b9150613adf82846139cb565b915081905095945050505050565b5f602082019050613b005f8301846137b3565b92915050565b613b0f816131e1565b8114613b19575f80fd5b50565b5f81519050613b2a81613b06565b92915050565b5f60208284031215613b4557613b4461317b565b5b5f613b5284828501613b1c565b91505092915050565b60088110613b67575f80fd5b50565b5f81519050613b7881613b5b565b92915050565b5f60208284031215613b9357613b9261317b565b5b5f613ba084828501613b6a565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60088110613be757613be6613ba9565b5b50565b5f819050613bf782613bd6565b919050565b5f613c0682613bea565b9050919050565b613c1681613bfc565b82525050565b5f606082019050613c2f5f8301866137b3565b613c3c60208301856137b3565b613c496040830184613c0d565b949350505050565b5f82905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613c9f57607f821691505b602082108103613cb257613cb1613c5b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613d147fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613cd9565b613d1e8683613cd9565b95508019841693508086168417925050509392505050565b5f819050919050565b5f613d59613d54613d4f84613183565b613d36565b613183565b9050919050565b5f819050919050565b613d7283613d3f565b613d86613d7e82613d60565b848454613ce5565b825550505050565b5f90565b613d9a613d8e565b613da5818484613d69565b505050565b5b81811015613dc857613dbd5f82613d92565b600181019050613dab565b5050565b601f821115613e0d57613dde81613cb8565b613de784613cca565b81016020851015613df6578190505b613e0a613e0285613cca565b830182613daa565b50505b505050565b5f82821c905092915050565b5f613e2d5f1984600802613e12565b1980831691505092915050565b5f613e458383613e1e565b9150826002028217905092915050565b613e5f8383613c51565b67ffffffffffffffff811115613e7857613e776135ca565b5b613e828254613c88565b613e8d828285613dcc565b5f601f831160018114613eba575f8415613ea8578287013590505b613eb28582613e3a565b865550613f19565b601f198416613ec886613cb8565b5f5b82811015613eef57848901358255600182019150602085019450602081019050613eca565b86831015613f0c5784890135613f08601f891682613e1e565b8355505b6001600288020188555050505b50505050505050565b5f82825260208201905092915050565b5f80fd5b82818337505050565b5f613f4a8385613f22565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613f7d57613f7c613f32565b5b602083029250613f8e838584613f36565b82840190509392505050565b5f81549050919050565b5f82825260208201905092915050565b5f819050815f5260205f209050919050565b5f82825260208201905092915050565b5f8154613fe281613c88565b613fec8186613fc6565b9450600182165f8114614006576001811461401c5761404e565b60ff19831686528115156020028601935061404e565b61402585613cb8565b5f5b8381101561404657815481890152600182019150602081019050614027565b808801955050505b50505092915050565b5f6140628383613fd6565b905092915050565b5f600182019050919050565b5f61408082613f9a565b61408a8185613fa4565b93508360208202850161409c85613fb4565b805f5b858110156140d6578484038952816140b78582614057565b94506140c28361406a565b925060208a0199505060018101905061409f565b50829750879550505050505092915050565b5f82825260208201905092915050565b5f61410383856140e8565b9350614110838584613672565b61411983613256565b840190509392505050565b5f6060820190508181035f83015261413d818789613f3f565b905081810360208301526141518186614076565b905081810360408301526141668184866140f8565b90509695505050505050565b5f6040820190506141855f8301856137b3565b61419260208301846137c2565b9392505050565b5f80fd5b5f80fd5b5f67ffffffffffffffff8211156141bb576141ba6135ca565b5b6141c482613256565b9050602081019050919050565b5f6141e36141de846141a1565b613628565b9050828152602081018484840111156141ff576141fe6135c6565b5b61420a84828561322e565b509392505050565b5f82601f830112614226576142256133c5565b5b81516142368482602086016141d1565b91505092915050565b5f8151905061424d8161359c565b92915050565b5f6080828403121561426857614267614199565b5b6142726080613628565b90505f82015167ffffffffffffffff8111156142915761429061419d565b5b61429d84828501614212565b5f8301525060206142b08482850161423f565b60208301525060406142c48482850161423f565b604083015250606082015167ffffffffffffffff8111156142e8576142e761419d565b5b6142f484828501614212565b60608301525092915050565b5f602082840312156143155761431461317b565b5b5f82015167ffffffffffffffff8111156143325761433161317f565b5b61433e84828501614253565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61437e82613183565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143b0576143af614347565b5b600182019050919050565b5f6020820190508181035f8301526143d48184866140f8565b90509392505050565b5f67ffffffffffffffff82169050919050565b6143f9816143dd565b82525050565b5f6020820190506144125f8301846143f0565b92915050565b5f6020828403121561442d5761442c61317b565b5b5f61443a8482850161423f565b91505092915050565b5f6020820190506144565f8301846137c2565b92915050565b7f4549503731323a20556e696e697469616c697a656400000000000000000000005f82015250565b5f61449060158361321e565b915061449b8261445c565b602082019050919050565b5f6020820190508181035f8301526144bd81614484565b9050919050565b5f815190506144d28161318c565b92915050565b5f602082840312156144ed576144ec61317b565b5b5f6144fa848285016144c4565b91505092915050565b5f6080820190506145165f8301896137c2565b61452360208301886137c2565b81810360408301526145368186886140f8565b9050818103606083015261454b8184866140f8565b9050979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81519050919050565b5f81905092915050565b5f819050602082019050919050565b6145b181613748565b82525050565b5f6145c283836145a8565b60208301905092915050565b5f602082019050919050565b5f6145e482614585565b6145ee818561458f565b93506145f983614599565b805f5b8381101561462957815161461088826145b7565b975061461b836145ce565b9250506001810190506145fc565b5085935050505092915050565b5f61464182846145da565b915081905092915050565b5f81519050919050565b5f81905092915050565b5f61466a8261464c565b6146748185614656565b935061468481856020860161322e565b80840191505092915050565b5f61469b8284614660565b915081905092915050565b5f60e0820190506146b95f83018a613751565b6146c66020830189613751565b6146d360408301886137c2565b6146e060608301876137c2565b6146ed60808301866137b3565b6146fa60a08301856137b3565b61470760c0830184613751565b98975050505050505050565b5f6060820190506147265f8301866137b3565b61473360208301856137c2565b61474060408301846137c2565b949350505050565b61475181613748565b811461475b575f80fd5b50565b5f8151905061476c81614748565b92915050565b5f602082840312156147875761478661317b565b5b5f6147948482850161475e565b91505092915050565b5f819050815f5260205f209050919050565b601f8211156147f0576147c18161479d565b6147ca84613cca565b810160208510156147d9578190505b6147ed6147e585613cca565b830182613daa565b50505b505050565b6147fe82613214565b67ffffffffffffffff811115614817576148166135ca565b5b6148218254613c88565b61482c8282856147af565b5f60209050601f83116001811461485d575f841561484b578287015190505b6148558582613e3a565b8655506148bc565b601f19841661486b8661479d565b5f5b828110156148925784890151825560018201915060208501945060208101905061486d565b868310156148af57848901516148ab601f891682613e1e565b8355505b6001600288020188555050505b505050505050565b5f60ff82169050919050565b6148d9816148c4565b82525050565b5f6080820190506148f25f830187613751565b6148ff60208301866148d0565b61490c6040830185613751565b6149196060830184613751565b95945050505050565b5f60a0820190506149355f830188613751565b6149426020830187613751565b61494f6040830186613751565b61495c60608301856137b3565b61496960808301846137c2565b969550505050505056fe43697068657274657874566572696669636174696f6e28627974657333325b5d20637448616e646c65732c616464726573732075736572416464726573732c6164647265737320636f6e7472616374416464726573732c75696e7432353620636f6e7472616374436861696e49642c75696e7432353620636f70726f636573736f72436f6e7465787449642c62797465732065787472614461746129 /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\xA0`@R0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x80\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP4\x80\x15b\0\0CW_\x80\xFD[Pb\0\0Tb\0\0Z` \x1B` \x1CV[b\0\x01\xC4V[_b\0\0kb\0\x01^` \x1B` \x1CV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15b\0\0\xB6W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14b\0\x01[Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`@Qb\0\x01R\x91\x90b\0\x01\xA9V[`@Q\x80\x91\x03\x90\xA1[PV[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[b\0\x01\xA3\x81b\0\x01\x85V[\x82RPPV[_` \x82\x01\x90Pb\0\x01\xBE_\x83\x01\x84b\0\x01\x98V[\x92\x91PPV[`\x80QaCdb\0\x01\xEB_9_\x81\x81a\x1C\xA4\x01R\x81\x81a\x1C\xF9\x01Ra\x1F\x9B\x01RaCd_\xF3\xFE`\x80`@R`\x046\x10a\0\xF2W_5`\xE0\x1C\x80cR\xD1\x90-\x11a\0\x89W\x80c\xA7\0I\x96\x11a\0XW\x80c\xA7\0I\x96\x14a\x02\xCAW\x80c\xAD<\xB1\xCC\x14a\x02\xF2W\x80c\xCE~BW\x14a\x03\x1CW\x80c\xE9o\x88\xEA\x14a\x03XWa\0\xF2V[\x80cR\xD1\x90-\x14a\x020W\x80c\\\x97Z\xBB\x14a\x02ZW\x80c\x84V\xCBY\x14a\x02\x84W\x80c\x84\xB0\x19n\x14a\x02\x9AWa\0\xF2V[\x80c3\x80\x07\xFC\x11a\0\xC5W\x80c3\x80\x07\xFC\x14a\x01\xC0W\x80c9\xF78\x10\x14a\x01\xE8W\x80c?K\xA8:\x14a\x01\xFEW\x80cO\x1E\xF2\x86\x14a\x02\x14Wa\0\xF2V[\x80c\x0CaX9\x14a\0\xF6W\x80c\r\x8En,\x14a\x012W\x80c\x1B\xBE\x9F\xAE\x14a\x01\\W\x80c1\xBE\xDE\xA3\x14a\x01\x98W[_\x80\xFD[4\x80\x15a\x01\x01W_\x80\xFD[Pa\x01\x1C`\x04\x806\x03\x81\x01\x90a\x01\x17\x91\x90a,\x8EV[a\x03\x94V[`@Qa\x01)\x91\x90a,\xD3V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01=W_\x80\xFD[Pa\x01Fa\x03\xC8V[`@Qa\x01S\x91\x90a-vV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01gW_\x80\xFD[Pa\x01\x82`\x04\x806\x03\x81\x01\x90a\x01}\x91\x90a,\x8EV[a\x04CV[`@Qa\x01\x8F\x91\x90a.}V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xA3W_\x80\xFD[Pa\x01\xBE`\x04\x806\x03\x81\x01\x90a\x01\xB9\x91\x90a/SV[a\x04\xEDV[\0[4\x80\x15a\x01\xCBW_\x80\xFD[Pa\x01\xE6`\x04\x806\x03\x81\x01\x90a\x01\xE1\x91\x90a0\x17V[a\nNV[\0[4\x80\x15a\x01\xF3W_\x80\xFD[Pa\x01\xFCa\r\xC7V[\0[4\x80\x15a\x02\tW_\x80\xFD[Pa\x02\x12a\x0F\xB3V[\0[a\x02.`\x04\x806\x03\x81\x01\x90a\x02)\x91\x90a1\xC6V[a\x10\xFBV[\0[4\x80\x15a\x02;W_\x80\xFD[Pa\x02Da\x11\x1AV[`@Qa\x02Q\x91\x90a28V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02eW_\x80\xFD[Pa\x02na\x11KV[`@Qa\x02{\x91\x90a,\xD3V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x8FW_\x80\xFD[Pa\x02\x98a\x11mV[\0[4\x80\x15a\x02\xA5W_\x80\xFD[Pa\x02\xAEa\x12\x92V[`@Qa\x02\xC1\x97\x96\x95\x94\x93\x92\x91\x90a3`V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xD5W_\x80\xFD[Pa\x02\xF0`\x04\x806\x03\x81\x01\x90a\x02\xEB\x91\x90a3\xE2V[a\x13\x9BV[\0[4\x80\x15a\x02\xFDW_\x80\xFD[Pa\x03\x06a\x15\xF5V[`@Qa\x03\x13\x91\x90a-vV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03'W_\x80\xFD[Pa\x03B`\x04\x806\x03\x81\x01\x90a\x03=\x91\x90a,\x8EV[a\x16.V[`@Qa\x03O\x91\x90a.}V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03cW_\x80\xFD[Pa\x03~`\x04\x806\x03\x81\x01\x90a\x03y\x91\x90a,\x8EV[a\x16\xFFV[`@Qa\x03\x8B\x91\x90a,\xD3V[`@Q\x80\x91\x03\x90\xF3[_\x80a\x03\x9Ea\x173V[\x90P\x80`\x07\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[```@Q\x80`@\x01`@R\x80`\x11\x81R` \x01\x7FInputVerification\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x04\t_a\x17ZV[a\x04\x13`\x01a\x17ZV[a\x04\x1C_a\x17ZV[`@Q` \x01a\x04/\x94\x93\x92\x91\x90a5gV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x90V[``_a\x04Na\x173V[\x90P\x80`\n\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x04\xE0W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x04\x97W[PPPPP\x91PP\x91\x90PV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xD3\xED\xFE3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x05:\x91\x90a5\xC5V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05UW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05y\x91\x90a6\x08V[a\x05\xBAW3`@Q\x7FR\xD7%\xF5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05\xB1\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[_a\x05\xC3a\x173V[\x90P\x80_\x01T\x88\x11\x80a\x05\xD5WP_\x88\x14[\x15a\x06\x17W\x87`@Q\x7FG\x11\x08?\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x06\x0E\x91\x90a63V[`@Q\x80\x91\x03\x90\xFD[_\x81`\x01\x01_\x8A\x81R` \x01\x90\x81R` \x01_ `@Q\x80``\x01`@R\x90\x81_\x82\x01T\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RPP\x90P_`@Q\x80`\xA0\x01`@R\x80\x8A\x8A\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81R` \x01\x83`@\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x83` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x83_\x01Q\x81R` \x01\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81RP\x90P_a\x07\xD9\x82a\x18$V[\x90P_a\x08)\x82\x8A\x8A\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa\x18\xE3V[\x90Pa\x084\x81a\x19\rV[a\x08?\x8C3\x83a\x19\xDDV[_\x85`\x02\x01_\x8E\x81R` \x01\x90\x81R` \x01_ _\x84\x81R` \x01\x90\x81R` \x01_ \x90P\x80\x8A\x8A\x90\x91\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x92\x90\x91\x92\x90\x91\x92\x90\x91\x92P\x91\x82a\x08\x9D\x92\x91\x90a8PV[P`\x01\x86`\x05\x01_\x8F\x81R` \x01\x90\x81R` \x01_ _\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x85`\x03\x01_\x8E\x81R` \x01\x90\x81R` \x01_ _\x84\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x85`\x04\x01_\x8E\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\t\xBAWPa\t\xB9\x81\x80T\x90Pa\x1B0V[[\x15a\n?W`\x01\x86`\x04\x01_\x8F\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x82\x86`\x06\x01_\x8F\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x8C\x7F\xFE,CXW\x86\xA5\xA6X\xD2\xEC]\xF5\xDE\xA3\xFB3\x85\xB7|\x94\xF6\x0FrO\xF8\x10\x89oA\x985\x8D\x8D\x84`@Qa\n6\x93\x92\x91\x90a:\xE3V[`@Q\x80\x91\x03\x90\xA2[PPPPPPPPPPPPPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xD3\xED\xFE3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\n\x9B\x91\x90a5\xC5V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\n\xB6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\n\xDA\x91\x90a6\x08V[a\x0B\x1BW3`@Q\x7FR\xD7%\xF5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0B\x12\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[_a\x0B$a\x173V[\x90P\x80_\x01T\x84\x11\x80a\x0B6WP_\x84\x14[\x15a\x0BxW\x83`@Q\x7FG\x11\x08?\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0Bo\x91\x90a63V[`@Q\x80\x91\x03\x90\xFD[_s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xEFi\x97\xF93`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0B\xC6\x91\x90a5\xC5V[_`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0B\xE0W=_\x80>=_\xFD[PPPP`@Q=_\x82>=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0C\x08\x91\x90a=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x104\x91\x90a=GV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15\x80\x15a\x10\xAFWPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x10\xF1W3`@Q\x7F\xE1\x91f\xEE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x10\xE8\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[a\x10\xF9a\x1C4V[V[a\x11\x03a\x1C\xA2V[a\x11\x0C\x82a\x1D\x88V[a\x11\x16\x82\x82a\x1E{V[PPV[_a\x11#a\x1F\x99V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[_\x80a\x11Ua V[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x90V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cF\xFB\xF6\x8E3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x11\xBA\x91\x90a5\xC5V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11\xD5W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11\xF9\x91\x90a6\x08V[\x15\x80\x15a\x12FWPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x12\x88W3`@Q\x7F8\x89\x16\xBB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x12\x7F\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[a\x12\x90a GV[V[_``\x80_\x80_``_a\x12\xA4a \xB6V[\x90P_\x80\x1B\x81_\x01T\x14\x80\x15a\x12\xBFWP_\x80\x1B\x81`\x01\x01T\x14[a\x12\xFEW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x12\xF5\x90a=\xBCV[`@Q\x80\x91\x03\x90\xFD[a\x13\x06a \xDDV[a\x13\x0Ea!{V[F0_\x80\x1B_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x13-Wa\x13,a0\xA2V[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x13[W\x81` \x01` \x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x7F\x0F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95\x94\x93\x92\x91\x90\x97P\x97P\x97P\x97P\x97P\x97P\x97PP\x90\x91\x92\x93\x94\x95\x96V[\x86s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x13\xE9\x91\x90a63V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x14\x04W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x14(\x91\x90a6\x08V[a\x14iW\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14`\x91\x90a63V[`@Q\x80\x91\x03\x90\xFD[a\x14qa\"\x19V[_a\x14za\x173V[\x90P\x80_\x01_\x81T\x80\x92\x91\x90a\x14\x8F\x90a<\xC5V[\x91\x90PUP_\x81_\x01T\x90P`@Q\x80``\x01`@R\x80\x8B\x81R` \x01\x8As\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x89s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP\x82`\x01\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01U` \x82\x01Q\x81`\x01\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x02\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x90PP`\x01\x82`\x0B\x01_\x83\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x89_\x82\x7F\xE2\xCA\xFA\x1B\x82C1\x1C\x08(\x83<}\xDF\x93V\xC9*Q\xA2$k\xCFh\xE1?\"\xB1]\xEF\xDD\x99\x8C\x8C\x8C\x8C\x8C\x8C`@Qa\x15\xE1\x96\x95\x94\x93\x92\x91\x90a>\x16V[`@Q\x80\x91\x03\x90\xA4PPPPPPPPPPV[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[``_a\x169a\x173V[\x90P_\x81`\x06\x01_\x85\x81R` \x01\x90\x81R` \x01_ T\x90P\x81`\x03\x01_\x85\x81R` \x01\x90\x81R` \x01_ _\x82\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x16\xF1W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x16\xA8W[PPPPP\x92PPP\x91\x90PV[_\x80a\x17\ta\x173V[\x90P\x80`\x04\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x7FED\x16\\\xE1e2d\xFD\xCB\t\xB0)\x89\x1E=L\x8D\x85\x83Hh!\x17/\x88.\x19\xA1I\xA8\0\x90P\x90V[``_`\x01a\x17h\x84a\"ZV[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x17\x86Wa\x17\x85a0\xA2V[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x17\xB8W\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a\x18\x19W\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a\x18\x0EWa\x18\ra>kV[[\x04\x94P_\x85\x03a\x17\xC5W[\x81\x93PPPP\x91\x90PV[_a\x18\xDC`@Q\x80`\xA0\x01`@R\x80`\x7F\x81R` \x01aB\xE5`\x7F\x919\x80Q\x90` \x01 \x83_\x01Q`@Q` \x01a\x18\\\x91\x90a?IV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x84` \x01Q\x85`@\x01Q\x86``\x01Q\x87`\x80\x01Q`@Q` \x01a\x18\x96\x91\x90a?\xA3V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a\x18\xC1\x96\x95\x94\x93\x92\x91\x90a?\xB9V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 a#\xABV[\x90P\x91\x90PV[_\x80_\x80a\x18\xF1\x86\x86a#\xC4V[\x92P\x92P\x92Pa\x19\x01\x82\x82a$\x19V[\x82\x93PPPP\x92\x91PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c+\x10\x1C\x03\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x19Z\x91\x90a5\xC5V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x19uW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x19\x99\x91\x90a6\x08V[a\x19\xDAW\x80`@Q\x7F&\xCDu\xDC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x19\xD1\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[PV[_a\x19\xE6a\x173V[\x90P\x80`\x05\x01_\x85\x81R` \x01\x90\x81R` \x01_ _\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\x1A\x89W\x83\x83\x83`@Q\x7F\xF9\xEDC\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1A\x80\x93\x92\x91\x90a@\x18V[`@Q\x80\x91\x03\x90\xFD[\x80`\t\x01_\x85\x81R` \x01\x90\x81R` \x01_ _\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\x1B*W\x83\x83\x83`@Q\x7F/\xA71t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1B!\x93\x92\x91\x90a@\x18V[`@Q\x80\x91\x03\x90\xFD[PPPPV[_\x80s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cg\x99\xEFR`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1B\x8FW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1B\xB3\x91\x90a@aV[\x90P\x80\x83\x10\x15\x91PP\x91\x90PV[_a\x1B\xCAa\x1B\xE5V[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[a\x1C\x14a%{V[a\x1C\x1E\x82\x82a%\xBBV[PPV[a\x1C*a%{V[a\x1C2a&\x0CV[V[a\x1C=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1E\t\x91\x90a=GV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x1ExW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1Eo\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x1E\xE3WP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1E\xE0\x91\x90a@\xB6V[`\x01[a\x1F$W\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1F\x1B\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a\x1F\x8AW\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1F\x81\x91\x90a28V[`@Q\x80\x91\x03\x90\xFD[a\x1F\x94\x83\x83a&\xD6V[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a \x1EW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x7F\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\x90P\x90V[a Oa\"\x19V[_a Xa V[\x90P`\x01\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2Xa \x9Ea&|V[`@Qa \xAB\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xA1PV[_\x7F\xA1jF\xD9Ba\xC7Q|\xC8\xFF\x89\xF6\x1C\x0C\xE95\x98\xE3\xC8I\x80\x10\x11\xDE\xE6I\xA6\xA5W\xD1\0\x90P\x90V[``_a \xE8a \xB6V[\x90P\x80`\x02\x01\x80Ta \xF9\x90a6\x83V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta!%\x90a6\x83V[\x80\x15a!pW\x80`\x1F\x10a!GWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a!pV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a!SW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[``_a!\x86a \xB6V[\x90P\x80`\x03\x01\x80Ta!\x97\x90a6\x83V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta!\xC3\x90a6\x83V[\x80\x15a\"\x0EW\x80`\x1F\x10a!\xE5Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\"\x0EV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a!\xF1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[a\"!a\x11KV[\x15a\"XW`@Q\x7F\xD9<\x06e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a\"\xB6Wz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a\"\xACWa\"\xABa>kV[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a\"\xF3Wm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a\"\xE9Wa\"\xE8a>kV[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a#\"Wf#\x86\xF2o\xC1\0\0\x83\x81a#\x18Wa#\x17a>kV[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a#KWc\x05\xF5\xE1\0\x83\x81a#AWa#@a>kV[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a#pWa'\x10\x83\x81a#fWa#ea>kV[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a#\x93W`d\x83\x81a#\x89Wa#\x88a>kV[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a#\xA2W`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a#\xBDa#\xB7a'HV[\x83a'VV[\x90P\x91\x90PV[_\x80_`A\x84Q\x03a$\x04W_\x80_` \x87\x01Q\x92P`@\x87\x01Q\x91P``\x87\x01Q_\x1A\x90Pa#\xF6\x88\x82\x85\x85a'\x96V[\x95P\x95P\x95PPPPa$\x12V[_`\x02\x85Q_\x1B\x92P\x92P\x92P[\x92P\x92P\x92V[_`\x03\x81\x11\x15a$,Wa$+a@\xE1V[[\x82`\x03\x81\x11\x15a$?Wa$>a@\xE1V[[\x03\x15a%wW`\x01`\x03\x81\x11\x15a$YWa$Xa@\xE1V[[\x82`\x03\x81\x11\x15a$lWa$ka@\xE1V[[\x03a$\xA3W`@Q\x7F\xF6E\xEE\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02`\x03\x81\x11\x15a$\xB7Wa$\xB6a@\xE1V[[\x82`\x03\x81\x11\x15a$\xCAWa$\xC9a@\xE1V[[\x03a%\x0EW\x80_\x1C`@Q\x7F\xFC\xE6\x98\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%\x05\x91\x90a63V[`@Q\x80\x91\x03\x90\xFD[`\x03\x80\x81\x11\x15a%!Wa% a@\xE1V[[\x82`\x03\x81\x11\x15a%4Wa%3a@\xE1V[[\x03a%vW\x80`@Q\x7F\xD7\x8B\xCE\x0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%m\x91\x90a28V[`@Q\x80\x91\x03\x90\xFD[[PPV[a%\x83a(}V[a%\xB9W`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a%\xC3a%{V[_a%\xCCa \xB6V[\x90P\x82\x81`\x02\x01\x90\x81a%\xDF\x91\x90aAfV[P\x81\x81`\x03\x01\x90\x81a%\xF1\x91\x90aAfV[P_\x80\x1B\x81_\x01\x81\x90UP_\x80\x1B\x81`\x01\x01\x81\x90UPPPPV[a&\x14a%{V[_a&\x1Da V[\x90P_\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UPPV[a&Da\x11KV[a&zW`@Q\x7F\x8D\xFC +\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_3\x90P\x90V[_a&\xAF\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba(\x9BV[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a&\xDF\x82a(\xA4V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a';Wa'5\x82\x82a)mV[Pa'DV[a'Ca)\xEDV[[PPV[_a'Qa*)V[\x90P\x90V[_`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x83`\x02\x82\x01R\x82`\"\x82\x01R`B\x81 \x91PP\x92\x91PPV[_\x80_\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84_\x1C\x11\x15a'\xD2W_`\x03\x85\x92P\x92P\x92Pa(sV[_`\x01\x88\x88\x88\x88`@Q_\x81R` \x01`@R`@Qa'\xF5\x94\x93\x92\x91\x90aBPV[` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a(\x15W=_\x80>=_\xFD[PPP` `@Q\x03Q\x90P_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a(fW_`\x01_\x80\x1B\x93P\x93P\x93PPa(sV[\x80_\x80_\x1B\x93P\x93P\x93PP[\x94P\x94P\x94\x91PPV[_a(\x86a\x1B\xE5V[_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x90P\x90V[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a(\xFFW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a(\xF6\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[\x80a)+\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba(\x9BV[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa)\x96\x91\x90a?\xA3V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a)\xCEW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a)\xD3V[``\x91P[P\x91P\x91Pa)\xE3\x85\x83\x83a*\x8CV[\x92PPP\x92\x91PPV[_4\x11\x15a*'W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x7F\x8Bs\xC3\xC6\x9B\xB8\xFE=Q.\xCCL\xF7Y\xCCy#\x9F{\x17\x9B\x0F\xFA\xCA\xA9\xA7]R+9@\x0Fa*Sa+\x19V[a*[a+\x8FV[F0`@Q` \x01a*q\x95\x94\x93\x92\x91\x90aB\x93V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x90V[``\x82a*\xA1Wa*\x9C\x82a,\x06V[a+\x11V[_\x82Q\x14\x80\x15a*\xC7WP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a+\tW\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a+\0\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa+\x12V[[\x93\x92PPPV[_\x80a+#a \xB6V[\x90P_a+.a \xDDV[\x90P_\x81Q\x11\x15a+JW\x80\x80Q\x90` \x01 \x92PPPa+\x8CV[_\x82_\x01T\x90P_\x80\x1B\x81\x14a+eW\x80\x93PPPPa+\x8CV[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x80a+\x99a \xB6V[\x90P_a+\xA4a!{V[\x90P_\x81Q\x11\x15a+\xC0W\x80\x80Q\x90` \x01 \x92PPPa,\x03V[_\x82`\x01\x01T\x90P_\x80\x1B\x81\x14a+\xDCW\x80\x93PPPPa,\x03V[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x81Q\x11\x15a,\x18W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[a,m\x81a,[V[\x81\x14a,wW_\x80\xFD[PV[_\x815\x90Pa,\x88\x81a,dV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a,\xA3Wa,\xA2a,SV[[_a,\xB0\x84\x82\x85\x01a,zV[\x91PP\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[a,\xCD\x81a,\xB9V[\x82RPPV[_` \x82\x01\x90Pa,\xE6_\x83\x01\x84a,\xC4V[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a-#W\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa-\x08V[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a-H\x82a,\xECV[a-R\x81\x85a,\xF6V[\x93Pa-b\x81\x85` \x86\x01a-\x06V[a-k\x81a-.V[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra-\x8E\x81\x84a->V[\x90P\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a-\xE8\x82a-\xBFV[\x90P\x91\x90PV[a-\xF8\x81a-\xDEV[\x82RPPV[_a.\t\x83\x83a-\xEFV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a.+\x82a-\x96V[a.5\x81\x85a-\xA0V[\x93Pa.@\x83a-\xB0V[\x80_[\x83\x81\x10\x15a.pW\x81Qa.W\x88\x82a-\xFEV[\x97Pa.b\x83a.\x15V[\x92PP`\x01\x81\x01\x90Pa.CV[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra.\x95\x81\x84a.!V[\x90P\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12a.\xBEWa.\xBDa.\x9DV[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a.\xDBWa.\xDAa.\xA1V[[` \x83\x01\x91P\x83` \x82\x02\x83\x01\x11\x15a.\xF7Wa.\xF6a.\xA5V[[\x92P\x92\x90PV[_\x80\x83`\x1F\x84\x01\x12a/\x13Wa/\x12a.\x9DV[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a/0Wa//a.\xA1V[[` \x83\x01\x91P\x83`\x01\x82\x02\x83\x01\x11\x15a/LWa/Ka.\xA5V[[\x92P\x92\x90PV[_\x80_\x80_\x80_`\x80\x88\x8A\x03\x12\x15a/nWa/ma,SV[[_a/{\x8A\x82\x8B\x01a,zV[\x97PP` \x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a/\x9CWa/\x9Ba,WV[[a/\xA8\x8A\x82\x8B\x01a.\xA9V[\x96P\x96PP`@\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a/\xCBWa/\xCAa,WV[[a/\xD7\x8A\x82\x8B\x01a.\xFEV[\x94P\x94PP``\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a/\xFAWa/\xF9a,WV[[a0\x06\x8A\x82\x8B\x01a.\xFEV[\x92P\x92PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[_\x80_`@\x84\x86\x03\x12\x15a0.Wa0-a,SV[[_a0;\x86\x82\x87\x01a,zV[\x93PP` \x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a0\\Wa0[a,WV[[a0h\x86\x82\x87\x01a.\xFEV[\x92P\x92PP\x92P\x92P\x92V[a0}\x81a-\xDEV[\x81\x14a0\x87W_\x80\xFD[PV[_\x815\x90Pa0\x98\x81a0tV[\x92\x91PPV[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a0\xD8\x82a-.V[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a0\xF7Wa0\xF6a0\xA2V[[\x80`@RPPPV[_a1\ta,JV[\x90Pa1\x15\x82\x82a0\xCFV[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a14Wa13a0\xA2V[[a1=\x82a-.V[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_a1ja1e\x84a1\x1AV[a1\0V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a1\x86Wa1\x85a0\x9EV[[a1\x91\x84\x82\x85a1JV[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a1\xADWa1\xACa.\x9DV[[\x815a1\xBD\x84\x82` \x86\x01a1XV[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a1\xDCWa1\xDBa,SV[[_a1\xE9\x85\x82\x86\x01a0\x8AV[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a2\nWa2\ta,WV[[a2\x16\x85\x82\x86\x01a1\x99V[\x91PP\x92P\x92\x90PV[_\x81\x90P\x91\x90PV[a22\x81a2 V[\x82RPPV[_` \x82\x01\x90Pa2K_\x83\x01\x84a2)V[\x92\x91PPV[_\x7F\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x82\x16\x90P\x91\x90PV[a2\x85\x81a2QV[\x82RPPV[a2\x94\x81a,[V[\x82RPPV[a2\xA3\x81a-\xDEV[\x82RPPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a2\xDB\x81a,[V[\x82RPPV[_a2\xEC\x83\x83a2\xD2V[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a3\x0E\x82a2\xA9V[a3\x18\x81\x85a2\xB3V[\x93Pa3#\x83a2\xC3V[\x80_[\x83\x81\x10\x15a3SW\x81Qa3:\x88\x82a2\xE1V[\x97Pa3E\x83a2\xF8V[\x92PP`\x01\x81\x01\x90Pa3&V[P\x85\x93PPPP\x92\x91PPV[_`\xE0\x82\x01\x90Pa3s_\x83\x01\x8Aa2|V[\x81\x81\x03` \x83\x01Ra3\x85\x81\x89a->V[\x90P\x81\x81\x03`@\x83\x01Ra3\x99\x81\x88a->V[\x90Pa3\xA8``\x83\x01\x87a2\x8BV[a3\xB5`\x80\x83\x01\x86a2\x9AV[a3\xC2`\xA0\x83\x01\x85a2)V[\x81\x81\x03`\xC0\x83\x01Ra3\xD4\x81\x84a3\x04V[\x90P\x98\x97PPPPPPPPV[_\x80_\x80_\x80_`\xA0\x88\x8A\x03\x12\x15a3\xFDWa3\xFCa,SV[[_a4\n\x8A\x82\x8B\x01a,zV[\x97PP` a4\x1B\x8A\x82\x8B\x01a0\x8AV[\x96PP`@a4,\x8A\x82\x8B\x01a0\x8AV[\x95PP``\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a4MWa4La,WV[[a4Y\x8A\x82\x8B\x01a.\xFEV[\x94P\x94PP`\x80\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a4|Wa4{a,WV[[a4\x88\x8A\x82\x8B\x01a.\xFEV[\x92P\x92PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[_\x81\x90P\x92\x91PPV[_a4\xAD\x82a,\xECV[a4\xB7\x81\x85a4\x99V[\x93Pa4\xC7\x81\x85` \x86\x01a-\x06V[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a5\x07`\x02\x83a4\x99V[\x91Pa5\x12\x82a4\xD3V[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a5Q`\x01\x83a4\x99V[\x91Pa5\\\x82a5\x1DV[`\x01\x82\x01\x90P\x91\x90PV[_a5r\x82\x87a4\xA3V[\x91Pa5}\x82a4\xFBV[\x91Pa5\x89\x82\x86a4\xA3V[\x91Pa5\x94\x82a5EV[\x91Pa5\xA0\x82\x85a4\xA3V[\x91Pa5\xAB\x82a5EV[\x91Pa5\xB7\x82\x84a4\xA3V[\x91P\x81\x90P\x95\x94PPPPPV[_` \x82\x01\x90Pa5\xD8_\x83\x01\x84a2\x9AV[\x92\x91PPV[a5\xE7\x81a,\xB9V[\x81\x14a5\xF1W_\x80\xFD[PV[_\x81Q\x90Pa6\x02\x81a5\xDEV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a6\x1DWa6\x1Ca,SV[[_a6*\x84\x82\x85\x01a5\xF4V[\x91PP\x92\x91PPV[_` \x82\x01\x90Pa6F_\x83\x01\x84a2\x8BV[\x92\x91PPV[_\x82\x90P\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\"`\x04R`$_\xFD[_`\x02\x82\x04\x90P`\x01\x82\x16\x80a6\x9AW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a6\xADWa6\xACa6VV[[P\x91\x90PV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_` `\x1F\x83\x01\x04\x90P\x91\x90PV[_\x82\x82\x1B\x90P\x92\x91PPV[_`\x08\x83\x02a7\x0F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82a6\xD4V[a7\x19\x86\x83a6\xD4V[\x95P\x80\x19\x84\x16\x93P\x80\x86\x16\x84\x17\x92PPP\x93\x92PPPV[_\x81\x90P\x91\x90PV[_a7Ta7Oa7J\x84a,[V[a71V[a,[V[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[a7m\x83a7:V[a7\x81a7y\x82a7[V[\x84\x84Ta6\xE0V[\x82UPPPPV[_\x90V[a7\x95a7\x89V[a7\xA0\x81\x84\x84a7dV[PPPV[[\x81\x81\x10\x15a7\xC3Wa7\xB8_\x82a7\x8DV[`\x01\x81\x01\x90Pa7\xA6V[PPV[`\x1F\x82\x11\x15a8\x08Wa7\xD9\x81a6\xB3V[a7\xE2\x84a6\xC5V[\x81\x01` \x85\x10\x15a7\xF1W\x81\x90P[a8\x05a7\xFD\x85a6\xC5V[\x83\x01\x82a7\xA5V[PP[PPPV[_\x82\x82\x1C\x90P\x92\x91PPV[_a8(_\x19\x84`\x08\x02a8\rV[\x19\x80\x83\x16\x91PP\x92\x91PPV[_a8@\x83\x83a8\x19V[\x91P\x82`\x02\x02\x82\x17\x90P\x92\x91PPV[a8Z\x83\x83a6LV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a8sWa8ra0\xA2V[[a8}\x82Ta6\x83V[a8\x88\x82\x82\x85a7\xC7V[_`\x1F\x83\x11`\x01\x81\x14a8\xB5W_\x84\x15a8\xA3W\x82\x87\x015\x90P[a8\xAD\x85\x82a85V[\x86UPa9\x14V[`\x1F\x19\x84\x16a8\xC3\x86a6\xB3V[_[\x82\x81\x10\x15a8\xEAW\x84\x89\x015\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90Pa8\xC5V[\x86\x83\x10\x15a9\x07W\x84\x89\x015a9\x03`\x1F\x89\x16\x82a8\x19V[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x80\xFD[\x82\x81\x837PPPV[_a9E\x83\x85a9\x1DV[\x93P\x7F\x07\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x11\x15a9xWa9wa9-V[[` \x83\x02\x92Pa9\x89\x83\x85\x84a91V[\x82\x84\x01\x90P\x93\x92PPPV[_\x81T\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81Ta9\xDD\x81a6\x83V[a9\xE7\x81\x86a9\xC1V[\x94P`\x01\x82\x16_\x81\x14a:\x01W`\x01\x81\x14a:\x17Wa:IV[`\xFF\x19\x83\x16\x86R\x81\x15\x15` \x02\x86\x01\x93Pa:IV[a: \x85a6\xB3V[_[\x83\x81\x10\x15a:AW\x81T\x81\x89\x01R`\x01\x82\x01\x91P` \x81\x01\x90Pa:\"V[\x80\x88\x01\x95PPP[PPP\x92\x91PPV[_a:]\x83\x83a9\xD1V[\x90P\x92\x91PPV[_`\x01\x82\x01\x90P\x91\x90PV[_a:{\x82a9\x95V[a:\x85\x81\x85a9\x9FV[\x93P\x83` \x82\x02\x85\x01a:\x97\x85a9\xAFV[\x80_[\x85\x81\x10\x15a:\xD1W\x84\x84\x03\x89R\x81a:\xB2\x85\x82a:RV[\x94Pa:\xBD\x83a:eV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90Pa:\x9AV[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_`@\x82\x01\x90P\x81\x81\x03_\x83\x01Ra:\xFC\x81\x85\x87a9:V[\x90P\x81\x81\x03` \x83\x01Ra;\x10\x81\x84a:qV[\x90P\x94\x93PPPPV[_\x80\xFD[_\x80\xFD[_\x81Q\x90Pa;0\x81a0tV[\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a;PWa;Oa0\xA2V[[a;Y\x82a-.V[\x90P` \x81\x01\x90P\x91\x90PV[_a;xa;s\x84a;6V[a1\0V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a;\x94Wa;\x93a0\x9EV[[a;\x9F\x84\x82\x85a-\x06V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a;\xBBWa;\xBAa.\x9DV[[\x81Qa;\xCB\x84\x82` \x86\x01a;fV[\x91PP\x92\x91PPV[_``\x82\x84\x03\x12\x15a;\xE9Wa;\xE8a;\x1AV[[a;\xF3``a1\0V[\x90P_a<\x02\x84\x82\x85\x01a;\"V[_\x83\x01RP` a<\x15\x84\x82\x85\x01a;\"V[` \x83\x01RP`@\x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a<9Wa<8a;\x1EV[[a\x02\x83\x85\x84a1JV[a>\x0B\x83a-.V[\x84\x01\x90P\x93\x92PPPV[_`\x80\x82\x01\x90Pa>)_\x83\x01\x89a2\x9AV[a>6` \x83\x01\x88a2\x9AV[\x81\x81\x03`@\x83\x01Ra>I\x81\x86\x88a=\xEAV[\x90P\x81\x81\x03``\x83\x01Ra>^\x81\x84\x86a=\xEAV[\x90P\x97\x96PPPPPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[_\x81Q\x90P\x91\x90PV[_\x81\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a>\xC4\x81a2 V[\x82RPPV[_a>\xD5\x83\x83a>\xBBV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a>\xF7\x82a>\x98V[a?\x01\x81\x85a>\xA2V[\x93Pa?\x0C\x83a>\xACV[\x80_[\x83\x81\x10\x15a?\xCAV[\x97Pa?.\x83a>\xE1V[\x92PP`\x01\x81\x01\x90Pa?\x0FV[P\x85\x93PPPP\x92\x91PPV[_a?T\x82\x84a>\xEDV[\x91P\x81\x90P\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x81\x90P\x92\x91PPV[_a?}\x82a?_V[a?\x87\x81\x85a?iV[\x93Pa?\x97\x81\x85` \x86\x01a-\x06V[\x80\x84\x01\x91PP\x92\x91PPV[_a?\xAE\x82\x84a?sV[\x91P\x81\x90P\x92\x91PPV[_`\xC0\x82\x01\x90Pa?\xCC_\x83\x01\x89a2)V[a?\xD9` \x83\x01\x88a2)V[a?\xE6`@\x83\x01\x87a2\x9AV[a?\xF3``\x83\x01\x86a2\x9AV[a@\0`\x80\x83\x01\x85a2\x8BV[a@\r`\xA0\x83\x01\x84a2)V[\x97\x96PPPPPPPV[_``\x82\x01\x90Pa@+_\x83\x01\x86a2\x8BV[a@8` \x83\x01\x85a2\x9AV[a@E`@\x83\x01\x84a2\x9AV[\x94\x93PPPPV[_\x81Q\x90Pa@[\x81a,dV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a@vWa@ua,SV[[_a@\x83\x84\x82\x85\x01a@MV[\x91PP\x92\x91PPV[a@\x95\x81a2 V[\x81\x14a@\x9FW_\x80\xFD[PV[_\x81Q\x90Pa@\xB0\x81a@\x8CV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a@\xCBWa@\xCAa,SV[[_a@\xD8\x84\x82\x85\x01a@\xA2V[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[`\x1F\x82\x11\x15aAaWaA2\x81aA\x0EV[aA;\x84a6\xC5V[\x81\x01` \x85\x10\x15aAJW\x81\x90P[aA^aAV\x85a6\xC5V[\x83\x01\x82a7\xA5V[PP[PPPV[aAo\x82a,\xECV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aA\x88WaA\x87a0\xA2V[[aA\x92\x82Ta6\x83V[aA\x9D\x82\x82\x85aA V[_` \x90P`\x1F\x83\x11`\x01\x81\x14aA\xCEW_\x84\x15aA\xBCW\x82\x87\x01Q\x90P[aA\xC6\x85\x82a85V[\x86UPaB-V[`\x1F\x19\x84\x16aA\xDC\x86aA\x0EV[_[\x82\x81\x10\x15aB\x03W\x84\x89\x01Q\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90PaA\xDEV[\x86\x83\x10\x15aB W\x84\x89\x01QaB\x1C`\x1F\x89\x16\x82a8\x19V[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPV[_`\xFF\x82\x16\x90P\x91\x90PV[aBJ\x81aB5V[\x82RPPV[_`\x80\x82\x01\x90PaBc_\x83\x01\x87a2)V[aBp` \x83\x01\x86aBAV[aB}`@\x83\x01\x85a2)V[aB\x8A``\x83\x01\x84a2)V[\x95\x94PPPPPV[_`\xA0\x82\x01\x90PaB\xA6_\x83\x01\x88a2)V[aB\xB3` \x83\x01\x87a2)V[aB\xC0`@\x83\x01\x86a2)V[aB\xCD``\x83\x01\x85a2\x8BV[aB\xDA`\x80\x83\x01\x84a2\x9AV[\x96\x95PPPPPPV\xFECiphertextVerification(bytes32[] ctHandles,address userAddress,address contractAddress,uint256 contractChainId,bytes extraData)", + b"`\xA0`@R0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x80\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP4\x80\x15b\0\0CW_\x80\xFD[Pb\0\0Tb\0\0Z` \x1B` \x1CV[b\0\x01\xC4V[_b\0\0kb\0\x01^` \x1B` \x1CV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15b\0\0\xB6W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14b\0\x01[Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`@Qb\0\x01R\x91\x90b\0\x01\xA9V[`@Q\x80\x91\x03\x90\xA1[PV[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[b\0\x01\xA3\x81b\0\x01\x85V[\x82RPPV[_` \x82\x01\x90Pb\0\x01\xBE_\x83\x01\x84b\0\x01\x98V[\x92\x91PPV[`\x80QaJ\x10b\0\x01\xEB_9_\x81\x81a!\xCC\x01R\x81\x81a\"!\x01Ra$\xC3\x01RaJ\x10_\xF3\xFE`\x80`@R`\x046\x10a\0\xFDW_5`\xE0\x1C\x80cR\xD1\x90-\x11a\0\x94W\x80c\xA7\0I\x96\x11a\0cW\x80c\xA7\0I\x96\x14a\x02\xD5W\x80c\xAD<\xB1\xCC\x14a\x02\xFDW\x80c\xC4\x11Xt\x14a\x03'W\x80c\xCE~BW\x14a\x03=W\x80c\xE9o\x88\xEA\x14a\x03yWa\0\xFDV[\x80cR\xD1\x90-\x14a\x02;W\x80c\\\x97Z\xBB\x14a\x02eW\x80c\x84V\xCBY\x14a\x02\x8FW\x80c\x84\xB0\x19n\x14a\x02\xA5Wa\0\xFDV[\x80c3\x80\x07\xFC\x11a\0\xD0W\x80c3\x80\x07\xFC\x14a\x01\xCBW\x80c9\xF78\x10\x14a\x01\xF3W\x80c?K\xA8:\x14a\x02\tW\x80cO\x1E\xF2\x86\x14a\x02\x1FWa\0\xFDV[\x80c\x0CaX9\x14a\x01\x01W\x80c\r\x8En,\x14a\x01=W\x80c\x1B\xBE\x9F\xAE\x14a\x01gW\x80c1\xBE\xDE\xA3\x14a\x01\xA3W[_\x80\xFD[4\x80\x15a\x01\x0CW_\x80\xFD[Pa\x01'`\x04\x806\x03\x81\x01\x90a\x01\"\x91\x90a1\xB6V[a\x03\xB5V[`@Qa\x014\x91\x90a1\xFBV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01HW_\x80\xFD[Pa\x01Qa\x03\xE9V[`@Qa\x01^\x91\x90a2\x9EV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01rW_\x80\xFD[Pa\x01\x8D`\x04\x806\x03\x81\x01\x90a\x01\x88\x91\x90a1\xB6V[a\x04dV[`@Qa\x01\x9A\x91\x90a3\xA5V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xAEW_\x80\xFD[Pa\x01\xC9`\x04\x806\x03\x81\x01\x90a\x01\xC4\x91\x90a4{V[a\x05\x0EV[\0[4\x80\x15a\x01\xD6W_\x80\xFD[Pa\x01\xF1`\x04\x806\x03\x81\x01\x90a\x01\xEC\x91\x90a5?V[a\nfV[\0[4\x80\x15a\x01\xFEW_\x80\xFD[Pa\x02\x07a\x0F\x13V[\0[4\x80\x15a\x02\x14W_\x80\xFD[Pa\x02\x1Da\x10\xFFV[\0[a\x029`\x04\x806\x03\x81\x01\x90a\x024\x91\x90a6\xEEV[a\x12GV[\0[4\x80\x15a\x02FW_\x80\xFD[Pa\x02Oa\x12fV[`@Qa\x02\\\x91\x90a7`V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02pW_\x80\xFD[Pa\x02ya\x12\x97V[`@Qa\x02\x86\x91\x90a1\xFBV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x9AW_\x80\xFD[Pa\x02\xA3a\x12\xB9V[\0[4\x80\x15a\x02\xB0W_\x80\xFD[Pa\x02\xB9a\x13\xDEV[`@Qa\x02\xCC\x97\x96\x95\x94\x93\x92\x91\x90a8\x88V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xE0W_\x80\xFD[Pa\x02\xFB`\x04\x806\x03\x81\x01\x90a\x02\xF6\x91\x90a9\nV[a\x14\xE7V[\0[4\x80\x15a\x03\x08W_\x80\xFD[Pa\x03\x11a\x184V[`@Qa\x03\x1E\x91\x90a2\x9EV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x032W_\x80\xFD[Pa\x03;a\x18mV[\0[4\x80\x15a\x03HW_\x80\xFD[Pa\x03c`\x04\x806\x03\x81\x01\x90a\x03^\x91\x90a1\xB6V[a\x19\x92V[`@Qa\x03p\x91\x90a3\xA5V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03\x84W_\x80\xFD[Pa\x03\x9F`\x04\x806\x03\x81\x01\x90a\x03\x9A\x91\x90a1\xB6V[a\x1AcV[`@Qa\x03\xAC\x91\x90a1\xFBV[`@Q\x80\x91\x03\x90\xF3[_\x80a\x03\xBFa\x1A\x97V[\x90P\x80`\x07\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[```@Q\x80`@\x01`@R\x80`\x11\x81R` \x01\x7FInputVerification\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x04*_a\x1A\xBEV[a\x044`\x02a\x1A\xBEV[a\x04=_a\x1A\xBEV[`@Q` \x01a\x04P\x94\x93\x92\x91\x90a:\x8FV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x90V[``_a\x04oa\x1A\x97V[\x90P\x80`\n\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x05\x01W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x04\xB8W[PPPPP\x91PP\x91\x90PV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c:Qb\xE6`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x05gW_\x80\xFD[PZ\xF1\x15\x80\x15a\x05yW=_\x80>=_\xFD[PPPP_a\x05\x86a\x1A\x97V[\x90P\x80_\x01T\x88\x11\x80a\x05\x98WP_\x88\x14[\x15a\x05\xDAW\x87`@Q\x7FG\x11\x08?\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05\xD1\x91\x90a:\xEDV[`@Q\x80\x91\x03\x90\xFD[_\x81`\x0B\x01_\x8A\x81R` \x01\x90\x81R` \x01_ T\x90Pa\x05\xFB\x813a\x1B\x88V[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xCD\x8E\x99<\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x06H\x91\x90a:\xEDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06cW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06\x87\x91\x90a;0V[a\x07[W_s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x88\x8B\x99\xE0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x06\xD9\x91\x90a:\xEDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06\xF4W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\x18\x91\x90a;~V[\x90P\x89\x82\x82`@Q\x7F\xC0\xEE\xDB{\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x07R\x93\x92\x91\x90a<\x1CV[`@Q\x80\x91\x03\x90\xFD[_a\x07\xEB\x8A\x8A\x8A\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x84\x88\x88\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa\x1C]V[\x90P_a\x08;\x82\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa\x1D\xFAV[\x90Pa\x08G\x83\x82a\x1E$V[a\x08R\x8B3\x83a\x1E\xF9V[_\x84`\x02\x01_\x8D\x81R` \x01\x90\x81R` \x01_ _\x84\x81R` \x01\x90\x81R` \x01_ \x90P\x80\x89\x89\x90\x91\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x92\x90\x91\x92\x90\x91\x92\x90\x91\x92P\x91\x82a\x08\xB0\x92\x91\x90a>UV[P`\x01\x85`\x05\x01_\x8E\x81R` \x01\x90\x81R` \x01_ _\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x84`\x03\x01_\x8D\x81R` \x01\x90\x81R` \x01_ _\x84\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x84`\x04\x01_\x8D\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\t\xCEWPa\t\xCD\x84\x82\x80T\x90Pa LV[[\x15a\nXW`\x01\x85`\x04\x01_\x8E\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x82\x85`\x06\x01_\x8E\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x83\x8C\x7F\xF9jf\xBB\x08\xCFTP\xF5x\x9DsC\xFA;X\xD4\xA0\nf\xEF-\r\x04\x94\xF4$\xB0;\n\xBF\xF2\x8D\x8D\x85\x8C\x8C`@Qa\nO\x95\x94\x93\x92\x91\x90aA$V[`@Q\x80\x91\x03\x90\xA3[PPPPPPPPPPPPV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c:Qb\xE6`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\n\xBFW_\x80\xFD[PZ\xF1\x15\x80\x15a\n\xD1W=_\x80>=_\xFD[PPPP_a\n\xDEa\x1A\x97V[\x90P\x80_\x01T\x84\x11\x80a\n\xF0WP_\x84\x14[\x15a\x0B2W\x83`@Q\x7FG\x11\x08?\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0B)\x91\x90a:\xEDV[`@Q\x80\x91\x03\x90\xFD[_\x81`\x0B\x01_\x86\x81R` \x01\x90\x81R` \x01_ T\x90Pa\x0BS\x813a\x1B\x88V[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xCD\x8E\x99<\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0B\xA0\x91\x90a:\xEDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0B\xBBW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0B\xDF\x91\x90a;0V[a\x0C\xB3W_s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x88\x8B\x99\xE0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0C1\x91\x90a:\xEDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0CLW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0Cp\x91\x90a;~V[\x90P\x85\x82\x82`@Q\x7F\xF3\"X\x93\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0C\xAA\x93\x92\x91\x90a<\x1CV[`@Q\x80\x91\x03\x90\xFD[_s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x82\n\x91\xF8\x833`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\x03\x92\x91\x90aArV[_`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\x1DW=_\x80>=_\xFD[PPPP`@Q=_\x82>=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\rE\x91\x90aC\0V[\x90P_\x81`@\x01Q\x90Pa\rZ\x873\x83a\x1E\xF9V[\x83`\x08\x01_\x88\x81R` \x01\x90\x81R` \x01_ _\x81T\x80\x92\x91\x90a\r}\x90aCtV[\x91\x90PUP`\x01\x84`\t\x01_\x89\x81R` \x01\x90\x81R` \x01_ _\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x83`\n\x01_\x88\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x83`\x07\x01_\x88\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x0E\x9FWPa\x0E\x9E\x83\x85`\x08\x01_\x8A\x81R` \x01\x90\x81R` \x01_ Ta LV[[\x15a\x0F\nW`\x01\x84`\x07\x01_\x89\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x86\x7FoK\x13vySl`\x81\xC7\xF0$\x87\x03'\xAA\x89\xB6*d\x18/-A\xE4\xFB\xDE\xE5\xE2$\x8E\x86\x87\x87`@Qa\x0F\x01\x92\x91\x90aC\xBBV[`@Q\x80\x91\x03\x90\xA2[PPPPPPPV[`\x01a\x0F\x1Da \xE9V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x0F^W`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03_a\x0Fia!\rV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x0F\xB1WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x0F\xE8W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UPa\x10\xA1`@Q\x80`@\x01`@R\x80`\x11\x81R` \x01\x7FInputVerification\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP`@Q\x80`@\x01`@R\x80`\x01\x81R` \x01\x7F1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RPa!4V[a\x10\xA9a!JV[_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x10\xF3\x91\x90aC\xFFV[`@Q\x80\x91\x03\x90\xA1PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11\\W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11\x80\x91\x90aD\x18V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15\x80\x15a\x11\xFBWPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x12=W3`@Q\x7F\xE1\x91f\xEE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x124\x91\x90aDCV[`@Q\x80\x91\x03\x90\xFD[a\x12Ea!\\V[V[a\x12Oa!\xCAV[a\x12X\x82a\"\xB0V[a\x12b\x82\x82a#\xA3V[PPV[_a\x12oa$\xC1V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[_\x80a\x12\xA1a%HV[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x90V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cF\xFB\xF6\x8E3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x13\x06\x91\x90aDCV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x13!W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13E\x91\x90a;0V[\x15\x80\x15a\x13\x92WPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x13\xD4W3`@Q\x7F8\x89\x16\xBB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x13\xCB\x91\x90aDCV[`@Q\x80\x91\x03\x90\xFD[a\x13\xDCa%oV[V[_``\x80_\x80_``_a\x13\xF0a%\xDEV[\x90P_\x80\x1B\x81_\x01T\x14\x80\x15a\x14\x0BWP_\x80\x1B\x81`\x01\x01T\x14[a\x14JW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14A\x90aD\xA6V[`@Q\x80\x91\x03\x90\xFD[a\x14Ra&\x05V[a\x14Za&\xA3V[F0_\x80\x1B_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x14yWa\x14xa5\xCAV[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x14\xA7W\x81` \x01` \x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x7F\x0F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95\x94\x93\x92\x91\x90\x97P\x97P\x97P\x97P\x97P\x97P\x97PP\x90\x91\x92\x93\x94\x95\x96V[\x86s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x155\x91\x90a:\xEDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x15PW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x15t\x91\x90a;0V[a\x15\xB5W\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x15\xAC\x91\x90a:\xEDV[`@Q\x80\x91\x03\x90\xFD[a\x15\xBDa'AV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c:Qb\xE6`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x16\x16W_\x80\xFD[PZ\xF1\x15\x80\x15a\x16(W=_\x80>=_\xFD[PPPP_a\x165a\x1A\x97V[\x90P\x80_\x01_\x81T\x80\x92\x91\x90a\x16J\x90aCtV[\x91\x90PUP_\x81_\x01T\x90P`@Q\x80``\x01`@R\x80\x8B\x81R` \x01\x8As\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x89s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP\x82`\x01\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01U` \x82\x01Q\x81`\x01\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x02\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x90PP_s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x99\x1D\xC3m`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17\xA5W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x17\xC9\x91\x90aD\xD8V[\x90P\x80\x83`\x0B\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x8A\x81\x83\x7F\xE2\xCA\xFA\x1B\x82C1\x1C\x08(\x83<}\xDF\x93V\xC9*Q\xA2$k\xCFh\xE1?\"\xB1]\xEF\xDD\x99\x8D\x8D\x8D\x8D\x8D\x8D`@Qa\x18\x1F\x96\x95\x94\x93\x92\x91\x90aE\x03V[`@Q\x80\x91\x03\x90\xA4PPPPPPPPPPPV[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[`\x03_a\x18xa!\rV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x18\xC0WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x18\xF7W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x19\x86\x91\x90aC\xFFV[`@Q\x80\x91\x03\x90\xA1PPV[``_a\x19\x9Da\x1A\x97V[\x90P_\x81`\x06\x01_\x85\x81R` \x01\x90\x81R` \x01_ T\x90P\x81`\x03\x01_\x85\x81R` \x01\x90\x81R` \x01_ _\x82\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x1AUW` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x1A\x0CW[PPPPP\x92PPP\x91\x90PV[_\x80a\x1Ama\x1A\x97V[\x90P\x80`\x04\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x7FED\x16\\\xE1e2d\xFD\xCB\t\xB0)\x89\x1E=L\x8D\x85\x83Hh!\x17/\x88.\x19\xA1I\xA8\0\x90P\x90V[``_`\x01a\x1A\xCC\x84a'\x82V[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1A\xEAWa\x1A\xE9a5\xCAV[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x1B\x1CW\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a\x1B}W\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a\x1BrWa\x1BqaEXV[[\x04\x94P_\x85\x03a\x1B)W[\x81\x93PPPP\x91\x90PV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x86%\xE8v\x83\x83`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1B\xD7\x92\x91\x90aArV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1B\xF2W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1C\x16\x91\x90a;0V[a\x1CYW\x81\x81`@Q\x7F)\xA9\x93\xC1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1CP\x92\x91\x90aArV[`@Q\x80\x91\x03\x90\xFD[PPV[_\x80a\x1Cga\x1A\x97V[\x90P_\x81`\x01\x01_\x88\x81R` \x01\x90\x81R` \x01_ `@Q\x80``\x01`@R\x90\x81_\x82\x01T\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RPP\x90Pa\x1D\xEE`@Q\x80`\xC0\x01`@R\x80`\x9C\x81R` \x01aIt`\x9C\x919\x80Q\x90` \x01 \x87`@Q` \x01a\x1Dq\x91\x90aF6V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x83`@\x01Q\x84` \x01Q\x85_\x01Q\x8A\x8A`@Q` \x01a\x1D\xA7\x91\x90aF\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a\x1D\xD3\x97\x96\x95\x94\x93\x92\x91\x90aF\xA6V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 a(\xD3V[\x92PPP\x94\x93PPPPV[_\x80_\x80a\x1E\x08\x86\x86a(\xECV[\x92P\x92P\x92Pa\x1E\x18\x82\x82a)AV[\x82\x93PPPP\x92\x91PPV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xCD\xBBZ\x82\x83\x83`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1Es\x92\x91\x90aArV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1E\x8EW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1E\xB2\x91\x90a;0V[a\x1E\xF5W\x81\x81`@Q\x7FUO\x8C_\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1E\xEC\x92\x91\x90aArV[`@Q\x80\x91\x03\x90\xFD[PPV[_a\x1F\x02a\x1A\x97V[\x90P\x80`\x05\x01_\x85\x81R` \x01\x90\x81R` \x01_ _\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\x1F\xA5W\x83\x83\x83`@Q\x7F\xF9\xEDC\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1F\x9C\x93\x92\x91\x90aG\x13V[`@Q\x80\x91\x03\x90\xFD[\x80`\t\x01_\x85\x81R` \x01\x90\x81R` \x01_ _\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a FW\x83\x83\x83`@Q\x7F/\xA71t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a =\x93\x92\x91\x90aG\x13V[`@Q\x80\x91\x03\x90\xFD[PPPPV[_\x80s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xF8\x81t\xEA\x85`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a \x9B\x91\x90a:\xEDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a \xB6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a \xDA\x91\x90aD\xD8V[\x90P\x80\x83\x10\x15\x91PP\x92\x91PPV[_a \xF2a!\rV[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[a!=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a#1\x91\x90aD\x18V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a#\xA0W3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a#\x97\x91\x90aDCV[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a$\x0BWP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a$\x08\x91\x90aGrV[`\x01[a$LW\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a$C\x91\x90aDCV[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a$\xB2W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a$\xA9\x91\x90a7`V[`@Q\x80\x91\x03\x90\xFD[a$\xBC\x83\x83a+\xFEV[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a%FW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x7F\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\x90P\x90V[a%wa'AV[_a%\x80a%HV[\x90P`\x01\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2Xa%\xC6a+\xA4V[`@Qa%\xD3\x91\x90aDCV[`@Q\x80\x91\x03\x90\xA1PV[_\x7F\xA1jF\xD9Ba\xC7Q|\xC8\xFF\x89\xF6\x1C\x0C\xE95\x98\xE3\xC8I\x80\x10\x11\xDE\xE6I\xA6\xA5W\xD1\0\x90P\x90V[``_a&\x10a%\xDEV[\x90P\x80`\x02\x01\x80Ta&!\x90a<\x88V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta&M\x90a<\x88V[\x80\x15a&\x98W\x80`\x1F\x10a&oWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a&\x98V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a&{W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[``_a&\xAEa%\xDEV[\x90P\x80`\x03\x01\x80Ta&\xBF\x90a<\x88V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta&\xEB\x90a<\x88V[\x80\x15a'6W\x80`\x1F\x10a'\rWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a'6V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a'\x19W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[a'Ia\x12\x97V[\x15a'\x80W`@Q\x7F\xD9<\x06e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a'\xDEWz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a'\xD4Wa'\xD3aEXV[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a(\x1BWm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a(\x11Wa(\x10aEXV[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a(JWf#\x86\xF2o\xC1\0\0\x83\x81a(@Wa(?aEXV[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a(sWc\x05\xF5\xE1\0\x83\x81a(iWa(haEXV[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a(\x98Wa'\x10\x83\x81a(\x8EWa(\x8DaEXV[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a(\xBBW`d\x83\x81a(\xB1Wa(\xB0aEXV[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a(\xCAW`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a(\xE5a(\xDFa,pV[\x83a,~V[\x90P\x91\x90PV[_\x80_`A\x84Q\x03a),W_\x80_` \x87\x01Q\x92P`@\x87\x01Q\x91P``\x87\x01Q_\x1A\x90Pa)\x1E\x88\x82\x85\x85a,\xBEV[\x95P\x95P\x95PPPPa):V[_`\x02\x85Q_\x1B\x92P\x92P\x92P[\x92P\x92P\x92V[_`\x03\x81\x11\x15a)TWa)Sa;\xA9V[[\x82`\x03\x81\x11\x15a)gWa)fa;\xA9V[[\x03\x15a*\x9FW`\x01`\x03\x81\x11\x15a)\x81Wa)\x80a;\xA9V[[\x82`\x03\x81\x11\x15a)\x94Wa)\x93a;\xA9V[[\x03a)\xCBW`@Q\x7F\xF6E\xEE\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02`\x03\x81\x11\x15a)\xDFWa)\xDEa;\xA9V[[\x82`\x03\x81\x11\x15a)\xF2Wa)\xF1a;\xA9V[[\x03a*6W\x80_\x1C`@Q\x7F\xFC\xE6\x98\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a*-\x91\x90a:\xEDV[`@Q\x80\x91\x03\x90\xFD[`\x03\x80\x81\x11\x15a*IWa*Ha;\xA9V[[\x82`\x03\x81\x11\x15a*\\Wa*[a;\xA9V[[\x03a*\x9EW\x80`@Q\x7F\xD7\x8B\xCE\x0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a*\x95\x91\x90a7`V[`@Q\x80\x91\x03\x90\xFD[[PPV[a*\xABa-\xA5V[a*\xE1W`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a*\xEBa*\xA3V[_a*\xF4a%\xDEV[\x90P\x82\x81`\x02\x01\x90\x81a+\x07\x91\x90aG\xF5V[P\x81\x81`\x03\x01\x90\x81a+\x19\x91\x90aG\xF5V[P_\x80\x1B\x81_\x01\x81\x90UP_\x80\x1B\x81`\x01\x01\x81\x90UPPPPV[a+ v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba-\xC3V[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a,\x07\x82a-\xCCV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a,cWa,]\x82\x82a.\x95V[Pa,lV[a,ka/\x15V[[PPV[_a,ya/QV[\x90P\x90V[_`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x83`\x02\x82\x01R\x82`\"\x82\x01R`B\x81 \x91PP\x92\x91PPV[_\x80_\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84_\x1C\x11\x15a,\xFAW_`\x03\x85\x92P\x92P\x92Pa-\x9BV[_`\x01\x88\x88\x88\x88`@Q_\x81R` \x01`@R`@Qa-\x1D\x94\x93\x92\x91\x90aH\xDFV[` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a-=W=_\x80>=_\xFD[PPP` `@Q\x03Q\x90P_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a-\x8EW_`\x01_\x80\x1B\x93P\x93P\x93PPa-\x9BV[\x80_\x80_\x1B\x93P\x93P\x93PP[\x94P\x94P\x94\x91PPV[_a-\xAEa!\rV[_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x90P\x90V[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a.'W\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a.\x1E\x91\x90aDCV[`@Q\x80\x91\x03\x90\xFD[\x80a.S\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba-\xC3V[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa.\xBE\x91\x90aF\x90V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a.\xF6W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a.\xFBV[``\x91P[P\x91P\x91Pa/\x0B\x85\x83\x83a/\xB4V[\x92PPP\x92\x91PPV[_4\x11\x15a/OW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x7F\x8Bs\xC3\xC6\x9B\xB8\xFE=Q.\xCCL\xF7Y\xCCy#\x9F{\x17\x9B\x0F\xFA\xCA\xA9\xA7]R+9@\x0Fa/{a0AV[a/\x83a0\xB7V[F0`@Q` \x01a/\x99\x95\x94\x93\x92\x91\x90aI\"V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x90V[``\x82a/\xC9Wa/\xC4\x82a1.V[a09V[_\x82Q\x14\x80\x15a/\xEFWP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a01W\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a0(\x91\x90aDCV[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa0:V[[\x93\x92PPPV[_\x80a0Ka%\xDEV[\x90P_a0Va&\x05V[\x90P_\x81Q\x11\x15a0rW\x80\x80Q\x90` \x01 \x92PPPa0\xB4V[_\x82_\x01T\x90P_\x80\x1B\x81\x14a0\x8DW\x80\x93PPPPa0\xB4V[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x80a0\xC1a%\xDEV[\x90P_a0\xCCa&\xA3V[\x90P_\x81Q\x11\x15a0\xE8W\x80\x80Q\x90` \x01 \x92PPPa1+V[_\x82`\x01\x01T\x90P_\x80\x1B\x81\x14a1\x04W\x80\x93PPPPa1+V[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x81Q\x11\x15a1@W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[a1\x95\x81a1\x83V[\x81\x14a1\x9FW_\x80\xFD[PV[_\x815\x90Pa1\xB0\x81a1\x8CV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a1\xCBWa1\xCAa1{V[[_a1\xD8\x84\x82\x85\x01a1\xA2V[\x91PP\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[a1\xF5\x81a1\xE1V[\x82RPPV[_` \x82\x01\x90Pa2\x0E_\x83\x01\x84a1\xECV[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a2KW\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa20V[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a2p\x82a2\x14V[a2z\x81\x85a2\x1EV[\x93Pa2\x8A\x81\x85` \x86\x01a2.V[a2\x93\x81a2VV[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra2\xB6\x81\x84a2fV[\x90P\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a3\x10\x82a2\xE7V[\x90P\x91\x90PV[a3 \x81a3\x06V[\x82RPPV[_a31\x83\x83a3\x17V[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a3S\x82a2\xBEV[a3]\x81\x85a2\xC8V[\x93Pa3h\x83a2\xD8V[\x80_[\x83\x81\x10\x15a3\x98W\x81Qa3\x7F\x88\x82a3&V[\x97Pa3\x8A\x83a3=V[\x92PP`\x01\x81\x01\x90Pa3kV[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra3\xBD\x81\x84a3IV[\x90P\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12a3\xE6Wa3\xE5a3\xC5V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a4\x03Wa4\x02a3\xC9V[[` \x83\x01\x91P\x83` \x82\x02\x83\x01\x11\x15a4\x1FWa4\x1Ea3\xCDV[[\x92P\x92\x90PV[_\x80\x83`\x1F\x84\x01\x12a4;Wa4:a3\xC5V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a4XWa4Wa3\xC9V[[` \x83\x01\x91P\x83`\x01\x82\x02\x83\x01\x11\x15a4tWa4sa3\xCDV[[\x92P\x92\x90PV[_\x80_\x80_\x80_`\x80\x88\x8A\x03\x12\x15a4\x96Wa4\x95a1{V[[_a4\xA3\x8A\x82\x8B\x01a1\xA2V[\x97PP` \x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a4\xC4Wa4\xC3a1\x7FV[[a4\xD0\x8A\x82\x8B\x01a3\xD1V[\x96P\x96PP`@\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a4\xF3Wa4\xF2a1\x7FV[[a4\xFF\x8A\x82\x8B\x01a4&V[\x94P\x94PP``\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a5\"Wa5!a1\x7FV[[a5.\x8A\x82\x8B\x01a4&V[\x92P\x92PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[_\x80_`@\x84\x86\x03\x12\x15a5VWa5Ua1{V[[_a5c\x86\x82\x87\x01a1\xA2V[\x93PP` \x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a5\x84Wa5\x83a1\x7FV[[a5\x90\x86\x82\x87\x01a4&V[\x92P\x92PP\x92P\x92P\x92V[a5\xA5\x81a3\x06V[\x81\x14a5\xAFW_\x80\xFD[PV[_\x815\x90Pa5\xC0\x81a5\x9CV[\x92\x91PPV[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a6\0\x82a2VV[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a6\x1FWa6\x1Ea5\xCAV[[\x80`@RPPPV[_a61a1rV[\x90Pa6=\x82\x82a5\xF7V[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a6\\Wa6[a5\xCAV[[a6e\x82a2VV[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_a6\x92a6\x8D\x84a6BV[a6(V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a6\xAEWa6\xADa5\xC6V[[a6\xB9\x84\x82\x85a6rV[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a6\xD5Wa6\xD4a3\xC5V[[\x815a6\xE5\x84\x82` \x86\x01a6\x80V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a7\x04Wa7\x03a1{V[[_a7\x11\x85\x82\x86\x01a5\xB2V[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a72Wa71a1\x7FV[[a7>\x85\x82\x86\x01a6\xC1V[\x91PP\x92P\x92\x90PV[_\x81\x90P\x91\x90PV[a7Z\x81a7HV[\x82RPPV[_` \x82\x01\x90Pa7s_\x83\x01\x84a7QV[\x92\x91PPV[_\x7F\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x82\x16\x90P\x91\x90PV[a7\xAD\x81a7yV[\x82RPPV[a7\xBC\x81a1\x83V[\x82RPPV[a7\xCB\x81a3\x06V[\x82RPPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a8\x03\x81a1\x83V[\x82RPPV[_a8\x14\x83\x83a7\xFAV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a86\x82a7\xD1V[a8@\x81\x85a7\xDBV[\x93Pa8K\x83a7\xEBV[\x80_[\x83\x81\x10\x15a8{W\x81Qa8b\x88\x82a8\tV[\x97Pa8m\x83a8 V[\x92PP`\x01\x81\x01\x90Pa8NV[P\x85\x93PPPP\x92\x91PPV[_`\xE0\x82\x01\x90Pa8\x9B_\x83\x01\x8Aa7\xA4V[\x81\x81\x03` \x83\x01Ra8\xAD\x81\x89a2fV[\x90P\x81\x81\x03`@\x83\x01Ra8\xC1\x81\x88a2fV[\x90Pa8\xD0``\x83\x01\x87a7\xB3V[a8\xDD`\x80\x83\x01\x86a7\xC2V[a8\xEA`\xA0\x83\x01\x85a7QV[\x81\x81\x03`\xC0\x83\x01Ra8\xFC\x81\x84a8,V[\x90P\x98\x97PPPPPPPPV[_\x80_\x80_\x80_`\xA0\x88\x8A\x03\x12\x15a9%Wa9$a1{V[[_a92\x8A\x82\x8B\x01a1\xA2V[\x97PP` a9C\x8A\x82\x8B\x01a5\xB2V[\x96PP`@a9T\x8A\x82\x8B\x01a5\xB2V[\x95PP``\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a9uWa9ta1\x7FV[[a9\x81\x8A\x82\x8B\x01a4&V[\x94P\x94PP`\x80\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a9\xA4Wa9\xA3a1\x7FV[[a9\xB0\x8A\x82\x8B\x01a4&V[\x92P\x92PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[_\x81\x90P\x92\x91PPV[_a9\xD5\x82a2\x14V[a9\xDF\x81\x85a9\xC1V[\x93Pa9\xEF\x81\x85` \x86\x01a2.V[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a:/`\x02\x83a9\xC1V[\x91Pa::\x82a9\xFBV[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a:y`\x01\x83a9\xC1V[\x91Pa:\x84\x82a:EV[`\x01\x82\x01\x90P\x91\x90PV[_a:\x9A\x82\x87a9\xCBV[\x91Pa:\xA5\x82a:#V[\x91Pa:\xB1\x82\x86a9\xCBV[\x91Pa:\xBC\x82a:mV[\x91Pa:\xC8\x82\x85a9\xCBV[\x91Pa:\xD3\x82a:mV[\x91Pa:\xDF\x82\x84a9\xCBV[\x91P\x81\x90P\x95\x94PPPPPV[_` \x82\x01\x90Pa;\0_\x83\x01\x84a7\xB3V[\x92\x91PPV[a;\x0F\x81a1\xE1V[\x81\x14a;\x19W_\x80\xFD[PV[_\x81Q\x90Pa;*\x81a;\x06V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a;EWa;Da1{V[[_a;R\x84\x82\x85\x01a;\x1CV[\x91PP\x92\x91PPV[`\x08\x81\x10a;gW_\x80\xFD[PV[_\x81Q\x90Pa;x\x81a;[V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a;\x93Wa;\x92a1{V[[_a;\xA0\x84\x82\x85\x01a;jV[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[`\x08\x81\x10a;\xE7Wa;\xE6a;\xA9V[[PV[_\x81\x90Pa;\xF7\x82a;\xD6V[\x91\x90PV[_a<\x06\x82a;\xEAV[\x90P\x91\x90PV[a<\x16\x81a;\xFCV[\x82RPPV[_``\x82\x01\x90Pa\rWa=\xDE\x81a<\xB8V[a=\xE7\x84a<\xCAV[\x81\x01` \x85\x10\x15a=\xF6W\x81\x90P[a>\na>\x02\x85a<\xCAV[\x83\x01\x82a=\xAAV[PP[PPPV[_\x82\x82\x1C\x90P\x92\x91PPV[_a>-_\x19\x84`\x08\x02a>\x12V[\x19\x80\x83\x16\x91PP\x92\x91PPV[_a>E\x83\x83a>\x1EV[\x91P\x82`\x02\x02\x82\x17\x90P\x92\x91PPV[a>_\x83\x83axWa>wa5\xCAV[[a>\x82\x82Ta<\x88V[a>\x8D\x82\x82\x85a=\xCCV[_`\x1F\x83\x11`\x01\x81\x14a>\xBAW_\x84\x15a>\xA8W\x82\x87\x015\x90P[a>\xB2\x85\x82a>:V[\x86UPa?\x19V[`\x1F\x19\x84\x16a>\xC8\x86a<\xB8V[_[\x82\x81\x10\x15a>\xEFW\x84\x89\x015\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90Pa>\xCAV[\x86\x83\x10\x15a?\x0CW\x84\x89\x015a?\x08`\x1F\x89\x16\x82a>\x1EV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x80\xFD[\x82\x81\x837PPPV[_a?J\x83\x85a?\"V[\x93P\x7F\x07\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x11\x15a?}Wa?|a?2V[[` \x83\x02\x92Pa?\x8E\x83\x85\x84a?6V[\x82\x84\x01\x90P\x93\x92PPPV[_\x81T\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81Ta?\xE2\x81a<\x88V[a?\xEC\x81\x86a?\xC6V[\x94P`\x01\x82\x16_\x81\x14a@\x06W`\x01\x81\x14a@\x1CWa@NV[`\xFF\x19\x83\x16\x86R\x81\x15\x15` \x02\x86\x01\x93Pa@NV[a@%\x85a<\xB8V[_[\x83\x81\x10\x15a@FW\x81T\x81\x89\x01R`\x01\x82\x01\x91P` \x81\x01\x90Pa@'V[\x80\x88\x01\x95PPP[PPP\x92\x91PPV[_a@b\x83\x83a?\xD6V[\x90P\x92\x91PPV[_`\x01\x82\x01\x90P\x91\x90PV[_a@\x80\x82a?\x9AV[a@\x8A\x81\x85a?\xA4V[\x93P\x83` \x82\x02\x85\x01a@\x9C\x85a?\xB4V[\x80_[\x85\x81\x10\x15a@\xD6W\x84\x84\x03\x89R\x81a@\xB7\x85\x82a@WV[\x94Pa@\xC2\x83a@jV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90Pa@\x9FV[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aA\x03\x83\x85a@\xE8V[\x93PaA\x10\x83\x85\x84a6rV[aA\x19\x83a2VV[\x84\x01\x90P\x93\x92PPPV[_``\x82\x01\x90P\x81\x81\x03_\x83\x01RaA=\x81\x87\x89a??V[\x90P\x81\x81\x03` \x83\x01RaAQ\x81\x86a@vV[\x90P\x81\x81\x03`@\x83\x01RaAf\x81\x84\x86a@\xF8V[\x90P\x96\x95PPPPPPV[_`@\x82\x01\x90PaA\x85_\x83\x01\x85a7\xB3V[aA\x92` \x83\x01\x84a7\xC2V[\x93\x92PPPV[_\x80\xFD[_\x80\xFD[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aA\xBBWaA\xBAa5\xCAV[[aA\xC4\x82a2VV[\x90P` \x81\x01\x90P\x91\x90PV[_aA\xE3aA\xDE\x84aA\xA1V[a6(V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15aA\xFFWaA\xFEa5\xC6V[[aB\n\x84\x82\x85a2.V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aB&WaB%a3\xC5V[[\x81QaB6\x84\x82` \x86\x01aA\xD1V[\x91PP\x92\x91PPV[_\x81Q\x90PaBM\x81a5\x9CV[\x92\x91PPV[_`\x80\x82\x84\x03\x12\x15aBhWaBgaA\x99V[[aBr`\x80a6(V[\x90P_\x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aB\x91WaB\x90aA\x9DV[[aB\x9D\x84\x82\x85\x01aB\x12V[_\x83\x01RP` aB\xB0\x84\x82\x85\x01aB?V[` \x83\x01RP`@aB\xC4\x84\x82\x85\x01aB?V[`@\x83\x01RP``\x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aB\xE8WaB\xE7aA\x9DV[[aB\xF4\x84\x82\x85\x01aB\x12V[``\x83\x01RP\x92\x91PPV[_` \x82\x84\x03\x12\x15aC\x15WaC\x14a1{V[[_\x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aC2WaC1a1\x7FV[[aC>\x84\x82\x85\x01aBSV[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_aC~\x82a1\x83V[\x91P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x03aC\xB0WaC\xAFaCGV[[`\x01\x82\x01\x90P\x91\x90PV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaC\xD4\x81\x84\x86a@\xF8V[\x90P\x93\x92PPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[aC\xF9\x81aC\xDDV[\x82RPPV[_` \x82\x01\x90PaD\x12_\x83\x01\x84aC\xF0V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aD-WaD,a1{V[[_aD:\x84\x82\x85\x01aB?V[\x91PP\x92\x91PPV[_` \x82\x01\x90PaDV_\x83\x01\x84a7\xC2V[\x92\x91PPV[\x7FEIP712: Uninitialized\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aD\x90`\x15\x83a2\x1EV[\x91PaD\x9B\x82aD\\V[` \x82\x01\x90P\x91\x90PV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaD\xBD\x81aD\x84V[\x90P\x91\x90PV[_\x81Q\x90PaD\xD2\x81a1\x8CV[\x92\x91PPV[_` \x82\x84\x03\x12\x15aD\xEDWaD\xECa1{V[[_aD\xFA\x84\x82\x85\x01aD\xC4V[\x91PP\x92\x91PPV[_`\x80\x82\x01\x90PaE\x16_\x83\x01\x89a7\xC2V[aE#` \x83\x01\x88a7\xC2V[\x81\x81\x03`@\x83\x01RaE6\x81\x86\x88a@\xF8V[\x90P\x81\x81\x03``\x83\x01RaEK\x81\x84\x86a@\xF8V[\x90P\x97\x96PPPPPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[_\x81Q\x90P\x91\x90PV[_\x81\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[aE\xB1\x81a7HV[\x82RPPV[_aE\xC2\x83\x83aE\xA8V[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aE\xE4\x82aE\x85V[aE\xEE\x81\x85aE\x8FV[\x93PaE\xF9\x83aE\x99V[\x80_[\x83\x81\x10\x15aF)W\x81QaF\x10\x88\x82aE\xB7V[\x97PaF\x1B\x83aE\xCEV[\x92PP`\x01\x81\x01\x90PaE\xFCV[P\x85\x93PPPP\x92\x91PPV[_aFA\x82\x84aE\xDAV[\x91P\x81\x90P\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x81\x90P\x92\x91PPV[_aFj\x82aFLV[aFt\x81\x85aFVV[\x93PaF\x84\x81\x85` \x86\x01a2.V[\x80\x84\x01\x91PP\x92\x91PPV[_aF\x9B\x82\x84aF`V[\x91P\x81\x90P\x92\x91PPV[_`\xE0\x82\x01\x90PaF\xB9_\x83\x01\x8Aa7QV[aF\xC6` \x83\x01\x89a7QV[aF\xD3`@\x83\x01\x88a7\xC2V[aF\xE0``\x83\x01\x87a7\xC2V[aF\xED`\x80\x83\x01\x86a7\xB3V[aF\xFA`\xA0\x83\x01\x85a7\xB3V[aG\x07`\xC0\x83\x01\x84a7QV[\x98\x97PPPPPPPPV[_``\x82\x01\x90PaG&_\x83\x01\x86a7\xB3V[aG3` \x83\x01\x85a7\xC2V[aG@`@\x83\x01\x84a7\xC2V[\x94\x93PPPPV[aGQ\x81a7HV[\x81\x14aG[W_\x80\xFD[PV[_\x81Q\x90PaGl\x81aGHV[\x92\x91PPV[_` \x82\x84\x03\x12\x15aG\x87WaG\x86a1{V[[_aG\x94\x84\x82\x85\x01aG^V[\x91PP\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[`\x1F\x82\x11\x15aG\xF0WaG\xC1\x81aG\x9DV[aG\xCA\x84a<\xCAV[\x81\x01` \x85\x10\x15aG\xD9W\x81\x90P[aG\xEDaG\xE5\x85a<\xCAV[\x83\x01\x82a=\xAAV[PP[PPPV[aG\xFE\x82a2\x14V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aH\x17WaH\x16a5\xCAV[[aH!\x82Ta<\x88V[aH,\x82\x82\x85aG\xAFV[_` \x90P`\x1F\x83\x11`\x01\x81\x14aH]W_\x84\x15aHKW\x82\x87\x01Q\x90P[aHU\x85\x82a>:V[\x86UPaH\xBCV[`\x1F\x19\x84\x16aHk\x86aG\x9DV[_[\x82\x81\x10\x15aH\x92W\x84\x89\x01Q\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90PaHmV[\x86\x83\x10\x15aH\xAFW\x84\x89\x01QaH\xAB`\x1F\x89\x16\x82a>\x1EV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPV[_`\xFF\x82\x16\x90P\x91\x90PV[aH\xD9\x81aH\xC4V[\x82RPPV[_`\x80\x82\x01\x90PaH\xF2_\x83\x01\x87a7QV[aH\xFF` \x83\x01\x86aH\xD0V[aI\x0C`@\x83\x01\x85a7QV[aI\x19``\x83\x01\x84a7QV[\x95\x94PPPPPV[_`\xA0\x82\x01\x90PaI5_\x83\x01\x88a7QV[aIB` \x83\x01\x87a7QV[aIO`@\x83\x01\x86a7QV[aI\\``\x83\x01\x85a7\xB3V[aIi`\x80\x83\x01\x84a7\xC2V[\x96\x95PPPPPPV\xFECiphertextVerification(bytes32[] ctHandles,address userAddress,address contractAddress,uint256 contractChainId,uint256 coprocessorContextId,bytes extraData)", ); /// The runtime bytecode of the contract, as deployed on the network. /// /// ```text - ///0x6080604052600436106100f2575f3560e01c806352d1902d11610089578063a700499611610058578063a7004996146102ca578063ad3cb1cc146102f2578063ce7e42571461031c578063e96f88ea14610358576100f2565b806352d1902d146102305780635c975abb1461025a5780638456cb591461028457806384b0196e1461029a576100f2565b8063338007fc116100c5578063338007fc146101c057806339f73810146101e85780633f4ba83a146101fe5780634f1ef28614610214576100f2565b80630c615839146100f65780630d8e6e2c146101325780631bbe9fae1461015c57806331bedea314610198575b5f80fd5b348015610101575f80fd5b5061011c60048036038101906101179190612c8e565b610394565b6040516101299190612cd3565b60405180910390f35b34801561013d575f80fd5b506101466103c8565b6040516101539190612d76565b60405180910390f35b348015610167575f80fd5b50610182600480360381019061017d9190612c8e565b610443565b60405161018f9190612e7d565b60405180910390f35b3480156101a3575f80fd5b506101be60048036038101906101b99190612f53565b6104ed565b005b3480156101cb575f80fd5b506101e660048036038101906101e19190613017565b610a4e565b005b3480156101f3575f80fd5b506101fc610dc7565b005b348015610209575f80fd5b50610212610fb3565b005b61022e600480360381019061022991906131c6565b6110fb565b005b34801561023b575f80fd5b5061024461111a565b6040516102519190613238565b60405180910390f35b348015610265575f80fd5b5061026e61114b565b60405161027b9190612cd3565b60405180910390f35b34801561028f575f80fd5b5061029861116d565b005b3480156102a5575f80fd5b506102ae611292565b6040516102c19796959493929190613360565b60405180910390f35b3480156102d5575f80fd5b506102f060048036038101906102eb91906133e2565b61139b565b005b3480156102fd575f80fd5b506103066115f5565b6040516103139190612d76565b60405180910390f35b348015610327575f80fd5b50610342600480360381019061033d9190612c8e565b61162e565b60405161034f9190612e7d565b60405180910390f35b348015610363575f80fd5b5061037e60048036038101906103799190612c8e565b6116ff565b60405161038b9190612cd3565b60405180910390f35b5f8061039e611733565b9050806007015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b60606040518060400160405280601181526020017f496e707574566572696669636174696f6e0000000000000000000000000000008152506104095f61175a565b610413600161175a565b61041c5f61175a565b60405160200161042f9493929190613567565b604051602081830303815290604052905090565b60605f61044e611733565b905080600a015f8481526020019081526020015f208054806020026020016040519081016040528092919081815260200182805480156104e057602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610497575b5050505050915050919050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16632dd3edfe336040518263ffffffff1660e01b815260040161053a91906135c5565b602060405180830381865afa158015610555573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105799190613608565b6105ba57336040517f52d725f50000000000000000000000000000000000000000000000000000000081526004016105b191906135c5565b60405180910390fd5b5f6105c3611733565b9050805f01548811806105d557505f88145b1561061757876040517f4711083f00000000000000000000000000000000000000000000000000000000815260040161060e9190613633565b60405180910390fd5b5f816001015f8a81526020019081526020015f206040518060600160405290815f8201548152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090505f6040518060a001604052808a8a808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508152602001836040015173ffffffffffffffffffffffffffffffffffffffff168152602001836020015173ffffffffffffffffffffffffffffffffffffffff168152602001835f0151815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505081525090505f6107d982611824565b90505f610829828a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506118e3565b90506108348161190d565b61083f8c33836119dd565b5f856002015f8e81526020019081526020015f205f8481526020019081526020015f209050808a8a90918060018154018082558091505060019003905f5260205f20015f90919290919290919290919250918261089d929190613850565b506001866005015f8f81526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550856003015f8e81526020019081526020015f205f8481526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550856004015f8e81526020019081526020015f205f9054906101000a900460ff161580156109ba57506109b98180549050611b30565b5b15610a3f576001866004015f8f81526020019081526020015f205f6101000a81548160ff02191690831515021790555082866006015f8f81526020019081526020015f20819055508c7ffe2c43585786a5a658d2ec5df5dea3fb3385b77c94f60f724ff810896f4198358d8d84604051610a3693929190613ae3565b60405180910390a25b50505050505050505050505050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16632dd3edfe336040518263ffffffff1660e01b8152600401610a9b91906135c5565b602060405180830381865afa158015610ab6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ada9190613608565b610b1b57336040517f52d725f5000000000000000000000000000000000000000000000000000000008152600401610b1291906135c5565b60405180910390fd5b5f610b24611733565b9050805f0154841180610b3657505f84145b15610b7857836040517f4711083f000000000000000000000000000000000000000000000000000000008152600401610b6f9190613633565b60405180910390fd5b5f73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663ef6997f9336040518263ffffffff1660e01b8152600401610bc691906135c5565b5f60405180830381865afa158015610be0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c089190613c51565b90505f81602001519050610c1d8633836119dd565b826008015f8781526020019081526020015f205f815480929190610c4090613cc5565b91905055506001836009015f8881526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555082600a015f8781526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826007015f8781526020019081526020015f205f9054906101000a900460ff16158015610d615750610d60836008015f8881526020019081526020015f2054611b30565b5b15610dbf576001836007015f8881526020019081526020015f205f6101000a81548160ff021916908315150217905550857fe465e141fa8abd95ab7e0855543307f8506ab0170ef664420fb71ab7de0183de60405160405180910390a25b505050505050565b6001610dd1611bc1565b67ffffffffffffffff1614610e12576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f610e1d611be5565b9050805f0160089054906101000a900460ff1680610e6557508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15610e9c576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff021916908315150217905550610f556040518060400160405280601181526020017f496e707574566572696669636174696f6e0000000000000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611c0c565b610f5d611c22565b5f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d282604051610fa79190613d2e565b60405180910390a15050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611010573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110349190613d47565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156110af575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156110f157336040517fe19166ee0000000000000000000000000000000000000000000000000000000081526004016110e891906135c5565b60405180910390fd5b6110f9611c34565b565b611103611ca2565b61110c82611d88565b6111168282611e7b565b5050565b5f611123611f99565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f80611155612020565b9050805f015f9054906101000a900460ff1691505090565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016111ba91906135c5565b602060405180830381865afa1580156111d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f99190613608565b158015611246575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561128857336040517f388916bb00000000000000000000000000000000000000000000000000000000815260040161127f91906135c5565b60405180910390fd5b611290612047565b565b5f6060805f805f60605f6112a46120b6565b90505f801b815f01541480156112bf57505f801b8160010154145b6112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590613dbc565b60405180910390fd5b6113066120dd565b61130e61217b565b46305f801b5f67ffffffffffffffff81111561132d5761132c6130a2565b5b60405190808252806020026020018201604052801561135b5781602001602082028036833780820191505090505b507f0f0000000000000000000000000000000000000000000000000000000000000095949392919097509750975097509750975097505090919293949596565b8673a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663bff3aaba826040518263ffffffff1660e01b81526004016113e99190613633565b602060405180830381865afa158015611404573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114289190613608565b61146957806040517fb6679c3b0000000000000000000000000000000000000000000000000000000081526004016114609190613633565b60405180910390fd5b611471612219565b5f61147a611733565b9050805f015f81548092919061148f90613cc5565b91905055505f815f0154905060405180606001604052808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff16815250826001015f8381526020019081526020015f205f820151815f01556020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600182600b015f8381526020019081526020015f2081905550895f827fe2cafa1b8243311c0828833c7ddf9356c92a51a2246bcf68e13f22b15defdd998c8c8c8c8c8c6040516115e196959493929190613e16565b60405180910390a450505050505050505050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60605f611639611733565b90505f816006015f8581526020019081526020015f20549050816003015f8581526020019081526020015f205f8281526020019081526020015f208054806020026020016040519081016040528092919081815260200182805480156116f157602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116116a8575b505050505092505050919050565b5f80611709611733565b9050806004015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b5f7f4544165ce1653264fdcb09b029891e3d4c8d8583486821172f882e19a149a800905090565b60605f60016117688461225a565b0190505f8167ffffffffffffffff811115611786576117856130a2565b5b6040519080825280601f01601f1916602001820160405280156117b85781602001600182028036833780820191505090505b5090505f82602001820190505b600115611819578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161180e5761180d613e6b565b5b0494505f85036117c5575b819350505050919050565b5f6118dc6040518060a00160405280607f81526020016142e5607f913980519060200120835f015160405160200161185c9190613f49565b6040516020818303038152906040528051906020012084602001518560400151866060015187608001516040516020016118969190613fa3565b604051602081830303815290604052805190602001206040516020016118c196959493929190613fb9565b604051602081830303815290604052805190602001206123ab565b9050919050565b5f805f806118f186866123c4565b9250925092506119018282612419565b82935050505092915050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16632b101c03826040518263ffffffff1660e01b815260040161195a91906135c5565b602060405180830381865afa158015611975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119999190613608565b6119da57806040517f26cd75dc0000000000000000000000000000000000000000000000000000000081526004016119d191906135c5565b60405180910390fd5b50565b5f6119e6611733565b9050806005015f8581526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611a89578383836040517ff9ed431f000000000000000000000000000000000000000000000000000000008152600401611a8093929190614018565b60405180910390fd5b806009015f8581526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611b2a578383836040517f2fa73174000000000000000000000000000000000000000000000000000000008152600401611b2193929190614018565b60405180910390fd5b50505050565b5f8073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16636799ef526040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bb39190614061565b905080831015915050919050565b5f611bca611be5565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b611c1461257b565b611c1e82826125bb565b5050565b611c2a61257b565b611c3261260c565b565b611c3c61263c565b5f611c45612020565b90505f815f015f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c8a61267c565b604051611c9791906135c5565b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480611d4f57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611d36612683565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611d86576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611de5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e099190613d47565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e7857336040517f0e56cf3d000000000000000000000000000000000000000000000000000000008152600401611e6f91906135c5565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611ee357506040513d601f19601f82011682018060405250810190611ee091906140b6565b60015b611f2457816040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401611f1b91906135c5565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114611f8a57806040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600401611f819190613238565b60405180910390fd5b611f9483836126d6565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161461201e576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b61204f612219565b5f612058612020565b90506001815f015f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861209e61267c565b6040516120ab91906135c5565b60405180910390a150565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100905090565b60605f6120e86120b6565b90508060020180546120f990613683565b80601f016020809104026020016040519081016040528092919081815260200182805461212590613683565b80156121705780601f1061214757610100808354040283529160200191612170565b820191905f5260205f20905b81548152906001019060200180831161215357829003601f168201915b505050505091505090565b60605f6121866120b6565b905080600301805461219790613683565b80601f01602080910402602001604051908101604052809291908181526020018280546121c390613683565b801561220e5780601f106121e55761010080835404028352916020019161220e565b820191905f5260205f20905b8154815290600101906020018083116121f157829003601f168201915b505050505091505090565b61222161114b565b15612258576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106122b6577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816122ac576122ab613e6b565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106122f3576d04ee2d6d415b85acef810000000083816122e9576122e8613e6b565b5b0492506020810190505b662386f26fc10000831061232257662386f26fc10000838161231857612317613e6b565b5b0492506010810190505b6305f5e100831061234b576305f5e100838161234157612340613e6b565b5b0492506008810190505b612710831061237057612710838161236657612365613e6b565b5b0492506004810190505b60648310612393576064838161238957612388613e6b565b5b0492506002810190505b600a83106123a2576001810190505b80915050919050565b5f6123bd6123b7612748565b83612756565b9050919050565b5f805f6041845103612404575f805f602087015192506040870151915060608701515f1a90506123f688828585612796565b955095509550505050612412565b5f600285515f1b9250925092505b9250925092565b5f600381111561242c5761242b6140e1565b5b82600381111561243f5761243e6140e1565b5b03156125775760016003811115612459576124586140e1565b5b82600381111561246c5761246b6140e1565b5b036124a3576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260038111156124b7576124b66140e1565b5b8260038111156124ca576124c96140e1565b5b0361250e57805f1c6040517ffce698f70000000000000000000000000000000000000000000000000000000081526004016125059190613633565b60405180910390fd5b600380811115612521576125206140e1565b5b826003811115612534576125336140e1565b5b0361257657806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161256d9190613238565b60405180910390fd5b5b5050565b61258361287d565b6125b9576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6125c361257b565b5f6125cc6120b6565b9050828160020190816125df9190614166565b50818160030190816125f19190614166565b505f801b815f01819055505f801b8160010181905550505050565b61261461257b565b5f61261d612020565b90505f815f015f6101000a81548160ff02191690831515021790555050565b61264461114b565b61267a576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f33905090565b5f6126af7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61289b565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6126df826128a4565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f8151111561273b57612735828261296d565b50612744565b6127436129ed565b5b5050565b5f612751612a29565b905090565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c11156127d2575f600385925092509250612873565b5f6001888888886040515f81526020016040526040516127f59493929190614250565b6020604051602081039080840390855afa158015612815573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612866575f60015f801b93509350935050612873565b805f805f1b935093509350505b9450945094915050565b5f612886611be5565b5f0160089054906101000a900460ff16905090565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b036128ff57806040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016128f691906135c5565b60405180910390fd5b8061292b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61289b565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040516129969190613fa3565b5f60405180830381855af49150503d805f81146129ce576040519150601f19603f3d011682016040523d82523d5f602084013e6129d3565b606091505b50915091506129e3858383612a8c565b9250505092915050565b5f341115612a27576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f612a53612b19565b612a5b612b8f565b4630604051602001612a71959493929190614293565b60405160208183030381529060405280519060200120905090565b606082612aa157612a9c82612c06565b612b11565b5f8251148015612ac757505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15612b0957836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401612b0091906135c5565b60405180910390fd5b819050612b12565b5b9392505050565b5f80612b236120b6565b90505f612b2e6120dd565b90505f81511115612b4a57808051906020012092505050612b8c565b5f825f015490505f801b8114612b6557809350505050612b8c565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f80612b996120b6565b90505f612ba461217b565b90505f81511115612bc057808051906020012092505050612c03565b5f826001015490505f801b8114612bdc57809350505050612c03565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f81511115612c185780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b612c6d81612c5b565b8114612c77575f80fd5b50565b5f81359050612c8881612c64565b92915050565b5f60208284031215612ca357612ca2612c53565b5b5f612cb084828501612c7a565b91505092915050565b5f8115159050919050565b612ccd81612cb9565b82525050565b5f602082019050612ce65f830184612cc4565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612d23578082015181840152602081019050612d08565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612d4882612cec565b612d528185612cf6565b9350612d62818560208601612d06565b612d6b81612d2e565b840191505092915050565b5f6020820190508181035f830152612d8e8184612d3e565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612de882612dbf565b9050919050565b612df881612dde565b82525050565b5f612e098383612def565b60208301905092915050565b5f602082019050919050565b5f612e2b82612d96565b612e358185612da0565b9350612e4083612db0565b805f5b83811015612e70578151612e578882612dfe565b9750612e6283612e15565b925050600181019050612e43565b5085935050505092915050565b5f6020820190508181035f830152612e958184612e21565b905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112612ebe57612ebd612e9d565b5b8235905067ffffffffffffffff811115612edb57612eda612ea1565b5b602083019150836020820283011115612ef757612ef6612ea5565b5b9250929050565b5f8083601f840112612f1357612f12612e9d565b5b8235905067ffffffffffffffff811115612f3057612f2f612ea1565b5b602083019150836001820283011115612f4c57612f4b612ea5565b5b9250929050565b5f805f805f805f6080888a031215612f6e57612f6d612c53565b5b5f612f7b8a828b01612c7a565b975050602088013567ffffffffffffffff811115612f9c57612f9b612c57565b5b612fa88a828b01612ea9565b9650965050604088013567ffffffffffffffff811115612fcb57612fca612c57565b5b612fd78a828b01612efe565b9450945050606088013567ffffffffffffffff811115612ffa57612ff9612c57565b5b6130068a828b01612efe565b925092505092959891949750929550565b5f805f6040848603121561302e5761302d612c53565b5b5f61303b86828701612c7a565b935050602084013567ffffffffffffffff81111561305c5761305b612c57565b5b61306886828701612efe565b92509250509250925092565b61307d81612dde565b8114613087575f80fd5b50565b5f8135905061309881613074565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6130d882612d2e565b810181811067ffffffffffffffff821117156130f7576130f66130a2565b5b80604052505050565b5f613109612c4a565b905061311582826130cf565b919050565b5f67ffffffffffffffff821115613134576131336130a2565b5b61313d82612d2e565b9050602081019050919050565b828183375f83830152505050565b5f61316a6131658461311a565b613100565b9050828152602081018484840111156131865761318561309e565b5b61319184828561314a565b509392505050565b5f82601f8301126131ad576131ac612e9d565b5b81356131bd848260208601613158565b91505092915050565b5f80604083850312156131dc576131db612c53565b5b5f6131e98582860161308a565b925050602083013567ffffffffffffffff81111561320a57613209612c57565b5b61321685828601613199565b9150509250929050565b5f819050919050565b61323281613220565b82525050565b5f60208201905061324b5f830184613229565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b61328581613251565b82525050565b61329481612c5b565b82525050565b6132a381612dde565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6132db81612c5b565b82525050565b5f6132ec83836132d2565b60208301905092915050565b5f602082019050919050565b5f61330e826132a9565b61331881856132b3565b9350613323836132c3565b805f5b8381101561335357815161333a88826132e1565b9750613345836132f8565b925050600181019050613326565b5085935050505092915050565b5f60e0820190506133735f83018a61327c565b81810360208301526133858189612d3e565b905081810360408301526133998188612d3e565b90506133a8606083018761328b565b6133b5608083018661329a565b6133c260a0830185613229565b81810360c08301526133d48184613304565b905098975050505050505050565b5f805f805f805f60a0888a0312156133fd576133fc612c53565b5b5f61340a8a828b01612c7a565b975050602061341b8a828b0161308a565b965050604061342c8a828b0161308a565b955050606088013567ffffffffffffffff81111561344d5761344c612c57565b5b6134598a828b01612efe565b9450945050608088013567ffffffffffffffff81111561347c5761347b612c57565b5b6134888a828b01612efe565b925092505092959891949750929550565b5f81905092915050565b5f6134ad82612cec565b6134b78185613499565b93506134c7818560208601612d06565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f613507600283613499565b9150613512826134d3565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f613551600183613499565b915061355c8261351d565b600182019050919050565b5f61357282876134a3565b915061357d826134fb565b915061358982866134a3565b915061359482613545565b91506135a082856134a3565b91506135ab82613545565b91506135b782846134a3565b915081905095945050505050565b5f6020820190506135d85f83018461329a565b92915050565b6135e781612cb9565b81146135f1575f80fd5b50565b5f81519050613602816135de565b92915050565b5f6020828403121561361d5761361c612c53565b5b5f61362a848285016135f4565b91505092915050565b5f6020820190506136465f83018461328b565b92915050565b5f82905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061369a57607f821691505b6020821081036136ad576136ac613656565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261370f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826136d4565b61371986836136d4565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61375461374f61374a84612c5b565b613731565b612c5b565b9050919050565b5f819050919050565b61376d8361373a565b6137816137798261375b565b8484546136e0565b825550505050565b5f90565b613795613789565b6137a0818484613764565b505050565b5b818110156137c3576137b85f8261378d565b6001810190506137a6565b5050565b601f821115613808576137d9816136b3565b6137e2846136c5565b810160208510156137f1578190505b6138056137fd856136c5565b8301826137a5565b50505b505050565b5f82821c905092915050565b5f6138285f198460080261380d565b1980831691505092915050565b5f6138408383613819565b9150826002028217905092915050565b61385a838361364c565b67ffffffffffffffff811115613873576138726130a2565b5b61387d8254613683565b6138888282856137c7565b5f601f8311600181146138b5575f84156138a3578287013590505b6138ad8582613835565b865550613914565b601f1984166138c3866136b3565b5f5b828110156138ea578489013582556001820191506020850194506020810190506138c5565b868310156139075784890135613903601f891682613819565b8355505b6001600288020188555050505b50505050505050565b5f82825260208201905092915050565b5f80fd5b82818337505050565b5f613945838561391d565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156139785761397761392d565b5b602083029250613989838584613931565b82840190509392505050565b5f81549050919050565b5f82825260208201905092915050565b5f819050815f5260205f209050919050565b5f82825260208201905092915050565b5f81546139dd81613683565b6139e781866139c1565b9450600182165f8114613a015760018114613a1757613a49565b60ff198316865281151560200286019350613a49565b613a20856136b3565b5f5b83811015613a4157815481890152600182019150602081019050613a22565b808801955050505b50505092915050565b5f613a5d83836139d1565b905092915050565b5f600182019050919050565b5f613a7b82613995565b613a85818561399f565b935083602082028501613a97856139af565b805f5b85811015613ad157848403895281613ab28582613a52565b9450613abd83613a65565b925060208a01995050600181019050613a9a565b50829750879550505050505092915050565b5f6040820190508181035f830152613afc81858761393a565b90508181036020830152613b108184613a71565b9050949350505050565b5f80fd5b5f80fd5b5f81519050613b3081613074565b92915050565b5f67ffffffffffffffff821115613b5057613b4f6130a2565b5b613b5982612d2e565b9050602081019050919050565b5f613b78613b7384613b36565b613100565b905082815260208101848484011115613b9457613b9361309e565b5b613b9f848285612d06565b509392505050565b5f82601f830112613bbb57613bba612e9d565b5b8151613bcb848260208601613b66565b91505092915050565b5f60608284031215613be957613be8613b1a565b5b613bf36060613100565b90505f613c0284828501613b22565b5f830152506020613c1584828501613b22565b602083015250604082015167ffffffffffffffff811115613c3957613c38613b1e565b5b613c4584828501613ba7565b60408301525092915050565b5f60208284031215613c6657613c65612c53565b5b5f82015167ffffffffffffffff811115613c8357613c82612c57565b5b613c8f84828501613bd4565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613ccf82612c5b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d0157613d00613c98565b5b600182019050919050565b5f67ffffffffffffffff82169050919050565b613d2881613d0c565b82525050565b5f602082019050613d415f830184613d1f565b92915050565b5f60208284031215613d5c57613d5b612c53565b5b5f613d6984828501613b22565b91505092915050565b7f4549503731323a20556e696e697469616c697a656400000000000000000000005f82015250565b5f613da6601583612cf6565b9150613db182613d72565b602082019050919050565b5f6020820190508181035f830152613dd381613d9a565b9050919050565b5f82825260208201905092915050565b5f613df58385613dda565b9350613e0283858461314a565b613e0b83612d2e565b840190509392505050565b5f608082019050613e295f83018961329a565b613e36602083018861329a565b8181036040830152613e49818688613dea565b90508181036060830152613e5e818486613dea565b9050979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81519050919050565b5f81905092915050565b5f819050602082019050919050565b613ec481613220565b82525050565b5f613ed58383613ebb565b60208301905092915050565b5f602082019050919050565b5f613ef782613e98565b613f018185613ea2565b9350613f0c83613eac565b805f5b83811015613f3c578151613f238882613eca565b9750613f2e83613ee1565b925050600181019050613f0f565b5085935050505092915050565b5f613f548284613eed565b915081905092915050565b5f81519050919050565b5f81905092915050565b5f613f7d82613f5f565b613f878185613f69565b9350613f97818560208601612d06565b80840191505092915050565b5f613fae8284613f73565b915081905092915050565b5f60c082019050613fcc5f830189613229565b613fd96020830188613229565b613fe6604083018761329a565b613ff3606083018661329a565b614000608083018561328b565b61400d60a0830184613229565b979650505050505050565b5f60608201905061402b5f83018661328b565b614038602083018561329a565b614045604083018461329a565b949350505050565b5f8151905061405b81612c64565b92915050565b5f6020828403121561407657614075612c53565b5b5f6140838482850161404d565b91505092915050565b61409581613220565b811461409f575f80fd5b50565b5f815190506140b08161408c565b92915050565b5f602082840312156140cb576140ca612c53565b5b5f6140d8848285016140a2565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f819050815f5260205f209050919050565b601f821115614161576141328161410e565b61413b846136c5565b8101602085101561414a578190505b61415e614156856136c5565b8301826137a5565b50505b505050565b61416f82612cec565b67ffffffffffffffff811115614188576141876130a2565b5b6141928254613683565b61419d828285614120565b5f60209050601f8311600181146141ce575f84156141bc578287015190505b6141c68582613835565b86555061422d565b601f1984166141dc8661410e565b5f5b82811015614203578489015182556001820191506020850194506020810190506141de565b86831015614220578489015161421c601f891682613819565b8355505b6001600288020188555050505b505050505050565b5f60ff82169050919050565b61424a81614235565b82525050565b5f6080820190506142635f830187613229565b6142706020830186614241565b61427d6040830185613229565b61428a6060830184613229565b95945050505050565b5f60a0820190506142a65f830188613229565b6142b36020830187613229565b6142c06040830186613229565b6142cd606083018561328b565b6142da608083018461329a565b969550505050505056fe43697068657274657874566572696669636174696f6e28627974657333325b5d20637448616e646c65732c616464726573732075736572416464726573732c6164647265737320636f6e7472616374416464726573732c75696e7432353620636f6e7472616374436861696e49642c62797465732065787472614461746129 + ///0x6080604052600436106100fd575f3560e01c806352d1902d11610094578063a700499611610063578063a7004996146102d5578063ad3cb1cc146102fd578063c411587414610327578063ce7e42571461033d578063e96f88ea14610379576100fd565b806352d1902d1461023b5780635c975abb146102655780638456cb591461028f57806384b0196e146102a5576100fd565b8063338007fc116100d0578063338007fc146101cb57806339f73810146101f35780633f4ba83a146102095780634f1ef2861461021f576100fd565b80630c615839146101015780630d8e6e2c1461013d5780631bbe9fae1461016757806331bedea3146101a3575b5f80fd5b34801561010c575f80fd5b50610127600480360381019061012291906131b6565b6103b5565b60405161013491906131fb565b60405180910390f35b348015610148575f80fd5b506101516103e9565b60405161015e919061329e565b60405180910390f35b348015610172575f80fd5b5061018d600480360381019061018891906131b6565b610464565b60405161019a91906133a5565b60405180910390f35b3480156101ae575f80fd5b506101c960048036038101906101c4919061347b565b61050e565b005b3480156101d6575f80fd5b506101f160048036038101906101ec919061353f565b610a66565b005b3480156101fe575f80fd5b50610207610f13565b005b348015610214575f80fd5b5061021d6110ff565b005b610239600480360381019061023491906136ee565b611247565b005b348015610246575f80fd5b5061024f611266565b60405161025c9190613760565b60405180910390f35b348015610270575f80fd5b50610279611297565b60405161028691906131fb565b60405180910390f35b34801561029a575f80fd5b506102a36112b9565b005b3480156102b0575f80fd5b506102b96113de565b6040516102cc9796959493929190613888565b60405180910390f35b3480156102e0575f80fd5b506102fb60048036038101906102f6919061390a565b6114e7565b005b348015610308575f80fd5b50610311611834565b60405161031e919061329e565b60405180910390f35b348015610332575f80fd5b5061033b61186d565b005b348015610348575f80fd5b50610363600480360381019061035e91906131b6565b611992565b60405161037091906133a5565b60405180910390f35b348015610384575f80fd5b5061039f600480360381019061039a91906131b6565b611a63565b6040516103ac91906131fb565b60405180910390f35b5f806103bf611a97565b9050806007015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b60606040518060400160405280601181526020017f496e707574566572696669636174696f6e00000000000000000000000000000081525061042a5f611abe565b6104346002611abe565b61043d5f611abe565b6040516020016104509493929190613a8f565b604051602081830303815290604052905090565b60605f61046f611a97565b905080600a015f8481526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561050157602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116104b8575b5050505050915050919050565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16633a5162e66040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610567575f80fd5b505af1158015610579573d5f803e3d5ffd5b505050505f610586611a97565b9050805f015488118061059857505f88145b156105da57876040517f4711083f0000000000000000000000000000000000000000000000000000000081526004016105d19190613aed565b60405180910390fd5b5f81600b015f8a81526020019081526020015f205490506105fb8133611b88565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663cd8e993c826040518263ffffffff1660e01b81526004016106489190613aed565b602060405180830381865afa158015610663573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106879190613b30565b61075b575f7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663888b99e0836040518263ffffffff1660e01b81526004016106d99190613aed565b602060405180830381865afa1580156106f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107189190613b7e565b90508982826040517fc0eedb7b00000000000000000000000000000000000000000000000000000000815260040161075293929190613c1c565b60405180910390fd5b5f6107eb8a8a8a808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508488888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611c5d565b90505f61083b8289898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611dfa565b90506108478382611e24565b6108528b3383611ef9565b5f846002015f8d81526020019081526020015f205f8481526020019081526020015f20905080898990918060018154018082558091505060019003905f5260205f20015f9091929091929091929091925091826108b0929190613e55565b506001856005015f8e81526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550846003015f8d81526020019081526020015f205f8481526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550846004015f8d81526020019081526020015f205f9054906101000a900460ff161580156109ce57506109cd84828054905061204c565b5b15610a58576001856004015f8e81526020019081526020015f205f6101000a81548160ff02191690831515021790555082856006015f8e81526020019081526020015f2081905550838c7ff96a66bb08cf5450f5789d7343fa3b58d4a00a66ef2d0d0494f424b03b0abff28d8d858c8c604051610a4f959493929190614124565b60405180910390a35b505050505050505050505050565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16633a5162e66040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610abf575f80fd5b505af1158015610ad1573d5f803e3d5ffd5b505050505f610ade611a97565b9050805f0154841180610af057505f84145b15610b3257836040517f4711083f000000000000000000000000000000000000000000000000000000008152600401610b299190613aed565b60405180910390fd5b5f81600b015f8681526020019081526020015f20549050610b538133611b88565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663cd8e993c826040518263ffffffff1660e01b8152600401610ba09190613aed565b602060405180830381865afa158015610bbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bdf9190613b30565b610cb3575f7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663888b99e0836040518263ffffffff1660e01b8152600401610c319190613aed565b602060405180830381865afa158015610c4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c709190613b7e565b90508582826040517ff3225893000000000000000000000000000000000000000000000000000000008152600401610caa93929190613c1c565b60405180910390fd5b5f7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663820a91f883336040518363ffffffff1660e01b8152600401610d03929190614172565b5f60405180830381865afa158015610d1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610d459190614300565b90505f81604001519050610d5a873383611ef9565b836008015f8881526020019081526020015f205f815480929190610d7d90614374565b91905055506001846009015f8981526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555083600a015f8881526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836007015f8881526020019081526020015f205f9054906101000a900460ff16158015610e9f5750610e9e83856008015f8a81526020019081526020015f205461204c565b5b15610f0a576001846007015f8981526020019081526020015f205f6101000a81548160ff021916908315150217905550867f6f4b137679536c6081c7f024870327aa89b62a64182f2d41e4fbdee5e2248e868787604051610f019291906143bb565b60405180910390a25b50505050505050565b6001610f1d6120e9565b67ffffffffffffffff1614610f5e576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f610f6961210d565b9050805f0160089054906101000a900460ff1680610fb157508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15610fe8576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055506110a16040518060400160405280601181526020017f496e707574566572696669636174696f6e0000000000000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250612134565b6110a961214a565b5f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2826040516110f391906143ff565b60405180910390a15050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561115c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111809190614418565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156111fb575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561123d57336040517fe19166ee0000000000000000000000000000000000000000000000000000000081526004016112349190614443565b60405180910390fd5b61124561215c565b565b61124f6121ca565b611258826122b0565b61126282826123a3565b5050565b5f61126f6124c1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f806112a1612548565b9050805f015f9054906101000a900460ff1691505090565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016113069190614443565b602060405180830381865afa158015611321573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113459190613b30565b158015611392575073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156113d457336040517f388916bb0000000000000000000000000000000000000000000000000000000081526004016113cb9190614443565b60405180910390fd5b6113dc61256f565b565b5f6060805f805f60605f6113f06125de565b90505f801b815f015414801561140b57505f801b8160010154145b61144a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611441906144a6565b60405180910390fd5b611452612605565b61145a6126a3565b46305f801b5f67ffffffffffffffff811115611479576114786135ca565b5b6040519080825280602002602001820160405280156114a75781602001602082028036833780820191505090505b507f0f0000000000000000000000000000000000000000000000000000000000000095949392919097509750975097509750975097505090919293949596565b8673a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663bff3aaba826040518263ffffffff1660e01b81526004016115359190613aed565b602060405180830381865afa158015611550573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115749190613b30565b6115b557806040517fb6679c3b0000000000000000000000000000000000000000000000000000000081526004016115ac9190613aed565b60405180910390fd5b6115bd612741565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16633a5162e66040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611616575f80fd5b505af1158015611628573d5f803e3d5ffd5b505050505f611635611a97565b9050805f015f81548092919061164a90614374565b91905055505f815f0154905060405180606001604052808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff16815250826001015f8381526020019081526020015f205f820151815f01556020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050505f7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663991dc36d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117c991906144d8565b90508083600b015f8481526020019081526020015f20819055508a81837fe2cafa1b8243311c0828833c7ddf9356c92a51a2246bcf68e13f22b15defdd998d8d8d8d8d8d60405161181f96959493929190614503565b60405180910390a45050505050505050505050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60035f61187861210d565b9050805f0160089054906101000a900460ff16806118c057508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b156118f7576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d28260405161198691906143ff565b60405180910390a15050565b60605f61199d611a97565b90505f816006015f8581526020019081526020015f20549050816003015f8581526020019081526020015f205f8281526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015611a5557602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611a0c575b505050505092505050919050565b5f80611a6d611a97565b9050806004015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b5f7f4544165ce1653264fdcb09b029891e3d4c8d8583486821172f882e19a149a800905090565b60605f6001611acc84612782565b0190505f8167ffffffffffffffff811115611aea57611ae96135ca565b5b6040519080825280601f01601f191660200182016040528015611b1c5781602001600182028036833780820191505090505b5090505f82602001820190505b600115611b7d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611b7257611b71614558565b5b0494505f8503611b29575b819350505050919050565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16638625e87683836040518363ffffffff1660e01b8152600401611bd7929190614172565b602060405180830381865afa158015611bf2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c169190613b30565b611c595781816040517f29a993c1000000000000000000000000000000000000000000000000000000008152600401611c50929190614172565b60405180910390fd5b5050565b5f80611c67611a97565b90505f816001015f8881526020019081526020015f206040518060600160405290815f8201548152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050611dee6040518060c00160405280609c8152602001614974609c91398051906020012087604051602001611d719190614636565b6040516020818303038152906040528051906020012083604001518460200151855f01518a8a604051602001611da79190614690565b60405160208183030381529060405280519060200120604051602001611dd397969594939291906146a6565b604051602081830303815290604052805190602001206128d3565b92505050949350505050565b5f805f80611e0886866128ec565b925092509250611e188282612941565b82935050505092915050565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663cdbb5a8283836040518363ffffffff1660e01b8152600401611e73929190614172565b602060405180830381865afa158015611e8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eb29190613b30565b611ef55781816040517f554f8c5f000000000000000000000000000000000000000000000000000000008152600401611eec929190614172565b60405180910390fd5b5050565b5f611f02611a97565b9050806005015f8581526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611fa5578383836040517ff9ed431f000000000000000000000000000000000000000000000000000000008152600401611f9c93929190614713565b60405180910390fd5b806009015f8581526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612046578383836040517f2fa7317400000000000000000000000000000000000000000000000000000000815260040161203d93929190614713565b60405180910390fd5b50505050565b5f807333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663f88174ea856040518263ffffffff1660e01b815260040161209b9190613aed565b602060405180830381865afa1580156120b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120da91906144d8565b90508083101591505092915050565b5f6120f261210d565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b61213c612aa3565b6121468282612ae3565b5050565b612152612aa3565b61215a612b34565b565b612164612b64565b5f61216d612548565b90505f815f015f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6121b2612ba4565b6040516121bf9190614443565b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148061227757507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661225e612bab565b73ffffffffffffffffffffffffffffffffffffffff1614155b156122ae576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561230d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123319190614418565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123a057336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016123979190614443565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561240b57506040513d601f19601f820116820180604052508101906124089190614772565b60015b61244c57816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016124439190614443565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b81146124b257806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016124a99190613760565b60405180910390fd5b6124bc8383612bfe565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614612546576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b612577612741565b5f612580612548565b90506001815f015f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125c6612ba4565b6040516125d39190614443565b60405180910390a150565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100905090565b60605f6126106125de565b905080600201805461262190613c88565b80601f016020809104026020016040519081016040528092919081815260200182805461264d90613c88565b80156126985780601f1061266f57610100808354040283529160200191612698565b820191905f5260205f20905b81548152906001019060200180831161267b57829003601f168201915b505050505091505090565b60605f6126ae6125de565b90508060030180546126bf90613c88565b80601f01602080910402602001604051908101604052809291908181526020018280546126eb90613c88565b80156127365780601f1061270d57610100808354040283529160200191612736565b820191905f5260205f20905b81548152906001019060200180831161271957829003601f168201915b505050505091505090565b612749611297565b15612780576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106127de577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816127d4576127d3614558565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061281b576d04ee2d6d415b85acef8100000000838161281157612810614558565b5b0492506020810190505b662386f26fc10000831061284a57662386f26fc1000083816128405761283f614558565b5b0492506010810190505b6305f5e1008310612873576305f5e100838161286957612868614558565b5b0492506008810190505b612710831061289857612710838161288e5761288d614558565b5b0492506004810190505b606483106128bb57606483816128b1576128b0614558565b5b0492506002810190505b600a83106128ca576001810190505b80915050919050565b5f6128e56128df612c70565b83612c7e565b9050919050565b5f805f604184510361292c575f805f602087015192506040870151915060608701515f1a905061291e88828585612cbe565b95509550955050505061293a565b5f600285515f1b9250925092505b9250925092565b5f600381111561295457612953613ba9565b5b82600381111561296757612966613ba9565b5b0315612a9f576001600381111561298157612980613ba9565b5b82600381111561299457612993613ba9565b5b036129cb576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260038111156129df576129de613ba9565b5b8260038111156129f2576129f1613ba9565b5b03612a3657805f1c6040517ffce698f7000000000000000000000000000000000000000000000000000000008152600401612a2d9190613aed565b60405180910390fd5b600380811115612a4957612a48613ba9565b5b826003811115612a5c57612a5b613ba9565b5b03612a9e57806040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600401612a959190613760565b60405180910390fd5b5b5050565b612aab612da5565b612ae1576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b612aeb612aa3565b5f612af46125de565b905082816002019081612b0791906147f5565b5081816003019081612b1991906147f5565b505f801b815f01819055505f801b8160010181905550505050565b612b3c612aa3565b5f612b45612548565b90505f815f015f6101000a81548160ff02191690831515021790555050565b612b6c611297565b612ba2576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f33905090565b5f612bd77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b612dc3565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612c0782612dcc565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f81511115612c6357612c5d8282612e95565b50612c6c565b612c6b612f15565b5b5050565b5f612c79612f51565b905090565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115612cfa575f600385925092509250612d9b565b5f6001888888886040515f8152602001604052604051612d1d94939291906148df565b6020604051602081039080840390855afa158015612d3d573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d8e575f60015f801b93509350935050612d9b565b805f805f1b935093509350505b9450945094915050565b5f612dae61210d565b5f0160089054906101000a900460ff16905090565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03612e2757806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401612e1e9190614443565b60405180910390fd5b80612e537f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b612dc3565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051612ebe9190614690565b5f60405180830381855af49150503d805f8114612ef6576040519150601f19603f3d011682016040523d82523d5f602084013e612efb565b606091505b5091509150612f0b858383612fb4565b9250505092915050565b5f341115612f4f576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f612f7b613041565b612f836130b7565b4630604051602001612f99959493929190614922565b60405160208183030381529060405280519060200120905090565b606082612fc957612fc48261312e565b613039565b5f8251148015612fef57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561303157836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016130289190614443565b60405180910390fd5b81905061303a565b5b9392505050565b5f8061304b6125de565b90505f613056612605565b90505f81511115613072578080519060200120925050506130b4565b5f825f015490505f801b811461308d578093505050506130b4565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f806130c16125de565b90505f6130cc6126a3565b90505f815111156130e85780805190602001209250505061312b565b5f826001015490505f801b81146131045780935050505061312b565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47093505050505b90565b5f815111156131405780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61319581613183565b811461319f575f80fd5b50565b5f813590506131b08161318c565b92915050565b5f602082840312156131cb576131ca61317b565b5b5f6131d8848285016131a2565b91505092915050565b5f8115159050919050565b6131f5816131e1565b82525050565b5f60208201905061320e5f8301846131ec565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561324b578082015181840152602081019050613230565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61327082613214565b61327a818561321e565b935061328a81856020860161322e565b61329381613256565b840191505092915050565b5f6020820190508181035f8301526132b68184613266565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613310826132e7565b9050919050565b61332081613306565b82525050565b5f6133318383613317565b60208301905092915050565b5f602082019050919050565b5f613353826132be565b61335d81856132c8565b9350613368836132d8565b805f5b8381101561339857815161337f8882613326565b975061338a8361333d565b92505060018101905061336b565b5085935050505092915050565b5f6020820190508181035f8301526133bd8184613349565b905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126133e6576133e56133c5565b5b8235905067ffffffffffffffff811115613403576134026133c9565b5b60208301915083602082028301111561341f5761341e6133cd565b5b9250929050565b5f8083601f84011261343b5761343a6133c5565b5b8235905067ffffffffffffffff811115613458576134576133c9565b5b602083019150836001820283011115613474576134736133cd565b5b9250929050565b5f805f805f805f6080888a0312156134965761349561317b565b5b5f6134a38a828b016131a2565b975050602088013567ffffffffffffffff8111156134c4576134c361317f565b5b6134d08a828b016133d1565b9650965050604088013567ffffffffffffffff8111156134f3576134f261317f565b5b6134ff8a828b01613426565b9450945050606088013567ffffffffffffffff8111156135225761352161317f565b5b61352e8a828b01613426565b925092505092959891949750929550565b5f805f604084860312156135565761355561317b565b5b5f613563868287016131a2565b935050602084013567ffffffffffffffff8111156135845761358361317f565b5b61359086828701613426565b92509250509250925092565b6135a581613306565b81146135af575f80fd5b50565b5f813590506135c08161359c565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61360082613256565b810181811067ffffffffffffffff8211171561361f5761361e6135ca565b5b80604052505050565b5f613631613172565b905061363d82826135f7565b919050565b5f67ffffffffffffffff82111561365c5761365b6135ca565b5b61366582613256565b9050602081019050919050565b828183375f83830152505050565b5f61369261368d84613642565b613628565b9050828152602081018484840111156136ae576136ad6135c6565b5b6136b9848285613672565b509392505050565b5f82601f8301126136d5576136d46133c5565b5b81356136e5848260208601613680565b91505092915050565b5f80604083850312156137045761370361317b565b5b5f613711858286016135b2565b925050602083013567ffffffffffffffff8111156137325761373161317f565b5b61373e858286016136c1565b9150509250929050565b5f819050919050565b61375a81613748565b82525050565b5f6020820190506137735f830184613751565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6137ad81613779565b82525050565b6137bc81613183565b82525050565b6137cb81613306565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61380381613183565b82525050565b5f61381483836137fa565b60208301905092915050565b5f602082019050919050565b5f613836826137d1565b61384081856137db565b935061384b836137eb565b805f5b8381101561387b5781516138628882613809565b975061386d83613820565b92505060018101905061384e565b5085935050505092915050565b5f60e08201905061389b5f83018a6137a4565b81810360208301526138ad8189613266565b905081810360408301526138c18188613266565b90506138d060608301876137b3565b6138dd60808301866137c2565b6138ea60a0830185613751565b81810360c08301526138fc818461382c565b905098975050505050505050565b5f805f805f805f60a0888a0312156139255761392461317b565b5b5f6139328a828b016131a2565b97505060206139438a828b016135b2565b96505060406139548a828b016135b2565b955050606088013567ffffffffffffffff8111156139755761397461317f565b5b6139818a828b01613426565b9450945050608088013567ffffffffffffffff8111156139a4576139a361317f565b5b6139b08a828b01613426565b925092505092959891949750929550565b5f81905092915050565b5f6139d582613214565b6139df81856139c1565b93506139ef81856020860161322e565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f613a2f6002836139c1565b9150613a3a826139fb565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f613a796001836139c1565b9150613a8482613a45565b600182019050919050565b5f613a9a82876139cb565b9150613aa582613a23565b9150613ab182866139cb565b9150613abc82613a6d565b9150613ac882856139cb565b9150613ad382613a6d565b9150613adf82846139cb565b915081905095945050505050565b5f602082019050613b005f8301846137b3565b92915050565b613b0f816131e1565b8114613b19575f80fd5b50565b5f81519050613b2a81613b06565b92915050565b5f60208284031215613b4557613b4461317b565b5b5f613b5284828501613b1c565b91505092915050565b60088110613b67575f80fd5b50565b5f81519050613b7881613b5b565b92915050565b5f60208284031215613b9357613b9261317b565b5b5f613ba084828501613b6a565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60088110613be757613be6613ba9565b5b50565b5f819050613bf782613bd6565b919050565b5f613c0682613bea565b9050919050565b613c1681613bfc565b82525050565b5f606082019050613c2f5f8301866137b3565b613c3c60208301856137b3565b613c496040830184613c0d565b949350505050565b5f82905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613c9f57607f821691505b602082108103613cb257613cb1613c5b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613d147fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613cd9565b613d1e8683613cd9565b95508019841693508086168417925050509392505050565b5f819050919050565b5f613d59613d54613d4f84613183565b613d36565b613183565b9050919050565b5f819050919050565b613d7283613d3f565b613d86613d7e82613d60565b848454613ce5565b825550505050565b5f90565b613d9a613d8e565b613da5818484613d69565b505050565b5b81811015613dc857613dbd5f82613d92565b600181019050613dab565b5050565b601f821115613e0d57613dde81613cb8565b613de784613cca565b81016020851015613df6578190505b613e0a613e0285613cca565b830182613daa565b50505b505050565b5f82821c905092915050565b5f613e2d5f1984600802613e12565b1980831691505092915050565b5f613e458383613e1e565b9150826002028217905092915050565b613e5f8383613c51565b67ffffffffffffffff811115613e7857613e776135ca565b5b613e828254613c88565b613e8d828285613dcc565b5f601f831160018114613eba575f8415613ea8578287013590505b613eb28582613e3a565b865550613f19565b601f198416613ec886613cb8565b5f5b82811015613eef57848901358255600182019150602085019450602081019050613eca565b86831015613f0c5784890135613f08601f891682613e1e565b8355505b6001600288020188555050505b50505050505050565b5f82825260208201905092915050565b5f80fd5b82818337505050565b5f613f4a8385613f22565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613f7d57613f7c613f32565b5b602083029250613f8e838584613f36565b82840190509392505050565b5f81549050919050565b5f82825260208201905092915050565b5f819050815f5260205f209050919050565b5f82825260208201905092915050565b5f8154613fe281613c88565b613fec8186613fc6565b9450600182165f8114614006576001811461401c5761404e565b60ff19831686528115156020028601935061404e565b61402585613cb8565b5f5b8381101561404657815481890152600182019150602081019050614027565b808801955050505b50505092915050565b5f6140628383613fd6565b905092915050565b5f600182019050919050565b5f61408082613f9a565b61408a8185613fa4565b93508360208202850161409c85613fb4565b805f5b858110156140d6578484038952816140b78582614057565b94506140c28361406a565b925060208a0199505060018101905061409f565b50829750879550505050505092915050565b5f82825260208201905092915050565b5f61410383856140e8565b9350614110838584613672565b61411983613256565b840190509392505050565b5f6060820190508181035f83015261413d818789613f3f565b905081810360208301526141518186614076565b905081810360408301526141668184866140f8565b90509695505050505050565b5f6040820190506141855f8301856137b3565b61419260208301846137c2565b9392505050565b5f80fd5b5f80fd5b5f67ffffffffffffffff8211156141bb576141ba6135ca565b5b6141c482613256565b9050602081019050919050565b5f6141e36141de846141a1565b613628565b9050828152602081018484840111156141ff576141fe6135c6565b5b61420a84828561322e565b509392505050565b5f82601f830112614226576142256133c5565b5b81516142368482602086016141d1565b91505092915050565b5f8151905061424d8161359c565b92915050565b5f6080828403121561426857614267614199565b5b6142726080613628565b90505f82015167ffffffffffffffff8111156142915761429061419d565b5b61429d84828501614212565b5f8301525060206142b08482850161423f565b60208301525060406142c48482850161423f565b604083015250606082015167ffffffffffffffff8111156142e8576142e761419d565b5b6142f484828501614212565b60608301525092915050565b5f602082840312156143155761431461317b565b5b5f82015167ffffffffffffffff8111156143325761433161317f565b5b61433e84828501614253565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61437e82613183565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143b0576143af614347565b5b600182019050919050565b5f6020820190508181035f8301526143d48184866140f8565b90509392505050565b5f67ffffffffffffffff82169050919050565b6143f9816143dd565b82525050565b5f6020820190506144125f8301846143f0565b92915050565b5f6020828403121561442d5761442c61317b565b5b5f61443a8482850161423f565b91505092915050565b5f6020820190506144565f8301846137c2565b92915050565b7f4549503731323a20556e696e697469616c697a656400000000000000000000005f82015250565b5f61449060158361321e565b915061449b8261445c565b602082019050919050565b5f6020820190508181035f8301526144bd81614484565b9050919050565b5f815190506144d28161318c565b92915050565b5f602082840312156144ed576144ec61317b565b5b5f6144fa848285016144c4565b91505092915050565b5f6080820190506145165f8301896137c2565b61452360208301886137c2565b81810360408301526145368186886140f8565b9050818103606083015261454b8184866140f8565b9050979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81519050919050565b5f81905092915050565b5f819050602082019050919050565b6145b181613748565b82525050565b5f6145c283836145a8565b60208301905092915050565b5f602082019050919050565b5f6145e482614585565b6145ee818561458f565b93506145f983614599565b805f5b8381101561462957815161461088826145b7565b975061461b836145ce565b9250506001810190506145fc565b5085935050505092915050565b5f61464182846145da565b915081905092915050565b5f81519050919050565b5f81905092915050565b5f61466a8261464c565b6146748185614656565b935061468481856020860161322e565b80840191505092915050565b5f61469b8284614660565b915081905092915050565b5f60e0820190506146b95f83018a613751565b6146c66020830189613751565b6146d360408301886137c2565b6146e060608301876137c2565b6146ed60808301866137b3565b6146fa60a08301856137b3565b61470760c0830184613751565b98975050505050505050565b5f6060820190506147265f8301866137b3565b61473360208301856137c2565b61474060408301846137c2565b949350505050565b61475181613748565b811461475b575f80fd5b50565b5f8151905061476c81614748565b92915050565b5f602082840312156147875761478661317b565b5b5f6147948482850161475e565b91505092915050565b5f819050815f5260205f209050919050565b601f8211156147f0576147c18161479d565b6147ca84613cca565b810160208510156147d9578190505b6147ed6147e585613cca565b830182613daa565b50505b505050565b6147fe82613214565b67ffffffffffffffff811115614817576148166135ca565b5b6148218254613c88565b61482c8282856147af565b5f60209050601f83116001811461485d575f841561484b578287015190505b6148558582613e3a565b8655506148bc565b601f19841661486b8661479d565b5f5b828110156148925784890151825560018201915060208501945060208101905061486d565b868310156148af57848901516148ab601f891682613e1e565b8355505b6001600288020188555050505b505050505050565b5f60ff82169050919050565b6148d9816148c4565b82525050565b5f6080820190506148f25f830187613751565b6148ff60208301866148d0565b61490c6040830185613751565b6149196060830184613751565b95945050505050565b5f60a0820190506149355f830188613751565b6149426020830187613751565b61494f6040830186613751565b61495c60608301856137b3565b61496960808301846137c2565b969550505050505056fe43697068657274657874566572696669636174696f6e28627974657333325b5d20637448616e646c65732c616464726573732075736572416464726573732c6164647265737320636f6e7472616374416464726573732c75696e7432353620636f6e7472616374436861696e49642c75696e7432353620636f70726f636573736f72436f6e7465787449642c62797465732065787472614461746129 /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\x80`@R`\x046\x10a\0\xF2W_5`\xE0\x1C\x80cR\xD1\x90-\x11a\0\x89W\x80c\xA7\0I\x96\x11a\0XW\x80c\xA7\0I\x96\x14a\x02\xCAW\x80c\xAD<\xB1\xCC\x14a\x02\xF2W\x80c\xCE~BW\x14a\x03\x1CW\x80c\xE9o\x88\xEA\x14a\x03XWa\0\xF2V[\x80cR\xD1\x90-\x14a\x020W\x80c\\\x97Z\xBB\x14a\x02ZW\x80c\x84V\xCBY\x14a\x02\x84W\x80c\x84\xB0\x19n\x14a\x02\x9AWa\0\xF2V[\x80c3\x80\x07\xFC\x11a\0\xC5W\x80c3\x80\x07\xFC\x14a\x01\xC0W\x80c9\xF78\x10\x14a\x01\xE8W\x80c?K\xA8:\x14a\x01\xFEW\x80cO\x1E\xF2\x86\x14a\x02\x14Wa\0\xF2V[\x80c\x0CaX9\x14a\0\xF6W\x80c\r\x8En,\x14a\x012W\x80c\x1B\xBE\x9F\xAE\x14a\x01\\W\x80c1\xBE\xDE\xA3\x14a\x01\x98W[_\x80\xFD[4\x80\x15a\x01\x01W_\x80\xFD[Pa\x01\x1C`\x04\x806\x03\x81\x01\x90a\x01\x17\x91\x90a,\x8EV[a\x03\x94V[`@Qa\x01)\x91\x90a,\xD3V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01=W_\x80\xFD[Pa\x01Fa\x03\xC8V[`@Qa\x01S\x91\x90a-vV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01gW_\x80\xFD[Pa\x01\x82`\x04\x806\x03\x81\x01\x90a\x01}\x91\x90a,\x8EV[a\x04CV[`@Qa\x01\x8F\x91\x90a.}V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xA3W_\x80\xFD[Pa\x01\xBE`\x04\x806\x03\x81\x01\x90a\x01\xB9\x91\x90a/SV[a\x04\xEDV[\0[4\x80\x15a\x01\xCBW_\x80\xFD[Pa\x01\xE6`\x04\x806\x03\x81\x01\x90a\x01\xE1\x91\x90a0\x17V[a\nNV[\0[4\x80\x15a\x01\xF3W_\x80\xFD[Pa\x01\xFCa\r\xC7V[\0[4\x80\x15a\x02\tW_\x80\xFD[Pa\x02\x12a\x0F\xB3V[\0[a\x02.`\x04\x806\x03\x81\x01\x90a\x02)\x91\x90a1\xC6V[a\x10\xFBV[\0[4\x80\x15a\x02;W_\x80\xFD[Pa\x02Da\x11\x1AV[`@Qa\x02Q\x91\x90a28V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02eW_\x80\xFD[Pa\x02na\x11KV[`@Qa\x02{\x91\x90a,\xD3V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x8FW_\x80\xFD[Pa\x02\x98a\x11mV[\0[4\x80\x15a\x02\xA5W_\x80\xFD[Pa\x02\xAEa\x12\x92V[`@Qa\x02\xC1\x97\x96\x95\x94\x93\x92\x91\x90a3`V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xD5W_\x80\xFD[Pa\x02\xF0`\x04\x806\x03\x81\x01\x90a\x02\xEB\x91\x90a3\xE2V[a\x13\x9BV[\0[4\x80\x15a\x02\xFDW_\x80\xFD[Pa\x03\x06a\x15\xF5V[`@Qa\x03\x13\x91\x90a-vV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03'W_\x80\xFD[Pa\x03B`\x04\x806\x03\x81\x01\x90a\x03=\x91\x90a,\x8EV[a\x16.V[`@Qa\x03O\x91\x90a.}V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03cW_\x80\xFD[Pa\x03~`\x04\x806\x03\x81\x01\x90a\x03y\x91\x90a,\x8EV[a\x16\xFFV[`@Qa\x03\x8B\x91\x90a,\xD3V[`@Q\x80\x91\x03\x90\xF3[_\x80a\x03\x9Ea\x173V[\x90P\x80`\x07\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[```@Q\x80`@\x01`@R\x80`\x11\x81R` \x01\x7FInputVerification\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x04\t_a\x17ZV[a\x04\x13`\x01a\x17ZV[a\x04\x1C_a\x17ZV[`@Q` \x01a\x04/\x94\x93\x92\x91\x90a5gV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x90V[``_a\x04Na\x173V[\x90P\x80`\n\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x04\xE0W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x04\x97W[PPPPP\x91PP\x91\x90PV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xD3\xED\xFE3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x05:\x91\x90a5\xC5V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05UW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05y\x91\x90a6\x08V[a\x05\xBAW3`@Q\x7FR\xD7%\xF5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05\xB1\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[_a\x05\xC3a\x173V[\x90P\x80_\x01T\x88\x11\x80a\x05\xD5WP_\x88\x14[\x15a\x06\x17W\x87`@Q\x7FG\x11\x08?\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x06\x0E\x91\x90a63V[`@Q\x80\x91\x03\x90\xFD[_\x81`\x01\x01_\x8A\x81R` \x01\x90\x81R` \x01_ `@Q\x80``\x01`@R\x90\x81_\x82\x01T\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RPP\x90P_`@Q\x80`\xA0\x01`@R\x80\x8A\x8A\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81R` \x01\x83`@\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x83` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x83_\x01Q\x81R` \x01\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x81RP\x90P_a\x07\xD9\x82a\x18$V[\x90P_a\x08)\x82\x8A\x8A\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa\x18\xE3V[\x90Pa\x084\x81a\x19\rV[a\x08?\x8C3\x83a\x19\xDDV[_\x85`\x02\x01_\x8E\x81R` \x01\x90\x81R` \x01_ _\x84\x81R` \x01\x90\x81R` \x01_ \x90P\x80\x8A\x8A\x90\x91\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x92\x90\x91\x92\x90\x91\x92\x90\x91\x92P\x91\x82a\x08\x9D\x92\x91\x90a8PV[P`\x01\x86`\x05\x01_\x8F\x81R` \x01\x90\x81R` \x01_ _\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x85`\x03\x01_\x8E\x81R` \x01\x90\x81R` \x01_ _\x84\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x85`\x04\x01_\x8E\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\t\xBAWPa\t\xB9\x81\x80T\x90Pa\x1B0V[[\x15a\n?W`\x01\x86`\x04\x01_\x8F\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x82\x86`\x06\x01_\x8F\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x8C\x7F\xFE,CXW\x86\xA5\xA6X\xD2\xEC]\xF5\xDE\xA3\xFB3\x85\xB7|\x94\xF6\x0FrO\xF8\x10\x89oA\x985\x8D\x8D\x84`@Qa\n6\x93\x92\x91\x90a:\xE3V[`@Q\x80\x91\x03\x90\xA2[PPPPPPPPPPPPPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xD3\xED\xFE3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\n\x9B\x91\x90a5\xC5V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\n\xB6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\n\xDA\x91\x90a6\x08V[a\x0B\x1BW3`@Q\x7FR\xD7%\xF5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0B\x12\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[_a\x0B$a\x173V[\x90P\x80_\x01T\x84\x11\x80a\x0B6WP_\x84\x14[\x15a\x0BxW\x83`@Q\x7FG\x11\x08?\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0Bo\x91\x90a63V[`@Q\x80\x91\x03\x90\xFD[_s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xEFi\x97\xF93`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0B\xC6\x91\x90a5\xC5V[_`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0B\xE0W=_\x80>=_\xFD[PPPP`@Q=_\x82>=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0C\x08\x91\x90a=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x104\x91\x90a=GV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15\x80\x15a\x10\xAFWPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x10\xF1W3`@Q\x7F\xE1\x91f\xEE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x10\xE8\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[a\x10\xF9a\x1C4V[V[a\x11\x03a\x1C\xA2V[a\x11\x0C\x82a\x1D\x88V[a\x11\x16\x82\x82a\x1E{V[PPV[_a\x11#a\x1F\x99V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[_\x80a\x11Ua V[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x90V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cF\xFB\xF6\x8E3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x11\xBA\x91\x90a5\xC5V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11\xD5W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11\xF9\x91\x90a6\x08V[\x15\x80\x15a\x12FWPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x12\x88W3`@Q\x7F8\x89\x16\xBB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x12\x7F\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[a\x12\x90a GV[V[_``\x80_\x80_``_a\x12\xA4a \xB6V[\x90P_\x80\x1B\x81_\x01T\x14\x80\x15a\x12\xBFWP_\x80\x1B\x81`\x01\x01T\x14[a\x12\xFEW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x12\xF5\x90a=\xBCV[`@Q\x80\x91\x03\x90\xFD[a\x13\x06a \xDDV[a\x13\x0Ea!{V[F0_\x80\x1B_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x13-Wa\x13,a0\xA2V[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x13[W\x81` \x01` \x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x7F\x0F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95\x94\x93\x92\x91\x90\x97P\x97P\x97P\x97P\x97P\x97P\x97PP\x90\x91\x92\x93\x94\x95\x96V[\x86s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x13\xE9\x91\x90a63V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x14\x04W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x14(\x91\x90a6\x08V[a\x14iW\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14`\x91\x90a63V[`@Q\x80\x91\x03\x90\xFD[a\x14qa\"\x19V[_a\x14za\x173V[\x90P\x80_\x01_\x81T\x80\x92\x91\x90a\x14\x8F\x90a<\xC5V[\x91\x90PUP_\x81_\x01T\x90P`@Q\x80``\x01`@R\x80\x8B\x81R` \x01\x8As\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x89s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP\x82`\x01\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01U` \x82\x01Q\x81`\x01\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x02\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x90PP`\x01\x82`\x0B\x01_\x83\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x89_\x82\x7F\xE2\xCA\xFA\x1B\x82C1\x1C\x08(\x83<}\xDF\x93V\xC9*Q\xA2$k\xCFh\xE1?\"\xB1]\xEF\xDD\x99\x8C\x8C\x8C\x8C\x8C\x8C`@Qa\x15\xE1\x96\x95\x94\x93\x92\x91\x90a>\x16V[`@Q\x80\x91\x03\x90\xA4PPPPPPPPPPV[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[``_a\x169a\x173V[\x90P_\x81`\x06\x01_\x85\x81R` \x01\x90\x81R` \x01_ T\x90P\x81`\x03\x01_\x85\x81R` \x01\x90\x81R` \x01_ _\x82\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x16\xF1W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x16\xA8W[PPPPP\x92PPP\x91\x90PV[_\x80a\x17\ta\x173V[\x90P\x80`\x04\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x7FED\x16\\\xE1e2d\xFD\xCB\t\xB0)\x89\x1E=L\x8D\x85\x83Hh!\x17/\x88.\x19\xA1I\xA8\0\x90P\x90V[``_`\x01a\x17h\x84a\"ZV[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x17\x86Wa\x17\x85a0\xA2V[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x17\xB8W\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a\x18\x19W\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a\x18\x0EWa\x18\ra>kV[[\x04\x94P_\x85\x03a\x17\xC5W[\x81\x93PPPP\x91\x90PV[_a\x18\xDC`@Q\x80`\xA0\x01`@R\x80`\x7F\x81R` \x01aB\xE5`\x7F\x919\x80Q\x90` \x01 \x83_\x01Q`@Q` \x01a\x18\\\x91\x90a?IV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x84` \x01Q\x85`@\x01Q\x86``\x01Q\x87`\x80\x01Q`@Q` \x01a\x18\x96\x91\x90a?\xA3V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a\x18\xC1\x96\x95\x94\x93\x92\x91\x90a?\xB9V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 a#\xABV[\x90P\x91\x90PV[_\x80_\x80a\x18\xF1\x86\x86a#\xC4V[\x92P\x92P\x92Pa\x19\x01\x82\x82a$\x19V[\x82\x93PPPP\x92\x91PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c+\x10\x1C\x03\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x19Z\x91\x90a5\xC5V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x19uW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x19\x99\x91\x90a6\x08V[a\x19\xDAW\x80`@Q\x7F&\xCDu\xDC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x19\xD1\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[PV[_a\x19\xE6a\x173V[\x90P\x80`\x05\x01_\x85\x81R` \x01\x90\x81R` \x01_ _\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\x1A\x89W\x83\x83\x83`@Q\x7F\xF9\xEDC\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1A\x80\x93\x92\x91\x90a@\x18V[`@Q\x80\x91\x03\x90\xFD[\x80`\t\x01_\x85\x81R` \x01\x90\x81R` \x01_ _\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\x1B*W\x83\x83\x83`@Q\x7F/\xA71t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1B!\x93\x92\x91\x90a@\x18V[`@Q\x80\x91\x03\x90\xFD[PPPPV[_\x80s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cg\x99\xEFR`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1B\x8FW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1B\xB3\x91\x90a@aV[\x90P\x80\x83\x10\x15\x91PP\x91\x90PV[_a\x1B\xCAa\x1B\xE5V[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[a\x1C\x14a%{V[a\x1C\x1E\x82\x82a%\xBBV[PPV[a\x1C*a%{V[a\x1C2a&\x0CV[V[a\x1C=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1E\t\x91\x90a=GV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x1ExW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1Eo\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x1E\xE3WP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1E\xE0\x91\x90a@\xB6V[`\x01[a\x1F$W\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1F\x1B\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a\x1F\x8AW\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1F\x81\x91\x90a28V[`@Q\x80\x91\x03\x90\xFD[a\x1F\x94\x83\x83a&\xD6V[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a \x1EW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x7F\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\x90P\x90V[a Oa\"\x19V[_a Xa V[\x90P`\x01\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2Xa \x9Ea&|V[`@Qa \xAB\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xA1PV[_\x7F\xA1jF\xD9Ba\xC7Q|\xC8\xFF\x89\xF6\x1C\x0C\xE95\x98\xE3\xC8I\x80\x10\x11\xDE\xE6I\xA6\xA5W\xD1\0\x90P\x90V[``_a \xE8a \xB6V[\x90P\x80`\x02\x01\x80Ta \xF9\x90a6\x83V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta!%\x90a6\x83V[\x80\x15a!pW\x80`\x1F\x10a!GWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a!pV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a!SW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[``_a!\x86a \xB6V[\x90P\x80`\x03\x01\x80Ta!\x97\x90a6\x83V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta!\xC3\x90a6\x83V[\x80\x15a\"\x0EW\x80`\x1F\x10a!\xE5Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\"\x0EV[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a!\xF1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[a\"!a\x11KV[\x15a\"XW`@Q\x7F\xD9<\x06e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a\"\xB6Wz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a\"\xACWa\"\xABa>kV[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a\"\xF3Wm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a\"\xE9Wa\"\xE8a>kV[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a#\"Wf#\x86\xF2o\xC1\0\0\x83\x81a#\x18Wa#\x17a>kV[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a#KWc\x05\xF5\xE1\0\x83\x81a#AWa#@a>kV[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a#pWa'\x10\x83\x81a#fWa#ea>kV[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a#\x93W`d\x83\x81a#\x89Wa#\x88a>kV[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a#\xA2W`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a#\xBDa#\xB7a'HV[\x83a'VV[\x90P\x91\x90PV[_\x80_`A\x84Q\x03a$\x04W_\x80_` \x87\x01Q\x92P`@\x87\x01Q\x91P``\x87\x01Q_\x1A\x90Pa#\xF6\x88\x82\x85\x85a'\x96V[\x95P\x95P\x95PPPPa$\x12V[_`\x02\x85Q_\x1B\x92P\x92P\x92P[\x92P\x92P\x92V[_`\x03\x81\x11\x15a$,Wa$+a@\xE1V[[\x82`\x03\x81\x11\x15a$?Wa$>a@\xE1V[[\x03\x15a%wW`\x01`\x03\x81\x11\x15a$YWa$Xa@\xE1V[[\x82`\x03\x81\x11\x15a$lWa$ka@\xE1V[[\x03a$\xA3W`@Q\x7F\xF6E\xEE\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02`\x03\x81\x11\x15a$\xB7Wa$\xB6a@\xE1V[[\x82`\x03\x81\x11\x15a$\xCAWa$\xC9a@\xE1V[[\x03a%\x0EW\x80_\x1C`@Q\x7F\xFC\xE6\x98\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%\x05\x91\x90a63V[`@Q\x80\x91\x03\x90\xFD[`\x03\x80\x81\x11\x15a%!Wa% a@\xE1V[[\x82`\x03\x81\x11\x15a%4Wa%3a@\xE1V[[\x03a%vW\x80`@Q\x7F\xD7\x8B\xCE\x0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a%m\x91\x90a28V[`@Q\x80\x91\x03\x90\xFD[[PPV[a%\x83a(}V[a%\xB9W`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a%\xC3a%{V[_a%\xCCa \xB6V[\x90P\x82\x81`\x02\x01\x90\x81a%\xDF\x91\x90aAfV[P\x81\x81`\x03\x01\x90\x81a%\xF1\x91\x90aAfV[P_\x80\x1B\x81_\x01\x81\x90UP_\x80\x1B\x81`\x01\x01\x81\x90UPPPPV[a&\x14a%{V[_a&\x1Da V[\x90P_\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UPPV[a&Da\x11KV[a&zW`@Q\x7F\x8D\xFC +\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_3\x90P\x90V[_a&\xAF\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba(\x9BV[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a&\xDF\x82a(\xA4V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a';Wa'5\x82\x82a)mV[Pa'DV[a'Ca)\xEDV[[PPV[_a'Qa*)V[\x90P\x90V[_`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x83`\x02\x82\x01R\x82`\"\x82\x01R`B\x81 \x91PP\x92\x91PPV[_\x80_\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84_\x1C\x11\x15a'\xD2W_`\x03\x85\x92P\x92P\x92Pa(sV[_`\x01\x88\x88\x88\x88`@Q_\x81R` \x01`@R`@Qa'\xF5\x94\x93\x92\x91\x90aBPV[` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a(\x15W=_\x80>=_\xFD[PPP` `@Q\x03Q\x90P_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a(fW_`\x01_\x80\x1B\x93P\x93P\x93PPa(sV[\x80_\x80_\x1B\x93P\x93P\x93PP[\x94P\x94P\x94\x91PPV[_a(\x86a\x1B\xE5V[_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x90P\x90V[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a(\xFFW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a(\xF6\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[\x80a)+\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba(\x9BV[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa)\x96\x91\x90a?\xA3V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a)\xCEW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a)\xD3V[``\x91P[P\x91P\x91Pa)\xE3\x85\x83\x83a*\x8CV[\x92PPP\x92\x91PPV[_4\x11\x15a*'W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x7F\x8Bs\xC3\xC6\x9B\xB8\xFE=Q.\xCCL\xF7Y\xCCy#\x9F{\x17\x9B\x0F\xFA\xCA\xA9\xA7]R+9@\x0Fa*Sa+\x19V[a*[a+\x8FV[F0`@Q` \x01a*q\x95\x94\x93\x92\x91\x90aB\x93V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x90V[``\x82a*\xA1Wa*\x9C\x82a,\x06V[a+\x11V[_\x82Q\x14\x80\x15a*\xC7WP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a+\tW\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a+\0\x91\x90a5\xC5V[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa+\x12V[[\x93\x92PPPV[_\x80a+#a \xB6V[\x90P_a+.a \xDDV[\x90P_\x81Q\x11\x15a+JW\x80\x80Q\x90` \x01 \x92PPPa+\x8CV[_\x82_\x01T\x90P_\x80\x1B\x81\x14a+eW\x80\x93PPPPa+\x8CV[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x80a+\x99a \xB6V[\x90P_a+\xA4a!{V[\x90P_\x81Q\x11\x15a+\xC0W\x80\x80Q\x90` \x01 \x92PPPa,\x03V[_\x82`\x01\x01T\x90P_\x80\x1B\x81\x14a+\xDCW\x80\x93PPPPa,\x03V[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x81Q\x11\x15a,\x18W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[a,m\x81a,[V[\x81\x14a,wW_\x80\xFD[PV[_\x815\x90Pa,\x88\x81a,dV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a,\xA3Wa,\xA2a,SV[[_a,\xB0\x84\x82\x85\x01a,zV[\x91PP\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[a,\xCD\x81a,\xB9V[\x82RPPV[_` \x82\x01\x90Pa,\xE6_\x83\x01\x84a,\xC4V[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a-#W\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa-\x08V[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a-H\x82a,\xECV[a-R\x81\x85a,\xF6V[\x93Pa-b\x81\x85` \x86\x01a-\x06V[a-k\x81a-.V[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra-\x8E\x81\x84a->V[\x90P\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a-\xE8\x82a-\xBFV[\x90P\x91\x90PV[a-\xF8\x81a-\xDEV[\x82RPPV[_a.\t\x83\x83a-\xEFV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a.+\x82a-\x96V[a.5\x81\x85a-\xA0V[\x93Pa.@\x83a-\xB0V[\x80_[\x83\x81\x10\x15a.pW\x81Qa.W\x88\x82a-\xFEV[\x97Pa.b\x83a.\x15V[\x92PP`\x01\x81\x01\x90Pa.CV[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra.\x95\x81\x84a.!V[\x90P\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12a.\xBEWa.\xBDa.\x9DV[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a.\xDBWa.\xDAa.\xA1V[[` \x83\x01\x91P\x83` \x82\x02\x83\x01\x11\x15a.\xF7Wa.\xF6a.\xA5V[[\x92P\x92\x90PV[_\x80\x83`\x1F\x84\x01\x12a/\x13Wa/\x12a.\x9DV[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a/0Wa//a.\xA1V[[` \x83\x01\x91P\x83`\x01\x82\x02\x83\x01\x11\x15a/LWa/Ka.\xA5V[[\x92P\x92\x90PV[_\x80_\x80_\x80_`\x80\x88\x8A\x03\x12\x15a/nWa/ma,SV[[_a/{\x8A\x82\x8B\x01a,zV[\x97PP` \x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a/\x9CWa/\x9Ba,WV[[a/\xA8\x8A\x82\x8B\x01a.\xA9V[\x96P\x96PP`@\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a/\xCBWa/\xCAa,WV[[a/\xD7\x8A\x82\x8B\x01a.\xFEV[\x94P\x94PP``\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a/\xFAWa/\xF9a,WV[[a0\x06\x8A\x82\x8B\x01a.\xFEV[\x92P\x92PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[_\x80_`@\x84\x86\x03\x12\x15a0.Wa0-a,SV[[_a0;\x86\x82\x87\x01a,zV[\x93PP` \x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a0\\Wa0[a,WV[[a0h\x86\x82\x87\x01a.\xFEV[\x92P\x92PP\x92P\x92P\x92V[a0}\x81a-\xDEV[\x81\x14a0\x87W_\x80\xFD[PV[_\x815\x90Pa0\x98\x81a0tV[\x92\x91PPV[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a0\xD8\x82a-.V[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a0\xF7Wa0\xF6a0\xA2V[[\x80`@RPPPV[_a1\ta,JV[\x90Pa1\x15\x82\x82a0\xCFV[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a14Wa13a0\xA2V[[a1=\x82a-.V[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_a1ja1e\x84a1\x1AV[a1\0V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a1\x86Wa1\x85a0\x9EV[[a1\x91\x84\x82\x85a1JV[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a1\xADWa1\xACa.\x9DV[[\x815a1\xBD\x84\x82` \x86\x01a1XV[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a1\xDCWa1\xDBa,SV[[_a1\xE9\x85\x82\x86\x01a0\x8AV[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a2\nWa2\ta,WV[[a2\x16\x85\x82\x86\x01a1\x99V[\x91PP\x92P\x92\x90PV[_\x81\x90P\x91\x90PV[a22\x81a2 V[\x82RPPV[_` \x82\x01\x90Pa2K_\x83\x01\x84a2)V[\x92\x91PPV[_\x7F\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x82\x16\x90P\x91\x90PV[a2\x85\x81a2QV[\x82RPPV[a2\x94\x81a,[V[\x82RPPV[a2\xA3\x81a-\xDEV[\x82RPPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a2\xDB\x81a,[V[\x82RPPV[_a2\xEC\x83\x83a2\xD2V[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a3\x0E\x82a2\xA9V[a3\x18\x81\x85a2\xB3V[\x93Pa3#\x83a2\xC3V[\x80_[\x83\x81\x10\x15a3SW\x81Qa3:\x88\x82a2\xE1V[\x97Pa3E\x83a2\xF8V[\x92PP`\x01\x81\x01\x90Pa3&V[P\x85\x93PPPP\x92\x91PPV[_`\xE0\x82\x01\x90Pa3s_\x83\x01\x8Aa2|V[\x81\x81\x03` \x83\x01Ra3\x85\x81\x89a->V[\x90P\x81\x81\x03`@\x83\x01Ra3\x99\x81\x88a->V[\x90Pa3\xA8``\x83\x01\x87a2\x8BV[a3\xB5`\x80\x83\x01\x86a2\x9AV[a3\xC2`\xA0\x83\x01\x85a2)V[\x81\x81\x03`\xC0\x83\x01Ra3\xD4\x81\x84a3\x04V[\x90P\x98\x97PPPPPPPPV[_\x80_\x80_\x80_`\xA0\x88\x8A\x03\x12\x15a3\xFDWa3\xFCa,SV[[_a4\n\x8A\x82\x8B\x01a,zV[\x97PP` a4\x1B\x8A\x82\x8B\x01a0\x8AV[\x96PP`@a4,\x8A\x82\x8B\x01a0\x8AV[\x95PP``\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a4MWa4La,WV[[a4Y\x8A\x82\x8B\x01a.\xFEV[\x94P\x94PP`\x80\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a4|Wa4{a,WV[[a4\x88\x8A\x82\x8B\x01a.\xFEV[\x92P\x92PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[_\x81\x90P\x92\x91PPV[_a4\xAD\x82a,\xECV[a4\xB7\x81\x85a4\x99V[\x93Pa4\xC7\x81\x85` \x86\x01a-\x06V[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a5\x07`\x02\x83a4\x99V[\x91Pa5\x12\x82a4\xD3V[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a5Q`\x01\x83a4\x99V[\x91Pa5\\\x82a5\x1DV[`\x01\x82\x01\x90P\x91\x90PV[_a5r\x82\x87a4\xA3V[\x91Pa5}\x82a4\xFBV[\x91Pa5\x89\x82\x86a4\xA3V[\x91Pa5\x94\x82a5EV[\x91Pa5\xA0\x82\x85a4\xA3V[\x91Pa5\xAB\x82a5EV[\x91Pa5\xB7\x82\x84a4\xA3V[\x91P\x81\x90P\x95\x94PPPPPV[_` \x82\x01\x90Pa5\xD8_\x83\x01\x84a2\x9AV[\x92\x91PPV[a5\xE7\x81a,\xB9V[\x81\x14a5\xF1W_\x80\xFD[PV[_\x81Q\x90Pa6\x02\x81a5\xDEV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a6\x1DWa6\x1Ca,SV[[_a6*\x84\x82\x85\x01a5\xF4V[\x91PP\x92\x91PPV[_` \x82\x01\x90Pa6F_\x83\x01\x84a2\x8BV[\x92\x91PPV[_\x82\x90P\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\"`\x04R`$_\xFD[_`\x02\x82\x04\x90P`\x01\x82\x16\x80a6\x9AW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a6\xADWa6\xACa6VV[[P\x91\x90PV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_` `\x1F\x83\x01\x04\x90P\x91\x90PV[_\x82\x82\x1B\x90P\x92\x91PPV[_`\x08\x83\x02a7\x0F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82a6\xD4V[a7\x19\x86\x83a6\xD4V[\x95P\x80\x19\x84\x16\x93P\x80\x86\x16\x84\x17\x92PPP\x93\x92PPPV[_\x81\x90P\x91\x90PV[_a7Ta7Oa7J\x84a,[V[a71V[a,[V[\x90P\x91\x90PV[_\x81\x90P\x91\x90PV[a7m\x83a7:V[a7\x81a7y\x82a7[V[\x84\x84Ta6\xE0V[\x82UPPPPV[_\x90V[a7\x95a7\x89V[a7\xA0\x81\x84\x84a7dV[PPPV[[\x81\x81\x10\x15a7\xC3Wa7\xB8_\x82a7\x8DV[`\x01\x81\x01\x90Pa7\xA6V[PPV[`\x1F\x82\x11\x15a8\x08Wa7\xD9\x81a6\xB3V[a7\xE2\x84a6\xC5V[\x81\x01` \x85\x10\x15a7\xF1W\x81\x90P[a8\x05a7\xFD\x85a6\xC5V[\x83\x01\x82a7\xA5V[PP[PPPV[_\x82\x82\x1C\x90P\x92\x91PPV[_a8(_\x19\x84`\x08\x02a8\rV[\x19\x80\x83\x16\x91PP\x92\x91PPV[_a8@\x83\x83a8\x19V[\x91P\x82`\x02\x02\x82\x17\x90P\x92\x91PPV[a8Z\x83\x83a6LV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a8sWa8ra0\xA2V[[a8}\x82Ta6\x83V[a8\x88\x82\x82\x85a7\xC7V[_`\x1F\x83\x11`\x01\x81\x14a8\xB5W_\x84\x15a8\xA3W\x82\x87\x015\x90P[a8\xAD\x85\x82a85V[\x86UPa9\x14V[`\x1F\x19\x84\x16a8\xC3\x86a6\xB3V[_[\x82\x81\x10\x15a8\xEAW\x84\x89\x015\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90Pa8\xC5V[\x86\x83\x10\x15a9\x07W\x84\x89\x015a9\x03`\x1F\x89\x16\x82a8\x19V[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x80\xFD[\x82\x81\x837PPPV[_a9E\x83\x85a9\x1DV[\x93P\x7F\x07\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x11\x15a9xWa9wa9-V[[` \x83\x02\x92Pa9\x89\x83\x85\x84a91V[\x82\x84\x01\x90P\x93\x92PPPV[_\x81T\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81Ta9\xDD\x81a6\x83V[a9\xE7\x81\x86a9\xC1V[\x94P`\x01\x82\x16_\x81\x14a:\x01W`\x01\x81\x14a:\x17Wa:IV[`\xFF\x19\x83\x16\x86R\x81\x15\x15` \x02\x86\x01\x93Pa:IV[a: \x85a6\xB3V[_[\x83\x81\x10\x15a:AW\x81T\x81\x89\x01R`\x01\x82\x01\x91P` \x81\x01\x90Pa:\"V[\x80\x88\x01\x95PPP[PPP\x92\x91PPV[_a:]\x83\x83a9\xD1V[\x90P\x92\x91PPV[_`\x01\x82\x01\x90P\x91\x90PV[_a:{\x82a9\x95V[a:\x85\x81\x85a9\x9FV[\x93P\x83` \x82\x02\x85\x01a:\x97\x85a9\xAFV[\x80_[\x85\x81\x10\x15a:\xD1W\x84\x84\x03\x89R\x81a:\xB2\x85\x82a:RV[\x94Pa:\xBD\x83a:eV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90Pa:\x9AV[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_`@\x82\x01\x90P\x81\x81\x03_\x83\x01Ra:\xFC\x81\x85\x87a9:V[\x90P\x81\x81\x03` \x83\x01Ra;\x10\x81\x84a:qV[\x90P\x94\x93PPPPV[_\x80\xFD[_\x80\xFD[_\x81Q\x90Pa;0\x81a0tV[\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a;PWa;Oa0\xA2V[[a;Y\x82a-.V[\x90P` \x81\x01\x90P\x91\x90PV[_a;xa;s\x84a;6V[a1\0V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a;\x94Wa;\x93a0\x9EV[[a;\x9F\x84\x82\x85a-\x06V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a;\xBBWa;\xBAa.\x9DV[[\x81Qa;\xCB\x84\x82` \x86\x01a;fV[\x91PP\x92\x91PPV[_``\x82\x84\x03\x12\x15a;\xE9Wa;\xE8a;\x1AV[[a;\xF3``a1\0V[\x90P_a<\x02\x84\x82\x85\x01a;\"V[_\x83\x01RP` a<\x15\x84\x82\x85\x01a;\"V[` \x83\x01RP`@\x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a<9Wa<8a;\x1EV[[a\x02\x83\x85\x84a1JV[a>\x0B\x83a-.V[\x84\x01\x90P\x93\x92PPPV[_`\x80\x82\x01\x90Pa>)_\x83\x01\x89a2\x9AV[a>6` \x83\x01\x88a2\x9AV[\x81\x81\x03`@\x83\x01Ra>I\x81\x86\x88a=\xEAV[\x90P\x81\x81\x03``\x83\x01Ra>^\x81\x84\x86a=\xEAV[\x90P\x97\x96PPPPPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[_\x81Q\x90P\x91\x90PV[_\x81\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a>\xC4\x81a2 V[\x82RPPV[_a>\xD5\x83\x83a>\xBBV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a>\xF7\x82a>\x98V[a?\x01\x81\x85a>\xA2V[\x93Pa?\x0C\x83a>\xACV[\x80_[\x83\x81\x10\x15a?\xCAV[\x97Pa?.\x83a>\xE1V[\x92PP`\x01\x81\x01\x90Pa?\x0FV[P\x85\x93PPPP\x92\x91PPV[_a?T\x82\x84a>\xEDV[\x91P\x81\x90P\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x81\x90P\x92\x91PPV[_a?}\x82a?_V[a?\x87\x81\x85a?iV[\x93Pa?\x97\x81\x85` \x86\x01a-\x06V[\x80\x84\x01\x91PP\x92\x91PPV[_a?\xAE\x82\x84a?sV[\x91P\x81\x90P\x92\x91PPV[_`\xC0\x82\x01\x90Pa?\xCC_\x83\x01\x89a2)V[a?\xD9` \x83\x01\x88a2)V[a?\xE6`@\x83\x01\x87a2\x9AV[a?\xF3``\x83\x01\x86a2\x9AV[a@\0`\x80\x83\x01\x85a2\x8BV[a@\r`\xA0\x83\x01\x84a2)V[\x97\x96PPPPPPPV[_``\x82\x01\x90Pa@+_\x83\x01\x86a2\x8BV[a@8` \x83\x01\x85a2\x9AV[a@E`@\x83\x01\x84a2\x9AV[\x94\x93PPPPV[_\x81Q\x90Pa@[\x81a,dV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a@vWa@ua,SV[[_a@\x83\x84\x82\x85\x01a@MV[\x91PP\x92\x91PPV[a@\x95\x81a2 V[\x81\x14a@\x9FW_\x80\xFD[PV[_\x81Q\x90Pa@\xB0\x81a@\x8CV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a@\xCBWa@\xCAa,SV[[_a@\xD8\x84\x82\x85\x01a@\xA2V[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[`\x1F\x82\x11\x15aAaWaA2\x81aA\x0EV[aA;\x84a6\xC5V[\x81\x01` \x85\x10\x15aAJW\x81\x90P[aA^aAV\x85a6\xC5V[\x83\x01\x82a7\xA5V[PP[PPPV[aAo\x82a,\xECV[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aA\x88WaA\x87a0\xA2V[[aA\x92\x82Ta6\x83V[aA\x9D\x82\x82\x85aA V[_` \x90P`\x1F\x83\x11`\x01\x81\x14aA\xCEW_\x84\x15aA\xBCW\x82\x87\x01Q\x90P[aA\xC6\x85\x82a85V[\x86UPaB-V[`\x1F\x19\x84\x16aA\xDC\x86aA\x0EV[_[\x82\x81\x10\x15aB\x03W\x84\x89\x01Q\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90PaA\xDEV[\x86\x83\x10\x15aB W\x84\x89\x01QaB\x1C`\x1F\x89\x16\x82a8\x19V[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPV[_`\xFF\x82\x16\x90P\x91\x90PV[aBJ\x81aB5V[\x82RPPV[_`\x80\x82\x01\x90PaBc_\x83\x01\x87a2)V[aBp` \x83\x01\x86aBAV[aB}`@\x83\x01\x85a2)V[aB\x8A``\x83\x01\x84a2)V[\x95\x94PPPPPV[_`\xA0\x82\x01\x90PaB\xA6_\x83\x01\x88a2)V[aB\xB3` \x83\x01\x87a2)V[aB\xC0`@\x83\x01\x86a2)V[aB\xCD``\x83\x01\x85a2\x8BV[aB\xDA`\x80\x83\x01\x84a2\x9AV[\x96\x95PPPPPPV\xFECiphertextVerification(bytes32[] ctHandles,address userAddress,address contractAddress,uint256 contractChainId,bytes extraData)", + b"`\x80`@R`\x046\x10a\0\xFDW_5`\xE0\x1C\x80cR\xD1\x90-\x11a\0\x94W\x80c\xA7\0I\x96\x11a\0cW\x80c\xA7\0I\x96\x14a\x02\xD5W\x80c\xAD<\xB1\xCC\x14a\x02\xFDW\x80c\xC4\x11Xt\x14a\x03'W\x80c\xCE~BW\x14a\x03=W\x80c\xE9o\x88\xEA\x14a\x03yWa\0\xFDV[\x80cR\xD1\x90-\x14a\x02;W\x80c\\\x97Z\xBB\x14a\x02eW\x80c\x84V\xCBY\x14a\x02\x8FW\x80c\x84\xB0\x19n\x14a\x02\xA5Wa\0\xFDV[\x80c3\x80\x07\xFC\x11a\0\xD0W\x80c3\x80\x07\xFC\x14a\x01\xCBW\x80c9\xF78\x10\x14a\x01\xF3W\x80c?K\xA8:\x14a\x02\tW\x80cO\x1E\xF2\x86\x14a\x02\x1FWa\0\xFDV[\x80c\x0CaX9\x14a\x01\x01W\x80c\r\x8En,\x14a\x01=W\x80c\x1B\xBE\x9F\xAE\x14a\x01gW\x80c1\xBE\xDE\xA3\x14a\x01\xA3W[_\x80\xFD[4\x80\x15a\x01\x0CW_\x80\xFD[Pa\x01'`\x04\x806\x03\x81\x01\x90a\x01\"\x91\x90a1\xB6V[a\x03\xB5V[`@Qa\x014\x91\x90a1\xFBV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01HW_\x80\xFD[Pa\x01Qa\x03\xE9V[`@Qa\x01^\x91\x90a2\x9EV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01rW_\x80\xFD[Pa\x01\x8D`\x04\x806\x03\x81\x01\x90a\x01\x88\x91\x90a1\xB6V[a\x04dV[`@Qa\x01\x9A\x91\x90a3\xA5V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xAEW_\x80\xFD[Pa\x01\xC9`\x04\x806\x03\x81\x01\x90a\x01\xC4\x91\x90a4{V[a\x05\x0EV[\0[4\x80\x15a\x01\xD6W_\x80\xFD[Pa\x01\xF1`\x04\x806\x03\x81\x01\x90a\x01\xEC\x91\x90a5?V[a\nfV[\0[4\x80\x15a\x01\xFEW_\x80\xFD[Pa\x02\x07a\x0F\x13V[\0[4\x80\x15a\x02\x14W_\x80\xFD[Pa\x02\x1Da\x10\xFFV[\0[a\x029`\x04\x806\x03\x81\x01\x90a\x024\x91\x90a6\xEEV[a\x12GV[\0[4\x80\x15a\x02FW_\x80\xFD[Pa\x02Oa\x12fV[`@Qa\x02\\\x91\x90a7`V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02pW_\x80\xFD[Pa\x02ya\x12\x97V[`@Qa\x02\x86\x91\x90a1\xFBV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x9AW_\x80\xFD[Pa\x02\xA3a\x12\xB9V[\0[4\x80\x15a\x02\xB0W_\x80\xFD[Pa\x02\xB9a\x13\xDEV[`@Qa\x02\xCC\x97\x96\x95\x94\x93\x92\x91\x90a8\x88V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xE0W_\x80\xFD[Pa\x02\xFB`\x04\x806\x03\x81\x01\x90a\x02\xF6\x91\x90a9\nV[a\x14\xE7V[\0[4\x80\x15a\x03\x08W_\x80\xFD[Pa\x03\x11a\x184V[`@Qa\x03\x1E\x91\x90a2\x9EV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x032W_\x80\xFD[Pa\x03;a\x18mV[\0[4\x80\x15a\x03HW_\x80\xFD[Pa\x03c`\x04\x806\x03\x81\x01\x90a\x03^\x91\x90a1\xB6V[a\x19\x92V[`@Qa\x03p\x91\x90a3\xA5V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x03\x84W_\x80\xFD[Pa\x03\x9F`\x04\x806\x03\x81\x01\x90a\x03\x9A\x91\x90a1\xB6V[a\x1AcV[`@Qa\x03\xAC\x91\x90a1\xFBV[`@Q\x80\x91\x03\x90\xF3[_\x80a\x03\xBFa\x1A\x97V[\x90P\x80`\x07\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[```@Q\x80`@\x01`@R\x80`\x11\x81R` \x01\x7FInputVerification\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x04*_a\x1A\xBEV[a\x044`\x02a\x1A\xBEV[a\x04=_a\x1A\xBEV[`@Q` \x01a\x04P\x94\x93\x92\x91\x90a:\x8FV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x90V[``_a\x04oa\x1A\x97V[\x90P\x80`\n\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x05\x01W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x04\xB8W[PPPPP\x91PP\x91\x90PV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c:Qb\xE6`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x05gW_\x80\xFD[PZ\xF1\x15\x80\x15a\x05yW=_\x80>=_\xFD[PPPP_a\x05\x86a\x1A\x97V[\x90P\x80_\x01T\x88\x11\x80a\x05\x98WP_\x88\x14[\x15a\x05\xDAW\x87`@Q\x7FG\x11\x08?\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05\xD1\x91\x90a:\xEDV[`@Q\x80\x91\x03\x90\xFD[_\x81`\x0B\x01_\x8A\x81R` \x01\x90\x81R` \x01_ T\x90Pa\x05\xFB\x813a\x1B\x88V[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xCD\x8E\x99<\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x06H\x91\x90a:\xEDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06cW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06\x87\x91\x90a;0V[a\x07[W_s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x88\x8B\x99\xE0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x06\xD9\x91\x90a:\xEDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06\xF4W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\x18\x91\x90a;~V[\x90P\x89\x82\x82`@Q\x7F\xC0\xEE\xDB{\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x07R\x93\x92\x91\x90a<\x1CV[`@Q\x80\x91\x03\x90\xFD[_a\x07\xEB\x8A\x8A\x8A\x80\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83` \x02\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPP\x84\x88\x88\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa\x1C]V[\x90P_a\x08;\x82\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x81\x84\x01R`\x1F\x19`\x1F\x82\x01\x16\x90P\x80\x83\x01\x92PPPPPPPa\x1D\xFAV[\x90Pa\x08G\x83\x82a\x1E$V[a\x08R\x8B3\x83a\x1E\xF9V[_\x84`\x02\x01_\x8D\x81R` \x01\x90\x81R` \x01_ _\x84\x81R` \x01\x90\x81R` \x01_ \x90P\x80\x89\x89\x90\x91\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x92\x90\x91\x92\x90\x91\x92\x90\x91\x92P\x91\x82a\x08\xB0\x92\x91\x90a>UV[P`\x01\x85`\x05\x01_\x8E\x81R` \x01\x90\x81R` \x01_ _\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x84`\x03\x01_\x8D\x81R` \x01\x90\x81R` \x01_ _\x84\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x84`\x04\x01_\x8D\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\t\xCEWPa\t\xCD\x84\x82\x80T\x90Pa LV[[\x15a\nXW`\x01\x85`\x04\x01_\x8E\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x82\x85`\x06\x01_\x8E\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x83\x8C\x7F\xF9jf\xBB\x08\xCFTP\xF5x\x9DsC\xFA;X\xD4\xA0\nf\xEF-\r\x04\x94\xF4$\xB0;\n\xBF\xF2\x8D\x8D\x85\x8C\x8C`@Qa\nO\x95\x94\x93\x92\x91\x90aA$V[`@Q\x80\x91\x03\x90\xA3[PPPPPPPPPPPPV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c:Qb\xE6`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\n\xBFW_\x80\xFD[PZ\xF1\x15\x80\x15a\n\xD1W=_\x80>=_\xFD[PPPP_a\n\xDEa\x1A\x97V[\x90P\x80_\x01T\x84\x11\x80a\n\xF0WP_\x84\x14[\x15a\x0B2W\x83`@Q\x7FG\x11\x08?\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0B)\x91\x90a:\xEDV[`@Q\x80\x91\x03\x90\xFD[_\x81`\x0B\x01_\x86\x81R` \x01\x90\x81R` \x01_ T\x90Pa\x0BS\x813a\x1B\x88V[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xCD\x8E\x99<\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0B\xA0\x91\x90a:\xEDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0B\xBBW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0B\xDF\x91\x90a;0V[a\x0C\xB3W_s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x88\x8B\x99\xE0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0C1\x91\x90a:\xEDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0CLW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0Cp\x91\x90a;~V[\x90P\x85\x82\x82`@Q\x7F\xF3\"X\x93\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0C\xAA\x93\x92\x91\x90a<\x1CV[`@Q\x80\x91\x03\x90\xFD[_s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x82\n\x91\xF8\x833`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\x03\x92\x91\x90aArV[_`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\x1DW=_\x80>=_\xFD[PPPP`@Q=_\x82>=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\rE\x91\x90aC\0V[\x90P_\x81`@\x01Q\x90Pa\rZ\x873\x83a\x1E\xF9V[\x83`\x08\x01_\x88\x81R` \x01\x90\x81R` \x01_ _\x81T\x80\x92\x91\x90a\r}\x90aCtV[\x91\x90PUP`\x01\x84`\t\x01_\x89\x81R` \x01\x90\x81R` \x01_ _\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x83`\n\x01_\x88\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x83`\x07\x01_\x88\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x0E\x9FWPa\x0E\x9E\x83\x85`\x08\x01_\x8A\x81R` \x01\x90\x81R` \x01_ Ta LV[[\x15a\x0F\nW`\x01\x84`\x07\x01_\x89\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x86\x7FoK\x13vySl`\x81\xC7\xF0$\x87\x03'\xAA\x89\xB6*d\x18/-A\xE4\xFB\xDE\xE5\xE2$\x8E\x86\x87\x87`@Qa\x0F\x01\x92\x91\x90aC\xBBV[`@Q\x80\x91\x03\x90\xA2[PPPPPPPV[`\x01a\x0F\x1Da \xE9V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x0F^W`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03_a\x0Fia!\rV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x0F\xB1WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x0F\xE8W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UPa\x10\xA1`@Q\x80`@\x01`@R\x80`\x11\x81R` \x01\x7FInputVerification\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP`@Q\x80`@\x01`@R\x80`\x01\x81R` \x01\x7F1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RPa!4V[a\x10\xA9a!JV[_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x10\xF3\x91\x90aC\xFFV[`@Q\x80\x91\x03\x90\xA1PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11\\W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11\x80\x91\x90aD\x18V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15\x80\x15a\x11\xFBWPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x12=W3`@Q\x7F\xE1\x91f\xEE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x124\x91\x90aDCV[`@Q\x80\x91\x03\x90\xFD[a\x12Ea!\\V[V[a\x12Oa!\xCAV[a\x12X\x82a\"\xB0V[a\x12b\x82\x82a#\xA3V[PPV[_a\x12oa$\xC1V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[_\x80a\x12\xA1a%HV[\x90P\x80_\x01_\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x90V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cF\xFB\xF6\x8E3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x13\x06\x91\x90aDCV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x13!W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13E\x91\x90a;0V[\x15\x80\x15a\x13\x92WPs\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x13\xD4W3`@Q\x7F8\x89\x16\xBB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x13\xCB\x91\x90aDCV[`@Q\x80\x91\x03\x90\xFD[a\x13\xDCa%oV[V[_``\x80_\x80_``_a\x13\xF0a%\xDEV[\x90P_\x80\x1B\x81_\x01T\x14\x80\x15a\x14\x0BWP_\x80\x1B\x81`\x01\x01T\x14[a\x14JW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14A\x90aD\xA6V[`@Q\x80\x91\x03\x90\xFD[a\x14Ra&\x05V[a\x14Za&\xA3V[F0_\x80\x1B_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x14yWa\x14xa5\xCAV[[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x14\xA7W\x81` \x01` \x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x7F\x0F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95\x94\x93\x92\x91\x90\x97P\x97P\x97P\x97P\x97P\x97P\x97PP\x90\x91\x92\x93\x94\x95\x96V[\x86s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x155\x91\x90a:\xEDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x15PW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x15t\x91\x90a;0V[a\x15\xB5W\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x15\xAC\x91\x90a:\xEDV[`@Q\x80\x91\x03\x90\xFD[a\x15\xBDa'AV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c:Qb\xE6`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x16\x16W_\x80\xFD[PZ\xF1\x15\x80\x15a\x16(W=_\x80>=_\xFD[PPPP_a\x165a\x1A\x97V[\x90P\x80_\x01_\x81T\x80\x92\x91\x90a\x16J\x90aCtV[\x91\x90PUP_\x81_\x01T\x90P`@Q\x80``\x01`@R\x80\x8B\x81R` \x01\x8As\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x89s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP\x82`\x01\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x82\x01Q\x81_\x01U` \x82\x01Q\x81`\x01\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x02\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x90PP_s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x99\x1D\xC3m`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17\xA5W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x17\xC9\x91\x90aD\xD8V[\x90P\x80\x83`\x0B\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x81\x90UP\x8A\x81\x83\x7F\xE2\xCA\xFA\x1B\x82C1\x1C\x08(\x83<}\xDF\x93V\xC9*Q\xA2$k\xCFh\xE1?\"\xB1]\xEF\xDD\x99\x8D\x8D\x8D\x8D\x8D\x8D`@Qa\x18\x1F\x96\x95\x94\x93\x92\x91\x90aE\x03V[`@Q\x80\x91\x03\x90\xA4PPPPPPPPPPPV[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[`\x03_a\x18xa!\rV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x18\xC0WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x18\xF7W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x19\x86\x91\x90aC\xFFV[`@Q\x80\x91\x03\x90\xA1PPV[``_a\x19\x9Da\x1A\x97V[\x90P_\x81`\x06\x01_\x85\x81R` \x01\x90\x81R` \x01_ T\x90P\x81`\x03\x01_\x85\x81R` \x01\x90\x81R` \x01_ _\x82\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x1AUW` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x1A\x0CW[PPPPP\x92PPP\x91\x90PV[_\x80a\x1Ama\x1A\x97V[\x90P\x80`\x04\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[_\x7FED\x16\\\xE1e2d\xFD\xCB\t\xB0)\x89\x1E=L\x8D\x85\x83Hh!\x17/\x88.\x19\xA1I\xA8\0\x90P\x90V[``_`\x01a\x1A\xCC\x84a'\x82V[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1A\xEAWa\x1A\xE9a5\xCAV[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x1B\x1CW\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a\x1B}W\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a\x1BrWa\x1BqaEXV[[\x04\x94P_\x85\x03a\x1B)W[\x81\x93PPPP\x91\x90PV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x86%\xE8v\x83\x83`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1B\xD7\x92\x91\x90aArV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1B\xF2W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1C\x16\x91\x90a;0V[a\x1CYW\x81\x81`@Q\x7F)\xA9\x93\xC1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1CP\x92\x91\x90aArV[`@Q\x80\x91\x03\x90\xFD[PPV[_\x80a\x1Cga\x1A\x97V[\x90P_\x81`\x01\x01_\x88\x81R` \x01\x90\x81R` \x01_ `@Q\x80``\x01`@R\x90\x81_\x82\x01T\x81R` \x01`\x01\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\x02\x82\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RPP\x90Pa\x1D\xEE`@Q\x80`\xC0\x01`@R\x80`\x9C\x81R` \x01aIt`\x9C\x919\x80Q\x90` \x01 \x87`@Q` \x01a\x1Dq\x91\x90aF6V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x83`@\x01Q\x84` \x01Q\x85_\x01Q\x8A\x8A`@Q` \x01a\x1D\xA7\x91\x90aF\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a\x1D\xD3\x97\x96\x95\x94\x93\x92\x91\x90aF\xA6V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 a(\xD3V[\x92PPP\x94\x93PPPPV[_\x80_\x80a\x1E\x08\x86\x86a(\xECV[\x92P\x92P\x92Pa\x1E\x18\x82\x82a)AV[\x82\x93PPPP\x92\x91PPV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xCD\xBBZ\x82\x83\x83`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1Es\x92\x91\x90aArV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x1E\x8EW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1E\xB2\x91\x90a;0V[a\x1E\xF5W\x81\x81`@Q\x7FUO\x8C_\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1E\xEC\x92\x91\x90aArV[`@Q\x80\x91\x03\x90\xFD[PPV[_a\x1F\x02a\x1A\x97V[\x90P\x80`\x05\x01_\x85\x81R` \x01\x90\x81R` \x01_ _\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\x1F\xA5W\x83\x83\x83`@Q\x7F\xF9\xEDC\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1F\x9C\x93\x92\x91\x90aG\x13V[`@Q\x80\x91\x03\x90\xFD[\x80`\t\x01_\x85\x81R` \x01\x90\x81R` \x01_ _\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a FW\x83\x83\x83`@Q\x7F/\xA71t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a =\x93\x92\x91\x90aG\x13V[`@Q\x80\x91\x03\x90\xFD[PPPPV[_\x80s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xF8\x81t\xEA\x85`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a \x9B\x91\x90a:\xEDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a \xB6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a \xDA\x91\x90aD\xD8V[\x90P\x80\x83\x10\x15\x91PP\x92\x91PPV[_a \xF2a!\rV[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[a!=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a#1\x91\x90aD\x18V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a#\xA0W3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a#\x97\x91\x90aDCV[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a$\x0BWP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a$\x08\x91\x90aGrV[`\x01[a$LW\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a$C\x91\x90aDCV[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a$\xB2W\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a$\xA9\x91\x90a7`V[`@Q\x80\x91\x03\x90\xFD[a$\xBC\x83\x83a+\xFEV[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a%FW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x7F\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\x90P\x90V[a%wa'AV[_a%\x80a%HV[\x90P`\x01\x81_\x01_a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2Xa%\xC6a+\xA4V[`@Qa%\xD3\x91\x90aDCV[`@Q\x80\x91\x03\x90\xA1PV[_\x7F\xA1jF\xD9Ba\xC7Q|\xC8\xFF\x89\xF6\x1C\x0C\xE95\x98\xE3\xC8I\x80\x10\x11\xDE\xE6I\xA6\xA5W\xD1\0\x90P\x90V[``_a&\x10a%\xDEV[\x90P\x80`\x02\x01\x80Ta&!\x90a<\x88V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta&M\x90a<\x88V[\x80\x15a&\x98W\x80`\x1F\x10a&oWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a&\x98V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a&{W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[``_a&\xAEa%\xDEV[\x90P\x80`\x03\x01\x80Ta&\xBF\x90a<\x88V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta&\xEB\x90a<\x88V[\x80\x15a'6W\x80`\x1F\x10a'\rWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a'6V[\x82\x01\x91\x90_R` _ \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a'\x19W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x91PP\x90V[a'Ia\x12\x97V[\x15a'\x80W`@Q\x7F\xD9<\x06e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a'\xDEWz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a'\xD4Wa'\xD3aEXV[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a(\x1BWm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a(\x11Wa(\x10aEXV[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a(JWf#\x86\xF2o\xC1\0\0\x83\x81a(@Wa(?aEXV[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a(sWc\x05\xF5\xE1\0\x83\x81a(iWa(haEXV[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a(\x98Wa'\x10\x83\x81a(\x8EWa(\x8DaEXV[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a(\xBBW`d\x83\x81a(\xB1Wa(\xB0aEXV[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a(\xCAW`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a(\xE5a(\xDFa,pV[\x83a,~V[\x90P\x91\x90PV[_\x80_`A\x84Q\x03a),W_\x80_` \x87\x01Q\x92P`@\x87\x01Q\x91P``\x87\x01Q_\x1A\x90Pa)\x1E\x88\x82\x85\x85a,\xBEV[\x95P\x95P\x95PPPPa):V[_`\x02\x85Q_\x1B\x92P\x92P\x92P[\x92P\x92P\x92V[_`\x03\x81\x11\x15a)TWa)Sa;\xA9V[[\x82`\x03\x81\x11\x15a)gWa)fa;\xA9V[[\x03\x15a*\x9FW`\x01`\x03\x81\x11\x15a)\x81Wa)\x80a;\xA9V[[\x82`\x03\x81\x11\x15a)\x94Wa)\x93a;\xA9V[[\x03a)\xCBW`@Q\x7F\xF6E\xEE\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02`\x03\x81\x11\x15a)\xDFWa)\xDEa;\xA9V[[\x82`\x03\x81\x11\x15a)\xF2Wa)\xF1a;\xA9V[[\x03a*6W\x80_\x1C`@Q\x7F\xFC\xE6\x98\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a*-\x91\x90a:\xEDV[`@Q\x80\x91\x03\x90\xFD[`\x03\x80\x81\x11\x15a*IWa*Ha;\xA9V[[\x82`\x03\x81\x11\x15a*\\Wa*[a;\xA9V[[\x03a*\x9EW\x80`@Q\x7F\xD7\x8B\xCE\x0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a*\x95\x91\x90a7`V[`@Q\x80\x91\x03\x90\xFD[[PPV[a*\xABa-\xA5V[a*\xE1W`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a*\xEBa*\xA3V[_a*\xF4a%\xDEV[\x90P\x82\x81`\x02\x01\x90\x81a+\x07\x91\x90aG\xF5V[P\x81\x81`\x03\x01\x90\x81a+\x19\x91\x90aG\xF5V[P_\x80\x1B\x81_\x01\x81\x90UP_\x80\x1B\x81`\x01\x01\x81\x90UPPPPV[a+ v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba-\xC3V[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a,\x07\x82a-\xCCV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a,cWa,]\x82\x82a.\x95V[Pa,lV[a,ka/\x15V[[PPV[_a,ya/QV[\x90P\x90V[_`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x83`\x02\x82\x01R\x82`\"\x82\x01R`B\x81 \x91PP\x92\x91PPV[_\x80_\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84_\x1C\x11\x15a,\xFAW_`\x03\x85\x92P\x92P\x92Pa-\x9BV[_`\x01\x88\x88\x88\x88`@Q_\x81R` \x01`@R`@Qa-\x1D\x94\x93\x92\x91\x90aH\xDFV[` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a-=W=_\x80>=_\xFD[PPP` `@Q\x03Q\x90P_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a-\x8EW_`\x01_\x80\x1B\x93P\x93P\x93PPa-\x9BV[\x80_\x80_\x1B\x93P\x93P\x93PP[\x94P\x94P\x94\x91PPV[_a-\xAEa!\rV[_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x90P\x90V[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a.'W\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a.\x1E\x91\x90aDCV[`@Q\x80\x91\x03\x90\xFD[\x80a.S\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba-\xC3V[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa.\xBE\x91\x90aF\x90V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a.\xF6W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a.\xFBV[``\x91P[P\x91P\x91Pa/\x0B\x85\x83\x83a/\xB4V[\x92PPP\x92\x91PPV[_4\x11\x15a/OW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x7F\x8Bs\xC3\xC6\x9B\xB8\xFE=Q.\xCCL\xF7Y\xCCy#\x9F{\x17\x9B\x0F\xFA\xCA\xA9\xA7]R+9@\x0Fa/{a0AV[a/\x83a0\xB7V[F0`@Q` \x01a/\x99\x95\x94\x93\x92\x91\x90aI\"V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x90V[``\x82a/\xC9Wa/\xC4\x82a1.V[a09V[_\x82Q\x14\x80\x15a/\xEFWP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a01W\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a0(\x91\x90aDCV[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa0:V[[\x93\x92PPPV[_\x80a0Ka%\xDEV[\x90P_a0Va&\x05V[\x90P_\x81Q\x11\x15a0rW\x80\x80Q\x90` \x01 \x92PPPa0\xB4V[_\x82_\x01T\x90P_\x80\x1B\x81\x14a0\x8DW\x80\x93PPPPa0\xB4V[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x80a0\xC1a%\xDEV[\x90P_a0\xCCa&\xA3V[\x90P_\x81Q\x11\x15a0\xE8W\x80\x80Q\x90` \x01 \x92PPPa1+V[_\x82`\x01\x01T\x90P_\x80\x1B\x81\x14a1\x04W\x80\x93PPPPa1+V[\x7F\xC5\xD2F\x01\x86\xF7#<\x92~}\xB2\xDC\xC7\x03\xC0\xE5\0\xB6S\xCA\x82';{\xFA\xD8\x04]\x85\xA4p\x93PPPP[\x90V[_\x81Q\x11\x15a1@W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[a1\x95\x81a1\x83V[\x81\x14a1\x9FW_\x80\xFD[PV[_\x815\x90Pa1\xB0\x81a1\x8CV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a1\xCBWa1\xCAa1{V[[_a1\xD8\x84\x82\x85\x01a1\xA2V[\x91PP\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[a1\xF5\x81a1\xE1V[\x82RPPV[_` \x82\x01\x90Pa2\x0E_\x83\x01\x84a1\xECV[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a2KW\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa20V[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a2p\x82a2\x14V[a2z\x81\x85a2\x1EV[\x93Pa2\x8A\x81\x85` \x86\x01a2.V[a2\x93\x81a2VV[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra2\xB6\x81\x84a2fV[\x90P\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a3\x10\x82a2\xE7V[\x90P\x91\x90PV[a3 \x81a3\x06V[\x82RPPV[_a31\x83\x83a3\x17V[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a3S\x82a2\xBEV[a3]\x81\x85a2\xC8V[\x93Pa3h\x83a2\xD8V[\x80_[\x83\x81\x10\x15a3\x98W\x81Qa3\x7F\x88\x82a3&V[\x97Pa3\x8A\x83a3=V[\x92PP`\x01\x81\x01\x90Pa3kV[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra3\xBD\x81\x84a3IV[\x90P\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12a3\xE6Wa3\xE5a3\xC5V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a4\x03Wa4\x02a3\xC9V[[` \x83\x01\x91P\x83` \x82\x02\x83\x01\x11\x15a4\x1FWa4\x1Ea3\xCDV[[\x92P\x92\x90PV[_\x80\x83`\x1F\x84\x01\x12a4;Wa4:a3\xC5V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a4XWa4Wa3\xC9V[[` \x83\x01\x91P\x83`\x01\x82\x02\x83\x01\x11\x15a4tWa4sa3\xCDV[[\x92P\x92\x90PV[_\x80_\x80_\x80_`\x80\x88\x8A\x03\x12\x15a4\x96Wa4\x95a1{V[[_a4\xA3\x8A\x82\x8B\x01a1\xA2V[\x97PP` \x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a4\xC4Wa4\xC3a1\x7FV[[a4\xD0\x8A\x82\x8B\x01a3\xD1V[\x96P\x96PP`@\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a4\xF3Wa4\xF2a1\x7FV[[a4\xFF\x8A\x82\x8B\x01a4&V[\x94P\x94PP``\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a5\"Wa5!a1\x7FV[[a5.\x8A\x82\x8B\x01a4&V[\x92P\x92PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[_\x80_`@\x84\x86\x03\x12\x15a5VWa5Ua1{V[[_a5c\x86\x82\x87\x01a1\xA2V[\x93PP` \x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a5\x84Wa5\x83a1\x7FV[[a5\x90\x86\x82\x87\x01a4&V[\x92P\x92PP\x92P\x92P\x92V[a5\xA5\x81a3\x06V[\x81\x14a5\xAFW_\x80\xFD[PV[_\x815\x90Pa5\xC0\x81a5\x9CV[\x92\x91PPV[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a6\0\x82a2VV[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a6\x1FWa6\x1Ea5\xCAV[[\x80`@RPPPV[_a61a1rV[\x90Pa6=\x82\x82a5\xF7V[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a6\\Wa6[a5\xCAV[[a6e\x82a2VV[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_a6\x92a6\x8D\x84a6BV[a6(V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a6\xAEWa6\xADa5\xC6V[[a6\xB9\x84\x82\x85a6rV[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a6\xD5Wa6\xD4a3\xC5V[[\x815a6\xE5\x84\x82` \x86\x01a6\x80V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a7\x04Wa7\x03a1{V[[_a7\x11\x85\x82\x86\x01a5\xB2V[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a72Wa71a1\x7FV[[a7>\x85\x82\x86\x01a6\xC1V[\x91PP\x92P\x92\x90PV[_\x81\x90P\x91\x90PV[a7Z\x81a7HV[\x82RPPV[_` \x82\x01\x90Pa7s_\x83\x01\x84a7QV[\x92\x91PPV[_\x7F\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x82\x16\x90P\x91\x90PV[a7\xAD\x81a7yV[\x82RPPV[a7\xBC\x81a1\x83V[\x82RPPV[a7\xCB\x81a3\x06V[\x82RPPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a8\x03\x81a1\x83V[\x82RPPV[_a8\x14\x83\x83a7\xFAV[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a86\x82a7\xD1V[a8@\x81\x85a7\xDBV[\x93Pa8K\x83a7\xEBV[\x80_[\x83\x81\x10\x15a8{W\x81Qa8b\x88\x82a8\tV[\x97Pa8m\x83a8 V[\x92PP`\x01\x81\x01\x90Pa8NV[P\x85\x93PPPP\x92\x91PPV[_`\xE0\x82\x01\x90Pa8\x9B_\x83\x01\x8Aa7\xA4V[\x81\x81\x03` \x83\x01Ra8\xAD\x81\x89a2fV[\x90P\x81\x81\x03`@\x83\x01Ra8\xC1\x81\x88a2fV[\x90Pa8\xD0``\x83\x01\x87a7\xB3V[a8\xDD`\x80\x83\x01\x86a7\xC2V[a8\xEA`\xA0\x83\x01\x85a7QV[\x81\x81\x03`\xC0\x83\x01Ra8\xFC\x81\x84a8,V[\x90P\x98\x97PPPPPPPPV[_\x80_\x80_\x80_`\xA0\x88\x8A\x03\x12\x15a9%Wa9$a1{V[[_a92\x8A\x82\x8B\x01a1\xA2V[\x97PP` a9C\x8A\x82\x8B\x01a5\xB2V[\x96PP`@a9T\x8A\x82\x8B\x01a5\xB2V[\x95PP``\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a9uWa9ta1\x7FV[[a9\x81\x8A\x82\x8B\x01a4&V[\x94P\x94PP`\x80\x88\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a9\xA4Wa9\xA3a1\x7FV[[a9\xB0\x8A\x82\x8B\x01a4&V[\x92P\x92PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[_\x81\x90P\x92\x91PPV[_a9\xD5\x82a2\x14V[a9\xDF\x81\x85a9\xC1V[\x93Pa9\xEF\x81\x85` \x86\x01a2.V[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a:/`\x02\x83a9\xC1V[\x91Pa::\x82a9\xFBV[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a:y`\x01\x83a9\xC1V[\x91Pa:\x84\x82a:EV[`\x01\x82\x01\x90P\x91\x90PV[_a:\x9A\x82\x87a9\xCBV[\x91Pa:\xA5\x82a:#V[\x91Pa:\xB1\x82\x86a9\xCBV[\x91Pa:\xBC\x82a:mV[\x91Pa:\xC8\x82\x85a9\xCBV[\x91Pa:\xD3\x82a:mV[\x91Pa:\xDF\x82\x84a9\xCBV[\x91P\x81\x90P\x95\x94PPPPPV[_` \x82\x01\x90Pa;\0_\x83\x01\x84a7\xB3V[\x92\x91PPV[a;\x0F\x81a1\xE1V[\x81\x14a;\x19W_\x80\xFD[PV[_\x81Q\x90Pa;*\x81a;\x06V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a;EWa;Da1{V[[_a;R\x84\x82\x85\x01a;\x1CV[\x91PP\x92\x91PPV[`\x08\x81\x10a;gW_\x80\xFD[PV[_\x81Q\x90Pa;x\x81a;[V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a;\x93Wa;\x92a1{V[[_a;\xA0\x84\x82\x85\x01a;jV[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[`\x08\x81\x10a;\xE7Wa;\xE6a;\xA9V[[PV[_\x81\x90Pa;\xF7\x82a;\xD6V[\x91\x90PV[_a<\x06\x82a;\xEAV[\x90P\x91\x90PV[a<\x16\x81a;\xFCV[\x82RPPV[_``\x82\x01\x90Pa\rWa=\xDE\x81a<\xB8V[a=\xE7\x84a<\xCAV[\x81\x01` \x85\x10\x15a=\xF6W\x81\x90P[a>\na>\x02\x85a<\xCAV[\x83\x01\x82a=\xAAV[PP[PPPV[_\x82\x82\x1C\x90P\x92\x91PPV[_a>-_\x19\x84`\x08\x02a>\x12V[\x19\x80\x83\x16\x91PP\x92\x91PPV[_a>E\x83\x83a>\x1EV[\x91P\x82`\x02\x02\x82\x17\x90P\x92\x91PPV[a>_\x83\x83axWa>wa5\xCAV[[a>\x82\x82Ta<\x88V[a>\x8D\x82\x82\x85a=\xCCV[_`\x1F\x83\x11`\x01\x81\x14a>\xBAW_\x84\x15a>\xA8W\x82\x87\x015\x90P[a>\xB2\x85\x82a>:V[\x86UPa?\x19V[`\x1F\x19\x84\x16a>\xC8\x86a<\xB8V[_[\x82\x81\x10\x15a>\xEFW\x84\x89\x015\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90Pa>\xCAV[\x86\x83\x10\x15a?\x0CW\x84\x89\x015a?\x08`\x1F\x89\x16\x82a>\x1EV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x80\xFD[\x82\x81\x837PPPV[_a?J\x83\x85a?\"V[\x93P\x7F\x07\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x11\x15a?}Wa?|a?2V[[` \x83\x02\x92Pa?\x8E\x83\x85\x84a?6V[\x82\x84\x01\x90P\x93\x92PPPV[_\x81T\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81Ta?\xE2\x81a<\x88V[a?\xEC\x81\x86a?\xC6V[\x94P`\x01\x82\x16_\x81\x14a@\x06W`\x01\x81\x14a@\x1CWa@NV[`\xFF\x19\x83\x16\x86R\x81\x15\x15` \x02\x86\x01\x93Pa@NV[a@%\x85a<\xB8V[_[\x83\x81\x10\x15a@FW\x81T\x81\x89\x01R`\x01\x82\x01\x91P` \x81\x01\x90Pa@'V[\x80\x88\x01\x95PPP[PPP\x92\x91PPV[_a@b\x83\x83a?\xD6V[\x90P\x92\x91PPV[_`\x01\x82\x01\x90P\x91\x90PV[_a@\x80\x82a?\x9AV[a@\x8A\x81\x85a?\xA4V[\x93P\x83` \x82\x02\x85\x01a@\x9C\x85a?\xB4V[\x80_[\x85\x81\x10\x15a@\xD6W\x84\x84\x03\x89R\x81a@\xB7\x85\x82a@WV[\x94Pa@\xC2\x83a@jV[\x92P` \x8A\x01\x99PP`\x01\x81\x01\x90Pa@\x9FV[P\x82\x97P\x87\x95PPPPPP\x92\x91PPV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_aA\x03\x83\x85a@\xE8V[\x93PaA\x10\x83\x85\x84a6rV[aA\x19\x83a2VV[\x84\x01\x90P\x93\x92PPPV[_``\x82\x01\x90P\x81\x81\x03_\x83\x01RaA=\x81\x87\x89a??V[\x90P\x81\x81\x03` \x83\x01RaAQ\x81\x86a@vV[\x90P\x81\x81\x03`@\x83\x01RaAf\x81\x84\x86a@\xF8V[\x90P\x96\x95PPPPPPV[_`@\x82\x01\x90PaA\x85_\x83\x01\x85a7\xB3V[aA\x92` \x83\x01\x84a7\xC2V[\x93\x92PPPV[_\x80\xFD[_\x80\xFD[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15aA\xBBWaA\xBAa5\xCAV[[aA\xC4\x82a2VV[\x90P` \x81\x01\x90P\x91\x90PV[_aA\xE3aA\xDE\x84aA\xA1V[a6(V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15aA\xFFWaA\xFEa5\xC6V[[aB\n\x84\x82\x85a2.V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12aB&WaB%a3\xC5V[[\x81QaB6\x84\x82` \x86\x01aA\xD1V[\x91PP\x92\x91PPV[_\x81Q\x90PaBM\x81a5\x9CV[\x92\x91PPV[_`\x80\x82\x84\x03\x12\x15aBhWaBgaA\x99V[[aBr`\x80a6(V[\x90P_\x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aB\x91WaB\x90aA\x9DV[[aB\x9D\x84\x82\x85\x01aB\x12V[_\x83\x01RP` aB\xB0\x84\x82\x85\x01aB?V[` \x83\x01RP`@aB\xC4\x84\x82\x85\x01aB?V[`@\x83\x01RP``\x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aB\xE8WaB\xE7aA\x9DV[[aB\xF4\x84\x82\x85\x01aB\x12V[``\x83\x01RP\x92\x91PPV[_` \x82\x84\x03\x12\x15aC\x15WaC\x14a1{V[[_\x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aC2WaC1a1\x7FV[[aC>\x84\x82\x85\x01aBSV[\x91PP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_aC~\x82a1\x83V[\x91P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x03aC\xB0WaC\xAFaCGV[[`\x01\x82\x01\x90P\x91\x90PV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaC\xD4\x81\x84\x86a@\xF8V[\x90P\x93\x92PPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[aC\xF9\x81aC\xDDV[\x82RPPV[_` \x82\x01\x90PaD\x12_\x83\x01\x84aC\xF0V[\x92\x91PPV[_` \x82\x84\x03\x12\x15aD-WaD,a1{V[[_aD:\x84\x82\x85\x01aB?V[\x91PP\x92\x91PPV[_` \x82\x01\x90PaDV_\x83\x01\x84a7\xC2V[\x92\x91PPV[\x7FEIP712: Uninitialized\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_aD\x90`\x15\x83a2\x1EV[\x91PaD\x9B\x82aD\\V[` \x82\x01\x90P\x91\x90PV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01RaD\xBD\x81aD\x84V[\x90P\x91\x90PV[_\x81Q\x90PaD\xD2\x81a1\x8CV[\x92\x91PPV[_` \x82\x84\x03\x12\x15aD\xEDWaD\xECa1{V[[_aD\xFA\x84\x82\x85\x01aD\xC4V[\x91PP\x92\x91PPV[_`\x80\x82\x01\x90PaE\x16_\x83\x01\x89a7\xC2V[aE#` \x83\x01\x88a7\xC2V[\x81\x81\x03`@\x83\x01RaE6\x81\x86\x88a@\xF8V[\x90P\x81\x81\x03``\x83\x01RaEK\x81\x84\x86a@\xF8V[\x90P\x97\x96PPPPPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[_\x81Q\x90P\x91\x90PV[_\x81\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[aE\xB1\x81a7HV[\x82RPPV[_aE\xC2\x83\x83aE\xA8V[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_aE\xE4\x82aE\x85V[aE\xEE\x81\x85aE\x8FV[\x93PaE\xF9\x83aE\x99V[\x80_[\x83\x81\x10\x15aF)W\x81QaF\x10\x88\x82aE\xB7V[\x97PaF\x1B\x83aE\xCEV[\x92PP`\x01\x81\x01\x90PaE\xFCV[P\x85\x93PPPP\x92\x91PPV[_aFA\x82\x84aE\xDAV[\x91P\x81\x90P\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x81\x90P\x92\x91PPV[_aFj\x82aFLV[aFt\x81\x85aFVV[\x93PaF\x84\x81\x85` \x86\x01a2.V[\x80\x84\x01\x91PP\x92\x91PPV[_aF\x9B\x82\x84aF`V[\x91P\x81\x90P\x92\x91PPV[_`\xE0\x82\x01\x90PaF\xB9_\x83\x01\x8Aa7QV[aF\xC6` \x83\x01\x89a7QV[aF\xD3`@\x83\x01\x88a7\xC2V[aF\xE0``\x83\x01\x87a7\xC2V[aF\xED`\x80\x83\x01\x86a7\xB3V[aF\xFA`\xA0\x83\x01\x85a7\xB3V[aG\x07`\xC0\x83\x01\x84a7QV[\x98\x97PPPPPPPPV[_``\x82\x01\x90PaG&_\x83\x01\x86a7\xB3V[aG3` \x83\x01\x85a7\xC2V[aG@`@\x83\x01\x84a7\xC2V[\x94\x93PPPPV[aGQ\x81a7HV[\x81\x14aG[W_\x80\xFD[PV[_\x81Q\x90PaGl\x81aGHV[\x92\x91PPV[_` \x82\x84\x03\x12\x15aG\x87WaG\x86a1{V[[_aG\x94\x84\x82\x85\x01aG^V[\x91PP\x92\x91PPV[_\x81\x90P\x81_R` _ \x90P\x91\x90PV[`\x1F\x82\x11\x15aG\xF0WaG\xC1\x81aG\x9DV[aG\xCA\x84a<\xCAV[\x81\x01` \x85\x10\x15aG\xD9W\x81\x90P[aG\xEDaG\xE5\x85a<\xCAV[\x83\x01\x82a=\xAAV[PP[PPPV[aG\xFE\x82a2\x14V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aH\x17WaH\x16a5\xCAV[[aH!\x82Ta<\x88V[aH,\x82\x82\x85aG\xAFV[_` \x90P`\x1F\x83\x11`\x01\x81\x14aH]W_\x84\x15aHKW\x82\x87\x01Q\x90P[aHU\x85\x82a>:V[\x86UPaH\xBCV[`\x1F\x19\x84\x16aHk\x86aG\x9DV[_[\x82\x81\x10\x15aH\x92W\x84\x89\x01Q\x82U`\x01\x82\x01\x91P` \x85\x01\x94P` \x81\x01\x90PaHmV[\x86\x83\x10\x15aH\xAFW\x84\x89\x01QaH\xAB`\x1F\x89\x16\x82a>\x1EV[\x83UP[`\x01`\x02\x88\x02\x01\x88UPPP[PPPPPPV[_`\xFF\x82\x16\x90P\x91\x90PV[aH\xD9\x81aH\xC4V[\x82RPPV[_`\x80\x82\x01\x90PaH\xF2_\x83\x01\x87a7QV[aH\xFF` \x83\x01\x86aH\xD0V[aI\x0C`@\x83\x01\x85a7QV[aI\x19``\x83\x01\x84a7QV[\x95\x94PPPPPV[_`\xA0\x82\x01\x90PaI5_\x83\x01\x88a7QV[aIB` \x83\x01\x87a7QV[aIO`@\x83\x01\x86a7QV[aI\\``\x83\x01\x85a7\xB3V[aIi`\x80\x83\x01\x84a7\xC2V[\x96\x95PPPPPPV\xFECiphertextVerification(bytes32[] ctHandles,address userAddress,address contractAddress,uint256 contractChainId,uint256 coprocessorContextId,bytes extraData)", ); #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct ContextStatus(u8); + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::private::SolTypeValue for u8 { + #[inline] + fn stv_to_tokens( + &self, + ) -> as alloy_sol_types::SolType>::Token<'_> { + alloy_sol_types::private::SolTypeValue::< + alloy::sol_types::sol_data::Uint<8>, + >::stv_to_tokens(self) + } + #[inline] + fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { + as alloy_sol_types::SolType>::tokenize(self) + .0 + } + #[inline] + fn stv_abi_encode_packed_to( + &self, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::SolType>::abi_encode_packed_to(self, out) + } + #[inline] + fn stv_abi_packed_encoded_size(&self) -> usize { + as alloy_sol_types::SolType>::abi_encoded_size(self) + } + } + #[automatically_derived] + impl ContextStatus { + /// The Solidity type name. + pub const NAME: &'static str = stringify!(@ name); + /// Convert from the underlying value type. + #[inline] + pub const fn from_underlying(value: u8) -> Self { + Self(value) + } + /// Return the underlying value. + #[inline] + pub const fn into_underlying(self) -> u8 { + self.0 + } + /// Return the single encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode(&self) -> alloy_sol_types::private::Vec { + ::abi_encode(&self.0) + } + /// Return the packed encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode_packed(&self) -> alloy_sol_types::private::Vec { + ::abi_encode_packed(&self.0) + } + } + #[automatically_derived] + impl From for ContextStatus { + fn from(value: u8) -> Self { + Self::from_underlying(value) + } + } + #[automatically_derived] + impl From for u8 { + fn from(value: ContextStatus) -> Self { + value.into_underlying() + } + } + #[automatically_derived] + impl alloy_sol_types::SolType for ContextStatus { + type RustType = u8; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SOL_NAME: &'static str = Self::NAME; + const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; + const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; + #[inline] + fn valid_token(token: &Self::Token<'_>) -> bool { + Self::type_check(token).is_ok() + } + #[inline] + fn type_check(token: &Self::Token<'_>) -> alloy_sol_types::Result<()> { + as alloy_sol_types::SolType>::type_check(token) + } + #[inline] + fn detokenize(token: Self::Token<'_>) -> Self::RustType { + as alloy_sol_types::SolType>::detokenize(token) + } + } + #[automatically_derived] + impl alloy_sol_types::EventTopic for ContextStatus { + #[inline] + fn topic_preimage_length(rust: &Self::RustType) -> usize { + as alloy_sol_types::EventTopic>::topic_preimage_length(rust) + } + #[inline] + fn encode_topic_preimage( + rust: &Self::RustType, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::EventTopic>::encode_topic_preimage(rust, out) + } + #[inline] + fn encode_topic( + rust: &Self::RustType, + ) -> alloy_sol_types::abi::token::WordToken { + as alloy_sol_types::EventTopic>::encode_topic(rust) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Custom error with signature `AddressEmptyCode(address)` and selector `0x9996b315`. ```solidity error AddressEmptyCode(address target); @@ -1781,6 +2001,214 @@ error HostChainNotRegistered(uint256 chainId); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InvalidCoprocessorContextProofRejection(uint256,uint256,uint8)` and selector `0xf3225893`. +```solidity +error InvalidCoprocessorContextProofRejection(uint256 zkProofId, uint256 contextId, ContextStatus contextStatus); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidCoprocessorContextProofRejection { + #[allow(missing_docs)] + pub zkProofId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub contextStatus: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + ContextStatus, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: InvalidCoprocessorContextProofRejection) -> Self { + (value.zkProofId, value.contextId, value.contextStatus) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for InvalidCoprocessorContextProofRejection { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + zkProofId: tuple.0, + contextId: tuple.1, + contextStatus: tuple.2, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InvalidCoprocessorContextProofRejection { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InvalidCoprocessorContextProofRejection(uint256,uint256,uint8)"; + const SELECTOR: [u8; 4] = [243u8, 34u8, 88u8, 147u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.zkProofId), + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.contextStatus, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InvalidCoprocessorContextProofVerification(uint256,uint256,uint8)` and selector `0xc0eedb7b`. +```solidity +error InvalidCoprocessorContextProofVerification(uint256 zkProofId, uint256 contextId, ContextStatus contextStatus); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidCoprocessorContextProofVerification { + #[allow(missing_docs)] + pub zkProofId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub contextStatus: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, + ContextStatus, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: InvalidCoprocessorContextProofVerification) -> Self { + (value.zkProofId, value.contextId, value.contextStatus) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for InvalidCoprocessorContextProofVerification { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + zkProofId: tuple.0, + contextId: tuple.1, + contextStatus: tuple.2, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InvalidCoprocessorContextProofVerification { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InvalidCoprocessorContextProofVerification(uint256,uint256,uint8)"; + const SELECTOR: [u8; 4] = [192u8, 238u8, 219u8, 123u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.zkProofId), + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.contextStatus, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Custom error with signature `InvalidInitialization()` and selector `0xf92ee8a9`. ```solidity error InvalidInitialization(); @@ -1854,13 +2282,15 @@ error InvalidInitialization(); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `NotCoprocessorSigner(address)` and selector `0x26cd75dc`. + /**Custom error with signature `NotCoprocessorSignerFromContext(uint256,address)` and selector `0x554f8c5f`. ```solidity -error NotCoprocessorSigner(address signerAddress); +error NotCoprocessorSignerFromContext(uint256 contextId, address signerAddress); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct NotCoprocessorSigner { + pub struct NotCoprocessorSignerFromContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, #[allow(missing_docs)] pub signerAddress: alloy::sol_types::private::Address, } @@ -1873,9 +2303,15 @@ error NotCoprocessorSigner(address signerAddress); const _: () = { use alloy::sol_types as alloy_sol_types; #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -1889,26 +2325,31 @@ error NotCoprocessorSigner(address signerAddress); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: NotCoprocessorSigner) -> Self { - (value.signerAddress,) + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NotCoprocessorSignerFromContext) -> Self { + (value.contextId, value.signerAddress) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for NotCoprocessorSigner { + impl ::core::convert::From> + for NotCoprocessorSignerFromContext { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { signerAddress: tuple.0 } + Self { + contextId: tuple.0, + signerAddress: tuple.1, + } } } #[automatically_derived] - impl alloy_sol_types::SolError for NotCoprocessorSigner { + impl alloy_sol_types::SolError for NotCoprocessorSignerFromContext { type Parameters<'a> = UnderlyingSolTuple<'a>; type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "NotCoprocessorSigner(address)"; - const SELECTOR: [u8; 4] = [38u8, 205u8, 117u8, 220u8]; + const SIGNATURE: &'static str = "NotCoprocessorSignerFromContext(uint256,address)"; + const SELECTOR: [u8; 4] = [85u8, 79u8, 140u8, 95u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -1918,6 +2359,9 @@ error NotCoprocessorSigner(address signerAddress); #[inline] fn tokenize(&self) -> Self::Token<'_> { ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), ::tokenize( &self.signerAddress, ), @@ -1934,13 +2378,15 @@ error NotCoprocessorSigner(address signerAddress); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `NotCoprocessorTxSender(address)` and selector `0x52d725f5`. + /**Custom error with signature `NotCoprocessorTxSenderFromContext(uint256,address)` and selector `0x29a993c1`. ```solidity -error NotCoprocessorTxSender(address txSenderAddress); +error NotCoprocessorTxSenderFromContext(uint256 contextId, address txSenderAddress); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct NotCoprocessorTxSender { + pub struct NotCoprocessorTxSenderFromContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, #[allow(missing_docs)] pub txSenderAddress: alloy::sol_types::private::Address, } @@ -1953,9 +2399,15 @@ error NotCoprocessorTxSender(address txSenderAddress); const _: () = { use alloy::sol_types as alloy_sol_types; #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -1969,26 +2421,31 @@ error NotCoprocessorTxSender(address txSenderAddress); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: NotCoprocessorTxSender) -> Self { - (value.txSenderAddress,) + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NotCoprocessorTxSenderFromContext) -> Self { + (value.contextId, value.txSenderAddress) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for NotCoprocessorTxSender { + impl ::core::convert::From> + for NotCoprocessorTxSenderFromContext { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { txSenderAddress: tuple.0 } + Self { + contextId: tuple.0, + txSenderAddress: tuple.1, + } } } #[automatically_derived] - impl alloy_sol_types::SolError for NotCoprocessorTxSender { + impl alloy_sol_types::SolError for NotCoprocessorTxSenderFromContext { type Parameters<'a> = UnderlyingSolTuple<'a>; type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "NotCoprocessorTxSender(address)"; - const SELECTOR: [u8; 4] = [82u8, 215u8, 37u8, 245u8]; + const SIGNATURE: &'static str = "NotCoprocessorTxSenderFromContext(uint256,address)"; + const SELECTOR: [u8; 4] = [41u8, 169u8, 147u8, 193u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -1998,6 +2455,9 @@ error NotCoprocessorTxSender(address txSenderAddress); #[inline] fn tokenize(&self) -> Self::Token<'_> { ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), ::tokenize( &self.txSenderAddress, ), @@ -3275,9 +3735,9 @@ event Paused(address account); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `RejectProofResponse(uint256)` and selector `0xe465e141fa8abd95ab7e0855543307f8506ab0170ef664420fb71ab7de0183de`. + /**Event with signature `RejectProofResponse(uint256,bytes)` and selector `0x6f4b137679536c6081c7f024870327aa89b62a64182f2d41e4fbdee5e2248e86`. ```solidity -event RejectProofResponse(uint256 indexed zkProofId); +event RejectProofResponse(uint256 indexed zkProofId, bytes extraData); ```*/ #[allow( non_camel_case_types, @@ -3289,6 +3749,8 @@ event RejectProofResponse(uint256 indexed zkProofId); pub struct RejectProofResponse { #[allow(missing_docs)] pub zkProofId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub extraData: alloy::sol_types::private::Bytes, } #[allow( non_camel_case_types, @@ -3300,7 +3762,7 @@ event RejectProofResponse(uint256 indexed zkProofId); use alloy::sol_types as alloy_sol_types; #[automatically_derived] impl alloy_sol_types::SolEvent for RejectProofResponse { - type DataTuple<'a> = (); + type DataTuple<'a> = (alloy::sol_types::sol_data::Bytes,); type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; @@ -3308,11 +3770,11 @@ event RejectProofResponse(uint256 indexed zkProofId); alloy_sol_types::sol_data::FixedBytes<32>, alloy::sol_types::sol_data::Uint<256>, ); - const SIGNATURE: &'static str = "RejectProofResponse(uint256)"; + const SIGNATURE: &'static str = "RejectProofResponse(uint256,bytes)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 228u8, 101u8, 225u8, 65u8, 250u8, 138u8, 189u8, 149u8, 171u8, 126u8, 8u8, - 85u8, 84u8, 51u8, 7u8, 248u8, 80u8, 106u8, 176u8, 23u8, 14u8, 246u8, - 100u8, 66u8, 15u8, 183u8, 26u8, 183u8, 222u8, 1u8, 131u8, 222u8, + 111u8, 75u8, 19u8, 118u8, 121u8, 83u8, 108u8, 96u8, 129u8, 199u8, 240u8, + 36u8, 135u8, 3u8, 39u8, 170u8, 137u8, 182u8, 42u8, 100u8, 24u8, 47u8, + 45u8, 65u8, 228u8, 251u8, 222u8, 229u8, 226u8, 36u8, 142u8, 134u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -3321,7 +3783,10 @@ event RejectProofResponse(uint256 indexed zkProofId); topics: ::RustType, data: as alloy_sol_types::SolType>::RustType, ) -> Self { - Self { zkProofId: topics.1 } + Self { + zkProofId: topics.1, + extraData: data.0, + } } #[inline] fn check_signature( @@ -3340,7 +3805,11 @@ event RejectProofResponse(uint256 indexed zkProofId); } #[inline] fn tokenize_body(&self) -> Self::DataToken<'_> { - () + ( + ::tokenize( + &self.extraData, + ), + ) } #[inline] fn topics(&self) -> ::RustType { @@ -3754,9 +4223,9 @@ event VerifyProofRequest(uint256 indexed zkProofId, uint256 indexed coprocessorC }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `VerifyProofResponse(uint256,bytes32[],bytes[])` and selector `0xfe2c43585786a5a658d2ec5df5dea3fb3385b77c94f60f724ff810896f419835`. + /**Event with signature `VerifyProofResponse(uint256,uint256,bytes32[],bytes[],bytes)` and selector `0xf96a66bb08cf5450f5789d7343fa3b58d4a00a66ef2d0d0494f424b03b0abff2`. ```solidity -event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[] signatures); +event VerifyProofResponse(uint256 indexed zkProofId, uint256 indexed coprocessorContextId, bytes32[] ctHandles, bytes[] signatures, bytes extraData); ```*/ #[allow( non_camel_case_types, @@ -3769,11 +4238,15 @@ event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[ #[allow(missing_docs)] pub zkProofId: alloy::sol_types::private::primitives::aliases::U256, #[allow(missing_docs)] + pub coprocessorContextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] pub ctHandles: alloy::sol_types::private::Vec< alloy::sol_types::private::FixedBytes<32>, >, #[allow(missing_docs)] pub signatures: alloy::sol_types::private::Vec, + #[allow(missing_docs)] + pub extraData: alloy::sol_types::private::Bytes, } #[allow( non_camel_case_types, @@ -3790,6 +4263,7 @@ event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[ alloy::sol_types::sol_data::FixedBytes<32>, >, alloy::sol_types::sol_data::Array, + alloy::sol_types::sol_data::Bytes, ); type DataToken<'a> = , alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Uint<256>, ); - const SIGNATURE: &'static str = "VerifyProofResponse(uint256,bytes32[],bytes[])"; + const SIGNATURE: &'static str = "VerifyProofResponse(uint256,uint256,bytes32[],bytes[],bytes)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 254u8, 44u8, 67u8, 88u8, 87u8, 134u8, 165u8, 166u8, 88u8, 210u8, 236u8, - 93u8, 245u8, 222u8, 163u8, 251u8, 51u8, 133u8, 183u8, 124u8, 148u8, - 246u8, 15u8, 114u8, 79u8, 248u8, 16u8, 137u8, 111u8, 65u8, 152u8, 53u8, + 249u8, 106u8, 102u8, 187u8, 8u8, 207u8, 84u8, 80u8, 245u8, 120u8, 157u8, + 115u8, 67u8, 250u8, 59u8, 88u8, 212u8, 160u8, 10u8, 102u8, 239u8, 45u8, + 13u8, 4u8, 148u8, 244u8, 36u8, 176u8, 59u8, 10u8, 191u8, 242u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -3813,8 +4288,10 @@ event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[ ) -> Self { Self { zkProofId: topics.1, + coprocessorContextId: topics.2, ctHandles: data.0, signatures: data.1, + extraData: data.2, } } #[inline] @@ -3841,11 +4318,18 @@ event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[ as alloy_sol_types::SolType>::tokenize(&self.signatures), + ::tokenize( + &self.extraData, + ), ) } #[inline] fn topics(&self) -> ::RustType { - (Self::SIGNATURE_HASH.into(), self.zkProofId.clone()) + ( + Self::SIGNATURE_HASH.into(), + self.zkProofId.clone(), + self.coprocessorContextId.clone(), + ) } #[inline] fn encode_topics_raw( @@ -3861,6 +4345,11 @@ event VerifyProofResponse(uint256 indexed zkProofId, bytes32[] ctHandles, bytes[ out[1usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.zkProofId); + out[2usize] = as alloy_sol_types::EventTopic>::encode_topic( + &self.coprocessorContextId, + ); Ok(()) } } @@ -5647,9 +6136,146 @@ function proxiableUUID() external view returns (bytes32); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `reinitializeV2()` and selector `0xc4115874`. +```solidity +function reinitializeV2() external; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct reinitializeV2Call; + ///Container type for the return parameters of the [`reinitializeV2()`](reinitializeV2Call) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct reinitializeV2Return {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: reinitializeV2Call) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for reinitializeV2Call { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: reinitializeV2Return) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for reinitializeV2Return { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl reinitializeV2Return { + fn _tokenize( + &self, + ) -> ::ReturnToken<'_> { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for reinitializeV2Call { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = reinitializeV2Return; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "reinitializeV2()"; + const SELECTOR: [u8; 4] = [196u8, 17u8, 88u8, 116u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + reinitializeV2Return::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Function with signature `rejectProofResponse(uint256,bytes)` and selector `0x338007fc`. ```solidity -function rejectProofResponse(uint256 zkProofId, bytes memory) external; +function rejectProofResponse(uint256 zkProofId, bytes memory extraData) external; ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] @@ -5657,7 +6283,7 @@ function rejectProofResponse(uint256 zkProofId, bytes memory) external; #[allow(missing_docs)] pub zkProofId: alloy::sol_types::private::primitives::aliases::U256, #[allow(missing_docs)] - pub _1: alloy::sol_types::private::Bytes, + pub extraData: alloy::sol_types::private::Bytes, } ///Container type for the return parameters of the [`rejectProofResponse(uint256,bytes)`](rejectProofResponseCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] @@ -5698,7 +6324,7 @@ function rejectProofResponse(uint256 zkProofId, bytes memory) external; impl ::core::convert::From for UnderlyingRustTuple<'_> { fn from(value: rejectProofResponseCall) -> Self { - (value.zkProofId, value._1) + (value.zkProofId, value.extraData) } } #[automatically_derived] @@ -5708,7 +6334,7 @@ function rejectProofResponse(uint256 zkProofId, bytes memory) external; fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { zkProofId: tuple.0, - _1: tuple.1, + extraData: tuple.1, } } } @@ -5782,7 +6408,7 @@ function rejectProofResponse(uint256 zkProofId, bytes memory) external; 256, > as alloy_sol_types::SolType>::tokenize(&self.zkProofId), ::tokenize( - &self._1, + &self.extraData, ), ) } @@ -6518,6 +7144,8 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte #[allow(missing_docs)] proxiableUUID(proxiableUUIDCall), #[allow(missing_docs)] + reinitializeV2(reinitializeV2Call), + #[allow(missing_docs)] rejectProofResponse(rejectProofResponseCall), #[allow(missing_docs)] unpause(unpauseCall), @@ -6551,6 +7179,7 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte [132u8, 176u8, 25u8, 110u8], [167u8, 0u8, 73u8, 150u8], [173u8, 60u8, 177u8, 204u8], + [196u8, 17u8, 88u8, 116u8], [206u8, 126u8, 66u8, 87u8], [233u8, 111u8, 136u8, 234u8], ]; @@ -6559,7 +7188,7 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte impl alloy_sol_types::SolInterface for InputVerificationCalls { const NAME: &'static str = "InputVerificationCalls"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 16usize; + const COUNT: usize = 17usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -6592,6 +7221,9 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte Self::proxiableUUID(_) => { ::SELECTOR } + Self::reinitializeV2(_) => { + ::SELECTOR + } Self::rejectProofResponse(_) => { ::SELECTOR } @@ -6774,6 +7406,17 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte } UPGRADE_INTERFACE_VERSION }, + { + fn reinitializeV2( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(InputVerificationCalls::reinitializeV2) + } + reinitializeV2 + }, { fn getVerifyProofConsensusTxSenders( data: &[u8], @@ -6974,6 +7617,17 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte } UPGRADE_INTERFACE_VERSION }, + { + fn reinitializeV2( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(InputVerificationCalls::reinitializeV2) + } + reinitializeV2 + }, { fn getVerifyProofConsensusTxSenders( data: &[u8], @@ -7061,6 +7715,11 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte inner, ) } + Self::reinitializeV2(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::rejectProofResponse(inner) => { ::abi_encoded_size( inner, @@ -7149,6 +7808,12 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte out, ) } + Self::reinitializeV2(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::rejectProofResponse(inner) => { ::abi_encode_raw( inner, @@ -7208,11 +7873,17 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte #[allow(missing_docs)] HostChainNotRegistered(HostChainNotRegistered), #[allow(missing_docs)] + InvalidCoprocessorContextProofRejection(InvalidCoprocessorContextProofRejection), + #[allow(missing_docs)] + InvalidCoprocessorContextProofVerification( + InvalidCoprocessorContextProofVerification, + ), + #[allow(missing_docs)] InvalidInitialization(InvalidInitialization), #[allow(missing_docs)] - NotCoprocessorSigner(NotCoprocessorSigner), + NotCoprocessorSignerFromContext(NotCoprocessorSignerFromContext), #[allow(missing_docs)] - NotCoprocessorTxSender(NotCoprocessorTxSender), + NotCoprocessorTxSenderFromContext(NotCoprocessorTxSenderFromContext), #[allow(missing_docs)] NotCustodianSigner(NotCustodianSigner), #[allow(missing_docs)] @@ -7248,14 +7919,14 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte /// Prefer using `SolInterface` methods instead. pub const SELECTORS: &'static [[u8; 4usize]] = &[ [14u8, 86u8, 207u8, 61u8], - [38u8, 205u8, 117u8, 220u8], + [41u8, 169u8, 147u8, 193u8], [42u8, 124u8, 110u8, 246u8], [47u8, 167u8, 49u8, 116u8], [56u8, 137u8, 22u8, 187u8], [57u8, 22u8, 114u8, 167u8], [71u8, 17u8, 8u8, 63u8], [76u8, 156u8, 140u8, 227u8], - [82u8, 215u8, 37u8, 245u8], + [85u8, 79u8, 140u8, 95u8], [111u8, 79u8, 115u8, 31u8], [141u8, 252u8, 32u8, 43u8], [153u8, 150u8, 179u8, 21u8], @@ -7263,12 +7934,14 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte [174u8, 232u8, 99u8, 35u8], [179u8, 152u8, 151u8, 159u8], [182u8, 103u8, 156u8, 59u8], + [192u8, 238u8, 219u8, 123u8], [214u8, 189u8, 162u8, 117u8], [215u8, 139u8, 206u8, 12u8], [215u8, 230u8, 188u8, 248u8], [217u8, 60u8, 6u8, 101u8], [224u8, 124u8, 141u8, 186u8], [225u8, 145u8, 102u8, 238u8], + [243u8, 34u8, 88u8, 147u8], [246u8, 69u8, 238u8, 223u8], [249u8, 36u8, 160u8, 207u8], [249u8, 46u8, 232u8, 169u8], @@ -7280,7 +7953,7 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte impl alloy_sol_types::SolInterface for InputVerificationErrors { const NAME: &'static str = "InputVerificationErrors"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 27usize; + const COUNT: usize = 29usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -7320,14 +7993,20 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte Self::HostChainNotRegistered(_) => { ::SELECTOR } + Self::InvalidCoprocessorContextProofRejection(_) => { + ::SELECTOR + } + Self::InvalidCoprocessorContextProofVerification(_) => { + ::SELECTOR + } Self::InvalidInitialization(_) => { ::SELECTOR } - Self::NotCoprocessorSigner(_) => { - ::SELECTOR + Self::NotCoprocessorSignerFromContext(_) => { + ::SELECTOR } - Self::NotCoprocessorTxSender(_) => { - ::SELECTOR + Self::NotCoprocessorTxSenderFromContext(_) => { + ::SELECTOR } Self::NotCustodianSigner(_) => { ::SELECTOR @@ -7396,15 +8075,17 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte NotGatewayOwner }, { - fn NotCoprocessorSigner( + fn NotCoprocessorTxSenderFromContext( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw( + ::abi_decode_raw( data, ) - .map(InputVerificationErrors::NotCoprocessorSigner) + .map( + InputVerificationErrors::NotCoprocessorTxSenderFromContext, + ) } - NotCoprocessorSigner + NotCoprocessorTxSenderFromContext }, { fn NotKmsSigner( @@ -7471,15 +8152,17 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte ERC1967InvalidImplementation }, { - fn NotCoprocessorTxSender( + fn NotCoprocessorSignerFromContext( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw( + ::abi_decode_raw( data, ) - .map(InputVerificationErrors::NotCoprocessorTxSender) + .map( + InputVerificationErrors::NotCoprocessorSignerFromContext, + ) } - NotCoprocessorTxSender + NotCoprocessorSignerFromContext }, { fn NotInitializingFromEmptyProxy( @@ -7558,6 +8241,19 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte } HostChainNotRegistered }, + { + fn InvalidCoprocessorContextProofVerification( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + InputVerificationErrors::InvalidCoprocessorContextProofVerification, + ) + } + InvalidCoprocessorContextProofVerification + }, { fn FailedCall( data: &[u8], @@ -7622,6 +8318,19 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte } NotOwnerOrGatewayConfig }, + { + fn InvalidCoprocessorContextProofRejection( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + InputVerificationErrors::InvalidCoprocessorContextProofRejection, + ) + } + InvalidCoprocessorContextProofRejection + }, { fn ECDSAInvalidSignature( data: &[u8], @@ -7709,15 +8418,17 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte NotGatewayOwner }, { - fn NotCoprocessorSigner( + fn NotCoprocessorTxSenderFromContext( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( + ::abi_decode_raw_validate( data, ) - .map(InputVerificationErrors::NotCoprocessorSigner) + .map( + InputVerificationErrors::NotCoprocessorTxSenderFromContext, + ) } - NotCoprocessorSigner + NotCoprocessorTxSenderFromContext }, { fn NotKmsSigner( @@ -7786,15 +8497,17 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte ERC1967InvalidImplementation }, { - fn NotCoprocessorTxSender( + fn NotCoprocessorSignerFromContext( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( + ::abi_decode_raw_validate( data, ) - .map(InputVerificationErrors::NotCoprocessorTxSender) + .map( + InputVerificationErrors::NotCoprocessorSignerFromContext, + ) } - NotCoprocessorTxSender + NotCoprocessorSignerFromContext }, { fn NotInitializingFromEmptyProxy( @@ -7873,6 +8586,19 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte } HostChainNotRegistered }, + { + fn InvalidCoprocessorContextProofVerification( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + InputVerificationErrors::InvalidCoprocessorContextProofVerification, + ) + } + InvalidCoprocessorContextProofVerification + }, { fn FailedCall( data: &[u8], @@ -7939,6 +8665,19 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte } NotOwnerOrGatewayConfig }, + { + fn InvalidCoprocessorContextProofRejection( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + InputVerificationErrors::InvalidCoprocessorContextProofRejection, + ) + } + InvalidCoprocessorContextProofRejection + }, { fn ECDSAInvalidSignature( data: &[u8], @@ -8062,18 +8801,28 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte inner, ) } + Self::InvalidCoprocessorContextProofRejection(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::InvalidCoprocessorContextProofVerification(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::InvalidInitialization(inner) => { ::abi_encoded_size( inner, ) } - Self::NotCoprocessorSigner(inner) => { - ::abi_encoded_size( + Self::NotCoprocessorSignerFromContext(inner) => { + ::abi_encoded_size( inner, ) } - Self::NotCoprocessorTxSender(inner) => { - ::abi_encoded_size( + Self::NotCoprocessorTxSenderFromContext(inner) => { + ::abi_encoded_size( inner, ) } @@ -8209,20 +8958,32 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte out, ) } + Self::InvalidCoprocessorContextProofRejection(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::InvalidCoprocessorContextProofVerification(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::InvalidInitialization(inner) => { ::abi_encode_raw( inner, out, ) } - Self::NotCoprocessorSigner(inner) => { - ::abi_encode_raw( + Self::NotCoprocessorSignerFromContext(inner) => { + ::abi_encode_raw( inner, out, ) } - Self::NotCoprocessorTxSender(inner) => { - ::abi_encode_raw( + Self::NotCoprocessorTxSenderFromContext(inner) => { + ::abi_encode_raw( inner, out, ) @@ -8347,6 +9108,11 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte 2u8, 112u8, 181u8, 234u8, 116u8, 0u8, 13u8, 17u8, 176u8, 201u8, 247u8, 71u8, 84u8, 235u8, 219u8, 252u8, 84u8, 75u8, 5u8, 162u8, 88u8, ], + [ + 111u8, 75u8, 19u8, 118u8, 121u8, 83u8, 108u8, 96u8, 129u8, 199u8, 240u8, + 36u8, 135u8, 3u8, 39u8, 170u8, 137u8, 182u8, 42u8, 100u8, 24u8, 47u8, + 45u8, 65u8, 228u8, 251u8, 222u8, 229u8, 226u8, 36u8, 142u8, 134u8, + ], [ 188u8, 124u8, 215u8, 90u8, 32u8, 238u8, 39u8, 253u8, 154u8, 222u8, 186u8, 179u8, 32u8, 65u8, 247u8, 85u8, 33u8, 77u8, 188u8, 107u8, 255u8, 169u8, @@ -8363,14 +9129,9 @@ function verifyProofResponse(uint256 zkProofId, bytes32[] memory ctHandles, byte 207u8, 104u8, 225u8, 63u8, 34u8, 177u8, 93u8, 239u8, 221u8, 153u8, ], [ - 228u8, 101u8, 225u8, 65u8, 250u8, 138u8, 189u8, 149u8, 171u8, 126u8, 8u8, - 85u8, 84u8, 51u8, 7u8, 248u8, 80u8, 106u8, 176u8, 23u8, 14u8, 246u8, - 100u8, 66u8, 15u8, 183u8, 26u8, 183u8, 222u8, 1u8, 131u8, 222u8, - ], - [ - 254u8, 44u8, 67u8, 88u8, 87u8, 134u8, 165u8, 166u8, 88u8, 210u8, 236u8, - 93u8, 245u8, 222u8, 163u8, 251u8, 51u8, 133u8, 183u8, 124u8, 148u8, - 246u8, 15u8, 114u8, 79u8, 248u8, 16u8, 137u8, 111u8, 65u8, 152u8, 53u8, + 249u8, 106u8, 102u8, 187u8, 8u8, 207u8, 84u8, 80u8, 245u8, 120u8, 157u8, + 115u8, 67u8, 250u8, 59u8, 88u8, 212u8, 160u8, 10u8, 102u8, 239u8, 45u8, + 13u8, 4u8, 148u8, 244u8, 36u8, 176u8, 59u8, 10u8, 191u8, 242u8, ], ]; } @@ -8752,16 +9513,22 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ ) -> alloy_contract::SolCallBuilder<&P, proxiableUUIDCall, N> { self.call_builder(&proxiableUUIDCall) } + ///Creates a new call builder for the [`reinitializeV2`] function. + pub fn reinitializeV2( + &self, + ) -> alloy_contract::SolCallBuilder<&P, reinitializeV2Call, N> { + self.call_builder(&reinitializeV2Call) + } ///Creates a new call builder for the [`rejectProofResponse`] function. pub fn rejectProofResponse( &self, zkProofId: alloy::sol_types::private::primitives::aliases::U256, - _1: alloy::sol_types::private::Bytes, + extraData: alloy::sol_types::private::Bytes, ) -> alloy_contract::SolCallBuilder<&P, rejectProofResponseCall, N> { self.call_builder( &rejectProofResponseCall { zkProofId, - _1, + extraData, }, ) } diff --git a/gateway-contracts/rust_bindings/src/kms_generation.rs b/gateway-contracts/rust_bindings/src/kms_generation.rs index e057ba86f3..0311fd6ddd 100644 --- a/gateway-contracts/rust_bindings/src/kms_generation.rs +++ b/gateway-contracts/rust_bindings/src/kms_generation.rs @@ -661,8 +661,6 @@ interface KMSGeneration { error KmsAlreadySignedForCrsgen(uint256 crsId, address kmsSigner); error KmsAlreadySignedForKeygen(uint256 keyId, address kmsSigner); error KmsAlreadySignedForPrepKeygen(uint256 prepKeygenId, address kmsSigner); - error NotCoprocessorSigner(address signerAddress); - error NotCoprocessorTxSender(address txSenderAddress); error NotCustodianSigner(address signerAddress); error NotCustodianTxSender(address txSenderAddress); error NotGatewayOwner(address sender); @@ -1378,28 +1376,6 @@ interface KMSGeneration { } ] }, - { - "type": "error", - "name": "NotCoprocessorSigner", - "inputs": [ - { - "name": "signerAddress", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "NotCoprocessorTxSender", - "inputs": [ - { - "name": "txSenderAddress", - "type": "address", - "internalType": "address" - } - ] - }, { "type": "error", "name": "NotCustodianSigner", @@ -2667,166 +2643,6 @@ error KmsAlreadySignedForPrepKeygen(uint256 prepKeygenId, address kmsSigner); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `NotCoprocessorSigner(address)` and selector `0x26cd75dc`. -```solidity -error NotCoprocessorSigner(address signerAddress); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct NotCoprocessorSigner { - #[allow(missing_docs)] - pub signerAddress: alloy::sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: NotCoprocessorSigner) -> Self { - (value.signerAddress,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for NotCoprocessorSigner { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { signerAddress: tuple.0 } - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for NotCoprocessorSigner { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "NotCoprocessorSigner(address)"; - const SELECTOR: [u8; 4] = [38u8, 205u8, 117u8, 220u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.signerAddress, - ), - ) - } - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(Self::new) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `NotCoprocessorTxSender(address)` and selector `0x52d725f5`. -```solidity -error NotCoprocessorTxSender(address txSenderAddress); -```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct NotCoprocessorTxSender { - #[allow(missing_docs)] - pub txSenderAddress: alloy::sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion( - _t: alloy_sol_types::private::AssertTypeEq, - ) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: NotCoprocessorTxSender) -> Self { - (value.txSenderAddress,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for NotCoprocessorTxSender { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { txSenderAddress: tuple.0 } - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for NotCoprocessorTxSender { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "NotCoprocessorTxSender(address)"; - const SELECTOR: [u8; 4] = [82u8, 215u8, 37u8, 245u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.txSenderAddress, - ), - ) - } - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) - .map(Self::new) - } - } - }; - #[derive(serde::Serialize, serde::Deserialize)] - #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Custom error with signature `NotCustodianSigner(address)` and selector `0x391672a7`. ```solidity error NotCustodianSigner(address signerAddress); @@ -8203,10 +8019,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external #[allow(missing_docs)] KmsAlreadySignedForPrepKeygen(KmsAlreadySignedForPrepKeygen), #[allow(missing_docs)] - NotCoprocessorSigner(NotCoprocessorSigner), - #[allow(missing_docs)] - NotCoprocessorTxSender(NotCoprocessorTxSender), - #[allow(missing_docs)] NotCustodianSigner(NotCustodianSigner), #[allow(missing_docs)] NotCustodianTxSender(NotCustodianTxSender), @@ -8235,12 +8047,10 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external /// Prefer using `SolInterface` methods instead. pub const SELECTORS: &'static [[u8; 4usize]] = &[ [14u8, 86u8, 207u8, 61u8], - [38u8, 205u8, 117u8, 220u8], [42u8, 124u8, 110u8, 246u8], [51u8, 202u8, 31u8, 227u8], [57u8, 22u8, 114u8, 167u8], [76u8, 156u8, 140u8, 227u8], - [82u8, 215u8, 37u8, 245u8], [111u8, 79u8, 115u8, 31u8], [132u8, 222u8, 19u8, 49u8], [152u8, 251u8, 149u8, 125u8], @@ -8265,7 +8075,7 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external impl alloy_sol_types::SolInterface for KMSGenerationErrors { const NAME: &'static str = "KMSGenerationErrors"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 25usize; + const COUNT: usize = 23usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -8311,12 +8121,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external Self::KmsAlreadySignedForPrepKeygen(_) => { ::SELECTOR } - Self::NotCoprocessorSigner(_) => { - ::SELECTOR - } - Self::NotCoprocessorTxSender(_) => { - ::SELECTOR - } Self::NotCustodianSigner(_) => { ::SELECTOR } @@ -8374,17 +8178,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } NotGatewayOwner }, - { - fn NotCoprocessorSigner( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(KMSGenerationErrors::NotCoprocessorSigner) - } - NotCoprocessorSigner - }, { fn NotKmsSigner( data: &[u8], @@ -8427,17 +8220,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } ERC1967InvalidImplementation }, - { - fn NotCoprocessorTxSender( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(KMSGenerationErrors::NotCoprocessorTxSender) - } - NotCoprocessorTxSender - }, { fn NotInitializingFromEmptyProxy( data: &[u8], @@ -8665,17 +8447,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } NotGatewayOwner }, - { - fn NotCoprocessorSigner( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(KMSGenerationErrors::NotCoprocessorSigner) - } - NotCoprocessorSigner - }, { fn NotKmsSigner( data: &[u8], @@ -8720,17 +8491,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } ERC1967InvalidImplementation }, - { - fn NotCoprocessorTxSender( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(KMSGenerationErrors::NotCoprocessorTxSender) - } - NotCoprocessorTxSender - }, { fn NotInitializingFromEmptyProxy( data: &[u8], @@ -9011,16 +8771,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external inner, ) } - Self::NotCoprocessorSigner(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::NotCoprocessorTxSender(inner) => { - ::abi_encoded_size( - inner, - ) - } Self::NotCustodianSigner(inner) => { ::abi_encoded_size( inner, @@ -9150,18 +8900,6 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external out, ) } - Self::NotCoprocessorSigner(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::NotCoprocessorTxSender(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } Self::NotCustodianSigner(inner) => { ::abi_encode_raw( inner, diff --git a/gateway-contracts/rust_bindings/src/mod.rs b/gateway-contracts/rust_bindings/src/mod.rs index ed88f81b2c..f79d6bdf62 100644 --- a/gateway-contracts/rust_bindings/src/mod.rs +++ b/gateway-contracts/rust_bindings/src/mod.rs @@ -5,7 +5,11 @@ //! These files may be overwritten by the codegen system at any time. pub mod r#address; pub mod r#ciphertext_commits; +pub mod r#ciphertext_commits_utils; +pub mod r#context_checks; +pub mod r#context_lifecycle; pub mod r#context_upgradeable; +pub mod r#coprocessor_contexts; pub mod r#decryption; pub mod r#ecdsa; pub mod r#eip712_upgradeable; @@ -20,6 +24,7 @@ pub mod r#gateway_ownable; pub mod r#handle_ops; pub mod r#i_beacon; pub mod r#i_ciphertext_commits; +pub mod r#i_coprocessor_contexts; pub mod r#i_decryption; pub mod r#ierc1967; pub mod r#ierc5267; diff --git a/gateway-contracts/rust_bindings/src/multichain_acl.rs b/gateway-contracts/rust_bindings/src/multichain_acl.rs index db07d531d3..5540fe3295 100644 --- a/gateway-contracts/rust_bindings/src/multichain_acl.rs +++ b/gateway-contracts/rust_bindings/src/multichain_acl.rs @@ -3,6 +3,8 @@ Generated by the following Solidity interface... ```solidity interface MultichainACL { + type ContextStatus is uint8; + error AddressEmptyCode(address target); error ContractsMaxLengthExceeded(uint256 maxLength, uint256 actualLength); error CoprocessorAlreadyAllowedAccount(bytes32 ctHandle, address account, address txSender); @@ -12,9 +14,11 @@ interface MultichainACL { error EmptyContractAddresses(); error FailedCall(); error HostChainNotRegistered(uint256 chainId); + error InvalidCoprocessorContextAllowAccount(bytes32 ctHandle, address accountAddress, uint256 contextId, ContextStatus contextStatus); + error InvalidCoprocessorContextAllowPublicDecrypt(bytes32 ctHandle, uint256 contextId, ContextStatus contextStatus); error InvalidInitialization(); - error NotCoprocessorSigner(address signerAddress); - error NotCoprocessorTxSender(address txSenderAddress); + error NotCoprocessorSignerFromContext(uint256 contextId, address signerAddress); + error NotCoprocessorTxSenderFromContext(uint256 contextId, address txSenderAddress); error NotCustodianSigner(address signerAddress); error NotCustodianTxSender(address txSenderAddress); error NotGatewayOwner(address sender); @@ -42,6 +46,7 @@ interface MultichainACL { function isAccountAllowed(bytes32 ctHandle, address accountAddress) external view returns (bool); function isPublicDecryptAllowed(bytes32 ctHandle) external view returns (bool); function proxiableUUID() external view returns (bytes32); + function reinitializeV2() external; function upgradeToAndCall(address newImplementation, bytes memory data) external payable; } ``` @@ -227,6 +232,13 @@ interface MultichainACL { ], "stateMutability": "view" }, + { + "type": "function", + "name": "reinitializeV2", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "upgradeToAndCall", @@ -404,6 +416,53 @@ interface MultichainACL { } ] }, + { + "type": "error", + "name": "InvalidCoprocessorContextAllowAccount", + "inputs": [ + { + "name": "ctHandle", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "accountAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contextStatus", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ] + }, + { + "type": "error", + "name": "InvalidCoprocessorContextAllowPublicDecrypt", + "inputs": [ + { + "name": "ctHandle", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "contextStatus", + "type": "uint8", + "internalType": "enum ContextStatus" + } + ] + }, { "type": "error", "name": "InvalidInitialization", @@ -411,8 +470,13 @@ interface MultichainACL { }, { "type": "error", - "name": "NotCoprocessorSigner", + "name": "NotCoprocessorSignerFromContext", "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, { "name": "signerAddress", "type": "address", @@ -422,8 +486,13 @@ interface MultichainACL { }, { "type": "error", - "name": "NotCoprocessorTxSender", + "name": "NotCoprocessorTxSenderFromContext", "inputs": [ + { + "name": "contextId", + "type": "uint256", + "internalType": "uint256" + }, { "name": "txSenderAddress", "type": "address", @@ -527,25 +596,163 @@ pub mod MultichainACL { /// The creation / init bytecode of the contract. /// /// ```text - ///0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000043575f80fd5b50620000546200005a60201b60201c565b620001c4565b5f6200006b6200015e60201b60201c565b9050805f0160089054906101000a900460ff1615620000b6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146200015b5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051620001529190620001a9565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b620001a38162000185565b82525050565b5f602082019050620001be5f83018462000198565b92915050565b608051612331620001eb5f395f818161116d015281816111c2015261146401526123315ff3fe60806040526004361061009b575f3560e01c806352d1902d1161006357806352d1902d1461015f57806397c49a4014610189578063ad3cb1cc146101c5578063ae953186146101ef578063c6528f691461022b578063d90724b5146102675761009b565b80630620326d1461009f5780630d8e6e2c146100db578063294a87051461010557806339f738101461012d5780634f1ef28614610143575b5f80fd5b3480156100aa575f80fd5b506100c560048036038101906100c091906119a2565b61028f565b6040516100d291906119e7565b60405180910390f35b3480156100e6575f80fd5b506100ef6102c3565b6040516100fc9190611a8a565b60405180910390f35b348015610110575f80fd5b5061012b60048036038101906101269190611b65565b61033e565b005b348015610138575f80fd5b50610141610787565b005b61015d60048036038101906101589190611cfe565b6108f7565b005b34801561016a575f80fd5b50610173610916565b6040516101809190611d67565b60405180910390f35b348015610194575f80fd5b506101af60048036038101906101aa91906119a2565b610947565b6040516101bc9190611e37565b60405180910390f35b3480156101d0575f80fd5b506101d96109f1565b6040516101e69190611a8a565b60405180910390f35b3480156101fa575f80fd5b5061021560048036038101906102109190611e57565b610a2a565b6040516102229190611e37565b60405180910390f35b348015610236575f80fd5b50610251600480360381019061024c9190611e57565b610ae3565b60405161025e91906119e7565b60405180910390f35b348015610272575f80fd5b5061028d60048036038101906102889190611e95565b610b26565b005b5f80610299610f53565b9050806003015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b60606040518060400160405280600d81526020017f4d756c7469636861696e41434c000000000000000000000000000000000000008152506103045f610f7a565b61030e6001610f7a565b6103175f610f7a565b60405160200161032a9493929190611fc0565b604051602081830303815290604052905090565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16632dd3edfe336040518263ffffffff1660e01b815260040161038b919061202d565b602060405180830381865afa1580156103a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ca9190612070565b61040b57336040517f52d725f5000000000000000000000000000000000000000000000000000000008152600401610402919061202d565b60405180910390fd5b835f61041682611044565b905073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663bff3aaba826040518263ffffffff1660e01b815260040161046591906120b3565b602060405180830381865afa158015610480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a49190612070565b6104e557806040517fb6679c3b0000000000000000000000000000000000000000000000000000000081526004016104dc91906120b3565b60405180910390fd5b5f6104ee610f53565b90505f6104fb888861105d565b90505f826005015f8381526020019081526020015f205403610531576001826005015f8381526020019081526020015f20819055505b815f015f8281526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156105d1578787336040517f6637e32d0000000000000000000000000000000000000000000000000000000081526004016105c8939291906120cc565b60405180910390fd5b816001015f8281526020019081526020015f205f8154809291906105f49061212e565b91905055506001825f015f8381526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550816002015f8281526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816003015f8281526020019081526020015f205f9054906101000a900460ff161580156107145750610713826001015f8381526020019081526020015f205461108f565b5b1561077d576001826003015f8381526020019081526020015f205f6101000a81548160ff021916908315150217905550877f18f825f318ffa4ed5bf3f6ed24fd54d33378b0e9f16ddb37c3419691b2e1656688604051610774919061202d565b60405180910390a25b5050505050505050565b6001610791611120565b67ffffffffffffffff16146107d2576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f6107dd611144565b9050805f0160089054906101000a900460ff168061082557508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b1561085c576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2826040516108eb9190612197565b60405180910390a15050565b6108ff61116b565b61090882611251565b6109128282611344565b5050565b5f61091f611462565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b60605f610952610f53565b9050806002015f8481526020019081526020015f208054806020026020016040519081016040528092919081815260200182805480156109e457602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161099b575b5050505050915050919050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60605f610a35610f53565b90505f610a42858561105d565b9050816002015f8281526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015610ad457602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610a8b575b50505050509250505092915050565b5f80610aed610f53565b90505f610afa858561105d565b9050816003015f8281526020019081526020015f205f9054906101000a900460ff169250505092915050565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16632dd3edfe336040518263ffffffff1660e01b8152600401610b73919061202d565b602060405180830381865afa158015610b8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb29190612070565b610bf357336040517f52d725f5000000000000000000000000000000000000000000000000000000008152600401610bea919061202d565b60405180910390fd5b825f610bfe82611044565b905073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663bff3aaba826040518263ffffffff1660e01b8152600401610c4d91906120b3565b602060405180830381865afa158015610c68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8c9190612070565b610ccd57806040517fb6679c3b000000000000000000000000000000000000000000000000000000008152600401610cc491906120b3565b60405180910390fd5b5f610cd6610f53565b90505f816005015f8881526020019081526020015f205403610d0c576001816005015f8881526020019081526020015f20819055505b805f015f8781526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615610daa5785336040517fa6f04d26000000000000000000000000000000000000000000000000000000008152600401610da19291906121b0565b60405180910390fd5b806001015f8781526020019081526020015f205f815480929190610dcd9061212e565b91905055506001815f015f8881526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550806002015f8781526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806003015f8781526020019081526020015f205f9054906101000a900460ff16158015610eed5750610eec816001015f8881526020019081526020015f205461108f565b5b15610f4b576001816003015f8881526020019081526020015f205f6101000a81548160ff021916908315150217905550857f0868eca75126ba0a46bbec5eefa883e20a13e6c7d936c9bf47ed886e2eb43d3a60405160405180910390a25b505050505050565b5f7f7f733a54a70114addd729bcd827932a6c402ccf3920960665917bc2e6640f400905090565b60605f6001610f88846114e9565b0190505f8167ffffffffffffffff811115610fa657610fa5611bda565b5b6040519080825280601f01601f191660200182016040528015610fd85781602001600182028036833780820191505090505b5090505f82602001820190505b600115611039578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161102e5761102d6121d7565b5b0494505f8503610fe5575b819350505050919050565b5f67ffffffffffffffff6010835f1c901c169050919050565b5f82826040516020016110719291906121b0565b60405160208183030381529060405280519060200120905092915050565b5f8073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16636799ef526040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110ee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611112919061222e565b905080831015915050919050565b5f611129611144565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148061121857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166111ff61163a565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561124f576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112d2919061226d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461134157336040517f0e56cf3d000000000000000000000000000000000000000000000000000000008152600401611338919061202d565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156113ac57506040513d601f19601f820116820180604052508101906113a991906122ac565b60015b6113ed57816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016113e4919061202d565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b811461145357806040517faa1d49a400000000000000000000000000000000000000000000000000000000815260040161144a9190611d67565b60405180910390fd5b61145d838361168d565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16146114e7576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611545577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161153b5761153a6121d7565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611582576d04ee2d6d415b85acef81000000008381611578576115776121d7565b5b0492506020810190505b662386f26fc1000083106115b157662386f26fc1000083816115a7576115a66121d7565b5b0492506010810190505b6305f5e10083106115da576305f5e10083816115d0576115cf6121d7565b5b0492506008810190505b61271083106115ff5761271083816115f5576115f46121d7565b5b0492506004810190505b606483106116225760648381611618576116176121d7565b5b0492506002810190505b600a8310611631576001810190505b80915050919050565b5f6116667f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6116ff565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61169682611708565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156116f2576116ec82826117d1565b506116fb565b6116fa611851565b5b5050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361176357806040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815260040161175a919061202d565b60405180910390fd5b8061178f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6116ff565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040516117fa919061231b565b5f60405180830381855af49150503d805f8114611832576040519150601f19603f3d011682016040523d82523d5f602084013e611837565b606091505b509150915061184785838361188d565b9250505092915050565b5f34111561188b576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6060826118a25761189d8261191a565b611912565b5f82511480156118c857505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561190a57836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401611901919061202d565b60405180910390fd5b819050611913565b5b9392505050565b5f8151111561192c5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b6119818161196f565b811461198b575f80fd5b50565b5f8135905061199c81611978565b92915050565b5f602082840312156119b7576119b6611967565b5b5f6119c48482850161198e565b91505092915050565b5f8115159050919050565b6119e1816119cd565b82525050565b5f6020820190506119fa5f8301846119d8565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611a37578082015181840152602081019050611a1c565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611a5c82611a00565b611a668185611a0a565b9350611a76818560208601611a1a565b611a7f81611a42565b840191505092915050565b5f6020820190508181035f830152611aa28184611a52565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611ad382611aaa565b9050919050565b611ae381611ac9565b8114611aed575f80fd5b50565b5f81359050611afe81611ada565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112611b2557611b24611b04565b5b8235905067ffffffffffffffff811115611b4257611b41611b08565b5b602083019150836001820283011115611b5e57611b5d611b0c565b5b9250929050565b5f805f8060608587031215611b7d57611b7c611967565b5b5f611b8a8782880161198e565b9450506020611b9b87828801611af0565b935050604085013567ffffffffffffffff811115611bbc57611bbb61196b565b5b611bc887828801611b10565b925092505092959194509250565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611c1082611a42565b810181811067ffffffffffffffff82111715611c2f57611c2e611bda565b5b80604052505050565b5f611c4161195e565b9050611c4d8282611c07565b919050565b5f67ffffffffffffffff821115611c6c57611c6b611bda565b5b611c7582611a42565b9050602081019050919050565b828183375f83830152505050565b5f611ca2611c9d84611c52565b611c38565b905082815260208101848484011115611cbe57611cbd611bd6565b5b611cc9848285611c82565b509392505050565b5f82601f830112611ce557611ce4611b04565b5b8135611cf5848260208601611c90565b91505092915050565b5f8060408385031215611d1457611d13611967565b5b5f611d2185828601611af0565b925050602083013567ffffffffffffffff811115611d4257611d4161196b565b5b611d4e85828601611cd1565b9150509250929050565b611d618161196f565b82525050565b5f602082019050611d7a5f830184611d58565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611db281611ac9565b82525050565b5f611dc38383611da9565b60208301905092915050565b5f602082019050919050565b5f611de582611d80565b611def8185611d8a565b9350611dfa83611d9a565b805f5b83811015611e2a578151611e118882611db8565b9750611e1c83611dcf565b925050600181019050611dfd565b5085935050505092915050565b5f6020820190508181035f830152611e4f8184611ddb565b905092915050565b5f8060408385031215611e6d57611e6c611967565b5b5f611e7a8582860161198e565b9250506020611e8b85828601611af0565b9150509250929050565b5f805f60408486031215611eac57611eab611967565b5b5f611eb98682870161198e565b935050602084013567ffffffffffffffff811115611eda57611ed961196b565b5b611ee686828701611b10565b92509250509250925092565b5f81905092915050565b5f611f0682611a00565b611f108185611ef2565b9350611f20818560208601611a1a565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f611f60600283611ef2565b9150611f6b82611f2c565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f611faa600183611ef2565b9150611fb582611f76565b600182019050919050565b5f611fcb8287611efc565b9150611fd682611f54565b9150611fe28286611efc565b9150611fed82611f9e565b9150611ff98285611efc565b915061200482611f9e565b91506120108284611efc565b915081905095945050505050565b61202781611ac9565b82525050565b5f6020820190506120405f83018461201e565b92915050565b61204f816119cd565b8114612059575f80fd5b50565b5f8151905061206a81612046565b92915050565b5f6020828403121561208557612084611967565b5b5f6120928482850161205c565b91505092915050565b5f819050919050565b6120ad8161209b565b82525050565b5f6020820190506120c65f8301846120a4565b92915050565b5f6060820190506120df5f830186611d58565b6120ec602083018561201e565b6120f9604083018461201e565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6121388261209b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361216a57612169612101565b5b600182019050919050565b5f67ffffffffffffffff82169050919050565b61219181612175565b82525050565b5f6020820190506121aa5f830184612188565b92915050565b5f6040820190506121c35f830185611d58565b6121d0602083018461201e565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b61220d8161209b565b8114612217575f80fd5b50565b5f8151905061222881612204565b92915050565b5f6020828403121561224357612242611967565b5b5f6122508482850161221a565b91505092915050565b5f8151905061226781611ada565b92915050565b5f6020828403121561228257612281611967565b5b5f61228f84828501612259565b91505092915050565b5f815190506122a681611978565b92915050565b5f602082840312156122c1576122c0611967565b5b5f6122ce84828501612298565b91505092915050565b5f81519050919050565b5f81905092915050565b5f6122f5826122d7565b6122ff81856122e1565b935061230f818560208601611a1a565b80840191505092915050565b5f61232682846122eb565b91508190509291505056 + ///0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000043575f80fd5b50620000546200005a60201b60201c565b620001c4565b5f6200006b6200015e60201b60201c565b9050805f0160089054906101000a900460ff1615620000b6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146200015b5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051620001529190620001a9565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b620001a38162000185565b82525050565b5f602082019050620001be5f83018462000198565b92915050565b6080516129ec620001eb5f395f81816116c80152818161171d01526119bf01526129ec5ff3fe6080604052600436106100a6575f3560e01c806397c49a401161006357806397c49a4014610194578063ad3cb1cc146101d0578063ae953186146101fa578063c411587414610236578063c6528f691461024c578063d90724b514610288576100a6565b80630620326d146100aa5780630d8e6e2c146100e6578063294a87051461011057806339f73810146101385780634f1ef2861461014e57806352d1902d1461016a575b5f80fd5b3480156100b5575f80fd5b506100d060048036038101906100cb9190611efd565b6102b0565b6040516100dd9190611f42565b60405180910390f35b3480156100f1575f80fd5b506100fa6102e4565b6040516101079190611fe5565b60405180910390f35b34801561011b575f80fd5b50610136600480360381019061013191906120c0565b61035f565b005b348015610143575f80fd5b5061014c610943565b005b61016860048036038101906101639190612259565b610ab3565b005b348015610175575f80fd5b5061017e610ad2565b60405161018b91906122c2565b60405180910390f35b34801561019f575f80fd5b506101ba60048036038101906101b59190611efd565b610b03565b6040516101c79190612392565b60405180910390f35b3480156101db575f80fd5b506101e4610bad565b6040516101f19190611fe5565b60405180910390f35b348015610205575f80fd5b50610220600480360381019061021b91906123b2565b610be6565b60405161022d9190612392565b60405180910390f35b348015610241575f80fd5b5061024a610c9f565b005b348015610257575f80fd5b50610272600480360381019061026d91906123b2565b610dc4565b60405161027f9190611f42565b60405180910390f35b348015610293575f80fd5b506102ae60048036038101906102a991906123f0565b610e07565b005b5f806102ba6113cd565b9050806003015f8481526020019081526020015f205f9054906101000a900460ff16915050919050565b60606040518060400160405280600d81526020017f4d756c7469636861696e41434c000000000000000000000000000000000000008152506103255f6113f4565b61032f60026113f4565b6103385f6113f4565b60405160200161034b949392919061251b565b604051602081830303815290604052905090565b835f61036a826114be565b905073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663bff3aaba826040518263ffffffff1660e01b81526004016103b99190612591565b602060405180830381865afa1580156103d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f891906125d4565b61043957806040517fb6679c3b0000000000000000000000000000000000000000000000000000000081526004016104309190612591565b60405180910390fd5b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16633a5162e66040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610492575f80fd5b505af11580156104a4573d5f803e3d5ffd5b505050505f6104b16113cd565b90505f6104be88886114d7565b90505f826005015f8381526020019081526020015f205490505f810361057e577333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663991dc36d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561053b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061055f9190612629565b905080836005015f8481526020019081526020015f20819055506106e1565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663cd8e993c826040518263ffffffff1660e01b81526004016105cb9190612591565b602060405180830381865afa1580156105e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060a91906125d4565b6106e0575f7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663888b99e0836040518263ffffffff1660e01b815260040161065c9190612591565b602060405180830381865afa158015610677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069b9190612677565b9050898983836040517f13c95d8d0000000000000000000000000000000000000000000000000000000081526004016106d79493929190612724565b60405180910390fd5b5b6106eb8133611509565b825f015f8381526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561078b578888336040517f6637e32d00000000000000000000000000000000000000000000000000000000815260040161078293929190612767565b60405180910390fd5b826001015f8381526020019081526020015f205f8154809291906107ae906127c9565b91905055506001835f015f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550826002015f8381526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826003015f8381526020019081526020015f205f9054906101000a900460ff161580156108cf57506108ce81846001015f8581526020019081526020015f20546115de565b5b15610938576001836003015f8481526020019081526020015f205f6101000a81548160ff021916908315150217905550887f18f825f318ffa4ed5bf3f6ed24fd54d33378b0e9f16ddb37c3419691b2e165668960405161092f9190612810565b60405180910390a25b505050505050505050565b600161094d61167b565b67ffffffffffffffff161461098e576040517f6f4f731f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f61099961169f565b9050805f0160089054906101000a900460ff16806109e157508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15610a18576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d282604051610aa7919061284b565b60405180910390a15050565b610abb6116c6565b610ac4826117ac565b610ace828261189f565b5050565b5f610adb6119bd565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b60605f610b0e6113cd565b9050806002015f8481526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015610ba057602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610b57575b5050505050915050919050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60605f610bf16113cd565b90505f610bfe85856114d7565b9050816002015f8281526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015610c9057602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610c47575b50505050509250505092915050565b60035f610caa61169f565b9050805f0160089054906101000a900460ff1680610cf257508167ffffffffffffffff16815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1610155b15610d29576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001815f0160086101000a81548160ff0219169083151502179055505f815f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d282604051610db8919061284b565b60405180910390a15050565b5f80610dce6113cd565b90505f610ddb85856114d7565b9050816003015f8281526020019081526020015f205f9054906101000a900460ff169250505092915050565b825f610e12826114be565b905073a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff1663bff3aaba826040518263ffffffff1660e01b8152600401610e619190612591565b602060405180830381865afa158015610e7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea091906125d4565b610ee157806040517fb6679c3b000000000000000000000000000000000000000000000000000000008152600401610ed89190612591565b60405180910390fd5b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16633a5162e66040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610f3a575f80fd5b505af1158015610f4c573d5f803e3d5ffd5b505050505f610f596113cd565b90505f816005015f8881526020019081526020015f205490505f8103611019577333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663991dc36d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ffa9190612629565b905080826005015f8981526020019081526020015f208190555061117a565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663cd8e993c826040518263ffffffff1660e01b81526004016110669190612591565b602060405180830381865afa158015611081573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a591906125d4565b611179575f7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663888b99e0836040518263ffffffff1660e01b81526004016110f79190612591565b602060405180830381865afa158015611112573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111369190612677565b90508782826040517faa7a2a9700000000000000000000000000000000000000000000000000000000815260040161117093929190612864565b60405180910390fd5b5b6111848133611509565b815f015f8881526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156112225786336040517fa6f04d26000000000000000000000000000000000000000000000000000000008152600401611219929190612899565b60405180910390fd5b816001015f8881526020019081526020015f205f815480929190611245906127c9565b91905055506001825f015f8981526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550816002015f8881526020019081526020015f2033908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816003015f8881526020019081526020015f205f9054906101000a900460ff16158015611366575061136581836001015f8a81526020019081526020015f20546115de565b5b156113c4576001826003015f8981526020019081526020015f205f6101000a81548160ff021916908315150217905550867f0868eca75126ba0a46bbec5eefa883e20a13e6c7d936c9bf47ed886e2eb43d3a60405160405180910390a25b50505050505050565b5f7f7f733a54a70114addd729bcd827932a6c402ccf3920960665917bc2e6640f400905090565b60605f600161140284611a44565b0190505f8167ffffffffffffffff8111156114205761141f612135565b5b6040519080825280601f01601f1916602001820160405280156114525781602001600182028036833780820191505090505b5090505f82602001820190505b6001156114b3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816114a8576114a76128c0565b5b0494505f850361145f575b819350505050919050565b5f67ffffffffffffffff6010835f1c901c169050919050565b5f82826040516020016114eb929190612899565b60405160208183030381529060405280519060200120905092915050565b7333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff16638625e87683836040518363ffffffff1660e01b81526004016115589291906128ed565b602060405180830381865afa158015611573573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159791906125d4565b6115da5781816040517f29a993c10000000000000000000000000000000000000000000000000000000081526004016115d19291906128ed565b60405180910390fd5b5050565b5f807333e0c7a03d2b040b518580c365f4b3bde7cc4e6e73ffffffffffffffffffffffffffffffffffffffff1663f88174ea856040518263ffffffff1660e01b815260040161162d9190612591565b602060405180830381865afa158015611648573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166c9190612629565b90508083101591505092915050565b5f61168461169f565b5f015f9054906101000a900467ffffffffffffffff16905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148061177357507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661175a611b95565b73ffffffffffffffffffffffffffffffffffffffff1614155b156117aa576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b73a50f5243c70c80a8309e3d39d8c9d958cda8397973ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611809573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061182d9190612928565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461189c57336040517f0e56cf3d0000000000000000000000000000000000000000000000000000000081526004016118939190612810565b60405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561190757506040513d601f19601f820116820180604052508101906119049190612967565b60015b61194857816040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815260040161193f9190612810565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b81146119ae57806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016119a591906122c2565b60405180910390fd5b6119b88383611be8565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611a42576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611aa0577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611a9657611a956128c0565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611add576d04ee2d6d415b85acef81000000008381611ad357611ad26128c0565b5b0492506020810190505b662386f26fc100008310611b0c57662386f26fc100008381611b0257611b016128c0565b5b0492506010810190505b6305f5e1008310611b35576305f5e1008381611b2b57611b2a6128c0565b5b0492506008810190505b6127108310611b5a576127108381611b5057611b4f6128c0565b5b0492506004810190505b60648310611b7d5760648381611b7357611b726128c0565b5b0492506002810190505b600a8310611b8c576001810190505b80915050919050565b5f611bc17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b611c5a565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611bf182611c63565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f81511115611c4d57611c478282611d2c565b50611c56565b611c55611dac565b5b5050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b03611cbe57806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401611cb59190612810565b60405180910390fd5b80611cea7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b611c5a565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051611d5591906129d6565b5f60405180830381855af49150503d805f8114611d8d576040519150601f19603f3d011682016040523d82523d5f602084013e611d92565b606091505b5091509150611da2858383611de8565b9250505092915050565b5f341115611de6576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b606082611dfd57611df882611e75565b611e6d565b5f8251148015611e2357505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15611e6557836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401611e5c9190612810565b60405180910390fd5b819050611e6e565b5b9392505050565b5f81511115611e875780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b611edc81611eca565b8114611ee6575f80fd5b50565b5f81359050611ef781611ed3565b92915050565b5f60208284031215611f1257611f11611ec2565b5b5f611f1f84828501611ee9565b91505092915050565b5f8115159050919050565b611f3c81611f28565b82525050565b5f602082019050611f555f830184611f33565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611f92578082015181840152602081019050611f77565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611fb782611f5b565b611fc18185611f65565b9350611fd1818560208601611f75565b611fda81611f9d565b840191505092915050565b5f6020820190508181035f830152611ffd8184611fad565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61202e82612005565b9050919050565b61203e81612024565b8114612048575f80fd5b50565b5f8135905061205981612035565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126120805761207f61205f565b5b8235905067ffffffffffffffff81111561209d5761209c612063565b5b6020830191508360018202830111156120b9576120b8612067565b5b9250929050565b5f805f80606085870312156120d8576120d7611ec2565b5b5f6120e587828801611ee9565b94505060206120f68782880161204b565b935050604085013567ffffffffffffffff81111561211757612116611ec6565b5b6121238782880161206b565b925092505092959194509250565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61216b82611f9d565b810181811067ffffffffffffffff8211171561218a57612189612135565b5b80604052505050565b5f61219c611eb9565b90506121a88282612162565b919050565b5f67ffffffffffffffff8211156121c7576121c6612135565b5b6121d082611f9d565b9050602081019050919050565b828183375f83830152505050565b5f6121fd6121f8846121ad565b612193565b90508281526020810184848401111561221957612218612131565b5b6122248482856121dd565b509392505050565b5f82601f8301126122405761223f61205f565b5b81356122508482602086016121eb565b91505092915050565b5f806040838503121561226f5761226e611ec2565b5b5f61227c8582860161204b565b925050602083013567ffffffffffffffff81111561229d5761229c611ec6565b5b6122a98582860161222c565b9150509250929050565b6122bc81611eca565b82525050565b5f6020820190506122d55f8301846122b3565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61230d81612024565b82525050565b5f61231e8383612304565b60208301905092915050565b5f602082019050919050565b5f612340826122db565b61234a81856122e5565b9350612355836122f5565b805f5b8381101561238557815161236c8882612313565b97506123778361232a565b925050600181019050612358565b5085935050505092915050565b5f6020820190508181035f8301526123aa8184612336565b905092915050565b5f80604083850312156123c8576123c7611ec2565b5b5f6123d585828601611ee9565b92505060206123e68582860161204b565b9150509250929050565b5f805f6040848603121561240757612406611ec2565b5b5f61241486828701611ee9565b935050602084013567ffffffffffffffff81111561243557612434611ec6565b5b6124418682870161206b565b92509250509250925092565b5f81905092915050565b5f61246182611f5b565b61246b818561244d565b935061247b818560208601611f75565b80840191505092915050565b7f20760000000000000000000000000000000000000000000000000000000000005f82015250565b5f6124bb60028361244d565b91506124c682612487565b600282019050919050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61250560018361244d565b9150612510826124d1565b600182019050919050565b5f6125268287612457565b9150612531826124af565b915061253d8286612457565b9150612548826124f9565b91506125548285612457565b915061255f826124f9565b915061256b8284612457565b915081905095945050505050565b5f819050919050565b61258b81612579565b82525050565b5f6020820190506125a45f830184612582565b92915050565b6125b381611f28565b81146125bd575f80fd5b50565b5f815190506125ce816125aa565b92915050565b5f602082840312156125e9576125e8611ec2565b5b5f6125f6848285016125c0565b91505092915050565b61260881612579565b8114612612575f80fd5b50565b5f81519050612623816125ff565b92915050565b5f6020828403121561263e5761263d611ec2565b5b5f61264b84828501612615565b91505092915050565b60088110612660575f80fd5b50565b5f8151905061267181612654565b92915050565b5f6020828403121561268c5761268b611ec2565b5b5f61269984828501612663565b91505092915050565b6126ab81612024565b82525050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600881106126ef576126ee6126b1565b5b50565b5f8190506126ff826126de565b919050565b5f61270e826126f2565b9050919050565b61271e81612704565b82525050565b5f6080820190506127375f8301876122b3565b61274460208301866126a2565b6127516040830185612582565b61275e6060830184612715565b95945050505050565b5f60608201905061277a5f8301866122b3565b61278760208301856126a2565b61279460408301846126a2565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6127d382612579565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128055761280461279c565b5b600182019050919050565b5f6020820190506128235f8301846126a2565b92915050565b5f67ffffffffffffffff82169050919050565b61284581612829565b82525050565b5f60208201905061285e5f83018461283c565b92915050565b5f6060820190506128775f8301866122b3565b6128846020830185612582565b6128916040830184612715565b949350505050565b5f6040820190506128ac5f8301856122b3565b6128b960208301846126a2565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6040820190506129005f830185612582565b61290d60208301846126a2565b9392505050565b5f8151905061292281612035565b92915050565b5f6020828403121561293d5761293c611ec2565b5b5f61294a84828501612914565b91505092915050565b5f8151905061296181611ed3565b92915050565b5f6020828403121561297c5761297b611ec2565b5b5f61298984828501612953565b91505092915050565b5f81519050919050565b5f81905092915050565b5f6129b082612992565b6129ba818561299c565b93506129ca818560208601611f75565b80840191505092915050565b5f6129e182846129a6565b91508190509291505056 /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\xA0`@R0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x80\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP4\x80\x15b\0\0CW_\x80\xFD[Pb\0\0Tb\0\0Z` \x1B` \x1CV[b\0\x01\xC4V[_b\0\0kb\0\x01^` \x1B` \x1CV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15b\0\0\xB6W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14b\0\x01[Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`@Qb\0\x01R\x91\x90b\0\x01\xA9V[`@Q\x80\x91\x03\x90\xA1[PV[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[b\0\x01\xA3\x81b\0\x01\x85V[\x82RPPV[_` \x82\x01\x90Pb\0\x01\xBE_\x83\x01\x84b\0\x01\x98V[\x92\x91PPV[`\x80Qa#1b\0\x01\xEB_9_\x81\x81a\x11m\x01R\x81\x81a\x11\xC2\x01Ra\x14d\x01Ra#1_\xF3\xFE`\x80`@R`\x046\x10a\0\x9BW_5`\xE0\x1C\x80cR\xD1\x90-\x11a\0cW\x80cR\xD1\x90-\x14a\x01_W\x80c\x97\xC4\x9A@\x14a\x01\x89W\x80c\xAD<\xB1\xCC\x14a\x01\xC5W\x80c\xAE\x951\x86\x14a\x01\xEFW\x80c\xC6R\x8Fi\x14a\x02+W\x80c\xD9\x07$\xB5\x14a\x02gWa\0\x9BV[\x80c\x06 2m\x14a\0\x9FW\x80c\r\x8En,\x14a\0\xDBW\x80c)J\x87\x05\x14a\x01\x05W\x80c9\xF78\x10\x14a\x01-W\x80cO\x1E\xF2\x86\x14a\x01CW[_\x80\xFD[4\x80\x15a\0\xAAW_\x80\xFD[Pa\0\xC5`\x04\x806\x03\x81\x01\x90a\0\xC0\x91\x90a\x19\xA2V[a\x02\x8FV[`@Qa\0\xD2\x91\x90a\x19\xE7V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\0\xE6W_\x80\xFD[Pa\0\xEFa\x02\xC3V[`@Qa\0\xFC\x91\x90a\x1A\x8AV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x10W_\x80\xFD[Pa\x01+`\x04\x806\x03\x81\x01\x90a\x01&\x91\x90a\x1BeV[a\x03>V[\0[4\x80\x15a\x018W_\x80\xFD[Pa\x01Aa\x07\x87V[\0[a\x01]`\x04\x806\x03\x81\x01\x90a\x01X\x91\x90a\x1C\xFEV[a\x08\xF7V[\0[4\x80\x15a\x01jW_\x80\xFD[Pa\x01sa\t\x16V[`@Qa\x01\x80\x91\x90a\x1DgV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x94W_\x80\xFD[Pa\x01\xAF`\x04\x806\x03\x81\x01\x90a\x01\xAA\x91\x90a\x19\xA2V[a\tGV[`@Qa\x01\xBC\x91\x90a\x1E7V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xD0W_\x80\xFD[Pa\x01\xD9a\t\xF1V[`@Qa\x01\xE6\x91\x90a\x1A\x8AV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xFAW_\x80\xFD[Pa\x02\x15`\x04\x806\x03\x81\x01\x90a\x02\x10\x91\x90a\x1EWV[a\n*V[`@Qa\x02\"\x91\x90a\x1E7V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x026W_\x80\xFD[Pa\x02Q`\x04\x806\x03\x81\x01\x90a\x02L\x91\x90a\x1EWV[a\n\xE3V[`@Qa\x02^\x91\x90a\x19\xE7V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02rW_\x80\xFD[Pa\x02\x8D`\x04\x806\x03\x81\x01\x90a\x02\x88\x91\x90a\x1E\x95V[a\x0B&V[\0[_\x80a\x02\x99a\x0FSV[\x90P\x80`\x03\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[```@Q\x80`@\x01`@R\x80`\r\x81R` \x01\x7FMultichainACL\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x03\x04_a\x0FzV[a\x03\x0E`\x01a\x0FzV[a\x03\x17_a\x0FzV[`@Q` \x01a\x03*\x94\x93\x92\x91\x90a\x1F\xC0V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x90V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xD3\xED\xFE3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x03\x8B\x91\x90a -V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03\xA6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\xCA\x91\x90a pV[a\x04\x0BW3`@Q\x7FR\xD7%\xF5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x04\x02\x91\x90a -V[`@Q\x80\x91\x03\x90\xFD[\x83_a\x04\x16\x82a\x10DV[\x90Ps\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x04e\x91\x90a \xB3V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\x80W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04\xA4\x91\x90a pV[a\x04\xE5W\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x04\xDC\x91\x90a \xB3V[`@Q\x80\x91\x03\x90\xFD[_a\x04\xEEa\x0FSV[\x90P_a\x04\xFB\x88\x88a\x10]V[\x90P_\x82`\x05\x01_\x83\x81R` \x01\x90\x81R` \x01_ T\x03a\x051W`\x01\x82`\x05\x01_\x83\x81R` \x01\x90\x81R` \x01_ \x81\x90UP[\x81_\x01_\x82\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\x05\xD1W\x87\x873`@Q\x7Ff7\xE3-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05\xC8\x93\x92\x91\x90a \xCCV[`@Q\x80\x91\x03\x90\xFD[\x81`\x01\x01_\x82\x81R` \x01\x90\x81R` \x01_ _\x81T\x80\x92\x91\x90a\x05\xF4\x90a!.V[\x91\x90PUP`\x01\x82_\x01_\x83\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x02\x01_\x82\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x81`\x03\x01_\x82\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x07\x14WPa\x07\x13\x82`\x01\x01_\x83\x81R` \x01\x90\x81R` \x01_ Ta\x10\x8FV[[\x15a\x07}W`\x01\x82`\x03\x01_\x83\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x87\x7F\x18\xF8%\xF3\x18\xFF\xA4\xED[\xF3\xF6\xED$\xFDT\xD33x\xB0\xE9\xF1m\xDB7\xC3A\x96\x91\xB2\xE1ef\x88`@Qa\x07t\x91\x90a -V[`@Q\x80\x91\x03\x90\xA2[PPPPPPPPV[`\x01a\x07\x91a\x11 V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x07\xD2W`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02_a\x07\xDDa\x11DV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x08%WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x08\\W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x08\xEB\x91\x90a!\x97V[`@Q\x80\x91\x03\x90\xA1PPV[a\x08\xFFa\x11kV[a\t\x08\x82a\x12QV[a\t\x12\x82\x82a\x13DV[PPV[_a\t\x1Fa\x14bV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[``_a\tRa\x0FSV[\x90P\x80`\x02\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\t\xE4W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\t\x9BW[PPPPP\x91PP\x91\x90PV[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[``_a\n5a\x0FSV[\x90P_a\nB\x85\x85a\x10]V[\x90P\x81`\x02\x01_\x82\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\n\xD4W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\n\x8BW[PPPPP\x92PPP\x92\x91PPV[_\x80a\n\xEDa\x0FSV[\x90P_a\n\xFA\x85\x85a\x10]V[\x90P\x81`\x03\x01_\x82\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x92PPP\x92\x91PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xD3\xED\xFE3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0Bs\x91\x90a -V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0B\x8EW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0B\xB2\x91\x90a pV[a\x0B\xF3W3`@Q\x7FR\xD7%\xF5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0B\xEA\x91\x90a -V[`@Q\x80\x91\x03\x90\xFD[\x82_a\x0B\xFE\x82a\x10DV[\x90Ps\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0CM\x91\x90a \xB3V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0ChW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0C\x8C\x91\x90a pV[a\x0C\xCDW\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0C\xC4\x91\x90a \xB3V[`@Q\x80\x91\x03\x90\xFD[_a\x0C\xD6a\x0FSV[\x90P_\x81`\x05\x01_\x88\x81R` \x01\x90\x81R` \x01_ T\x03a\r\x0CW`\x01\x81`\x05\x01_\x88\x81R` \x01\x90\x81R` \x01_ \x81\x90UP[\x80_\x01_\x87\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\r\xAAW\x853`@Q\x7F\xA6\xF0M&\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\r\xA1\x92\x91\x90a!\xB0V[`@Q\x80\x91\x03\x90\xFD[\x80`\x01\x01_\x87\x81R` \x01\x90\x81R` \x01_ _\x81T\x80\x92\x91\x90a\r\xCD\x90a!.V[\x91\x90PUP`\x01\x81_\x01_\x88\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x80`\x02\x01_\x87\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x80`\x03\x01_\x87\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x0E\xEDWPa\x0E\xEC\x81`\x01\x01_\x88\x81R` \x01\x90\x81R` \x01_ Ta\x10\x8FV[[\x15a\x0FKW`\x01\x81`\x03\x01_\x88\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x85\x7F\x08h\xEC\xA7Q&\xBA\nF\xBB\xEC^\xEF\xA8\x83\xE2\n\x13\xE6\xC7\xD96\xC9\xBFG\xED\x88n.\xB4=:`@Q`@Q\x80\x91\x03\x90\xA2[PPPPPPV[_\x7F\x7Fs:T\xA7\x01\x14\xAD\xDDr\x9B\xCD\x82y2\xA6\xC4\x02\xCC\xF3\x92\t`fY\x17\xBC.f@\xF4\0\x90P\x90V[``_`\x01a\x0F\x88\x84a\x14\xE9V[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x0F\xA6Wa\x0F\xA5a\x1B\xDAV[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0F\xD8W\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a\x109W\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a\x10.Wa\x10-a!\xD7V[[\x04\x94P_\x85\x03a\x0F\xE5W[\x81\x93PPPP\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x10\x83_\x1C\x90\x1C\x16\x90P\x91\x90PV[_\x82\x82`@Q` \x01a\x10q\x92\x91\x90a!\xB0V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x92\x91PPV[_\x80s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cg\x99\xEFR`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x10\xEEW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11\x12\x91\x90a\".V[\x90P\x80\x83\x10\x15\x91PP\x91\x90PV[_a\x11)a\x11DV[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a\x12\x18WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x11\xFFa\x16:V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x12OW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x12\xAEW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x12\xD2\x91\x90a\"mV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x13AW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x138\x91\x90a -V[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x13\xACWP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\xA9\x91\x90a\"\xACV[`\x01[a\x13\xEDW\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x13\xE4\x91\x90a -V[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a\x14SW\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14J\x91\x90a\x1DgV[`@Q\x80\x91\x03\x90\xFD[a\x14]\x83\x83a\x16\x8DV[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x14\xE7W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a\x15EWz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a\x15;Wa\x15:a!\xD7V[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a\x15\x82Wm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a\x15xWa\x15wa!\xD7V[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a\x15\xB1Wf#\x86\xF2o\xC1\0\0\x83\x81a\x15\xA7Wa\x15\xA6a!\xD7V[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a\x15\xDAWc\x05\xF5\xE1\0\x83\x81a\x15\xD0Wa\x15\xCFa!\xD7V[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a\x15\xFFWa'\x10\x83\x81a\x15\xF5Wa\x15\xF4a!\xD7V[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a\x16\"W`d\x83\x81a\x16\x18Wa\x16\x17a!\xD7V[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a\x161W`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a\x16f\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x16\xFFV[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a\x16\x96\x82a\x17\x08V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a\x16\xF2Wa\x16\xEC\x82\x82a\x17\xD1V[Pa\x16\xFBV[a\x16\xFAa\x18QV[[PPV[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a\x17cW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x17Z\x91\x90a -V[`@Q\x80\x91\x03\x90\xFD[\x80a\x17\x8F\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x16\xFFV[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa\x17\xFA\x91\x90a#\x1BV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x182W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x187V[``\x91P[P\x91P\x91Pa\x18G\x85\x83\x83a\x18\x8DV[\x92PPP\x92\x91PPV[_4\x11\x15a\x18\x8BW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82a\x18\xA2Wa\x18\x9D\x82a\x19\x1AV[a\x19\x12V[_\x82Q\x14\x80\x15a\x18\xC8WP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a\x19\nW\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x19\x01\x91\x90a -V[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa\x19\x13V[[\x93\x92PPPV[_\x81Q\x11\x15a\x19,W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[a\x19\x81\x81a\x19oV[\x81\x14a\x19\x8BW_\x80\xFD[PV[_\x815\x90Pa\x19\x9C\x81a\x19xV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a\x19\xB7Wa\x19\xB6a\x19gV[[_a\x19\xC4\x84\x82\x85\x01a\x19\x8EV[\x91PP\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[a\x19\xE1\x81a\x19\xCDV[\x82RPPV[_` \x82\x01\x90Pa\x19\xFA_\x83\x01\x84a\x19\xD8V[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a\x1A7W\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa\x1A\x1CV[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a\x1A\\\x82a\x1A\0V[a\x1Af\x81\x85a\x1A\nV[\x93Pa\x1Av\x81\x85` \x86\x01a\x1A\x1AV[a\x1A\x7F\x81a\x1ABV[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra\x1A\xA2\x81\x84a\x1ARV[\x90P\x92\x91PPV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a\x1A\xD3\x82a\x1A\xAAV[\x90P\x91\x90PV[a\x1A\xE3\x81a\x1A\xC9V[\x81\x14a\x1A\xEDW_\x80\xFD[PV[_\x815\x90Pa\x1A\xFE\x81a\x1A\xDAV[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12a\x1B%Wa\x1B$a\x1B\x04V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1BBWa\x1BAa\x1B\x08V[[` \x83\x01\x91P\x83`\x01\x82\x02\x83\x01\x11\x15a\x1B^Wa\x1B]a\x1B\x0CV[[\x92P\x92\x90PV[_\x80_\x80``\x85\x87\x03\x12\x15a\x1B}Wa\x1B|a\x19gV[[_a\x1B\x8A\x87\x82\x88\x01a\x19\x8EV[\x94PP` a\x1B\x9B\x87\x82\x88\x01a\x1A\xF0V[\x93PP`@\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1B\xBCWa\x1B\xBBa\x19kV[[a\x1B\xC8\x87\x82\x88\x01a\x1B\x10V[\x92P\x92PP\x92\x95\x91\x94P\x92PV[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a\x1C\x10\x82a\x1ABV[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\x1C/Wa\x1C.a\x1B\xDAV[[\x80`@RPPPV[_a\x1CAa\x19^V[\x90Pa\x1CM\x82\x82a\x1C\x07V[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x1ClWa\x1Cka\x1B\xDAV[[a\x1Cu\x82a\x1ABV[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_a\x1C\xA2a\x1C\x9D\x84a\x1CRV[a\x1C8V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a\x1C\xBEWa\x1C\xBDa\x1B\xD6V[[a\x1C\xC9\x84\x82\x85a\x1C\x82V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a\x1C\xE5Wa\x1C\xE4a\x1B\x04V[[\x815a\x1C\xF5\x84\x82` \x86\x01a\x1C\x90V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a\x1D\x14Wa\x1D\x13a\x19gV[[_a\x1D!\x85\x82\x86\x01a\x1A\xF0V[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1DBWa\x1DAa\x19kV[[a\x1DN\x85\x82\x86\x01a\x1C\xD1V[\x91PP\x92P\x92\x90PV[a\x1Da\x81a\x19oV[\x82RPPV[_` \x82\x01\x90Pa\x1Dz_\x83\x01\x84a\x1DXV[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a\x1D\xB2\x81a\x1A\xC9V[\x82RPPV[_a\x1D\xC3\x83\x83a\x1D\xA9V[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a\x1D\xE5\x82a\x1D\x80V[a\x1D\xEF\x81\x85a\x1D\x8AV[\x93Pa\x1D\xFA\x83a\x1D\x9AV[\x80_[\x83\x81\x10\x15a\x1E*W\x81Qa\x1E\x11\x88\x82a\x1D\xB8V[\x97Pa\x1E\x1C\x83a\x1D\xCFV[\x92PP`\x01\x81\x01\x90Pa\x1D\xFDV[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra\x1EO\x81\x84a\x1D\xDBV[\x90P\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a\x1EmWa\x1Ela\x19gV[[_a\x1Ez\x85\x82\x86\x01a\x19\x8EV[\x92PP` a\x1E\x8B\x85\x82\x86\x01a\x1A\xF0V[\x91PP\x92P\x92\x90PV[_\x80_`@\x84\x86\x03\x12\x15a\x1E\xACWa\x1E\xABa\x19gV[[_a\x1E\xB9\x86\x82\x87\x01a\x19\x8EV[\x93PP` \x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1E\xDAWa\x1E\xD9a\x19kV[[a\x1E\xE6\x86\x82\x87\x01a\x1B\x10V[\x92P\x92PP\x92P\x92P\x92V[_\x81\x90P\x92\x91PPV[_a\x1F\x06\x82a\x1A\0V[a\x1F\x10\x81\x85a\x1E\xF2V[\x93Pa\x1F \x81\x85` \x86\x01a\x1A\x1AV[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a\x1F``\x02\x83a\x1E\xF2V[\x91Pa\x1Fk\x82a\x1F,V[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a\x1F\xAA`\x01\x83a\x1E\xF2V[\x91Pa\x1F\xB5\x82a\x1FvV[`\x01\x82\x01\x90P\x91\x90PV[_a\x1F\xCB\x82\x87a\x1E\xFCV[\x91Pa\x1F\xD6\x82a\x1FTV[\x91Pa\x1F\xE2\x82\x86a\x1E\xFCV[\x91Pa\x1F\xED\x82a\x1F\x9EV[\x91Pa\x1F\xF9\x82\x85a\x1E\xFCV[\x91Pa \x04\x82a\x1F\x9EV[\x91Pa \x10\x82\x84a\x1E\xFCV[\x91P\x81\x90P\x95\x94PPPPPV[a '\x81a\x1A\xC9V[\x82RPPV[_` \x82\x01\x90Pa @_\x83\x01\x84a \x1EV[\x92\x91PPV[a O\x81a\x19\xCDV[\x81\x14a YW_\x80\xFD[PV[_\x81Q\x90Pa j\x81a FV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a \x85Wa \x84a\x19gV[[_a \x92\x84\x82\x85\x01a \\V[\x91PP\x92\x91PPV[_\x81\x90P\x91\x90PV[a \xAD\x81a \x9BV[\x82RPPV[_` \x82\x01\x90Pa \xC6_\x83\x01\x84a \xA4V[\x92\x91PPV[_``\x82\x01\x90Pa \xDF_\x83\x01\x86a\x1DXV[a \xEC` \x83\x01\x85a \x1EV[a \xF9`@\x83\x01\x84a \x1EV[\x94\x93PPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_a!8\x82a \x9BV[\x91P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x03a!jWa!ia!\x01V[[`\x01\x82\x01\x90P\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[a!\x91\x81a!uV[\x82RPPV[_` \x82\x01\x90Pa!\xAA_\x83\x01\x84a!\x88V[\x92\x91PPV[_`@\x82\x01\x90Pa!\xC3_\x83\x01\x85a\x1DXV[a!\xD0` \x83\x01\x84a \x1EV[\x93\x92PPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[a\"\r\x81a \x9BV[\x81\x14a\"\x17W_\x80\xFD[PV[_\x81Q\x90Pa\"(\x81a\"\x04V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a\"CWa\"Ba\x19gV[[_a\"P\x84\x82\x85\x01a\"\x1AV[\x91PP\x92\x91PPV[_\x81Q\x90Pa\"g\x81a\x1A\xDAV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a\"\x82Wa\"\x81a\x19gV[[_a\"\x8F\x84\x82\x85\x01a\"YV[\x91PP\x92\x91PPV[_\x81Q\x90Pa\"\xA6\x81a\x19xV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a\"\xC1Wa\"\xC0a\x19gV[[_a\"\xCE\x84\x82\x85\x01a\"\x98V[\x91PP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x81\x90P\x92\x91PPV[_a\"\xF5\x82a\"\xD7V[a\"\xFF\x81\x85a\"\xE1V[\x93Pa#\x0F\x81\x85` \x86\x01a\x1A\x1AV[\x80\x84\x01\x91PP\x92\x91PPV[_a#&\x82\x84a\"\xEBV[\x91P\x81\x90P\x92\x91PPV", + b"`\xA0`@R0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x80\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RP4\x80\x15b\0\0CW_\x80\xFD[Pb\0\0Tb\0\0Z` \x1B` \x1CV[b\0\x01\xC4V[_b\0\0kb\0\x01^` \x1B` \x1CV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15b\0\0\xB6W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14b\0\x01[Wg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`@Qb\0\x01R\x91\x90b\0\x01\xA9V[`@Q\x80\x91\x03\x90\xA1[PV[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[b\0\x01\xA3\x81b\0\x01\x85V[\x82RPPV[_` \x82\x01\x90Pb\0\x01\xBE_\x83\x01\x84b\0\x01\x98V[\x92\x91PPV[`\x80Qa)\xECb\0\x01\xEB_9_\x81\x81a\x16\xC8\x01R\x81\x81a\x17\x1D\x01Ra\x19\xBF\x01Ra)\xEC_\xF3\xFE`\x80`@R`\x046\x10a\0\xA6W_5`\xE0\x1C\x80c\x97\xC4\x9A@\x11a\0cW\x80c\x97\xC4\x9A@\x14a\x01\x94W\x80c\xAD<\xB1\xCC\x14a\x01\xD0W\x80c\xAE\x951\x86\x14a\x01\xFAW\x80c\xC4\x11Xt\x14a\x026W\x80c\xC6R\x8Fi\x14a\x02LW\x80c\xD9\x07$\xB5\x14a\x02\x88Wa\0\xA6V[\x80c\x06 2m\x14a\0\xAAW\x80c\r\x8En,\x14a\0\xE6W\x80c)J\x87\x05\x14a\x01\x10W\x80c9\xF78\x10\x14a\x018W\x80cO\x1E\xF2\x86\x14a\x01NW\x80cR\xD1\x90-\x14a\x01jW[_\x80\xFD[4\x80\x15a\0\xB5W_\x80\xFD[Pa\0\xD0`\x04\x806\x03\x81\x01\x90a\0\xCB\x91\x90a\x1E\xFDV[a\x02\xB0V[`@Qa\0\xDD\x91\x90a\x1FBV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\0\xF1W_\x80\xFD[Pa\0\xFAa\x02\xE4V[`@Qa\x01\x07\x91\x90a\x1F\xE5V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x1BW_\x80\xFD[Pa\x016`\x04\x806\x03\x81\x01\x90a\x011\x91\x90a \xC0V[a\x03_V[\0[4\x80\x15a\x01CW_\x80\xFD[Pa\x01La\tCV[\0[a\x01h`\x04\x806\x03\x81\x01\x90a\x01c\x91\x90a\"YV[a\n\xB3V[\0[4\x80\x15a\x01uW_\x80\xFD[Pa\x01~a\n\xD2V[`@Qa\x01\x8B\x91\x90a\"\xC2V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x9FW_\x80\xFD[Pa\x01\xBA`\x04\x806\x03\x81\x01\x90a\x01\xB5\x91\x90a\x1E\xFDV[a\x0B\x03V[`@Qa\x01\xC7\x91\x90a#\x92V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xDBW_\x80\xFD[Pa\x01\xE4a\x0B\xADV[`@Qa\x01\xF1\x91\x90a\x1F\xE5V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x05W_\x80\xFD[Pa\x02 `\x04\x806\x03\x81\x01\x90a\x02\x1B\x91\x90a#\xB2V[a\x0B\xE6V[`@Qa\x02-\x91\x90a#\x92V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02AW_\x80\xFD[Pa\x02Ja\x0C\x9FV[\0[4\x80\x15a\x02WW_\x80\xFD[Pa\x02r`\x04\x806\x03\x81\x01\x90a\x02m\x91\x90a#\xB2V[a\r\xC4V[`@Qa\x02\x7F\x91\x90a\x1FBV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x93W_\x80\xFD[Pa\x02\xAE`\x04\x806\x03\x81\x01\x90a\x02\xA9\x91\x90a#\xF0V[a\x0E\x07V[\0[_\x80a\x02\xBAa\x13\xCDV[\x90P\x80`\x03\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[```@Q\x80`@\x01`@R\x80`\r\x81R` \x01\x7FMultichainACL\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x03%_a\x13\xF4V[a\x03/`\x02a\x13\xF4V[a\x038_a\x13\xF4V[`@Q` \x01a\x03K\x94\x93\x92\x91\x90a%\x1BV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x90V[\x83_a\x03j\x82a\x14\xBEV[\x90Ps\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x03\xB9\x91\x90a%\x91V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03\xD4W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\xF8\x91\x90a%\xD4V[a\x049W\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x040\x91\x90a%\x91V[`@Q\x80\x91\x03\x90\xFD[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c:Qb\xE6`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x04\x92W_\x80\xFD[PZ\xF1\x15\x80\x15a\x04\xA4W=_\x80>=_\xFD[PPPP_a\x04\xB1a\x13\xCDV[\x90P_a\x04\xBE\x88\x88a\x14\xD7V[\x90P_\x82`\x05\x01_\x83\x81R` \x01\x90\x81R` \x01_ T\x90P_\x81\x03a\x05~Ws3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x99\x1D\xC3m`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05;W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05_\x91\x90a&)V[\x90P\x80\x83`\x05\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x81\x90UPa\x06\xE1V[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xCD\x8E\x99<\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x05\xCB\x91\x90a%\x91V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05\xE6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06\n\x91\x90a%\xD4V[a\x06\xE0W_s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x88\x8B\x99\xE0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x06\\\x91\x90a%\x91V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06wW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06\x9B\x91\x90a&wV[\x90P\x89\x89\x83\x83`@Q\x7F\x13\xC9]\x8D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x06\xD7\x94\x93\x92\x91\x90a'$V[`@Q\x80\x91\x03\x90\xFD[[a\x06\xEB\x813a\x15\tV[\x82_\x01_\x83\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\x07\x8BW\x88\x883`@Q\x7Ff7\xE3-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x07\x82\x93\x92\x91\x90a'gV[`@Q\x80\x91\x03\x90\xFD[\x82`\x01\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x81T\x80\x92\x91\x90a\x07\xAE\x90a'\xC9V[\x91\x90PUP`\x01\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x82`\x02\x01_\x83\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x82`\x03\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x08\xCFWPa\x08\xCE\x81\x84`\x01\x01_\x85\x81R` \x01\x90\x81R` \x01_ Ta\x15\xDEV[[\x15a\t8W`\x01\x83`\x03\x01_\x84\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x88\x7F\x18\xF8%\xF3\x18\xFF\xA4\xED[\xF3\xF6\xED$\xFDT\xD33x\xB0\xE9\xF1m\xDB7\xC3A\x96\x91\xB2\xE1ef\x89`@Qa\t/\x91\x90a(\x10V[`@Q\x80\x91\x03\x90\xA2[PPPPPPPPPV[`\x01a\tMa\x16{V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\t\x8EW`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03_a\t\x99a\x16\x9FV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\t\xE1WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\n\x18W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\n\xA7\x91\x90a(KV[`@Q\x80\x91\x03\x90\xA1PPV[a\n\xBBa\x16\xC6V[a\n\xC4\x82a\x17\xACV[a\n\xCE\x82\x82a\x18\x9FV[PPV[_a\n\xDBa\x19\xBDV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[``_a\x0B\x0Ea\x13\xCDV[\x90P\x80`\x02\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x0B\xA0W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x0BWW[PPPPP\x91PP\x91\x90PV[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[``_a\x0B\xF1a\x13\xCDV[\x90P_a\x0B\xFE\x85\x85a\x14\xD7V[\x90P\x81`\x02\x01_\x82\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x0C\x90W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x0CGW[PPPPP\x92PPP\x92\x91PPV[`\x03_a\x0C\xAAa\x16\x9FV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x0C\xF2WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\r)W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\r\xB8\x91\x90a(KV[`@Q\x80\x91\x03\x90\xA1PPV[_\x80a\r\xCEa\x13\xCDV[\x90P_a\r\xDB\x85\x85a\x14\xD7V[\x90P\x81`\x03\x01_\x82\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x92PPP\x92\x91PPV[\x82_a\x0E\x12\x82a\x14\xBEV[\x90Ps\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0Ea\x91\x90a%\x91V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E|W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\xA0\x91\x90a%\xD4V[a\x0E\xE1W\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0E\xD8\x91\x90a%\x91V[`@Q\x80\x91\x03\x90\xFD[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c:Qb\xE6`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x0F:W_\x80\xFD[PZ\xF1\x15\x80\x15a\x0FLW=_\x80>=_\xFD[PPPP_a\x0FYa\x13\xCDV[\x90P_\x81`\x05\x01_\x88\x81R` \x01\x90\x81R` \x01_ T\x90P_\x81\x03a\x10\x19Ws3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x99\x1D\xC3m`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0F\xD6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0F\xFA\x91\x90a&)V[\x90P\x80\x82`\x05\x01_\x89\x81R` \x01\x90\x81R` \x01_ \x81\x90UPa\x11zV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xCD\x8E\x99<\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x10f\x91\x90a%\x91V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x10\x81W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x10\xA5\x91\x90a%\xD4V[a\x11yW_s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x88\x8B\x99\xE0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x10\xF7\x91\x90a%\x91V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11\x12W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x116\x91\x90a&wV[\x90P\x87\x82\x82`@Q\x7F\xAAz*\x97\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x11p\x93\x92\x91\x90a(dV[`@Q\x80\x91\x03\x90\xFD[[a\x11\x84\x813a\x15\tV[\x81_\x01_\x88\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\x12\"W\x863`@Q\x7F\xA6\xF0M&\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x12\x19\x92\x91\x90a(\x99V[`@Q\x80\x91\x03\x90\xFD[\x81`\x01\x01_\x88\x81R` \x01\x90\x81R` \x01_ _\x81T\x80\x92\x91\x90a\x12E\x90a'\xC9V[\x91\x90PUP`\x01\x82_\x01_\x89\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x02\x01_\x88\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x81`\x03\x01_\x88\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x13fWPa\x13e\x81\x83`\x01\x01_\x8A\x81R` \x01\x90\x81R` \x01_ Ta\x15\xDEV[[\x15a\x13\xC4W`\x01\x82`\x03\x01_\x89\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x86\x7F\x08h\xEC\xA7Q&\xBA\nF\xBB\xEC^\xEF\xA8\x83\xE2\n\x13\xE6\xC7\xD96\xC9\xBFG\xED\x88n.\xB4=:`@Q`@Q\x80\x91\x03\x90\xA2[PPPPPPPV[_\x7F\x7Fs:T\xA7\x01\x14\xAD\xDDr\x9B\xCD\x82y2\xA6\xC4\x02\xCC\xF3\x92\t`fY\x17\xBC.f@\xF4\0\x90P\x90V[``_`\x01a\x14\x02\x84a\x1ADV[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x14 Wa\x14\x1Fa!5V[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x14RW\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a\x14\xB3W\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a\x14\xA8Wa\x14\xA7a(\xC0V[[\x04\x94P_\x85\x03a\x14_W[\x81\x93PPPP\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x10\x83_\x1C\x90\x1C\x16\x90P\x91\x90PV[_\x82\x82`@Q` \x01a\x14\xEB\x92\x91\x90a(\x99V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x92\x91PPV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x86%\xE8v\x83\x83`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x15X\x92\x91\x90a(\xEDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x15sW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x15\x97\x91\x90a%\xD4V[a\x15\xDAW\x81\x81`@Q\x7F)\xA9\x93\xC1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x15\xD1\x92\x91\x90a(\xEDV[`@Q\x80\x91\x03\x90\xFD[PPV[_\x80s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xF8\x81t\xEA\x85`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x16-\x91\x90a%\x91V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x16HW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x16l\x91\x90a&)V[\x90P\x80\x83\x10\x15\x91PP\x92\x91PPV[_a\x16\x84a\x16\x9FV[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a\x17sWP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x17Za\x1B\x95V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x17\xAAW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x18\tW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x18-\x91\x90a)(V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x18\x9CW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x18\x93\x91\x90a(\x10V[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x19\x07WP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x19\x04\x91\x90a)gV[`\x01[a\x19HW\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x19?\x91\x90a(\x10V[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a\x19\xAEW\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x19\xA5\x91\x90a\"\xC2V[`@Q\x80\x91\x03\x90\xFD[a\x19\xB8\x83\x83a\x1B\xE8V[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x1ABW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a\x1A\xA0Wz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a\x1A\x96Wa\x1A\x95a(\xC0V[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a\x1A\xDDWm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a\x1A\xD3Wa\x1A\xD2a(\xC0V[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a\x1B\x0CWf#\x86\xF2o\xC1\0\0\x83\x81a\x1B\x02Wa\x1B\x01a(\xC0V[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a\x1B5Wc\x05\xF5\xE1\0\x83\x81a\x1B+Wa\x1B*a(\xC0V[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a\x1BZWa'\x10\x83\x81a\x1BPWa\x1BOa(\xC0V[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a\x1B}W`d\x83\x81a\x1BsWa\x1Bra(\xC0V[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a\x1B\x8CW`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a\x1B\xC1\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x1CZV[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a\x1B\xF1\x82a\x1CcV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a\x1CMWa\x1CG\x82\x82a\x1D,V[Pa\x1CVV[a\x1CUa\x1D\xACV[[PPV[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a\x1C\xBEW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1C\xB5\x91\x90a(\x10V[`@Q\x80\x91\x03\x90\xFD[\x80a\x1C\xEA\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x1CZV[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa\x1DU\x91\x90a)\xD6V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x1D\x8DW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x1D\x92V[``\x91P[P\x91P\x91Pa\x1D\xA2\x85\x83\x83a\x1D\xE8V[\x92PPP\x92\x91PPV[_4\x11\x15a\x1D\xE6W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82a\x1D\xFDWa\x1D\xF8\x82a\x1EuV[a\x1EmV[_\x82Q\x14\x80\x15a\x1E#WP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a\x1EeW\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1E\\\x91\x90a(\x10V[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa\x1EnV[[\x93\x92PPPV[_\x81Q\x11\x15a\x1E\x87W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[a\x1E\xDC\x81a\x1E\xCAV[\x81\x14a\x1E\xE6W_\x80\xFD[PV[_\x815\x90Pa\x1E\xF7\x81a\x1E\xD3V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a\x1F\x12Wa\x1F\x11a\x1E\xC2V[[_a\x1F\x1F\x84\x82\x85\x01a\x1E\xE9V[\x91PP\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[a\x1F<\x81a\x1F(V[\x82RPPV[_` \x82\x01\x90Pa\x1FU_\x83\x01\x84a\x1F3V[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a\x1F\x92W\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa\x1FwV[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a\x1F\xB7\x82a\x1F[V[a\x1F\xC1\x81\x85a\x1FeV[\x93Pa\x1F\xD1\x81\x85` \x86\x01a\x1FuV[a\x1F\xDA\x81a\x1F\x9DV[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra\x1F\xFD\x81\x84a\x1F\xADV[\x90P\x92\x91PPV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a .\x82a \x05V[\x90P\x91\x90PV[a >\x81a $V[\x81\x14a HW_\x80\xFD[PV[_\x815\x90Pa Y\x81a 5V[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12a \x80Wa \x7Fa _V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a \x9DWa \x9Ca cV[[` \x83\x01\x91P\x83`\x01\x82\x02\x83\x01\x11\x15a \xB9Wa \xB8a gV[[\x92P\x92\x90PV[_\x80_\x80``\x85\x87\x03\x12\x15a \xD8Wa \xD7a\x1E\xC2V[[_a \xE5\x87\x82\x88\x01a\x1E\xE9V[\x94PP` a \xF6\x87\x82\x88\x01a KV[\x93PP`@\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!\x17Wa!\x16a\x1E\xC6V[[a!#\x87\x82\x88\x01a kV[\x92P\x92PP\x92\x95\x91\x94P\x92PV[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a!k\x82a\x1F\x9DV[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a!\x8AWa!\x89a!5V[[\x80`@RPPPV[_a!\x9Ca\x1E\xB9V[\x90Pa!\xA8\x82\x82a!bV[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a!\xC7Wa!\xC6a!5V[[a!\xD0\x82a\x1F\x9DV[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_a!\xFDa!\xF8\x84a!\xADV[a!\x93V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a\"\x19Wa\"\x18a!1V[[a\"$\x84\x82\x85a!\xDDV[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a\"@Wa\"?a _V[[\x815a\"P\x84\x82` \x86\x01a!\xEBV[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a\"oWa\"na\x1E\xC2V[[_a\"|\x85\x82\x86\x01a KV[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\"\x9DWa\"\x9Ca\x1E\xC6V[[a\"\xA9\x85\x82\x86\x01a\",V[\x91PP\x92P\x92\x90PV[a\"\xBC\x81a\x1E\xCAV[\x82RPPV[_` \x82\x01\x90Pa\"\xD5_\x83\x01\x84a\"\xB3V[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a#\r\x81a $V[\x82RPPV[_a#\x1E\x83\x83a#\x04V[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a#@\x82a\"\xDBV[a#J\x81\x85a\"\xE5V[\x93Pa#U\x83a\"\xF5V[\x80_[\x83\x81\x10\x15a#\x85W\x81Qa#l\x88\x82a#\x13V[\x97Pa#w\x83a#*V[\x92PP`\x01\x81\x01\x90Pa#XV[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra#\xAA\x81\x84a#6V[\x90P\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a#\xC8Wa#\xC7a\x1E\xC2V[[_a#\xD5\x85\x82\x86\x01a\x1E\xE9V[\x92PP` a#\xE6\x85\x82\x86\x01a KV[\x91PP\x92P\x92\x90PV[_\x80_`@\x84\x86\x03\x12\x15a$\x07Wa$\x06a\x1E\xC2V[[_a$\x14\x86\x82\x87\x01a\x1E\xE9V[\x93PP` \x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a$5Wa$4a\x1E\xC6V[[a$A\x86\x82\x87\x01a kV[\x92P\x92PP\x92P\x92P\x92V[_\x81\x90P\x92\x91PPV[_a$a\x82a\x1F[V[a$k\x81\x85a$MV[\x93Pa${\x81\x85` \x86\x01a\x1FuV[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a$\xBB`\x02\x83a$MV[\x91Pa$\xC6\x82a$\x87V[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a%\x05`\x01\x83a$MV[\x91Pa%\x10\x82a$\xD1V[`\x01\x82\x01\x90P\x91\x90PV[_a%&\x82\x87a$WV[\x91Pa%1\x82a$\xAFV[\x91Pa%=\x82\x86a$WV[\x91Pa%H\x82a$\xF9V[\x91Pa%T\x82\x85a$WV[\x91Pa%_\x82a$\xF9V[\x91Pa%k\x82\x84a$WV[\x91P\x81\x90P\x95\x94PPPPPV[_\x81\x90P\x91\x90PV[a%\x8B\x81a%yV[\x82RPPV[_` \x82\x01\x90Pa%\xA4_\x83\x01\x84a%\x82V[\x92\x91PPV[a%\xB3\x81a\x1F(V[\x81\x14a%\xBDW_\x80\xFD[PV[_\x81Q\x90Pa%\xCE\x81a%\xAAV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a%\xE9Wa%\xE8a\x1E\xC2V[[_a%\xF6\x84\x82\x85\x01a%\xC0V[\x91PP\x92\x91PPV[a&\x08\x81a%yV[\x81\x14a&\x12W_\x80\xFD[PV[_\x81Q\x90Pa&#\x81a%\xFFV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a&>Wa&=a\x1E\xC2V[[_a&K\x84\x82\x85\x01a&\x15V[\x91PP\x92\x91PPV[`\x08\x81\x10a&`W_\x80\xFD[PV[_\x81Q\x90Pa&q\x81a&TV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a&\x8CWa&\x8Ba\x1E\xC2V[[_a&\x99\x84\x82\x85\x01a&cV[\x91PP\x92\x91PPV[a&\xAB\x81a $V[\x82RPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[`\x08\x81\x10a&\xEFWa&\xEEa&\xB1V[[PV[_\x81\x90Pa&\xFF\x82a&\xDEV[\x91\x90PV[_a'\x0E\x82a&\xF2V[\x90P\x91\x90PV[a'\x1E\x81a'\x04V[\x82RPPV[_`\x80\x82\x01\x90Pa'7_\x83\x01\x87a\"\xB3V[a'D` \x83\x01\x86a&\xA2V[a'Q`@\x83\x01\x85a%\x82V[a'^``\x83\x01\x84a'\x15V[\x95\x94PPPPPV[_``\x82\x01\x90Pa'z_\x83\x01\x86a\"\xB3V[a'\x87` \x83\x01\x85a&\xA2V[a'\x94`@\x83\x01\x84a&\xA2V[\x94\x93PPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_a'\xD3\x82a%yV[\x91P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x03a(\x05Wa(\x04a'\x9CV[[`\x01\x82\x01\x90P\x91\x90PV[_` \x82\x01\x90Pa(#_\x83\x01\x84a&\xA2V[\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[a(E\x81a()V[\x82RPPV[_` \x82\x01\x90Pa(^_\x83\x01\x84a(V[\0[4\x80\x15a\x018W_\x80\xFD[Pa\x01Aa\x07\x87V[\0[a\x01]`\x04\x806\x03\x81\x01\x90a\x01X\x91\x90a\x1C\xFEV[a\x08\xF7V[\0[4\x80\x15a\x01jW_\x80\xFD[Pa\x01sa\t\x16V[`@Qa\x01\x80\x91\x90a\x1DgV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x94W_\x80\xFD[Pa\x01\xAF`\x04\x806\x03\x81\x01\x90a\x01\xAA\x91\x90a\x19\xA2V[a\tGV[`@Qa\x01\xBC\x91\x90a\x1E7V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xD0W_\x80\xFD[Pa\x01\xD9a\t\xF1V[`@Qa\x01\xE6\x91\x90a\x1A\x8AV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xFAW_\x80\xFD[Pa\x02\x15`\x04\x806\x03\x81\x01\x90a\x02\x10\x91\x90a\x1EWV[a\n*V[`@Qa\x02\"\x91\x90a\x1E7V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x026W_\x80\xFD[Pa\x02Q`\x04\x806\x03\x81\x01\x90a\x02L\x91\x90a\x1EWV[a\n\xE3V[`@Qa\x02^\x91\x90a\x19\xE7V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02rW_\x80\xFD[Pa\x02\x8D`\x04\x806\x03\x81\x01\x90a\x02\x88\x91\x90a\x1E\x95V[a\x0B&V[\0[_\x80a\x02\x99a\x0FSV[\x90P\x80`\x03\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[```@Q\x80`@\x01`@R\x80`\r\x81R` \x01\x7FMultichainACL\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x03\x04_a\x0FzV[a\x03\x0E`\x01a\x0FzV[a\x03\x17_a\x0FzV[`@Q` \x01a\x03*\x94\x93\x92\x91\x90a\x1F\xC0V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x90V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xD3\xED\xFE3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x03\x8B\x91\x90a -V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03\xA6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\xCA\x91\x90a pV[a\x04\x0BW3`@Q\x7FR\xD7%\xF5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x04\x02\x91\x90a -V[`@Q\x80\x91\x03\x90\xFD[\x83_a\x04\x16\x82a\x10DV[\x90Ps\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x04e\x91\x90a \xB3V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\x80W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04\xA4\x91\x90a pV[a\x04\xE5W\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x04\xDC\x91\x90a \xB3V[`@Q\x80\x91\x03\x90\xFD[_a\x04\xEEa\x0FSV[\x90P_a\x04\xFB\x88\x88a\x10]V[\x90P_\x82`\x05\x01_\x83\x81R` \x01\x90\x81R` \x01_ T\x03a\x051W`\x01\x82`\x05\x01_\x83\x81R` \x01\x90\x81R` \x01_ \x81\x90UP[\x81_\x01_\x82\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\x05\xD1W\x87\x873`@Q\x7Ff7\xE3-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05\xC8\x93\x92\x91\x90a \xCCV[`@Q\x80\x91\x03\x90\xFD[\x81`\x01\x01_\x82\x81R` \x01\x90\x81R` \x01_ _\x81T\x80\x92\x91\x90a\x05\xF4\x90a!.V[\x91\x90PUP`\x01\x82_\x01_\x83\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x02\x01_\x82\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x81`\x03\x01_\x82\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x07\x14WPa\x07\x13\x82`\x01\x01_\x83\x81R` \x01\x90\x81R` \x01_ Ta\x10\x8FV[[\x15a\x07}W`\x01\x82`\x03\x01_\x83\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x87\x7F\x18\xF8%\xF3\x18\xFF\xA4\xED[\xF3\xF6\xED$\xFDT\xD33x\xB0\xE9\xF1m\xDB7\xC3A\x96\x91\xB2\xE1ef\x88`@Qa\x07t\x91\x90a -V[`@Q\x80\x91\x03\x90\xA2[PPPPPPPPV[`\x01a\x07\x91a\x11 V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x07\xD2W`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02_a\x07\xDDa\x11DV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x08%WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\x08\\W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\x08\xEB\x91\x90a!\x97V[`@Q\x80\x91\x03\x90\xA1PPV[a\x08\xFFa\x11kV[a\t\x08\x82a\x12QV[a\t\x12\x82\x82a\x13DV[PPV[_a\t\x1Fa\x14bV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[``_a\tRa\x0FSV[\x90P\x80`\x02\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\t\xE4W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\t\x9BW[PPPPP\x91PP\x91\x90PV[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[``_a\n5a\x0FSV[\x90P_a\nB\x85\x85a\x10]V[\x90P\x81`\x02\x01_\x82\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\n\xD4W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\n\x8BW[PPPPP\x92PPP\x92\x91PPV[_\x80a\n\xEDa\x0FSV[\x90P_a\n\xFA\x85\x85a\x10]V[\x90P\x81`\x03\x01_\x82\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x92PPP\x92\x91PPV[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c-\xD3\xED\xFE3`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0Bs\x91\x90a -V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0B\x8EW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0B\xB2\x91\x90a pV[a\x0B\xF3W3`@Q\x7FR\xD7%\xF5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0B\xEA\x91\x90a -V[`@Q\x80\x91\x03\x90\xFD[\x82_a\x0B\xFE\x82a\x10DV[\x90Ps\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0CM\x91\x90a \xB3V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0ChW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0C\x8C\x91\x90a pV[a\x0C\xCDW\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0C\xC4\x91\x90a \xB3V[`@Q\x80\x91\x03\x90\xFD[_a\x0C\xD6a\x0FSV[\x90P_\x81`\x05\x01_\x88\x81R` \x01\x90\x81R` \x01_ T\x03a\r\x0CW`\x01\x81`\x05\x01_\x88\x81R` \x01\x90\x81R` \x01_ \x81\x90UP[\x80_\x01_\x87\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\r\xAAW\x853`@Q\x7F\xA6\xF0M&\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\r\xA1\x92\x91\x90a!\xB0V[`@Q\x80\x91\x03\x90\xFD[\x80`\x01\x01_\x87\x81R` \x01\x90\x81R` \x01_ _\x81T\x80\x92\x91\x90a\r\xCD\x90a!.V[\x91\x90PUP`\x01\x81_\x01_\x88\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x80`\x02\x01_\x87\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x80`\x03\x01_\x87\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x0E\xEDWPa\x0E\xEC\x81`\x01\x01_\x88\x81R` \x01\x90\x81R` \x01_ Ta\x10\x8FV[[\x15a\x0FKW`\x01\x81`\x03\x01_\x88\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x85\x7F\x08h\xEC\xA7Q&\xBA\nF\xBB\xEC^\xEF\xA8\x83\xE2\n\x13\xE6\xC7\xD96\xC9\xBFG\xED\x88n.\xB4=:`@Q`@Q\x80\x91\x03\x90\xA2[PPPPPPV[_\x7F\x7Fs:T\xA7\x01\x14\xAD\xDDr\x9B\xCD\x82y2\xA6\xC4\x02\xCC\xF3\x92\t`fY\x17\xBC.f@\xF4\0\x90P\x90V[``_`\x01a\x0F\x88\x84a\x14\xE9V[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x0F\xA6Wa\x0F\xA5a\x1B\xDAV[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x0F\xD8W\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a\x109W\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a\x10.Wa\x10-a!\xD7V[[\x04\x94P_\x85\x03a\x0F\xE5W[\x81\x93PPPP\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x10\x83_\x1C\x90\x1C\x16\x90P\x91\x90PV[_\x82\x82`@Q` \x01a\x10q\x92\x91\x90a!\xB0V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x92\x91PPV[_\x80s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cg\x99\xEFR`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x10\xEEW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11\x12\x91\x90a\".V[\x90P\x80\x83\x10\x15\x91PP\x91\x90PV[_a\x11)a\x11DV[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a\x12\x18WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x11\xFFa\x16:V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x12OW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x12\xAEW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x12\xD2\x91\x90a\"mV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x13AW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x138\x91\x90a -V[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x13\xACWP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x13\xA9\x91\x90a\"\xACV[`\x01[a\x13\xEDW\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x13\xE4\x91\x90a -V[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a\x14SW\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x14J\x91\x90a\x1DgV[`@Q\x80\x91\x03\x90\xFD[a\x14]\x83\x83a\x16\x8DV[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x14\xE7W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a\x15EWz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a\x15;Wa\x15:a!\xD7V[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a\x15\x82Wm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a\x15xWa\x15wa!\xD7V[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a\x15\xB1Wf#\x86\xF2o\xC1\0\0\x83\x81a\x15\xA7Wa\x15\xA6a!\xD7V[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a\x15\xDAWc\x05\xF5\xE1\0\x83\x81a\x15\xD0Wa\x15\xCFa!\xD7V[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a\x15\xFFWa'\x10\x83\x81a\x15\xF5Wa\x15\xF4a!\xD7V[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a\x16\"W`d\x83\x81a\x16\x18Wa\x16\x17a!\xD7V[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a\x161W`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a\x16f\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x16\xFFV[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a\x16\x96\x82a\x17\x08V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a\x16\xF2Wa\x16\xEC\x82\x82a\x17\xD1V[Pa\x16\xFBV[a\x16\xFAa\x18QV[[PPV[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a\x17cW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x17Z\x91\x90a -V[`@Q\x80\x91\x03\x90\xFD[\x80a\x17\x8F\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x16\xFFV[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa\x17\xFA\x91\x90a#\x1BV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x182W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x187V[``\x91P[P\x91P\x91Pa\x18G\x85\x83\x83a\x18\x8DV[\x92PPP\x92\x91PPV[_4\x11\x15a\x18\x8BW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82a\x18\xA2Wa\x18\x9D\x82a\x19\x1AV[a\x19\x12V[_\x82Q\x14\x80\x15a\x18\xC8WP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a\x19\nW\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x19\x01\x91\x90a -V[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa\x19\x13V[[\x93\x92PPPV[_\x81Q\x11\x15a\x19,W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[a\x19\x81\x81a\x19oV[\x81\x14a\x19\x8BW_\x80\xFD[PV[_\x815\x90Pa\x19\x9C\x81a\x19xV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a\x19\xB7Wa\x19\xB6a\x19gV[[_a\x19\xC4\x84\x82\x85\x01a\x19\x8EV[\x91PP\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[a\x19\xE1\x81a\x19\xCDV[\x82RPPV[_` \x82\x01\x90Pa\x19\xFA_\x83\x01\x84a\x19\xD8V[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a\x1A7W\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa\x1A\x1CV[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a\x1A\\\x82a\x1A\0V[a\x1Af\x81\x85a\x1A\nV[\x93Pa\x1Av\x81\x85` \x86\x01a\x1A\x1AV[a\x1A\x7F\x81a\x1ABV[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra\x1A\xA2\x81\x84a\x1ARV[\x90P\x92\x91PPV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a\x1A\xD3\x82a\x1A\xAAV[\x90P\x91\x90PV[a\x1A\xE3\x81a\x1A\xC9V[\x81\x14a\x1A\xEDW_\x80\xFD[PV[_\x815\x90Pa\x1A\xFE\x81a\x1A\xDAV[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12a\x1B%Wa\x1B$a\x1B\x04V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1BBWa\x1BAa\x1B\x08V[[` \x83\x01\x91P\x83`\x01\x82\x02\x83\x01\x11\x15a\x1B^Wa\x1B]a\x1B\x0CV[[\x92P\x92\x90PV[_\x80_\x80``\x85\x87\x03\x12\x15a\x1B}Wa\x1B|a\x19gV[[_a\x1B\x8A\x87\x82\x88\x01a\x19\x8EV[\x94PP` a\x1B\x9B\x87\x82\x88\x01a\x1A\xF0V[\x93PP`@\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1B\xBCWa\x1B\xBBa\x19kV[[a\x1B\xC8\x87\x82\x88\x01a\x1B\x10V[\x92P\x92PP\x92\x95\x91\x94P\x92PV[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a\x1C\x10\x82a\x1ABV[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\x1C/Wa\x1C.a\x1B\xDAV[[\x80`@RPPPV[_a\x1CAa\x19^V[\x90Pa\x1CM\x82\x82a\x1C\x07V[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x1ClWa\x1Cka\x1B\xDAV[[a\x1Cu\x82a\x1ABV[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_a\x1C\xA2a\x1C\x9D\x84a\x1CRV[a\x1C8V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a\x1C\xBEWa\x1C\xBDa\x1B\xD6V[[a\x1C\xC9\x84\x82\x85a\x1C\x82V[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a\x1C\xE5Wa\x1C\xE4a\x1B\x04V[[\x815a\x1C\xF5\x84\x82` \x86\x01a\x1C\x90V[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a\x1D\x14Wa\x1D\x13a\x19gV[[_a\x1D!\x85\x82\x86\x01a\x1A\xF0V[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1DBWa\x1DAa\x19kV[[a\x1DN\x85\x82\x86\x01a\x1C\xD1V[\x91PP\x92P\x92\x90PV[a\x1Da\x81a\x19oV[\x82RPPV[_` \x82\x01\x90Pa\x1Dz_\x83\x01\x84a\x1DXV[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a\x1D\xB2\x81a\x1A\xC9V[\x82RPPV[_a\x1D\xC3\x83\x83a\x1D\xA9V[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a\x1D\xE5\x82a\x1D\x80V[a\x1D\xEF\x81\x85a\x1D\x8AV[\x93Pa\x1D\xFA\x83a\x1D\x9AV[\x80_[\x83\x81\x10\x15a\x1E*W\x81Qa\x1E\x11\x88\x82a\x1D\xB8V[\x97Pa\x1E\x1C\x83a\x1D\xCFV[\x92PP`\x01\x81\x01\x90Pa\x1D\xFDV[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra\x1EO\x81\x84a\x1D\xDBV[\x90P\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a\x1EmWa\x1Ela\x19gV[[_a\x1Ez\x85\x82\x86\x01a\x19\x8EV[\x92PP` a\x1E\x8B\x85\x82\x86\x01a\x1A\xF0V[\x91PP\x92P\x92\x90PV[_\x80_`@\x84\x86\x03\x12\x15a\x1E\xACWa\x1E\xABa\x19gV[[_a\x1E\xB9\x86\x82\x87\x01a\x19\x8EV[\x93PP` \x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1E\xDAWa\x1E\xD9a\x19kV[[a\x1E\xE6\x86\x82\x87\x01a\x1B\x10V[\x92P\x92PP\x92P\x92P\x92V[_\x81\x90P\x92\x91PPV[_a\x1F\x06\x82a\x1A\0V[a\x1F\x10\x81\x85a\x1E\xF2V[\x93Pa\x1F \x81\x85` \x86\x01a\x1A\x1AV[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a\x1F``\x02\x83a\x1E\xF2V[\x91Pa\x1Fk\x82a\x1F,V[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a\x1F\xAA`\x01\x83a\x1E\xF2V[\x91Pa\x1F\xB5\x82a\x1FvV[`\x01\x82\x01\x90P\x91\x90PV[_a\x1F\xCB\x82\x87a\x1E\xFCV[\x91Pa\x1F\xD6\x82a\x1FTV[\x91Pa\x1F\xE2\x82\x86a\x1E\xFCV[\x91Pa\x1F\xED\x82a\x1F\x9EV[\x91Pa\x1F\xF9\x82\x85a\x1E\xFCV[\x91Pa \x04\x82a\x1F\x9EV[\x91Pa \x10\x82\x84a\x1E\xFCV[\x91P\x81\x90P\x95\x94PPPPPV[a '\x81a\x1A\xC9V[\x82RPPV[_` \x82\x01\x90Pa @_\x83\x01\x84a \x1EV[\x92\x91PPV[a O\x81a\x19\xCDV[\x81\x14a YW_\x80\xFD[PV[_\x81Q\x90Pa j\x81a FV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a \x85Wa \x84a\x19gV[[_a \x92\x84\x82\x85\x01a \\V[\x91PP\x92\x91PPV[_\x81\x90P\x91\x90PV[a \xAD\x81a \x9BV[\x82RPPV[_` \x82\x01\x90Pa \xC6_\x83\x01\x84a \xA4V[\x92\x91PPV[_``\x82\x01\x90Pa \xDF_\x83\x01\x86a\x1DXV[a \xEC` \x83\x01\x85a \x1EV[a \xF9`@\x83\x01\x84a \x1EV[\x94\x93PPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_a!8\x82a \x9BV[\x91P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x03a!jWa!ia!\x01V[[`\x01\x82\x01\x90P\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[a!\x91\x81a!uV[\x82RPPV[_` \x82\x01\x90Pa!\xAA_\x83\x01\x84a!\x88V[\x92\x91PPV[_`@\x82\x01\x90Pa!\xC3_\x83\x01\x85a\x1DXV[a!\xD0` \x83\x01\x84a \x1EV[\x93\x92PPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[a\"\r\x81a \x9BV[\x81\x14a\"\x17W_\x80\xFD[PV[_\x81Q\x90Pa\"(\x81a\"\x04V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a\"CWa\"Ba\x19gV[[_a\"P\x84\x82\x85\x01a\"\x1AV[\x91PP\x92\x91PPV[_\x81Q\x90Pa\"g\x81a\x1A\xDAV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a\"\x82Wa\"\x81a\x19gV[[_a\"\x8F\x84\x82\x85\x01a\"YV[\x91PP\x92\x91PPV[_\x81Q\x90Pa\"\xA6\x81a\x19xV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a\"\xC1Wa\"\xC0a\x19gV[[_a\"\xCE\x84\x82\x85\x01a\"\x98V[\x91PP\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x81\x90P\x92\x91PPV[_a\"\xF5\x82a\"\xD7V[a\"\xFF\x81\x85a\"\xE1V[\x93Pa#\x0F\x81\x85` \x86\x01a\x1A\x1AV[\x80\x84\x01\x91PP\x92\x91PPV[_a#&\x82\x84a\"\xEBV[\x91P\x81\x90P\x92\x91PPV", + b"`\x80`@R`\x046\x10a\0\xA6W_5`\xE0\x1C\x80c\x97\xC4\x9A@\x11a\0cW\x80c\x97\xC4\x9A@\x14a\x01\x94W\x80c\xAD<\xB1\xCC\x14a\x01\xD0W\x80c\xAE\x951\x86\x14a\x01\xFAW\x80c\xC4\x11Xt\x14a\x026W\x80c\xC6R\x8Fi\x14a\x02LW\x80c\xD9\x07$\xB5\x14a\x02\x88Wa\0\xA6V[\x80c\x06 2m\x14a\0\xAAW\x80c\r\x8En,\x14a\0\xE6W\x80c)J\x87\x05\x14a\x01\x10W\x80c9\xF78\x10\x14a\x018W\x80cO\x1E\xF2\x86\x14a\x01NW\x80cR\xD1\x90-\x14a\x01jW[_\x80\xFD[4\x80\x15a\0\xB5W_\x80\xFD[Pa\0\xD0`\x04\x806\x03\x81\x01\x90a\0\xCB\x91\x90a\x1E\xFDV[a\x02\xB0V[`@Qa\0\xDD\x91\x90a\x1FBV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\0\xF1W_\x80\xFD[Pa\0\xFAa\x02\xE4V[`@Qa\x01\x07\x91\x90a\x1F\xE5V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x1BW_\x80\xFD[Pa\x016`\x04\x806\x03\x81\x01\x90a\x011\x91\x90a \xC0V[a\x03_V[\0[4\x80\x15a\x01CW_\x80\xFD[Pa\x01La\tCV[\0[a\x01h`\x04\x806\x03\x81\x01\x90a\x01c\x91\x90a\"YV[a\n\xB3V[\0[4\x80\x15a\x01uW_\x80\xFD[Pa\x01~a\n\xD2V[`@Qa\x01\x8B\x91\x90a\"\xC2V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x9FW_\x80\xFD[Pa\x01\xBA`\x04\x806\x03\x81\x01\x90a\x01\xB5\x91\x90a\x1E\xFDV[a\x0B\x03V[`@Qa\x01\xC7\x91\x90a#\x92V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xDBW_\x80\xFD[Pa\x01\xE4a\x0B\xADV[`@Qa\x01\xF1\x91\x90a\x1F\xE5V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x05W_\x80\xFD[Pa\x02 `\x04\x806\x03\x81\x01\x90a\x02\x1B\x91\x90a#\xB2V[a\x0B\xE6V[`@Qa\x02-\x91\x90a#\x92V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02AW_\x80\xFD[Pa\x02Ja\x0C\x9FV[\0[4\x80\x15a\x02WW_\x80\xFD[Pa\x02r`\x04\x806\x03\x81\x01\x90a\x02m\x91\x90a#\xB2V[a\r\xC4V[`@Qa\x02\x7F\x91\x90a\x1FBV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x93W_\x80\xFD[Pa\x02\xAE`\x04\x806\x03\x81\x01\x90a\x02\xA9\x91\x90a#\xF0V[a\x0E\x07V[\0[_\x80a\x02\xBAa\x13\xCDV[\x90P\x80`\x03\x01_\x84\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x91PP\x91\x90PV[```@Q\x80`@\x01`@R\x80`\r\x81R` \x01\x7FMultichainACL\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x03%_a\x13\xF4V[a\x03/`\x02a\x13\xF4V[a\x038_a\x13\xF4V[`@Q` \x01a\x03K\x94\x93\x92\x91\x90a%\x1BV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x90V[\x83_a\x03j\x82a\x14\xBEV[\x90Ps\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x03\xB9\x91\x90a%\x91V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03\xD4W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\xF8\x91\x90a%\xD4V[a\x049W\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x040\x91\x90a%\x91V[`@Q\x80\x91\x03\x90\xFD[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c:Qb\xE6`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x04\x92W_\x80\xFD[PZ\xF1\x15\x80\x15a\x04\xA4W=_\x80>=_\xFD[PPPP_a\x04\xB1a\x13\xCDV[\x90P_a\x04\xBE\x88\x88a\x14\xD7V[\x90P_\x82`\x05\x01_\x83\x81R` \x01\x90\x81R` \x01_ T\x90P_\x81\x03a\x05~Ws3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x99\x1D\xC3m`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05;W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05_\x91\x90a&)V[\x90P\x80\x83`\x05\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x81\x90UPa\x06\xE1V[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xCD\x8E\x99<\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x05\xCB\x91\x90a%\x91V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05\xE6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06\n\x91\x90a%\xD4V[a\x06\xE0W_s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x88\x8B\x99\xE0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x06\\\x91\x90a%\x91V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06wW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06\x9B\x91\x90a&wV[\x90P\x89\x89\x83\x83`@Q\x7F\x13\xC9]\x8D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x06\xD7\x94\x93\x92\x91\x90a'$V[`@Q\x80\x91\x03\x90\xFD[[a\x06\xEB\x813a\x15\tV[\x82_\x01_\x83\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\x07\x8BW\x88\x883`@Q\x7Ff7\xE3-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x07\x82\x93\x92\x91\x90a'gV[`@Q\x80\x91\x03\x90\xFD[\x82`\x01\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x81T\x80\x92\x91\x90a\x07\xAE\x90a'\xC9V[\x91\x90PUP`\x01\x83_\x01_\x84\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x82`\x02\x01_\x83\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x82`\x03\x01_\x83\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x08\xCFWPa\x08\xCE\x81\x84`\x01\x01_\x85\x81R` \x01\x90\x81R` \x01_ Ta\x15\xDEV[[\x15a\t8W`\x01\x83`\x03\x01_\x84\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x88\x7F\x18\xF8%\xF3\x18\xFF\xA4\xED[\xF3\xF6\xED$\xFDT\xD33x\xB0\xE9\xF1m\xDB7\xC3A\x96\x91\xB2\xE1ef\x89`@Qa\t/\x91\x90a(\x10V[`@Q\x80\x91\x03\x90\xA2[PPPPPPPPPV[`\x01a\tMa\x16{V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\t\x8EW`@Q\x7FoOs\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03_a\t\x99a\x16\x9FV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\t\xE1WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\n\x18W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\n\xA7\x91\x90a(KV[`@Q\x80\x91\x03\x90\xA1PPV[a\n\xBBa\x16\xC6V[a\n\xC4\x82a\x17\xACV[a\n\xCE\x82\x82a\x18\x9FV[PPV[_a\n\xDBa\x19\xBDV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x90P\x90V[``_a\x0B\x0Ea\x13\xCDV[\x90P\x80`\x02\x01_\x84\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x0B\xA0W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x0BWW[PPPPP\x91PP\x91\x90PV[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[``_a\x0B\xF1a\x13\xCDV[\x90P_a\x0B\xFE\x85\x85a\x14\xD7V[\x90P\x81`\x02\x01_\x82\x81R` \x01\x90\x81R` \x01_ \x80T\x80` \x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80T\x80\x15a\x0C\x90W` \x02\x82\x01\x91\x90_R` _ \x90[\x81_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90`\x01\x01\x90\x80\x83\x11a\x0CGW[PPPPP\x92PPP\x92\x91PPV[`\x03_a\x0C\xAAa\x16\x9FV[\x90P\x80_\x01`\x08\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x80a\x0C\xF2WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x10\x15[\x15a\r)W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81\x81_\x01_a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\x01\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP_\x81_\x01`\x08a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x82`@Qa\r\xB8\x91\x90a(KV[`@Q\x80\x91\x03\x90\xA1PPV[_\x80a\r\xCEa\x13\xCDV[\x90P_a\r\xDB\x85\x85a\x14\xD7V[\x90P\x81`\x03\x01_\x82\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x92PPP\x92\x91PPV[\x82_a\x0E\x12\x82a\x14\xBEV[\x90Ps\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xBF\xF3\xAA\xBA\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0Ea\x91\x90a%\x91V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E|W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\xA0\x91\x90a%\xD4V[a\x0E\xE1W\x80`@Q\x7F\xB6g\x9C;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x0E\xD8\x91\x90a%\x91V[`@Q\x80\x91\x03\x90\xFD[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c:Qb\xE6`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x0F:W_\x80\xFD[PZ\xF1\x15\x80\x15a\x0FLW=_\x80>=_\xFD[PPPP_a\x0FYa\x13\xCDV[\x90P_\x81`\x05\x01_\x88\x81R` \x01\x90\x81R` \x01_ T\x90P_\x81\x03a\x10\x19Ws3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x99\x1D\xC3m`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0F\xD6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0F\xFA\x91\x90a&)V[\x90P\x80\x82`\x05\x01_\x89\x81R` \x01\x90\x81R` \x01_ \x81\x90UPa\x11zV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xCD\x8E\x99<\x82`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x10f\x91\x90a%\x91V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x10\x81W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x10\xA5\x91\x90a%\xD4V[a\x11yW_s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x88\x8B\x99\xE0\x83`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x10\xF7\x91\x90a%\x91V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11\x12W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x116\x91\x90a&wV[\x90P\x87\x82\x82`@Q\x7F\xAAz*\x97\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x11p\x93\x92\x91\x90a(dV[`@Q\x80\x91\x03\x90\xFD[[a\x11\x84\x813a\x15\tV[\x81_\x01_\x88\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15a\x12\"W\x863`@Q\x7F\xA6\xF0M&\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x12\x19\x92\x91\x90a(\x99V[`@Q\x80\x91\x03\x90\xFD[\x81`\x01\x01_\x88\x81R` \x01\x90\x81R` \x01_ _\x81T\x80\x92\x91\x90a\x12E\x90a'\xC9V[\x91\x90PUP`\x01\x82_\x01_\x89\x81R` \x01\x90\x81R` \x01_ _3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x02\x01_\x88\x81R` \x01\x90\x81R` \x01_ 3\x90\x80`\x01\x81T\x01\x80\x82U\x80\x91PP`\x01\x90\x03\x90_R` _ \x01_\x90\x91\x90\x91\x90\x91a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x81`\x03\x01_\x88\x81R` \x01\x90\x81R` \x01_ _\x90T\x90a\x01\0\n\x90\x04`\xFF\x16\x15\x80\x15a\x13fWPa\x13e\x81\x83`\x01\x01_\x8A\x81R` \x01\x90\x81R` \x01_ Ta\x15\xDEV[[\x15a\x13\xC4W`\x01\x82`\x03\x01_\x89\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x86\x7F\x08h\xEC\xA7Q&\xBA\nF\xBB\xEC^\xEF\xA8\x83\xE2\n\x13\xE6\xC7\xD96\xC9\xBFG\xED\x88n.\xB4=:`@Q`@Q\x80\x91\x03\x90\xA2[PPPPPPPV[_\x7F\x7Fs:T\xA7\x01\x14\xAD\xDDr\x9B\xCD\x82y2\xA6\xC4\x02\xCC\xF3\x92\t`fY\x17\xBC.f@\xF4\0\x90P\x90V[``_`\x01a\x14\x02\x84a\x1ADV[\x01\x90P_\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x14 Wa\x14\x1Fa!5V[[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x14RW\x81` \x01`\x01\x82\x02\x806\x837\x80\x82\x01\x91PP\x90P[P\x90P_\x82` \x01\x82\x01\x90P[`\x01\x15a\x14\xB3W\x80\x80`\x01\x90\x03\x91PP\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x81a\x14\xA8Wa\x14\xA7a(\xC0V[[\x04\x94P_\x85\x03a\x14_W[\x81\x93PPPP\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x10\x83_\x1C\x90\x1C\x16\x90P\x91\x90PV[_\x82\x82`@Q` \x01a\x14\xEB\x92\x91\x90a(\x99V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x92\x91PPV[s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x86%\xE8v\x83\x83`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x15X\x92\x91\x90a(\xEDV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x15sW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x15\x97\x91\x90a%\xD4V[a\x15\xDAW\x81\x81`@Q\x7F)\xA9\x93\xC1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x15\xD1\x92\x91\x90a(\xEDV[`@Q\x80\x91\x03\x90\xFD[PPV[_\x80s3\xE0\xC7\xA0=+\x04\x0BQ\x85\x80\xC3e\xF4\xB3\xBD\xE7\xCCNns\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xF8\x81t\xEA\x85`@Q\x82c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x16-\x91\x90a%\x91V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x16HW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x16l\x91\x90a&)V[\x90P\x80\x83\x10\x15\x91PP\x92\x91PPV[_a\x16\x84a\x16\x9FV[_\x01_\x90T\x90a\x01\0\n\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[_\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90P\x90V[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x80a\x17sWP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x17Za\x1B\x95V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x17\xAAW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[s\xA5\x0FRC\xC7\x0C\x80\xA80\x9E=9\xD8\xC9\xD9X\xCD\xA89ys\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x8D\xA5\xCB[`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x18\tW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x18-\x91\x90a)(V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x18\x9CW3`@Q\x7F\x0EV\xCF=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x18\x93\x91\x90a(\x10V[`@Q\x80\x91\x03\x90\xFD[PV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x19\x07WP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x19\x04\x91\x90a)gV[`\x01[a\x19HW\x81`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x19?\x91\x90a(\x10V[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1B\x81\x14a\x19\xAEW\x80`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x19\xA5\x91\x90a\"\xC2V[`@Q\x80\x91\x03\x90\xFD[a\x19\xB8\x83\x83a\x1B\xE8V[PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x160s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x1ABW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[_\x80_\x90Pz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a\x1A\xA0Wz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x81a\x1A\x96Wa\x1A\x95a(\xC0V[[\x04\x92P`@\x81\x01\x90P[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a\x1A\xDDWm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x81a\x1A\xD3Wa\x1A\xD2a(\xC0V[[\x04\x92P` \x81\x01\x90P[f#\x86\xF2o\xC1\0\0\x83\x10a\x1B\x0CWf#\x86\xF2o\xC1\0\0\x83\x81a\x1B\x02Wa\x1B\x01a(\xC0V[[\x04\x92P`\x10\x81\x01\x90P[c\x05\xF5\xE1\0\x83\x10a\x1B5Wc\x05\xF5\xE1\0\x83\x81a\x1B+Wa\x1B*a(\xC0V[[\x04\x92P`\x08\x81\x01\x90P[a'\x10\x83\x10a\x1BZWa'\x10\x83\x81a\x1BPWa\x1BOa(\xC0V[[\x04\x92P`\x04\x81\x01\x90P[`d\x83\x10a\x1B}W`d\x83\x81a\x1BsWa\x1Bra(\xC0V[[\x04\x92P`\x02\x81\x01\x90P[`\n\x83\x10a\x1B\x8CW`\x01\x81\x01\x90P[\x80\x91PP\x91\x90PV[_a\x1B\xC1\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x1CZV[_\x01_\x90T\x90a\x01\0\n\x90\x04s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90P\x90V[a\x1B\xF1\x82a\x1CcV[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`@Q`@Q\x80\x91\x03\x90\xA2_\x81Q\x11\x15a\x1CMWa\x1CG\x82\x82a\x1D,V[Pa\x1CVV[a\x1CUa\x1D\xACV[[PPV[_\x81\x90P\x91\x90PV[_\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x03a\x1C\xBEW\x80`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1C\xB5\x91\x90a(\x10V[`@Q\x80\x91\x03\x90\xFD[\x80a\x1C\xEA\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC_\x1Ba\x1CZV[_\x01_a\x01\0\n\x81T\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UPPV[``_\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa\x1DU\x91\x90a)\xD6V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x1D\x8DW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x1D\x92V[``\x91P[P\x91P\x91Pa\x1D\xA2\x85\x83\x83a\x1D\xE8V[\x92PPP\x92\x91PPV[_4\x11\x15a\x1D\xE6W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82a\x1D\xFDWa\x1D\xF8\x82a\x1EuV[a\x1EmV[_\x82Q\x14\x80\x15a\x1E#WP_\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;\x14[\x15a\x1EeW\x83`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x1E\\\x91\x90a(\x10V[`@Q\x80\x91\x03\x90\xFD[\x81\x90Pa\x1EnV[[\x93\x92PPPV[_\x81Q\x11\x15a\x1E\x87W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\xD6\xBD\xA2u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_`@Q\x90P\x90V[_\x80\xFD[_\x80\xFD[_\x81\x90P\x91\x90PV[a\x1E\xDC\x81a\x1E\xCAV[\x81\x14a\x1E\xE6W_\x80\xFD[PV[_\x815\x90Pa\x1E\xF7\x81a\x1E\xD3V[\x92\x91PPV[_` \x82\x84\x03\x12\x15a\x1F\x12Wa\x1F\x11a\x1E\xC2V[[_a\x1F\x1F\x84\x82\x85\x01a\x1E\xE9V[\x91PP\x92\x91PPV[_\x81\x15\x15\x90P\x91\x90PV[a\x1F<\x81a\x1F(V[\x82RPPV[_` \x82\x01\x90Pa\x1FU_\x83\x01\x84a\x1F3V[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_[\x83\x81\x10\x15a\x1F\x92W\x80\x82\x01Q\x81\x84\x01R` \x81\x01\x90Pa\x1FwV[_\x84\x84\x01RPPPPV[_`\x1F\x19`\x1F\x83\x01\x16\x90P\x91\x90PV[_a\x1F\xB7\x82a\x1F[V[a\x1F\xC1\x81\x85a\x1FeV[\x93Pa\x1F\xD1\x81\x85` \x86\x01a\x1FuV[a\x1F\xDA\x81a\x1F\x9DV[\x84\x01\x91PP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra\x1F\xFD\x81\x84a\x1F\xADV[\x90P\x92\x91PPV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[_a .\x82a \x05V[\x90P\x91\x90PV[a >\x81a $V[\x81\x14a HW_\x80\xFD[PV[_\x815\x90Pa Y\x81a 5V[\x92\x91PPV[_\x80\xFD[_\x80\xFD[_\x80\xFD[_\x80\x83`\x1F\x84\x01\x12a \x80Wa \x7Fa _V[[\x825\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a \x9DWa \x9Ca cV[[` \x83\x01\x91P\x83`\x01\x82\x02\x83\x01\x11\x15a \xB9Wa \xB8a gV[[\x92P\x92\x90PV[_\x80_\x80``\x85\x87\x03\x12\x15a \xD8Wa \xD7a\x1E\xC2V[[_a \xE5\x87\x82\x88\x01a\x1E\xE9V[\x94PP` a \xF6\x87\x82\x88\x01a KV[\x93PP`@\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!\x17Wa!\x16a\x1E\xC6V[[a!#\x87\x82\x88\x01a kV[\x92P\x92PP\x92\x95\x91\x94P\x92PV[_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[a!k\x82a\x1F\x9DV[\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a!\x8AWa!\x89a!5V[[\x80`@RPPPV[_a!\x9Ca\x1E\xB9V[\x90Pa!\xA8\x82\x82a!bV[\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a!\xC7Wa!\xC6a!5V[[a!\xD0\x82a\x1F\x9DV[\x90P` \x81\x01\x90P\x91\x90PV[\x82\x81\x837_\x83\x83\x01RPPPV[_a!\xFDa!\xF8\x84a!\xADV[a!\x93V[\x90P\x82\x81R` \x81\x01\x84\x84\x84\x01\x11\x15a\"\x19Wa\"\x18a!1V[[a\"$\x84\x82\x85a!\xDDV[P\x93\x92PPPV[_\x82`\x1F\x83\x01\x12a\"@Wa\"?a _V[[\x815a\"P\x84\x82` \x86\x01a!\xEBV[\x91PP\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a\"oWa\"na\x1E\xC2V[[_a\"|\x85\x82\x86\x01a KV[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\"\x9DWa\"\x9Ca\x1E\xC6V[[a\"\xA9\x85\x82\x86\x01a\",V[\x91PP\x92P\x92\x90PV[a\"\xBC\x81a\x1E\xCAV[\x82RPPV[_` \x82\x01\x90Pa\"\xD5_\x83\x01\x84a\"\xB3V[\x92\x91PPV[_\x81Q\x90P\x91\x90PV[_\x82\x82R` \x82\x01\x90P\x92\x91PPV[_\x81\x90P` \x82\x01\x90P\x91\x90PV[a#\r\x81a $V[\x82RPPV[_a#\x1E\x83\x83a#\x04V[` \x83\x01\x90P\x92\x91PPV[_` \x82\x01\x90P\x91\x90PV[_a#@\x82a\"\xDBV[a#J\x81\x85a\"\xE5V[\x93Pa#U\x83a\"\xF5V[\x80_[\x83\x81\x10\x15a#\x85W\x81Qa#l\x88\x82a#\x13V[\x97Pa#w\x83a#*V[\x92PP`\x01\x81\x01\x90Pa#XV[P\x85\x93PPPP\x92\x91PPV[_` \x82\x01\x90P\x81\x81\x03_\x83\x01Ra#\xAA\x81\x84a#6V[\x90P\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a#\xC8Wa#\xC7a\x1E\xC2V[[_a#\xD5\x85\x82\x86\x01a\x1E\xE9V[\x92PP` a#\xE6\x85\x82\x86\x01a KV[\x91PP\x92P\x92\x90PV[_\x80_`@\x84\x86\x03\x12\x15a$\x07Wa$\x06a\x1E\xC2V[[_a$\x14\x86\x82\x87\x01a\x1E\xE9V[\x93PP` \x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a$5Wa$4a\x1E\xC6V[[a$A\x86\x82\x87\x01a kV[\x92P\x92PP\x92P\x92P\x92V[_\x81\x90P\x92\x91PPV[_a$a\x82a\x1F[V[a$k\x81\x85a$MV[\x93Pa${\x81\x85` \x86\x01a\x1FuV[\x80\x84\x01\x91PP\x92\x91PPV[\x7F v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a$\xBB`\x02\x83a$MV[\x91Pa$\xC6\x82a$\x87V[`\x02\x82\x01\x90P\x91\x90PV[\x7F.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\x82\x01RPV[_a%\x05`\x01\x83a$MV[\x91Pa%\x10\x82a$\xD1V[`\x01\x82\x01\x90P\x91\x90PV[_a%&\x82\x87a$WV[\x91Pa%1\x82a$\xAFV[\x91Pa%=\x82\x86a$WV[\x91Pa%H\x82a$\xF9V[\x91Pa%T\x82\x85a$WV[\x91Pa%_\x82a$\xF9V[\x91Pa%k\x82\x84a$WV[\x91P\x81\x90P\x95\x94PPPPPV[_\x81\x90P\x91\x90PV[a%\x8B\x81a%yV[\x82RPPV[_` \x82\x01\x90Pa%\xA4_\x83\x01\x84a%\x82V[\x92\x91PPV[a%\xB3\x81a\x1F(V[\x81\x14a%\xBDW_\x80\xFD[PV[_\x81Q\x90Pa%\xCE\x81a%\xAAV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a%\xE9Wa%\xE8a\x1E\xC2V[[_a%\xF6\x84\x82\x85\x01a%\xC0V[\x91PP\x92\x91PPV[a&\x08\x81a%yV[\x81\x14a&\x12W_\x80\xFD[PV[_\x81Q\x90Pa&#\x81a%\xFFV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a&>Wa&=a\x1E\xC2V[[_a&K\x84\x82\x85\x01a&\x15V[\x91PP\x92\x91PPV[`\x08\x81\x10a&`W_\x80\xFD[PV[_\x81Q\x90Pa&q\x81a&TV[\x92\x91PPV[_` \x82\x84\x03\x12\x15a&\x8CWa&\x8Ba\x1E\xC2V[[_a&\x99\x84\x82\x85\x01a&cV[\x91PP\x92\x91PPV[a&\xAB\x81a $V[\x82RPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[`\x08\x81\x10a&\xEFWa&\xEEa&\xB1V[[PV[_\x81\x90Pa&\xFF\x82a&\xDEV[\x91\x90PV[_a'\x0E\x82a&\xF2V[\x90P\x91\x90PV[a'\x1E\x81a'\x04V[\x82RPPV[_`\x80\x82\x01\x90Pa'7_\x83\x01\x87a\"\xB3V[a'D` \x83\x01\x86a&\xA2V[a'Q`@\x83\x01\x85a%\x82V[a'^``\x83\x01\x84a'\x15V[\x95\x94PPPPPV[_``\x82\x01\x90Pa'z_\x83\x01\x86a\"\xB3V[a'\x87` \x83\x01\x85a&\xA2V[a'\x94`@\x83\x01\x84a&\xA2V[\x94\x93PPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[_a'\xD3\x82a%yV[\x91P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x03a(\x05Wa(\x04a'\x9CV[[`\x01\x82\x01\x90P\x91\x90PV[_` \x82\x01\x90Pa(#_\x83\x01\x84a&\xA2V[\x92\x91PPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x90P\x91\x90PV[a(E\x81a()V[\x82RPPV[_` \x82\x01\x90Pa(^_\x83\x01\x84a( for u8 { + #[inline] + fn stv_to_tokens( + &self, + ) -> as alloy_sol_types::SolType>::Token<'_> { + alloy_sol_types::private::SolTypeValue::< + alloy::sol_types::sol_data::Uint<8>, + >::stv_to_tokens(self) + } + #[inline] + fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { + as alloy_sol_types::SolType>::tokenize(self) + .0 + } + #[inline] + fn stv_abi_encode_packed_to( + &self, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::SolType>::abi_encode_packed_to(self, out) + } + #[inline] + fn stv_abi_packed_encoded_size(&self) -> usize { + as alloy_sol_types::SolType>::abi_encoded_size(self) + } + } + #[automatically_derived] + impl ContextStatus { + /// The Solidity type name. + pub const NAME: &'static str = stringify!(@ name); + /// Convert from the underlying value type. + #[inline] + pub const fn from_underlying(value: u8) -> Self { + Self(value) + } + /// Return the underlying value. + #[inline] + pub const fn into_underlying(self) -> u8 { + self.0 + } + /// Return the single encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode(&self) -> alloy_sol_types::private::Vec { + ::abi_encode(&self.0) + } + /// Return the packed encoding of this value, delegating to the + /// underlying type. + #[inline] + pub fn abi_encode_packed(&self) -> alloy_sol_types::private::Vec { + ::abi_encode_packed(&self.0) + } + } + #[automatically_derived] + impl From for ContextStatus { + fn from(value: u8) -> Self { + Self::from_underlying(value) + } + } + #[automatically_derived] + impl From for u8 { + fn from(value: ContextStatus) -> Self { + value.into_underlying() + } + } + #[automatically_derived] + impl alloy_sol_types::SolType for ContextStatus { + type RustType = u8; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SOL_NAME: &'static str = Self::NAME; + const ENCODED_SIZE: Option = as alloy_sol_types::SolType>::ENCODED_SIZE; + const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; + #[inline] + fn valid_token(token: &Self::Token<'_>) -> bool { + Self::type_check(token).is_ok() + } + #[inline] + fn type_check(token: &Self::Token<'_>) -> alloy_sol_types::Result<()> { + as alloy_sol_types::SolType>::type_check(token) + } + #[inline] + fn detokenize(token: Self::Token<'_>) -> Self::RustType { + as alloy_sol_types::SolType>::detokenize(token) + } + } + #[automatically_derived] + impl alloy_sol_types::EventTopic for ContextStatus { + #[inline] + fn topic_preimage_length(rust: &Self::RustType) -> usize { + as alloy_sol_types::EventTopic>::topic_preimage_length(rust) + } + #[inline] + fn encode_topic_preimage( + rust: &Self::RustType, + out: &mut alloy_sol_types::private::Vec, + ) { + as alloy_sol_types::EventTopic>::encode_topic_preimage(rust, out) + } + #[inline] + fn encode_topic( + rust: &Self::RustType, + ) -> alloy_sol_types::abi::token::WordToken { + as alloy_sol_types::EventTopic>::encode_topic(rust) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Custom error with signature `AddressEmptyCode(address)` and selector `0x9996b315`. ```solidity error AddressEmptyCode(address target); @@ -1260,26 +1467,241 @@ error HostChainNotRegistered(uint256 chainId); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: HostChainNotRegistered) -> Self { - (value.chainId,) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: HostChainNotRegistered) -> Self { + (value.chainId,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for HostChainNotRegistered { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { chainId: tuple.0 } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for HostChainNotRegistered { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "HostChainNotRegistered(uint256)"; + const SELECTOR: [u8; 4] = [182u8, 103u8, 156u8, 59u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.chainId), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InvalidCoprocessorContextAllowAccount(bytes32,address,uint256,uint8)` and selector `0x13c95d8d`. +```solidity +error InvalidCoprocessorContextAllowAccount(bytes32 ctHandle, address accountAddress, uint256 contextId, ContextStatus contextStatus); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidCoprocessorContextAllowAccount { + #[allow(missing_docs)] + pub ctHandle: alloy::sol_types::private::FixedBytes<32>, + #[allow(missing_docs)] + pub accountAddress: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub contextStatus: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::FixedBytes<32>, + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<256>, + ContextStatus, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::FixedBytes<32>, + alloy::sol_types::private::Address, + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: InvalidCoprocessorContextAllowAccount) -> Self { + ( + value.ctHandle, + value.accountAddress, + value.contextId, + value.contextStatus, + ) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for InvalidCoprocessorContextAllowAccount { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + ctHandle: tuple.0, + accountAddress: tuple.1, + contextId: tuple.2, + contextStatus: tuple.3, + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InvalidCoprocessorContextAllowAccount { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InvalidCoprocessorContextAllowAccount(bytes32,address,uint256,uint8)"; + const SELECTOR: [u8; 4] = [19u8, 201u8, 93u8, 141u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize(&self.ctHandle), + ::tokenize( + &self.accountAddress, + ), + as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.contextStatus, + ), + ) + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InvalidCoprocessorContextAllowPublicDecrypt(bytes32,uint256,uint8)` and selector `0xaa7a2a97`. +```solidity +error InvalidCoprocessorContextAllowPublicDecrypt(bytes32 ctHandle, uint256 contextId, ContextStatus contextStatus); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InvalidCoprocessorContextAllowPublicDecrypt { + #[allow(missing_docs)] + pub ctHandle: alloy::sol_types::private::FixedBytes<32>, + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] + pub contextStatus: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::FixedBytes<32>, + alloy::sol_types::sol_data::Uint<256>, + ContextStatus, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::FixedBytes<32>, + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: InvalidCoprocessorContextAllowPublicDecrypt) -> Self { + (value.ctHandle, value.contextId, value.contextStatus) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for HostChainNotRegistered { + impl ::core::convert::From> + for InvalidCoprocessorContextAllowPublicDecrypt { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { chainId: tuple.0 } + Self { + ctHandle: tuple.0, + contextId: tuple.1, + contextStatus: tuple.2, + } } } #[automatically_derived] - impl alloy_sol_types::SolError for HostChainNotRegistered { + impl alloy_sol_types::SolError for InvalidCoprocessorContextAllowPublicDecrypt { type Parameters<'a> = UnderlyingSolTuple<'a>; type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "HostChainNotRegistered(uint256)"; - const SELECTOR: [u8; 4] = [182u8, 103u8, 156u8, 59u8]; + const SIGNATURE: &'static str = "InvalidCoprocessorContextAllowPublicDecrypt(bytes32,uint256,uint8)"; + const SELECTOR: [u8; 4] = [170u8, 122u8, 42u8, 151u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -1289,9 +1711,15 @@ error HostChainNotRegistered(uint256 chainId); #[inline] fn tokenize(&self) -> Self::Token<'_> { ( + as alloy_sol_types::SolType>::tokenize(&self.ctHandle), as alloy_sol_types::SolType>::tokenize(&self.chainId), + > as alloy_sol_types::SolType>::tokenize(&self.contextId), + ::tokenize( + &self.contextStatus, + ), ) } #[inline] @@ -1378,13 +1806,15 @@ error InvalidInitialization(); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `NotCoprocessorSigner(address)` and selector `0x26cd75dc`. + /**Custom error with signature `NotCoprocessorSignerFromContext(uint256,address)` and selector `0x554f8c5f`. ```solidity -error NotCoprocessorSigner(address signerAddress); +error NotCoprocessorSignerFromContext(uint256 contextId, address signerAddress); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct NotCoprocessorSigner { + pub struct NotCoprocessorSignerFromContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, #[allow(missing_docs)] pub signerAddress: alloy::sol_types::private::Address, } @@ -1397,9 +1827,15 @@ error NotCoprocessorSigner(address signerAddress); const _: () = { use alloy::sol_types as alloy_sol_types; #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -1413,26 +1849,31 @@ error NotCoprocessorSigner(address signerAddress); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: NotCoprocessorSigner) -> Self { - (value.signerAddress,) + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NotCoprocessorSignerFromContext) -> Self { + (value.contextId, value.signerAddress) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for NotCoprocessorSigner { + impl ::core::convert::From> + for NotCoprocessorSignerFromContext { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { signerAddress: tuple.0 } + Self { + contextId: tuple.0, + signerAddress: tuple.1, + } } } #[automatically_derived] - impl alloy_sol_types::SolError for NotCoprocessorSigner { + impl alloy_sol_types::SolError for NotCoprocessorSignerFromContext { type Parameters<'a> = UnderlyingSolTuple<'a>; type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "NotCoprocessorSigner(address)"; - const SELECTOR: [u8; 4] = [38u8, 205u8, 117u8, 220u8]; + const SIGNATURE: &'static str = "NotCoprocessorSignerFromContext(uint256,address)"; + const SELECTOR: [u8; 4] = [85u8, 79u8, 140u8, 95u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -1442,6 +1883,9 @@ error NotCoprocessorSigner(address signerAddress); #[inline] fn tokenize(&self) -> Self::Token<'_> { ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), ::tokenize( &self.signerAddress, ), @@ -1458,13 +1902,15 @@ error NotCoprocessorSigner(address signerAddress); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `NotCoprocessorTxSender(address)` and selector `0x52d725f5`. + /**Custom error with signature `NotCoprocessorTxSenderFromContext(uint256,address)` and selector `0x29a993c1`. ```solidity -error NotCoprocessorTxSender(address txSenderAddress); +error NotCoprocessorTxSenderFromContext(uint256 contextId, address txSenderAddress); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct NotCoprocessorTxSender { + pub struct NotCoprocessorTxSenderFromContext { + #[allow(missing_docs)] + pub contextId: alloy::sol_types::private::primitives::aliases::U256, #[allow(missing_docs)] pub txSenderAddress: alloy::sol_types::private::Address, } @@ -1477,9 +1923,15 @@ error NotCoprocessorTxSender(address txSenderAddress); const _: () = { use alloy::sol_types as alloy_sol_types; #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Address,); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + alloy::sol_types::sol_data::Address, + ); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::Address,); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + alloy::sol_types::private::Address, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion( @@ -1493,26 +1945,31 @@ error NotCoprocessorTxSender(address txSenderAddress); } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: NotCoprocessorTxSender) -> Self { - (value.txSenderAddress,) + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: NotCoprocessorTxSenderFromContext) -> Self { + (value.contextId, value.txSenderAddress) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for NotCoprocessorTxSender { + impl ::core::convert::From> + for NotCoprocessorTxSenderFromContext { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { txSenderAddress: tuple.0 } + Self { + contextId: tuple.0, + txSenderAddress: tuple.1, + } } } #[automatically_derived] - impl alloy_sol_types::SolError for NotCoprocessorTxSender { + impl alloy_sol_types::SolError for NotCoprocessorTxSenderFromContext { type Parameters<'a> = UnderlyingSolTuple<'a>; type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "NotCoprocessorTxSender(address)"; - const SELECTOR: [u8; 4] = [82u8, 215u8, 37u8, 245u8]; + const SIGNATURE: &'static str = "NotCoprocessorTxSenderFromContext(uint256,address)"; + const SELECTOR: [u8; 4] = [41u8, 169u8, 147u8, 193u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -1522,6 +1979,9 @@ error NotCoprocessorTxSender(address txSenderAddress); #[inline] fn tokenize(&self) -> Self::Token<'_> { ( + as alloy_sol_types::SolType>::tokenize(&self.contextId), ::tokenize( &self.txSenderAddress, ), @@ -4307,6 +4767,143 @@ function proxiableUUID() external view returns (bytes32); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `reinitializeV2()` and selector `0xc4115874`. +```solidity +function reinitializeV2() external; +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct reinitializeV2Call; + ///Container type for the return parameters of the [`reinitializeV2()`](reinitializeV2Call) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct reinitializeV2Return {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: reinitializeV2Call) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for reinitializeV2Call { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: reinitializeV2Return) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for reinitializeV2Return { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + impl reinitializeV2Return { + fn _tokenize( + &self, + ) -> ::ReturnToken<'_> { + () + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for reinitializeV2Call { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = reinitializeV2Return; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "reinitializeV2()"; + const SELECTOR: [u8; 4] = [196u8, 17u8, 88u8, 116u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + reinitializeV2Return::_tokenize(ret) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(Into::into) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Into::into) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286`. ```solidity function upgradeToAndCall(address newImplementation, bytes memory data) external payable; @@ -4495,6 +5092,8 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external #[allow(missing_docs)] proxiableUUID(proxiableUUIDCall), #[allow(missing_docs)] + reinitializeV2(reinitializeV2Call), + #[allow(missing_docs)] upgradeToAndCall(upgradeToAndCallCall), } #[automatically_derived] @@ -4515,6 +5114,7 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external [151u8, 196u8, 154u8, 64u8], [173u8, 60u8, 177u8, 204u8], [174u8, 149u8, 49u8, 134u8], + [196u8, 17u8, 88u8, 116u8], [198u8, 82u8, 143u8, 105u8], [217u8, 7u8, 36u8, 181u8], ]; @@ -4523,7 +5123,7 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external impl alloy_sol_types::SolInterface for MultichainACLCalls { const NAME: &'static str = "MultichainACLCalls"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 11usize; + const COUNT: usize = 12usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -4557,6 +5157,9 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external Self::proxiableUUID(_) => { ::SELECTOR } + Self::reinitializeV2(_) => { + ::SELECTOR + } Self::upgradeToAndCall(_) => { ::SELECTOR } @@ -4680,6 +5283,17 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } getAllowAccountConsensusTxSenders }, + { + fn reinitializeV2( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(MultichainACLCalls::reinitializeV2) + } + reinitializeV2 + }, { fn isAccountAllowed( data: &[u8], @@ -4823,6 +5437,17 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } getAllowAccountConsensusTxSenders }, + { + fn reinitializeV2( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(MultichainACLCalls::reinitializeV2) + } + reinitializeV2 + }, { fn isAccountAllowed( data: &[u8], @@ -4907,6 +5532,11 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external inner, ) } + Self::reinitializeV2(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::upgradeToAndCall(inner) => { ::abi_encoded_size( inner, @@ -4977,6 +5607,12 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external out, ) } + Self::reinitializeV2(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::upgradeToAndCall(inner) => { ::abi_encode_raw( inner, @@ -5009,11 +5645,17 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external #[allow(missing_docs)] HostChainNotRegistered(HostChainNotRegistered), #[allow(missing_docs)] + InvalidCoprocessorContextAllowAccount(InvalidCoprocessorContextAllowAccount), + #[allow(missing_docs)] + InvalidCoprocessorContextAllowPublicDecrypt( + InvalidCoprocessorContextAllowPublicDecrypt, + ), + #[allow(missing_docs)] InvalidInitialization(InvalidInitialization), #[allow(missing_docs)] - NotCoprocessorSigner(NotCoprocessorSigner), + NotCoprocessorSignerFromContext(NotCoprocessorSignerFromContext), #[allow(missing_docs)] - NotCoprocessorTxSender(NotCoprocessorTxSender), + NotCoprocessorTxSenderFromContext(NotCoprocessorTxSenderFromContext), #[allow(missing_docs)] NotCustodianSigner(NotCustodianSigner), #[allow(missing_docs)] @@ -5043,11 +5685,12 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external /// Prefer using `SolInterface` methods instead. pub const SELECTORS: &'static [[u8; 4usize]] = &[ [14u8, 86u8, 207u8, 61u8], - [38u8, 205u8, 117u8, 220u8], + [19u8, 201u8, 93u8, 141u8], + [41u8, 169u8, 147u8, 193u8], [42u8, 124u8, 110u8, 246u8], [57u8, 22u8, 114u8, 167u8], [76u8, 156u8, 140u8, 227u8], - [82u8, 215u8, 37u8, 245u8], + [85u8, 79u8, 140u8, 95u8], [87u8, 207u8, 162u8, 23u8], [102u8, 55u8, 227u8, 45u8], [111u8, 79u8, 115u8, 31u8], @@ -5055,6 +5698,7 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external [166u8, 240u8, 77u8, 38u8], [167u8, 219u8, 39u8, 81u8], [170u8, 29u8, 73u8, 164u8], + [170u8, 122u8, 42u8, 151u8], [174u8, 232u8, 99u8, 35u8], [179u8, 152u8, 151u8, 159u8], [182u8, 103u8, 156u8, 59u8], @@ -5069,7 +5713,7 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external impl alloy_sol_types::SolInterface for MultichainACLErrors { const NAME: &'static str = "MultichainACLErrors"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 21usize; + const COUNT: usize = 23usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -5100,14 +5744,20 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external Self::HostChainNotRegistered(_) => { ::SELECTOR } + Self::InvalidCoprocessorContextAllowAccount(_) => { + ::SELECTOR + } + Self::InvalidCoprocessorContextAllowPublicDecrypt(_) => { + ::SELECTOR + } Self::InvalidInitialization(_) => { ::SELECTOR } - Self::NotCoprocessorSigner(_) => { - ::SELECTOR + Self::NotCoprocessorSignerFromContext(_) => { + ::SELECTOR } - Self::NotCoprocessorTxSender(_) => { - ::SELECTOR + Self::NotCoprocessorTxSenderFromContext(_) => { + ::SELECTOR } Self::NotCustodianSigner(_) => { ::SELECTOR @@ -5167,15 +5817,28 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external NotGatewayOwner }, { - fn NotCoprocessorSigner( + fn InvalidCoprocessorContextAllowAccount( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + MultichainACLErrors::InvalidCoprocessorContextAllowAccount, + ) + } + InvalidCoprocessorContextAllowAccount + }, + { + fn NotCoprocessorTxSenderFromContext( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw( + ::abi_decode_raw( data, ) - .map(MultichainACLErrors::NotCoprocessorSigner) + .map(MultichainACLErrors::NotCoprocessorTxSenderFromContext) } - NotCoprocessorSigner + NotCoprocessorTxSenderFromContext }, { fn NotKmsSigner( @@ -5209,15 +5872,15 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external ERC1967InvalidImplementation }, { - fn NotCoprocessorTxSender( + fn NotCoprocessorSignerFromContext( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw( + ::abi_decode_raw( data, ) - .map(MultichainACLErrors::NotCoprocessorTxSender) + .map(MultichainACLErrors::NotCoprocessorSignerFromContext) } - NotCoprocessorTxSender + NotCoprocessorSignerFromContext }, { fn EmptyContractAddresses( @@ -5298,6 +5961,19 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } UUPSUnsupportedProxiableUUID }, + { + fn InvalidCoprocessorContextAllowPublicDecrypt( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map( + MultichainACLErrors::InvalidCoprocessorContextAllowPublicDecrypt, + ) + } + InvalidCoprocessorContextAllowPublicDecrypt + }, { fn NotKmsTxSender( data: &[u8], @@ -5416,15 +6092,28 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external NotGatewayOwner }, { - fn NotCoprocessorSigner( + fn InvalidCoprocessorContextAllowAccount( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + MultichainACLErrors::InvalidCoprocessorContextAllowAccount, + ) + } + InvalidCoprocessorContextAllowAccount + }, + { + fn NotCoprocessorTxSenderFromContext( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( + ::abi_decode_raw_validate( data, ) - .map(MultichainACLErrors::NotCoprocessorSigner) + .map(MultichainACLErrors::NotCoprocessorTxSenderFromContext) } - NotCoprocessorSigner + NotCoprocessorTxSenderFromContext }, { fn NotKmsSigner( @@ -5460,15 +6149,15 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external ERC1967InvalidImplementation }, { - fn NotCoprocessorTxSender( + fn NotCoprocessorSignerFromContext( data: &[u8], ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( + ::abi_decode_raw_validate( data, ) - .map(MultichainACLErrors::NotCoprocessorTxSender) + .map(MultichainACLErrors::NotCoprocessorSignerFromContext) } - NotCoprocessorTxSender + NotCoprocessorSignerFromContext }, { fn EmptyContractAddresses( @@ -5549,6 +6238,19 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external } UUPSUnsupportedProxiableUUID }, + { + fn InvalidCoprocessorContextAllowPublicDecrypt( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map( + MultichainACLErrors::InvalidCoprocessorContextAllowPublicDecrypt, + ) + } + InvalidCoprocessorContextAllowPublicDecrypt + }, { fn NotKmsTxSender( data: &[u8], @@ -5694,18 +6396,28 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external inner, ) } + Self::InvalidCoprocessorContextAllowAccount(inner) => { + ::abi_encoded_size( + inner, + ) + } + Self::InvalidCoprocessorContextAllowPublicDecrypt(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::InvalidInitialization(inner) => { ::abi_encoded_size( inner, ) } - Self::NotCoprocessorSigner(inner) => { - ::abi_encoded_size( + Self::NotCoprocessorSignerFromContext(inner) => { + ::abi_encoded_size( inner, ) } - Self::NotCoprocessorTxSender(inner) => { - ::abi_encoded_size( + Self::NotCoprocessorTxSenderFromContext(inner) => { + ::abi_encoded_size( inner, ) } @@ -5808,20 +6520,32 @@ function upgradeToAndCall(address newImplementation, bytes memory data) external out, ) } + Self::InvalidCoprocessorContextAllowAccount(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } + Self::InvalidCoprocessorContextAllowPublicDecrypt(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::InvalidInitialization(inner) => { ::abi_encode_raw( inner, out, ) } - Self::NotCoprocessorSigner(inner) => { - ::abi_encode_raw( + Self::NotCoprocessorSignerFromContext(inner) => { + ::abi_encode_raw( inner, out, ) } - Self::NotCoprocessorTxSender(inner) => { - ::abi_encode_raw( + Self::NotCoprocessorTxSenderFromContext(inner) => { + ::abi_encode_raw( inner, out, ) @@ -6279,6 +7003,12 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ ) -> alloy_contract::SolCallBuilder<&P, proxiableUUIDCall, N> { self.call_builder(&proxiableUUIDCall) } + ///Creates a new call builder for the [`reinitializeV2`] function. + pub fn reinitializeV2( + &self, + ) -> alloy_contract::SolCallBuilder<&P, reinitializeV2Call, N> { + self.call_builder(&reinitializeV2Call) + } ///Creates a new call builder for the [`upgradeToAndCall`] function. pub fn upgradeToAndCall( &self, diff --git a/gateway-contracts/scripts/mock_contracts_cli.js b/gateway-contracts/scripts/mock_contracts_cli.js index fe9155835a..b991590a00 100644 --- a/gateway-contracts/scripts/mock_contracts_cli.js +++ b/gateway-contracts/scripts/mock_contracts_cli.js @@ -10,6 +10,7 @@ const CONTRACTS_DIR = path.join(__dirname, "../contracts"); const INTERFACES_DIR = path.join(CONTRACTS_DIR, "/interfaces"); const MOCKS_DIR = path.join(CONTRACTS_DIR, "/mocks"); const SHARED_STRUCTS_FILE = "shared/Structs.sol"; +const SHARED_ENUMS_FILE = "shared/Enums.sol"; const RequestIdCounters = { decryptionId: { @@ -190,6 +191,7 @@ function createMockContract(contractContent, interfaceContent, outputPath) { // Parse shared files and extract their definitions const sharedStructsDefinitions = parseSharedFile(path.join(CONTRACTS_DIR, SHARED_STRUCTS_FILE)); + const sharedEnumsDefinitions = parseSharedFile(path.join(CONTRACTS_DIR, SHARED_ENUMS_FILE)); // Extract EventDefinitions from the interface definition const eventDefinitions = interfaceDefinition.subNodes.filter((node) => node.type === "EventDefinition"); @@ -232,7 +234,7 @@ function createMockContract(contractContent, interfaceContent, outputPath) { const mockFunctions = generateMockFunctions( functionDefinitions, eventDefinitions, - structDefinitions.concat(sharedStructsDefinitions), + structDefinitions.concat(sharedStructsDefinitions).concat(sharedEnumsDefinitions), ); const spdxLine = "// SPDX-License-Identifier: BSD-3-Clause-Clear"; @@ -243,9 +245,13 @@ function createMockContract(contractContent, interfaceContent, outputPath) { const importsSharedStructs = parsedInterface.children.some( (child) => child.type === "ImportDirective" && child.path.includes(SHARED_STRUCTS_FILE), ); + const importsSharedEnums = parsedInterface.children.some( + (child) => child.type === "ImportDirective" && child.path.includes(SHARED_ENUMS_FILE), + ); let imports = []; if (importsSharedStructs) imports.push(`import "../${SHARED_STRUCTS_FILE}";`); + if (importsSharedEnums) imports.push(`import "../${SHARED_ENUMS_FILE}";`); const importsLines = imports.join("\n"); // Build the mock contract @@ -420,11 +426,12 @@ function generateMockFunctions(functionDefinitions, eventDefinitions, structDefi // Check first if the parameter is part of a defined request ID counter mapping, e.g. decryptionId // which same event parameter name is used from either PublicDecryptionRequest or UserDecryptionRequest. const requestIdCounter = RequestIdCounters[parameterName]; + const functionIdCounters = findCounterOperators(functionDef.body.statements); if (requestIdCounter) { - const functionIdCounters = findCounterOperators(functionDef.body.statements); return functionIdCounters.some((counter) => requestIdCounter[assignment.idVar] === counter); + // Else, only add the ID if it is part of the current function } else { - return parameterName == assignment.idVar; + return parameterName == assignment.idVar && functionIdCounters.includes(assignment.counterVar); } }); @@ -505,7 +512,26 @@ function findEmitStatements(statements) { case "IfStatement": // Concat inner Emit statements in the If's statements - emitStatements.push(...findEmitStatements(statement.trueBody?.statements || [])); + // If it's a Block with statements + if (statement.trueBody.statements) { + emitStatements.push(...findEmitStatements(statement.trueBody.statements)); + + // Else, it can be another statement itself (like another IfStatement) + } else if (statement.trueBody.type) { + emitStatements.push(...findEmitStatements([statement.trueBody])); + } + + // Handle the false body (else/else if block) + if (statement.falseBody) { + // If it's a Block with statements + if (statement.falseBody.statements) { + emitStatements.push(...findEmitStatements(statement.falseBody.statements)); + + // Else, it can be another statement itself (like another IfStatement) + } else if (statement.falseBody.type) { + emitStatements.push(...findEmitStatements([statement.falseBody])); + } + } break; case "Block": diff --git a/gateway-contracts/selectors.txt b/gateway-contracts/selectors.txt index 01d5e70801..bb2957acfd 100644 --- a/gateway-contracts/selectors.txt +++ b/gateway-contracts/selectors.txt @@ -1,384 +1,525 @@ CiphertextCommits -╭----------+----------------------------------------------------------+--------------------------------------------------------------------╮ -| Type | Signature | Selector | -+==========================================================================================================================================+ -| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | addCiphertextMaterial(bytes32,uint256,bytes32,bytes32) | 0x90f30354 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getAddCiphertextMaterialConsensusTxSenders(bytes32) | 0xe6f6ab94 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCiphertextMaterials(bytes32[]) | 0x55c4d997 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getSnsCiphertextMaterials(bytes32[]) | 0xa14f8971 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getVersion() | 0x0d8e6e2c | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | initializeFromEmptyProxy() | 0x39f73810 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCiphertextMaterialAdded(bytes32) | 0x2ddc9a6f | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | proxiableUUID() | 0x52d1902d | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Event | AddCiphertextMaterial(bytes32,bytes32,bytes32,address[]) | 0xcb89ccb347018d7f282bb4c048e135e19bc1d13660fa0f2850e10518422536de | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | AddressEmptyCode(address) | 0x9996b315 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | CiphertextMaterialNotFound(bytes32) | 0x0666cbdf | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | CoprocessorAlreadyAdded(bytes32,address) | 0x1dd7250c | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967NonPayable() | 0xb398979f | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | FailedCall() | 0xd6bda275 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | HostChainNotRegistered(uint256) | 0xb6679c3b | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidInitialization() | 0xf92ee8a9 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorSigner(address) | 0x26cd75dc | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorTxSender(address) | 0x52d725f5 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCustodianSigner(address) | 0x391672a7 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCustodianTxSender(address) | 0xf924a0cf | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotGatewayOwner(address) | 0x0e56cf3d | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializing() | 0xd7e6bcf8 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotKmsSigner(address) | 0x2a7c6ef6 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotKmsTxSender(address) | 0xaee86323 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | -╰----------+----------------------------------------------------------+--------------------------------------------------------------------╯ +╭----------+---------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++===============================================================================================================================================+ +| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | addCiphertextMaterial(bytes32,uint256,bytes32,bytes32) | 0x90f30354 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCiphertextMaterials(bytes32[]) | 0x55c4d997 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getConsensusCoprocessorTxSenders(bytes32) | 0xe4bb288c | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getSnsCiphertextMaterials(bytes32[]) | 0xa14f8971 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | initializeFromEmptyProxy() | 0x39f73810 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCiphertextMaterialAdded(bytes32) | 0x2ddc9a6f | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | proxiableUUID() | 0x52d1902d | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | reinitializeV2() | 0xc4115874 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Event | AddCiphertextMaterial(bytes32,bytes32,bytes32,uint256) | 0xc3113162bedb887e086a25724f966348968a75efd447615ebfd0f715939ad964 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | AddressEmptyCode(address) | 0x9996b315 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CiphertextMaterialNotFound(bytes32) | 0x0666cbdf | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorAlreadyAdded(bytes32,address) | 0x1dd7250c | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967NonPayable() | 0xb398979f | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | FailedCall() | 0xd6bda275 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | HostChainNotRegistered(uint256) | 0xb6679c3b | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextAddCiphertext(bytes32,uint256,uint8) | 0x96346431 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidInitialization() | 0xf92ee8a9 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCoprocessorSignerFromContext(uint256,address) | 0x554f8c5f | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCoprocessorTxSenderFromContext(uint256,address) | 0x29a993c1 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianSigner(address) | 0x391672a7 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianTxSender(address) | 0xf924a0cf | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotGatewayOwner(address) | 0x0e56cf3d | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializing() | 0xd7e6bcf8 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsSigner(address) | 0x2a7c6ef6 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsTxSender(address) | 0xaee86323 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | +╰----------+---------------------------------------------------------------+--------------------------------------------------------------------╯ + + +CoprocessorContexts + +╭----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++==============================================================================================================================================================================================================================================+ +| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | addCoprocessorContext(bytes,(string,address,address,string)[],(uint256,uint256)) | 0xa1364d79 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | forceUpdateCoprocessorContextToStatus(uint256,uint8) | 0xcac6a5a8 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getActiveCoprocessorContext() | 0xfed9716b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getActiveCoprocessorContextId() | 0x991dc36d | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessor(uint256,address) | 0x820a91f8 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorActivationBlockTimestamp(uint256) | 0xb3f5403a | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorContextStatus(uint256) | 0x888b99e0 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorDeactivatedBlockTimestamp(uint256) | 0xa9b4d071 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorMajorityThreshold(uint256) | 0xf88174ea | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorSigners(uint256) | 0x41618fe9 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorTxSenders(uint256) | 0x049f25ef | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getPreActivationCoprocessorContextId() | 0xbe91187b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getSuspendedCoprocessorContextId() | 0x086e4e1c | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | initializeFromEmptyProxy(bytes,(string,address,address,string)[]) | 0xecfb0b94 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCoprocessorContextOperating(uint256) | 0xcd8e993c | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCoprocessorSigner(uint256,address) | 0xcdbb5a82 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCoprocessorTxSender(uint256,address) | 0x8625e876 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | proxiableUUID() | 0x52d1902d | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | refreshCoprocessorContextStatuses() | 0x3a5162e6 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | swapSuspendedCoprocessorContextWithActive(uint256) | 0x86dfc7de | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | ActivateCoprocessorContext(uint256) | 0x6c8c04c9fea337720b7dfadca365e850035114fd081b58d030afbe8b5dc3be71 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | CompromiseCoprocessorContext(uint256) | 0xee7ef83963417125d27430789fc6e94194381e82c3cda68260d0e7cfc31eaf21 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | DeactivateCoprocessorContext(uint256) | 0x1baa08d8de18e8e2287691b1309748010981ebdfd12a173d8574657548a52898 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | DestroyCoprocessorContext(uint256) | 0xf20b299804c9c1d6da3b82414c7aa0a845cdbabae2d90e46e360a379a77b7be5 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | InitializeCoprocessorContexts(bytes,(string,address,address,string)[]) | 0xd474068ecf914caa04868493bcefa56bfb049a54f1612c2726d112e1e60663b9 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | NewCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256)) | 0xbbb104c495886e5daa3efb6b281ec2840c69385af5cbfc1582fcf700de1ecd4b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | PreActivateCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),uint256) | 0x0425f54e602cbcf87fafd6a0b557fa5c4bc4bc6c251686255eb3bd775f452377 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | SuspendCoprocessorContext(uint256,uint256) | 0x3080f2b80dda4748ca2926a641fa5007735058dc5f5ab2594eeca74197a3accc | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ActiveContextOngoing(uint256) | 0x7eea432b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | AddressEmptyCode(address) | 0x9996b315 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextAlreadyExists(uint256) | 0x6653f6d7 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextDoesNotExist(uint256) | 0x61544cfc | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextIsActive(uint256) | 0xcd494e49 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextIsGenerating(uint256) | 0x0ddd14ca | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextNotActive(uint256) | 0x331486b3 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextNotGenerated(uint256) | 0xc0b5ee66 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextNotPreActivatedOrSuspended(uint256) | 0x12b49e3d | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextNotSuspended(uint256) | 0x77bf5846 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorContextNotInitialized(uint256) | 0xabf9e7b0 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorSignerAddressesNotUnique(address,uint256,(string,address,address,string)[]) | 0xc826e1a2 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorTxSenderAddressesNotUnique(address,uint256,(string,address,address,string)[]) | 0x64d52759 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967NonPayable() | 0xb398979f | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyCoprocessors() | 0x8af082ef | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | FailedCall() | 0xd6bda275 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | HostChainNotRegistered(uint256) | 0xb6679c3b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidContextStatusForceUpdate(uint256,uint8) | 0xf0bed68f | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidInitialization() | 0xf92ee8a9 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullContextId() | 0xcb17b7a5 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NoActiveCoprocessorContext() | 0x046593ea | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NoPreActivationCoprocessorContext() | 0xb9e861b2 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NoSuspendedCoprocessorContext() | 0x21fb08f9 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCoprocessorFromContext(uint256,address) | 0xc312e73e | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianSigner(address) | 0x391672a7 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianTxSender(address) | 0xf924a0cf | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotGatewayOwner(address) | 0x0e56cf3d | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializing() | 0xd7e6bcf8 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsSigner(address) | 0x2a7c6ef6 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsTxSender(address) | 0xaee86323 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NullCoprocessorSignerAddress(uint256,(string,address,address,string)[]) | 0x4a6c5974 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NullCoprocessorTxSenderAddress(uint256,(string,address,address,string)[]) | 0x9edb7861 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | PreActivationContextOngoing(uint256) | 0xc470c022 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | SuspendedContextOngoing(uint256) | 0x7022ec41 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | +╰----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ Decryption -╭----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ -| Type | Signature | Selector | -+============================================================================================================================================================================================+ -| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | eip712Domain() | 0x84b0196e | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getDecryptionConsensusTxSenders(uint256) | 0x0900cc69 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getVersion() | 0x0d8e6e2c | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | initializeFromEmptyProxy() | 0x39f73810 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isDecryptionDone(uint256) | 0x58f5b8ab | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isPublicDecryptionReady(bytes32[],bytes) | 0x4014c4cd | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isUserDecryptionReady(address,(bytes32,address)[],bytes) | 0xfbb83259 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | pause() | 0x8456cb59 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | paused() | 0x5c975abb | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | proxiableUUID() | 0x52d1902d | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | publicDecryptionRequest(bytes32[],bytes) | 0xd8998f45 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | publicDecryptionResponse(uint256,bytes,bytes,bytes) | 0x6f8913bc | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | unpause() | 0x3f4ba83a | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | userDecryptionRequest((bytes32,address)[],(uint256,uint256),(uint256,address[]),address,bytes,bytes,bytes) | 0xf1b57adb | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | userDecryptionResponse(uint256,bytes,bytes,bytes) | 0x046f9eb3 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | EIP712DomainChanged() | 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | Paused(address) | 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],bytes) | 0x22db480a39bd72556438aadb4a32a3d2a6638b87c03bbec5fef6997e109587ff | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | PublicDecryptionResponse(uint256,bytes,bytes[],bytes) | 0xd7e58a367a0a6c298e76ad5d240004e327aa1423cbe4bd7ff85d4c715ef8d15f | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | Unpaused(address) | 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],address,bytes,bytes) | 0xf9011bd6ba0da6049c520d70fe5971f17ed7ab795486052544b51019896c596b | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UserDecryptionResponse(uint256,uint256,bytes,bytes,bytes) | 0x7fcdfb5381917f554a717d0a5470a33f5a49ba6445f05ec43c74c0bc2cc608b2 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UserDecryptionResponseThresholdReached(uint256) | 0xe89752be0ecdb68b2a6eb5ef1a891039e0e92ae3c8a62274c5881e48eea1ed25 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | AccountNotAllowedToUseCiphertext(bytes32,address) | 0x160a2b4b | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | AddressEmptyCode(address) | 0x9996b315 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ContractAddressesMaxLengthExceeded(uint256,uint256) | 0xaf1f0495 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ContractNotInContractAddresses(address,address[]) | 0xa4c30391 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | DecryptionNotRequested(uint256) | 0xd48af942 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | DifferentKeyIdsNotAllowed((bytes32,uint256,bytes32,address[]),(bytes32,uint256,bytes32,address[])) | 0xcfae921f | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ECDSAInvalidSignature() | 0xf645eedf | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ECDSAInvalidSignatureLength(uint256) | 0xfce698f7 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ECDSAInvalidSignatureS(bytes32) | 0xd78bce0c | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967NonPayable() | 0xb398979f | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyContractAddresses() | 0x57cfa217 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyCtHandleContractPairs() | 0xa6a6cb21 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyCtHandles() | 0x2de75438 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EnforcedPause() | 0xd93c0665 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ExpectedPause() | 0x8dfc202b | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | FailedCall() | 0xd6bda275 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | HostChainNotRegistered(uint256) | 0xb6679c3b | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidFHEType(uint8) | 0x641950d7 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidInitialization() | 0xf92ee8a9 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullDurationDays() | 0xde2859c1 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidUserSignature(bytes) | 0x2a873d27 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | KmsNodeAlreadySigned(uint256,address) | 0x99ec48d9 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | MaxDecryptionRequestBitSizeExceeded(uint256,uint256) | 0xe7f4895d | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | MaxDurationDaysExceeded(uint256,uint256) | 0x32951863 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorSigner(address) | 0x26cd75dc | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorTxSender(address) | 0x52d725f5 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCustodianSigner(address) | 0x391672a7 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCustodianTxSender(address) | 0xf924a0cf | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotGatewayOwner(address) | 0x0e56cf3d | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializing() | 0xd7e6bcf8 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotKmsSigner(address) | 0x2a7c6ef6 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotKmsTxSender(address) | 0xaee86323 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotOwnerOrGatewayConfig(address) | 0xe19166ee | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotPauserOrGatewayConfig(address) | 0x388916bb | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | PublicDecryptNotAllowed(bytes32) | 0x4331a85d | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | StartTimestampInFuture(uint256,uint256) | 0xf24c0887 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UnsupportedFHEType(uint8) | 0xbe7830b1 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UserAddressInContractAddresses(address,address[]) | 0xdc4d78b1 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UserDecryptionRequestExpired(uint256,(uint256,uint256)) | 0x30348040 | -╰----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ +╭----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++====================================================================================================================================================================================================+ +| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | eip712Domain() | 0x84b0196e | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getDecryptionConsensusTxSenders(uint256) | 0x0900cc69 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | initializeFromEmptyProxy() | 0x39f73810 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isDecryptionDone(uint256) | 0x58f5b8ab | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isPublicDecryptionReady(bytes32[],bytes) | 0x4014c4cd | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isUserDecryptionReady(address,(bytes32,address)[],bytes) | 0xfbb83259 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | pause() | 0x8456cb59 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | paused() | 0x5c975abb | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | proxiableUUID() | 0x52d1902d | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | publicDecryptionRequest(bytes32[],bytes) | 0xd8998f45 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | publicDecryptionResponse(uint256,bytes,bytes,bytes) | 0x6f8913bc | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | reinitializeV2() | 0xc4115874 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | unpause() | 0x3f4ba83a | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | userDecryptionRequest((bytes32,address)[],(uint256,uint256),(uint256,address[]),address,bytes,bytes,bytes) | 0xf1b57adb | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | userDecryptionResponse(uint256,bytes,bytes,bytes) | 0x046f9eb3 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | EIP712DomainChanged() | 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Paused(address) | 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],bytes) | 0xf1b11be50c03123b97d816b2941afe78c72cbaefeff5531fd1ef80ed6d2ecca8 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | PublicDecryptionResponse(uint256,bytes,bytes[],bytes) | 0xd7e58a367a0a6c298e76ad5d240004e327aa1423cbe4bd7ff85d4c715ef8d15f | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Unpaused(address) | 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],address,bytes,bytes) | 0x953b685968a1a7c5f0dfb3ded7daa9f4f6b8f2d81fe33e4d272623d10e783eb8 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UserDecryptionResponse(uint256,uint256,bytes,bytes,bytes) | 0x7fcdfb5381917f554a717d0a5470a33f5a49ba6445f05ec43c74c0bc2cc608b2 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UserDecryptionResponseThresholdReached(uint256) | 0xe89752be0ecdb68b2a6eb5ef1a891039e0e92ae3c8a62274c5881e48eea1ed25 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | AccountNotAllowedToUseCiphertext(bytes32,address) | 0x160a2b4b | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | AddressEmptyCode(address) | 0x9996b315 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CiphertextMaterialNotAdded(bytes32) | 0x826b4638 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContractAddressesMaxLengthExceeded(uint256,uint256) | 0xaf1f0495 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContractNotInContractAddresses(address,address[]) | 0xa4c30391 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | DecryptionNotRequested(uint256) | 0xd48af942 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | DifferentKeyIdsNotAllowed((bytes32,uint256,bytes32,address[],uint256),(bytes32,uint256,bytes32,address[],uint256)) | 0xc2eddf9d | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ECDSAInvalidSignature() | 0xf645eedf | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ECDSAInvalidSignatureLength(uint256) | 0xfce698f7 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ECDSAInvalidSignatureS(bytes32) | 0xd78bce0c | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967NonPayable() | 0xb398979f | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyContractAddresses() | 0x57cfa217 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyCtHandleContractPairs() | 0xa6a6cb21 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyCtHandles() | 0x2de75438 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EnforcedPause() | 0xd93c0665 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ExpectedPause() | 0x8dfc202b | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | FailedCall() | 0xd6bda275 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | HostChainNotRegistered(uint256) | 0xb6679c3b | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidFHEType(uint8) | 0x641950d7 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidInitialization() | 0xf92ee8a9 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullDurationDays() | 0xde2859c1 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidUserSignature(bytes) | 0x2a873d27 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | KmsNodeAlreadySigned(uint256,address) | 0x99ec48d9 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | MaxDecryptionRequestBitSizeExceeded(uint256,uint256) | 0xe7f4895d | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | MaxDurationDaysExceeded(uint256,uint256) | 0x32951863 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianSigner(address) | 0x391672a7 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianTxSender(address) | 0xf924a0cf | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotGatewayOwner(address) | 0x0e56cf3d | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializing() | 0xd7e6bcf8 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsSigner(address) | 0x2a7c6ef6 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsTxSender(address) | 0xaee86323 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotOwnerOrGatewayConfig(address) | 0xe19166ee | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotPauserOrGatewayConfig(address) | 0x388916bb | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | PublicDecryptNotAllowed(bytes32) | 0x4331a85d | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | StartTimestampInFuture(uint256,uint256) | 0xf24c0887 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UnsupportedFHEType(uint8) | 0xbe7830b1 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UserAddressInContractAddresses(address,address[]) | 0xdc4d78b1 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UserDecryptionRequestExpired(uint256,(uint256,uint256)) | 0x30348040 | +╰----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ GatewayConfig -╭----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ -| Type | Signature | Selector | -+==================================================================================================================================================================================================================================================+ -| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | acceptOwnership() | 0x79ba5097 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | addHostChain((uint256,address,address,string,string)) | 0xc80b33ca | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCoprocessor(address) | 0xef6997f9 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCoprocessorMajorityThreshold() | 0x6799ef52 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCoprocessorSigners() | 0x9164d0ae | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCoprocessorTxSenders() | 0x1ea5bd42 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCustodian(address) | 0xcb5aa7e9 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCustodianSigners() | 0xba1f31d2 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCustodianTxSenders() | 0x2a8b9de9 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getHostChain(uint256) | 0xd10f7ff9 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getHostChains() | 0x2585bb65 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getKmsGenThreshold() | 0xb4722bc4 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getKmsNode(address) | 0xe3b2a874 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getKmsSigners() | 0x7eaac8f2 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getKmsTxSenders() | 0x7420f3d4 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getMpcThreshold() | 0x26cf5def | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getProtocolMetadata() | 0x48144c61 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getPublicDecryptionThreshold() | 0x2a388998 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getUserDecryptionThreshold() | 0xc2b42986 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getVersion() | 0x0d8e6e2c | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | initializeFromEmptyProxy((string,string),uint256,uint256,uint256,uint256,(address,address,string,string)[],(address,address,string)[],(address,address,bytes)[]) | 0x8b8dd876 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCoprocessorSigner(address) | 0x2b101c03 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCoprocessorTxSender(address) | 0x2dd3edfe | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCustodianSigner(address) | 0x882d7dd3 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCustodianTxSender(address) | 0x5bace7ff | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isHostChainRegistered(uint256) | 0xbff3aaba | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isKmsSigner(address) | 0x203d0114 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isKmsTxSender(address) | 0xe5275eaf | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isPauser(address) | 0x46fbf68e | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | owner() | 0x8da5cb5b | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | pauseAllGatewayContracts() | 0x9a5a3bc4 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | pendingOwner() | 0xe30c3978 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | proxiableUUID() | 0x52d1902d | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | renounceOwnership() | 0x715018a6 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | transferOwnership(address) | 0xf2fde38b | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | unpauseAllGatewayContracts() | 0x798b58a6 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updateKmsGenThreshold(uint256) | 0x0724dd23 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updateMpcThreshold(uint256) | 0x772d2fe9 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updatePublicDecryptionThreshold(uint256) | 0x2e2d3a82 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updateUserDecryptionThreshold(uint256) | 0xeb843cf6 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | AddHostChain((uint256,address,address,string,string)) | 0x66769341effd268fc4e9a9c8f27bfc968507b519b0ddb9b4ad3ded5f03016837 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,string)[],(address,address,bytes)[]) | 0x3a7c54b1195d44a288f9c3c9a0679aed9325068e0d0d5b69e96047355cc71745 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | OwnershipTransferStarted(address,address) | 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | OwnershipTransferred(address,address) | 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | PauseAllGatewayContracts() | 0x13dbe8823219e226dd0525aeb071e1d2679f89382ba799f7f644867e65b6f3a6 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UnpauseAllGatewayContracts() | 0xbe4f655daae0dbaef63a6b525cab2fa6ace4aa5b94b8834b241137cdfe73a5b0 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdateKmsGenThreshold(uint256) | 0x30c9b1d004f57eae3c6cc3a3752bcb4c8ea2e57c8241a782aa9b65fbc604ec5b | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdateMpcThreshold(uint256) | 0x3571172a49e72d7724be384cdd59f4f21a216c70352ea59cb02543fc76308437 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdatePublicDecryptionThreshold(uint256) | 0xe41802af725729adcb8c151e2937380a25c69155757e3af5d3979adab5035800 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdateUserDecryptionThreshold(uint256) | 0x837e0a6528dadfa2dc792692c5182e52a9f5bbdeed7b2372927a26c695839613 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | AddressEmptyCode(address) | 0x9996b315 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ChainIdNotUint64(uint256) | 0x4178de42 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967NonPayable() | 0xb398979f | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyCoprocessors() | 0x8af082ef | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyCustodians() | 0xcad1d534 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyKmsNodes() | 0x068c8d40 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | FailedCall() | 0xd6bda275 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | HostChainAlreadyRegistered(uint256) | 0x96a56828 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidHighKmsGenThreshold(uint256,uint256) | 0x0f69cbfc | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidHighMpcThreshold(uint256,uint256) | 0x907e6681 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidHighPublicDecryptionThreshold(uint256,uint256) | 0x84208f23 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidHighUserDecryptionThreshold(uint256,uint256) | 0xd2535e11 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidInitialization() | 0xf92ee8a9 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullChainId() | 0x22f73fea | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullKmsGenThreshold() | 0x3ee50774 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullPublicDecryptionThreshold() | 0xb1ae92ea | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullUserDecryptionThreshold() | 0xe60a7271 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializing() | 0xd7e6bcf8 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotPauser(address) | 0x206a346e | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | OwnableInvalidOwner(address) | 0x1e4fbdf7 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | OwnableUnauthorizedAccount(address) | 0x118cdaa7 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | -╰----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ +╭----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++=======================================================================================================================================================================================================================+ +| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | acceptOwnership() | 0x79ba5097 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | addHostChain((uint256,address,address,string,string)) | 0xc80b33ca | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCustodian(address) | 0xcb5aa7e9 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCustodianSigners() | 0xba1f31d2 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCustodianTxSenders() | 0x2a8b9de9 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getHostChain(uint256) | 0xd10f7ff9 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getHostChains() | 0x2585bb65 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getKmsGenThreshold() | 0xb4722bc4 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getKmsNode(address) | 0xe3b2a874 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getKmsSigners() | 0x7eaac8f2 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getKmsTxSenders() | 0x7420f3d4 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getMpcThreshold() | 0x26cf5def | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getProtocolMetadata() | 0x48144c61 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getPublicDecryptionThreshold() | 0x2a388998 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getUserDecryptionThreshold() | 0xc2b42986 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | initializeFromEmptyProxy((string,string),uint256,uint256,uint256,uint256,(address,address,string,string)[],(address,address,bytes)[]) | 0xaeb1a21c | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCustodianSigner(address) | 0x882d7dd3 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCustodianTxSender(address) | 0x5bace7ff | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isHostChainRegistered(uint256) | 0xbff3aaba | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isKmsSigner(address) | 0x203d0114 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isKmsTxSender(address) | 0xe5275eaf | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isPauser(address) | 0x46fbf68e | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | owner() | 0x8da5cb5b | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | pauseAllGatewayContracts() | 0x9a5a3bc4 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | pendingOwner() | 0xe30c3978 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | proxiableUUID() | 0x52d1902d | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | reinitializeV2() | 0xc4115874 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | renounceOwnership() | 0x715018a6 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | transferOwnership(address) | 0xf2fde38b | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | unpauseAllGatewayContracts() | 0x798b58a6 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updateKmsGenThreshold(uint256) | 0x0724dd23 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updateMpcThreshold(uint256) | 0x772d2fe9 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updatePublicDecryptionThreshold(uint256) | 0x2e2d3a82 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updateUserDecryptionThreshold(uint256) | 0xeb843cf6 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | AddHostChain((uint256,address,address,string,string)) | 0x66769341effd268fc4e9a9c8f27bfc968507b519b0ddb9b4ad3ded5f03016837 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,bytes)[]) | 0xab58ab938892a1855d09c7c1390cabd4ca0405eaab322c5a82570770a719826e | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | OwnershipTransferStarted(address,address) | 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | OwnershipTransferred(address,address) | 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | PauseAllGatewayContracts() | 0x13dbe8823219e226dd0525aeb071e1d2679f89382ba799f7f644867e65b6f3a6 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UnpauseAllGatewayContracts() | 0xbe4f655daae0dbaef63a6b525cab2fa6ace4aa5b94b8834b241137cdfe73a5b0 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdateKmsGenThreshold(uint256) | 0x30c9b1d004f57eae3c6cc3a3752bcb4c8ea2e57c8241a782aa9b65fbc604ec5b | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdateMpcThreshold(uint256) | 0x3571172a49e72d7724be384cdd59f4f21a216c70352ea59cb02543fc76308437 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdatePublicDecryptionThreshold(uint256) | 0xe41802af725729adcb8c151e2937380a25c69155757e3af5d3979adab5035800 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdateUserDecryptionThreshold(uint256) | 0x837e0a6528dadfa2dc792692c5182e52a9f5bbdeed7b2372927a26c695839613 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | AddressEmptyCode(address) | 0x9996b315 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ChainIdNotUint64(uint256) | 0x4178de42 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967NonPayable() | 0xb398979f | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyCustodians() | 0xcad1d534 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyKmsNodes() | 0x068c8d40 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | FailedCall() | 0xd6bda275 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | HostChainAlreadyRegistered(uint256) | 0x96a56828 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidHighKmsGenThreshold(uint256,uint256) | 0x0f69cbfc | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidHighMpcThreshold(uint256,uint256) | 0x907e6681 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidHighPublicDecryptionThreshold(uint256,uint256) | 0x84208f23 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidHighUserDecryptionThreshold(uint256,uint256) | 0xd2535e11 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidInitialization() | 0xf92ee8a9 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullChainId() | 0x22f73fea | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullKmsGenThreshold() | 0x3ee50774 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullPublicDecryptionThreshold() | 0xb1ae92ea | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullUserDecryptionThreshold() | 0xe60a7271 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializing() | 0xd7e6bcf8 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotPauser(address) | 0x206a346e | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | OwnableInvalidOwner(address) | 0x1e4fbdf7 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | OwnableUnauthorizedAccount(address) | 0x118cdaa7 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | +╰----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ InputVerification @@ -408,6 +549,8 @@ InputVerification |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Function | proxiableUUID() | 0x52d1902d | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | reinitializeV2() | 0xc4115874 | +|----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Function | rejectProofResponse(uint256,bytes) | 0x338007fc | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Function | unpause() | 0x3f4ba83a | @@ -424,7 +567,7 @@ InputVerification |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Event | Paused(address) | 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | RejectProofResponse(uint256) | 0xe465e141fa8abd95ab7e0855543307f8506ab0170ef664420fb71ab7de0183de | +| Event | RejectProofResponse(uint256,bytes) | 0x6f4b137679536c6081c7f024870327aa89b62a64182f2d41e4fbdee5e2248e86 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Event | Unpaused(address) | 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| @@ -432,7 +575,7 @@ InputVerification |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Event | VerifyProofRequest(uint256,uint256,uint256,address,address,bytes,bytes) | 0xe2cafa1b8243311c0828833c7ddf9356c92a51a2246bcf68e13f22b15defdd99 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | VerifyProofResponse(uint256,bytes32[],bytes[]) | 0xfe2c43585786a5a658d2ec5df5dea3fb3385b77c94f60f724ff810896f419835 | +| Event | VerifyProofResponse(uint256,uint256,bytes32[],bytes[],bytes) | 0xf96a66bb08cf5450f5789d7343fa3b58d4a00a66ef2d0d0494f424b03b0abff2 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Error | AddressEmptyCode(address) | 0x9996b315 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| @@ -458,11 +601,15 @@ InputVerification |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Error | HostChainNotRegistered(uint256) | 0xb6679c3b | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextProofRejection(uint256,uint256,uint8) | 0xf3225893 | +|----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextProofVerification(uint256,uint256,uint8) | 0xc0eedb7b | +|----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Error | InvalidInitialization() | 0xf92ee8a9 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorSigner(address) | 0x26cd75dc | +| Error | NotCoprocessorSignerFromContext(uint256,address) | 0x554f8c5f | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorTxSender(address) | 0x52d725f5 | +| Error | NotCoprocessorTxSenderFromContext(uint256,address) | 0x29a993c1 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Error | NotCustodianSigner(address) | 0x391672a7 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| @@ -575,10 +722,6 @@ KMSGeneration |----------+------------------------------------------------+--------------------------------------------------------------------| | Error | KmsAlreadySignedForPrepKeygen(uint256,address) | 0x33ca1fe3 | |----------+------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorSigner(address) | 0x26cd75dc | -|----------+------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorTxSender(address) | 0x52d725f5 | -|----------+------------------------------------------------+--------------------------------------------------------------------| | Error | NotCustodianSigner(address) | 0x391672a7 | |----------+------------------------------------------------+--------------------------------------------------------------------| | Error | NotCustodianTxSender(address) | 0xf924a0cf | @@ -601,81 +744,87 @@ KMSGeneration MultichainACL -╭----------+-----------------------------------------------------------+--------------------------------------------------------------------╮ -| Type | Signature | Selector | -+===========================================================================================================================================+ -| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | allowAccount(bytes32,address,bytes) | 0x294a8705 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | allowPublicDecrypt(bytes32,bytes) | 0xd90724b5 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getAllowAccountConsensusTxSenders(bytes32,address) | 0xae953186 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getAllowPublicDecryptConsensusTxSenders(bytes32) | 0x97c49a40 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getVersion() | 0x0d8e6e2c | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | initializeFromEmptyProxy() | 0x39f73810 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | isAccountAllowed(bytes32,address) | 0xc6528f69 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | isPublicDecryptAllowed(bytes32) | 0x0620326d | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | proxiableUUID() | 0x52d1902d | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Event | AllowAccount(bytes32,address) | 0x18f825f318ffa4ed5bf3f6ed24fd54d33378b0e9f16ddb37c3419691b2e16566 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Event | AllowPublicDecrypt(bytes32) | 0x0868eca75126ba0a46bbec5eefa883e20a13e6c7d936c9bf47ed886e2eb43d3a | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | AddressEmptyCode(address) | 0x9996b315 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | ContractsMaxLengthExceeded(uint256,uint256) | 0xa7db2751 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | CoprocessorAlreadyAllowedAccount(bytes32,address,address) | 0x6637e32d | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | CoprocessorAlreadyAllowedPublicDecrypt(bytes32,address) | 0xa6f04d26 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967NonPayable() | 0xb398979f | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyContractAddresses() | 0x57cfa217 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | FailedCall() | 0xd6bda275 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | HostChainNotRegistered(uint256) | 0xb6679c3b | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidInitialization() | 0xf92ee8a9 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorSigner(address) | 0x26cd75dc | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorTxSender(address) | 0x52d725f5 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCustodianSigner(address) | 0x391672a7 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCustodianTxSender(address) | 0xf924a0cf | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotGatewayOwner(address) | 0x0e56cf3d | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializing() | 0xd7e6bcf8 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotKmsSigner(address) | 0x2a7c6ef6 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotKmsTxSender(address) | 0xaee86323 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | -╰----------+-----------------------------------------------------------+--------------------------------------------------------------------╯ +╭----------+----------------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++======================================================================================================================================================+ +| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | allowAccount(bytes32,address,bytes) | 0x294a8705 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | allowPublicDecrypt(bytes32,bytes) | 0xd90724b5 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getAllowAccountConsensusTxSenders(bytes32,address) | 0xae953186 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getAllowPublicDecryptConsensusTxSenders(bytes32) | 0x97c49a40 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | initializeFromEmptyProxy() | 0x39f73810 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isAccountAllowed(bytes32,address) | 0xc6528f69 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isPublicDecryptAllowed(bytes32) | 0x0620326d | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | proxiableUUID() | 0x52d1902d | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | reinitializeV2() | 0xc4115874 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | AllowAccount(bytes32,address) | 0x18f825f318ffa4ed5bf3f6ed24fd54d33378b0e9f16ddb37c3419691b2e16566 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | AllowPublicDecrypt(bytes32) | 0x0868eca75126ba0a46bbec5eefa883e20a13e6c7d936c9bf47ed886e2eb43d3a | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | AddressEmptyCode(address) | 0x9996b315 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContractsMaxLengthExceeded(uint256,uint256) | 0xa7db2751 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorAlreadyAllowedAccount(bytes32,address,address) | 0x6637e32d | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorAlreadyAllowedPublicDecrypt(bytes32,address) | 0xa6f04d26 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967NonPayable() | 0xb398979f | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyContractAddresses() | 0x57cfa217 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | FailedCall() | 0xd6bda275 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | HostChainNotRegistered(uint256) | 0xb6679c3b | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextAllowAccount(bytes32,address,uint256,uint8) | 0x13c95d8d | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextAllowPublicDecrypt(bytes32,uint256,uint8) | 0xaa7a2a97 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidInitialization() | 0xf92ee8a9 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCoprocessorSignerFromContext(uint256,address) | 0x554f8c5f | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCoprocessorTxSenderFromContext(uint256,address) | 0x29a993c1 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianSigner(address) | 0x391672a7 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianTxSender(address) | 0xf924a0cf | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotGatewayOwner(address) | 0x0e56cf3d | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializing() | 0xd7e6bcf8 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsSigner(address) | 0x2a7c6ef6 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsTxSender(address) | 0xaee86323 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | +╰----------+----------------------------------------------------------------------+--------------------------------------------------------------------╯ EmptyUUPSProxy @@ -770,385 +919,526 @@ EmptyUUPSProxyGatewayConfig CiphertextCommitsV2Example -╭----------+----------------------------------------------------------+--------------------------------------------------------------------╮ -| Type | Signature | Selector | -+==========================================================================================================================================+ -| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | addCiphertextMaterial(bytes32,uint256,bytes32,bytes32) | 0x90f30354 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getAddCiphertextMaterialConsensusTxSenders(bytes32) | 0xe6f6ab94 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCiphertextMaterials(bytes32[]) | 0x55c4d997 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getSnsCiphertextMaterials(bytes32[]) | 0xa14f8971 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getVersion() | 0x0d8e6e2c | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | initializeFromEmptyProxy() | 0x39f73810 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCiphertextMaterialAdded(bytes32) | 0x2ddc9a6f | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | proxiableUUID() | 0x52d1902d | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Event | AddCiphertextMaterial(bytes32,bytes32,bytes32,address[]) | 0xcb89ccb347018d7f282bb4c048e135e19bc1d13660fa0f2850e10518422536de | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | AddressEmptyCode(address) | 0x9996b315 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | CiphertextMaterialNotFound(bytes32) | 0x0666cbdf | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | CoprocessorAlreadyAdded(bytes32,address) | 0x1dd7250c | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967NonPayable() | 0xb398979f | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | FailedCall() | 0xd6bda275 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | HostChainNotRegistered(uint256) | 0xb6679c3b | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidInitialization() | 0xf92ee8a9 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorSigner(address) | 0x26cd75dc | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorTxSender(address) | 0x52d725f5 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCustodianSigner(address) | 0x391672a7 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCustodianTxSender(address) | 0xf924a0cf | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotGatewayOwner(address) | 0x0e56cf3d | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializing() | 0xd7e6bcf8 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotKmsSigner(address) | 0x2a7c6ef6 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotKmsTxSender(address) | 0xaee86323 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | -╰----------+----------------------------------------------------------+--------------------------------------------------------------------╯ +╭----------+---------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++===============================================================================================================================================+ +| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | addCiphertextMaterial(bytes32,uint256,bytes32,bytes32) | 0x90f30354 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCiphertextMaterials(bytes32[]) | 0x55c4d997 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getConsensusCoprocessorTxSenders(bytes32) | 0xe4bb288c | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getSnsCiphertextMaterials(bytes32[]) | 0xa14f8971 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | initializeFromEmptyProxy() | 0x39f73810 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCiphertextMaterialAdded(bytes32) | 0x2ddc9a6f | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | proxiableUUID() | 0x52d1902d | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | reinitializeV2() | 0xc4115874 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Event | AddCiphertextMaterial(bytes32,bytes32,bytes32,uint256) | 0xc3113162bedb887e086a25724f966348968a75efd447615ebfd0f715939ad964 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | AddressEmptyCode(address) | 0x9996b315 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CiphertextMaterialNotFound(bytes32) | 0x0666cbdf | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorAlreadyAdded(bytes32,address) | 0x1dd7250c | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967NonPayable() | 0xb398979f | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | FailedCall() | 0xd6bda275 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | HostChainNotRegistered(uint256) | 0xb6679c3b | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextAddCiphertext(bytes32,uint256,uint8) | 0x96346431 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidInitialization() | 0xf92ee8a9 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCoprocessorSignerFromContext(uint256,address) | 0x554f8c5f | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCoprocessorTxSenderFromContext(uint256,address) | 0x29a993c1 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianSigner(address) | 0x391672a7 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianTxSender(address) | 0xf924a0cf | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotGatewayOwner(address) | 0x0e56cf3d | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializing() | 0xd7e6bcf8 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsSigner(address) | 0x2a7c6ef6 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsTxSender(address) | 0xaee86323 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | +╰----------+---------------------------------------------------------------+--------------------------------------------------------------------╯ + + +CoprocessorContextsV2Example + +╭----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++==============================================================================================================================================================================================================================================+ +| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | addCoprocessorContext(bytes,(string,address,address,string)[],(uint256,uint256)) | 0xa1364d79 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | forceUpdateCoprocessorContextToStatus(uint256,uint8) | 0xcac6a5a8 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getActiveCoprocessorContext() | 0xfed9716b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getActiveCoprocessorContextId() | 0x991dc36d | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessor(uint256,address) | 0x820a91f8 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorActivationBlockTimestamp(uint256) | 0xb3f5403a | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorContextStatus(uint256) | 0x888b99e0 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorDeactivatedBlockTimestamp(uint256) | 0xa9b4d071 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorMajorityThreshold(uint256) | 0xf88174ea | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorSigners(uint256) | 0x41618fe9 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorTxSenders(uint256) | 0x049f25ef | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getPreActivationCoprocessorContextId() | 0xbe91187b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getSuspendedCoprocessorContextId() | 0x086e4e1c | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | initializeFromEmptyProxy(bytes,(string,address,address,string)[]) | 0xecfb0b94 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCoprocessorContextOperating(uint256) | 0xcd8e993c | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCoprocessorSigner(uint256,address) | 0xcdbb5a82 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCoprocessorTxSender(uint256,address) | 0x8625e876 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | proxiableUUID() | 0x52d1902d | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | refreshCoprocessorContextStatuses() | 0x3a5162e6 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | swapSuspendedCoprocessorContextWithActive(uint256) | 0x86dfc7de | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | ActivateCoprocessorContext(uint256) | 0x6c8c04c9fea337720b7dfadca365e850035114fd081b58d030afbe8b5dc3be71 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | CompromiseCoprocessorContext(uint256) | 0xee7ef83963417125d27430789fc6e94194381e82c3cda68260d0e7cfc31eaf21 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | DeactivateCoprocessorContext(uint256) | 0x1baa08d8de18e8e2287691b1309748010981ebdfd12a173d8574657548a52898 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | DestroyCoprocessorContext(uint256) | 0xf20b299804c9c1d6da3b82414c7aa0a845cdbabae2d90e46e360a379a77b7be5 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | InitializeCoprocessorContexts(bytes,(string,address,address,string)[]) | 0xd474068ecf914caa04868493bcefa56bfb049a54f1612c2726d112e1e60663b9 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | NewCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256)) | 0xbbb104c495886e5daa3efb6b281ec2840c69385af5cbfc1582fcf700de1ecd4b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | PreActivateCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),uint256) | 0x0425f54e602cbcf87fafd6a0b557fa5c4bc4bc6c251686255eb3bd775f452377 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | SuspendCoprocessorContext(uint256,uint256) | 0x3080f2b80dda4748ca2926a641fa5007735058dc5f5ab2594eeca74197a3accc | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ActiveContextOngoing(uint256) | 0x7eea432b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | AddressEmptyCode(address) | 0x9996b315 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextAlreadyExists(uint256) | 0x6653f6d7 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextDoesNotExist(uint256) | 0x61544cfc | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextIsActive(uint256) | 0xcd494e49 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextIsGenerating(uint256) | 0x0ddd14ca | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextNotActive(uint256) | 0x331486b3 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextNotGenerated(uint256) | 0xc0b5ee66 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextNotPreActivatedOrSuspended(uint256) | 0x12b49e3d | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContextNotSuspended(uint256) | 0x77bf5846 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorContextNotInitialized(uint256) | 0xabf9e7b0 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorSignerAddressesNotUnique(address,uint256,(string,address,address,string)[]) | 0xc826e1a2 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorTxSenderAddressesNotUnique(address,uint256,(string,address,address,string)[]) | 0x64d52759 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967NonPayable() | 0xb398979f | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyCoprocessors() | 0x8af082ef | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | FailedCall() | 0xd6bda275 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | HostChainNotRegistered(uint256) | 0xb6679c3b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidContextStatusForceUpdate(uint256,uint8) | 0xf0bed68f | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidInitialization() | 0xf92ee8a9 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullContextId() | 0xcb17b7a5 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NoActiveCoprocessorContext() | 0x046593ea | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NoPreActivationCoprocessorContext() | 0xb9e861b2 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NoSuspendedCoprocessorContext() | 0x21fb08f9 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCoprocessorFromContext(uint256,address) | 0xc312e73e | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianSigner(address) | 0x391672a7 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianTxSender(address) | 0xf924a0cf | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotGatewayOwner(address) | 0x0e56cf3d | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializing() | 0xd7e6bcf8 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsSigner(address) | 0x2a7c6ef6 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsTxSender(address) | 0xaee86323 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NullCoprocessorSignerAddress(uint256,(string,address,address,string)[]) | 0x4a6c5974 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NullCoprocessorTxSenderAddress(uint256,(string,address,address,string)[]) | 0x9edb7861 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | PreActivationContextOngoing(uint256) | 0xc470c022 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | SuspendedContextOngoing(uint256) | 0x7022ec41 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | +╰----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ DecryptionV2Example -╭----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ -| Type | Signature | Selector | -+============================================================================================================================================================================================+ -| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | eip712Domain() | 0x84b0196e | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getDecryptionConsensusTxSenders(uint256) | 0x0900cc69 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getVersion() | 0x0d8e6e2c | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | initializeFromEmptyProxy() | 0x39f73810 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isDecryptionDone(uint256) | 0x58f5b8ab | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isPublicDecryptionReady(bytes32[],bytes) | 0x4014c4cd | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isUserDecryptionReady(address,(bytes32,address)[],bytes) | 0xfbb83259 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | pause() | 0x8456cb59 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | paused() | 0x5c975abb | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | proxiableUUID() | 0x52d1902d | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | publicDecryptionRequest(bytes32[],bytes) | 0xd8998f45 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | publicDecryptionResponse(uint256,bytes,bytes,bytes) | 0x6f8913bc | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | unpause() | 0x3f4ba83a | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | userDecryptionRequest((bytes32,address)[],(uint256,uint256),(uint256,address[]),address,bytes,bytes,bytes) | 0xf1b57adb | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | userDecryptionResponse(uint256,bytes,bytes,bytes) | 0x046f9eb3 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | EIP712DomainChanged() | 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | Paused(address) | 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],bytes) | 0x22db480a39bd72556438aadb4a32a3d2a6638b87c03bbec5fef6997e109587ff | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | PublicDecryptionResponse(uint256,bytes,bytes[],bytes) | 0xd7e58a367a0a6c298e76ad5d240004e327aa1423cbe4bd7ff85d4c715ef8d15f | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | Unpaused(address) | 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],address,bytes,bytes) | 0xf9011bd6ba0da6049c520d70fe5971f17ed7ab795486052544b51019896c596b | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UserDecryptionResponse(uint256,uint256,bytes,bytes,bytes) | 0x7fcdfb5381917f554a717d0a5470a33f5a49ba6445f05ec43c74c0bc2cc608b2 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UserDecryptionResponseThresholdReached(uint256) | 0xe89752be0ecdb68b2a6eb5ef1a891039e0e92ae3c8a62274c5881e48eea1ed25 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | AccountNotAllowedToUseCiphertext(bytes32,address) | 0x160a2b4b | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | AddressEmptyCode(address) | 0x9996b315 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ContractAddressesMaxLengthExceeded(uint256,uint256) | 0xaf1f0495 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ContractNotInContractAddresses(address,address[]) | 0xa4c30391 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | DecryptionNotRequested(uint256) | 0xd48af942 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | DifferentKeyIdsNotAllowed((bytes32,uint256,bytes32,address[]),(bytes32,uint256,bytes32,address[])) | 0xcfae921f | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ECDSAInvalidSignature() | 0xf645eedf | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ECDSAInvalidSignatureLength(uint256) | 0xfce698f7 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ECDSAInvalidSignatureS(bytes32) | 0xd78bce0c | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967NonPayable() | 0xb398979f | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyContractAddresses() | 0x57cfa217 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyCtHandleContractPairs() | 0xa6a6cb21 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyCtHandles() | 0x2de75438 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EnforcedPause() | 0xd93c0665 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ExpectedPause() | 0x8dfc202b | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | FailedCall() | 0xd6bda275 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | HostChainNotRegistered(uint256) | 0xb6679c3b | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidFHEType(uint8) | 0x641950d7 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidInitialization() | 0xf92ee8a9 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullDurationDays() | 0xde2859c1 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidUserSignature(bytes) | 0x2a873d27 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | KmsNodeAlreadySigned(uint256,address) | 0x99ec48d9 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | MaxDecryptionRequestBitSizeExceeded(uint256,uint256) | 0xe7f4895d | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | MaxDurationDaysExceeded(uint256,uint256) | 0x32951863 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorSigner(address) | 0x26cd75dc | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorTxSender(address) | 0x52d725f5 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCustodianSigner(address) | 0x391672a7 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCustodianTxSender(address) | 0xf924a0cf | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotGatewayOwner(address) | 0x0e56cf3d | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializing() | 0xd7e6bcf8 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotKmsSigner(address) | 0x2a7c6ef6 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotKmsTxSender(address) | 0xaee86323 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotOwnerOrGatewayConfig(address) | 0xe19166ee | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotPauserOrGatewayConfig(address) | 0x388916bb | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | PublicDecryptNotAllowed(bytes32) | 0x4331a85d | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | StartTimestampInFuture(uint256,uint256) | 0xf24c0887 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UnsupportedFHEType(uint8) | 0xbe7830b1 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UserAddressInContractAddresses(address,address[]) | 0xdc4d78b1 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UserDecryptionRequestExpired(uint256,(uint256,uint256)) | 0x30348040 | -╰----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ +╭----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++====================================================================================================================================================================================================+ +| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | eip712Domain() | 0x84b0196e | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getDecryptionConsensusTxSenders(uint256) | 0x0900cc69 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | initializeFromEmptyProxy() | 0x39f73810 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isDecryptionDone(uint256) | 0x58f5b8ab | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isPublicDecryptionReady(bytes32[],bytes) | 0x4014c4cd | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isUserDecryptionReady(address,(bytes32,address)[],bytes) | 0xfbb83259 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | pause() | 0x8456cb59 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | paused() | 0x5c975abb | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | proxiableUUID() | 0x52d1902d | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | publicDecryptionRequest(bytes32[],bytes) | 0xd8998f45 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | publicDecryptionResponse(uint256,bytes,bytes,bytes) | 0x6f8913bc | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | reinitializeV2() | 0xc4115874 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | unpause() | 0x3f4ba83a | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | userDecryptionRequest((bytes32,address)[],(uint256,uint256),(uint256,address[]),address,bytes,bytes,bytes) | 0xf1b57adb | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | userDecryptionResponse(uint256,bytes,bytes,bytes) | 0x046f9eb3 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | EIP712DomainChanged() | 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Paused(address) | 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],bytes) | 0xf1b11be50c03123b97d816b2941afe78c72cbaefeff5531fd1ef80ed6d2ecca8 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | PublicDecryptionResponse(uint256,bytes,bytes[],bytes) | 0xd7e58a367a0a6c298e76ad5d240004e327aa1423cbe4bd7ff85d4c715ef8d15f | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Unpaused(address) | 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],address,bytes,bytes) | 0x953b685968a1a7c5f0dfb3ded7daa9f4f6b8f2d81fe33e4d272623d10e783eb8 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UserDecryptionResponse(uint256,uint256,bytes,bytes,bytes) | 0x7fcdfb5381917f554a717d0a5470a33f5a49ba6445f05ec43c74c0bc2cc608b2 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UserDecryptionResponseThresholdReached(uint256) | 0xe89752be0ecdb68b2a6eb5ef1a891039e0e92ae3c8a62274c5881e48eea1ed25 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | AccountNotAllowedToUseCiphertext(bytes32,address) | 0x160a2b4b | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | AddressEmptyCode(address) | 0x9996b315 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CiphertextMaterialNotAdded(bytes32) | 0x826b4638 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContractAddressesMaxLengthExceeded(uint256,uint256) | 0xaf1f0495 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContractNotInContractAddresses(address,address[]) | 0xa4c30391 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | DecryptionNotRequested(uint256) | 0xd48af942 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | DifferentKeyIdsNotAllowed((bytes32,uint256,bytes32,address[],uint256),(bytes32,uint256,bytes32,address[],uint256)) | 0xc2eddf9d | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ECDSAInvalidSignature() | 0xf645eedf | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ECDSAInvalidSignatureLength(uint256) | 0xfce698f7 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ECDSAInvalidSignatureS(bytes32) | 0xd78bce0c | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967NonPayable() | 0xb398979f | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyContractAddresses() | 0x57cfa217 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyCtHandleContractPairs() | 0xa6a6cb21 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyCtHandles() | 0x2de75438 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EnforcedPause() | 0xd93c0665 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ExpectedPause() | 0x8dfc202b | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | FailedCall() | 0xd6bda275 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | HostChainNotRegistered(uint256) | 0xb6679c3b | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidFHEType(uint8) | 0x641950d7 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidInitialization() | 0xf92ee8a9 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullDurationDays() | 0xde2859c1 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidUserSignature(bytes) | 0x2a873d27 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | KmsNodeAlreadySigned(uint256,address) | 0x99ec48d9 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | MaxDecryptionRequestBitSizeExceeded(uint256,uint256) | 0xe7f4895d | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | MaxDurationDaysExceeded(uint256,uint256) | 0x32951863 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianSigner(address) | 0x391672a7 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianTxSender(address) | 0xf924a0cf | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotGatewayOwner(address) | 0x0e56cf3d | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializing() | 0xd7e6bcf8 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsSigner(address) | 0x2a7c6ef6 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsTxSender(address) | 0xaee86323 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotOwnerOrGatewayConfig(address) | 0xe19166ee | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotPauserOrGatewayConfig(address) | 0x388916bb | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | PublicDecryptNotAllowed(bytes32) | 0x4331a85d | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | StartTimestampInFuture(uint256,uint256) | 0xf24c0887 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UnsupportedFHEType(uint8) | 0xbe7830b1 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UserAddressInContractAddresses(address,address[]) | 0xdc4d78b1 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UserDecryptionRequestExpired(uint256,(uint256,uint256)) | 0x30348040 | +╰----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ GatewayConfigV2Example -╭----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ -| Type | Signature | Selector | -+==================================================================================================================================================================================================================================================+ -| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | acceptOwnership() | 0x79ba5097 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | addHostChain((uint256,address,address,string,string)) | 0xc80b33ca | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCoprocessor(address) | 0xef6997f9 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCoprocessorMajorityThreshold() | 0x6799ef52 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCoprocessorSigners() | 0x9164d0ae | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCoprocessorTxSenders() | 0x1ea5bd42 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCustodian(address) | 0xcb5aa7e9 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCustodianSigners() | 0xba1f31d2 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCustodianTxSenders() | 0x2a8b9de9 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getHostChain(uint256) | 0xd10f7ff9 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getHostChains() | 0x2585bb65 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getKmsGenThreshold() | 0xb4722bc4 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getKmsNode(address) | 0xe3b2a874 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getKmsSigners() | 0x7eaac8f2 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getKmsTxSenders() | 0x7420f3d4 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getMpcThreshold() | 0x26cf5def | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getProtocolMetadata() | 0x48144c61 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getPublicDecryptionThreshold() | 0x2a388998 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getUserDecryptionThreshold() | 0xc2b42986 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getVersion() | 0x0d8e6e2c | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | initializeFromEmptyProxy((string,string),uint256,uint256,uint256,uint256,(address,address,string,string)[],(address,address,string)[],(address,address,bytes)[]) | 0x8b8dd876 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCoprocessorSigner(address) | 0x2b101c03 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCoprocessorTxSender(address) | 0x2dd3edfe | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCustodianSigner(address) | 0x882d7dd3 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCustodianTxSender(address) | 0x5bace7ff | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isHostChainRegistered(uint256) | 0xbff3aaba | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isKmsSigner(address) | 0x203d0114 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isKmsTxSender(address) | 0xe5275eaf | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isPauser(address) | 0x46fbf68e | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | owner() | 0x8da5cb5b | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | pauseAllGatewayContracts() | 0x9a5a3bc4 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | pendingOwner() | 0xe30c3978 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | proxiableUUID() | 0x52d1902d | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | renounceOwnership() | 0x715018a6 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | transferOwnership(address) | 0xf2fde38b | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | unpauseAllGatewayContracts() | 0x798b58a6 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updateKmsGenThreshold(uint256) | 0x0724dd23 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updateMpcThreshold(uint256) | 0x772d2fe9 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updatePublicDecryptionThreshold(uint256) | 0x2e2d3a82 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updateUserDecryptionThreshold(uint256) | 0xeb843cf6 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | AddHostChain((uint256,address,address,string,string)) | 0x66769341effd268fc4e9a9c8f27bfc968507b519b0ddb9b4ad3ded5f03016837 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,string)[],(address,address,bytes)[]) | 0x3a7c54b1195d44a288f9c3c9a0679aed9325068e0d0d5b69e96047355cc71745 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | OwnershipTransferStarted(address,address) | 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | OwnershipTransferred(address,address) | 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | PauseAllGatewayContracts() | 0x13dbe8823219e226dd0525aeb071e1d2679f89382ba799f7f644867e65b6f3a6 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UnpauseAllGatewayContracts() | 0xbe4f655daae0dbaef63a6b525cab2fa6ace4aa5b94b8834b241137cdfe73a5b0 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdateKmsGenThreshold(uint256) | 0x30c9b1d004f57eae3c6cc3a3752bcb4c8ea2e57c8241a782aa9b65fbc604ec5b | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdateMpcThreshold(uint256) | 0x3571172a49e72d7724be384cdd59f4f21a216c70352ea59cb02543fc76308437 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdatePublicDecryptionThreshold(uint256) | 0xe41802af725729adcb8c151e2937380a25c69155757e3af5d3979adab5035800 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdateUserDecryptionThreshold(uint256) | 0x837e0a6528dadfa2dc792692c5182e52a9f5bbdeed7b2372927a26c695839613 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | AddressEmptyCode(address) | 0x9996b315 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ChainIdNotUint64(uint256) | 0x4178de42 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967NonPayable() | 0xb398979f | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyCoprocessors() | 0x8af082ef | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyCustodians() | 0xcad1d534 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyKmsNodes() | 0x068c8d40 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | FailedCall() | 0xd6bda275 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | HostChainAlreadyRegistered(uint256) | 0x96a56828 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidHighKmsGenThreshold(uint256,uint256) | 0x0f69cbfc | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidHighMpcThreshold(uint256,uint256) | 0x907e6681 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidHighPublicDecryptionThreshold(uint256,uint256) | 0x84208f23 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidHighUserDecryptionThreshold(uint256,uint256) | 0xd2535e11 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidInitialization() | 0xf92ee8a9 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullChainId() | 0x22f73fea | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullKmsGenThreshold() | 0x3ee50774 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullPublicDecryptionThreshold() | 0xb1ae92ea | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullUserDecryptionThreshold() | 0xe60a7271 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializing() | 0xd7e6bcf8 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotPauser(address) | 0x206a346e | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | OwnableInvalidOwner(address) | 0x1e4fbdf7 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | OwnableUnauthorizedAccount(address) | 0x118cdaa7 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | -╰----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ +╭----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++=======================================================================================================================================================================================================================+ +| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | acceptOwnership() | 0x79ba5097 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | addHostChain((uint256,address,address,string,string)) | 0xc80b33ca | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCustodian(address) | 0xcb5aa7e9 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCustodianSigners() | 0xba1f31d2 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCustodianTxSenders() | 0x2a8b9de9 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getHostChain(uint256) | 0xd10f7ff9 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getHostChains() | 0x2585bb65 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getKmsGenThreshold() | 0xb4722bc4 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getKmsNode(address) | 0xe3b2a874 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getKmsSigners() | 0x7eaac8f2 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getKmsTxSenders() | 0x7420f3d4 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getMpcThreshold() | 0x26cf5def | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getProtocolMetadata() | 0x48144c61 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getPublicDecryptionThreshold() | 0x2a388998 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getUserDecryptionThreshold() | 0xc2b42986 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | initializeFromEmptyProxy((string,string),uint256,uint256,uint256,uint256,(address,address,string,string)[],(address,address,bytes)[]) | 0xaeb1a21c | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCustodianSigner(address) | 0x882d7dd3 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCustodianTxSender(address) | 0x5bace7ff | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isHostChainRegistered(uint256) | 0xbff3aaba | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isKmsSigner(address) | 0x203d0114 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isKmsTxSender(address) | 0xe5275eaf | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isPauser(address) | 0x46fbf68e | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | owner() | 0x8da5cb5b | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | pauseAllGatewayContracts() | 0x9a5a3bc4 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | pendingOwner() | 0xe30c3978 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | proxiableUUID() | 0x52d1902d | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | reinitializeV2() | 0xc4115874 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | renounceOwnership() | 0x715018a6 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | transferOwnership(address) | 0xf2fde38b | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | unpauseAllGatewayContracts() | 0x798b58a6 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updateKmsGenThreshold(uint256) | 0x0724dd23 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updateMpcThreshold(uint256) | 0x772d2fe9 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updatePublicDecryptionThreshold(uint256) | 0x2e2d3a82 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updateUserDecryptionThreshold(uint256) | 0xeb843cf6 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | AddHostChain((uint256,address,address,string,string)) | 0x66769341effd268fc4e9a9c8f27bfc968507b519b0ddb9b4ad3ded5f03016837 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,bytes)[]) | 0xab58ab938892a1855d09c7c1390cabd4ca0405eaab322c5a82570770a719826e | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | OwnershipTransferStarted(address,address) | 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | OwnershipTransferred(address,address) | 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | PauseAllGatewayContracts() | 0x13dbe8823219e226dd0525aeb071e1d2679f89382ba799f7f644867e65b6f3a6 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UnpauseAllGatewayContracts() | 0xbe4f655daae0dbaef63a6b525cab2fa6ace4aa5b94b8834b241137cdfe73a5b0 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdateKmsGenThreshold(uint256) | 0x30c9b1d004f57eae3c6cc3a3752bcb4c8ea2e57c8241a782aa9b65fbc604ec5b | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdateMpcThreshold(uint256) | 0x3571172a49e72d7724be384cdd59f4f21a216c70352ea59cb02543fc76308437 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdatePublicDecryptionThreshold(uint256) | 0xe41802af725729adcb8c151e2937380a25c69155757e3af5d3979adab5035800 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdateUserDecryptionThreshold(uint256) | 0x837e0a6528dadfa2dc792692c5182e52a9f5bbdeed7b2372927a26c695839613 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | AddressEmptyCode(address) | 0x9996b315 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ChainIdNotUint64(uint256) | 0x4178de42 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967NonPayable() | 0xb398979f | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyCustodians() | 0xcad1d534 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyKmsNodes() | 0x068c8d40 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | FailedCall() | 0xd6bda275 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | HostChainAlreadyRegistered(uint256) | 0x96a56828 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidHighKmsGenThreshold(uint256,uint256) | 0x0f69cbfc | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidHighMpcThreshold(uint256,uint256) | 0x907e6681 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidHighPublicDecryptionThreshold(uint256,uint256) | 0x84208f23 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidHighUserDecryptionThreshold(uint256,uint256) | 0xd2535e11 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidInitialization() | 0xf92ee8a9 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullChainId() | 0x22f73fea | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullKmsGenThreshold() | 0x3ee50774 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullPublicDecryptionThreshold() | 0xb1ae92ea | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullUserDecryptionThreshold() | 0xe60a7271 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializing() | 0xd7e6bcf8 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotPauser(address) | 0x206a346e | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | OwnableInvalidOwner(address) | 0x1e4fbdf7 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | OwnableUnauthorizedAccount(address) | 0x118cdaa7 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | +╰----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ InputVerificationV2Example @@ -1178,6 +1468,8 @@ InputVerificationV2Example |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Function | proxiableUUID() | 0x52d1902d | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | reinitializeV2() | 0xc4115874 | +|----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Function | rejectProofResponse(uint256,bytes) | 0x338007fc | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Function | unpause() | 0x3f4ba83a | @@ -1194,7 +1486,7 @@ InputVerificationV2Example |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Event | Paused(address) | 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | RejectProofResponse(uint256) | 0xe465e141fa8abd95ab7e0855543307f8506ab0170ef664420fb71ab7de0183de | +| Event | RejectProofResponse(uint256,bytes) | 0x6f4b137679536c6081c7f024870327aa89b62a64182f2d41e4fbdee5e2248e86 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Event | Unpaused(address) | 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| @@ -1202,7 +1494,7 @@ InputVerificationV2Example |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Event | VerifyProofRequest(uint256,uint256,uint256,address,address,bytes,bytes) | 0xe2cafa1b8243311c0828833c7ddf9356c92a51a2246bcf68e13f22b15defdd99 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | VerifyProofResponse(uint256,bytes32[],bytes[]) | 0xfe2c43585786a5a658d2ec5df5dea3fb3385b77c94f60f724ff810896f419835 | +| Event | VerifyProofResponse(uint256,uint256,bytes32[],bytes[],bytes) | 0xf96a66bb08cf5450f5789d7343fa3b58d4a00a66ef2d0d0494f424b03b0abff2 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Error | AddressEmptyCode(address) | 0x9996b315 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| @@ -1228,11 +1520,15 @@ InputVerificationV2Example |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Error | HostChainNotRegistered(uint256) | 0xb6679c3b | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextProofRejection(uint256,uint256,uint8) | 0xf3225893 | +|----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextProofVerification(uint256,uint256,uint8) | 0xc0eedb7b | +|----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Error | InvalidInitialization() | 0xf92ee8a9 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorSigner(address) | 0x26cd75dc | +| Error | NotCoprocessorSignerFromContext(uint256,address) | 0x554f8c5f | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorTxSender(address) | 0x52d725f5 | +| Error | NotCoprocessorTxSenderFromContext(uint256,address) | 0x29a993c1 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Error | NotCustodianSigner(address) | 0x391672a7 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| @@ -1345,10 +1641,6 @@ KMSGenerationV2Example |----------+------------------------------------------------+--------------------------------------------------------------------| | Error | KmsAlreadySignedForPrepKeygen(uint256,address) | 0x33ca1fe3 | |----------+------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorSigner(address) | 0x26cd75dc | -|----------+------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorTxSender(address) | 0x52d725f5 | -|----------+------------------------------------------------+--------------------------------------------------------------------| | Error | NotCustodianSigner(address) | 0x391672a7 | |----------+------------------------------------------------+--------------------------------------------------------------------| | Error | NotCustodianTxSender(address) | 0xf924a0cf | @@ -1371,81 +1663,87 @@ KMSGenerationV2Example MultichainACLV2Example -╭----------+-----------------------------------------------------------+--------------------------------------------------------------------╮ -| Type | Signature | Selector | -+===========================================================================================================================================+ -| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | allowAccount(bytes32,address,bytes) | 0x294a8705 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | allowPublicDecrypt(bytes32,bytes) | 0xd90724b5 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getAllowAccountConsensusTxSenders(bytes32,address) | 0xae953186 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getAllowPublicDecryptConsensusTxSenders(bytes32) | 0x97c49a40 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getVersion() | 0x0d8e6e2c | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | initializeFromEmptyProxy() | 0x39f73810 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | isAccountAllowed(bytes32,address) | 0xc6528f69 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | isPublicDecryptAllowed(bytes32) | 0x0620326d | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | proxiableUUID() | 0x52d1902d | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Event | AllowAccount(bytes32,address) | 0x18f825f318ffa4ed5bf3f6ed24fd54d33378b0e9f16ddb37c3419691b2e16566 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Event | AllowPublicDecrypt(bytes32) | 0x0868eca75126ba0a46bbec5eefa883e20a13e6c7d936c9bf47ed886e2eb43d3a | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | AddressEmptyCode(address) | 0x9996b315 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | ContractsMaxLengthExceeded(uint256,uint256) | 0xa7db2751 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | CoprocessorAlreadyAllowedAccount(bytes32,address,address) | 0x6637e32d | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | CoprocessorAlreadyAllowedPublicDecrypt(bytes32,address) | 0xa6f04d26 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | ERC1967NonPayable() | 0xb398979f | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyContractAddresses() | 0x57cfa217 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | FailedCall() | 0xd6bda275 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | HostChainNotRegistered(uint256) | 0xb6679c3b | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidInitialization() | 0xf92ee8a9 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorSigner(address) | 0x26cd75dc | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCoprocessorTxSender(address) | 0x52d725f5 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCustodianSigner(address) | 0x391672a7 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotCustodianTxSender(address) | 0xf924a0cf | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotGatewayOwner(address) | 0x0e56cf3d | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializing() | 0xd7e6bcf8 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotKmsSigner(address) | 0x2a7c6ef6 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotKmsTxSender(address) | 0xaee86323 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | -╰----------+-----------------------------------------------------------+--------------------------------------------------------------------╯ +╭----------+----------------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++======================================================================================================================================================+ +| Function | UPGRADE_INTERFACE_VERSION() | 0xad3cb1cc | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | allowAccount(bytes32,address,bytes) | 0x294a8705 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | allowPublicDecrypt(bytes32,bytes) | 0xd90724b5 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getAllowAccountConsensusTxSenders(bytes32,address) | 0xae953186 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getAllowPublicDecryptConsensusTxSenders(bytes32) | 0x97c49a40 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | initializeFromEmptyProxy() | 0x39f73810 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isAccountAllowed(bytes32,address) | 0xc6528f69 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isPublicDecryptAllowed(bytes32) | 0x0620326d | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | proxiableUUID() | 0x52d1902d | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | reinitializeV2() | 0xc4115874 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | upgradeToAndCall(address,bytes) | 0x4f1ef286 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | AllowAccount(bytes32,address) | 0x18f825f318ffa4ed5bf3f6ed24fd54d33378b0e9f16ddb37c3419691b2e16566 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | AllowPublicDecrypt(bytes32) | 0x0868eca75126ba0a46bbec5eefa883e20a13e6c7d936c9bf47ed886e2eb43d3a | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Initialized(uint64) | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | AddressEmptyCode(address) | 0x9996b315 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContractsMaxLengthExceeded(uint256,uint256) | 0xa7db2751 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorAlreadyAllowedAccount(bytes32,address,address) | 0x6637e32d | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorAlreadyAllowedPublicDecrypt(bytes32,address) | 0xa6f04d26 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967InvalidImplementation(address) | 0x4c9c8ce3 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ERC1967NonPayable() | 0xb398979f | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyContractAddresses() | 0x57cfa217 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | FailedCall() | 0xd6bda275 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | HostChainNotRegistered(uint256) | 0xb6679c3b | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextAllowAccount(bytes32,address,uint256,uint8) | 0x13c95d8d | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextAllowPublicDecrypt(bytes32,uint256,uint8) | 0xaa7a2a97 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidInitialization() | 0xf92ee8a9 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCoprocessorSignerFromContext(uint256,address) | 0x554f8c5f | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCoprocessorTxSenderFromContext(uint256,address) | 0x29a993c1 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianSigner(address) | 0x391672a7 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCustodianTxSender(address) | 0xf924a0cf | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotGatewayOwner(address) | 0x0e56cf3d | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializing() | 0xd7e6bcf8 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotInitializingFromEmptyProxy() | 0x6f4f731f | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsSigner(address) | 0x2a7c6ef6 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotKmsTxSender(address) | 0xaee86323 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnauthorizedCallContext() | 0xe07c8dba | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UUPSUnsupportedProxiableUUID(bytes32) | 0xaa1d49a4 | +╰----------+----------------------------------------------------------------------+--------------------------------------------------------------------╯ PauserSet @@ -1481,209 +1779,280 @@ PauserSet ICiphertextCommits -╭----------+----------------------------------------------------------+--------------------------------------------------------------------╮ -| Type | Signature | Selector | -+==========================================================================================================================================+ -| Function | addCiphertextMaterial(bytes32,uint256,bytes32,bytes32) | 0x90f30354 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getAddCiphertextMaterialConsensusTxSenders(bytes32) | 0xe6f6ab94 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCiphertextMaterials(bytes32[]) | 0x55c4d997 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getSnsCiphertextMaterials(bytes32[]) | 0xa14f8971 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getVersion() | 0x0d8e6e2c | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCiphertextMaterialAdded(bytes32) | 0x2ddc9a6f | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Event | AddCiphertextMaterial(bytes32,bytes32,bytes32,address[]) | 0xcb89ccb347018d7f282bb4c048e135e19bc1d13660fa0f2850e10518422536de | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | CiphertextMaterialNotFound(bytes32) | 0x0666cbdf | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Error | CoprocessorAlreadyAdded(bytes32,address) | 0x1dd7250c | -╰----------+----------------------------------------------------------+--------------------------------------------------------------------╯ +╭----------+---------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++===============================================================================================================================================+ +| Function | addCiphertextMaterial(bytes32,uint256,bytes32,bytes32) | 0x90f30354 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCiphertextMaterials(bytes32[]) | 0x55c4d997 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getConsensusCoprocessorTxSenders(bytes32) | 0xe4bb288c | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getSnsCiphertextMaterials(bytes32[]) | 0xa14f8971 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCiphertextMaterialAdded(bytes32) | 0x2ddc9a6f | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Event | AddCiphertextMaterial(bytes32,bytes32,bytes32,uint256) | 0xc3113162bedb887e086a25724f966348968a75efd447615ebfd0f715939ad964 | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CiphertextMaterialNotFound(bytes32) | 0x0666cbdf | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorAlreadyAdded(bytes32,address) | 0x1dd7250c | +|----------+---------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextAddCiphertext(bytes32,uint256,uint8) | 0x96346431 | +╰----------+---------------------------------------------------------------+--------------------------------------------------------------------╯ + + +ICoprocessorContexts + +╭----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++==============================================================================================================================================================================================================================================+ +| Function | addCoprocessorContext(bytes,(string,address,address,string)[],(uint256,uint256)) | 0xa1364d79 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | forceUpdateCoprocessorContextToStatus(uint256,uint8) | 0xcac6a5a8 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getActiveCoprocessorContext() | 0xfed9716b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getActiveCoprocessorContextId() | 0x991dc36d | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessor(uint256,address) | 0x820a91f8 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorActivationBlockTimestamp(uint256) | 0xb3f5403a | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorContextStatus(uint256) | 0x888b99e0 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorDeactivatedBlockTimestamp(uint256) | 0xa9b4d071 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorMajorityThreshold(uint256) | 0xf88174ea | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorSigners(uint256) | 0x41618fe9 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCoprocessorTxSenders(uint256) | 0x049f25ef | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getPreActivationCoprocessorContextId() | 0xbe91187b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getSuspendedCoprocessorContextId() | 0x086e4e1c | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCoprocessorContextOperating(uint256) | 0xcd8e993c | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCoprocessorSigner(uint256,address) | 0xcdbb5a82 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCoprocessorTxSender(uint256,address) | 0x8625e876 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | refreshCoprocessorContextStatuses() | 0x3a5162e6 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | swapSuspendedCoprocessorContextWithActive(uint256) | 0x86dfc7de | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | ActivateCoprocessorContext(uint256) | 0x6c8c04c9fea337720b7dfadca365e850035114fd081b58d030afbe8b5dc3be71 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | CompromiseCoprocessorContext(uint256) | 0xee7ef83963417125d27430789fc6e94194381e82c3cda68260d0e7cfc31eaf21 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | DeactivateCoprocessorContext(uint256) | 0x1baa08d8de18e8e2287691b1309748010981ebdfd12a173d8574657548a52898 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | DestroyCoprocessorContext(uint256) | 0xf20b299804c9c1d6da3b82414c7aa0a845cdbabae2d90e46e360a379a77b7be5 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | InitializeCoprocessorContexts(bytes,(string,address,address,string)[]) | 0xd474068ecf914caa04868493bcefa56bfb049a54f1612c2726d112e1e60663b9 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | NewCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256)) | 0xbbb104c495886e5daa3efb6b281ec2840c69385af5cbfc1582fcf700de1ecd4b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | PreActivateCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),uint256) | 0x0425f54e602cbcf87fafd6a0b557fa5c4bc4bc6c251686255eb3bd775f452377 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | SuspendCoprocessorContext(uint256,uint256) | 0x3080f2b80dda4748ca2926a641fa5007735058dc5f5ab2594eeca74197a3accc | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorContextNotInitialized(uint256) | 0xabf9e7b0 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorSignerAddressesNotUnique(address,uint256,(string,address,address,string)[]) | 0xc826e1a2 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorTxSenderAddressesNotUnique(address,uint256,(string,address,address,string)[]) | 0x64d52759 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyCoprocessors() | 0x8af082ef | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidContextStatusForceUpdate(uint256,uint8) | 0xf0bed68f | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NoActiveCoprocessorContext() | 0x046593ea | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NoPreActivationCoprocessorContext() | 0xb9e861b2 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NoSuspendedCoprocessorContext() | 0x21fb08f9 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotCoprocessorFromContext(uint256,address) | 0xc312e73e | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NullCoprocessorSignerAddress(uint256,(string,address,address,string)[]) | 0x4a6c5974 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NullCoprocessorTxSenderAddress(uint256,(string,address,address,string)[]) | 0x9edb7861 | +╰----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ IDecryption -╭----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ -| Type | Signature | Selector | -+============================================================================================================================================================================================+ -| Function | getDecryptionConsensusTxSenders(uint256) | 0x0900cc69 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getVersion() | 0x0d8e6e2c | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isDecryptionDone(uint256) | 0x58f5b8ab | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isPublicDecryptionReady(bytes32[],bytes) | 0x4014c4cd | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isUserDecryptionReady(address,(bytes32,address)[],bytes) | 0xfbb83259 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | publicDecryptionRequest(bytes32[],bytes) | 0xd8998f45 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | publicDecryptionResponse(uint256,bytes,bytes,bytes) | 0x6f8913bc | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | userDecryptionRequest((bytes32,address)[],(uint256,uint256),(uint256,address[]),address,bytes,bytes,bytes) | 0xf1b57adb | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | userDecryptionResponse(uint256,bytes,bytes,bytes) | 0x046f9eb3 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],bytes) | 0x22db480a39bd72556438aadb4a32a3d2a6638b87c03bbec5fef6997e109587ff | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | PublicDecryptionResponse(uint256,bytes,bytes[],bytes) | 0xd7e58a367a0a6c298e76ad5d240004e327aa1423cbe4bd7ff85d4c715ef8d15f | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],address,bytes,bytes) | 0xf9011bd6ba0da6049c520d70fe5971f17ed7ab795486052544b51019896c596b | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UserDecryptionResponse(uint256,uint256,bytes,bytes,bytes) | 0x7fcdfb5381917f554a717d0a5470a33f5a49ba6445f05ec43c74c0bc2cc608b2 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UserDecryptionResponseThresholdReached(uint256) | 0xe89752be0ecdb68b2a6eb5ef1a891039e0e92ae3c8a62274c5881e48eea1ed25 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ContractAddressesMaxLengthExceeded(uint256,uint256) | 0xaf1f0495 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ContractNotInContractAddresses(address,address[]) | 0xa4c30391 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | DecryptionNotRequested(uint256) | 0xd48af942 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | DifferentKeyIdsNotAllowed((bytes32,uint256,bytes32,address[]),(bytes32,uint256,bytes32,address[])) | 0xcfae921f | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyContractAddresses() | 0x57cfa217 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyCtHandleContractPairs() | 0xa6a6cb21 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyCtHandles() | 0x2de75438 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullDurationDays() | 0xde2859c1 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidUserSignature(bytes) | 0x2a873d27 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | KmsNodeAlreadySigned(uint256,address) | 0x99ec48d9 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | MaxDecryptionRequestBitSizeExceeded(uint256,uint256) | 0xe7f4895d | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | MaxDurationDaysExceeded(uint256,uint256) | 0x32951863 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | StartTimestampInFuture(uint256,uint256) | 0xf24c0887 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UserAddressInContractAddresses(address,address[]) | 0xdc4d78b1 | -|----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | UserDecryptionRequestExpired(uint256,(uint256,uint256)) | 0x30348040 | -╰----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ +╭----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++====================================================================================================================================================================================================+ +| Function | getDecryptionConsensusTxSenders(uint256) | 0x0900cc69 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isDecryptionDone(uint256) | 0x58f5b8ab | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isPublicDecryptionReady(bytes32[],bytes) | 0x4014c4cd | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isUserDecryptionReady(address,(bytes32,address)[],bytes) | 0xfbb83259 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | publicDecryptionRequest(bytes32[],bytes) | 0xd8998f45 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | publicDecryptionResponse(uint256,bytes,bytes,bytes) | 0x6f8913bc | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | userDecryptionRequest((bytes32,address)[],(uint256,uint256),(uint256,address[]),address,bytes,bytes,bytes) | 0xf1b57adb | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | userDecryptionResponse(uint256,bytes,bytes,bytes) | 0x046f9eb3 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],bytes) | 0xf1b11be50c03123b97d816b2941afe78c72cbaefeff5531fd1ef80ed6d2ecca8 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | PublicDecryptionResponse(uint256,bytes,bytes[],bytes) | 0xd7e58a367a0a6c298e76ad5d240004e327aa1423cbe4bd7ff85d4c715ef8d15f | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],address,bytes,bytes) | 0x953b685968a1a7c5f0dfb3ded7daa9f4f6b8f2d81fe33e4d272623d10e783eb8 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UserDecryptionResponse(uint256,uint256,bytes,bytes,bytes) | 0x7fcdfb5381917f554a717d0a5470a33f5a49ba6445f05ec43c74c0bc2cc608b2 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UserDecryptionResponseThresholdReached(uint256) | 0xe89752be0ecdb68b2a6eb5ef1a891039e0e92ae3c8a62274c5881e48eea1ed25 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContractAddressesMaxLengthExceeded(uint256,uint256) | 0xaf1f0495 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContractNotInContractAddresses(address,address[]) | 0xa4c30391 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | DecryptionNotRequested(uint256) | 0xd48af942 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | DifferentKeyIdsNotAllowed((bytes32,uint256,bytes32,address[],uint256),(bytes32,uint256,bytes32,address[],uint256)) | 0xc2eddf9d | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyContractAddresses() | 0x57cfa217 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyCtHandleContractPairs() | 0xa6a6cb21 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyCtHandles() | 0x2de75438 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullDurationDays() | 0xde2859c1 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidUserSignature(bytes) | 0x2a873d27 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | KmsNodeAlreadySigned(uint256,address) | 0x99ec48d9 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | MaxDecryptionRequestBitSizeExceeded(uint256,uint256) | 0xe7f4895d | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | MaxDurationDaysExceeded(uint256,uint256) | 0x32951863 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | StartTimestampInFuture(uint256,uint256) | 0xf24c0887 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UserAddressInContractAddresses(address,address[]) | 0xdc4d78b1 | +|----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | UserDecryptionRequestExpired(uint256,(uint256,uint256)) | 0x30348040 | +╰----------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ IGatewayConfig -╭----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ -| Type | Signature | Selector | -+=========================================================================================================================================================================================================================+ -| Function | addHostChain((uint256,address,address,string,string)) | 0xc80b33ca | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCoprocessor(address) | 0xef6997f9 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCoprocessorMajorityThreshold() | 0x6799ef52 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCoprocessorSigners() | 0x9164d0ae | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCoprocessorTxSenders() | 0x1ea5bd42 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCustodian(address) | 0xcb5aa7e9 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCustodianSigners() | 0xba1f31d2 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getCustodianTxSenders() | 0x2a8b9de9 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getHostChain(uint256) | 0xd10f7ff9 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getHostChains() | 0x2585bb65 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getKmsGenThreshold() | 0xb4722bc4 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getKmsNode(address) | 0xe3b2a874 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getKmsSigners() | 0x7eaac8f2 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getKmsTxSenders() | 0x7420f3d4 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getMpcThreshold() | 0x26cf5def | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getProtocolMetadata() | 0x48144c61 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getPublicDecryptionThreshold() | 0x2a388998 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getUserDecryptionThreshold() | 0xc2b42986 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | getVersion() | 0x0d8e6e2c | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCoprocessorSigner(address) | 0x2b101c03 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCoprocessorTxSender(address) | 0x2dd3edfe | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCustodianSigner(address) | 0x882d7dd3 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isCustodianTxSender(address) | 0x5bace7ff | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isHostChainRegistered(uint256) | 0xbff3aaba | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isKmsSigner(address) | 0x203d0114 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isKmsTxSender(address) | 0xe5275eaf | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | isPauser(address) | 0x46fbf68e | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | pauseAllGatewayContracts() | 0x9a5a3bc4 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | unpauseAllGatewayContracts() | 0x798b58a6 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updateKmsGenThreshold(uint256) | 0x0724dd23 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updateMpcThreshold(uint256) | 0x772d2fe9 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updatePublicDecryptionThreshold(uint256) | 0x2e2d3a82 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updateUserDecryptionThreshold(uint256) | 0xeb843cf6 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | AddHostChain((uint256,address,address,string,string)) | 0x66769341effd268fc4e9a9c8f27bfc968507b519b0ddb9b4ad3ded5f03016837 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,string)[],(address,address,bytes)[]) | 0x3a7c54b1195d44a288f9c3c9a0679aed9325068e0d0d5b69e96047355cc71745 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | PauseAllGatewayContracts() | 0x13dbe8823219e226dd0525aeb071e1d2679f89382ba799f7f644867e65b6f3a6 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UnpauseAllGatewayContracts() | 0xbe4f655daae0dbaef63a6b525cab2fa6ace4aa5b94b8834b241137cdfe73a5b0 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdateKmsGenThreshold(uint256) | 0x30c9b1d004f57eae3c6cc3a3752bcb4c8ea2e57c8241a782aa9b65fbc604ec5b | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdateMpcThreshold(uint256) | 0x3571172a49e72d7724be384cdd59f4f21a216c70352ea59cb02543fc76308437 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdatePublicDecryptionThreshold(uint256) | 0xe41802af725729adcb8c151e2937380a25c69155757e3af5d3979adab5035800 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdateUserDecryptionThreshold(uint256) | 0x837e0a6528dadfa2dc792692c5182e52a9f5bbdeed7b2372927a26c695839613 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | ChainIdNotUint64(uint256) | 0x4178de42 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyCoprocessors() | 0x8af082ef | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyCustodians() | 0xcad1d534 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyKmsNodes() | 0x068c8d40 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | HostChainAlreadyRegistered(uint256) | 0x96a56828 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidHighKmsGenThreshold(uint256,uint256) | 0x0f69cbfc | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidHighMpcThreshold(uint256,uint256) | 0x907e6681 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidHighPublicDecryptionThreshold(uint256,uint256) | 0x84208f23 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidHighUserDecryptionThreshold(uint256,uint256) | 0xd2535e11 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullChainId() | 0x22f73fea | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullKmsGenThreshold() | 0x3ee50774 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullPublicDecryptionThreshold() | 0xb1ae92ea | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | InvalidNullUserDecryptionThreshold() | 0xe60a7271 | -|----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Error | NotPauser(address) | 0x206a346e | -╰----------+-----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ +╭----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++==============================================================================================================================================================================================+ +| Function | addHostChain((uint256,address,address,string,string)) | 0xc80b33ca | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCustodian(address) | 0xcb5aa7e9 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCustodianSigners() | 0xba1f31d2 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getCustodianTxSenders() | 0x2a8b9de9 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getHostChain(uint256) | 0xd10f7ff9 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getHostChains() | 0x2585bb65 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getKmsGenThreshold() | 0xb4722bc4 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getKmsNode(address) | 0xe3b2a874 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getKmsSigners() | 0x7eaac8f2 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getKmsTxSenders() | 0x7420f3d4 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getMpcThreshold() | 0x26cf5def | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getProtocolMetadata() | 0x48144c61 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getPublicDecryptionThreshold() | 0x2a388998 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getUserDecryptionThreshold() | 0xc2b42986 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCustodianSigner(address) | 0x882d7dd3 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isCustodianTxSender(address) | 0x5bace7ff | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isHostChainRegistered(uint256) | 0xbff3aaba | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isKmsSigner(address) | 0x203d0114 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isKmsTxSender(address) | 0xe5275eaf | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isPauser(address) | 0x46fbf68e | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | pauseAllGatewayContracts() | 0x9a5a3bc4 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | unpauseAllGatewayContracts() | 0x798b58a6 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updateKmsGenThreshold(uint256) | 0x0724dd23 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updateMpcThreshold(uint256) | 0x772d2fe9 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updatePublicDecryptionThreshold(uint256) | 0x2e2d3a82 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updateUserDecryptionThreshold(uint256) | 0xeb843cf6 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | AddHostChain((uint256,address,address,string,string)) | 0x66769341effd268fc4e9a9c8f27bfc968507b519b0ddb9b4ad3ded5f03016837 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,bytes)[]) | 0xab58ab938892a1855d09c7c1390cabd4ca0405eaab322c5a82570770a719826e | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | PauseAllGatewayContracts() | 0x13dbe8823219e226dd0525aeb071e1d2679f89382ba799f7f644867e65b6f3a6 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UnpauseAllGatewayContracts() | 0xbe4f655daae0dbaef63a6b525cab2fa6ace4aa5b94b8834b241137cdfe73a5b0 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdateKmsGenThreshold(uint256) | 0x30c9b1d004f57eae3c6cc3a3752bcb4c8ea2e57c8241a782aa9b65fbc604ec5b | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdateMpcThreshold(uint256) | 0x3571172a49e72d7724be384cdd59f4f21a216c70352ea59cb02543fc76308437 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdatePublicDecryptionThreshold(uint256) | 0xe41802af725729adcb8c151e2937380a25c69155757e3af5d3979adab5035800 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdateUserDecryptionThreshold(uint256) | 0x837e0a6528dadfa2dc792692c5182e52a9f5bbdeed7b2372927a26c695839613 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ChainIdNotUint64(uint256) | 0x4178de42 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyCustodians() | 0xcad1d534 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyKmsNodes() | 0x068c8d40 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | HostChainAlreadyRegistered(uint256) | 0x96a56828 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidHighKmsGenThreshold(uint256,uint256) | 0x0f69cbfc | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidHighMpcThreshold(uint256,uint256) | 0x907e6681 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidHighPublicDecryptionThreshold(uint256,uint256) | 0x84208f23 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidHighUserDecryptionThreshold(uint256,uint256) | 0xd2535e11 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullChainId() | 0x22f73fea | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullKmsGenThreshold() | 0x3ee50774 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullPublicDecryptionThreshold() | 0xb1ae92ea | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidNullUserDecryptionThreshold() | 0xe60a7271 | +|----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | NotPauser(address) | 0x206a346e | +╰----------+--------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ IInputVerification @@ -1707,16 +2076,20 @@ IInputVerification |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Function | verifyProofResponse(uint256,bytes32[],bytes,bytes) | 0x31bedea3 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | RejectProofResponse(uint256) | 0xe465e141fa8abd95ab7e0855543307f8506ab0170ef664420fb71ab7de0183de | +| Event | RejectProofResponse(uint256,bytes) | 0x6f4b137679536c6081c7f024870327aa89b62a64182f2d41e4fbdee5e2248e86 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Event | VerifyProofRequest(uint256,uint256,uint256,address,address,bytes,bytes) | 0xe2cafa1b8243311c0828833c7ddf9356c92a51a2246bcf68e13f22b15defdd99 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | VerifyProofResponse(uint256,bytes32[],bytes[]) | 0xfe2c43585786a5a658d2ec5df5dea3fb3385b77c94f60f724ff810896f419835 | +| Event | VerifyProofResponse(uint256,uint256,bytes32[],bytes[],bytes) | 0xf96a66bb08cf5450f5789d7343fa3b58d4a00a66ef2d0d0494f424b03b0abff2 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Error | CoprocessorAlreadyRejected(uint256,address,address) | 0x2fa73174 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Error | CoprocessorAlreadyVerified(uint256,address,address) | 0xf9ed431f | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextProofRejection(uint256,uint256,uint8) | 0xf3225893 | +|----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextProofVerification(uint256,uint256,uint8) | 0xc0eedb7b | +|----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Error | VerifyProofNotRequested(uint256) | 0x4711083f | ╰----------+-------------------------------------------------------------------------+--------------------------------------------------------------------╯ @@ -1776,35 +2149,39 @@ IKMSGeneration IMultichainACL -╭----------+-----------------------------------------------------------+--------------------------------------------------------------------╮ -| Type | Signature | Selector | -+===========================================================================================================================================+ -| Function | allowAccount(bytes32,address,bytes) | 0x294a8705 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | allowPublicDecrypt(bytes32,bytes) | 0xd90724b5 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getAllowAccountConsensusTxSenders(bytes32,address) | 0xae953186 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getAllowPublicDecryptConsensusTxSenders(bytes32) | 0x97c49a40 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | getVersion() | 0x0d8e6e2c | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | isAccountAllowed(bytes32,address) | 0xc6528f69 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Function | isPublicDecryptAllowed(bytes32) | 0x0620326d | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Event | AllowAccount(bytes32,address) | 0x18f825f318ffa4ed5bf3f6ed24fd54d33378b0e9f16ddb37c3419691b2e16566 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Event | AllowPublicDecrypt(bytes32) | 0x0868eca75126ba0a46bbec5eefa883e20a13e6c7d936c9bf47ed886e2eb43d3a | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | ContractsMaxLengthExceeded(uint256,uint256) | 0xa7db2751 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | CoprocessorAlreadyAllowedAccount(bytes32,address,address) | 0x6637e32d | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | CoprocessorAlreadyAllowedPublicDecrypt(bytes32,address) | 0xa6f04d26 | -|----------+-----------------------------------------------------------+--------------------------------------------------------------------| -| Error | EmptyContractAddresses() | 0x57cfa217 | -╰----------+-----------------------------------------------------------+--------------------------------------------------------------------╯ +╭----------+----------------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++======================================================================================================================================================+ +| Function | allowAccount(bytes32,address,bytes) | 0x294a8705 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | allowPublicDecrypt(bytes32,bytes) | 0xd90724b5 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getAllowAccountConsensusTxSenders(bytes32,address) | 0xae953186 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getAllowPublicDecryptConsensusTxSenders(bytes32) | 0x97c49a40 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | getVersion() | 0x0d8e6e2c | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isAccountAllowed(bytes32,address) | 0xc6528f69 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | isPublicDecryptAllowed(bytes32) | 0x0620326d | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | AllowAccount(bytes32,address) | 0x18f825f318ffa4ed5bf3f6ed24fd54d33378b0e9f16ddb37c3419691b2e16566 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | AllowPublicDecrypt(bytes32) | 0x0868eca75126ba0a46bbec5eefa883e20a13e6c7d936c9bf47ed886e2eb43d3a | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | ContractsMaxLengthExceeded(uint256,uint256) | 0xa7db2751 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorAlreadyAllowedAccount(bytes32,address,address) | 0x6637e32d | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | CoprocessorAlreadyAllowedPublicDecrypt(bytes32,address) | 0xa6f04d26 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | EmptyContractAddresses() | 0x57cfa217 | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextAllowAccount(bytes32,address,uint256,uint8) | 0x13c95d8d | +|----------+----------------------------------------------------------------------+--------------------------------------------------------------------| +| Error | InvalidCoprocessorContextAllowPublicDecrypt(bytes32,uint256,uint8) | 0xaa7a2a97 | +╰----------+----------------------------------------------------------------------+--------------------------------------------------------------------╯ IPauserSet @@ -1834,6 +2211,37 @@ IPauserSet ╰----------+-------------------------------+--------------------------------------------------------------------╯ +ContextLifecycle + +╭-------+--------------------------------------------+------------╮ +| Type | Signature | Selector | ++=================================================================+ +| Error | ActiveContextOngoing(uint256) | 0x7eea432b | +|-------+--------------------------------------------+------------| +| Error | ContextAlreadyExists(uint256) | 0x6653f6d7 | +|-------+--------------------------------------------+------------| +| Error | ContextDoesNotExist(uint256) | 0x61544cfc | +|-------+--------------------------------------------+------------| +| Error | ContextIsActive(uint256) | 0xcd494e49 | +|-------+--------------------------------------------+------------| +| Error | ContextIsGenerating(uint256) | 0x0ddd14ca | +|-------+--------------------------------------------+------------| +| Error | ContextNotActive(uint256) | 0x331486b3 | +|-------+--------------------------------------------+------------| +| Error | ContextNotGenerated(uint256) | 0xc0b5ee66 | +|-------+--------------------------------------------+------------| +| Error | ContextNotPreActivatedOrSuspended(uint256) | 0x12b49e3d | +|-------+--------------------------------------------+------------| +| Error | ContextNotSuspended(uint256) | 0x77bf5846 | +|-------+--------------------------------------------+------------| +| Error | InvalidNullContextId() | 0xcb17b7a5 | +|-------+--------------------------------------------+------------| +| Error | PreActivationContextOngoing(uint256) | 0xc470c022 | +|-------+--------------------------------------------+------------| +| Error | SuspendedContextOngoing(uint256) | 0x7022ec41 | +╰-------+--------------------------------------------+------------╯ + + FHETypeBitSizes ╭-------+---------------------------+------------╮ @@ -1854,13 +2262,46 @@ HandleOps CiphertextCommitsMock -╭----------+----------------------------------------------------------+--------------------------------------------------------------------╮ -| Type | Signature | Selector | -+==========================================================================================================================================+ -| Function | addCiphertextMaterial(bytes32,uint256,bytes32,bytes32) | 0x90f30354 | -|----------+----------------------------------------------------------+--------------------------------------------------------------------| -| Event | AddCiphertextMaterial(bytes32,bytes32,bytes32,address[]) | 0xcb89ccb347018d7f282bb4c048e135e19bc1d13660fa0f2850e10518422536de | -╰----------+----------------------------------------------------------+--------------------------------------------------------------------╯ +╭----------+--------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++========================================================================================================================================+ +| Function | addCiphertextMaterial(bytes32,uint256,bytes32,bytes32) | 0x90f30354 | +|----------+--------------------------------------------------------+--------------------------------------------------------------------| +| Event | AddCiphertextMaterial(bytes32,bytes32,bytes32,uint256) | 0xc3113162bedb887e086a25724f966348968a75efd447615ebfd0f715939ad964 | +╰----------+--------------------------------------------------------+--------------------------------------------------------------------╯ + + +CoprocessorContextsMock + +╭----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++==============================================================================================================================================================================================================================================+ +| Function | addCoprocessorContext(bytes,(string,address,address,string)[],(uint256,uint256)) | 0xa1364d79 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | forceUpdateCoprocessorContextToStatus(uint256,uint8) | 0xcac6a5a8 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | initializeFromEmptyProxy(bytes,(string,address,address,string)[]) | 0xecfb0b94 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | refreshCoprocessorContextStatuses() | 0x3a5162e6 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | swapSuspendedCoprocessorContextWithActive(uint256) | 0x86dfc7de | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | ActivateCoprocessorContext(uint256) | 0x6c8c04c9fea337720b7dfadca365e850035114fd081b58d030afbe8b5dc3be71 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | CompromiseCoprocessorContext(uint256) | 0xee7ef83963417125d27430789fc6e94194381e82c3cda68260d0e7cfc31eaf21 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | DeactivateCoprocessorContext(uint256) | 0x1baa08d8de18e8e2287691b1309748010981ebdfd12a173d8574657548a52898 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | DestroyCoprocessorContext(uint256) | 0xf20b299804c9c1d6da3b82414c7aa0a845cdbabae2d90e46e360a379a77b7be5 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | InitializeCoprocessorContexts(bytes,(string,address,address,string)[]) | 0xd474068ecf914caa04868493bcefa56bfb049a54f1612c2726d112e1e60663b9 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | NewCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256,bytes,(string,address,address,string)[]),(uint256,uint256)) | 0xbbb104c495886e5daa3efb6b281ec2840c69385af5cbfc1582fcf700de1ecd4b | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | PreActivateCoprocessorContext((uint256,uint256,bytes,(string,address,address,string)[]),uint256) | 0x0425f54e602cbcf87fafd6a0b557fa5c4bc4bc6c251686255eb3bd775f452377 | +|----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | SuspendCoprocessorContext(uint256,uint256) | 0x3080f2b80dda4748ca2926a641fa5007735058dc5f5ab2594eeca74197a3accc | +╰----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ DecryptionMock @@ -1876,11 +2317,11 @@ DecryptionMock |----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| | Function | userDecryptionResponse(uint256,bytes,bytes,bytes) | 0x046f9eb3 | |----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],bytes) | 0x22db480a39bd72556438aadb4a32a3d2a6638b87c03bbec5fef6997e109587ff | +| Event | PublicDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],bytes) | 0xf1b11be50c03123b97d816b2941afe78c72cbaefeff5531fd1ef80ed6d2ecca8 | |----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| | Event | PublicDecryptionResponse(uint256,bytes,bytes[],bytes) | 0xd7e58a367a0a6c298e76ad5d240004e327aa1423cbe4bd7ff85d4c715ef8d15f | |----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[])[],address,bytes,bytes) | 0xf9011bd6ba0da6049c520d70fe5971f17ed7ab795486052544b51019896c596b | +| Event | UserDecryptionRequest(uint256,(bytes32,uint256,bytes32,address[],uint256)[],address,bytes,bytes) | 0x953b685968a1a7c5f0dfb3ded7daa9f4f6b8f2d81fe33e4d272623d10e783eb8 | |----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| | Event | UserDecryptionResponse(uint256,uint256,bytes,bytes,bytes) | 0x7fcdfb5381917f554a717d0a5470a33f5a49ba6445f05ec43c74c0bc2cc608b2 | |----------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| @@ -1890,41 +2331,41 @@ DecryptionMock GatewayConfigMock -╭----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ -| Type | Signature | Selector | -+==================================================================================================================================================================================================================================================+ -| Function | addHostChain((uint256,address,address,string,string)) | 0xc80b33ca | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | initializeFromEmptyProxy((string,string),uint256,uint256,uint256,uint256,(address,address,string,string)[],(address,address,string)[],(address,address,bytes)[]) | 0x8b8dd876 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | pauseAllGatewayContracts() | 0x9a5a3bc4 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | unpauseAllGatewayContracts() | 0x798b58a6 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updateKmsGenThreshold(uint256) | 0x0724dd23 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updateMpcThreshold(uint256) | 0x772d2fe9 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updatePublicDecryptionThreshold(uint256) | 0x2e2d3a82 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Function | updateUserDecryptionThreshold(uint256) | 0xeb843cf6 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | AddHostChain((uint256,address,address,string,string)) | 0x66769341effd268fc4e9a9c8f27bfc968507b519b0ddb9b4ad3ded5f03016837 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,string)[],(address,address,bytes)[]) | 0x3a7c54b1195d44a288f9c3c9a0679aed9325068e0d0d5b69e96047355cc71745 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | PauseAllGatewayContracts() | 0x13dbe8823219e226dd0525aeb071e1d2679f89382ba799f7f644867e65b6f3a6 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UnpauseAllGatewayContracts() | 0xbe4f655daae0dbaef63a6b525cab2fa6ace4aa5b94b8834b241137cdfe73a5b0 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdateKmsGenThreshold(uint256) | 0x30c9b1d004f57eae3c6cc3a3752bcb4c8ea2e57c8241a782aa9b65fbc604ec5b | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdateMpcThreshold(uint256) | 0x3571172a49e72d7724be384cdd59f4f21a216c70352ea59cb02543fc76308437 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdatePublicDecryptionThreshold(uint256) | 0xe41802af725729adcb8c151e2937380a25c69155757e3af5d3979adab5035800 | -|----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | UpdateUserDecryptionThreshold(uint256) | 0x837e0a6528dadfa2dc792692c5182e52a9f5bbdeed7b2372927a26c695839613 | -╰----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ +╭----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮ +| Type | Signature | Selector | ++=======================================================================================================================================================================================================================+ +| Function | addHostChain((uint256,address,address,string,string)) | 0xc80b33ca | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | initializeFromEmptyProxy((string,string),uint256,uint256,uint256,uint256,(address,address,string,string)[],(address,address,bytes)[]) | 0xaeb1a21c | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | pauseAllGatewayContracts() | 0x9a5a3bc4 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | unpauseAllGatewayContracts() | 0x798b58a6 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updateKmsGenThreshold(uint256) | 0x0724dd23 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updateMpcThreshold(uint256) | 0x772d2fe9 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updatePublicDecryptionThreshold(uint256) | 0x2e2d3a82 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Function | updateUserDecryptionThreshold(uint256) | 0xeb843cf6 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | AddHostChain((uint256,address,address,string,string)) | 0x66769341effd268fc4e9a9c8f27bfc968507b519b0ddb9b4ad3ded5f03016837 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | InitializeGatewayConfig((string,string),uint256,(address,address,string,string)[],(address,address,bytes)[]) | 0xab58ab938892a1855d09c7c1390cabd4ca0405eaab322c5a82570770a719826e | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | PauseAllGatewayContracts() | 0x13dbe8823219e226dd0525aeb071e1d2679f89382ba799f7f644867e65b6f3a6 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UnpauseAllGatewayContracts() | 0xbe4f655daae0dbaef63a6b525cab2fa6ace4aa5b94b8834b241137cdfe73a5b0 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdateKmsGenThreshold(uint256) | 0x30c9b1d004f57eae3c6cc3a3752bcb4c8ea2e57c8241a782aa9b65fbc604ec5b | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdateMpcThreshold(uint256) | 0x3571172a49e72d7724be384cdd59f4f21a216c70352ea59cb02543fc76308437 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdatePublicDecryptionThreshold(uint256) | 0xe41802af725729adcb8c151e2937380a25c69155757e3af5d3979adab5035800 | +|----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------| +| Event | UpdateUserDecryptionThreshold(uint256) | 0x837e0a6528dadfa2dc792692c5182e52a9f5bbdeed7b2372927a26c695839613 | +╰----------+---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯ InputVerificationMock @@ -1938,11 +2379,11 @@ InputVerificationMock |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Function | verifyProofResponse(uint256,bytes32[],bytes,bytes) | 0x31bedea3 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | RejectProofResponse(uint256) | 0xe465e141fa8abd95ab7e0855543307f8506ab0170ef664420fb71ab7de0183de | +| Event | RejectProofResponse(uint256,bytes) | 0x6f4b137679536c6081c7f024870327aa89b62a64182f2d41e4fbdee5e2248e86 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| | Event | VerifyProofRequest(uint256,uint256,uint256,address,address,bytes,bytes) | 0xe2cafa1b8243311c0828833c7ddf9356c92a51a2246bcf68e13f22b15defdd99 | |----------+-------------------------------------------------------------------------+--------------------------------------------------------------------| -| Event | VerifyProofResponse(uint256,bytes32[],bytes[]) | 0xfe2c43585786a5a658d2ec5df5dea3fb3385b77c94f60f724ff810896f419835 | +| Event | VerifyProofResponse(uint256,uint256,bytes32[],bytes[],bytes) | 0xf96a66bb08cf5450f5789d7343fa3b58d4a00a66ef2d0d0494f424b03b0abff2 | ╰----------+-------------------------------------------------------------------------+--------------------------------------------------------------------╯ @@ -1988,6 +2429,26 @@ MultichainACLMock ╰----------+-------------------------------------+--------------------------------------------------------------------╯ +CiphertextCommitsUtils + +╭-------+-------------------------------------+------------╮ +| Type | Signature | Selector | ++==========================================================+ +| Error | CiphertextMaterialNotAdded(bytes32) | 0x826b4638 | +╰-------+-------------------------------------+------------╯ + + +ContextChecks + +╭-------+----------------------------------------------------+------------╮ +| Type | Signature | Selector | ++=========================================================================+ +| Error | NotCoprocessorSignerFromContext(uint256,address) | 0x554f8c5f | +|-------+----------------------------------------------------+------------| +| Error | NotCoprocessorTxSenderFromContext(uint256,address) | 0x29a993c1 | +╰-------+----------------------------------------------------+------------╯ + + GatewayConfigChecks ╭-------+---------------------------------+------------╮ @@ -1995,10 +2456,6 @@ GatewayConfigChecks +======================================================+ | Error | HostChainNotRegistered(uint256) | 0xb6679c3b | |-------+---------------------------------+------------| -| Error | NotCoprocessorSigner(address) | 0x26cd75dc | -|-------+---------------------------------+------------| -| Error | NotCoprocessorTxSender(address) | 0x52d725f5 | -|-------+---------------------------------+------------| | Error | NotCustodianSigner(address) | 0x391672a7 | |-------+---------------------------------+------------| | Error | NotCustodianTxSender(address) | 0xf924a0cf | diff --git a/gateway-contracts/tasks/addHostChains.ts b/gateway-contracts/tasks/addHostChains.ts index b4ad214fa5..3f4edaefa6 100644 --- a/gateway-contracts/tasks/addHostChains.ts +++ b/gateway-contracts/tasks/addHostChains.ts @@ -40,13 +40,18 @@ task("task:addHostChainsToGatewayConfig") } const proxyAddress = getRequiredEnvVar("GATEWAY_CONFIG_ADDRESS"); + console.log("In GatewayConfig contract:", proxyAddress, "\n"); + // Add host chains const gatewayConfig = await hre.ethers.getContractAt("GatewayConfig", proxyAddress, deployer); for (const hostChain of hostChains) { - await gatewayConfig.addHostChain(hostChain); + console.log("Adding host chain: ", hostChain); + const tx = await gatewayConfig.addHostChain(hostChain); + + // Wait for confirmation before adding next host chain + await tx.wait(); + console.log("Host chain added !\n"); } - console.log("In GatewayConfig contract:", proxyAddress, "\n"); - console.log("Added host chains:", hostChains, "\n"); console.log("Host chains registration done!"); }); diff --git a/gateway-contracts/tasks/blockExplorerVerify.ts b/gateway-contracts/tasks/blockExplorerVerify.ts index c527b42eb7..56fb743074 100644 --- a/gateway-contracts/tasks/blockExplorerVerify.ts +++ b/gateway-contracts/tasks/blockExplorerVerify.ts @@ -77,6 +77,30 @@ task("task:verifyGatewayConfig") }); }); +task("task:verifyCoprocessorContexts") + .addOptionalParam( + "useInternalProxyAddress", + "If proxy address from the /addresses directory should be used", + false, + types.boolean, + ) + .setAction(async function ({ useInternalProxyAddress }, { upgrades, run }) { + if (useInternalProxyAddress) { + dotenv.config({ path: path.join(ADDRESSES_DIR, ".env.gateway"), override: true }); + } + const proxyAddress = getRequiredEnvVar("COPROCESSOR_CONTEXTS_ADDRESS"); + + const implementationAddress = await upgrades.erc1967.getImplementationAddress(proxyAddress); + await run("verify:verify", { + address: proxyAddress, + constructorArguments: [], + }); + await run("verify:verify", { + address: implementationAddress, + constructorArguments: [], + }); + }); + task("task:verifyInputVerification") .addOptionalParam( "useInternalProxyAddress", @@ -182,6 +206,7 @@ task("task:verifyAllGatewayContracts") } catch (error) { console.error("An error occurred:", error); } + try { // to not panic if Blockscout throws an error due to already verified implementation console.log("Verify InputVerification contract:"); @@ -189,6 +214,7 @@ task("task:verifyAllGatewayContracts") } catch (error) { console.error("An error occurred:", error); } + try { // to not panic if Blockscout throws an error due to already verified implementation console.log("Verify KMSGeneration contract:"); @@ -196,6 +222,7 @@ task("task:verifyAllGatewayContracts") } catch (error) { console.error("An error occurred:", error); } + try { // to not panic if Blockscout throws an error due to already verified implementation console.log("Verify CiphertextCommits contract:"); @@ -203,6 +230,7 @@ task("task:verifyAllGatewayContracts") } catch (error) { console.error("An error occurred:", error); } + try { // to not panic if Blockscout throws an error due to already verified implementation console.log("Verify MultichainACL contract:"); @@ -210,6 +238,7 @@ task("task:verifyAllGatewayContracts") } catch (error) { console.error("An error occurred:", error); } + try { // to not panic if Blockscout throws an error due to already verified implementation console.log("Verify Decryption contract:"); @@ -217,6 +246,7 @@ task("task:verifyAllGatewayContracts") } catch (error) { console.error("An error occurred:", error); } + try { // to not panic if Blockscout throws an error due to already verified implementation console.log("Verify PauserSet contract:"); @@ -224,10 +254,14 @@ task("task:verifyAllGatewayContracts") } catch (error) { console.error("An error occurred:", error); } + try { // to not panic if Blockscout throws an error due to already verified implementation - console.log("Contract verification done!"); + console.log("Verify CoprocessorContexts contract:"); + await hre.run("task:verifyCoprocessorContexts", { useInternalProxyAddress }); } catch (error) { console.error("An error occurred:", error); } + + console.log("Contract verification done!"); }); diff --git a/gateway-contracts/tasks/deployment/contracts.ts b/gateway-contracts/tasks/deployment/contracts.ts index 8aabb9d87c..7744eaabca 100644 --- a/gateway-contracts/tasks/deployment/contracts.ts +++ b/gateway-contracts/tasks/deployment/contracts.ts @@ -6,6 +6,7 @@ import { HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; import { ADDRESSES_DIR } from "../../hardhat.config"; +import { CoprocessorV2Struct } from "../../typechain-types/contracts/CoprocessorContexts"; import { getRequiredEnvVar } from "../utils/loadVariables"; import { pascalCaseToSnakeCase } from "../utils/stringOps"; import { GATEWAY_CONFIG_EMPTY_PROXY_NAME, REGULAR_EMPTY_PROXY_NAME } from "./utils"; @@ -94,17 +95,6 @@ task("task:deployGatewayConfig").setAction(async function (_, hre) { }); } - // Parse the coprocessors - const numCoprocessors = parseInt(getRequiredEnvVar("NUM_COPROCESSORS")); - const coprocessors = []; - for (let idx = 0; idx < numCoprocessors; idx++) { - coprocessors.push({ - txSenderAddress: getRequiredEnvVar(`COPROCESSOR_TX_SENDER_ADDRESS_${idx}`), - signerAddress: getRequiredEnvVar(`COPROCESSOR_SIGNER_ADDRESS_${idx}`), - s3BucketUrl: getRequiredEnvVar(`COPROCESSOR_S3_BUCKET_URL_${idx}`), - }); - } - // Parse the custodians const numCustodians = parseInt(getRequiredEnvVar("NUM_CUSTODIANS")); const custodians = []; @@ -120,7 +110,6 @@ task("task:deployGatewayConfig").setAction(async function (_, hre) { console.log("Public decryption threshold:", publicDecryptionThreshold); console.log("User decryption threshold:", userDecryptionThreshold); console.log("KMS nodes:", kmsNodes); - console.log("Coprocessors:", coprocessors); console.log("Custodians:", custodians); // The GatewayConfig contract is not deployed using the same empty proxy as the other contracts, @@ -132,11 +121,34 @@ task("task:deployGatewayConfig").setAction(async function (_, hre) { userDecryptionThreshold, kmsGenThreshold, kmsNodes, - coprocessors, custodians, ]); }); +// Deploy the CoprocessorContexts contract +task("task:deployCoprocessorContexts").setAction(async function (_, hre) { + // Parse the coprocessor feature set + const coprocessorsBlob = getRequiredEnvVar("COPROCESSORS_BLOB"); + + // Parse the coprocessors + const numCoprocessors = parseInt(getRequiredEnvVar("NUM_COPROCESSORS")); + const coprocessors: CoprocessorV2Struct[] = []; + for (let idx = 0; idx < numCoprocessors; idx++) { + coprocessors.push({ + name: getRequiredEnvVar(`COPROCESSOR_NAME_${idx}`), + txSenderAddress: getRequiredEnvVar(`COPROCESSOR_TX_SENDER_ADDRESS_${idx}`), + signerAddress: getRequiredEnvVar(`COPROCESSOR_SIGNER_ADDRESS_${idx}`), + storageUrl: getRequiredEnvVar(`COPROCESSOR_STORAGE_URL_${idx}`), + }); + } + console.log("Coprocessors:", coprocessors); + + await deployContractImplementation("CoprocessorContexts", hre, REGULAR_EMPTY_PROXY_NAME, [ + coprocessorsBlob, + coprocessors, + ]); +}); + // Deploy the InputVerification contract task("task:deployInputVerification").setAction(async function (_, hre) { await deployContractImplementation("InputVerification", hre, REGULAR_EMPTY_PROXY_NAME); @@ -180,6 +192,9 @@ task("task:deployAllGatewayContracts").setAction(async function (_, hre) { console.log("Deploy GatewayConfig contract:"); await hre.run("task:deployGatewayConfig"); + console.log("Deploy CoprocessorContexts contract:"); + await hre.run("task:deployCoprocessorContexts"); + console.log("Deploy InputVerification contract:"); await hre.run("task:deployInputVerification"); diff --git a/gateway-contracts/tasks/deployment/empty_proxies.ts b/gateway-contracts/tasks/deployment/empty_proxies.ts index c0d8fbe324..99eb98ebca 100644 --- a/gateway-contracts/tasks/deployment/empty_proxies.ts +++ b/gateway-contracts/tasks/deployment/empty_proxies.ts @@ -111,4 +111,11 @@ task("task:deployEmptyUUPSProxies").setAction(async function (_, { ethers, upgra name: "InputVerification", address: inputVerificationAddress, }); + + console.log("Deploying an EmptyUUPS proxy contract for CoprocessorContexts..."); + const coprocessorContextsAddress = await deployEmptyUUPS(ethers, upgrades, deployer); + await run("task:setContractAddress", { + name: "CoprocessorContexts", + address: coprocessorContextsAddress, + }); }); diff --git a/gateway-contracts/tasks/getters.ts b/gateway-contracts/tasks/getters.ts index cd1dc64e89..f62311891b 100644 --- a/gateway-contracts/tasks/getters.ts +++ b/gateway-contracts/tasks/getters.ts @@ -1,53 +1,116 @@ import dotenv from "dotenv"; -import fs from "fs"; -import { task } from "hardhat/config"; -import type { HardhatEthersHelpers, TaskArguments } from "hardhat/types"; - -import { GatewayConfig } from "../typechain-types"; - -async function loadGatewayConfigContract( - customGatewayConfigAddress: string | undefined, - ethers: HardhatEthersHelpers, -): Promise { - const gatewayConfigFactory = await ethers.getContractFactory("./contracts/GatewayConfig.sol:GatewayConfig"); - const gatewayConfigAddress = customGatewayConfigAddress - ? customGatewayConfigAddress - : dotenv.parse(fs.readFileSync("addresses/.env.gateway")).GATEWAY_CONFIG_ADDRESS; - return gatewayConfigFactory.attach(gatewayConfigAddress).connect(ethers.provider) as GatewayConfig; +import { task, types } from "hardhat/config"; +import type { HardhatEthersHelpers } from "hardhat/types"; +import path from "path"; + +import { ADDRESSES_DIR } from "../hardhat.config"; +import { CoprocessorContexts, GatewayConfig } from "../typechain-types"; +import { getRequiredEnvVar } from "./utils/loadVariables"; + +async function loadGatewayConfigContract(ethers: HardhatEthersHelpers): Promise { + const proxyAddress = getRequiredEnvVar("GATEWAY_CONFIG_ADDRESS"); + + console.log("In GatewayConfig contract:", proxyAddress, "\n"); + + const contract = await ethers.getContractAt("GatewayConfig", proxyAddress); + return contract as GatewayConfig; +} + +async function loadCoprocessorContextsContract(ethers: HardhatEthersHelpers): Promise { + const proxyAddress = getRequiredEnvVar("COPROCESSOR_CONTEXTS_ADDRESS"); + + console.log("In CoprocessorContexts contract:", proxyAddress, "\n"); + + const contract = await ethers.getContractAt("CoprocessorContexts", proxyAddress); + return contract as CoprocessorContexts; } task("task:getKmsSigners") .addOptionalParam( - "customGatewayConfigAddress", - "Use a custom address for the GatewayConfig contract instead of the default one - ie stored inside .env.gateway", + "useInternalProxyAddress", + "If proxy address from the /addresses directory should be used", + false, + types.boolean, ) - .setAction(async function (taskArguments: TaskArguments, { ethers }) { - const gatewayConfig = await loadGatewayConfigContract(taskArguments.customGatewayConfigAddress, ethers); + .setAction(async function ({ useInternalProxyAddress }, hre) { + await hre.run("compile:specific", { contract: "contracts" }); + console.log("Get registered KMS signers"); + + if (useInternalProxyAddress) { + dotenv.config({ path: path.join(ADDRESSES_DIR, ".env.gateway"), override: true }); + } + const gatewayConfig = await loadGatewayConfigContract(hre.ethers); const listCurrentKMSSigners = await gatewayConfig.getKmsSigners(); - console.log("The list of current KMS Signers stored inside GatewayConfig contract is: ", listCurrentKMSSigners); + + console.log("Registered KMS signers: ", listCurrentKMSSigners); }); task("task:getCoprocessorSigners") .addOptionalParam( - "customGatewayConfigAddress", - "Use a custom address for the GatewayConfig contract instead of the default one - ie stored inside .env.gateway", + "useInternalProxyAddress", + "If proxy address from the /addresses directory should be used", + false, + types.boolean, + ) + .addOptionalParam( + "coprocessorContextId", + "The ID of the coprocessor context to get the signers from. If not provided, the active context will be used.", + undefined, + types.int, ) - .setAction(async function (taskArguments: TaskArguments, { ethers }) { - const gatewayConfig = await loadGatewayConfigContract(taskArguments.customGatewayConfigAddress, ethers); - const listCurrentCoprocessorSigners = await gatewayConfig.getCoprocessorSigners(); - console.log( - "The list of current Coprocessor Signers stored inside GatewayConfig contract is: ", - listCurrentCoprocessorSigners, - ); + .setAction(async function ({ useInternalProxyAddress, coprocessorContextId }, hre) { + await hre.run("compile:specific", { contract: "contracts" }); + if (coprocessorContextId) { + console.log("Getting registered coprocessor signers from coprocessor context: ", coprocessorContextId); + } else { + console.log("Getting registered coprocessor signers from active coprocessor context."); + } + + if (useInternalProxyAddress) { + dotenv.config({ path: path.join(ADDRESSES_DIR, ".env.gateway"), override: true }); + } + const coprocessorContexts = await loadCoprocessorContextsContract(hre.ethers); + const contextId = coprocessorContextId || (await coprocessorContexts.getActiveCoprocessorContextId()); + const listCurrentCoprocessorSigners = await coprocessorContexts.getCoprocessorSigners(contextId); + + console.log("Registered coprocessor signers for context ID ", contextId, ": ", listCurrentCoprocessorSigners); }); task("task:getHostChains") .addOptionalParam( - "customGatewayConfigAddress", - "Use a custom address for the GatewayConfig contract instead of the default one - ie stored inside .env.gateway", + "useInternalProxyAddress", + "If proxy address from the /addresses directory should be used", + false, + types.boolean, ) - .setAction(async function (taskArguments: TaskArguments, { ethers }) { - const gatewayConfig = await loadGatewayConfigContract(taskArguments.customGatewayConfigAddress, ethers); + .setAction(async function ({ useInternalProxyAddress }, hre) { + await hre.run("compile:specific", { contract: "contracts" }); + console.log("Get registered host chains"); + + if (useInternalProxyAddress) { + dotenv.config({ path: path.join(ADDRESSES_DIR, ".env.gateway"), override: true }); + } + const gatewayConfig = await loadGatewayConfigContract(hre.ethers); const listCurrentHostChains = await gatewayConfig.getHostChains(); - console.log("The list of current host chains stored inside GatewayConfig contract is: ", listCurrentHostChains); + + console.log("Registered host chains: ", listCurrentHostChains); + }); + +task("task:getAllRegisteredEntities") + .addOptionalParam( + "useInternalProxyAddress", + "If proxy address from the /addresses directory should be used", + false, + types.boolean, + ) + .addOptionalParam( + "coprocessorContextId", + "The ID of the coprocessor context to get the signers from. If not provided, the active context will be used.", + undefined, + types.int, + ) + .setAction(async function ({ useInternalProxyAddress, coprocessorContextId }, hre) { + await hre.run("task:getKmsSigners", { useInternalProxyAddress }); + await hre.run("task:getCoprocessorSigners", { useInternalProxyAddress, coprocessorContextId }); + await hre.run("task:getHostChains", { useInternalProxyAddress }); }); diff --git a/gateway-contracts/test/CiphertextCommits.ts b/gateway-contracts/test/CiphertextCommits.ts index c0c8b1842e..4a02330071 100644 --- a/gateway-contracts/test/CiphertextCommits.ts +++ b/gateway-contracts/test/CiphertextCommits.ts @@ -1,17 +1,27 @@ import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { loadFixture, time } from "@nomicfoundation/hardhat-network-helpers"; import { expect } from "chai"; -import { Wallet } from "ethers"; +import { HDNodeWallet, Wallet } from "ethers"; import hre from "hardhat"; -import { CiphertextCommits, CiphertextCommits__factory, GatewayConfig } from "../typechain-types"; import { + CiphertextCommits, + CiphertextCommits__factory, + CoprocessorContexts, + GatewayConfig, + InputVerification, +} from "../typechain-types"; +import { CoprocessorContextTimePeriodsStruct } from "../typechain-types/contracts/interfaces/ICoprocessorContexts"; +import { + ContextStatus, + addNewCoprocessorContext, createBytes32, createCtHandle, createCtHandles, createRandomWallet, loadHostChainIds, loadTestVariablesFixture, + refreshCoprocessorContextAfterTimePeriod, } from "./utils"; describe("CiphertextCommits", function () { @@ -31,6 +41,9 @@ describe("CiphertextCommits", function () { const ciphertextDigest = createBytes32(); const snsCiphertextDigest = createBytes32(); + // Define the first coprocessor context ID + const contextId = 1; + // Define fake values const fakeHostChainId = 123; const ctHandleFakeChainId = createCtHandle(fakeHostChainId); @@ -38,42 +51,53 @@ describe("CiphertextCommits", function () { const fakeCiphertextDigest = createBytes32(); let gatewayConfig: GatewayConfig; + let coprocessorContexts: CoprocessorContexts; + let inputVerification: InputVerification; let ciphertextCommits: CiphertextCommits; let coprocessorTxSenders: HardhatEthersSigner[]; + let coprocessorSigners: HardhatEthersSigner[]; let owner: Wallet; let pauser: Wallet; - - async function prepareFixture() { - const fixtureData = await loadFixture(loadTestVariablesFixture); - - return fixtureData; - } + let contractChainId: number; async function prepareViewTestFixture() { const fixtureData = await loadFixture(loadTestVariablesFixture); const { ciphertextCommits, coprocessorTxSenders } = fixtureData; const unusedCoprocessorTxSender = coprocessorTxSenders[0]; - const usedCoprocessorTxSender = coprocessorTxSenders.slice(1); + const usedCoprocessorTxSenders = coprocessorTxSenders.slice(1); // Add the ciphertext material using all but the first coprocessor, which is enough to reach // consensus - for (let txSender of usedCoprocessorTxSender) { + for (let txSender of usedCoprocessorTxSenders) { await ciphertextCommits .connect(txSender) .addCiphertextMaterial(ctHandle, keyId, ciphertextDigest, snsCiphertextDigest); } - return { ...fixtureData, unusedCoprocessorTxSender, usedCoprocessorTxSender }; + + const unusedCoprocessorTxSenderAddress = unusedCoprocessorTxSender.address; + const usedCoprocessorTxSenderAddresses = usedCoprocessorTxSenders.map((s) => s.address); + + return { + ...fixtureData, + unusedCoprocessorTxSender, + usedCoprocessorTxSenderAddresses, + unusedCoprocessorTxSenderAddress, + }; } beforeEach(async function () { // Initialize globally used variables before each test - const fixture = await loadFixture(prepareFixture); + const fixture = await loadFixture(loadTestVariablesFixture); gatewayConfig = fixture.gatewayConfig; + coprocessorContexts = fixture.coprocessorContexts; + inputVerification = fixture.inputVerification; coprocessorTxSenders = fixture.coprocessorTxSenders; + coprocessorSigners = fixture.coprocessorSigners; ciphertextCommits = fixture.ciphertextCommits; owner = fixture.owner; pauser = fixture.pauser; + contractChainId = fixture.chainIds[0]; }); describe("Deployment", function () { @@ -119,10 +143,7 @@ describe("CiphertextCommits", function () { // Check 2nd call event: it should only contain the 2 coprocessor transaction sender addresses await expect(resultTx2) .to.emit(ciphertextCommits, "AddCiphertextMaterial") - .withArgs(ctHandle, ciphertextDigest, snsCiphertextDigest, [ - coprocessorTxSenders[0].address, - coprocessorTxSenders[1].address, - ]); + .withArgs(ctHandle, ciphertextDigest, snsCiphertextDigest, contextId); }); it("Should add a ciphertext material with 2 valid calls and ignore the other valid one", async function () { @@ -172,10 +193,7 @@ describe("CiphertextCommits", function () { // 1st and 3rd one await expect(resultTx3) .to.emit(ciphertextCommits, "AddCiphertextMaterial") - .withArgs(ctHandle, ciphertextDigest, snsCiphertextDigest, [ - coprocessorTxSenders[0].address, - coprocessorTxSenders[2].address, - ]); + .withArgs(ctHandle, ciphertextDigest, snsCiphertextDigest, contextId); }); it("Should get all valid coprocessor transaction senders from add ciphertext material consensus", async function () { @@ -186,8 +204,8 @@ describe("CiphertextCommits", function () { // Check that the coprocessor transaction senders list is empty because consensus is not reached yet const addCiphertextMaterialConsensusTxSenders1 = - await ciphertextCommits.getAddCiphertextMaterialConsensusTxSenders(ctHandle); - expect(addCiphertextMaterialConsensusTxSenders1).to.deep.equal([]); + await ciphertextCommits.getConsensusCoprocessorTxSenders(ctHandle); + expect(addCiphertextMaterialConsensusTxSenders1).to.deep.equal([[], 0, false]); // Trigger a valid add ciphertext material call using the second coprocessor transaction sender await ciphertextCommits @@ -199,8 +217,8 @@ describe("CiphertextCommits", function () { // Check that the coprocessor transaction senders that were involved in the consensus are the // 2 coprocessor transaction senders, at the moment the consensus is reached const addCiphertextMaterialConsensusTxSenders2 = - await ciphertextCommits.getAddCiphertextMaterialConsensusTxSenders(ctHandle); - expect(addCiphertextMaterialConsensusTxSenders2).to.deep.equal(expectedCoprocessorTxSenders2); + await ciphertextCommits.getConsensusCoprocessorTxSenders(ctHandle); + expect(addCiphertextMaterialConsensusTxSenders2).to.deep.equal([expectedCoprocessorTxSenders2, contextId, true]); // Trigger a valid add ciphertext material call using the third coprocessor transaction sender await ciphertextCommits @@ -212,18 +230,18 @@ describe("CiphertextCommits", function () { // Check that the coprocessor transaction senders that were involved in the consensus are the // 3 coprocessor transaction senders, after the consensus is reached const addCiphertextMaterialConsensusTxSenders3 = - await ciphertextCommits.getAddCiphertextMaterialConsensusTxSenders(ctHandle); - expect(addCiphertextMaterialConsensusTxSenders3).to.deep.equal(expectedCoprocessorTxSenders3); + await ciphertextCommits.getConsensusCoprocessorTxSenders(ctHandle); + expect(addCiphertextMaterialConsensusTxSenders3).to.deep.equal([expectedCoprocessorTxSenders3, contextId, true]); }); - it("Should revert because the transaction sender is not a coprocessor", async function () { + it("Should revert because the transaction sender is not a coprocessor from the active context", async function () { await expect( ciphertextCommits .connect(fakeTxSender) .addCiphertextMaterial(ctHandle, keyId, ciphertextDigest, snsCiphertextDigest), ) - .revertedWithCustomError(ciphertextCommits, "NotCoprocessorTxSender") - .withArgs(fakeTxSender.address); + .revertedWithCustomError(ciphertextCommits, "NotCoprocessorTxSenderFromContext") + .withArgs(contextId, fakeTxSender.address); }); it("Should revert because the coprocessor transaction sender has already added the ciphertext handle", async function () { @@ -241,24 +259,131 @@ describe("CiphertextCommits", function () { .revertedWithCustomError(ciphertextCommits, "CoprocessorAlreadyAdded") .withArgs(ctHandle, coprocessorTxSenders[0]); }); + + describe("Context changes", async function () { + let timePeriods: CoprocessorContextTimePeriodsStruct; + let newCoprocessorTxSenders: HDNodeWallet[]; + + // Define the new expected context ID + const newContextId = 2; + + beforeEach(async function () { + // Add the ciphertext material with the first coprocessor transaction sender. This should + // register the request under the first active context (ID 1) + await ciphertextCommits + .connect(coprocessorTxSenders[0]) + .addCiphertextMaterial(ctHandle, keyId, ciphertextDigest, snsCiphertextDigest); + + // Add a new coprocessor context using a bigger set of coprocessors with different tx sender + // and signer addresses + const newCoprocessorContext = await addNewCoprocessorContext(10, coprocessorContexts, owner, true); + timePeriods = newCoprocessorContext.timePeriods; + newCoprocessorTxSenders = newCoprocessorContext.coprocessorTxSenders; + }); + + it("Should activate the new context and suspend the old one", async function () { + // Increase the block timestamp to reach the end of the pre-activation period + await time.increase(timePeriods.preActivationTimePeriod); + + // Add a new ciphertext material with the first new coprocessor transaction sender + await ciphertextCommits + .connect(newCoprocessorTxSenders[0]) + .addCiphertextMaterial(newCtHandle, keyId, ciphertextDigest, snsCiphertextDigest); + + // Make sure the old context has been suspended + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Suspended); + + // Make sure the new context has been activated + expect(await coprocessorContexts.getCoprocessorContextStatus(newContextId)).to.equal(ContextStatus.Active); + }); + + it("Should deactivate the suspended context", async function () { + // Increase the block timestamp to reach the end of the pre-activation period + await time.increase(timePeriods.preActivationTimePeriod); + + // Add a new ciphertext material with the first new coprocessor transaction sender + await ciphertextCommits + .connect(newCoprocessorTxSenders[0]) + .addCiphertextMaterial(newCtHandle, keyId, ciphertextDigest, snsCiphertextDigest); + + // Increase the block timestamp to reach the end of the suspended period + await time.increase(timePeriods.suspendedTimePeriod); + + // Add a new ciphertext material with the second new coprocessor transaction sender + await ciphertextCommits + .connect(newCoprocessorTxSenders[1]) + .addCiphertextMaterial(newCtHandle, keyId, ciphertextDigest, snsCiphertextDigest); + + // Make sure the old context has been deactivated + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Deactivated); + }); + + it("Should add a ciphertext material with suspended context", async function () { + // The second transaction should reach consensus and thus emit the expected event + // This is because the consensus is reached amongst the suspended context (3 coprocessors) + // and not the new one (10 coprocessors) + const result = await ciphertextCommits + .connect(coprocessorTxSenders[1]) + .addCiphertextMaterial(ctHandle, keyId, ciphertextDigest, snsCiphertextDigest); + + await expect(result) + .to.emit(ciphertextCommits, "AddCiphertextMaterial") + .withArgs(ctHandle, ciphertextDigest, snsCiphertextDigest, contextId); + }); + + it("Should revert because the context is no longer valid", async function () { + // Wait for the pre activation period to pass + await refreshCoprocessorContextAfterTimePeriod(timePeriods.preActivationTimePeriod, coprocessorContexts); + + // Wait for the suspended period to pass + await refreshCoprocessorContextAfterTimePeriod(timePeriods.suspendedTimePeriod, coprocessorContexts); + + // Check that adding a ciphertext material that has already been registered under an active context + // reverts because this context is no longer valid + await expect( + ciphertextCommits + .connect(coprocessorTxSenders[1]) + .addCiphertextMaterial(ctHandle, keyId, ciphertextDigest, snsCiphertextDigest), + ) + .revertedWithCustomError(ciphertextCommits, "InvalidCoprocessorContextAddCiphertext") + .withArgs(ctHandle, contextId, ContextStatus.Deactivated); + }); + + it("Should revert because the transaction sender is a coprocessor from the suspended context", async function () { + // Wait for the pre activation period to pass + await refreshCoprocessorContextAfterTimePeriod(timePeriods.preActivationTimePeriod, coprocessorContexts); + + // Make sure the old context has been suspended + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Suspended); + + // Make sure that a new ciphertext material can't be added by a coprocessor from the suspended context + await expect( + ciphertextCommits + .connect(coprocessorTxSenders[0]) + .addCiphertextMaterial(newCtHandle, keyId, ciphertextDigest, snsCiphertextDigest), + ) + .revertedWithCustomError(ciphertextCommits, "NotCoprocessorTxSenderFromContext") + .withArgs(newContextId, coprocessorTxSenders[0].address); + }); + }); }); describe("Get ciphertext materials", async function () { let unusedCoprocessorTxSender: HardhatEthersSigner; - let usedCoprocessorTxSender: HardhatEthersSigner[]; + let usedCoprocessorTxSenderAddresses: string[]; + let unusedCoprocessorTxSenderAddress: string; beforeEach(async function () { const fixtureData = await loadFixture(prepareViewTestFixture); unusedCoprocessorTxSender = fixtureData.unusedCoprocessorTxSender; - usedCoprocessorTxSender = fixtureData.usedCoprocessorTxSender; + usedCoprocessorTxSenderAddresses = fixtureData.usedCoprocessorTxSenderAddresses; + unusedCoprocessorTxSenderAddress = fixtureData.unusedCoprocessorTxSenderAddress; }); it("Should get regular ciphertext materials", async function () { const result = await ciphertextCommits.getCiphertextMaterials([ctHandle]); - expect(result).to.be.deep.eq([ - [ctHandle, keyId, ciphertextDigest, usedCoprocessorTxSender.map((s) => s.address)], - ]); + expect(result).to.be.deep.eq([[ctHandle, keyId, ciphertextDigest, usedCoprocessorTxSenderAddresses, contextId]]); }); it("Should get late transaction sender after consensus (regular)", async function () { @@ -266,7 +391,7 @@ describe("CiphertextCommits", function () { // The consensus has been reached with only 2 coprocessors expect(resultTx1).to.be.deep.eq([ - [ctHandle, keyId, ciphertextDigest, usedCoprocessorTxSender.map((s) => s.address)], + [ctHandle, keyId, ciphertextDigest, usedCoprocessorTxSenderAddresses, contextId], ]); // Trigger a "late" call with valid inputs, after the consensus has been reached @@ -277,13 +402,15 @@ describe("CiphertextCommits", function () { // Fetch the material once again const resultTx2 = await ciphertextCommits.getCiphertextMaterials([ctHandle]); - // The list of coprocessor transaction sender addresses should now contain the late coprocessor, - // at the end of the list - const expectedTxSenderAddresses = [ - ...usedCoprocessorTxSender.map((s) => s.address), - unusedCoprocessorTxSender.address, - ]; - expect(resultTx2).to.be.deep.eq([[ctHandle, keyId, ciphertextDigest, expectedTxSenderAddresses]]); + expect(resultTx2).to.be.deep.eq([ + [ + ctHandle, + keyId, + ciphertextDigest, + [...usedCoprocessorTxSenderAddresses, unusedCoprocessorTxSenderAddress], + contextId, + ], + ]); }); it("Should revert with CiphertextMaterialNotFound (regular)", async function () { @@ -296,7 +423,7 @@ describe("CiphertextCommits", function () { const result = await ciphertextCommits.getSnsCiphertextMaterials([ctHandle]); expect(result).to.be.deep.eq([ - [ctHandle, keyId, snsCiphertextDigest, usedCoprocessorTxSender.map((s) => s.address)], + [ctHandle, keyId, snsCiphertextDigest, usedCoprocessorTxSenderAddresses, contextId], ]); }); @@ -305,7 +432,7 @@ describe("CiphertextCommits", function () { // The consensus has been reached with only 2 coprocessors expect(result).to.be.deep.eq([ - [ctHandle, keyId, snsCiphertextDigest, usedCoprocessorTxSender.map((s) => s.address)], + [ctHandle, keyId, snsCiphertextDigest, usedCoprocessorTxSenderAddresses, contextId], ]); // Trigger a "late" call with valid inputs, after the consensus has been reached @@ -316,13 +443,15 @@ describe("CiphertextCommits", function () { // Fetch the material once again const resultTx2 = await ciphertextCommits.getSnsCiphertextMaterials([ctHandle]); - // The list of coprocessor transaction sender addresses should now contain the late coprocessor, - // at the end of the list - const expectedTxSenderAddresses = [ - ...usedCoprocessorTxSender.map((s) => s.address), - unusedCoprocessorTxSender.address, - ]; - expect(resultTx2).to.be.deep.eq([[ctHandle, keyId, snsCiphertextDigest, expectedTxSenderAddresses]]); + expect(resultTx2).to.be.deep.eq([ + [ + ctHandle, + keyId, + snsCiphertextDigest, + [...usedCoprocessorTxSenderAddresses, unusedCoprocessorTxSenderAddress], + contextId, + ], + ]); }); it("Should revert with CiphertextMaterialNotFound (SNS)", async function () { diff --git a/gateway-contracts/test/CoprocessorContexts.ts b/gateway-contracts/test/CoprocessorContexts.ts new file mode 100644 index 0000000000..10ea58c744 --- /dev/null +++ b/gateway-contracts/test/CoprocessorContexts.ts @@ -0,0 +1,927 @@ +import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; +import { loadFixture, time } from "@nomicfoundation/hardhat-network-helpers"; +import { expect } from "chai"; +import { ContractFactory, Wallet } from "ethers"; +import hre from "hardhat"; + +import { CoprocessorContexts, EmptyUUPSProxy } from "../typechain-types"; +// The type needs to be imported separately because it is not properly detected by the linter +// as this type is defined as a shared structs instead of directly in the IDecryption interface +import { + CoprocessorContextStruct, + CoprocessorContextTimePeriodsStruct, + CoprocessorV2Struct, +} from "../typechain-types/contracts/interfaces/ICoprocessorContexts"; +import { + ContextStatus, + addNewCoprocessorContext, + createByteInput, + createCoprocessors, + createRandomWallet, + loadTestVariablesFixture, + refreshCoprocessorContextAfterTimePeriod, + toValues, +} from "./utils"; + +/** + * Suspend a context and activate a new one + * It is mandatory to activate a new context after suspending the old one in order to avoid unexpected behaviors + * @param contextId - The ID of the context to suspend + * @param newContextId - The ID of the context to activate + * @param coprocessorContexts - The CoprocessorContexts contract + * @param owner - The owner of the CoprocessorContexts contract + */ +async function suspendAndActivateContext( + contextId: number, + newContextId: number, + coprocessorContexts: CoprocessorContexts, + owner: Wallet, +) { + // await coprocessorContexts.connect(owner).forceUpdateCoprocessorContextToStatus(contextId, ContextStatus.Suspended); + await coprocessorContexts.connect(owner).forceUpdateCoprocessorContextToStatus(newContextId, ContextStatus.Active); +} + +/** + * Deactivate a context + * @param contextId - The ID of the context to deactivate + * @param newContextId - The ID of the context to activate instead + * @param coprocessorContexts - The CoprocessorContexts contract + * @param owner - The owner of the CoprocessorContexts contract + */ +async function deactivateContext( + contextId: number, + newContextId: number, + coprocessorContexts: CoprocessorContexts, + owner: Wallet, +) { + // Only a suspended context can be deactivated, which requires activating a new context as well + await suspendAndActivateContext(contextId, newContextId, coprocessorContexts, owner); + + await coprocessorContexts.connect(owner).forceUpdateCoprocessorContextToStatus(contextId, ContextStatus.Deactivated); +} + +describe("CoprocessorContexts", function () { + // Define input values + const blob = createByteInput(); + + // Define fake values + const fakeTxSender = createRandomWallet(); + const fakeSigner = createRandomWallet(); + const nullAddress = hre.ethers.ZeroAddress; + + let coprocessorContexts: CoprocessorContexts; + let owner: Wallet; + let coprocessors: CoprocessorV2Struct[]; + let coprocessorTxSenders: HardhatEthersSigner[]; + let coprocessorSigners: HardhatEthersSigner[]; + + async function getInputsForDeployFixture() { + const fixtureData = await loadFixture(loadTestVariablesFixture); + return fixtureData; + } + + before(async function () { + // Initialize globally used variables before each test + const fixtureData = await loadFixture(getInputsForDeployFixture); + coprocessorContexts = fixtureData.coprocessorContexts; + owner = fixtureData.owner; + coprocessors = fixtureData.coprocessors; + coprocessorTxSenders = fixtureData.coprocessorTxSenders; + coprocessorSigners = fixtureData.coprocessorSigners; + }); + + describe("Deployment", function () { + let proxyContract: EmptyUUPSProxy; + let newCoprocessorContextsFactory: ContractFactory; + + beforeEach(async function () { + // Deploy a new proxy contract + const proxyImplementation = await hre.ethers.getContractFactory("EmptyUUPSProxy", owner); + proxyContract = await hre.upgrades.deployProxy(proxyImplementation, [], { + initializer: "initialize", + kind: "uups", + }); + await proxyContract.waitForDeployment(); + + // Get the CoprocessorContexts contract factory + newCoprocessorContextsFactory = await hre.ethers.getContractFactory("CoprocessorContexts", owner); + }); + + it("Should revert because the coprocessors list is empty", async function () { + const emptyCoprocessors: CoprocessorV2Struct[] = []; + await expect( + hre.upgrades.upgradeProxy(proxyContract, newCoprocessorContextsFactory, { + call: { + fn: "initializeFromEmptyProxy", + args: [blob, emptyCoprocessors], + }, + }), + ).to.be.revertedWithCustomError(coprocessorContexts, "EmptyCoprocessors"); + }); + + it("Should revert because a coprocessor has a null transaction sender address", async function () { + const coprocessorsWithNullTxSenderAddress: CoprocessorV2Struct[] = [ + { + name: "Coprocessor 1", + txSenderAddress: nullAddress, + signerAddress: coprocessorSigners[0].address, + storageUrl: "s3://bucket-1", + }, + ]; + await expect( + hre.upgrades.upgradeProxy(proxyContract, newCoprocessorContextsFactory, { + call: { + fn: "initializeFromEmptyProxy", + args: [blob, coprocessorsWithNullTxSenderAddress], + }, + }), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "NullCoprocessorTxSenderAddress") + .withArgs(0, toValues(coprocessorsWithNullTxSenderAddress)); + }); + + it("Should revert because a coprocessor has a null signer address", async function () { + const coprocessorsWithNullSignerAddress: CoprocessorV2Struct[] = [ + { + name: "Coprocessor 1", + txSenderAddress: coprocessorTxSenders[0].address, + signerAddress: nullAddress, + storageUrl: "s3://bucket-1", + }, + ]; + await expect( + hre.upgrades.upgradeProxy(proxyContract, newCoprocessorContextsFactory, { + call: { + fn: "initializeFromEmptyProxy", + args: [blob, coprocessorsWithNullSignerAddress], + }, + }), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "NullCoprocessorSignerAddress") + .withArgs(0, toValues(coprocessorsWithNullSignerAddress)); + }); + + it("Should revert because 2 coprocessors have the same transaction sender address", async function () { + const firstTxSenderAddress = coprocessorTxSenders[0].address; + const coprocessorsWithSameTxSenderAddress: CoprocessorV2Struct[] = [ + { + name: "Coprocessor 1", + txSenderAddress: firstTxSenderAddress, + signerAddress: coprocessorSigners[0].address, + storageUrl: "s3://bucket-1", + }, + { + name: "Coprocessor 2", + txSenderAddress: firstTxSenderAddress, + signerAddress: coprocessorSigners[1].address, + storageUrl: "s3://bucket-2", + }, + ]; + await expect( + hre.upgrades.upgradeProxy(proxyContract, newCoprocessorContextsFactory, { + call: { + fn: "initializeFromEmptyProxy", + args: [blob, coprocessorsWithSameTxSenderAddress], + }, + }), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "CoprocessorTxSenderAddressesNotUnique") + .withArgs(firstTxSenderAddress, 1, toValues(coprocessorsWithSameTxSenderAddress)); + }); + + it("Should revert because 2 coprocessors have the same signer address", async function () { + const firstSignerAddress = coprocessorSigners[0].address; + const coprocessorsWithSameSignerAddress: CoprocessorV2Struct[] = [ + { + name: "Coprocessor 1", + txSenderAddress: coprocessorTxSenders[0].address, + signerAddress: firstSignerAddress, + storageUrl: "s3://bucket-1", + }, + { + name: "Coprocessor 2", + txSenderAddress: coprocessorTxSenders[1].address, + signerAddress: firstSignerAddress, + storageUrl: "s3://bucket-2", + }, + ]; + await expect( + hre.upgrades.upgradeProxy(proxyContract, newCoprocessorContextsFactory, { + call: { + fn: "initializeFromEmptyProxy", + args: [blob, coprocessorsWithSameSignerAddress], + }, + }), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "CoprocessorSignerAddressesNotUnique") + .withArgs(firstSignerAddress, 1, toValues(coprocessorsWithSameSignerAddress)); + }); + }); + + describe("After deployment", function () { + let coprocessorBlob: string; + + // Define the first context ID + const contextId = 1; + + beforeEach(async function () { + const fixture = await loadFixture(loadTestVariablesFixture); + coprocessorContexts = fixture.coprocessorContexts; + coprocessorTxSenders = fixture.coprocessorTxSenders; + coprocessorBlob = fixture.coprocessorBlob; + }); + + describe("Getters", function () { + it("Should revert because there is no pre-activation context ID", async function () { + await expect(coprocessorContexts.getPreActivationCoprocessorContextId()).to.be.revertedWithCustomError( + coprocessorContexts, + "NoPreActivationCoprocessorContext", + ); + }); + + it("Should revert because there is no suspended context ID", async function () { + await expect(coprocessorContexts.getSuspendedCoprocessorContextId()).to.be.revertedWithCustomError( + coprocessorContexts, + "NoSuspendedCoprocessorContext", + ); + }); + + it("Should get the active context ID", async function () { + const activeContextId = await coprocessorContexts.getActiveCoprocessorContextId(); + + // Check that the active context ID matches the first context ID + expect(activeContextId).to.equal(contextId); + }); + + it("Should get the active coprocessor context", async function () { + const activeCoprocessorContext = await coprocessorContexts.getActiveCoprocessorContext(); + + const expectedActiveCoprocessorContext: CoprocessorContextStruct = { + contextId, + previousContextId: 0, + blob: coprocessorBlob, + coprocessors: coprocessors, + }; + + expect(activeCoprocessorContext).to.deep.equal(toValues(expectedActiveCoprocessorContext)); + }); + + it("Should get the coprocessor from the context", async function () { + const coprocessor = await coprocessorContexts.getCoprocessor(contextId, coprocessorTxSenders[0].address); + + expect(coprocessor).to.deep.equal(toValues(coprocessors[0])); + }); + + it("Should revert because coprocessor is not from the context", async function () { + await expect(coprocessorContexts.getCoprocessor(contextId, fakeTxSender.address)).to.be.revertedWithCustomError( + coprocessorContexts, + "NotCoprocessorFromContext", + ); + }); + + it("Should revert because the context has not been initialized", async function () { + // Define a fake context ID + const fakeContextId = 1000; + + await expect(coprocessorContexts.getCoprocessor(fakeContextId, coprocessorTxSenders[0].address)) + .to.be.revertedWithCustomError(coprocessorContexts, "CoprocessorContextNotInitialized") + .withArgs(fakeContextId); + }); + + it("Should get the coprocessor majority threshold from the context", async function () { + const coprocessorMajorityThreshold = await coprocessorContexts.getCoprocessorMajorityThreshold(contextId); + + // The coprocessor majority threshold currently directly depends on the number of coprocessors + expect(coprocessorMajorityThreshold).to.equal((coprocessorTxSenders.length >> 1) + 1); + }); + + it("Should get all coprocessor transaction sender addresses from the context", async function () { + const coprocessorTxSenderAddresses = await coprocessorContexts.getCoprocessorTxSenders(contextId); + + // Check that the number of coprocessor transaction sender addresses is correct + expect(coprocessorTxSenderAddresses.length).to.equal(coprocessorTxSenders.length); + + // Check that all coprocessor transaction sender addresses are in the list + for (const coprocessorTxSender of coprocessorTxSenders) { + expect(coprocessorTxSenderAddresses).to.include(coprocessorTxSender.address); + } + }); + + it("Should get all coprocessor signer addresses from the context", async function () { + const coprocessorSignerAddresses = await coprocessorContexts.getCoprocessorSigners(contextId); + + // Check that the number of coprocessor signer addresses is correct + expect(coprocessorSignerAddresses.length).to.equal(coprocessorSigners.length); + + // Check that all coprocessor signer addresses are in the list + for (const coprocessorSigner of coprocessorSigners) { + expect(coprocessorSignerAddresses).to.include(coprocessorSigner.address); + } + }); + + it("Should get the coprocessor context status", async function () { + const coprocessorContextStatus = await coprocessorContexts.getCoprocessorContextStatus(contextId); + + expect(coprocessorContextStatus).to.equal(ContextStatus.Active); + }); + + describe("Context changes", function () { + let timePeriods: CoprocessorContextTimePeriodsStruct; + + // Define the new expected context ID + const newContextId = 2; + + beforeEach(async function () { + // Add a new coprocessor context + const newCoprocessorContext = await addNewCoprocessorContext(3, coprocessorContexts, owner); + timePeriods = newCoprocessorContext.timePeriods; + }); + + it("Should get the pre-activation context ID", async function () { + const preActivationContextId = await coprocessorContexts.getPreActivationCoprocessorContextId(); + + // Check that the pre-activation context ID matches the new context ID + expect(preActivationContextId).to.equal(newContextId); + }); + + it("Should get the suspended context ID", async function () { + // Wait for the pre activation period to pass + await refreshCoprocessorContextAfterTimePeriod(timePeriods.preActivationTimePeriod, coprocessorContexts); + + const suspendedContextId = await coprocessorContexts.getSuspendedCoprocessorContextId(); + + // Check that the suspended context ID matches the old context ID + expect(suspendedContextId).to.equal(contextId); + }); + + it("Should get the new active context ID", async function () { + // Wait for the pre activation period to pass + await refreshCoprocessorContextAfterTimePeriod(timePeriods.preActivationTimePeriod, coprocessorContexts); + + // Wait for the suspended period to pass + await refreshCoprocessorContextAfterTimePeriod(timePeriods.suspendedTimePeriod, coprocessorContexts); + + const activeContextId = await coprocessorContexts.getActiveCoprocessorContextId(); + + // Check that the active context ID matches the new context ID + expect(activeContextId).to.equal(newContextId); + }); + + it("Should get the new context activation block timestamp", async function () { + // Get the latest block timestamp + const latestBlockTimestamp = await time.latest(); + + const activationBlockTimestamp = + await coprocessorContexts.getCoprocessorActivationBlockTimestamp(newContextId); + + const expectedActivationBlockTimestamp = + BigInt(latestBlockTimestamp) + BigInt(timePeriods.preActivationTimePeriod); + + expect(activationBlockTimestamp).to.equal(expectedActivationBlockTimestamp); + }); + + it("Should get the old context suspended block timestamp", async function () { + // Wait for the pre activation period to pass + await refreshCoprocessorContextAfterTimePeriod(timePeriods.preActivationTimePeriod, coprocessorContexts); + + // Get the latest block timestamp + const latestBlockTimestamp = await time.latest(); + + const deactivatedBlockTimestamp = + await coprocessorContexts.getCoprocessorDeactivatedBlockTimestamp(contextId); + + const expectedDeactivatedBlockTimestamp = + BigInt(latestBlockTimestamp) + BigInt(timePeriods.suspendedTimePeriod); + + expect(deactivatedBlockTimestamp).to.equal(expectedDeactivatedBlockTimestamp); + }); + }); + }); + + describe("Checks", function () { + it("Should be true because the address is registered as a coprocessor transaction sender", async function () { + for (const coprocessorTxSender of coprocessorTxSenders) { + expect(await coprocessorContexts.isCoprocessorTxSender(contextId, coprocessorTxSender.address)).to.be.true; + } + }); + + it("Should be false because the address is not registered as a coprocessor transaction sender", async function () { + expect(await coprocessorContexts.isCoprocessorTxSender(contextId, fakeTxSender.address)).to.be.false; + }); + + it("Should be true because the address is registered as a coprocessor signer", async function () { + for (const coprocessorSigner of coprocessorSigners) { + expect(await coprocessorContexts.isCoprocessorSigner(contextId, coprocessorSigner.address)).to.be.true; + } + }); + + it("Should be false because the address is not registered as a coprocessor signer", async function () { + expect(await coprocessorContexts.isCoprocessorSigner(contextId, fakeSigner.address)).to.be.false; + }); + }); + + describe("Predicates", function () { + it("Should return true as the context is active", async function () { + // Make sure the context is active + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Active); + + const isActiveOrSuspended = await coprocessorContexts.isCoprocessorContextOperating(contextId); + + expect(isActiveOrSuspended).to.be.true; + }); + + it("Should return true as the context is suspended", async function () { + // Add a new coprocessor context + const newCoprocessorContext = await addNewCoprocessorContext(3, coprocessorContexts, owner); + + // Wait for the pre activation period to pass + await refreshCoprocessorContextAfterTimePeriod( + newCoprocessorContext.timePeriods.preActivationTimePeriod, + coprocessorContexts, + ); + + // Make sure the old context has been suspended + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Suspended); + + const isActiveOrSuspended = await coprocessorContexts.isCoprocessorContextOperating(contextId); + + expect(isActiveOrSuspended).to.be.true; + }); + }); + + describe("Add coprocessor context", function () { + // Define new context ID + const newContextId = 2; + + // Define new coprocessor context fields + const newBlob = createByteInput(); + + // Define new time periods + const newPreActivationTimePeriod = 100; + const newSuspendedTimePeriod = 100; + const newTimePeriods: CoprocessorContextTimePeriodsStruct = { + preActivationTimePeriod: newPreActivationTimePeriod, + suspendedTimePeriod: newSuspendedTimePeriod, + }; + + // Create a new set of coprocessors + const { coprocessors: newCoprocessors } = createCoprocessors(7); + + it("Should add a new coprocessor context", async function () { + // Get the latest block timestamp + const latestBlockTimestamp = await time.latest(); + + // Add a new coprocessor context + const txResult = await coprocessorContexts + .connect(owner) + .addCoprocessorContext(newBlob, newCoprocessors, newTimePeriods); + + const oldCoprocessorContext: CoprocessorContextStruct = { + contextId, + previousContextId: 0, + blob, + coprocessors: coprocessors, + }; + + const newCoprocessorContext: CoprocessorContextStruct = { + contextId: newContextId, + previousContextId: contextId, + blob: newBlob, + coprocessors: newCoprocessors, + }; + + const expectedActivationBlockTimestamp = BigInt(latestBlockTimestamp) + BigInt(newPreActivationTimePeriod); + + expect(txResult) + .to.emit(coprocessorContexts, "NewCoprocessorContext") + .withArgs(oldCoprocessorContext, newCoprocessorContext, newTimePeriods) + .to.emit(coprocessorContexts, "PreActivateCoprocessorContext") + .withArgs(newCoprocessorContext, expectedActivationBlockTimestamp); + + // Check that the new context is in the pre-activation state + expect(await coprocessorContexts.getCoprocessorContextStatus(newContextId)).to.equal( + ContextStatus.PreActivation, + ); + }); + + it("Should revert because there is a coprocessor context in pre-activation", async function () { + // Add a new coprocessor context + await addNewCoprocessorContext(3, coprocessorContexts, owner); + + await expect(coprocessorContexts.connect(owner).addCoprocessorContext(newBlob, newCoprocessors, newTimePeriods)) + .to.be.revertedWithCustomError(coprocessorContexts, "PreActivationContextOngoing") + .withArgs(newContextId); + }); + + it("Should revert because there is a suspended coprocessor context ongoing", async function () { + // Add a new coprocessor context + const newCoprocessorContext = await addNewCoprocessorContext(3, coprocessorContexts, owner); + + // Wait for the pre activation period to pass + await refreshCoprocessorContextAfterTimePeriod( + newCoprocessorContext.timePeriods.preActivationTimePeriod, + coprocessorContexts, + ); + + await expect(coprocessorContexts.connect(owner).addCoprocessorContext(newBlob, newCoprocessors, newTimePeriods)) + .to.be.revertedWithCustomError(coprocessorContexts, "SuspendedContextOngoing") + .withArgs(contextId); + }); + }); + + describe("Context status changes", function () { + let newTimePeriods: CoprocessorContextTimePeriodsStruct; + + // Define the new expected context ID + const newContextId = 2; + + beforeEach(async function () { + // Add a new coprocessor context + const newCoprocessorContext = await addNewCoprocessorContext(3, coprocessorContexts, owner); + newTimePeriods = newCoprocessorContext.timePeriods; + }); + + describe("Automatic coprocessor context statuses", function () { + it("Should activate the new context and suspend the old one", async function () { + // Increase the block timestamp to reach the end of the pre-activation period + await time.increase(newTimePeriods.preActivationTimePeriod); + + // Get the latest block timestamp + const latestBlockTimestamp = await time.latest(); + + // Refresh the statuses of the coprocessor contexts: this suspends the old context and activates the new one + const txResult = await coprocessorContexts.refreshCoprocessorContextStatuses(); + + const expectedDeactivatedBlockTimestamp = + BigInt(latestBlockTimestamp) + BigInt(newTimePeriods.suspendedTimePeriod); + + expect(txResult) + .to.emit(coprocessorContexts, "SuspendCoprocessorContext") + .withArgs(contextId, expectedDeactivatedBlockTimestamp) + .to.emit(coprocessorContexts, "ActivateCoprocessorContext") + .withArgs(newContextId); + + // Make sure the old context has been suspended + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Suspended); + + // Make sure the new context has been activated + expect(await coprocessorContexts.getCoprocessorContextStatus(newContextId)).to.equal(ContextStatus.Active); + }); + + it("Should deactivate the suspended context", async function () { + // Increase the block timestamp to reach the end of the pre-activation period + await time.increase(newTimePeriods.preActivationTimePeriod); + + // Refresh the statuses of the coprocessor contexts: this suspends the old context + await coprocessorContexts.refreshCoprocessorContextStatuses(); + + // Increase the block timestamp to reach the end of the suspended period + await time.increase(newTimePeriods.suspendedTimePeriod); + + // Refresh the statuses of the coprocessor contexts once again: this deactivates the old context + const txResult = await coprocessorContexts.refreshCoprocessorContextStatuses(); + + expect(txResult).to.emit(coprocessorContexts, "DeactivateCoprocessorContext").withArgs(contextId); + + // Make sure the old context has been deactivated + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Deactivated); + }); + }); + + describe("Manual force update context to status", function () { + // Define a suspended time period (in seconds) + const suspendedTimePeriod = 10; + + it("Should swap the suspended context with the active context", async function () { + // Increase the block timestamp to reach the end of the pre-activation period + await time.increase(newTimePeriods.preActivationTimePeriod); + + // Refresh the statuses of the coprocessor contexts: this suspends the old context + await coprocessorContexts.refreshCoprocessorContextStatuses(); + + // Get the latest block timestamp + const latestBlockTimestamp = await time.latest(); + + // Expected timestamp for the next block + const expectedSuspendedBlockTimestamp = BigInt(latestBlockTimestamp) + BigInt(suspendedTimePeriod); + + const txResult = await coprocessorContexts + .connect(owner) + .swapSuspendedCoprocessorContextWithActive(suspendedTimePeriod); + + expect(txResult) + .to.emit(coprocessorContexts, "SuspendCoprocessorContext") + .withArgs(newContextId, expectedSuspendedBlockTimestamp) + .to.emit(coprocessorContexts, "ActivateCoprocessorContext") + .withArgs(contextId); + + // Make sure the old context has been reactivated + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Active); + + // Make sure the new context has been deactivated + expect(await coprocessorContexts.getCoprocessorContextStatus(newContextId)).to.equal(ContextStatus.Suspended); + }); + + it("Should revert because there is no suspended context to move to active", async function () { + await expect( + coprocessorContexts.connect(owner).swapSuspendedCoprocessorContextWithActive(suspendedTimePeriod), + ).to.be.revertedWithCustomError(coprocessorContexts, "NoSuspendedCoprocessorContext"); + }); + + describe("Accepted lifecycle rules", function () { + describe("Update pre-active context", function () { + it("Should activate a pre-active context", async function () { + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(newContextId, ContextStatus.Active), + ) + .to.emit(coprocessorContexts, "ActivateCoprocessorContext") + .withArgs(newContextId); + + expect(await coprocessorContexts.getCoprocessorContextStatus(newContextId)).to.equal( + ContextStatus.Active, + ); + }); + + it("Should compromise a pre-active context", async function () { + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(newContextId, ContextStatus.Compromised), + ) + .to.emit(coprocessorContexts, "CompromiseCoprocessorContext") + .withArgs(newContextId); + }); + + it("Should destroy a pre-active context", async function () { + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(newContextId, ContextStatus.Destroyed), + ) + .to.emit(coprocessorContexts, "DestroyCoprocessorContext") + .withArgs(newContextId); + }); + }); + + describe("Update active context", function () { + it("Should activate a new context and suspend the old active one", async function () { + // Get the latest block timestamp + const latestBlockTimestamp = await time.latest(); + + // Expected timestamp for the next block (as manually forced activation suspends the + // active context immediately) + const expectedSuspendedBlockTimestamp = BigInt(latestBlockTimestamp) + BigInt(1); + + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(newContextId, ContextStatus.Active), + ) + .to.emit(coprocessorContexts, "SuspendCoprocessorContext") + .withArgs(contextId, expectedSuspendedBlockTimestamp) + .to.emit(coprocessorContexts, "ActivateCoprocessorContext") + .withArgs(newContextId); + + expect(await coprocessorContexts.getCoprocessorContextStatus(newContextId)).to.equal( + ContextStatus.Active, + ); + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal( + ContextStatus.Suspended, + ); + }); + }); + + describe("Update suspended context", function () { + it("Should deactivate a suspended context", async function () { + // Suspend the context + await suspendAndActivateContext(contextId, newContextId, coprocessorContexts, owner); + + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(contextId, ContextStatus.Deactivated), + ) + .to.emit(coprocessorContexts, "DeactivateCoprocessorContext") + .withArgs(contextId); + + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal( + ContextStatus.Deactivated, + ); + }); + + it("Should compromise a suspended context", async function () { + // Suspend the context + await suspendAndActivateContext(contextId, newContextId, coprocessorContexts, owner); + + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(contextId, ContextStatus.Compromised), + ) + .to.emit(coprocessorContexts, "CompromiseCoprocessorContext") + .withArgs(contextId); + + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal( + ContextStatus.Compromised, + ); + }); + + it("Should destroy a suspended context", async function () { + // Suspend the context + await suspendAndActivateContext(contextId, newContextId, coprocessorContexts, owner); + + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(contextId, ContextStatus.Destroyed), + ) + .to.emit(coprocessorContexts, "DestroyCoprocessorContext") + .withArgs(contextId); + + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal( + ContextStatus.Destroyed, + ); + }); + }); + + describe("Update deactivated context", function () { + it("Should destroy a deactivated context", async function () { + // Deactivate the context + await deactivateContext(contextId, newContextId, coprocessorContexts, owner); + + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(contextId, ContextStatus.Destroyed), + ) + .to.emit(coprocessorContexts, "DestroyCoprocessorContext") + .withArgs(contextId); + + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal( + ContextStatus.Destroyed, + ); + }); + }); + + describe("Update compromised context", function () { + it("Should destroy a compromised context", async function () { + // Compromise the context + await coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(newContextId, ContextStatus.Compromised); + + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(newContextId, ContextStatus.Destroyed), + ) + .to.emit(coprocessorContexts, "DestroyCoprocessorContext") + .withArgs(newContextId); + + expect(await coprocessorContexts.getCoprocessorContextStatus(newContextId)).to.equal( + ContextStatus.Destroyed, + ); + }); + }); + }); + + describe("Forbidden lifecycle rules", function () { + describe("Unsupported target statuses", function () { + it("Should revert because the targeted context status is `NotInitialized`", async function () { + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(contextId, ContextStatus.NotInitialized), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "InvalidContextStatusForceUpdate") + .withArgs(contextId, ContextStatus.NotInitialized); + }); + + it("Should revert because the targeted context status is `Generating`", async function () { + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(contextId, ContextStatus.Generating), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "InvalidContextStatusForceUpdate") + .withArgs(contextId, ContextStatus.Generating); + }); + + it("Should revert because the targeted context status is `PreActivation`", async function () { + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(contextId, ContextStatus.PreActivation), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "InvalidContextStatusForceUpdate") + .withArgs(contextId, ContextStatus.PreActivation); + }); + + it("Should revert because the targeted context status is `Suspended`", async function () { + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(contextId, ContextStatus.Suspended), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "InvalidContextStatusForceUpdate") + .withArgs(contextId, ContextStatus.Suspended); + }); + }); + + describe("Update pre-activated context", function () { + it("Should revert because a pre-activated context cannot be deactivated", async function () { + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(newContextId, ContextStatus.Deactivated), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "ContextNotSuspended") + .withArgs(newContextId); + }); + }); + + describe("Update active context", function () { + it("Should revert because an active context cannot be compromised", async function () { + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(contextId, ContextStatus.Compromised), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "ContextIsActive") + .withArgs(contextId); + }); + + it("Should revert because an active context cannot be deactivated", async function () { + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(contextId, ContextStatus.Deactivated), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "ContextNotSuspended") + .withArgs(contextId); + }); + + it("Should revert because an active context cannot be destroyed", async function () { + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(contextId, ContextStatus.Destroyed), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "ContextIsActive") + .withArgs(contextId); + }); + }); + + describe("Update deactivated context", function () { + it("Should revert because a deactivated context cannot be activated again", async function () { + // Deactivate the context + await deactivateContext(contextId, newContextId, coprocessorContexts, owner); + + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(contextId, ContextStatus.Active), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "ContextNotPreActivatedOrSuspended") + .withArgs(contextId); + }); + }); + + describe("Update destroyed context", function () { + it("Should revert because a destroyed context cannot be activated", async function () { + // Destroy the context + await coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(newContextId, ContextStatus.Destroyed); + + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(newContextId, ContextStatus.Active), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "ContextNotPreActivatedOrSuspended") + .withArgs(newContextId); + }); + + it("Should revert because a destroyed context cannot be deactivated", async function () { + // Destroy the context + await coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(newContextId, ContextStatus.Destroyed); + + await expect( + coprocessorContexts + .connect(owner) + .forceUpdateCoprocessorContextToStatus(newContextId, ContextStatus.Deactivated), + ) + .to.be.revertedWithCustomError(coprocessorContexts, "ContextNotSuspended") + .withArgs(newContextId); + }); + }); + }); + }); + }); + }); +}); diff --git a/gateway-contracts/test/Decryption.ts b/gateway-contracts/test/Decryption.ts index 0931451a00..69e3a5aca3 100644 --- a/gateway-contracts/test/Decryption.ts +++ b/gateway-contracts/test/Decryption.ts @@ -17,7 +17,6 @@ import { // as this type is defined as a shared structs instead of directly in the IDecryption interface import { CtHandleContractPairStruct, - DelegationAccountsStruct, SnsCiphertextMaterialStruct, } from "../typechain-types/contracts/interfaces/IDecryption"; import { @@ -27,7 +26,6 @@ import { createBytes32s, createCtHandle, createCtHandles, - createEIP712RequestDelegatedUserDecrypt, createEIP712RequestUserDecrypt, createEIP712ResponsePublicDecrypt, createEIP712ResponseUserDecrypt, @@ -36,7 +34,6 @@ import { createRandomWallet, getKeyId, getPublicDecryptId, - getSignaturesDelegatedUserDecryptRequest, getSignaturesPublicDecrypt, getSignaturesUserDecryptRequest, getSignaturesUserDecryptResponse, @@ -65,6 +62,9 @@ describe("Decryption", function () { // Get the gateway's chain ID const gatewayChainId = hre.network.config.chainId!; + // Define the first coprocessor context ID + const contextId = 1; + // Define input values const keyId = getKeyId(1); const ciphertextDigest = createBytes32(); @@ -104,8 +104,6 @@ describe("Decryption", function () { // Define extra data for version 0 const extraDataV0 = hre.ethers.solidityPacked(["uint8"], [0]); - let gatewayConfig: GatewayConfig; - let kmsGeneration: KMSGeneration; let MultichainACL: MultichainACL; let ciphertextCommits: CiphertextCommits; let decryption: Decryption; @@ -124,7 +122,7 @@ describe("Decryption", function () { let snsCiphertextMaterials: SnsCiphertextMaterialStruct[] = []; - // Allow public decryption + // Add the ciphertext materials for each handle for (const ctHandle of ctHandles) { for (let i = 0; i < coprocessorTxSenders.length; i++) { await ciphertextCommits @@ -138,10 +136,11 @@ describe("Decryption", function () { keyId, snsCiphertextDigest, coprocessorTxSenderAddresses: coprocessorTxSenders.map((s) => s.address), + contextId, }); } - return { ...fixtureData, snsCiphertextMaterials, keyId }; + return { ...fixtureData, snsCiphertextMaterials }; } describe("Deployment", function () { @@ -210,8 +209,6 @@ describe("Decryption", function () { beforeEach(async function () { // Initialize globally used variables before each test const fixtureData = await loadFixture(preparePublicDecryptEIP712Fixture); - gatewayConfig = fixtureData.gatewayConfig; - kmsGeneration = fixtureData.kmsGeneration; MultichainACL = fixtureData.MultichainACL; ciphertextCommits = fixtureData.ciphertextCommits; decryption = fixtureData.decryption; @@ -229,6 +226,8 @@ describe("Decryption", function () { // Request public decryption const requestTx = await decryption.publicDecryptionRequest(ctHandles, extraDataV0); + // Get the storage URLs for the given ctHandles + // Check request event await expect(requestTx) .to.emit(decryption, "PublicDecryptionRequest") @@ -236,11 +235,12 @@ describe("Decryption", function () { }); it("Should request a public decryption with a single ctHandle", async function () { - // Request public decryption with a single ctHandle - const requestTx = await decryption.publicDecryptionRequest([ctHandles[0]], extraDataV0); - + const singleCtHandles = ctHandles.slice(0, 1); const singleSnsCiphertextMaterials = snsCiphertextMaterials.slice(0, 1); + // Request public decryption with a single ctHandle + const requestTx = await decryption.publicDecryptionRequest(singleCtHandles, extraDataV0); + // Check request event await expect(requestTx) .to.emit(decryption, "PublicDecryptionRequest") @@ -357,31 +357,31 @@ describe("Decryption", function () { it("Should revert because of ctMaterials tied to different key IDs", async function () { // Store the handles with a new key ID and allow them for public decryption - for (const newCtHandle of newCtHandles) { - for (let i = 0; i < coprocessorTxSenders.length; i++) { - await ciphertextCommits - .connect(coprocessorTxSenders[i]) - .addCiphertextMaterial(newCtHandle, newKeyId, ciphertextDigest, snsCiphertextDigest); + for (let i = 0; i < coprocessorTxSenders.length; i++) { + await ciphertextCommits + .connect(coprocessorTxSenders[i]) + .addCiphertextMaterial(newCtHandle, newKeyId, ciphertextDigest, snsCiphertextDigest); - await MultichainACL.connect(coprocessorTxSenders[i]).allowPublicDecrypt(newCtHandle, extraDataV0); - } + await MultichainACL.connect(coprocessorTxSenders[i]).allowPublicDecrypt(newCtHandle, extraDataV0); } + const newSnsCiphertextMaterial = { + ctHandle: newCtHandle, + keyId: newKeyId, + snsCiphertextDigest, + coprocessorTxSenderAddresses: coprocessorTxSenders.map((s) => s.address), + contextId, + }; + + const ctHandlesDifferentKeyIds = [...ctHandles, newCtHandle]; + // Request public decryption with ctMaterials tied to different key IDs - const requestTx = decryption.publicDecryptionRequest([...ctHandles, newCtHandle], extraDataV0); + const requestTx = decryption.publicDecryptionRequest(ctHandlesDifferentKeyIds, extraDataV0); // Check that different key IDs are not allowed for batched public decryption await expect(requestTx) .to.be.revertedWithCustomError(decryption, "DifferentKeyIdsNotAllowed") - .withArgs( - toValues(snsCiphertextMaterials[0]), - toValues({ - ctHandle: newCtHandle, - keyId: newKeyId, - snsCiphertextDigest, - coprocessorTxSenderAddresses: coprocessorTxSenders.map((s) => s.address), - }), - ); + .withArgs(toValues(snsCiphertextMaterials[0]), toValues(newSnsCiphertextMaterial)); }); it("Should public decrypt with 3 valid responses", async function () { @@ -737,8 +737,6 @@ describe("Decryption", function () { beforeEach(async function () { // Initialize globally used variables before each test const fixtureData = await loadFixture(prepareUserDecryptEIP712Fixture); - gatewayConfig = fixtureData.gatewayConfig; - kmsGeneration = fixtureData.kmsGeneration; MultichainACL = fixtureData.MultichainACL; ciphertextCommits = fixtureData.ciphertextCommits; decryption = fixtureData.decryption; @@ -1216,9 +1214,19 @@ describe("Decryption", function () { await MultichainACL.connect(coprocessorTxSenders[i]).allowAccount(newCtHandle, contractAddress, extraDataV0); } + const newSnsCiphertextMaterial = { + ctHandle: newCtHandle, + keyId: newKeyId, + snsCiphertextDigest, + coprocessorTxSenderAddresses: coprocessorTxSenders.map((s) => s.address), + contextId, + }; + + const ctHandleContractPairsDifferentKeyIds = [...ctHandleContractPairs, newCtHandleContractPair]; + // Request user decryption with ctMaterials tied to different key IDs const requestTx = decryption.userDecryptionRequest( - [...ctHandleContractPairs, newCtHandleContractPair], + ctHandleContractPairsDifferentKeyIds, requestValidity, contractsInfo, user.address, @@ -1229,16 +1237,8 @@ describe("Decryption", function () { // Check that different key IDs are not allowed for batched user decryption await expect(requestTx) - .to.revertedWithCustomError(decryption, "DifferentKeyIdsNotAllowed") - .withArgs( - toValues(snsCiphertextMaterials[0]), - toValues({ - ctHandle: newCtHandle, - keyId: newKeyId, - snsCiphertextDigest, - coprocessorTxSenderAddresses: coprocessorTxSenders.map((s) => s.address), - }), - ); + .to.be.revertedWithCustomError(decryption, "DifferentKeyIdsNotAllowed") + .withArgs(toValues(snsCiphertextMaterials[0]), toValues(newSnsCiphertextMaterial)); }); it("Should revert because of two responses with same signature", async function () { diff --git a/gateway-contracts/test/GatewayConfig.ts b/gateway-contracts/test/GatewayConfig.ts index 3d42ac7437..c70afbbde9 100644 --- a/gateway-contracts/test/GatewayConfig.ts +++ b/gateway-contracts/test/GatewayConfig.ts @@ -1,7 +1,7 @@ import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; import { expect } from "chai"; -import { ContractFactory, EventLog, Wallet } from "ethers"; +import { ContractFactory, Wallet } from "ethers"; import hre from "hardhat"; import { @@ -16,11 +16,7 @@ import { } from "../typechain-types"; // The type needs to be imported separately because it is not properly detected by the linter // as this type is defined as a shared structs instead of directly in the IDecryption interface -import { - CoprocessorStruct, - CustodianStruct, - KmsNodeStruct, -} from "../typechain-types/contracts/interfaces/IGatewayConfig"; +import { CustodianStruct, KmsNodeStruct } from "../typechain-types/contracts/interfaces/IGatewayConfig"; import { UINT64_MAX, createRandomWallet, loadHostChainIds, loadTestVariablesFixture, toValues } from "./utils"; describe("GatewayConfig", function () { @@ -47,10 +43,7 @@ describe("GatewayConfig", function () { let kmsNodes: KmsNodeStruct[]; let kmsTxSenders: HardhatEthersSigner[]; let kmsSigners: HardhatEthersSigner[]; - let coprocessors: CoprocessorStruct[]; let custodians: CustodianStruct[]; - let coprocessorTxSenders: HardhatEthersSigner[]; - let coprocessorSigners: HardhatEthersSigner[]; let custodianTxSenders: HardhatEthersSigner[]; let custodianSigners: HardhatEthersSigner[]; @@ -62,10 +55,6 @@ describe("GatewayConfig", function () { kmsNodeIps, kmsNodeStorageUrls, nKmsNodes, - coprocessorTxSenders, - coprocessorSigners, - coprocessorS3Buckets, - nCoprocessors, custodianTxSenders, custodianSigners, custodianEncryptionKeys, @@ -83,16 +72,6 @@ describe("GatewayConfig", function () { }); } - // Create coprocessors with the tx sender and signer addresses - coprocessors = []; - for (let i = 0; i < nCoprocessors; i++) { - coprocessors.push({ - txSenderAddress: coprocessorTxSenders[i].address, - signerAddress: coprocessorSigners[i].address, - s3BucketUrl: coprocessorS3Buckets[i], - }); - } - // Create custodians with the tx sender addresses custodians = []; for (let i = 0; i < nCustodians; i++) { @@ -103,7 +82,7 @@ describe("GatewayConfig", function () { }); } - return fixtureData; + return { ...fixtureData, kmsNodes, custodians }; } before(async function () { @@ -113,11 +92,10 @@ describe("GatewayConfig", function () { pauserSet = fixtureData.pauserSet; owner = fixtureData.owner; pauser = fixtureData.pauser; + kmsNodes = fixtureData.kmsNodes; nKmsNodes = fixtureData.nKmsNodes; kmsTxSenders = fixtureData.kmsTxSenders; kmsSigners = fixtureData.kmsSigners; - coprocessorTxSenders = fixtureData.coprocessorTxSenders; - coprocessorSigners = fixtureData.coprocessorSigners; }); describe("Deployment", function () { @@ -137,46 +115,6 @@ describe("GatewayConfig", function () { newGatewayConfigFactory = await hre.ethers.getContractFactory("GatewayConfig", owner); }); - // This test is not here for making sure the deployment works, as all contracts are deployed in the - // hardhat "test" pre-hook, but rather to verify that the event is emitted correctly (since it - // contains several parameters). - it("Should deploy the GatewayConfig contract", async function () { - // Upgrade the proxy contract to the GatewayConfig contract - const upgradeTx = await hre.upgrades.upgradeProxy(proxyContract, newGatewayConfigFactory, { - call: { - fn: "initializeFromEmptyProxy", - args: [ - protocolMetadata, - mpcThreshold, - publicDecryptionThreshold, - userDecryptionThreshold, - kmsGenThreshold, - kmsNodes, - coprocessors, - custodians, - ], - }, - }); - - // Extract event args and convert to strings. This is needed as the "upgradeProxy()" method above - // returns an GatewayConfig instance instead of a ContractTransactionResponse, so the expect() function - // from chaijs fails on the evaluation of the transaction events. - const initializeGatewayConfigEvents = await upgradeTx.queryFilter(upgradeTx.filters.InitializeGatewayConfig); - const stringifiedEventArgs = (initializeGatewayConfigEvents[0] as EventLog).args.map((arg: any) => - arg.toString(), - ); - - // It should emit one event containing the initialization parameters - expect(initializeGatewayConfigEvents.length).to.equal(1); - expect(stringifiedEventArgs).to.deep.equal([ - toValues(protocolMetadata).toString(), - mpcThreshold, - toValues(kmsNodes).toString(), - toValues(coprocessors).toString(), - toValues(custodians).toString(), - ]); - }); - it("Should revert because the KMS nodes list is empty", async function () { const emptyKmsNodes: KmsNodeStruct[] = []; @@ -191,7 +129,6 @@ describe("GatewayConfig", function () { userDecryptionThreshold, kmsGenThreshold, emptyKmsNodes, - coprocessors, custodians, ], }, @@ -199,28 +136,6 @@ describe("GatewayConfig", function () { ).to.be.revertedWithCustomError(gatewayConfig, "EmptyKmsNodes"); }); - it("Should revert because the coprocessors list is empty", async function () { - const emptyCoprocessors: CoprocessorStruct[] = []; - - await expect( - hre.upgrades.upgradeProxy(proxyContract, newGatewayConfigFactory, { - call: { - fn: "initializeFromEmptyProxy", - args: [ - protocolMetadata, - mpcThreshold, - publicDecryptionThreshold, - userDecryptionThreshold, - kmsGenThreshold, - kmsNodes, - emptyCoprocessors, - custodians, - ], - }, - }), - ).to.be.revertedWithCustomError(gatewayConfig, "EmptyCoprocessors"); - }); - it("Should revert because the custodians list is empty", async function () { const emptyCustodians: CustodianStruct[] = []; @@ -235,7 +150,6 @@ describe("GatewayConfig", function () { userDecryptionThreshold, kmsGenThreshold, kmsNodes, - coprocessors, emptyCustodians, ], }, @@ -258,7 +172,6 @@ describe("GatewayConfig", function () { userDecryptionThreshold, kmsGenThreshold, kmsNodes, - coprocessors, custodians, ], }, @@ -283,7 +196,6 @@ describe("GatewayConfig", function () { userDecryptionThreshold, kmsGenThreshold, kmsNodes, - coprocessors, custodians, ], }, @@ -306,7 +218,6 @@ describe("GatewayConfig", function () { userDecryptionThreshold, kmsGenThreshold, kmsNodes, - coprocessors, custodians, ], }, @@ -331,7 +242,6 @@ describe("GatewayConfig", function () { nullUserDecryptionThreshold, kmsGenThreshold, kmsNodes, - coprocessors, custodians, ], }, @@ -354,7 +264,6 @@ describe("GatewayConfig", function () { highUserDecryptionThreshold, kmsGenThreshold, kmsNodes, - coprocessors, custodians, ], }, @@ -379,7 +288,6 @@ describe("GatewayConfig", function () { userDecryptionThreshold, nullKmsGenThreshold, kmsNodes, - coprocessors, custodians, ], }, @@ -402,7 +310,6 @@ describe("GatewayConfig", function () { userDecryptionThreshold, highKmsGenThreshold, kmsNodes, - coprocessors, custodians, ], }, @@ -424,7 +331,6 @@ describe("GatewayConfig", function () { userDecryptionThreshold, kmsGenThreshold, kmsNodes, - coprocessors, custodians, ], }, @@ -440,7 +346,6 @@ describe("GatewayConfig", function () { pauser = fixture.pauser; kmsTxSenders = fixture.kmsTxSenders; kmsSigners = fixture.kmsSigners; - coprocessorTxSenders = fixture.coprocessorTxSenders; custodianTxSenders = fixture.custodianTxSenders; custodianSigners = fixture.custodianSigners; }); @@ -458,26 +363,6 @@ describe("GatewayConfig", function () { } }); - it("Should be registered as coprocessors transaction senders", async function () { - for (const coprocessorTxSender of coprocessorTxSenders) { - expect(await gatewayConfig.isCoprocessorTxSender(coprocessorTxSender.address)).to.be.true; - } - }); - - it("Should not be registered as coprocessors transaction senders", async function () { - expect(await gatewayConfig.isCoprocessorTxSender(fakeTxSender)).to.be.false; - }); - - it("Should be registered as coprocessors signers", async function () { - for (const coprocessorSigner of coprocessorSigners) { - expect(await gatewayConfig.isCoprocessorSigner(coprocessorSigner.address)).to.be.true; - } - }); - - it("Should not be registered as coprocessors signers", async function () { - expect(await gatewayConfig.isCoprocessorSigner(fakeSigner)).to.be.false; - }); - it("Should be registered as custodian transaction senders", async function () { for (const custodianTxSender of custodianTxSenders) { expect(await gatewayConfig.isCustodianTxSender(custodianTxSender.address)).to.be.true; @@ -546,30 +431,6 @@ describe("GatewayConfig", function () { } }); - it("Should get all coprocessor transaction sender addresses", async function () { - const coprocessorTxSenderAddresses = await gatewayConfig.getCoprocessorTxSenders(); - - // Check that the number of coprocessor transaction sender addresses is correct - expect(coprocessorTxSenderAddresses.length).to.equal(coprocessorTxSenders.length); - - // Check that all coprocessor transaction sender addresses are in the list - for (const coprocessorTxSender of coprocessorTxSenders) { - expect(coprocessorTxSenderAddresses).to.include(coprocessorTxSender.address); - } - }); - - it("Should get all coprocessor signer addresses", async function () { - const coprocessorSignerAddresses = await gatewayConfig.getCoprocessorSigners(); - - // Check that the number of coprocessor signer addresses is correct - expect(coprocessorSignerAddresses.length).to.equal(coprocessorSigners.length); - - // Check that all coprocessor signer addresses are in the list - for (const coprocessorSigner of coprocessorSigners) { - expect(coprocessorSignerAddresses).to.include(coprocessorSigner.address); - } - }); - it("Should get custodian metadata from transaction sender addresses", async function () { for (let i = 0; i < custodianTxSenders.length; i++) { const custodian = await gatewayConfig.getCustodian(custodianTxSenders[i].address); diff --git a/gateway-contracts/test/InputVerification.ts b/gateway-contracts/test/InputVerification.ts index e5c8bef332..028c846ed8 100644 --- a/gateway-contracts/test/InputVerification.ts +++ b/gateway-contracts/test/InputVerification.ts @@ -1,12 +1,15 @@ import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { loadFixture, time } from "@nomicfoundation/hardhat-network-helpers"; import { expect } from "chai"; import { Wallet } from "ethers"; import hre from "hardhat"; -import { GatewayConfig, InputVerification, InputVerification__factory } from "../typechain-types"; +import { CoprocessorContexts, GatewayConfig, InputVerification, InputVerification__factory } from "../typechain-types"; +import { CoprocessorContextTimePeriodsStruct } from "../typechain-types/contracts/CoprocessorContexts"; import { + ContextStatus, EIP712, + addNewCoprocessorContext, createByteInput, createCtHandles, createEIP712ResponseZKPoK, @@ -14,6 +17,7 @@ import { createRandomWallet, getSignaturesZKPoK, loadTestVariablesFixture, + refreshCoprocessorContextAfterTimePeriod, } from "./utils"; describe("InputVerification", function () { @@ -28,6 +32,9 @@ describe("InputVerification", function () { // Expected ZK proof id (after first request) const zkProofId = 1; + // Define the first context ID + const contextId = 1; + // Define 3 new valid ctHandles const newCtHandles = createCtHandles(3); @@ -68,13 +75,15 @@ describe("InputVerification", function () { describe("Verify proof request", async function () { let gatewayConfig: GatewayConfig; let inputVerification: InputVerification; + let coprocessorContexts: CoprocessorContexts; let contractChainId: number; let owner: Wallet; let pauser: Wallet; - before(async function () { + beforeEach(async function () { const fixture = await loadFixture(loadTestVariablesFixture); gatewayConfig = fixture.gatewayConfig; + coprocessorContexts = fixture.coprocessorContexts; inputVerification = fixture.inputVerification; contractChainId = fixture.chainIds[0]; owner = fixture.owner; @@ -93,7 +102,15 @@ describe("InputVerification", function () { await expect(txResponse) .to.emit(inputVerification, "VerifyProofRequest") - .withArgs(zkProofId, contractChainId, contractAddress, userAddress, ciphertextWithZKProof, extraDataV0); + .withArgs( + zkProofId, + contextId, + contractChainId, + contractAddress, + userAddress, + ciphertextWithZKProof, + extraDataV0, + ); }); it("Should revert because the contract's chain ID does not correspond to a registered host chain", async function () { @@ -121,10 +138,72 @@ describe("InputVerification", function () { .verifyProofRequest(contractChainId, contractAddress, userAddress, ciphertextWithZKProof, extraDataV0), ).to.be.revertedWithCustomError(inputVerification, "EnforcedPause"); }); + + describe("Context changes", async function () { + let timePeriods: CoprocessorContextTimePeriodsStruct; + + // Define the new expected context ID + const newContextId = 2; + + beforeEach(async function () { + // Add a new coprocessor context + const newCoprocessorContext = await addNewCoprocessorContext(3, coprocessorContexts, owner); + timePeriods = newCoprocessorContext.timePeriods; + }); + + it("Should activate the new context and suspend the old one", async function () { + // Increase the block timestamp to reach the end of the pre-activation period + await time.increase(timePeriods.preActivationTimePeriod); + + // Trigger a proof verification request to refresh the statuses of the coprocessor contexts + await inputVerification.verifyProofRequest( + contractChainId, + contractAddress, + userAddress, + ciphertextWithZKProof, + extraDataV0, + ); + + // Make sure the old context has been suspended + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Suspended); + + // Make sure the new context has been activated + expect(await coprocessorContexts.getCoprocessorContextStatus(newContextId)).to.equal(ContextStatus.Active); + }); + + it("Should deactivate the suspended context", async function () { + // Increase the block timestamp to reach the end of the pre-activation period + await time.increase(timePeriods.preActivationTimePeriod); + + // Trigger a proof verification request to refresh the status of the coprocessor context + await inputVerification.verifyProofRequest( + contractChainId, + contractAddress, + userAddress, + ciphertextWithZKProof, + extraDataV0, + ); + + // Increase the block timestamp to reach the end of the suspended period + await time.increase(timePeriods.suspendedTimePeriod); + + // Trigger an additional proof verification request to refresh the status of the coprocessor context + await inputVerification.verifyProofRequest( + contractChainId, + contractAddress, + userAddress, + ciphertextWithZKProof, + extraDataV0, + ); + + // Make sure the old context has been deactivated + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Deactivated); + }); + }); }); describe("Proof verification response", async function () { - let gatewayConfig: GatewayConfig; + let coprocessorContexts: CoprocessorContexts; let inputVerification: InputVerification; let coprocessorTxSenders: HardhatEthersSigner[]; let coprocessorSigners: HardhatEthersSigner[]; @@ -132,16 +211,16 @@ describe("InputVerification", function () { let inputVerificationAddress: string; let eip712Message: EIP712; let signatures: string[]; - let pauser: Wallet; + let owner: Wallet; beforeEach(async function () { const fixture = await loadFixture(loadTestVariablesFixture); - gatewayConfig = fixture.gatewayConfig; + coprocessorContexts = fixture.coprocessorContexts; inputVerification = fixture.inputVerification; coprocessorTxSenders = fixture.coprocessorTxSenders; coprocessorSigners = fixture.coprocessorSigners; contractChainId = fixture.chainIds[0]; - pauser = fixture.pauser; + owner = fixture.owner; inputVerificationAddress = await inputVerification.getAddress(); @@ -153,6 +232,7 @@ describe("InputVerification", function () { userAddress, contractAddress, contractChainId, + contextId, extraDataV0, ); @@ -182,7 +262,7 @@ describe("InputVerification", function () { // Check 2nd response event: it should only contain 2 valid signatures await expect(txResponse) .to.emit(inputVerification, "VerifyProofResponse") - .withArgs(zkProofId, ctHandles, signatures.slice(0, 2)); + .withArgs(zkProofId, contextId, ctHandles, signatures.slice(0, 2), extraDataV0); }); it("Should verify proof with 2 valid responses and ignore the other valid one", async function () { @@ -232,7 +312,7 @@ describe("InputVerification", function () { // Check 3rd response event: it should only contain 2 valid signatures await expect(txResponse3) .to.emit(inputVerification, "VerifyProofResponse") - .withArgs(zkProofId, ctHandles, signatures.slice(1, 3)); + .withArgs(zkProofId, contextId, ctHandles, signatures.slice(1, 3), extraDataV0); }); it("Should verify a proof with 2 valid and 1 malicious signatures", async function () { @@ -245,6 +325,7 @@ describe("InputVerification", function () { userAddress, contractAddress, contractChainId, + contextId, extraDataV0, ); @@ -280,7 +361,7 @@ describe("InputVerification", function () { // Check 3rd response event: it should only contain 2 valid signatures await expect(txResponse3) .to.emit(inputVerification, "VerifyProofResponse") - .withArgs(zkProofId, ctHandles, signatures.slice(1, 3)); + .withArgs(zkProofId, contextId, ctHandles, signatures.slice(1, 3), extraDataV0); }); it("Should get all valid coprocessor transaction senders from proof verification consensus", async function () { @@ -336,6 +417,7 @@ describe("InputVerification", function () { userAddress, contractAddress, contractChainId, + contextId, extraDataV0, ); @@ -436,16 +518,16 @@ describe("InputVerification", function () { .connect(coprocessorTxSenders[0]) .verifyProofResponse(zkProofId, ctHandles, fakeSignature, extraDataV0), ) - .revertedWithCustomError(inputVerification, "NotCoprocessorSigner") - .withArgs(fakeSigner.address); + .revertedWithCustomError(inputVerification, "NotCoprocessorSignerFromContext") + .withArgs(contextId, fakeSigner.address); }); it("Should revert because the transaction sender is not a coprocessor", async function () { await expect( inputVerification.connect(fakeTxSender).verifyProofResponse(zkProofId, ctHandles, signatures[0], extraDataV0), ) - .revertedWithCustomError(inputVerification, "NotCoprocessorTxSender") - .withArgs(fakeTxSender.address); + .revertedWithCustomError(inputVerification, "NotCoprocessorTxSenderFromContext") + .withArgs(contextId, fakeTxSender.address); }); it("Should check that a proof has been verified", async function () { @@ -462,25 +544,113 @@ describe("InputVerification", function () { it("Should check that a proof has not been verified", async function () { expect(await inputVerification.isProofVerified(fakeZkProofId)).to.be.false; }); + + describe("Context changes", async function () { + let timePeriods: CoprocessorContextTimePeriodsStruct; + + // Define the new expected context ID + const newContextId = 2; + + beforeEach(async function () { + // Add a new coprocessor context + const newCoprocessorContext = await addNewCoprocessorContext(3, coprocessorContexts, owner); + timePeriods = newCoprocessorContext.timePeriods; + }); + + it("Should activate the new context and suspend the old one", async function () { + // Increase the block timestamp to reach the end of the pre-activation period + await time.increase(timePeriods.preActivationTimePeriod); + + // Trigger a proof verification response to refresh the statuses of the coprocessor contexts + await inputVerification + .connect(coprocessorTxSenders[0]) + .verifyProofResponse(zkProofId, ctHandles, signatures[0], extraDataV0); + + // Make sure the old context has been suspended + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Suspended); + + // Make sure the new context has been activated + expect(await coprocessorContexts.getCoprocessorContextStatus(newContextId)).to.equal(ContextStatus.Active); + }); + + it("Should deactivate the suspended context", async function () { + // Increase the block timestamp to reach the end of the pre-activation period + await time.increase(timePeriods.preActivationTimePeriod); + + // Trigger a proof verification response to refresh the status of the coprocessor context + await inputVerification + .connect(coprocessorTxSenders[0]) + .verifyProofResponse(zkProofId, ctHandles, signatures[0], extraDataV0); + + // Then increase the block timestamp to reach the end of the suspended period and refresh the status + // Here we cannot call the `verifyProofResponse` anymore because the context will be deactivated + // at the beginning of it, making it invalid and thus reverting the transaction. Another option + // would be to call another request, or a response based on a different zkProofId. + await refreshCoprocessorContextAfterTimePeriod(timePeriods.suspendedTimePeriod, coprocessorContexts); + + // Make sure the old context has been deactivated + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Deactivated); + }); + + it("Should verify proof with suspended context", async function () { + // Trigger a first valid proof verification response + await inputVerification + .connect(coprocessorTxSenders[0]) + .verifyProofResponse(zkProofId, ctHandles, signatures[0], extraDataV0); + + // Wait for the pre activation period to pass: this suspends the old context + await refreshCoprocessorContextAfterTimePeriod(timePeriods.preActivationTimePeriod, coprocessorContexts); + + // Trigger a second valid proof verification response + let txResponse = await inputVerification + .connect(coprocessorTxSenders[1]) + .verifyProofResponse(zkProofId, ctHandles, signatures[1], extraDataV0); + + // Consensus should be reached at the second response + // This is because the consensus is reached amongst the suspended context (3 coprocessors) + // and not the new one (1 coprocessor) + await expect(txResponse) + .to.emit(inputVerification, "VerifyProofResponse") + .withArgs(zkProofId, contextId, ctHandles, signatures.slice(0, 2), extraDataV0); + }); + + it("Should revert because the context is no longer valid", async function () { + // Wait for the pre activation period to pass: this suspends the old context + await refreshCoprocessorContextAfterTimePeriod(timePeriods.preActivationTimePeriod, coprocessorContexts); + + // Wait for the suspended period to pass: this deactivates the old context + await refreshCoprocessorContextAfterTimePeriod(timePeriods.suspendedTimePeriod, coprocessorContexts); + + // Check that allow verifying a proof associated to a request that have been registered under + // an active context reverts because this context is no longer valid + await expect( + inputVerification + .connect(coprocessorTxSenders[0]) + .verifyProofResponse(zkProofId, ctHandles, signatures[0], extraDataV0), + ) + .revertedWithCustomError(inputVerification, "InvalidCoprocessorContextProofVerification") + .withArgs(zkProofId, contextId, ContextStatus.Deactivated); + }); + }); }); describe("Proof rejection response", async function () { - let gatewayConfig: GatewayConfig; + let coprocessorContexts: CoprocessorContexts; let inputVerification: InputVerification; let coprocessorTxSenders: HardhatEthersSigner[]; let coprocessorSigners: HardhatEthersSigner[]; let contractChainId: number; let inputVerificationAddress: string; - let pauser: Wallet; + let owner: Wallet; beforeEach(async function () { const fixture = await loadFixture(loadTestVariablesFixture); - gatewayConfig = fixture.gatewayConfig; + coprocessorContexts = fixture.coprocessorContexts; inputVerification = fixture.inputVerification; coprocessorTxSenders = fixture.coprocessorTxSenders; coprocessorSigners = fixture.coprocessorSigners; contractChainId = fixture.chainIds[0]; - pauser = fixture.pauser; + owner = fixture.owner; inputVerificationAddress = await inputVerification.getAddress(); @@ -500,7 +670,7 @@ describe("InputVerification", function () { const txResponse = inputVerification.connect(coprocessorTxSenders[1]).rejectProofResponse(zkProofId, extraDataV0); // Consensus should be reached at the second response - await expect(txResponse).to.emit(inputVerification, "RejectProofResponse").withArgs(zkProofId); + await expect(txResponse).to.emit(inputVerification, "RejectProofResponse").withArgs(zkProofId, extraDataV0); }); it("Should reject a proof with 2 valid responses and ignore the other valid one", async function () { @@ -529,6 +699,7 @@ describe("InputVerification", function () { userAddress, contractAddress, contractChainId, + contextId, extraDataV0, ); @@ -561,7 +732,7 @@ describe("InputVerification", function () { .rejectProofResponse(zkProofId, extraDataV0); // Consensus should be reached at the third response - await expect(txResponse3).to.emit(inputVerification, "RejectProofResponse").withArgs(zkProofId); + await expect(txResponse3).to.emit(inputVerification, "RejectProofResponse").withArgs(zkProofId, extraDataV0); }); it("Should get all valid coprocessor transaction senders from proof rejection consensus", async function () { @@ -610,6 +781,7 @@ describe("InputVerification", function () { userAddress, contractAddress, contractChainId, + contextId, extraDataV0, ); @@ -666,6 +838,7 @@ describe("InputVerification", function () { userAddress, contractAddress, contractChainId, + contextId, extraDataV0, ); @@ -688,8 +861,8 @@ describe("InputVerification", function () { it("Should revert because the sender is not a coprocessor transaction sender", async function () { // Check that triggering a proof response with a non-coprocessor transaction sender reverts await expect(inputVerification.connect(fakeTxSender).rejectProofResponse(zkProofId, extraDataV0)) - .revertedWithCustomError(inputVerification, "NotCoprocessorTxSender") - .withArgs(fakeTxSender.address); + .revertedWithCustomError(inputVerification, "NotCoprocessorTxSenderFromContext") + .withArgs(contextId, fakeTxSender.address); }); it("Should check that a proof has been rejected", async function () { @@ -704,6 +877,82 @@ describe("InputVerification", function () { it("Should check that a proof has not been rejected", async function () { expect(await inputVerification.isProofRejected(fakeZkProofId)).to.be.false; }); + + describe("Context changes", async function () { + let timePeriods: CoprocessorContextTimePeriodsStruct; + + // Define the new expected context ID + const newContextId = 2; + + beforeEach(async function () { + // Add a new coprocessor context + const newCoprocessorContext = await addNewCoprocessorContext(3, coprocessorContexts, owner); + timePeriods = newCoprocessorContext.timePeriods; + }); + + it("Should activate the new context and suspend the old one", async function () { + // Increase the block timestamp to reach the end of the pre-activation period + await time.increase(timePeriods.preActivationTimePeriod); + + // Trigger a proof rejection response to refresh the statuses of the coprocessor contexts + await inputVerification.connect(coprocessorTxSenders[0]).rejectProofResponse(zkProofId, extraDataV0); + + // Make sure the old context has been suspended + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Suspended); + + // Make sure the new context has been activated + expect(await coprocessorContexts.getCoprocessorContextStatus(newContextId)).to.equal(ContextStatus.Active); + }); + + it("Should deactivate the suspended context", async function () { + // Increase the block timestamp to reach the end of the pre-activation period + await time.increase(timePeriods.preActivationTimePeriod); + + // Trigger a proof rejection response to refresh the status of the coprocessor context + await inputVerification.connect(coprocessorTxSenders[0]).rejectProofResponse(zkProofId, extraDataV0); + + // Then increase the block timestamp to reach the end of the suspended period and refresh the status + // Here we cannot call the `verifyProofResponse` anymore because the context will be deactivated + // at the beginning of it, making it invalid and thus reverting the transaction. Another option + // would be to call another request, or a response based on a different zkProofId. + await refreshCoprocessorContextAfterTimePeriod(timePeriods.suspendedTimePeriod, coprocessorContexts); + + // Make sure the old context has been deactivated + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Deactivated); + }); + + it("Should reject proof with suspended context", async function () { + // Trigger a first valid proof rejection response + await inputVerification.connect(coprocessorTxSenders[0]).rejectProofResponse(zkProofId, extraDataV0); + + // Wait for the pre activation period to pass: this suspends the old context + await refreshCoprocessorContextAfterTimePeriod(timePeriods.preActivationTimePeriod, coprocessorContexts); + + // Trigger a second valid proof rejection response + let txResponse = await inputVerification + .connect(coprocessorTxSenders[1]) + .rejectProofResponse(zkProofId, extraDataV0); + + // Consensus should be reached at the second response + // This is because the consensus is reached amongst the suspended context (3 coprocessors) + // and not the new one (1 coprocessor) + await expect(txResponse).to.emit(inputVerification, "RejectProofResponse").withArgs(zkProofId, extraDataV0); + }); + + it("Should revert because the context is no longer valid", async function () { + // Wait for the pre activation period to pass: this suspends the old context + await refreshCoprocessorContextAfterTimePeriod(timePeriods.preActivationTimePeriod, coprocessorContexts); + + // Wait for the suspended period to pass: this deactivates the old context + await refreshCoprocessorContextAfterTimePeriod(timePeriods.suspendedTimePeriod, coprocessorContexts); + + // Check that allow rejecting a proof associated to a request that have been registered under + // an active context reverts because this context is no longer valid + await expect(inputVerification.connect(coprocessorTxSenders[0]).rejectProofResponse(zkProofId, extraDataV0)) + .revertedWithCustomError(inputVerification, "InvalidCoprocessorContextProofRejection") + .withArgs(zkProofId, contextId, ContextStatus.Deactivated); + }); + }); }); describe("Pause", async function () { diff --git a/gateway-contracts/test/MultichainACL.ts b/gateway-contracts/test/MultichainACL.ts index 141dadf2b2..6e951ece39 100644 --- a/gateway-contracts/test/MultichainACL.ts +++ b/gateway-contracts/test/MultichainACL.ts @@ -1,20 +1,23 @@ import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { loadFixture, time } from "@nomicfoundation/hardhat-network-helpers"; import { expect } from "chai"; -import { Wallet } from "ethers"; +import { HDNodeWallet, Wallet } from "ethers"; import hre from "hardhat"; -import { GatewayConfig, MultichainACL, MultichainACL__factory } from "../typechain-types"; +import { CoprocessorContexts, GatewayConfig, MultichainACL, MultichainACL__factory } from "../typechain-types"; +import { CoprocessorContextTimePeriodsStruct } from "../typechain-types/contracts/interfaces/ICoprocessorContexts"; // The type needs to be imported separately because it is not properly detected by the linter // as this type is defined as a shared structs instead of directly in the IMultichainACL interface -import { DelegationAccountsStruct } from "../typechain-types/contracts/interfaces/IMultichainACL"; import { + ContextStatus, + addNewCoprocessorContext, createCtHandle, createRandomAddress, createRandomAddresses, createRandomWallet, loadHostChainIds, loadTestVariablesFixture, + refreshCoprocessorContextAfterTimePeriod, toValues, } from "./utils"; @@ -31,6 +34,9 @@ describe("MultichainACL", function () { // Define a new ctHandle (it won't be allowed for public decryption or account access by default) const newCtHandle = createCtHandle(hostChainId); + // Define the first context ID + const contextId = 1; + // Define fake values const fakeHostChainId = 123; const ctHandleFakeChainId = createCtHandle(fakeHostChainId); @@ -41,6 +47,7 @@ describe("MultichainACL", function () { let gatewayConfig: GatewayConfig; let MultichainACL: MultichainACL; + let coprocessorContexts: CoprocessorContexts; let coprocessorTxSenders: HardhatEthersSigner[]; let owner: Wallet; let pauser: Wallet; @@ -50,6 +57,7 @@ describe("MultichainACL", function () { const fixture = await loadFixture(loadTestVariablesFixture); gatewayConfig = fixture.gatewayConfig; MultichainACL = fixture.MultichainACL; + coprocessorContexts = fixture.coprocessorContexts; coprocessorTxSenders = fixture.coprocessorTxSenders; owner = fixture.owner; pauser = fixture.pauser; @@ -183,8 +191,8 @@ describe("MultichainACL", function () { it("Should revert because the transaction sender is not a coprocessor", async function () { await expect(MultichainACL.connect(fakeTxSender).allowAccount(ctHandle, newAccountAddress, extraDataV0)) - .revertedWithCustomError(MultichainACL, "NotCoprocessorTxSender") - .withArgs(fakeTxSender.address); + .revertedWithCustomError(MultichainACL, "NotCoprocessorTxSenderFromContext") + .withArgs(contextId, fakeTxSender.address); }); it("Should be true because the account is allowed to use the ciphertext", async function () { @@ -201,6 +209,72 @@ describe("MultichainACL", function () { expect(await MultichainACL.connect(coprocessorTxSenders[0]).isAccountAllowed(newCtHandle, accountAddress)).to.be .false; }); + + describe("Context changes", async function () { + let timePeriods: CoprocessorContextTimePeriodsStruct; + + // Define the new expected context ID + const newContextId = 2; + + beforeEach(async function () { + // Allow the new account with the first coprocessor transaction sender. This should + // register the request under the first active context (ID 1) + await MultichainACL.connect(coprocessorTxSenders[0]).allowAccount(newCtHandle, accountAddress, extraDataV0); + + // Add a new coprocessor context using a bigger set of coprocessors with different tx sender + // and signer addresses + const newCoprocessorContext = await addNewCoprocessorContext(10, coprocessorContexts, owner); + timePeriods = newCoprocessorContext.timePeriods; + }); + + it("Should allow account with suspended context", async function () { + // The second transaction should reach consensus and thus emit the expected event + // This is because the consensus is reached amongst the suspended context (3 coprocessors) + // and not the new one (10 coprocessors) + const result = await MultichainACL.connect(coprocessorTxSenders[1]).allowAccount( + newCtHandle, + accountAddress, + extraDataV0, + ); + + await expect(result).to.emit(MultichainACL, "AllowAccount").withArgs(newCtHandle, accountAddress); + }); + + it("Should revert because the context is no longer valid", async function () { + // Wait for the pre activation period to pass + await refreshCoprocessorContextAfterTimePeriod(timePeriods.preActivationTimePeriod, coprocessorContexts); + + // Wait for the suspended period to pass + await refreshCoprocessorContextAfterTimePeriod(timePeriods.suspendedTimePeriod, coprocessorContexts); + + // Check that allow account request that has already been registered under an active context + // reverts because this context is no longer valid + await expect( + MultichainACL.connect(coprocessorTxSenders[1]).allowAccount(newCtHandle, accountAddress, extraDataV0), + ) + .revertedWithCustomError(MultichainACL, "InvalidCoprocessorContextAllowAccount") + .withArgs(newCtHandle, accountAddress, contextId, ContextStatus.Deactivated); + }); + + it("Should revert because the transaction sender is a coprocessor from the suspended context", async function () { + // Define another new handle + // It is used to create a set of inputs different from the one used in the beforeEach block + const newCtHandle2 = createCtHandle(hostChainId); + + // Wait for the pre activation period to pass + await refreshCoprocessorContextAfterTimePeriod(timePeriods.preActivationTimePeriod, coprocessorContexts); + + // Make sure the old context has been suspended + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Suspended); + + // Make sure that a new account can't be allowed by a coprocessor from the suspended context + await expect( + MultichainACL.connect(coprocessorTxSenders[0]).allowAccount(newCtHandle2, accountAddress, extraDataV0), + ) + .revertedWithCustomError(MultichainACL, "NotCoprocessorTxSenderFromContext") + .withArgs(newContextId, coprocessorTxSenders[0].address); + }); + }); }); describe("Allow public decrypt", async function () { @@ -289,8 +363,8 @@ describe("MultichainACL", function () { it("Should revert because the transaction sender is not a coprocessor", async function () { await expect(MultichainACL.connect(fakeTxSender).allowPublicDecrypt(newCtHandle, extraDataV0)) - .revertedWithCustomError(MultichainACL, "NotCoprocessorTxSender") - .withArgs(fakeTxSender.address); + .revertedWithCustomError(MultichainACL, "NotCoprocessorTxSenderFromContext") + .withArgs(contextId, fakeTxSender.address); }); it("Should be true because the public decrypt is allowed", async function () { @@ -300,5 +374,110 @@ describe("MultichainACL", function () { it("Should be false because the handle is not allowed to be publicly decrypted", async function () { expect(await MultichainACL.connect(coprocessorTxSenders[0]).isPublicDecryptAllowed(newCtHandle)).to.be.false; }); + + describe("Context changes", async function () { + let timePeriods: CoprocessorContextTimePeriodsStruct; + let newCoprocessorTxSenders: HDNodeWallet[]; + + // Define the new expected context ID + const newContextId = 2; + + beforeEach(async function () { + // Allow a new handle for public decryption with the first coprocessor transaction sender. This should + // register the request under the first active context (ID 1) + await MultichainACL.connect(coprocessorTxSenders[0]).allowPublicDecrypt(newCtHandle, extraDataV0); + + // Add a new coprocessor context using a bigger set of coprocessors with different tx sender + // and signer addresses + const newCoprocessorContext = await addNewCoprocessorContext(10, coprocessorContexts, owner, true); + timePeriods = newCoprocessorContext.timePeriods; + newCoprocessorTxSenders = newCoprocessorContext.coprocessorTxSenders; + }); + + it("Should activate the new context and suspend the old one", async function () { + // Define another new handle. This is needed for the test to pass because `newCtHandle` is already + // registered under the first active context (ID 1) + const newCtHandle2 = createCtHandle(hostChainId); + + // Increase the block timestamp to reach the end of the pre-activation period + await time.increase(timePeriods.preActivationTimePeriod); + + // Allow a new handle with the first new coprocessor transaction sender + await MultichainACL.connect(newCoprocessorTxSenders[0]).allowPublicDecrypt(newCtHandle2, extraDataV0); + + // Make sure the old context has been suspended + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Suspended); + + // Make sure the new context has been activated + expect(await coprocessorContexts.getCoprocessorContextStatus(newContextId)).to.equal(ContextStatus.Active); + }); + + it("Should deactivate the suspended context", async function () { + // Define another new handle. This is needed for the test to pass because `newCtHandle` is already + // registered under the first active context (ID 1) + const newCtHandle2 = createCtHandle(hostChainId); + + // Increase the block timestamp to reach the end of the pre-activation period + await time.increase(timePeriods.preActivationTimePeriod); + + // Allow a new handle with the first new coprocessor transaction sender + await MultichainACL.connect(newCoprocessorTxSenders[0]).allowPublicDecrypt(newCtHandle2, extraDataV0); + + // Increase the block timestamp to reach the end of the suspended period + await time.increase(timePeriods.suspendedTimePeriod); + + // Allow a new handle with the second new coprocessor transaction sender + await MultichainACL.connect(newCoprocessorTxSenders[1]).allowPublicDecrypt(newCtHandle2, extraDataV0); + + // Make sure the old context has been deactivated + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Deactivated); + }); + + it("Should allow public decryption with suspended context", async function () { + // Wait for the pre activation period to pass + await refreshCoprocessorContextAfterTimePeriod(timePeriods.preActivationTimePeriod, coprocessorContexts); + + // The second transaction should reach consensus and thus emit the expected event + // This is because the consensus is reached amongst the suspended context (3 coprocessors) + // and not the new one (10 coprocessors) + const result = await MultichainACL.connect(coprocessorTxSenders[1]).allowPublicDecrypt( + newCtHandle, + extraDataV0, + ); + + await expect(result).to.emit(MultichainACL, "AllowPublicDecrypt").withArgs(newCtHandle); + }); + + it("Should revert because the context is no longer valid", async function () { + // Wait for the pre activation period to pass + await refreshCoprocessorContextAfterTimePeriod(timePeriods.preActivationTimePeriod, coprocessorContexts); + + // Wait for the suspended period to pass + await refreshCoprocessorContextAfterTimePeriod(timePeriods.suspendedTimePeriod, coprocessorContexts); + + // Check that allow public decrypt request that has already been registered under an active context + // reverts because this context is no longer valid + await expect(MultichainACL.connect(coprocessorTxSenders[1]).allowPublicDecrypt(newCtHandle, extraDataV0)) + .revertedWithCustomError(MultichainACL, "InvalidCoprocessorContextAllowPublicDecrypt") + .withArgs(newCtHandle, contextId, ContextStatus.Deactivated); + }); + + it("Should revert because the transaction sender is a coprocessor from the suspended context", async function () { + // Define another new handle + // It is used to create a set of inputs different from the one used in the beforeEach block + const newCtHandle2 = createCtHandle(hostChainId); + + // Wait for the pre activation period to pass + await refreshCoprocessorContextAfterTimePeriod(timePeriods.preActivationTimePeriod, coprocessorContexts); + + // Make sure the old context has been suspended + expect(await coprocessorContexts.getCoprocessorContextStatus(contextId)).to.equal(ContextStatus.Suspended); + + // Make sure that a new handle can't be allowed for public decryption by a coprocessor from the suspended context + await expect(MultichainACL.connect(coprocessorTxSenders[0]).allowPublicDecrypt(newCtHandle2, extraDataV0)) + .revertedWithCustomError(MultichainACL, "NotCoprocessorTxSenderFromContext") + .withArgs(newContextId, coprocessorTxSenders[0].address); + }); + }); }); }); diff --git a/gateway-contracts/test/mocks/mocks.ts b/gateway-contracts/test/mocks/mocks.ts index 62ee78f326..db21562ae0 100644 --- a/gateway-contracts/test/mocks/mocks.ts +++ b/gateway-contracts/test/mocks/mocks.ts @@ -4,17 +4,19 @@ import { ethers } from "hardhat"; import { CiphertextCommitsMock, + CoprocessorContextsMock, DecryptionMock, GatewayConfigMock, InputVerificationMock, KMSGenerationMock, MultichainACLMock, } from "../../typechain-types"; -import { KeyTypeEnum, ParamsTypeEnum, getCrsId, getKeyId, getPrepKeygenId, toValues } from "../utils"; +import { ContextStatus, KeyTypeEnum, ParamsTypeEnum, getCrsId, getKeyId, getPrepKeygenId, toValues } from "../utils"; describe("Mock contracts", function () { // Mock contracts let ciphertextCommitsMock: CiphertextCommitsMock; + let coprocessorContextsMock: CoprocessorContextsMock; let decryptionMock: DecryptionMock; let gatewayConfigMock: GatewayConfigMock; let kmsGenerationMock: KMSGenerationMock; @@ -34,27 +36,35 @@ describe("Mock contracts", function () { keyId: DefaultUint256, snsCiphertextDigest: DefaultBytes32, coprocessorTxSenderAddresses: EmptyArray, + contextId: DefaultUint256, }; const DefaultProtocolMetadata = { name: DefaultString, website: DefaultString }; - const DefaultKmsNodeV1 = { + const DefaultKmsNode = { txSenderAddress: DefaultAddress, signerAddress: DefaultAddress, ipAddress: DefaultString, + storageUrl: DefaultString, }; - const DefaultKmsNodeV2 = { + const DefaultCoprocessor = { + name: DefaultString, txSenderAddress: DefaultAddress, signerAddress: DefaultAddress, - ipAddress: DefaultString, storageUrl: DefaultString, }; - const DefaultCoprocessor = { - txSenderAddress: DefaultAddress, - signerAddress: DefaultAddress, - s3BucketUrl: DefaultString, + const DefaultCoprocessorContext = { + contextId: DefaultUint256, + previousContextId: DefaultUint256, + blob: DefaultBytes, + coprocessors: [], + }; + + const DefaultCoprocessorContextTimePeriods = { + preActivationTimePeriod: DefaultUint256, + suspendedTimePeriod: DefaultUint256, }; const DefaultCustodian = { @@ -81,11 +91,6 @@ describe("Mock contracts", function () { addresses: [DefaultAddress], }; - const DefaultDelegationAccounts = { - delegatorAddress: DefaultAddress, - delegatedAddress: DefaultAddress, - }; - const DefaultParamsType = ParamsTypeEnum.Default; const DefaultKmsDigest = { @@ -97,6 +102,9 @@ describe("Mock contracts", function () { const ciphertextCommitsFactory = await ethers.getContractFactory("CiphertextCommitsMock"); const ciphertextCommitsMock = await ciphertextCommitsFactory.deploy(); + const coprocessorContextsFactory = await ethers.getContractFactory("CoprocessorContextsMock"); + const coprocessorContextsMock = await coprocessorContextsFactory.deploy(); + const decryptionFactory = await ethers.getContractFactory("DecryptionMock"); const decryptionMock = await decryptionFactory.deploy(); @@ -115,6 +123,7 @@ describe("Mock contracts", function () { return { MultichainACLMock, ciphertextCommitsMock, + coprocessorContextsMock, decryptionMock, gatewayConfigMock, kmsGenerationMock, @@ -126,6 +135,7 @@ describe("Mock contracts", function () { // Initialize globally used variables before each test const fixture = await loadFixture(loadMockContractsFixture); ciphertextCommitsMock = fixture.ciphertextCommitsMock; + coprocessorContextsMock = fixture.coprocessorContextsMock; decryptionMock = fixture.decryptionMock; gatewayConfigMock = fixture.gatewayConfigMock; kmsGenerationMock = fixture.kmsGenerationMock; @@ -139,7 +149,69 @@ describe("Mock contracts", function () { ciphertextCommitsMock.addCiphertextMaterial(DefaultBytes32, DefaultUint256, DefaultBytes32, DefaultBytes32), ) .to.emit(ciphertextCommitsMock, "AddCiphertextMaterial") - .withArgs(DefaultBytes32, DefaultBytes32, DefaultBytes32, [DefaultAddress]); + .withArgs(DefaultBytes32, DefaultBytes32, DefaultBytes32, DefaultUint256); + }); + }); + + describe("CoprocessorContextsMock", async function () { + it("Should emit PreActivateCoprocessorContext event on add coprocessor context call", async function () { + await expect( + coprocessorContextsMock.addCoprocessorContext( + DefaultBytes, + [DefaultCoprocessor], + DefaultCoprocessorContextTimePeriods, + ), + ) + .to.emit(coprocessorContextsMock, "PreActivateCoprocessorContext") + .withArgs(toValues(DefaultCoprocessorContext), DefaultUint256); + }); + + it("Should emit several status events on refresh coprocessor context statuses call", async function () { + await expect(coprocessorContextsMock.refreshCoprocessorContextStatuses()) + .to.emit(coprocessorContextsMock, "SuspendCoprocessorContext") + .withArgs(DefaultUint256, DefaultUint256) + .and.emit(coprocessorContextsMock, "ActivateCoprocessorContext") + .withArgs(DefaultUint256) + .and.emit(coprocessorContextsMock, "DeactivateCoprocessorContext") + .withArgs(DefaultUint256); + }); + + it("Should emit ActivateCoprocessorContext event on force update context to active", async function () { + await expect(coprocessorContextsMock.forceUpdateCoprocessorContextToStatus(DefaultUint256, ContextStatus.Active)) + .to.emit(coprocessorContextsMock, "ActivateCoprocessorContext") + .withArgs(DefaultUint256); + }); + + it("Should emit DeactivateCoprocessorContext event on force update context to deactivated", async function () { + await expect( + coprocessorContextsMock.forceUpdateCoprocessorContextToStatus(DefaultUint256, ContextStatus.Deactivated), + ) + .to.emit(coprocessorContextsMock, "DeactivateCoprocessorContext") + .withArgs(DefaultUint256); + }); + + it("Should emit CompromiseCoprocessorContext event on force update context to compromised", async function () { + await expect( + coprocessorContextsMock.forceUpdateCoprocessorContextToStatus(DefaultUint256, ContextStatus.Compromised), + ) + .to.emit(coprocessorContextsMock, "CompromiseCoprocessorContext") + .withArgs(DefaultUint256); + }); + + it("Should emit DestroyCoprocessorContext event on force update context to destroyed", async function () { + await expect( + coprocessorContextsMock.forceUpdateCoprocessorContextToStatus(DefaultUint256, ContextStatus.Destroyed), + ) + .to.emit(coprocessorContextsMock, "DestroyCoprocessorContext") + .withArgs(DefaultUint256); + }); + + it("Should emit several events on move suspended coprocessor context to active call", async function () { + await expect(coprocessorContextsMock.swapSuspendedCoprocessorContextWithActive(DefaultUint256)) + .to.emit(coprocessorContextsMock, "SuspendCoprocessorContext") + .withArgs(DefaultUint256, DefaultUint256) + .and.emit(coprocessorContextsMock, "ActivateCoprocessorContext") + .withArgs(DefaultUint256); }); }); @@ -213,8 +285,7 @@ describe("Mock contracts", function () { DefaultUint256, DefaultUint256, DefaultUint256, - [DefaultKmsNodeV2], - [DefaultCoprocessor], + [DefaultKmsNode], [DefaultCustodian], ), ) @@ -222,8 +293,7 @@ describe("Mock contracts", function () { .withArgs( toValues(DefaultProtocolMetadata), DefaultUint256, - toValues([DefaultKmsNodeV2]), - toValues([DefaultCoprocessor]), + toValues([DefaultKmsNode]), toValues([DefaultCustodian]), ); }); @@ -255,8 +325,8 @@ describe("Mock contracts", function () { describe("InputVerificationMock", async function () { let zkProofCounterId = DefaultUint256; + zkProofCounterId++; it("Should emit VerifyProofRequest event on verify proof request", async function () { - zkProofCounterId++; await expect( inputVerificationMock.verifyProofRequest( DefaultUint256, @@ -267,7 +337,15 @@ describe("Mock contracts", function () { ), ) .to.emit(inputVerificationMock, "VerifyProofRequest") - .withArgs(zkProofCounterId, DefaultUint256, DefaultAddress, DefaultAddress, DefaultBytes, DefaultBytes); + .withArgs( + zkProofCounterId, + DefaultUint256, + DefaultUint256, + DefaultAddress, + DefaultAddress, + DefaultBytes, + DefaultBytes, + ); }); it("Should emit VerifyProofResponse event on verify proof response", async function () { @@ -275,13 +353,13 @@ describe("Mock contracts", function () { inputVerificationMock.verifyProofResponse(zkProofCounterId, [DefaultBytes32], DefaultBytes, DefaultBytes), ) .to.emit(inputVerificationMock, "VerifyProofResponse") - .withArgs(zkProofCounterId, [DefaultBytes32], [DefaultBytes]); + .withArgs(zkProofCounterId, DefaultUint256, [DefaultBytes32], [DefaultBytes], DefaultBytes); }); it("Should emit RejectProofResponse event on reject proof response", async function () { await expect(inputVerificationMock.rejectProofResponse(zkProofCounterId, DefaultBytes)) .to.emit(inputVerificationMock, "RejectProofResponse") - .withArgs(zkProofCounterId); + .withArgs(zkProofCounterId, DefaultBytes); }); }); @@ -300,7 +378,7 @@ describe("Mock contracts", function () { it("Should emit KeygenRequest event on preprocessing keygen response", async function () { await expect(kmsGenerationMock.prepKeygenResponse(prepKeygenId, DefaultBytes)) .to.emit(kmsGenerationMock, "KeygenRequest") - .withArgs(prepKeygenId, keyId); + .withArgs(prepKeygenId, DefaultUint256); }); it("Should emit ActivateKey event on keygen response", async function () { diff --git a/gateway-contracts/test/upgrades/upgrades.ts b/gateway-contracts/test/upgrades/upgrades.ts index ffe1a7ebee..b3e2fad14c 100644 --- a/gateway-contracts/test/upgrades/upgrades.ts +++ b/gateway-contracts/test/upgrades/upgrades.ts @@ -6,6 +6,8 @@ import { ethers, upgrades } from "hardhat"; import { CiphertextCommitsV2Example__factory, CiphertextCommits__factory, + CoprocessorContextsV2Example__factory, + CoprocessorContexts__factory, DecryptionV2Example__factory, Decryption__factory, EmptyUUPSProxyGatewayConfig__factory, @@ -27,6 +29,8 @@ describe("Upgrades", function () { let gatewayConfigEmptyUUPSFactory: EmptyUUPSProxyGatewayConfig__factory; let ciphertextCommitsFactoryV1: CiphertextCommits__factory; let ciphertextCommitsFactoryV2: CiphertextCommitsV2Example__factory; + let coprocessorContextsFactoryV1: CoprocessorContexts__factory; + let coprocessorContextsFactoryV2: CoprocessorContextsV2Example__factory; let decryptionFactoryV1: Decryption__factory; let decryptionFactoryV2: DecryptionV2Example__factory; let gatewayConfigFactoryV1: GatewayConfig__factory; @@ -46,6 +50,9 @@ describe("Upgrades", function () { ciphertextCommitsFactoryV1 = await ethers.getContractFactory("CiphertextCommits", owner); ciphertextCommitsFactoryV2 = await ethers.getContractFactory("CiphertextCommitsV2Example", owner); + coprocessorContextsFactoryV1 = await ethers.getContractFactory("CoprocessorContexts", owner); + coprocessorContextsFactoryV2 = await ethers.getContractFactory("CoprocessorContextsV2Example", owner); + decryptionFactoryV1 = await ethers.getContractFactory("Decryption", owner); decryptionFactoryV2 = await ethers.getContractFactory("DecryptionV2Example", owner); @@ -70,7 +77,7 @@ describe("Upgrades", function () { }); const MultichainACL = await upgrades.upgradeProxy(emptyUUPS, MultichainACLFactoryV1); await MultichainACL.waitForDeployment(); - expect(await MultichainACL.getVersion()).to.equal("MultichainACL v0.1.0"); + expect(await MultichainACL.getVersion()).to.equal("MultichainACL v0.2.0"); const MultichainACLV2 = await upgrades.upgradeProxy(MultichainACL, MultichainACLFactoryV2); await MultichainACLV2.waitForDeployment(); expect(await MultichainACLV2.getVersion()).to.equal("MultichainACL v1000.0.0"); @@ -88,12 +95,25 @@ describe("Upgrades", function () { }); const ciphertextCommits = await upgrades.upgradeProxy(emptyUUPS, ciphertextCommitsFactoryV1); await ciphertextCommits.waitForDeployment(); - expect(await ciphertextCommits.getVersion()).to.equal("CiphertextCommits v0.1.0"); + expect(await ciphertextCommits.getVersion()).to.equal("CiphertextCommits v0.2.0"); const ciphertextCommitsV2 = await upgrades.upgradeProxy(ciphertextCommits, ciphertextCommitsFactoryV2); await ciphertextCommitsV2.waitForDeployment(); expect(await ciphertextCommitsV2.getVersion()).to.equal("CiphertextCommits v1000.0.0"); }); + it("Should deploy upgradable CoprocessorContexts", async function () { + const emptyUUPS = await upgrades.deployProxy(regularEmptyUUPSFactory, [], { + initializer: "initialize", + kind: "uups", + }); + const coprocessorContexts = await upgrades.upgradeProxy(emptyUUPS, coprocessorContextsFactoryV1); + await coprocessorContexts.waitForDeployment(); + expect(await coprocessorContexts.getVersion()).to.equal("CoprocessorContexts v0.1.0"); + const coprocessorContextsV2 = await upgrades.upgradeProxy(coprocessorContexts, coprocessorContextsFactoryV2); + await coprocessorContextsV2.waitForDeployment(); + expect(await coprocessorContextsV2.getVersion()).to.equal("CoprocessorContexts v1000.0.0"); + }); + it("Should deploy upgradable Decryption", async function () { const emptyUUPS = await upgrades.deployProxy(regularEmptyUUPSFactory, [], { initializer: "initialize", @@ -101,7 +121,7 @@ describe("Upgrades", function () { }); const decryption = await upgrades.upgradeProxy(emptyUUPS, decryptionFactoryV1); await decryption.waitForDeployment(); - expect(await decryption.getVersion()).to.equal("Decryption v0.1.0"); + expect(await decryption.getVersion()).to.equal("Decryption v0.2.0"); const decryptionV2 = await upgrades.upgradeProxy(decryption, decryptionFactoryV2); await decryptionV2.waitForDeployment(); expect(await decryptionV2.getVersion()).to.equal("Decryption v1000.0.0"); @@ -114,7 +134,7 @@ describe("Upgrades", function () { }); const gatewayConfig = await upgrades.upgradeProxy(emptyUUPS, gatewayConfigFactoryV1); await gatewayConfig.waitForDeployment(); - expect(await gatewayConfig.getVersion()).to.equal("GatewayConfig v0.1.0"); + expect(await gatewayConfig.getVersion()).to.equal("GatewayConfig v0.2.0"); const gatewayConfigV2 = await upgrades.upgradeProxy(gatewayConfig, gatewayConfigFactoryV2); await gatewayConfigV2.waitForDeployment(); expect(await gatewayConfigV2.getVersion()).to.equal("GatewayConfig v1000.0.0"); @@ -140,7 +160,7 @@ describe("Upgrades", function () { }); const inputVerification = await upgrades.upgradeProxy(emptyUUPS, inputVerificationFactoryV1); await inputVerification.waitForDeployment(); - expect(await inputVerification.getVersion()).to.equal("InputVerification v0.1.0"); + expect(await inputVerification.getVersion()).to.equal("InputVerification v0.2.0"); const inputVerificationV2 = await upgrades.upgradeProxy(inputVerification, inputVerificationFactoryV2); await inputVerificationV2.waitForDeployment(); expect(await inputVerificationV2.getVersion()).to.equal("InputVerification v1000.0.0"); @@ -155,7 +175,7 @@ describe("Upgrades", function () { }); const gatewayConfig = await upgrades.upgradeProxy(emptyUUPS, gatewayConfigFactoryV1); await gatewayConfig.waitForDeployment(); - expect(await gatewayConfig.getVersion()).to.equal("GatewayConfig v0.1.0"); + expect(await gatewayConfig.getVersion()).to.equal("GatewayConfig v0.2.0"); const newSigner = await createAndFundRandomWallet(); await gatewayConfig.transferOwnership(newSigner); diff --git a/gateway-contracts/test/utils/contexts.ts b/gateway-contracts/test/utils/contexts.ts new file mode 100644 index 0000000000..d3e631cb8f --- /dev/null +++ b/gateway-contracts/test/utils/contexts.ts @@ -0,0 +1,104 @@ +import { time } from "@nomicfoundation/hardhat-network-helpers"; +import { BigNumberish, HDNodeWallet, Wallet } from "ethers"; + +import { createAndFundRandomWallets, createRandomWallets } from "."; +import { CoprocessorContexts } from "../../typechain-types"; +import { + CoprocessorContextTimePeriodsStruct, + CoprocessorV2Struct, +} from "../../typechain-types/contracts/interfaces/ICoprocessorContexts"; +import { createByteInput } from "./inputs"; + +export enum ContextStatus { + NotInitialized = 0, + Generating = 1, + PreActivation = 2, + Active = 3, + Suspended = 4, + Deactivated = 5, + Compromised = 6, + Destroyed = 7, +} + +function _createCoprocessors( + nCoprocessors: number, + coprocessorTxSenders: HDNodeWallet[], + coprocessorSigners: HDNodeWallet[], +) { + const coprocessors: CoprocessorV2Struct[] = []; + for (let i = 0; i < nCoprocessors; i++) { + coprocessors.push({ + name: `Coprocessor ${i}`, + txSenderAddress: coprocessorTxSenders[i].address, + signerAddress: coprocessorSigners[i].address, + storageUrl: `s3://bucket-${i}`, + }); + } + return { coprocessors, coprocessorTxSenders, coprocessorSigners }; +} + +export function createCoprocessors(nCoprocessors: number) { + const coprocessorTxSenders = createRandomWallets(nCoprocessors); + const coprocessorSigners = createRandomWallets(nCoprocessors); + + return _createCoprocessors(nCoprocessors, coprocessorTxSenders, coprocessorSigners); +} + +export async function createAndFundCoprocessors(nCoprocessors: number) { + const coprocessorTxSenders = await createAndFundRandomWallets(nCoprocessors); + const coprocessorSigners = await createAndFundRandomWallets(nCoprocessors); + + return _createCoprocessors(nCoprocessors, coprocessorTxSenders, coprocessorSigners); +} + +export async function addNewCoprocessorContext( + nCoprocessors: number, + coprocessorContexts: CoprocessorContexts, + owner: Wallet, + fund: boolean = false, +) { + // Define coprocessor context fields + const blob = createByteInput(); + + // Define time periods + const coprocessorsPreActivationTimePeriod = 100; + const coprocessorsSuspendedTimePeriod = 100; + const timePeriods: CoprocessorContextTimePeriodsStruct = { + preActivationTimePeriod: coprocessorsPreActivationTimePeriod, + suspendedTimePeriod: coprocessorsSuspendedTimePeriod, + }; + + let result: { + coprocessors: CoprocessorV2Struct[]; + coprocessorTxSenders: HDNodeWallet[]; + coprocessorSigners: HDNodeWallet[]; + }; + + // Create a set of coprocessors with new transaction sender and signer addresses + // Fund them if required + if (fund) { + result = await createAndFundCoprocessors(nCoprocessors); + } else { + result = createCoprocessors(nCoprocessors); + } + + // Add a new coprocessor context + await coprocessorContexts.connect(owner).addCoprocessorContext(blob, result.coprocessors, timePeriods); + + return { + ...result, + blob, + timePeriods, + }; +} + +export async function refreshCoprocessorContextAfterTimePeriod( + timePeriod: BigNumberish, + coprocessorContexts: CoprocessorContexts, +) { + // Increase the block timestamp to reach the end of the time period + await time.increase(timePeriod); + + // Refresh the statuses of coprocessor contexts + await coprocessorContexts.refreshCoprocessorContextStatuses(); +} diff --git a/gateway-contracts/test/utils/contracts.ts b/gateway-contracts/test/utils/contracts.ts index cd4871ba04..5729108199 100644 --- a/gateway-contracts/test/utils/contracts.ts +++ b/gateway-contracts/test/utils/contracts.ts @@ -6,6 +6,7 @@ import path from "path"; import { ADDRESSES_DIR } from "../../hardhat.config"; import { getRequiredEnvVar } from "../../tasks/utils/loadVariables"; +import { CoprocessorV2Struct } from "../../typechain-types/contracts/interfaces/ICoprocessorContexts"; import { fund } from "./wallets"; // Loads the host chains' chain IDs @@ -30,7 +31,7 @@ async function checkIsHardhatSigner(signer: HardhatEthersSigner | Wallet) { // Creates the wallets used for the tests from the private keys in the .env file. // Adds some funds to these wallets. -async function initTestingWallets(nKmsNodes: number, nCoprocessors: number, nCustodians: number) { +async function initTestingWallets(nKmsNodes: number, nCustodians: number) { // The owner owns the contracts and can initialize the protocol const owner = new Wallet(getRequiredEnvVar("DEPLOYER_PRIVATE_KEY"), hre.ethers.provider); await fund(owner.address); @@ -70,26 +71,42 @@ async function initTestingWallets(nKmsNodes: number, nCoprocessors: number, nCus } // Load the coprocessor transaction senders + // Load the number of coprocessors + const nCoprocessors = parseInt(getRequiredEnvVar("NUM_COPROCESSORS")); + + // Load the coprocessors, and their transaction senders and signers + const coprocessorSigners = []; const coprocessorTxSenders = []; + const coprocessors: CoprocessorV2Struct[] = []; for (let idx = 0; idx < nCoprocessors; idx++) { - const coprocessorTxSender = await hre.ethers.getSigner(getRequiredEnvVar(`COPROCESSOR_TX_SENDER_ADDRESS_${idx}`)); + // Load the coprocessor transaction sender + const txSenderAddress = getRequiredEnvVar(`COPROCESSOR_TX_SENDER_ADDRESS_${idx}`); + const coprocessorTxSender = await hre.ethers.getSigner(txSenderAddress); await checkIsHardhatSigner(coprocessorTxSender); coprocessorTxSenders.push(coprocessorTxSender); - } - // Load the coprocessor signers - const coprocessorSigners = []; - for (let idx = 0; idx < nCoprocessors; idx++) { - const coprocessorSigner = await hre.ethers.getSigner(getRequiredEnvVar(`COPROCESSOR_SIGNER_ADDRESS_${idx}`)); + // Load the coprocessor signer + const signerAddress = getRequiredEnvVar(`COPROCESSOR_SIGNER_ADDRESS_${idx}`); + const coprocessorSigner = await hre.ethers.getSigner(signerAddress); await checkIsHardhatSigner(coprocessorSigner); coprocessorSigners.push(coprocessorSigner); + + // Load the coprocessor + coprocessors.push({ + name: getRequiredEnvVar(`COPROCESSOR_NAME_${idx}`), + txSenderAddress, + signerAddress, + storageUrl: getRequiredEnvVar(`COPROCESSOR_STORAGE_URL_${idx}`), + }); } - // Load the coprocessor S3 buckets - const coprocessorS3Buckets = []; + const coprocessorBlob = getRequiredEnvVar("COPROCESSORS_BLOB"); + + // Load the coprocessor storage URLs + const coprocessorStorageUrls = []; for (let idx = 0; idx < nCoprocessors; idx++) { - const coprocessorS3Bucket = getRequiredEnvVar(`COPROCESSOR_S3_BUCKET_URL_${idx}`); - coprocessorS3Buckets.push(coprocessorS3Bucket); + const coprocessorStorageUrl = getRequiredEnvVar(`COPROCESSOR_STORAGE_URL_${idx}`); + coprocessorStorageUrls.push(coprocessorStorageUrl); } // Load the custodian transaction senders @@ -122,9 +139,11 @@ async function initTestingWallets(nKmsNodes: number, nCoprocessors: number, nCus kmsSigners, kmsNodeIps, kmsNodeStorageUrls, + coprocessors, coprocessorTxSenders, coprocessorSigners, - coprocessorS3Buckets, + coprocessorBlob, + coprocessorStorageUrls, custodianTxSenders, custodianSigners, custodianEncryptionKeys, @@ -133,16 +152,15 @@ async function initTestingWallets(nKmsNodes: number, nCoprocessors: number, nCus // Loads the addresses of the deployed contracts, and the values required for the tests. export async function loadTestVariablesFixture() { - // Load the number of KMS nodes and coprocessors + // Load the number of KMS nodes const nKmsNodes = parseInt(getRequiredEnvVar("NUM_KMS_NODES")); - const nCoprocessors = parseInt(getRequiredEnvVar("NUM_COPROCESSORS")); const nCustodians = parseInt(getRequiredEnvVar("NUM_CUSTODIANS")); // Load the host chains' chain IDs const chainIds = loadHostChainIds(); // Load the transaction senders and signers - const fixtureData = await initTestingWallets(nKmsNodes, nCoprocessors, nCustodians); + const fixtureData = await initTestingWallets(nKmsNodes, nCustodians); // Load the environment variables for the /addresses directory dotenv.config({ path: path.join(ADDRESSES_DIR, ".env.gateway"), override: true }); @@ -150,6 +168,12 @@ export async function loadTestVariablesFixture() { // Load the GatewayConfig contract const gatewayConfig = await hre.ethers.getContractAt("GatewayConfig", getRequiredEnvVar("GATEWAY_CONFIG_ADDRESS")); + // Load the CoprocessorContexts contract + const coprocessorContexts = await hre.ethers.getContractAt( + "CoprocessorContexts", + getRequiredEnvVar("COPROCESSOR_CONTEXTS_ADDRESS"), + ); + // Load the InputVerification contract const inputVerification = await hre.ethers.getContractAt( "InputVerification", @@ -178,13 +202,13 @@ export async function loadTestVariablesFixture() { ...fixtureData, gatewayConfig, kmsGeneration, + coprocessorContexts, ciphertextCommits, MultichainACL, decryption, inputVerification, chainIds, nKmsNodes, - nCoprocessors, nCustodians, pauserSet, }; diff --git a/gateway-contracts/test/utils/eip712/inputVerification.ts b/gateway-contracts/test/utils/eip712/inputVerification.ts index 2eec42f3cd..817c0b4f37 100644 --- a/gateway-contracts/test/utils/eip712/inputVerification.ts +++ b/gateway-contracts/test/utils/eip712/inputVerification.ts @@ -12,6 +12,7 @@ export function createEIP712ResponseZKPoK( userAddress: string, contractAddress: string, contractChainId: number, + coprocessorContextId: number, extraData: string, ): EIP712 { if (!ethers.isAddress(verifyingContract)) { @@ -30,6 +31,7 @@ export function createEIP712ResponseZKPoK( { name: "userAddress", type: "address" }, { name: "contractAddress", type: "address" }, { name: "contractChainId", type: "uint256" }, + { name: "coprocessorContextId", type: "uint256" }, { name: "extraData", type: "bytes" }, ], }, @@ -45,6 +47,7 @@ export function createEIP712ResponseZKPoK( userAddress, contractAddress, contractChainId, + coprocessorContextId, extraData, }, }; diff --git a/gateway-contracts/test/utils/index.ts b/gateway-contracts/test/utils/index.ts index c49638826c..acbfd2c60a 100644 --- a/gateway-contracts/test/utils/index.ts +++ b/gateway-contracts/test/utils/index.ts @@ -4,3 +4,4 @@ export * from "./eip712/"; export * from "./typeConversion"; export * from "./inputs"; export * from "./kmsRequestIds"; +export * from "./contexts"; diff --git a/gateway-contracts/test/utils/typeConversion.ts b/gateway-contracts/test/utils/typeConversion.ts index 065481823c..21ebcf5e7a 100644 --- a/gateway-contracts/test/utils/typeConversion.ts +++ b/gateway-contracts/test/utils/typeConversion.ts @@ -7,9 +7,14 @@ // values when emitted as events export function toValues(input: T | T[]): unknown[] | unknown[][] { if (Array.isArray(input)) { - // If input is an array of structs, map each struct to its values - return input.map((item) => Object.values(item)); + // If input is an array of structs, map each struct to its values recursively + return input.map((item) => toValues(item) as unknown[]); } - // If input is a single struct, return its values - return Object.values(input); + // If input is a single struct, return its values, recursively converting nested (non-null) objects + return Object.values(input).map((value) => { + if (typeof value === "object" && value !== null) { + return toValues(value); + } + return value; + }); } diff --git a/gateway-contracts/test/utils/wallets.ts b/gateway-contracts/test/utils/wallets.ts index fb009777d6..82e2a4d6bb 100644 --- a/gateway-contracts/test/utils/wallets.ts +++ b/gateway-contracts/test/utils/wallets.ts @@ -22,9 +22,19 @@ export function createRandomWallet() { return hre.ethers.Wallet.createRandom().connect(hre.ethers.provider); } +// Create a list of random wallets +export function createRandomWallets(length: number) { + return Array.from({ length }, () => createRandomWallet()); +} + // Create a new random wallet with some funds export async function createAndFundRandomWallet() { - const user = createRandomWallet(); - await fund(user.address); - return user; + const wallet = createRandomWallet(); + await fund(wallet.address); + return wallet; +} + +// Create a list of random wallets with some funds +export async function createAndFundRandomWallets(length: number) { + return await Promise.all(Array.from({ length }, () => createAndFundRandomWallet())); }