cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
1,020 lines • 96.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Kendra = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [kendra](https://docs.aws.amazon.com/service-authorization/latest/reference/list_kendra.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class Kendra extends shared_1.PolicyStatement {
/**
* Grants permission to put principal mapping in index
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_PutPrincipalMapping.html
*/
toAssociateEntitiesToExperience() {
return this.to('AssociateEntitiesToExperience');
}
/**
* Defines the specific permissions of users or groups in your AWS SSO identity source with access to your Amazon Kendra experience
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_AssociatePersonasToEntities.html
*/
toAssociatePersonasToEntities() {
return this.to('AssociatePersonasToEntities');
}
/**
* Grants permission to batch delete document
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_BatchDeleteDocument.html
*/
toBatchDeleteDocument() {
return this.to('BatchDeleteDocument');
}
/**
* Grants permission to delete a featured results set
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DeleteFeaturedResults.html
*/
toBatchDeleteFeaturedResultsSet() {
return this.to('BatchDeleteFeaturedResultsSet');
}
/**
* Grants permission to do batch get document status
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_BatchGetDocumentStatus.html
*/
toBatchGetDocumentStatus() {
return this.to('BatchGetDocumentStatus');
}
/**
* Grants permission to batch put document
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_BatchPutDocument.html
*/
toBatchPutDocument() {
return this.to('BatchPutDocument');
}
/**
* Grants permission to clear out the suggestions for a given index, generated so far
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_ClearQuerySuggestions.html
*/
toClearQuerySuggestions() {
return this.to('ClearQuerySuggestions');
}
/**
* Grants permission to create an access control configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_CreateAccessControlConfiguration.html
*/
toCreateAccessControlConfiguration() {
return this.to('CreateAccessControlConfiguration');
}
/**
* Grants permission to create a data source
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_CreateDataSource.html
*/
toCreateDataSource() {
return this.to('CreateDataSource');
}
/**
* Creates an Amazon Kendra experience such as a search application
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_CreateExperience.html
*/
toCreateExperience() {
return this.to('CreateExperience');
}
/**
* Grants permission to create an Faq
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_CreateFaq.html
*/
toCreateFaq() {
return this.to('CreateFaq');
}
/**
* Grants permission to create a featured results set
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_CreateFeaturedResults.html
*/
toCreateFeaturedResultsSet() {
return this.to('CreateFeaturedResultsSet');
}
/**
* Grants permission to create an Index
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_CreateIndex.html
*/
toCreateIndex() {
return this.to('CreateIndex');
}
/**
* Grants permission to create a QuerySuggestions BlockList
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_CreateQuerySuggestionsBlockList.html
*/
toCreateQuerySuggestionsBlockList() {
return this.to('CreateQuerySuggestionsBlockList');
}
/**
* Grants permission to create a Thesaurus
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_CreateThesaurus.html
*/
toCreateThesaurus() {
return this.to('CreateThesaurus');
}
/**
* Grants permission to delete an access control configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DeleteAccessControlConfiguration.html
*/
toDeleteAccessControlConfiguration() {
return this.to('DeleteAccessControlConfiguration');
}
/**
* Grants permission to delete a data source
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DeleteDataSource.html
*/
toDeleteDataSource() {
return this.to('DeleteDataSource');
}
/**
* Deletes your Amazon Kendra experience such as a search application
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DeleteExperience.html
*/
toDeleteExperience() {
return this.to('DeleteExperience');
}
/**
* Grants permission to delete an Faq
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DeleteFaq.html
*/
toDeleteFaq() {
return this.to('DeleteFaq');
}
/**
* Grants permission to delete an Index
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DeleteIndex.html
*/
toDeleteIndex() {
return this.to('DeleteIndex');
}
/**
* Grants permission to delete principal mapping from index
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DeletePrincipalMapping.html
*/
toDeletePrincipalMapping() {
return this.to('DeletePrincipalMapping');
}
/**
* Grants permission to delete a QuerySuggestions BlockList
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DeleteQuerySuggestionsBlockList.html
*/
toDeleteQuerySuggestionsBlockList() {
return this.to('DeleteQuerySuggestionsBlockList');
}
/**
* Grants permission to delete a Thesaurus
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DeleteThesaurus.html
*/
toDeleteThesaurus() {
return this.to('DeleteThesaurus');
}
/**
* Grants permission to describe an access control configuration
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DescribeAccessControlConfiguration.html
*/
toDescribeAccessControlConfiguration() {
return this.to('DescribeAccessControlConfiguration');
}
/**
* Grants permission to describe a data source
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DescribeDataSource.html
*/
toDescribeDataSource() {
return this.to('DescribeDataSource');
}
/**
* Gets information about your Amazon Kendra experience such as a search application
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DescribeExperience.html
*/
toDescribeExperience() {
return this.to('DescribeExperience');
}
/**
* Grants permission to describe an Faq
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DescribeFaq.html
*/
toDescribeFaq() {
return this.to('DescribeFaq');
}
/**
* Grants permission to describe a featured results set
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DescribeThesaurus.html
*/
toDescribeFeaturedResultsSet() {
return this.to('DescribeFeaturedResultsSet');
}
/**
* Grants permission to describe an Index
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DescribeIndex.html
*/
toDescribeIndex() {
return this.to('DescribeIndex');
}
/**
* Grants permission to describe principal mapping from index
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DescribePrincipalMapping.html
*/
toDescribePrincipalMapping() {
return this.to('DescribePrincipalMapping');
}
/**
* Grants permission to describe a QuerySuggestions BlockList
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DescribeQuerySuggestionsBlockList.html
*/
toDescribeQuerySuggestionsBlockList() {
return this.to('DescribeQuerySuggestionsBlockList');
}
/**
* Grants permission to describe the query suggestions configuration for an index
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DescribeQuerySuggestionsConfig.html
*/
toDescribeQuerySuggestionsConfig() {
return this.to('DescribeQuerySuggestionsConfig');
}
/**
* Grants permission to describe a Thesaurus
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DescribeThesaurus.html
*/
toDescribeThesaurus() {
return this.to('DescribeThesaurus');
}
/**
* Prevents users or groups in your AWS SSO identity source from accessing your Amazon Kendra experience
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DisassociateEntitiesFromExperience.html
*/
toDisassociateEntitiesFromExperience() {
return this.to('DisassociateEntitiesFromExperience');
}
/**
* Removes the specific permissions of users or groups in your AWS SSO identity source with access to your Amazon Kendra experience
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_DisassociatePersonasFromEntities.html
*/
toDisassociatePersonasFromEntities() {
return this.to('DisassociatePersonasFromEntities');
}
/**
* Grants permission to get suggestions for a query prefix
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_GetQuerySuggestions.html
*/
toGetQuerySuggestions() {
return this.to('GetQuerySuggestions');
}
/**
* Retrieves search metrics data
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_GetSnapshots.html
*/
toGetSnapshots() {
return this.to('GetSnapshots');
}
/**
* Grants permission to list the access control configurations
*
* Access Level: List
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_ListAccessControlConfigurations.html
*/
toListAccessControlConfigurations() {
return this.to('ListAccessControlConfigurations');
}
/**
* Grants permission to get Data Source sync job history
*
* Access Level: List
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_ListDataSourceSyncJobs.html
*/
toListDataSourceSyncJobs() {
return this.to('ListDataSourceSyncJobs');
}
/**
* Grants permission to list the data sources
*
* Access Level: List
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_ListDataSources.html
*/
toListDataSources() {
return this.to('ListDataSources');
}
/**
* Lists specific permissions of users and groups with access to your Amazon Kendra experience
*
* Access Level: List
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_ListEntityPersonas.html
*/
toListEntityPersonas() {
return this.to('ListEntityPersonas');
}
/**
* Lists users or groups in your AWS SSO identity source that are granted access to your Amazon Kendra experience
*
* Access Level: List
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_ListExperienceEntities.html
*/
toListExperienceEntities() {
return this.to('ListExperienceEntities');
}
/**
* Lists one or more Amazon Kendra experiences. You can create an Amazon Kendra experience such as a search application
*
* Access Level: List
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_ListExperiences.html
*/
toListExperiences() {
return this.to('ListExperiences');
}
/**
* Grants permission to list the Faqs
*
* Access Level: List
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_ListFaqs.html
*/
toListFaqs() {
return this.to('ListFaqs');
}
/**
* Grants permission to list the featured results sets
*
* Access Level: List
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_ListFeaturedResults.html
*/
toListFeaturedResultsSets() {
return this.to('ListFeaturedResultsSets');
}
/**
* Grants permission to list groups that are older than an ordering id
*
* Access Level: List
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_ListGroupsOlderThanOrderingId.html
*/
toListGroupsOlderThanOrderingId() {
return this.to('ListGroupsOlderThanOrderingId');
}
/**
* Grants permission to list the indexes
*
* Access Level: List
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_ListIndices.html
*/
toListIndices() {
return this.to('ListIndices');
}
/**
* Grants permission to list the QuerySuggestions BlockLists
*
* Access Level: List
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_ListQuerySuggestionsBlockLists.html
*/
toListQuerySuggestionsBlockLists() {
return this.to('ListQuerySuggestionsBlockLists');
}
/**
* Grants permission to list tags for a resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to list the Thesauri
*
* Access Level: List
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_ListThesauri.html
*/
toListThesauri() {
return this.to('ListThesauri');
}
/**
* Grants permission to put principal mapping in index
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_PutPrincipalMapping.html
*/
toPutPrincipalMapping() {
return this.to('PutPrincipalMapping');
}
/**
* Grants permission to query documents and faqs
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_Query.html
*/
toQuery() {
return this.to('Query');
}
/**
* Grants permission to retrieve relevant content from an index
*
* Access Level: Read
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_Retrieve.html
*/
toRetrieve() {
return this.to('Retrieve');
}
/**
* Grants permission to start Data Source sync job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_StartDataSourceSyncJob.html
*/
toStartDataSourceSyncJob() {
return this.to('StartDataSourceSyncJob');
}
/**
* Grants permission to stop Data Source sync job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_StopDataSourceSyncJob.html
*/
toStopDataSourceSyncJob() {
return this.to('StopDataSourceSyncJob');
}
/**
* Grants permission to send feedback about a query results
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_SubmitFeedback.html
*/
toSubmitFeedback() {
return this.to('SubmitFeedback');
}
/**
* Grants permission to tag a resource with given key value pairs
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to remove the tag with the given key from a resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to update an access control configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_UpdateAccessControlConfiguration.html
*/
toUpdateAccessControlConfiguration() {
return this.to('UpdateAccessControlConfiguration');
}
/**
* Grants permission to update a data source
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_UpdateDataSource.html
*/
toUpdateDataSource() {
return this.to('UpdateDataSource');
}
/**
* Updates your Amazon Kendra experience such as a search application
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_UpdateExperience.html
*/
toUpdateExperience() {
return this.to('UpdateExperience');
}
/**
* Grants permission to update a featured results set
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_UpdateFeaturedResults.html
*/
toUpdateFeaturedResultsSet() {
return this.to('UpdateFeaturedResultsSet');
}
/**
* Grants permission to update an Index
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_UpdateIndex.html
*/
toUpdateIndex() {
return this.to('UpdateIndex');
}
/**
* Grants permission to update a QuerySuggestions BlockList
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_UpdateQuerySuggestionsBlockList.html
*/
toUpdateQuerySuggestionsBlockList() {
return this.to('UpdateQuerySuggestionsBlockList');
}
/**
* Grants permission to update the query suggestions configuration for an index
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_UpdateQuerySuggestionsConfig.html
*/
toUpdateQuerySuggestionsConfig() {
return this.to('UpdateQuerySuggestionsConfig');
}
/**
* Grants permission to update a thesaurus
*
* Access Level: Write
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_UpdateThesaurus.html
*/
toUpdateThesaurus() {
return this.to('UpdateThesaurus');
}
/**
* Adds a resource of type access-control-configuration to the statement
*
* https://docs.aws.amazon.com/kendra/latest/dg/API_CreateAccessControlConfiguration.html
*
* @param indexId - Identifier for the indexId.
* @param accessControlConfigurationId - Identifier for the accessControlConfigurationId.
* @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.
*/
onAccessControlConfiguration(indexId, accessControlConfigurationId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:kendra:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:index/${indexId}/access-control-configuration/${accessControlConfigurationId}`);
}
/**
* Adds a resource of type data-source to the statement
*
* https://docs.aws.amazon.com/kendra/latest/dg/data-source.html
*
* @param indexId - Identifier for the indexId.
* @param dataSourceId - Identifier for the dataSourceId.
* @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()
*/
onDataSource(indexId, dataSourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:kendra:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:index/${indexId}/data-source/${dataSourceId}`);
}
/**
* Adds a resource of type experience to the statement
*
* https://docs.aws.amazon.com/kendra/latest/dg/deploying-search-experience-no-code.html
*
* @param indexId - Identifier for the indexId.
* @param experienceId - Identifier for the experienceId.
* @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.
*/
onExperience(indexId, experienceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:kendra:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:index/${indexId}/experience/${experienceId}`);
}
/**
* Adds a resource of type faq to the statement
*
* https://docs.aws.amazon.com/kendra/latest/dg/faq.html
*
* @param indexId - Identifier for the indexId.
* @param faqId - Identifier for the faqId.
* @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()
*/
onFaq(indexId, faqId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:kendra:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:index/${indexId}/faq/${faqId}`);
}
/**
* Adds a resource of type featured-results-set to the statement
*
* https://docs.aws.amazon.com/kendra/latest/dg/featured-results.html
*
* @param indexId - Identifier for the indexId.
* @param featuredResultsSetId - Identifier for the featuredResultsSetId.
* @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()
*/
onFeaturedResultsSet(indexId, featuredResultsSetId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:kendra:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:index/${indexId}/featured-results-set/${featuredResultsSetId}`);
}
/**
* Adds a resource of type index to the statement
*
* https://docs.aws.amazon.com/kendra/latest/dg/index.html
*
* @param indexId - Identifier for the indexId.
* @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()
*/
onIndex(indexId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:kendra:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:index/${indexId}`);
}
/**
* Adds a resource of type query-suggestions-block-list to the statement
*
* https://docs.aws.amazon.com/kendra/latest/dg/query-suggestions-block-list.html
*
* @param indexId - Identifier for the indexId.
* @param querySuggestionsBlockListId - Identifier for the querySuggestionsBlockListId.
* @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()
*/
onQuerySuggestionsBlockList(indexId, querySuggestionsBlockListId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:kendra:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:index/${indexId}/query-suggestions-block-list/${querySuggestionsBlockListId}`);
}
/**
* Adds a resource of type thesaurus to the statement
*
* https://docs.aws.amazon.com/kendra/latest/dg/thesaurus.html
*
* @param indexId - Identifier for the indexId.
* @param thesaurusId - Identifier for the thesaurusId.
* @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()
*/
onThesaurus(indexId, thesaurusId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:kendra:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:index/${indexId}/thesaurus/${thesaurusId}`);
}
/**
* Filters access by the tags that are passed in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
*
* Applies to actions:
* - .toCreateDataSource()
* - .toCreateFaq()
* - .toCreateFeaturedResultsSet()
* - .toCreateIndex()
* - .toCreateQuerySuggestionsBlockList()
* - .toCreateThesaurus()
* - .toTagResource()
*
* @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 the tags associated with the resource
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
*
* Applies to actions:
* - .toAssociateEntitiesToExperience()
* - .toAssociatePersonasToEntities()
* - .toBatchDeleteDocument()
* - .toBatchDeleteFeaturedResultsSet()
* - .toBatchGetDocumentStatus()
* - .toBatchPutDocument()
* - .toClearQuerySuggestions()
* - .toCreateAccessControlConfiguration()
* - .toCreateDataSource()
* - .toCreateExperience()
* - .toCreateFaq()
* - .toCreateFeaturedResultsSet()
* - .toCreateQuerySuggestionsBlockList()
* - .toCreateThesaurus()
* - .toDeleteAccessControlConfiguration()
* - .toDeleteDataSource()
* - .toDeleteExperience()
* - .toDeleteFaq()
* - .toDeleteIndex()
* - .toDeletePrincipalMapping()
* - .toDeleteQuerySuggestionsBlockList()
* - .toDeleteThesaurus()
* - .toDescribeAccessControlConfiguration()
* - .toDescribeDataSource()
* - .toDescribeExperience()
* - .toDescribeFaq()
* - .toDescribeFeaturedResultsSet()
* - .toDescribeIndex()
* - .toDescribePrincipalMapping()
* - .toDescribeQuerySuggestionsBlockList()
* - .toDescribeQuerySuggestionsConfig()
* - .toDescribeThesaurus()
* - .toDisassociateEntitiesFromExperience()
* - .toDisassociatePersonasFromEntities()
* - .toGetQuerySuggestions()
* - .toGetSnapshots()
* - .toListAccessControlConfigurations()
* - .toListDataSourceSyncJobs()
* - .toListDataSources()
* - .toListEntityPersonas()
* - .toListExperienceEntities()
* - .toListExperiences()
* - .toListFaqs()
* - .toListFeaturedResultsSets()
* - .toListGroupsOlderThanOrderingId()
* - .toListQuerySuggestionsBlockLists()
* - .toListTagsForResource()
* - .toListThesauri()
* - .toPutPrincipalMapping()
* - .toQuery()
* - .toRetrieve()
* - .toStartDataSourceSyncJob()
* - .toStopDataSourceSyncJob()
* - .toSubmitFeedback()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateAccessControlConfiguration()
* - .toUpdateDataSource()
* - .toUpdateExperience()
* - .toUpdateFeaturedResultsSet()
* - .toUpdateIndex()
* - .toUpdateQuerySuggestionsBlockList()
* - .toUpdateQuerySuggestionsConfig()
* - .toUpdateThesaurus()
*
* Applies to resource types:
* - data-source
* - faq
* - featured-results-set
* - index
* - query-suggestions-block-list
* - thesaurus
*
* @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 that are passed in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
*
* Applies to actions:
* - .toCreateDataSource()
* - .toCreateFaq()
* - .toCreateFeaturedResultsSet()
* - .toCreateIndex()
* - .toCreateQuerySuggestionsBlockList()
* - .toCreateThesaurus()
* - .toTagResource()
* - .toUntagResource()
*
* @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');
}
/**
* Statement provider for service [kendra](https://docs.aws.amazon.com/service-authorization/latest/reference/list_kendra.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'kendra';
this.accessLevelList = {
Write: [
'AssociateEntitiesToExperience',
'AssociatePersonasToEntities',
'BatchDeleteDocument',
'BatchDeleteFeaturedResultsSet',
'BatchPutDocument',
'ClearQuerySuggestions',
'CreateAccessControlConfiguration',
'CreateDataSource',
'CreateExperience',
'CreateFaq',
'CreateFeaturedResultsSet',
'CreateIndex',
'CreateQuerySuggestionsBlockList',
'CreateThesaurus',
'DeleteAccessControlConfiguration',
'DeleteDataSource',
'DeleteExperience',
'DeleteFaq',
'DeleteIndex',
'DeletePrincipalMapping',
'DeleteQuerySuggestionsBlockList',
'DeleteThesaurus',
'DisassociateEntitiesFromExperience',
'DisassociatePersonasFromEntities',
'PutPrincipalMapping',
'StartDataSourceSyncJob',
'StopDataSourceSyncJob',
'SubmitFeedback',
'TagResource',
'UntagResource',
'UpdateAccessControlConfiguration',
'UpdateDataSource',
'UpdateExperience',
'UpdateFeaturedResultsSet',
'UpdateIndex',
'UpdateQuerySuggestionsBlockList',
'UpdateQuerySuggestionsConfig',
'UpdateThesaurus'
],
Read: [
'BatchGetDocumentStatus',
'DescribeAccessControlConfiguration',
'DescribeDataSource',
'DescribeExperience',
'DescribeFaq',
'DescribeFeaturedResultsSet',
'DescribeIndex',
'DescribePrincipalMapping',
'DescribeQuerySuggestionsBlockList',
'DescribeQuerySuggestionsConfig',
'DescribeThesaurus',
'GetQuerySuggestions',
'GetSnapshots',
'ListTagsForResource',
'Query',
'Retrieve'
],
List: [
'ListAccessControlConfigurations',
'ListDataSourceSyncJobs',
'ListDataSources',
'ListEntityPersonas',
'ListExperienceEntities',
'ListExperiences',
'ListFaqs',
'ListFeaturedResultsSets',
'ListGroupsOlderThanOrderingId',
'ListIndices',
'ListQuerySuggestionsBlockLists',
'ListThesauri'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
}
exports.Kendra = Kendra;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2VuZHJhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsia2VuZHJhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF5RDtBQUd6RDs7OztHQUlHO0FBQ0gsTUFBYSxNQUFPLFNBQVEsd0JBQWU7SUFHekM7Ozs7OztPQU1HO0lBQ0ksK0JBQStCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSw2QkFBNkI7UUFDbEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksK0JBQStCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksdUJBQXVCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQ0FBa0M7UUFDdkMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JB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QkFDSix3QkFBd0I7Z0JBQ3hCLG9DQUFvQztnQkFDcEMsb0JBQW9CO2dCQUNwQixvQkFBb0I7Z0JBQ3BCLGFBQWE7Z0JBQ2IsNEJBQTRCO2dCQUM1QixlQUFlO2dCQUNmLDBCQUEwQjtnQkFDMUIsbUNBQW1DO2dCQUNuQyxnQ0FBZ0M7Z0JBQ2hDLG1CQUFtQjtnQkFDbkIscUJBQXFCO2dCQUNyQixjQUFjO2dCQUNkLHFCQUFxQjtnQkFDckIsT0FBTztnQkFDUCxVQUFVO2FBQ1g7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osaUNBQWlDO2dCQUNqQyx3QkFBd0I7Z0JBQ3hCLGlCQUFpQjtnQkFDakIsb0JBQW9CO2dCQUNwQix3QkFBd0I7Z0JBQ3hCLGlCQUFpQjtnQkFDakIsVUFBVTtnQkFDVix5QkFBeUI7Z0JBQ3pCLCtCQUErQjtnQkFDL0IsYUFBYTtnQkFDYixnQ0FBZ0M7Z0JBQ2hDLGNBQWM7YUFDZjtZQUNELE9BQU8sRUFBRTtnQkFDUCxhQUFhO2dCQUNiLGVBQWU7YUFDaEI7U0FDRixDQUFDO0lBb1JGLENBQUM7Q0FDRjtBQS9qQ0Qsd0JBK2pDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjY2Vzc0xldmVsTGlzdCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hY2Nlc3MtbGV2ZWwnO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBPcGVyYXRvciB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBhd3NfaWFtIGFzIGlhbSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBba2VuZHJhXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9rZW5kcmEuaHRtbCkuXG4gKlxuICogQHBhcmFtIHNpZCBbU0lEXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3NpZC5odG1sKSBvZiB0aGUgc3RhdGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBLZW5kcmEgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdrZW5kcmEnO1xuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwdXQgcHJpbmNpcGFsIG1hcHBpbmcgaW4gaW5kZXhcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfUHV0UHJpbmNpcGFsTWFwcGluZy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NvY2lhdGVFbnRpdGllc1RvRXhwZXJpZW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlRW50aXRpZXNUb0V4cGVyaWVuY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBzcGVjaWZpYyBwZXJtaXNzaW9ucyBvZiB1c2VycyBvciBncm91cHMgaW4geW91ciBBV1MgU1NPIGlkZW50aXR5IHNvdXJjZSB3aXRoIGFjY2VzcyB0byB5b3VyIEFtYXpvbiBLZW5kcmEgZXhwZXJpZW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9Bc3NvY2lhdGVQZXJzb25hc1RvRW50aXRpZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlUGVyc29uYXNUb0VudGl0aWVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVQZXJzb25hc1RvRW50aXRpZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBiYXRjaCBkZWxldGUgZG9jdW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfQmF0Y2hEZWxldGVEb2N1bWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaERlbGV0ZURvY3VtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaERlbGV0ZURvY3VtZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgZmVhdHVyZWQgcmVzdWx0cyBzZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfRGVsZXRlRmVhdHVyZWRSZXN1bHRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoRGVsZXRlRmVhdHVyZWRSZXN1bHRzU2V0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaERlbGV0ZUZlYXR1cmVkUmVzdWx0c1NldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRvIGJhdGNoIGdldCBkb2N1bWVudCBzdGF0dXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9CYXRjaEdldERvY3VtZW50U3RhdHVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoR2V0RG9jdW1lbnRTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoR2V0RG9jdW1lbnRTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBiYXRjaCBwdXQgZG9jdW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfQmF0Y2hQdXREb2N1bWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaFB1dERvY3VtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaFB1dERvY3VtZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2xlYXIgb3V0IHRoZSBzdWdnZXN0aW9ucyBmb3IgYSBnaXZlbiBpbmRleCwgZ2VuZXJhdGVkIHNvIGZhclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9DbGVhclF1ZXJ5U3VnZ2VzdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ2xlYXJRdWVyeVN1Z2dlc3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDbGVhclF1ZXJ5U3VnZ2VzdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gYWNjZXNzIGNvbnRyb2wgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9DcmVhdGVBY2Nlc3NDb250cm9sQ29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVBY2Nlc3NDb250cm9sQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQWNjZXNzQ29udHJvbENvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBkYXRhIHNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9DcmVhdGVEYXRhU291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZURhdGFTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZURhdGFTb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEFtYXpvbiBLZW5kcmEgZXhwZXJpZW5jZSBzdWNoIGFzIGEgc2VhcmNoIGFwcGxpY2F0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvQVBJX0NyZWF0ZUV4cGVyaWVuY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRXhwZXJpZW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRXhwZXJpZW5jZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBGYXFcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfQ3JlYXRlRmFxLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUZhcSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRmFxJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgZmVhdHVyZWQgcmVzdWx0cyBzZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfQ3JlYXRlRmVhdHVyZWRSZXN1bHRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUZlYXR1cmVkUmVzdWx0c1NldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRmVhdHVyZWRSZXN1bHRzU2V0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIEluZGV4XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvQVBJX0NyZWF0ZUluZGV4Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVJbmRleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIFF1ZXJ5U3VnZ2VzdGlvbnMgQmxvY2tMaXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvQVBJX0NyZWF0ZVF1ZXJ5U3VnZ2VzdGlvbnNCbG9ja0xpc3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUXVlcnlTdWdnZXN0aW9uc0Jsb2NrTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUXVlcnlTdWdnZXN0aW9uc0Jsb2NrTGlzdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIFRoZXNhdXJ1c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9DcmVhdGVUaGVzYXVydXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVGhlc2F1cnVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVUaGVzYXVydXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gYWNjZXNzIGNvbnRyb2wgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9EZWxldGVBY2Nlc3NDb250cm9sQ29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVBY2Nlc3NDb250cm9sQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlQWNjZXNzQ29udHJvbENvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBkYXRhIHNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9EZWxldGVEYXRhU291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZURhdGFTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZURhdGFTb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIHlvdXIgQW1hem9uIEtlbmRyYSBleHBlcmllbmNlIHN1Y2ggYXMgYSBzZWFyY2ggYXBwbGljYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfRGVsZXRlRXhwZXJpZW5jZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVFeHBlcmllbmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVFeHBlcmllbmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIEZhcVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9EZWxldGVGYXEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlRmFxKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVGYXEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gSW5kZXhcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfRGVsZXRlSW5kZXguaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlSW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUluZGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHByaW5jaXBhbCBtYXBwaW5nIGZyb20gaW5kZXhcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfRGVsZXRlUHJpbmNpcGFsTWFwcGluZy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVQcmluY2lwYWxNYXBwaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVQcmluY2lwYWxNYXBwaW5nJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgUXVlcnlTdWdnZXN0aW9ucyBCbG9ja0xpc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfRGVsZXRlUXVlcnlTdWdnZXN0aW9uc0Jsb2NrTGlzdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVRdWVyeVN1Z2dlc3Rpb25zQmxvY2tMaXN0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVRdWVyeVN1Z2dlc3Rpb25zQmxvY2tMaXN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgVGhlc2F1cnVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvQVBJX0RlbGV0ZVRoZXNhdXJ1cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUaGVzYXVydXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRoZXNhdXJ1cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGFuIGFjY2VzcyBjb250cm9sIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9EZXNjcmliZUFjY2Vzc0NvbnRyb2xDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQWNjZXNzQ29udHJvbENvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQWNjZXNzQ29udHJvbENvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBhIGRhdGEgc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfRGVzY3JpYmVEYXRhU291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlRGF0YVNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVEYXRhU291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB5b3VyIEFtYXpvbiBLZW5kcmEgZXhwZXJpZW5jZSBzdWNoIGFzIGEgc2VhcmNoIGFwcGxpY2F0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfRGVzY3JpYmVFeHBlcmllbmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlRXhwZXJpZW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVFeHBlcmllbmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYW4gRmFxXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfRGVzY3JpYmVGYXEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVGYXEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlRmFxJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYSBmZWF0dXJlZCByZXN1bHRzIHNldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvQVBJX0Rlc2NyaWJlVGhlc2F1cnVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlRmVhdHVyZWRSZXN1bHRzU2V0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUZlYXR1cmVkUmVzdWx0c1NldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGFuIEluZGV4XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfRGVzY3JpYmVJbmRleC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUluZGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgcHJpbmNpcGFsIG1hcHBpbmcgZnJvbSBpbmRleFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvQVBJX0Rlc2NyaWJlUHJpbmNpcGFsTWFwcGluZy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVByaW5jaXBhbE1hcHBpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlUHJpbmNpcGFsTWFwcGluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGEgUXVlcnlTdWdnZXN0aW9ucyBCbG9ja0xpc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9EZXNjcmliZVF1ZXJ5U3VnZ2VzdGlvbnNCbG9ja0xpc3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVRdWVyeVN1Z2dlc3Rpb25zQmxvY2tMaXN0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVF1ZXJ5U3VnZ2VzdGlvbnNCbG9ja0xpc3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgcXVlcnkgc3VnZ2VzdGlvbnMgY29uZmlndXJhdGlvbiBmb3IgYW4gaW5kZXhcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9EZXNjcmliZVF1ZXJ5U3VnZ2VzdGlvbnNDb25maWcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVRdWVyeVN1Z2dlc3Rpb25zQ29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVF1ZXJ5U3VnZ2VzdGlvbnNDb25maWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBhIFRoZXNhdXJ1c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvQVBJX0Rlc2NyaWJlVGhlc2F1cnVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVGhlc2F1cnVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVRoZXNhdXJ1cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXZlbnRzIHVzZXJzIG9yIGdyb3VwcyBpbiB5b3VyIEFXUyBTU08gaWRlbnRpdHkgc291cmNlIGZyb20gYWNjZXNzaW5nIHlvdXIgQW1hem9uIEtlbmRyYSBleHBlcmllbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvQVBJX0Rpc2Fzc29jaWF0ZUVudGl0aWVzRnJvbUV4cGVyaWVuY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlRW50aXRpZXNGcm9tRXhwZXJpZW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYXNzb2NpYXRlRW50aXRpZXNGcm9tRXhwZXJpZW5jZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHNwZWNpZmljIHBlcm1pc3Npb25zIG9mIHVzZXJzIG9yIGdyb3VwcyBpbiB5b3VyIEFXUyBTU08gaWRlbnRpdHkgc291cmNlIHdpdGggYWNjZXNzIHRvIHlvdXIgQW1hem9uIEtlbmRyYSBleHBlcmllbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvQVBJX0Rpc2Fzc29jaWF0ZVBlcnNvbmFzRnJvbUVudGl0aWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZVBlcnNvbmFzRnJvbUVudGl0aWVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhc3NvY2lhdGVQZXJzb25hc0Zyb21FbnRpdGllcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBzdWdnZXN0aW9ucyBmb3IgYSBxdWVyeSBwcmVmaXhcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9HZXRRdWVyeVN1Z2dlc3Rpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFF1ZXJ5U3VnZ2VzdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFF1ZXJ5U3VnZ2VzdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgc2VhcmNoIG1ldHJpY3MgZGF0YVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvQVBJX0dldFNuYXBzaG90cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRTbmFwc2hvdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFNuYXBzaG90cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGhlIGFjY2VzcyBjb250cm9sIGNvbmZpZ3VyYXRpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfTGlzdEFjY2Vzc0NvbnRyb2xDb25maWd1cmF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QWNjZXNzQ29udHJvbENvbmZpZ3VyYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QWNjZXNzQ29udHJvbENvbmZpZ3VyYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IERhdGEgU291cmNlIHN5bmMgam9iIGhpc3RvcnlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9MaXN0RGF0YVNvdXJjZVN5bmNKb2JzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3REYXRhU291cmNlU3luY0pvYnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3REYXRhU291cmNlU3luY0pvYnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRoZSBkYXRhIHNvdXJjZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9MaXN0RGF0YVNvdXJjZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdERhdGFTb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RGF0YVNvdXJjZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyBzcGVjaWZpYyBwZXJtaXNzaW9ucyBvZiB1c2VycyBhbmQgZ3JvdXBzIHdpdGggYWNjZXNzIHRvIHlvdXIgQW1hem9uIEtlbmRyYSBleHBlcmllbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfTGlzdEVudGl0eVBlcnNvbmFzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RFbnRpdHlQZXJzb25hcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEVudGl0eVBlcnNvbmFzJyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgdXNlcnMgb3IgZ3JvdXBzIGluIHlvdXIgQVdTIFNTTyBpZGVudGl0eSBzb3VyY2UgdGhhdCBhcmUgZ3JhbnRlZCBhY2Nlc3MgdG8geW91ciBBbWF6b24gS2VuZHJhIGV4cGVyaWVuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9MaXN0RXhwZXJpZW5jZUVudGl0aWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RFeHBlcmllbmNlRW50aXRpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RFeHBlcmllbmNlRW50aXRpZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyBvbmUgb3IgbW9yZSBBbWF6b24gS2VuZHJhIGV4cGVyaWVuY2VzLiBZb3UgY2FuIGNyZWF0ZSBhbiBBbWF6b24gS2VuZHJhIGV4cGVyaWVuY2Ugc3VjaCBhcyBhIHNlYXJjaCBhcHBsaWNhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvQVBJX0xpc3RFeHBlcmllbmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RXhwZXJpZW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RFeHBlcmllbmNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGhlIEZhcXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9MaXN0RmFxcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RmFxcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEZhcXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRoZSBmZWF0dXJlZCByZXN1bHRzIHNldHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9MaXN0RmVhdHVyZWRSZXN1bHRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RGZWF0dXJlZFJlc3VsdHNTZXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RmVhdHVyZWRSZXN1bHRzU2V0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgZ3JvdXBzIHRoYXQgYXJlIG9sZGVyIHRoYW4gYW4gb3JkZXJpbmcgaWRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9MaXN0R3JvdXBzT2xkZXJUaGFuT3JkZXJpbmdJZC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0R3JvdXBzT2xkZXJUaGFuT3JkZXJpbmdJZCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEdyb3Vwc09sZGVyVGhhbk9yZGVyaW5nSWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRoZSBpbmRleGVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfTGlzdEluZGljZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEluZGljZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RJbmRpY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0aGUgUXVlcnlTdWdnZXN0aW9ucyBCbG9ja0xpc3RzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfTGlzdFF1ZXJ5U3VnZ2VzdGlvbnNCbG9ja0xpc3RzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RRdWVyeVN1Z2dlc3Rpb25zQmxvY2tMaXN0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFF1ZXJ5U3VnZ2VzdGlvbnNCbG9ja0xpc3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0YWdzIGZvciBhIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfTGlzdFRhZ3NGb3JSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGFnc0ZvclJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGFnc0ZvclJlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0aGUgVGhlc2F1cmlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9MaXN0VGhlc2F1cmkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRoZXNhdXJpKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGhlc2F1cmknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwdXQgcHJpbmNpcGFsIG1hcHBpbmcgaW4gaW5kZXhcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfUHV0UHJpbmNpcGFsTWFwcGluZy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXRQcmluY2lwYWxNYXBwaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRQcmluY2lwYWxNYXBwaW5nJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcXVlcnkgZG9jdW1lbnRzIGFuZCBmYXFzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfUXVlcnkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1F1ZXJ5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgcmVsZXZhbnQgY29udGVudCBmcm9tIGFuIGluZGV4XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfUmV0cmlldmUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmV0cmlldmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JldHJpZXZlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgRGF0YSBTb3VyY2Ugc3luYyBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfU3RhcnREYXRhU291cmNlU3luY0pvYi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydERhdGFTb3VyY2VTeW5jSm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydERhdGFTb3VyY2VTeW5jSm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RvcCBEYXRhIFNvdXJjZSBzeW5jIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9TdG9wRGF0YVNvdXJjZVN5bmNKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RvcERhdGFTb3VyY2VTeW5jSm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdG9wRGF0YVNvdXJjZVN5bmNKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZW5kIGZlZWRiYWNrIGFib3V0IGEgcXVlcnkgcmVzdWx0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9TdWJtaXRGZWVkYmFjay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdWJtaXRGZWVkYmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3VibWl0RmVlZGJhY2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB0YWcgYSByZXNvdXJjZSB3aXRoIGdpdmVuIGtleSB2YWx1ZSBwYWlyc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmcsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9UYWdSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9UYWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZW1vdmUgdGhlIHRhZyB3aXRoIHRoZSBnaXZlbiBrZXkgZnJvbSBhIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvQVBJX1VudGFnUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVW50YWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVW50YWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhbiBhY2Nlc3MgY29udHJvbCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvQVBJX1VwZGF0ZUFjY2Vzc0NvbnRyb2xDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUFjY2Vzc0NvbnRyb2xDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVBY2Nlc3NDb250cm9sQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIGRhdGEgc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvQVBJX1VwZGF0ZURhdGFTb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlRGF0YVNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlRGF0YVNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgeW91ciBBbWF6b24gS2VuZHJhIGV4cGVyaWVuY2Ugc3VjaCBhcyBhIHNlYXJjaCBhcHBsaWNhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9VcGRhdGVFeHBlcmllbmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUV4cGVyaWVuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUV4cGVyaWVuY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBmZWF0dXJlZCByZXN1bHRzIHNldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9VcGRhdGVGZWF0dXJlZFJlc3VsdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlRmVhdHVyZWRSZXN1bHRzU2V0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVGZWF0dXJlZFJlc3VsdHNTZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYW4gSW5kZXhcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfVXBkYXRlSW5kZXguaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlSW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUluZGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgUXVlcnlTdWdnZXN0aW9ucyBCbG9ja0xpc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfVXBkYXRlUXVlcnlTdWdnZXN0aW9uc0Jsb2NrTGlzdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVRdWVyeVN1Z2dlc3Rpb25zQmxvY2tMaXN0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVRdWVyeVN1Z2dlc3Rpb25zQmxvY2tMaXN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHRoZSBxdWVyeSBzdWdnZXN0aW9ucyBjb25maWd1cmF0aW9uIGZvciBhbiBpbmRleFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9VcGRhdGVRdWVyeVN1Z2dlc3Rpb25zQ29uZmlnLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVF1ZXJ5U3VnZ2VzdGlvbnNDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVF1ZXJ5U3VnZ2VzdGlvbnNDb25maWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSB0aGVzYXVydXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9BUElfVXBkYXRlVGhlc2F1cnVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVRoZXNhdXJ1cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlVGhlc2F1cnVzJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWNjZXNzTGV2ZWxMaXN0OiBBY2Nlc3NMZXZlbExpc3QgPSB7XG4gICAgV3JpdGU6IFtcbiAgICAgICdBc3NvY2lhdGVFbnRpdGllc1RvRXhwZXJpZW5jZScsXG4gICAgICAnQXNzb2NpYXRlUGVyc29uYXNUb0VudGl0aWVzJyxcbiAgICAgICdCYXRjaERlbGV0ZURvY3VtZW50JyxcbiAgICAgICdCYXRjaERlbGV0ZUZlYXR1cmVkUmVzdWx0c1NldCcsXG4gICAgICAnQmF0Y2hQdXREb2N1bWVudCcsXG4gICAgICAnQ2xlYXJRdWVyeVN1Z2dlc3Rpb25zJyxcbiAgICAgICdDcmVhdGVBY2Nlc3NDb250cm9sQ29uZmlndXJhdGlvbicsXG4gICAgICAnQ3JlYXRlRGF0YVNvdXJjZScsXG4gICAgICAnQ3JlYXRlRXhwZXJpZW5jZScsXG4gICAgICAnQ3JlYXRlRmFxJyxcbiAgICAgICdDcmVhdGVGZWF0dXJlZFJlc3VsdHNTZXQnLFxuICAgICAgJ0NyZWF0ZUluZGV4JyxcbiAgICAgICdDcmVhdGVRdWVyeVN1Z2dlc3Rpb25zQmxvY2tMaXN0JyxcbiAgICAgICdDcmVhdGVUaGVzYXVydXMnLFxuICAgICAgJ0RlbGV0ZUFjY2Vzc0NvbnRyb2xDb25maWd1cmF0aW9uJyxcbiAgICAgICdEZWxldGVEYXRhU291cmNlJyxcbiAgICAgICdEZWxldGVFeHBlcmllbmNlJyxcbiAgICAgICdEZWxldGVGYXEnLFxuICAgICAgJ0RlbGV0ZUluZGV4JyxcbiAgICAgICdEZWxldGVQcmluY2lwYWxNYXBwaW5nJyxcbiAgICAgICdEZWxldGVRdWVyeVN1Z2dlc3Rpb25zQmxvY2tMaXN0JyxcbiAgICAgICdEZWxldGVUaGVzYXVydXMnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZUVudGl0aWVzRnJvbUV4cGVyaWVuY2UnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZVBlcnNvbmFzRnJvbUVudGl0aWVzJyxcbiAgICAgICdQdXRQcmluY2lwYWxNYXBwaW5nJyxcbiAgICAgICdTdGFydERhdGFTb3VyY2VTeW5jSm9iJyxcbiAgICAgICdTdG9wRGF0YVNvdXJjZVN5bmNKb2InLFxuICAgICAgJ1N1Ym1pdEZlZWRiYWNrJyxcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZScsXG4gICAgICAnVXBkYXRlQWNjZXNzQ29udHJvbENvbmZpZ3VyYXRpb24nLFxuICAgICAgJ1VwZGF0ZURhdGFTb3VyY2UnLFxuICAgICAgJ1VwZGF0ZUV4cGVyaWVuY2UnLFxuICAgICAgJ1VwZGF0ZUZlYXR1cmVkUmVzdWx0c1NldCcsXG4gICAgICAnVXBkYXRlSW5kZXgnLFxuICAgICAgJ1VwZGF0ZVF1ZXJ5U3VnZ2VzdGlvbnNCbG9ja0xpc3QnLFxuICAgICAgJ1VwZGF0ZVF1ZXJ5U3VnZ2VzdGlvbnNDb25maWcnLFxuICAgICAgJ1VwZGF0ZVRoZXNhdXJ1cydcbiAgICBdLFxuICAgIFJlYWQ6IFtcbiAgICAgICdCYXRjaEdldERvY3VtZW50U3RhdHVzJyxcbiAgICAgICdEZXNjcmliZUFjY2Vzc0NvbnRyb2xDb25maWd1cmF0aW9uJyxcbiAgICAgICdEZXNjcmliZURhdGFTb3VyY2UnLFxuICAgICAgJ0Rlc2NyaWJlRXhwZXJpZW5jZScsXG4gICAgICAnRGVzY3JpYmVGYXEnLFxuICAgICAgJ0Rlc2NyaWJlRmVhdHVyZWRSZXN1bHRzU2V0JyxcbiAgICAgICdEZXNjcmliZUluZGV4JyxcbiAgICAgICdEZXNjcmliZVByaW5jaXBhbE1hcHBpbmcnLFxuICAgICAgJ0Rlc2NyaWJlUXVlcnlTdWdnZXN0aW9uc0Jsb2NrTGlzdCcsXG4gICAgICAnRGVzY3JpYmVRdWVyeVN1Z2dlc3Rpb25zQ29uZmlnJyxcbiAgICAgICdEZXNjcmliZVRoZXNhdXJ1cycsXG4gICAgICAnR2V0UXVlcnlTdWdnZXN0aW9ucycsXG4gICAgICAnR2V0U25hcHNob3RzJyxcbiAgICAgICdMaXN0VGFnc0ZvclJlc291cmNlJyxcbiAgICAgICdRdWVyeScsXG4gICAgICAnUmV0cmlldmUnXG4gICAgXSxcbiAgICBMaXN0OiBbXG4gICAgICAnTGlzdEFjY2Vzc0NvbnRyb2xDb25maWd1cmF0aW9ucycsXG4gICAgICAnTGlzdERhdGFTb3VyY2VTeW5jSm9icycsXG4gICAgICAnTGlzdERhdGFTb3VyY2VzJyxcbiAgICAgICdMaXN0RW50aXR5UGVyc29uYXMnLFxuICAgICAgJ0xpc3RFeHBlcmllbmNlRW50aXRpZXMnLFxuICAgICAgJ0xpc3RFeHBlcmllbmNlcycsXG4gICAgICAnTGlzdEZhcXMnLFxuICAgICAgJ0xpc3RGZWF0dXJlZFJlc3VsdHNTZXRzJyxcbiAgICAgICdMaXN0R3JvdXBzT2xkZXJUaGFuT3JkZXJpbmdJZCcsXG4gICAgICAnTGlzdEluZGljZXMnLFxuICAgICAgJ0xpc3RRdWVyeVN1Z2dlc3Rpb25zQmxvY2tMaXN0cycsXG4gICAgICAnTGlzdFRoZXNhdXJpJ1xuICAgIF0sXG4gICAgVGFnZ2luZzogW1xuICAgICAgJ1RhZ1Jlc291cmNlJyxcbiAgICAgICdVbnRhZ1Jlc291cmNlJ1xuICAgIF1cbiAgfTtcblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgYWNjZXNzLWNvbnRyb2wtY29uZmlndXJhdGlvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL0FQSV9DcmVhdGVBY2Nlc3NDb250cm9sQ29uZmlndXJhdGlvbi5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBpbmRleElkIC0gSWRlbnRpZmllciBmb3IgdGhlIGluZGV4SWQuXG4gICAqIEBwYXJhbSBhY2Nlc3NDb250cm9sQ29uZmlndXJhdGlvbklkIC0gSWRlbnRpZmllciBmb3IgdGhlIGFjY2Vzc0NvbnRyb2xDb25maWd1cmF0aW9uSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uQWNjZXNzQ29udHJvbENvbmZpZ3VyYXRpb24oaW5kZXhJZDogc3RyaW5nLCBhY2Nlc3NDb250cm9sQ29uZmlndXJhdGlvbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06a2VuZHJhOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTppbmRleC8keyBpbmRleElkIH0vYWNjZXNzLWNvbnRyb2wtY29uZmlndXJhdGlvbi8keyBhY2Nlc3NDb250cm9sQ29uZmlndXJhdGlvbklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBkYXRhLXNvdXJjZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL2RhdGEtc291cmNlLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGluZGV4SWQgLSBJZGVudGlmaWVyIGZvciB0aGUgaW5kZXhJZC5cbiAgICogQHBhcmFtIGRhdGFTb3VyY2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBkYXRhU291cmNlSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkRhdGFTb3VyY2UoaW5kZXhJZDogc3RyaW5nLCBkYXRhU291cmNlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTprZW5kcmE6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmluZGV4LyR7IGluZGV4SWQgfS9kYXRhLXNvdXJjZS8keyBkYXRhU291cmNlSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGV4cGVyaWVuY2UgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9kZXBsb3lpbmctc2VhcmNoLWV4cGVyaWVuY2Utbm8tY29kZS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBpbmRleElkIC0gSWRlbnRpZmllciBmb3IgdGhlIGluZGV4SWQuXG4gICAqIEBwYXJhbSBleHBlcmllbmNlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgZXhwZXJpZW5jZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICovXG4gIHB1YmxpYyBvbkV4cGVyaWVuY2UoaW5kZXhJZDogc3RyaW5nLCBleHBlcmllbmNlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTprZW5kcmE6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmluZGV4LyR7IGluZGV4SWQgfS9leHBlcmllbmNlLyR7IGV4cGVyaWVuY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgZmFxIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2tlbmRyYS9sYXRlc3QvZGcvZmFxLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGluZGV4SWQgLSBJZGVudGlmaWVyIGZvciB0aGUgaW5kZXhJZC5cbiAgICogQHBhcmFtIGZhcUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGZhcUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25GYXEoaW5kZXhJZDogc3RyaW5nLCBmYXFJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmtlbmRyYTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06aW5kZXgvJHsgaW5kZXhJZCB9L2ZhcS8keyBmYXFJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgZmVhdHVyZWQtcmVzdWx0cy1zZXQgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy9mZWF0dXJlZC1yZXN1bHRzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGluZGV4SWQgLSBJZGVudGlmaWVyIGZvciB0aGUgaW5kZXhJZC5cbiAgICogQHBhcmFtIGZlYXR1cmVkUmVzdWx0c1NldElkIC0gSWRlbnRpZmllciBmb3IgdGhlIGZlYXR1cmVkUmVzdWx0c1NldElkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25GZWF0dXJlZFJlc3VsdHNTZXQoaW5kZXhJZDogc3RyaW5nLCBmZWF0dXJlZFJlc3VsdHNTZXRJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmtlbmRyYTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06aW5kZXgvJHsgaW5kZXhJZCB9L2ZlYXR1cmVkLXJlc3VsdHMtc2V0LyR7IGZlYXR1cmVkUmVzdWx0c1NldElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBpbmRleCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL2luZGV4Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGluZGV4SWQgLSBJZGVudGlmaWVyIGZvciB0aGUgaW5kZXhJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uSW5kZXgoaW5kZXhJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmtlbmRyYTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06aW5kZXgvJHsgaW5kZXhJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgcXVlcnktc3VnZ2VzdGlvbnMtYmxvY2stbGlzdCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rZW5kcmEvbGF0ZXN0L2RnL3F1ZXJ5LXN1Z2dlc3Rpb25zLWJsb2NrLWxpc3QuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gaW5kZXhJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBpbmRleElkLlxuICAgKiBAcGFyYW0gcXVlcnlTdWdnZXN0aW9uc0Jsb2NrTGlzdElkIC0gSWRlbnRpZmllciBmb3IgdGhlIHF1ZXJ5U3VnZ2VzdGlvbnNCbG9ja0xpc3RJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uUXVlcnlTdWdnZXN0aW9uc0Jsb2NrTGlzdChpbmRleElkOiBzdHJpbmcsIHF1ZXJ5U3VnZ2VzdGlvbnNCbG9ja0xpc3RJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmtlbmRyYTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06aW5kZXgvJHsgaW5kZXhJZCB9L3F1ZXJ5LXN1Z2dlc3Rpb25zLWJsb2NrLWxpc3QvJHsgcXVlcnlTdWdnZXN0aW9uc0Jsb2NrTGlzdElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB0aGVzYXVydXMgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20va2VuZHJhL2xhdGVzdC9kZy90aGVzYXVydXMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gaW5kZXhJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBpbmRleElkLlxuICAgKiBAcGFyYW0gdGhlc2F1cnVzSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgdGhlc2F1cnVzSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblRoZXNhdXJ1cyhpbmRleElkOiBzdHJpbmcsIHRoZXNhdXJ1c0lkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06a2VuZHJhOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTppbmRleC8keyBpbmRleElkIH0vdGhlc2F1cnVzLyR7IHRoZXNhdXJ1c0lkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgdGFncyB0aGF0IGFyZSBwYXNzZWQgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlcXVlc3R0YWdcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZURhdGFTb3VyY2UoKVxuICAgKiAtIC50b0NyZWF0ZUZhcSgpXG4gICAqIC0gLnRvQ3JlYXRlRmVhdHVyZWRSZXN1bHRzU2V0KClcbiAgICogLSAudG9DcmVhdGVJbmRleCgpXG4gICAqIC0gLnRvQ3JlYXRlUXVlcnlTdWdnZXN0aW9uc0Jsb2NrTGlzdCgpXG4gICAqIC0gLnRvQ3JlYXRlVGhlc2F1cnVzKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqXG4gICAqIEBwYXJhbSB0YWdLZXkgVGhlIHRhZyBrZXkgdG8gY2hlY2tcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBd3NSZXF1ZXN0VGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlJlcXVlc3RUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgdGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy1yZXNvdXJjZXRhZ1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlRW50aXRpZXNUb0V4cGVyaWVuY2UoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVBlcnNvbmFzVG9FbnRpdGllcygpXG4gICAqIC0gLnRvQmF0Y2hEZWxldGVEb2N1bWVudCgpXG4gICAqIC0gLnRvQmF0Y2hEZWxldGVGZWF0dXJlZFJlc3VsdHNTZXQoKVxuICAgKiAtIC50b0JhdGNoR2V0RG9jdW1lbnRTdGF0dXMoKVxuICAgKiAtIC50b0JhdGNoUHV0RG9jdW1lbnQoKVxuICAgKiAtIC50b0NsZWFyUXVlcnlTdWdnZXN0aW9ucygpXG4gICAqIC0gLnRvQ3JlYXRlQWNjZXNzQ29udHJvbENvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZURhdGFTb3VyY2UoKVxuICAgKiAtIC50b0NyZWF0ZUV4cGVyaWVuY2UoKVxuICAgKiAtIC50b0NyZWF0ZUZhcSgpXG4gICAqIC0gLnRvQ3JlYXRlRmVhdHVyZWRSZXN1bHRzU2V0KClcbiAgICogLSAudG9DcmVhdGVRdWVyeVN1Z2dlc3Rpb25zQmxvY2tMaXN0KClcbiAgICogLSAudG9DcmVhdGVUaGVzYXVydXMoKVxuICAgKiAtIC50b0RlbGV0ZUFjY2Vzc0NvbnRyb2xDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9EZWxldGVEYXRhU291cmNlKClcbiAgICogLSAudG9EZWxldGVFeHBlcmllbmNlKClcbiAgICogLSAudG9EZWxldGVGYXEoKVxuICAgKiAtIC50b0RlbGV0ZUluZGV4KClcbiAgICogLSAudG9EZWxldGVQcmluY2lwYWxNYXBwaW5nKClcbiAgICogLSAudG9EZWxldGVRdWVyeVN1Z2dlc3Rpb25zQmxvY2tMaXN0KClcbiAgICogLSAudG9EZWxldGVUaGVzYXVydXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQWNjZXNzQ29udHJvbENvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0Rlc2NyaWJlRGF0YVNvdXJjZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVFeHBlcmllbmNlKClcbiAgICogLSAudG9EZXNjcmliZUZhcSgpXG4gICAqIC0gLnRvRGVzY3JpYmVGZWF0dXJlZFJlc3VsdHNTZXQoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW5kZXgoKVxuICAgKiAtIC50b0Rlc2NyaWJlUHJpbmNpcGFsTWFwcGluZygpXG4gICAqIC0gLnRvRGVzY3JpYmVRdWVyeVN1Z2dlc3Rpb25zQmxvY2tMaXN0KClcbiAgICogLSAudG9EZXNjcmliZVF1ZXJ5U3VnZ2VzdGlvbnNDb25maWcoKVxuICAgKiAtIC50b0Rlc2NyaWJlVGhlc2F1cnVzKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVFbnRpdGllc0Zyb21FeHBlcmllbmNlKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVQZXJzb25hc0Zyb21FbnRpdGllcygpXG4gICAqIC0gLnRvR2V0UXVlcnlTdWdnZXN0aW9ucygpXG4gICAqIC0gLnRvR2V0U25hcHNob3RzKClcbiAgICogLSAudG9MaXN0QWNjZXNzQ29udHJvbENvbmZpZ3VyYXRpb25zKClcbiAgICogLSAudG9MaXN0RGF0YVNvdXJjZVN5bmNKb2JzKClcbiAgICogLSAudG9MaXN0RGF0YVNvdXJjZXMoKVxuICAgKiAtIC50b0xpc3RFbnRpdHlQZXJzb25hcygpXG4gICAqIC0gLnRvTGlzdEV4cGVyaWVuY2VFbnRpdGllcygpXG4gICAqIC0gLnRvTGlzdEV4cGVyaWVuY2VzKClcbiAgICogLSAudG9MaXN0RmFxcygpXG4gICAqIC0gLnRvTGlzdEZlYXR1cmVkUmVzdWx0c1NldHMoKVxuICAgKiAtIC50b0xpc3RHcm91cHNPbGRlclRoYW5PcmRlcmluZ0lkKClcbiAgICogLSAudG9MaXN0UXVlcnlTdWdnZXN0aW9uc0Jsb2NrTGlzdHMoKVxuICAgKiAtIC50b0xpc3RUYWdzRm9yUmVzb3VyY2UoKVxuICAgKiAtIC50b0xpc3RUaGVzYXVyaSgpXG4gICAqIC0gLnRvUHV0UHJpbmNpcGFsTWFwcGluZygpXG4gICAqIC0gLnRvUXVlcnkoKVxuICAgKiAtIC50b1JldHJpZXZlKClcbiAgICogLSAudG9TdGFydERhdGFTb3VyY2VTeW5jSm9iKClcbiAgICogLSAudG9TdG9wRGF0YVNvdXJjZVN5bmNKb2IoKVxuICAgKiAtIC50b1N1Ym1pdEZlZWRiYWNrKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlQWNjZXNzQ29udHJvbENvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZURhdGFTb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZUV4cGVyaWVuY2UoKVxuICAgKiAtIC50b1VwZGF0ZUZlYXR1cmVkUmVzdWx0c1NldCgpXG4gICAqIC0gLnRvVXBkYXRlSW5kZXgoKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXJ5U3VnZ2VzdGlvbnNCbG9ja0xpc3QoKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXJ5U3VnZ2VzdGlvbnNDb25maWcoKVxuICAgKiAtIC50b1VwZGF0ZVRoZXNhdXJ1cygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gZGF0YS1zb3VyY2VcbiAgICogLSBmYXFcbiAgICogLSBmZWF0dXJlZC1yZXN1bHRzLXNldFxuICAgKiAtIGluZGV4XG4gICAqIC0gcXVlcnktc3VnZ2VzdGlvbnMtYmxvY2stbGlzdFxuICAgKiAtIHRoZXNhdXJ1c1xuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVzb3VyY2VUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVzb3VyY2VUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgdGFnIGtleXMgdGhhdCBhcmUgcGFzc2VkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy10YWdrZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVEYXRhU291cmNlKClcbiAgICogLSAudG9DcmVhdGVGYXEoKVxuICAgKiAtIC50b0NyZWF0ZUZlYXR1cmVkUmVzdWx0c1NldCgpXG4gICAqIC0gLnRvQ3JlYXRlSW5kZXgoKVxuICAgKiAtIC50b0NyZWF0ZVF1ZXJ5U3VnZ2VzdGlvbnNCbG9ja0xpc3QoKVxuICAgKiAtIC50b0NyZWF0ZVRoZXNhdXJ1cygpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1RhZ0tleXModmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpUYWdLZXlzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtrZW5kcmFdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2tlbmRyYS5odG1sKS5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BzPzogaWFtLlBvbGljeVN0YXRlbWVudFByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG59XG4iXX0=