UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

854 lines 83.8 kB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PaymentCryptography = void 0;
const shared_1 = require("../../shared");
/**
 * Statement provider for service [payment-cryptography](https://docs.aws.amazon.com/service-authorization/latest/reference/list_payment-cryptography.html).
 *
 * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
 */
class PaymentCryptography extends shared_1.PolicyStatement {
    /**
     * Grants permission to add replication regions to an existing AWS Payment Cryptography key
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_AddKeyReplicationRegions.html
     */
    toAddKeyReplicationRegions() {
        return this.to('AddKeyReplicationRegions');
    }
    /**
     * Grants permission to associate an MPA approval team with a payment cryptography action
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_AssociateMpaTeam.html
     */
    toAssociateMpaTeam() {
        return this.to('AssociateMpaTeam');
    }
    /**
     * Grants permission to create a user-friendly name for a Key
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_CreateAlias.html
     */
    toCreateAlias() {
        return this.to('CreateAlias');
    }
    /**
     * Grants permission to create a unique customer managed key in the caller's AWS account and region
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     * - .ifKeyAlgorithm()
     * - .ifKeyClass()
     * - .ifKeyUsage()
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_CreateKey.html
     */
    toCreateKey() {
        return this.to('CreateKey');
    }
    /**
     * Grants permission to decrypt ciphertext data to plaintext using symmetric, asymmetric or DUKPT data encryption key
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_DecryptData.html
     */
    toDecryptData() {
        return this.to('DecryptData');
    }
    /**
     * Grants permission to delete the specified alias
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_DeleteAlias.html
     */
    toDeleteAlias() {
        return this.to('DeleteAlias');
    }
    /**
     * Grants permission to schedule the deletion of a Key
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_DeleteKey.html
     */
    toDeleteKey() {
        return this.to('DeleteKey');
    }
    /**
     * Grants permission to delete the resource-based policy attached to a key
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_DeleteResourcePolicy.html
     */
    toDeleteResourcePolicy() {
        return this.to('DeleteResourcePolicy');
    }
    /**
     * Grants permission to disable default key replication regions for account-level replication
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_DisableDefaultKeyReplicationRegions.html
     */
    toDisableDefaultKeyReplicationRegions() {
        return this.to('DisableDefaultKeyReplicationRegions');
    }
    /**
     * Grants permission to disassociate an MPA approval team from a payment cryptography action
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_DisassociateMpaTeam.html
     */
    toDisassociateMpaTeam() {
        return this.to('DisassociateMpaTeam');
    }
    /**
     * Grants permission to enable default key replication regions for account-level replication
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_EnableDefaultKeyReplicationRegions.html
     */
    toEnableDefaultKeyReplicationRegions() {
        return this.to('EnableDefaultKeyReplicationRegions');
    }
    /**
     * Grants permission to encrypt plaintext data to ciphertext using symmetric, asymmetric or DUKPT data encryption key
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_EncryptData.html
     */
    toEncryptData() {
        return this.to('EncryptData');
    }
    /**
     * Grants permission to export a key from the service
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_ExportKey.html
     */
    toExportKey() {
        return this.to('ExportKey');
    }
    /**
     * Grants permission to generate a KekValidationRequest or a KekValidationResponse for node-to-node initialization between payment processing nodes using Australian Standard 2805 (AS2805)
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GenerateAs2805KekValidation.html
     */
    toGenerateAs2805KekValidation() {
        return this.to('GenerateAs2805KekValidation');
    }
    /**
     * Grants permission to generate card-related data using algorithms such as Card Verification Values (CVV/CVV2), Dynamic Card Verification Values (dCVV/dCVV2) or Card Security Codes (CSC) that check the validity of a magnetic stripe card
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GenerateCardValidationData.html
     */
    toGenerateCardValidationData() {
        return this.to('GenerateCardValidationData');
    }
    /**
     * Grants permission to generate a MAC (Message Authentication Code) cryptogram
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GenerateMac.html
     */
    toGenerateMac() {
        return this.to('GenerateMac');
    }
    /**
     * Grants permission to generate a MAC (Message Authentication Code) cryptogram
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GenerateMacEmvPinChange.html
     */
    toGenerateMacEmvPinChange() {
        return this.to('GenerateMacEmvPinChange');
    }
    /**
     * Grants permission to generate pin-related data such as PIN, PIN Verification Value (PVV), PIN Block and PIN Offset during new card issuance or card re-issuance
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GeneratePinData.html
     */
    toGeneratePinData() {
        return this.to('GeneratePinData');
    }
    /**
     * Grants permission to return the keyArn associated with an aliasName
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_GetAlias.html
     */
    toGetAlias() {
        return this.to('GetAlias');
    }
    /**
     * Grants permission to return the Certificate Signing Request for a public key from a key of class PUBLIC_KEY
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_GetCertificateSigningRequest.html
     */
    toGetCertificateSigningRequest() {
        return this.to('GetCertificateSigningRequest');
    }
    /**
     * Grants permission to retrieve the default key replication regions configured at the account level
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_GetDefaultKeyReplicationRegions.html
     */
    toGetDefaultKeyReplicationRegions() {
        return this.to('GetDefaultKeyReplicationRegions');
    }
    /**
     * Grants permission to return the detailed information about the specified key
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_GetKey.html
     */
    toGetKey() {
        return this.to('GetKey');
    }
    /**
     * Grants permission to retrieve information about an MPA approval team association for a payment cryptography action
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_GetMpaTeamAssociation.html
     */
    toGetMpaTeamAssociation() {
        return this.to('GetMpaTeamAssociation');
    }
    /**
     * Grants permission to get the export token and the signing key certificate to initiate a TR-34 key export
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_GetParametersForExport.html
     */
    toGetParametersForExport() {
        return this.to('GetParametersForExport');
    }
    /**
     * Grants permission to get the import token and the wrapping key certificate to initiate a TR-34 key import
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_GetParametersForImport.html
     */
    toGetParametersForImport() {
        return this.to('GetParametersForImport');
    }
    /**
     * Grants permission to return the public key from a key of class PUBLIC_KEY
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_GetPublicKeyCertificate.html
     */
    toGetPublicKeyCertificate() {
        return this.to('GetPublicKeyCertificate');
    }
    /**
     * Grants permission to retrieve the resource-based policy attached to a key
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_GetResourcePolicy.html
     */
    toGetResourcePolicy() {
        return this.to('GetResourcePolicy');
    }
    /**
     * Grants permission to imports keys and public key certificates
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     * - .ifCertificateAuthorityPublicKeyIdentifier()
     * - .ifImportKeyMaterial()
     * - .ifWrappingKeyIdentifier()
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_ImportKey.html
     */
    toImportKey() {
        return this.to('ImportKey');
    }
    /**
     * Grants permission to return a list of aliases created for all keys in the caller's AWS account and Region
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_ListAliases.html
     */
    toListAliases() {
        return this.to('ListAliases');
    }
    /**
     * Grants permission to return a list of keys created in the caller's AWS account and Region
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_ListKeys.html
     */
    toListKeys() {
        return this.to('ListKeys');
    }
    /**
     * Grants permission to return a list of tags created in the caller's AWS account and Region
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_ListTagsForResource.html
     */
    toListTagsForResource() {
        return this.to('ListTagsForResource');
    }
    /**
     * Grants permission to attach or replace a resource-based policy on a key
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_PutResourcePolicy.html
     */
    toPutResourcePolicy() {
        return this.to('PutResourcePolicy');
    }
    /**
     * Grants permission to re-encrypt ciphertext using DUKPT, Symmetric and Asymmetric Data Encryption Keys
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_ReEncryptData.html
     */
    toReEncryptData() {
        return this.to('ReEncryptData');
    }
    /**
     * Grants permission to remove replication regions from an existing AWS Payment Cryptography key
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_RemoveKeyReplicationRegions.html
     */
    toRemoveKeyReplicationRegions() {
        return this.to('RemoveKeyReplicationRegions');
    }
    /**
     * Grants permission to cancel a scheduled key deletion if at any point during the waiting period a Key needs to be revived
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_RestoreKey.html
     */
    toRestoreKey() {
        return this.to('RestoreKey');
    }
    /**
     * Grants permission to enable a disabled Key
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_StartKeyUsage.html
     */
    toStartKeyUsage() {
        return this.to('StartKeyUsage');
    }
    /**
     * Grants permission to disable an enabled Key
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_StopKeyUsage.html
     */
    toStopKeyUsage() {
        return this.to('StopKeyUsage');
    }
    /**
     * Grants permission to add or overwrites one or more tags for the specified resource
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_TagResource.html
     */
    toTagResource() {
        return this.to('TagResource');
    }
    /**
     * Grants permission to translate wrapping key type for a wrapped key
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_TranslateKeyMaterial.html
     */
    toTranslateKeyMaterial() {
        return this.to('TranslateKeyMaterial');
    }
    /**
     * Grants permission to translate encrypted PIN block from and to ISO 9564 formats 0,1,3,4
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_TranslatePinData.html
     */
    toTranslatePinData() {
        return this.to('TranslatePinData');
    }
    /**
     * Grants permission to remove the specified tag or tags from the specified resource
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_UntagResource.html
     */
    toUntagResource() {
        return this.to('UntagResource');
    }
    /**
     * Grants permission to change the key to which an alias is assigned, or unassign it from its current key
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_UpdateAlias.html
     */
    toUpdateAlias() {
        return this.to('UpdateAlias');
    }
    /**
     * Grants permission to verify Authorization Request Cryptogram (ARQC) for a EMV chip payment card authorization
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_VerifyAuthRequestCryptogram.html
     */
    toVerifyAuthRequestCryptogram() {
        return this.to('VerifyAuthRequestCryptogram');
    }
    /**
     * Grants permission to verify card-related validation data using algorithms such as Card Verification Values (CVV/CVV2), Dynamic Card Verification Values (dCVV/dCVV2) and Card Security Codes (CSC)
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_VerifyCardValidationData.html
     */
    toVerifyCardValidationData() {
        return this.to('VerifyCardValidationData');
    }
    /**
     * Grants permission to verify MAC (Message Authentication Code) of input data against a provided MAC
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_VerifyMac.html
     */
    toVerifyMac() {
        return this.to('VerifyMac');
    }
    /**
     * Grants permission to verify pin-related data such as PIN and PIN Offset using algorithms including VISA PVV and IBM3624
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_VerifyPinData.html
     */
    toVerifyPinData() {
        return this.to('VerifyPinData');
    }
    /**
     * Adds a resource of type alias to the statement
     *
     * @param alias - Identifier for the alias.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifResourceAliases()
     */
    onAlias(alias, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:payment-cryptography:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:alias/${alias}`);
    }
    /**
     * Adds a resource of type approval-team to the statement
     *
     * https://docs.aws.amazon.com/mpa/latest/userguide/mpa-concepts.html
     *
     * @param approvalTeamId - Identifier for the approvalTeamId.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     */
    onApprovalTeam(approvalTeamId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:mpa:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:approval-team/${approvalTeamId}`);
    }
    /**
     * Adds a resource of type key to the statement
     *
     * @param keyId - Identifier for the keyId.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     * - .ifResourceAliases()
     */
    onKey(keyId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:payment-cryptography:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:key/${keyId}`);
    }
    /**
     * Filters access by both the key and value of the tag in the request for the specified operation
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
     *
     * Applies to actions:
     * - .toCreateKey()
     * - .toDeleteAlias()
     * - .toGetAlias()
     * - .toImportKey()
     * - .toTagResource()
     * - .toUpdateAlias()
     *
     * @param tagKey The tag key to check
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifAwsRequestTag(tagKey, value, operator) {
        return this.if(`aws:RequestTag/${tagKey}`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by tags assigned to a key for the specified operation
     *
     * https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/security_iam_service-with-iam.html#security_iam_service-with-iam-tags
     *
     * Applies to actions:
     * - .toAddKeyReplicationRegions()
     * - .toAssociateMpaTeam()
     * - .toCreateAlias()
     * - .toDecryptData()
     * - .toDeleteKey()
     * - .toDeleteResourcePolicy()
     * - .toDisassociateMpaTeam()
     * - .toEncryptData()
     * - .toExportKey()
     * - .toGenerateAs2805KekValidation()
     * - .toGenerateCardValidationData()
     * - .toGenerateMac()
     * - .toGenerateMacEmvPinChange()
     * - .toGeneratePinData()
     * - .toGetAlias()
     * - .toGetCertificateSigningRequest()
     * - .toGetKey()
     * - .toGetMpaTeamAssociation()
     * - .toGetPublicKeyCertificate()
     * - .toGetResourcePolicy()
     * - .toListTagsForResource()
     * - .toPutResourcePolicy()
     * - .toReEncryptData()
     * - .toRemoveKeyReplicationRegions()
     * - .toRestoreKey()
     * - .toStartKeyUsage()
     * - .toStopKeyUsage()
     * - .toTagResource()
     * - .toTranslateKeyMaterial()
     * - .toTranslatePinData()
     * - .toUntagResource()
     * - .toUpdateAlias()
     * - .toVerifyAuthRequestCryptogram()
     * - .toVerifyCardValidationData()
     * - .toVerifyMac()
     * - .toVerifyPinData()
     *
     * Applies to resource types:
     * - approval-team
     * - key
     *
     * @param tagKey The tag key to check
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifAwsResourceTag(tagKey, value, operator) {
        return this.if(`aws:ResourceTag/${tagKey}`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the tag keys in the request for the specified operation
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
     *
     * Applies to actions:
     * - .toCreateKey()
     * - .toDeleteAlias()
     * - .toGetAlias()
     * - .toImportKey()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateAlias()
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifAwsTagKeys(value, operator) {
        return this.if(`aws:TagKeys`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the CertificateAuthorityPublicKeyIdentifier specified in the request or the ImportKey, and ExportKey operations
     *
     * Applies to actions:
     * - .toExportKey()
     * - .toImportKey()
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifCertificateAuthorityPublicKeyIdentifier(value, operator) {
        return this.if(`CertificateAuthorityPublicKeyIdentifier`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the type of key material being imported [RootCertificatePublicKey, TrustedCertificatePublicKey, Tr34KeyBlock, Tr31KeyBlock, DiffieHellmanTr31KeyBlock, As2805KeyCryptogram, KeyCryptogram] for the ImportKey operation
     *
     * Applies to actions:
     * - .toImportKey()
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifImportKeyMaterial(value, operator) {
        return this.if(`ImportKeyMaterial`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by KeyAlgorithm specified in the request for the CreateKey operation
     *
     * Applies to actions:
     * - .toCreateKey()
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifKeyAlgorithm(value, operator) {
        return this.if(`KeyAlgorithm`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by KeyClass specified in the request for the CreateKey operation
     *
     * Applies to actions:
     * - .toCreateKey()
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifKeyClass(value, operator) {
        return this.if(`KeyClass`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by KeyClass specified in the request or associated with a key for the CreateKey operation
     *
     * Applies to actions:
     * - .toCreateKey()
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifKeyUsage(value, operator) {
        return this.if(`KeyUsage`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by aliases in the request for the specified operation
     *
     * Applies to actions:
     * - .toAddKeyReplicationRegions()
     * - .toDecryptData()
     * - .toDeleteKey()
     * - .toEncryptData()
     * - .toExportKey()
     * - .toGenerateAs2805KekValidation()
     * - .toGenerateCardValidationData()
     * - .toGenerateMac()
     * - .toGenerateMacEmvPinChange()
     * - .toGeneratePinData()
     * - .toGetCertificateSigningRequest()
     * - .toGetKey()
     * - .toGetPublicKeyCertificate()
     * - .toReEncryptData()
     * - .toRemoveKeyReplicationRegions()
     * - .toRestoreKey()
     * - .toStartKeyUsage()
     * - .toStopKeyUsage()
     * - .toTranslateKeyMaterial()
     * - .toTranslatePinData()
     * - .toVerifyAuthRequestCryptogram()
     * - .toVerifyCardValidationData()
     * - .toVerifyMac()
     * - .toVerifyPinData()
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifRequestAlias(value, operator) {
        return this.if(`RequestAlias`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by aliases associated with a key for the specified operation
     *
     * Applies to actions:
     * - .toAddKeyReplicationRegions()
     * - .toCreateAlias()
     * - .toDecryptData()
     * - .toDeleteAlias()
     * - .toDeleteKey()
     * - .toDeleteResourcePolicy()
     * - .toEncryptData()
     * - .toExportKey()
     * - .toGenerateAs2805KekValidation()
     * - .toGenerateCardValidationData()
     * - .toGenerateMac()
     * - .toGenerateMacEmvPinChange()
     * - .toGeneratePinData()
     * - .toGetAlias()
     * - .toGetCertificateSigningRequest()
     * - .toGetKey()
     * - .toGetPublicKeyCertificate()
     * - .toGetResourcePolicy()
     * - .toListTagsForResource()
     * - .toPutResourcePolicy()
     * - .toReEncryptData()
     * - .toRemoveKeyReplicationRegions()
     * - .toRestoreKey()
     * - .toStartKeyUsage()
     * - .toStopKeyUsage()
     * - .toTagResource()
     * - .toTranslateKeyMaterial()
     * - .toTranslatePinData()
     * - .toUntagResource()
     * - .toUpdateAlias()
     * - .toVerifyAuthRequestCryptogram()
     * - .toVerifyCardValidationData()
     * - .toVerifyMac()
     * - .toVerifyPinData()
     *
     * Applies to resource types:
     * - alias
     * - key
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifResourceAliases(value, operator) {
        return this.if(`ResourceAliases`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the WrappingKeyIdentifier specified in the request for the ImportKey, and ExportKey operations
     *
     * Applies to actions:
     * - .toExportKey()
     * - .toImportKey()
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifWrappingKeyIdentifier(value, operator) {
        return this.if(`WrappingKeyIdentifier`, value, operator ?? 'StringLike');
    }
    /**
     * Statement provider for service [payment-cryptography](https://docs.aws.amazon.com/service-authorization/latest/reference/list_payment-cryptography.html).
     *
     */
    constructor(props) {
        super(props);
        this.servicePrefix = 'payment-cryptography';
        this.accessLevelList = {
            Write: [
                'AddKeyReplicationRegions',
                'AssociateMpaTeam',
                'CreateAlias',
                'CreateKey',
                'DecryptData',
                'DeleteAlias',
                'DeleteKey',
                'DeleteResourcePolicy',
                'DisableDefaultKeyReplicationRegions',
                'DisassociateMpaTeam',
                'EnableDefaultKeyReplicationRegions',
                'EncryptData',
                'ExportKey',
                'GenerateAs2805KekValidation',
                'GenerateCardValidationData',
                'GenerateMac',
                'GenerateMacEmvPinChange',
                'GeneratePinData',
                'ImportKey',
                'PutResourcePolicy',
                'ReEncryptData',
                'RemoveKeyReplicationRegions',
                'RestoreKey',
                'StartKeyUsage',
                'StopKeyUsage',
                'TagResource',
                'TranslateKeyMaterial',
                'TranslatePinData',
                'UntagResource',
                'UpdateAlias',
                'VerifyAuthRequestCryptogram',
                'VerifyCardValidationData',
                'VerifyMac',
                'VerifyPinData'
            ],
            'Permissions management': [
                'DeleteResourcePolicy',
                'PutResourcePolicy'
            ],
            Read: [
                'GetAlias',
                'GetCertificateSigningRequest',
                'GetDefaultKeyReplicationRegions',
                'GetKey',
                'GetMpaTeamAssociation',
                'GetParametersForExport',
                'GetParametersForImport',
                'GetPublicKeyCertificate',
                'GetResourcePolicy',
                'ListTagsForResource'
            ],
            List: [
                'ListAliases',
                'ListKeys'
            ],
            Tagging: [
                'TagResource',
                'UntagResource'
            ]
        };
    }
}
exports.PaymentCryptography = PaymentCryptography;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1jcnlwdG9ncmFwaHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwYXltZW50LWNyeXB0b2dyYXBoeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx5Q0FBeUQ7QUFHekQ7Ozs7R0FJRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsd0JBQWU7SUFHdEQ7Ozs7OztPQU1HO0lBQ0ksMEJBQTBCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ksV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUNBQXFDO1FBQzFDLE9BQU8sSUFBSSxD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QjtZQUNELElBQUksRUFBRTtnQkFDSixhQUFhO2dCQUNiLFVBQVU7YUFDWDtZQUNELE9BQU8sRUFBRTtnQkFDUCxhQUFhO2dCQUNiLGVBQWU7YUFDaEI7U0FDRixDQUFDO0lBK1RGLENBQUM7Q0FDRjtBQXg0QkQsa0RBdzRCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjY2Vzc0xldmVsTGlzdCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hY2Nlc3MtbGV2ZWwnO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBPcGVyYXRvciB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBhd3NfaWFtIGFzIGlhbSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbcGF5bWVudC1jcnlwdG9ncmFwaHldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X3BheW1lbnQtY3J5cHRvZ3JhcGh5Lmh0bWwpLlxuICpcbiAqIEBwYXJhbSBzaWQgW1NJRF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19zaWQuaHRtbCkgb2YgdGhlIHN0YXRlbWVudFxuICovXG5leHBvcnQgY2xhc3MgUGF5bWVudENyeXB0b2dyYXBoeSBleHRlbmRzIFBvbGljeVN0YXRlbWVudCB7XG4gIHB1YmxpYyBzZXJ2aWNlUHJlZml4ID0gJ3BheW1lbnQtY3J5cHRvZ3JhcGh5JztcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWRkIHJlcGxpY2F0aW9uIHJlZ2lvbnMgdG8gYW4gZXhpc3RpbmcgQVdTIFBheW1lbnQgQ3J5cHRvZ3JhcGh5IGtleVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9BZGRLZXlSZXBsaWNhdGlvblJlZ2lvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQWRkS2V5UmVwbGljYXRpb25SZWdpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBZGRLZXlSZXBsaWNhdGlvblJlZ2lvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3NvY2lhdGUgYW4gTVBBIGFwcHJvdmFsIHRlYW0gd2l0aCBhIHBheW1lbnQgY3J5cHRvZ3JhcGh5IGFjdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Bc3NvY2lhdGVNcGFUZWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZU1wYVRlYW0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZU1wYVRlYW0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSB1c2VyLWZyaWVuZGx5IG5hbWUgZm9yIGEgS2V5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUFsaWFzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUFsaWFzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVBbGlhcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHVuaXF1ZSBjdXN0b21lciBtYW5hZ2VkIGtleSBpbiB0aGUgY2FsbGVyJ3MgQVdTIGFjY291bnQgYW5kIHJlZ2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmS2V5QWxnb3JpdGhtKClcbiAgICogLSAuaWZLZXlDbGFzcygpXG4gICAqIC0gLmlmS2V5VXNhZ2UoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlS2V5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUtleSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlS2V5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVjcnlwdCBjaXBoZXJ0ZXh0IGRhdGEgdG8gcGxhaW50ZXh0IHVzaW5nIHN5bW1ldHJpYywgYXN5bW1ldHJpYyBvciBEVUtQVCBkYXRhIGVuY3J5cHRpb24ga2V5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9EYXRhQVBJUmVmZXJlbmNlL0FQSV9EZWNyeXB0RGF0YS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWNyeXB0RGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVjcnlwdERhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIHNwZWNpZmllZCBhbGlhc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVBbGlhcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVBbGlhcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlQWxpYXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzY2hlZHVsZSB0aGUgZGVsZXRpb24gb2YgYSBLZXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlS2V5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUtleSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlS2V5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSByZXNvdXJjZS1iYXNlZCBwb2xpY3kgYXR0YWNoZWQgdG8gYSBrZXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBQZXJtaXNzaW9ucyBtYW5hZ2VtZW50LCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlUmVzb3VyY2VQb2xpY3kuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlUmVzb3VyY2VQb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVJlc291cmNlUG9saWN5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYWJsZSBkZWZhdWx0IGtleSByZXBsaWNhdGlvbiByZWdpb25zIGZvciBhY2NvdW50LWxldmVsIHJlcGxpY2F0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2FibGVEZWZhdWx0S2V5UmVwbGljYXRpb25SZWdpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2FibGVEZWZhdWx0S2V5UmVwbGljYXRpb25SZWdpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhYmxlRGVmYXVsdEtleVJlcGxpY2F0aW9uUmVnaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2Fzc29jaWF0ZSBhbiBNUEEgYXBwcm92YWwgdGVhbSBmcm9tIGEgcGF5bWVudCBjcnlwdG9ncmFwaHkgYWN0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2Fzc29jaWF0ZU1wYVRlYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlTXBhVGVhbSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYXNzb2NpYXRlTXBhVGVhbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuYWJsZSBkZWZhdWx0IGtleSByZXBsaWNhdGlvbiByZWdpb25zIGZvciBhY2NvdW50LWxldmVsIHJlcGxpY2F0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0VuYWJsZURlZmF1bHRLZXlSZXBsaWNhdGlvblJlZ2lvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRW5hYmxlRGVmYXVsdEtleVJlcGxpY2F0aW9uUmVnaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRW5hYmxlRGVmYXVsdEtleVJlcGxpY2F0aW9uUmVnaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuY3J5cHQgcGxhaW50ZXh0IGRhdGEgdG8gY2lwaGVydGV4dCB1c2luZyBzeW1tZXRyaWMsIGFzeW1tZXRyaWMgb3IgRFVLUFQgZGF0YSBlbmNyeXB0aW9uIGtleVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvRGF0YUFQSVJlZmVyZW5jZS9BUElfRW5jcnlwdERhdGEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRW5jcnlwdERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0VuY3J5cHREYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZXhwb3J0IGEga2V5IGZyb20gdGhlIHNlcnZpY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRXhwb3J0S2V5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0V4cG9ydEtleSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRXhwb3J0S2V5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2VuZXJhdGUgYSBLZWtWYWxpZGF0aW9uUmVxdWVzdCBvciBhIEtla1ZhbGlkYXRpb25SZXNwb25zZSBmb3Igbm9kZS10by1ub2RlIGluaXRpYWxpemF0aW9uIGJldHdlZW4gcGF5bWVudCBwcm9jZXNzaW5nIG5vZGVzIHVzaW5nIEF1c3RyYWxpYW4gU3RhbmRhcmQgMjgwNSAoQVMyODA1KVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvRGF0YUFQSVJlZmVyZW5jZS9BUElfR2VuZXJhdGVBczI4MDVLZWtWYWxpZGF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dlbmVyYXRlQXMyODA1S2VrVmFsaWRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2VuZXJhdGVBczI4MDVLZWtWYWxpZGF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2VuZXJhdGUgY2FyZC1yZWxhdGVkIGRhdGEgdXNpbmcgYWxnb3JpdGhtcyBzdWNoIGFzIENhcmQgVmVyaWZpY2F0aW9uIFZhbHVlcyAoQ1ZWL0NWVjIpLCBEeW5hbWljIENhcmQgVmVyaWZpY2F0aW9uIFZhbHVlcyAoZENWVi9kQ1ZWMikgb3IgQ2FyZCBTZWN1cml0eSBDb2RlcyAoQ1NDKSB0aGF0IGNoZWNrIHRoZSB2YWxpZGl0eSBvZiBhIG1hZ25ldGljIHN0cmlwZSBjYXJkXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9EYXRhQVBJUmVmZXJlbmNlL0FQSV9HZW5lcmF0ZUNhcmRWYWxpZGF0aW9uRGF0YS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZW5lcmF0ZUNhcmRWYWxpZGF0aW9uRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2VuZXJhdGVDYXJkVmFsaWRhdGlvbkRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZW5lcmF0ZSBhIE1BQyAoTWVzc2FnZSBBdXRoZW50aWNhdGlvbiBDb2RlKSBjcnlwdG9ncmFtXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9EYXRhQVBJUmVmZXJlbmNlL0FQSV9HZW5lcmF0ZU1hYy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZW5lcmF0ZU1hYygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2VuZXJhdGVNYWMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZW5lcmF0ZSBhIE1BQyAoTWVzc2FnZSBBdXRoZW50aWNhdGlvbiBDb2RlKSBjcnlwdG9ncmFtXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9EYXRhQVBJUmVmZXJlbmNlL0FQSV9HZW5lcmF0ZU1hY0VtdlBpbkNoYW5nZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZW5lcmF0ZU1hY0VtdlBpbkNoYW5nZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2VuZXJhdGVNYWNFbXZQaW5DaGFuZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZW5lcmF0ZSBwaW4tcmVsYXRlZCBkYXRhIHN1Y2ggYXMgUElOLCBQSU4gVmVyaWZpY2F0aW9uIFZhbHVlIChQVlYpLCBQSU4gQmxvY2sgYW5kIFBJTiBPZmZzZXQgZHVyaW5nIG5ldyBjYXJkIGlzc3VhbmNlIG9yIGNhcmQgcmUtaXNzdWFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0RhdGFBUElSZWZlcmVuY2UvQVBJX0dlbmVyYXRlUGluRGF0YS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZW5lcmF0ZVBpbkRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dlbmVyYXRlUGluRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiB0aGUga2V5QXJuIGFzc29jaWF0ZWQgd2l0aCBhbiBhbGlhc05hbWVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRBbGlhcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRBbGlhcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0QWxpYXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gdGhlIENlcnRpZmljYXRlIFNpZ25pbmcgUmVxdWVzdCBmb3IgYSBwdWJsaWMga2V5IGZyb20gYSBrZXkgb2YgY2xhc3MgUFVCTElDX0tFWVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldENlcnRpZmljYXRlU2lnbmluZ1JlcXVlc3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Q2VydGlmaWNhdGVTaWduaW5nUmVxdWVzdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q2VydGlmaWNhdGVTaWduaW5nUmVxdWVzdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHRoZSBkZWZhdWx0IGtleSByZXBsaWNhdGlvbiByZWdpb25zIGNvbmZpZ3VyZWQgYXQgdGhlIGFjY291bnQgbGV2ZWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXREZWZhdWx0S2V5UmVwbGljYXRpb25SZWdpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldERlZmF1bHRLZXlSZXBsaWNhdGlvblJlZ2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldERlZmF1bHRLZXlSZXBsaWNhdGlvblJlZ2lvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gdGhlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQga2V5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0S2V5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEtleSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0S2V5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYW4gTVBBIGFwcHJvdmFsIHRlYW0gYXNzb2NpYXRpb24gZm9yIGEgcGF5bWVudCBjcnlwdG9ncmFwaHkgYWN0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0TXBhVGVhbUFzc29jaWF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE1wYVRlYW1Bc3NvY2lhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TXBhVGVhbUFzc29jaWF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBleHBvcnQgdG9rZW4gYW5kIHRoZSBzaWduaW5nIGtleSBjZXJ0aWZpY2F0ZSB0byBpbml0aWF0ZSBhIFRSLTM0IGtleSBleHBvcnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRQYXJhbWV0ZXJzRm9yRXhwb3J0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFBhcmFtZXRlcnNGb3JFeHBvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFBhcmFtZXRlcnNGb3JFeHBvcnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIGltcG9ydCB0b2tlbiBhbmQgdGhlIHdyYXBwaW5nIGtleSBjZXJ0aWZpY2F0ZSB0byBpbml0aWF0ZSBhIFRSLTM0IGtleSBpbXBvcnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRQYXJhbWV0ZXJzRm9ySW1wb3J0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFBhcmFtZXRlcnNGb3JJbXBvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFBhcmFtZXRlcnNGb3JJbXBvcnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gdGhlIHB1YmxpYyBrZXkgZnJvbSBhIGtleSBvZiBjbGFzcyBQVUJMSUNfS0VZXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0UHVibGljS2V5Q2VydGlmaWNhdGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UHVibGljS2V5Q2VydGlmaWNhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFB1YmxpY0tleUNlcnRpZmljYXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgdGhlIHJlc291cmNlLWJhc2VkIHBvbGljeSBhdHRhY2hlZCB0byBhIGtleVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFJlc291cmNlUG9saWN5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFJlc291cmNlUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRSZXNvdXJjZVBvbGljeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGltcG9ydHMga2V5cyBhbmQgcHVibGljIGtleSBjZXJ0aWZpY2F0ZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkNlcnRpZmljYXRlQXV0aG9yaXR5UHVibGljS2V5SWRlbnRpZmllcigpXG4gICAqIC0gLmlmSW1wb3J0S2V5TWF0ZXJpYWwoKVxuICAgKiAtIC5pZldyYXBwaW5nS2V5SWRlbnRpZmllcigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9JbXBvcnRLZXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvSW1wb3J0S2V5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdJbXBvcnRLZXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIGFsaWFzZXMgY3JlYXRlZCBmb3IgYWxsIGtleXMgaW4gdGhlIGNhbGxlcidzIEFXUyBhY2NvdW50IGFuZCBSZWdpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0QWxpYXNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QWxpYXNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEFsaWFzZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIGtleXMgY3JlYXRlZCBpbiB0aGUgY2FsbGVyJ3MgQVdTIGFjY291bnQgYW5kIFJlZ2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RLZXlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RLZXlzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0S2V5cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBhIGxpc3Qgb2YgdGFncyBjcmVhdGVkIGluIHRoZSBjYWxsZXIncyBBV1MgYWNjb3VudCBhbmQgUmVnaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFRhZ3NGb3JSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGFnc0ZvclJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGFnc0ZvclJlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXR0YWNoIG9yIHJlcGxhY2UgYSByZXNvdXJjZS1iYXNlZCBwb2xpY3kgb24gYSBrZXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBQZXJtaXNzaW9ucyBtYW5hZ2VtZW50LCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUHV0UmVzb3VyY2VQb2xpY3kuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0UmVzb3VyY2VQb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dFJlc291cmNlUG9saWN5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmUtZW5jcnlwdCBjaXBoZXJ0ZXh0IHVzaW5nIERVS1BULCBTeW1tZXRyaWMgYW5kIEFzeW1tZXRyaWMgRGF0YSBFbmNyeXB0aW9uIEtleXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0RhdGFBUElSZWZlcmVuY2UvQVBJX1JlRW5jcnlwdERhdGEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVFbmNyeXB0RGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVFbmNyeXB0RGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbW92ZSByZXBsaWNhdGlvbiByZWdpb25zIGZyb20gYW4gZXhpc3RpbmcgQVdTIFBheW1lbnQgQ3J5cHRvZ3JhcGh5IGtleVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZW1vdmVLZXlSZXBsaWNhdGlvblJlZ2lvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVtb3ZlS2V5UmVwbGljYXRpb25SZWdpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZW1vdmVLZXlSZXBsaWNhdGlvblJlZ2lvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjYW5jZWwgYSBzY2hlZHVsZWQga2V5IGRlbGV0aW9uIGlmIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIHdhaXRpbmcgcGVyaW9kIGEgS2V5IG5lZWRzIHRvIGJlIHJldml2ZWRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVzdG9yZUtleS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZXN0b3JlS2V5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZXN0b3JlS2V5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZW5hYmxlIGEgZGlzYWJsZWQgS2V5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0YXJ0S2V5VXNhZ2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRLZXlVc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRLZXlVc2FnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2FibGUgYW4gZW5hYmxlZCBLZXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RvcEtleVVzYWdlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0b3BLZXlVc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RvcEtleVVzYWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWRkIG9yIG92ZXJ3cml0ZXMgb25lIG9yIG1vcmUgdGFncyBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmcsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9UYWdSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9UYWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB0cmFuc2xhdGUgd3JhcHBpbmcga2V5IHR5cGUgZm9yIGEgd3JhcHBlZCBrZXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0RhdGFBUElSZWZlcmVuY2UvQVBJX1RyYW5zbGF0ZUtleU1hdGVyaWFsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1RyYW5zbGF0ZUtleU1hdGVyaWFsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdUcmFuc2xhdGVLZXlNYXRlcmlhbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHRyYW5zbGF0ZSBlbmNyeXB0ZWQgUElOIGJsb2NrIGZyb20gYW5kIHRvIElTTyA5NTY0IGZvcm1hdHMgMCwxLDMsNFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvRGF0YUFQSVJlZmVyZW5jZS9BUElfVHJhbnNsYXRlUGluRGF0YS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9UcmFuc2xhdGVQaW5EYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdUcmFuc2xhdGVQaW5EYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVtb3ZlIHRoZSBzcGVjaWZpZWQgdGFnIG9yIHRhZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VudGFnUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVW50YWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVW50YWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNoYW5nZSB0aGUga2V5IHRvIHdoaWNoIGFuIGFsaWFzIGlzIGFzc2lnbmVkLCBvciB1bmFzc2lnbiBpdCBmcm9tIGl0cyBjdXJyZW50IGtleVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVBbGlhcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVBbGlhcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQWxpYXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB2ZXJpZnkgQXV0aG9yaXphdGlvbiBSZXF1ZXN0IENyeXB0b2dyYW0gKEFSUUMpIGZvciBhIEVNViBjaGlwIHBheW1lbnQgY2FyZCBhdXRob3JpemF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9EYXRhQVBJUmVmZXJlbmNlL0FQSV9WZXJpZnlBdXRoUmVxdWVzdENyeXB0b2dyYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVmVyaWZ5QXV0aFJlcXVlc3RDcnlwdG9ncmFtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdWZXJpZnlBdXRoUmVxdWVzdENyeXB0b2dyYW0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB2ZXJpZnkgY2FyZC1yZWxhdGVkIHZhbGlkYXRpb24gZGF0YSB1c2luZyBhbGdvcml0aG1zIHN1Y2ggYXMgQ2FyZCBWZXJpZmljYXRpb24gVmFsdWVzIChDVlYvQ1ZWMiksIER5bmFtaWMgQ2FyZCBWZXJpZmljYXRpb24gVmFsdWVzIChkQ1ZWL2RDVlYyKSBhbmQgQ2FyZCBTZWN1cml0eSBDb2RlcyAoQ1NDKVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wYXltZW50LWNyeXB0b2dyYXBoeS9sYXRlc3QvRGF0YUFQSVJlZmVyZW5jZS9BUElfVmVyaWZ5Q2FyZFZhbGlkYXRpb25EYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1ZlcmlmeUNhcmRWYWxpZGF0aW9uRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVmVyaWZ5Q2FyZFZhbGlkYXRpb25EYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdmVyaWZ5IE1BQyAoTWVzc2FnZSBBdXRoZW50aWNhdGlvbiBDb2RlKSBvZiBpbnB1dCBkYXRhIGFnYWluc3QgYSBwcm92aWRlZCBNQUNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcGF5bWVudC1jcnlwdG9ncmFwaHkvbGF0ZXN0L0RhdGFBUElSZWZlcmVuY2UvQVBJX1ZlcmlmeU1hYy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9WZXJpZnlNYWMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1ZlcmlmeU1hYycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHZlcmlmeSBwaW4tcmVsYXRlZCBkYXRhIHN1Y2ggYXMgUElOIGFuZCBQSU4gT2Zmc2V0IHVzaW5nIGFsZ29yaXRobXMgaW5jbHVkaW5nIFZJU0EgUFZWIGFuZCBJQk0zNjI0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9EYXRhQVBJUmVmZXJlbmNlL0FQSV9WZXJpZnlQaW5EYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1ZlcmlmeVBpbkRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1ZlcmlmeVBpbkRhdGEnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY2Nlc3NMZXZlbExpc3Q6IEFjY2Vzc0xldmVsTGlzdCA9IHtcbiAgICBXcml0ZTogW1xuICAgICAgJ0FkZEtleVJlcGxpY2F0aW9uUmVnaW9ucycsXG4gICAgICAnQXNzb2NpYXRlTXBhVGVhbScsXG4gICAgICAnQ3JlYXRlQWxpYXMnLFxuICAgICAgJ0NyZWF0ZUtleScsXG4gICAgICAnRGVjcnlwdERhdGEnLFxuICAgICAgJ0RlbGV0ZUFsaWFzJyxcbiAgICAgICdEZWxldGVLZXknLFxuICAgICAgJ0RlbGV0ZVJlc291cmNlUG9saWN5JyxcbiAgICAgICdEaXNhYmxlRGVmYXVsdEtleVJlcGxpY2F0aW9uUmVnaW9ucycsXG4gICAgICAnRGlzYXNzb2NpYXRlTXBhVGVhbScsXG4gICAgICAnRW5hYmxlRGVmYXVsdEtleVJlcGxpY2F0aW9uUmVnaW9ucycsXG4gICAgICAnRW5jcnlwdERhdGEnLFxuICAgICAgJ0V4cG9ydEtleScsXG4gICAgICAnR2VuZXJhdGVBczI4MDVLZWtWYWxpZGF0aW9uJyxcbiAgICAgICdHZW5lcmF0ZUNhcmRWYWxpZGF0aW9uRGF0YScsXG4gICAgICAnR2VuZXJhdGVNYWMnLFxuICAgICAgJ0dlbmVyYXRlTWFjRW12UGluQ2hhbmdlJyxcbiAgICAgICdHZW5lcmF0ZVBpbkRhdGEnLFxuICAgICAgJ0ltcG9ydEtleScsXG4gICAgICAnUHV0UmVzb3VyY2VQb2xpY3knLFxuICAgICAgJ1JlRW5jcnlwdERhdGEnLFxuICAgICAgJ1JlbW92ZUtleVJlcGxpY2F0aW9uUmVnaW9ucycsXG4gICAgICAnUmVzdG9yZUtleScsXG4gICAgICAnU3RhcnRLZXlVc2FnZScsXG4gICAgICAnU3RvcEtleVVzYWdlJyxcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVHJhbnNsYXRlS2V5TWF0ZXJpYWwnLFxuICAgICAgJ1RyYW5zbGF0ZVBpbkRhdGEnLFxuICAgICAgJ1VudGFnUmVzb3VyY2UnLFxuICAgICAgJ1VwZGF0ZUFsaWFzJyxcbiAgICAgICdWZXJpZnlBdXRoUmVxdWVzdENyeXB0b2dyYW0nLFxuICAgICAgJ1ZlcmlmeUNhcmRWYWxpZGF0aW9uRGF0YScsXG4gICAgICAnVmVyaWZ5TWFjJyxcbiAgICAgICdWZXJpZnlQaW5EYXRhJ1xuICAgIF0sXG4gICAgJ1Blcm1pc3Npb25zIG1hbmFnZW1lbnQnOiBbXG4gICAgICAnRGVsZXRlUmVzb3VyY2VQb2xpY3knLFxuICAgICAgJ1B1dFJlc291cmNlUG9saWN5J1xuICAgIF0sXG4gICAgUmVhZDogW1xuICAgICAgJ0dldEFsaWFzJyxcbiAgICAgICdHZXRDZXJ0aWZpY2F0ZVNpZ25pbmdSZXF1ZXN0JyxcbiAgICAgICdHZXREZWZhdWx0S2V5UmVwbGljYXRpb25SZWdpb25zJyxcbiAgICAgICdHZXRLZXknLFxuICAgICAgJ0dldE1wYVRlYW1Bc3NvY2lhdGlvbicsXG4gICAgICAnR2V0UGFyYW1ldGVyc0ZvckV4cG9ydCcsXG4gICAgICAnR2V0UGFyYW1ldGVyc0ZvckltcG9ydCcsXG4gICAgICAnR2V0UHVibGljS2V5Q2VydGlmaWNhdGUnLFxuICAgICAgJ0dldFJlc291cmNlUG9saWN5JyxcbiAgICAgICdMaXN0VGFnc0ZvclJlc291cmNlJ1xuICAgIF0sXG4gICAgTGlzdDogW1xuICAgICAgJ0xpc3RBbGlhc2VzJyxcbiAgICAgICdMaXN0S2V5cydcbiAgICBdLFxuICAgIFRhZ2dpbmc6IFtcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZSdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGFsaWFzIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIGFsaWFzIC0gSWRlbnRpZmllciBmb3IgdGhlIGFsaWFzLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZXNvdXJjZUFsaWFzZXMoKVxuICAgKi9cbiAgcHVibGljIG9uQWxpYXMoYWxpYXM6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpwYXltZW50LWNyeXB0b2dyYXBoeTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06YWxpYXMvJHsgYWxpYXMgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGFwcHJvdmFsLXRlYW0gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbXBhL2xhdGVzdC91c2VyZ3VpZGUvbXBhLWNvbmNlcHRzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGFwcHJvdmFsVGVhbUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGFwcHJvdmFsVGVhbUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25BcHByb3ZhbFRlYW0oYXBwcm92YWxUZWFtSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTptcGE6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmFwcHJvdmFsLXRlYW0vJHsgYXBwcm92YWxUZWFtSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGtleSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSBrZXlJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBrZXlJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZlJlc291cmNlQWxpYXNlcygpXG4gICAqL1xuICBwdWJsaWMgb25LZXkoa2V5SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpwYXltZW50LWNyeXB0b2dyYXBoeTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06a2V5LyR7IGtleUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBib3RoIHRoZSBrZXkgYW5kIHZhbHVlIG9mIHRoZSB0YWcgaW4gdGhlIHJlcXVlc3QgZm9yIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy1yZXF1ZXN0dGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVLZXkoKVxuICAgKiAtIC50b0RlbGV0ZUFsaWFzKClcbiAgICogLSAudG9HZXRBbGlhcygpXG4gICAqIC0gLnRvSW1wb3J0S2V5KClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlQWxpYXMoKVxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVxdWVzdFRhZyh0YWdLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpSZXF1ZXN0VGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGFncyBhc3NpZ25lZCB0byBhIGtleSBmb3IgdGhlIHNwZWNpZmllZCBvcGVyYXRpb25cbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3BheW1lbnQtY3J5cHRvZ3JhcGh5L2xhdGVzdC9BUElSZWZlcmVuY2Uvc2VjdXJpdHlfaWFtX3NlcnZpY2Utd2l0aC1pYW0uaHRtbCNzZWN1cml0eV9pYW1fc2VydmljZS13aXRoLWlhbS10YWdzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BZGRLZXlSZXBsaWNhdGlvblJlZ2lvbnMoKVxuICAgKiAtIC50b0Fzc29jaWF0ZU1wYVRlYW0oKVxuICAgKiAtIC50b0NyZWF0ZUFsaWFzKClcbiAgICogLSAudG9EZWNyeXB0RGF0YSgpXG4gICAqIC0gLnRvRGVsZXRlS2V5KClcbiAgICogLSAudG9EZWxldGVSZXNvdXJjZVBvbGljeSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlTXBhVGVhbSgpXG4gICAqIC0gLnRvRW5jcnlwdERhdGEoKVxuICAgKiAtIC50b0V4cG9ydEtleSgpXG4gICAqIC0gLnRvR2VuZXJhdGVBczI4MDVLZWtWYWxpZGF0aW9uKClcbiAgICogLSAudG9HZW5lcmF0ZUNhcmRWYWxpZGF0aW9uRGF0YSgpXG4gICAqIC0gLnRvR2VuZXJhdGVNYWMoKVxuICAgKiAtIC50b0dlbmVyYXRlTWFjRW12UGluQ2hhbmdlKClcbiAgICogLSAudG9HZW5lcmF0ZVBpbkRhdGEoKVxuICAgKiAtIC50b0dldEFsaWFzKClcbiAgICogLSAudG9HZXRDZXJ0aWZpY2F0ZVNpZ25pbmdSZXF1ZXN0KClcbiAgICogLSAudG9HZXRLZXkoKVxuICAgKiAtIC50b0dldE1wYVRlYW1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvR2V0UHVibGljS2V5Q2VydGlmaWNhdGUoKVxuICAgKiAtIC50b0dldFJlc291cmNlUG9saWN5KClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9QdXRSZXNvdXJjZVBvbGljeSgpXG4gICAqIC0gLnRvUmVFbmNyeXB0RGF0YSgpXG4gICAqIC0gLnRvUmVtb3ZlS2V5UmVwbGljYXRpb25SZWdpb25zKClcbiAgICogLSAudG9SZXN0b3JlS2V5KClcbiAgICogLSAudG9TdGFydEtleVVzYWdlKClcbiAgICogLSAudG9TdG9wS2V5VXNhZ2UoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9UcmFuc2xhdGVLZXlNYXRlcmlhbCgpXG4gICAqIC0gLnRvVHJhbnNsYXRlUGluRGF0YSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlQWxpYXMoKVxuICAgKiAtIC50b1ZlcmlmeUF1dGhSZXF1ZXN0Q3J5cHRvZ3JhbSgpXG4gICAqIC0gLnRvVmVyaWZ5Q2FyZFZhbGlkYXRpb25EYXRhKClcbiAgICogLSAudG9WZXJpZnlNYWMoKVxuICAgKiAtIC50b1ZlcmlmeVBpbkRhdGEoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGFwcHJvdmFsLXRlYW1cbiAgICogLSBrZXlcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1Jlc291cmNlVGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlJlc291cmNlVGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRhZyBrZXlzIGluIHRoZSByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvblxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtdGFna2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlS2V5KClcbiAgICogLSAudG9EZWxldGVBbGlhcygpXG4gICAqIC0gLnRvR2V0QWxpYXMoKVxuICAgKiAtIC50b0ltcG9ydEtleSgpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZUFsaWFzKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBd3NUYWdLZXlzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6VGFnS2V5c2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBDZXJ0aWZpY2F0ZUF1dGhvcml0eVB1YmxpY0tleUlkZW50aWZpZXIgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IG9yIHRoZSBJbXBvcnRLZXksIGFuZCBFeHBvcnRLZXkgb3BlcmF0aW9uc1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvRXhwb3J0S2V5KClcbiAgICogLSAudG9JbXBvcnRLZXkoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkNlcnRpZmljYXRlQXV0aG9yaXR5UHVibGljS2V5SWRlbnRpZmllcih2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgQ2VydGlmaWNhdGVBdXRob3JpdHlQdWJsaWNLZXlJZGVudGlmaWVyYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHR5cGUgb2Yga2V5IG1hdGVyaWFsIGJlaW5nIGltcG9ydGVkIFtSb290Q2VydGlmaWNhdGVQdWJsaWNLZXksIFRydXN0ZWRDZXJ0aWZpY2F0ZVB1YmxpY0tleSwgVHIzNEtleUJsb2NrLCBUcjMxS2V5QmxvY2ssIERpZmZpZUhlbGxtYW5UcjMxS2V5QmxvY2ssIEFzMjgwNUtleUNyeXB0b2dyYW0sIEtleUNyeXB0b2dyYW1dIGZvciB0aGUgSW1wb3J0S2V5IG9wZXJhdGlvblxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvSW1wb3J0S2V5KClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZJbXBvcnRLZXlNYXRlcmlhbCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgSW1wb3J0S2V5TWF0ZXJpYWxgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBLZXlBbGdvcml0aG0gc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IGZvciB0aGUgQ3JlYXRlS2V5IG9wZXJhdGlvblxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlS2V5KClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZLZXlBbGdvcml0aG0odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEtleUFsZ29yaXRobWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IEtleUNsYXNzIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCBmb3IgdGhlIENyZWF0ZUtleSBvcGVyYXRpb25cbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZUtleSgpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmS2V5Q2xhc3ModmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEtleUNsYXNzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgS2V5Q2xhc3Mgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IG9yIGFzc29jaWF0ZWQgd2l0aCBhIGtleSBmb3IgdGhlIENyZWF0ZUtleSBvcGVyYXRpb25cbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZUtleSgpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmS2V5VXNhZ2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEtleVVzYWdlYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYWxpYXNlcyBpbiB0aGUgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCBvcGVyYXRpb25cbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FkZEtleVJlcGxpY2F0aW9uUmVnaW9ucygpXG4gICAqIC0gLnRvRGVjcnlwdERhdGEoKVxuICAgKiAtIC50b0RlbGV0ZUtleSgpXG4gICAqIC0gLnRvRW5jcnlwdERhdGEoKVxuICAgKiAtIC50b0V4cG9ydEtleSgpXG4gICAqIC0gLnRvR2VuZXJhdGVBczI4MDVLZWtWYWxpZGF0aW9uKClcbiAgICogLSAudG9HZW5lcmF0ZUNhcmRWYWxpZGF0aW9uRGF0YSgpXG4gICAqIC0gLnRvR2VuZXJhdGVNYWMoKVxuICAgKiAtIC50b0dlbmVyYXRlTWFjRW12UGluQ2hhbmdlKClcbiAgICogLSAudG9HZW5lcmF0ZVBpbkRhdGEoKVxuICAgKiAtIC50b0dldENlcnRpZmljYXRlU2lnbmluZ1JlcXVlc3QoKVxuICAgKiAtIC50b0dldEtleSgpXG4gICAqIC0gLnRvR2V0UHVibGljS2V5Q2VydGlmaWNhdGUoKVxuICAgKiAtIC50b1JlRW5jcnlwdERhdGEoKVxuICAgKiAtIC50b1JlbW92ZUtleVJlcGxpY2F0aW9uUmVnaW9ucygpXG4gICAqIC0gLnRvUmVzdG9yZUtleSgpXG4gICAqIC0gLnRvU3RhcnRLZXlVc2FnZSgpXG4gICAqIC0gLnRvU3RvcEtleVVzYWdlKClcbiAgICogLSAudG9UcmFuc2xhdGVLZXlNYXRlcmlhbCgpXG4gICAqIC0gLnRvVHJhbnNsYXRlUGluRGF0YSgpXG4gICAqIC0gLnRvVmVyaWZ5QXV0aFJlcXVlc3RDcnlwdG9ncmFtKClcbiAgICogLSAudG9WZXJpZnlDYXJkVmFsaWRhdGlvbkRhdGEoKVxuICAgKiAtIC50b1ZlcmlmeU1hYygpXG4gICAqIC0gLnRvVmVyaWZ5UGluRGF0YSgpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUmVxdWVzdEFsaWFzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBSZXF1ZXN0QWxpYXNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBhbGlhc2VzIGFzc29jaWF0ZWQgd2l0aCBhIGtleSBmb3IgdGhlIHNwZWNpZmllZCBvcGVyYXRpb25cbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FkZEtleVJlcGxpY2F0aW9uUmVnaW9ucygpXG4gICAqIC0gLnRvQ3JlYXRlQWxpYXMoKVxuICAgKiAtIC50b0RlY3J5cHREYXRhKClcbiAgICogLSAudG9EZWxldGVBbGlhcygpXG4gICAqIC0gLnRvRGVsZXRlS2V5KClcbiAgICogLSAudG9EZWxldGVSZXNvdXJjZVBvbGljeSgpXG4gICAqIC0gLnRvRW5jcnlwdERhdGEoKVxuICAgKiAtIC50b0V4cG9ydEtleSgpXG4gICAqIC0gLnRvR2VuZXJhdGVBczI4MDVLZWtWYWxpZGF0aW9uKClcbiAgICogLSAudG9HZW5lcmF0ZUNhcmRWYWxpZGF0aW9uRGF0YSgpXG4gICAqIC0gLnRvR2VuZXJhdGVNYWMoKVxuICAgKiAtIC50b0dlbmVyYXRlTWFjRW12UGluQ2hhbmdlKClcbiAgICogLSAudG9HZW5lcmF0ZVBpbkRhdGEoKVxuICAgKiAtIC50b0dldEFsaWFzKClcbiAgICogLSAudG9HZXRDZXJ0aWZpY2F0ZVNpZ25pbmdSZXF1ZXN0KClcbiAgICogLSAudG9HZXRLZXkoKVxuICAgKiAtIC50b0dldFB1YmxpY0tleUNlcnRpZmljYXRlKClcbiAgICogLSAudG9HZXRSZXNvdXJjZVBvbGljeSgpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvUHV0UmVzb3VyY2VQb2xpY3koKVxuICAgKiAtIC50b1JlRW5jcnlwdERhdGEoKVxuICAgKiAtIC50b1JlbW92ZUtleVJlcGxpY2F0aW9uUmVnaW9ucygpXG4gICAqIC0gLnRvUmVzdG9yZUtleSgpXG4gICAqIC0gLnRvU3RhcnRLZXlVc2FnZSgpXG4gICAqIC0gLnRvU3RvcEtleVVzYWdlKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVHJhbnNsYXRlS2V5TWF0ZXJpYWwoKVxuICAgKiAtIC50b1RyYW5zbGF0ZVBpbkRhdGEoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZUFsaWFzKClcbiAgICogLSAudG9WZXJpZnlBdXRoUmVxdWVzdENyeXB0b2dyYW0oKVxuICAgKiAtIC50b1ZlcmlmeUNhcmRWYWxpZGF0aW9uRGF0YSgpXG4gICAqIC0gLnRvVmVyaWZ5TWFjKClcbiAgICogLSAudG9WZXJpZnlQaW5EYXRhKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBhbGlhc1xuICAgKiAtIGtleVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlJlc291cmNlQWxpYXNlcyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUmVzb3VyY2VBbGlhc2VzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIFdyYXBwaW5nS2V5SWRlbnRpZmllciBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgZm9yIHRoZSBJbXBvcnRLZXksIGFuZCBFeHBvcnRLZXkgb3BlcmF0aW9uc1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvRXhwb3J0S2V5KClcbiAgICogLSAudG9JbXBvcnRLZXkoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZldyYXBwaW5nS2V5SWRlbnRpZmllcih2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgV3JhcHBpbmdLZXlJZGVudGlmaWVyYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtwYXltZW50LWNyeXB0b2dyYXBoeV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfcGF5bWVudC1jcnlwdG9ncmFwaHkuaHRtbCkuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wcz86IGlhbS5Qb2xpY3lTdGF0ZW1lbnRQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxufVxuIl19