cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
1,528 lines • 136 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Securityagent = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [securityagent](https://docs.aws.amazon.com/service-authorization/latest/reference/list_securityagent.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class Securityagent extends shared_1.PolicyStatement {
/**
* Grants permission to add an Artifact for the given Agent Space
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_AddArtifact.html
*/
toAddArtifact() {
return this.to('AddArtifact');
}
/**
* Grants permission to batch create security requirements in a customer managed pack
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_BatchCreateSecurityRequirements.html
*/
toBatchCreateSecurityRequirements() {
return this.to('BatchCreateSecurityRequirements');
}
/**
* Grants permission to delete multiple code reviews in a single request
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_BatchDeleteCodeReviews.html
*/
toBatchDeleteCodeReviews() {
return this.to('BatchDeleteCodeReviews');
}
/**
* Grants permission to delete multiple penetration tests in a single request
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_BatchDeletePentests.html
*/
toBatchDeletePentests() {
return this.to('BatchDeletePentests');
}
/**
* Grants permission to batch delete security requirements from a customer managed pack
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_BatchDeleteSecurityRequirements.html
*/
toBatchDeleteSecurityRequirements() {
return this.to('BatchDeleteSecurityRequirements');
}
/**
* Grants permission to delete multiple threat models in a single request
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_BatchDeleteThreatModels.html
*/
toBatchDeleteThreatModels() {
return this.to('BatchDeleteThreatModels');
}
/**
* Grants permission to delete multiple threats
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_BatchDeleteThreats.html
*/
toBatchDeleteThreats() {
return this.to('BatchDeleteThreats');
}
/**
* Grants permission to retrieve multiple agent spaces in a single request
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetAgentSpaces.html
*/
toBatchGetAgentSpaces() {
return this.to('BatchGetAgentSpaces');
}
/**
* Grants permission to retrieve one or more Artifact Metadata records for the given Agent Space
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetArtifactMetadata.html
*/
toBatchGetArtifactMetadata() {
return this.to('BatchGetArtifactMetadata');
}
/**
* Grants permission to retrieve multiple code review job tasks in a single request
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetCodeReviewJobTasks.html
*/
toBatchGetCodeReviewJobTasks() {
return this.to('BatchGetCodeReviewJobTasks');
}
/**
* Grants permission to retrieve multiple code review jobs in a single request
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetCodeReviewJobs.html
*/
toBatchGetCodeReviewJobs() {
return this.to('BatchGetCodeReviewJobs');
}
/**
* Grants permission to retrieve multiple code reviews in a single request
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetCodeReviews.html
*/
toBatchGetCodeReviews() {
return this.to('BatchGetCodeReviews');
}
/**
* Grants permission to retrieve multiple security testing findings in a single request
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetFindings.html
*/
toBatchGetFindings() {
return this.to('BatchGetFindings');
}
/**
* Grants permission to retrieve multiple pentest job contents metadata in a single request
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetPentestJobContentMetadata.html
*/
toBatchGetPentestJobContentMetadata() {
return this.to('BatchGetPentestJobContentMetadata');
}
/**
* Grants permission to retrieve multiple pentest job tasks in a single request
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetPentestJobTasks.html
*/
toBatchGetPentestJobTasks() {
return this.to('BatchGetPentestJobTasks');
}
/**
* Grants permission to retrieve multiple security testing jobs in a single request
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetPentestJobs.html
*/
toBatchGetPentestJobs() {
return this.to('BatchGetPentestJobs');
}
/**
* Grants permission to retrieve multiple penetration tests in a single request
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetPentests.html
*/
toBatchGetPentests() {
return this.to('BatchGetPentests');
}
/**
* Grants permission to retrieve multiple security requirements in a single request
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetSecurityRequirements.html
*/
toBatchGetSecurityRequirements() {
return this.to('BatchGetSecurityRequirements');
}
/**
* Grants permission to retrieve multiple target domains in a single request
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetTargetDomains.html
*/
toBatchGetTargetDomains() {
return this.to('BatchGetTargetDomains');
}
/**
* Grants permission to retrieve multiple tasks for a threat model job in a single request
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetThreatModelJobTasks.html
*/
toBatchGetThreatModelJobTasks() {
return this.to('BatchGetThreatModelJobTasks');
}
/**
* Grants permission to retrieve details for one or more threat model jobs
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetThreatModelJobs.html
*/
toBatchGetThreatModelJobs() {
return this.to('BatchGetThreatModelJobs');
}
/**
* Grants permission to retrieve multiple threat models in a single request
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetThreatModels.html
*/
toBatchGetThreatModels() {
return this.to('BatchGetThreatModels');
}
/**
* Grants permission to retrieve details for one or more threats
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_BatchGetThreats.html
*/
toBatchGetThreats() {
return this.to('BatchGetThreats');
}
/**
* Grants permission to batch update security requirements within a customer managed pack
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_BatchUpdateSecurityRequirements.html
*/
toBatchUpdateSecurityRequirements() {
return this.to('BatchUpdateSecurityRequirements');
}
/**
* Grants permission to create an agent space record
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/securityagent/API_CreateAgentSpace.html
*/
toCreateAgentSpace() {
return this.to('CreateAgentSpace');
}
/**
* Grants permission to create a new application
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/securityagent/API_CreateApplication.html
*/
toCreateApplication() {
return this.to('CreateApplication');
}
/**
* Grants permission to create a new code review configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_CreateCodeReview.html
*/
toCreateCodeReview() {
return this.to('CreateCodeReview');
}
/**
* Grants permission to create a design review
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_CreateDesignReview.html
*/
toCreateDesignReview() {
return this.to('CreateDesignReview');
}
/**
* Grants permission to create a security testing integration
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/securityagent/API_CreateIntegration.html
*/
toCreateIntegration() {
return this.to('CreateIntegration');
}
/**
* Grants permission to add a single member to a agent space with specified role
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_CreateMembership.html
*/
toCreateMembership() {
return this.to('CreateMembership');
}
/**
* Grants permission to create a one time login session
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_CreateOneTimeLoginSession.html
*/
toCreateOneTimeLoginSession() {
return this.to('CreateOneTimeLoginSession');
}
/**
* Grants permission to create a new penetration test configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_CreatePentest.html
*/
toCreatePentest() {
return this.to('CreatePentest');
}
/**
* Grants permission to create a private connection for VPC Lattice integration
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/securityagent/API_CreatePrivateConnection.html
*/
toCreatePrivateConnection() {
return this.to('CreatePrivateConnection');
}
/**
* Grants permission to add a customer managed Security Requirement
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_CreateSecurityRequirement.html
*/
toCreateSecurityRequirement() {
return this.to('CreateSecurityRequirement');
}
/**
* Grants permission to create a customer managed security requirement pack
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/securityagent/API_CreateSecurityRequirementPack.html
*/
toCreateSecurityRequirementPack() {
return this.to('CreateSecurityRequirementPack');
}
/**
* Grants permission to create a target domain record
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_CreateTargetDomain.html
*/
toCreateTargetDomain() {
return this.to('CreateTargetDomain');
}
/**
* Grants permission to create a threat in a threat model
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_CreateThreat.html
*/
toCreateThreat() {
return this.to('CreateThreat');
}
/**
* Grants permission to create a new threat model configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_CreateThreatModel.html
*/
toCreateThreatModel() {
return this.to('CreateThreatModel');
}
/**
* Grants permission to delete an agent space record
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_DeleteAgentSpace.html
*/
toDeleteAgentSpace() {
return this.to('DeleteAgentSpace');
}
/**
* Grants permission to delete application
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_DeleteApplication.html
*/
toDeleteApplication() {
return this.to('DeleteApplication');
}
/**
* Grants permission to delete an Artifact
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_DeleteArtifact.html
*/
toDeleteArtifact() {
return this.to('DeleteArtifact');
}
/**
* Grants permission to delete a design review
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_DeleteDesignReview.html
*/
toDeleteDesignReview() {
return this.to('DeleteDesignReview');
}
/**
* Grants permission to delete the integration of an application
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_DeleteIntegration.html
*/
toDeleteIntegration() {
return this.to('DeleteIntegration');
}
/**
* Grants permission to remove a single member associated to an agent space
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_DeleteMembership.html
*/
toDeleteMembership() {
return this.to('DeleteMembership');
}
/**
* Grants permission to delete a private connection
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_DeletePrivateConnection.html
*/
toDeletePrivateConnection() {
return this.to('DeletePrivateConnection');
}
/**
* Grants permission to delete a customer managed Security Requirement
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_DeleteSecurityRequirement.html
*/
toDeleteSecurityRequirement() {
return this.to('DeleteSecurityRequirement');
}
/**
* Grants permission to delete a customer managed security requirement pack and all its associated security requirements
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_DeleteSecurityRequirementPack.html
*/
toDeleteSecurityRequirementPack() {
return this.to('DeleteSecurityRequirementPack');
}
/**
* Grants permission to delete a target domain record
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_DeleteTargetDomain.html
*/
toDeleteTargetDomain() {
return this.to('DeleteTargetDomain');
}
/**
* Grants permission to describe a private connection
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_DescribePrivateConnection.html
*/
toDescribePrivateConnection() {
return this.to('DescribePrivateConnection');
}
/**
* Grants permission to get application details by application ID
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_GetApplication.html
*/
toGetApplication() {
return this.to('GetApplication');
}
/**
* Grants permission to retrieve an Artifact for the given Agent Space
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_GetArtifact.html
*/
toGetArtifact() {
return this.to('GetArtifact');
}
/**
* Grants permission to get the status of the associated agent space design review
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_GetDesignReview.html
*/
toGetDesignReview() {
return this.to('GetDesignReview');
}
/**
* Grants permission to get design review artifact for a specific document
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_GetDesignReviewArtifact.html
*/
toGetDesignReviewArtifact() {
return this.to('GetDesignReviewArtifact');
}
/**
* Grants permission to get feedback for a design review comment
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_GetDesignReviewFeedback.html
*/
toGetDesignReviewFeedback() {
return this.to('GetDesignReviewFeedback');
}
/**
* Grants permission to get the integration metadata by ID
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_GetIntegration.html
*/
toGetIntegration() {
return this.to('GetIntegration');
}
/**
* Grants permission to retrieve the provider registration manifest used for browser-based integration registration
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_GetProviderRegistrationManifest.html
*/
toGetProviderRegistrationManifest() {
return this.to('GetProviderRegistrationManifest');
}
/**
* Grants permission to retrieve a Security Requirement
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_GetSecurityRequirement.html
*/
toGetSecurityRequirement() {
return this.to('GetSecurityRequirement');
}
/**
* Grants permission to retrieve a security requirement pack
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_GetSecurityRequirementPack.html
*/
toGetSecurityRequirementPack() {
return this.to('GetSecurityRequirementPack');
}
/**
* Grants permission to handle the provider OAuth registration callback that completes integration setup
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_HandleProviderRegistrationCallback.html
*/
toHandleProviderRegistrationCallback() {
return this.to('HandleProviderRegistrationCallback');
}
/**
* Grants permission to import security requirements from uploaded documents for a customer managed security requirement pack
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_ImportSecurityRequirements.html
*/
toImportSecurityRequirements() {
return this.to('ImportSecurityRequirements');
}
/**
* Grants permission to initiate the registration of Security Agent App for the given provider (eg: GitHub)
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_InitiateProviderRegistration.html
*/
toInitiateProviderRegistration() {
return this.to('InitiateProviderRegistration');
}
/**
* Grants permission to list agent spaces
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListAgentSpaces.html
*/
toListAgentSpaces() {
return this.to('ListAgentSpaces');
}
/**
* Grants permission to list all applications in the account
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListApplications.html
*/
toListApplications() {
return this.to('ListApplications');
}
/**
* Grants permission to list all artifacts for the given agent space
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListArtifacts.html
*/
toListArtifacts() {
return this.to('ListArtifacts');
}
/**
* Grants permission to list tasks associated with a code review job
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListCodeReviewJobTasks.html
*/
toListCodeReviewJobTasks() {
return this.to('ListCodeReviewJobTasks');
}
/**
* Grants permission to list code review jobs associated with a code review
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListCodeReviewJobsForCodeReview.html
*/
toListCodeReviewJobsForCodeReview() {
return this.to('ListCodeReviewJobsForCodeReview');
}
/**
* Grants permission to list code reviews with optional filtering by status
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListCodeReviews.html
*/
toListCodeReviews() {
return this.to('ListCodeReviews');
}
/**
* Grants permission to list design review comments
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListDesignReviewComments.html
*/
toListDesignReviewComments() {
return this.to('ListDesignReviewComments');
}
/**
* Grants permission to list all design reviews for the given agent space
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListDesignReviews.html
*/
toListDesignReviews() {
return this.to('ListDesignReviews');
}
/**
* Grants permission to list discovered endpoints associated with a pentest job with optional URI prefix filtering
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListDiscoveredEndpoints.html
*/
toListDiscoveredEndpoints() {
return this.to('ListDiscoveredEndpoints');
}
/**
* Grants permission to list findings with filtering and pagination support
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListFindings.html
*/
toListFindings() {
return this.to('ListFindings');
}
/**
* Grants permission to list integrated resources for an agent space
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListIntegratedResources.html
*/
toListIntegratedResources() {
return this.to('ListIntegratedResources');
}
/**
* Grants permission to get the integrations owned by the caller's AWS account
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListIntegrations.html
*/
toListIntegrations() {
return this.to('ListIntegrations');
}
/**
* Grants permission to list all members associated to an agent space with pagination support
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListMemberships.html
*/
toListMemberships() {
return this.to('ListMemberships');
}
/**
* Grants permission to list pentest job tasks associated with a pentest job
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListPentestJobTasks.html
*/
toListPentestJobTasks() {
return this.to('ListPentestJobTasks');
}
/**
* Grants permission to list penetration test jobs associated with a penetration test
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListPentestJobsForPentest.html
*/
toListPentestJobsForPentest() {
return this.to('ListPentestJobsForPentest');
}
/**
* Grants permission to list penetration tests with optional filtering by status
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListPentests.html
*/
toListPentests() {
return this.to('ListPentests');
}
/**
* Grants permission to list private connections in the account
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListPrivateConnections.html
*/
toListPrivateConnections() {
return this.to('ListPrivateConnections');
}
/**
* Grants permission to list resources from Integration
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListResourcesFromIntegration.html
*/
toListResourcesFromIntegration() {
return this.to('ListResourcesFromIntegration');
}
/**
* Grants permission to list all security requirement packs in the account
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListSecurityRequirementPacks.html
*/
toListSecurityRequirementPacks() {
return this.to('ListSecurityRequirementPacks');
}
/**
* Grants permission to list all Security Requirements
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListSecurityRequirements.html
*/
toListSecurityRequirements() {
return this.to('ListSecurityRequirements');
}
/**
* Grants permission to list the tags for a resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/securityagent/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to list target domains
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListTargetDomains.html
*/
toListTargetDomains() {
return this.to('ListTargetDomains');
}
/**
* Grants permission to list tasks associated with a specific threat model job
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListThreatModelJobTasks.html
*/
toListThreatModelJobTasks() {
return this.to('ListThreatModelJobTasks');
}
/**
* Grants permission to list threat model jobs for a threat model
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListThreatModelJobs.html
*/
toListThreatModelJobs() {
return this.to('ListThreatModelJobs');
}
/**
* Grants permission to list threat models for an agent space
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListThreatModels.html
*/
toListThreatModels() {
return this.to('ListThreatModels');
}
/**
* Grants permission to list threats for a threat model job with filtering and pagination support
*
* Access Level: List
*
* https://docs.aws.amazon.com/securityagent/API_ListThreats.html
*/
toListThreats() {
return this.to('ListThreats');
}
/**
* Grants permission to submit feedback for a design review comment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_PutDesignReviewFeedback.html
*/
toPutDesignReviewFeedback() {
return this.to('PutDesignReviewFeedback');
}
/**
* Grants permission to start code remediation for the findings
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_StartCodeRemediation.html
*/
toStartCodeRemediation() {
return this.to('StartCodeRemediation');
}
/**
* Grants permission to initiate the execution of a code review
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_StartCodeReviewJob.html
*/
toStartCodeReviewJob() {
return this.to('StartCodeReviewJob');
}
/**
* Grants permission to initiate the execution of a penetration test
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_StartPentestJob.html
*/
toStartPentestJob() {
return this.to('StartPentestJob');
}
/**
* Grants permission to initiate the execution of a threat model job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_StartThreatModelJob.html
*/
toStartThreatModelJob() {
return this.to('StartThreatModelJob');
}
/**
* Grants permission to stop the execution of a running code review
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_StopCodeReviewJob.html
*/
toStopCodeReviewJob() {
return this.to('StopCodeReviewJob');
}
/**
* Grants permission to stop the execution of a running penetration test
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_StopPentestJob.html
*/
toStopPentestJob() {
return this.to('StopPentestJob');
}
/**
* Grants permission to stop a running threat model job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_StopThreatModelJob.html
*/
toStopThreatModelJob() {
return this.to('StopThreatModelJob');
}
/**
* Grants permission to add tags to a resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/securityagent/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to toggle the status of a managed Security Requirement
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_ToggleManagedSecurityRequirement.html
*/
toToggleManagedSecurityRequirement() {
return this.to('ToggleManagedSecurityRequirement');
}
/**
* Grants permission to remove tags from a resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/securityagent/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to update an agent space record
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_UpdateAgentSpace.html
*/
toUpdateAgentSpace() {
return this.to('UpdateAgentSpace');
}
/**
* Grants permission to update application configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_UpdateApplication.html
*/
toUpdateApplication() {
return this.to('UpdateApplication');
}
/**
* Grants permission to update an existing code review with new configuration or settings
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_UpdateCodeReview.html
*/
toUpdateCodeReview() {
return this.to('UpdateCodeReview');
}
/**
* Grants permission to update an existing security finding with new details or status
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_UpdateFinding.html
*/
toUpdateFinding() {
return this.to('UpdateFinding');
}
/**
* Grants permission to update integrated resources for an agent space
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_UpdateIntegratedResources.html
*/
toUpdateIntegratedResources() {
return this.to('UpdateIntegratedResources');
}
/**
* Grants permission to update an existing penetration test with new configuration or settings
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_UpdatePentest.html
*/
toUpdatePentest() {
return this.to('UpdatePentest');
}
/**
* Grants permission to update the certificate associated with a private connection
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_UpdatePrivateConnectionCertificate.html
*/
toUpdatePrivateConnectionCertificate() {
return this.to('UpdatePrivateConnectionCertificate');
}
/**
* Grants permission to update a customer managed Security Requirement
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_UpdateSecurityRequirement.html
*/
toUpdateSecurityRequirement() {
return this.to('UpdateSecurityRequirement');
}
/**
* Grants permission to update a security requirement pack
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_UpdateSecurityRequirementPack.html
*/
toUpdateSecurityRequirementPack() {
return this.to('UpdateSecurityRequirementPack');
}
/**
* Grants permission to update a target domain record
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_UpdateTargetDomain.html
*/
toUpdateTargetDomain() {
return this.to('UpdateTargetDomain');
}
/**
* Grants permission to update a threat
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_UpdateThreat.html
*/
toUpdateThreat() {
return this.to('UpdateThreat');
}
/**
* Grants permission to update an existing threat model with new configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_UpdateThreatModel.html
*/
toUpdateThreatModel() {
return this.to('UpdateThreatModel');
}
/**
* Grants permission to verify ownership for a registered target domain
*
* Access Level: Write
*
* https://docs.aws.amazon.com/securityagent/API_VerifyTargetDomain.html
*/
toVerifyTargetDomain() {
return this.to('VerifyTargetDomain');
}
/**
* Adds a resource of type AgentSpace to the statement
*
* https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats
*
* @param agentId - Identifier for the agentId.
* @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()
*/
onAgentSpace(agentId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:agent-space/${agentId}`);
}
/**
* Adds a resource of type Application to the statement
*
* https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats
*
* @param applicationId - Identifier for the applicationId.
* @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()
*/
onApplication(applicationId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:application/${applicationId}`);
}
/**
* Adds a resource of type Integration to the statement
*
* https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats
*
* @param integrationId - Identifier for the integrationId.
* @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()
*/
onIntegration(integrationId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:integration/${integrationId}`);
}
/**
* Adds a resource of type PrivateConnection to the statement
*
* https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats
*
* @param privateConnectionName - Identifier for the privateConnectionName.
* @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()
*/
onPrivateConnection(privateConnectionName, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:private-connection/${privateConnectionName}`);
}
/**
* Adds a resource of type SecurityRequirementPack to the statement
*
* https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats
*
* @param securityRequirementPackId - Identifier for the securityRequirementPackId.
* @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()
*/
onSecurityRequirementPack(securityRequirementPackId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:security-requirement-pack/${securityRequirementPackId}`);
}
/**
* Adds a resource of type TargetDomain to the statement
*
* https://docs.aws.amazon.com/securityagent/latest/userguide/auth-and-access-control-iam-access-control-identity-based.html#arn-formats
*
* @param targetDomainId - Identifier for the targetDomainId.
* @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()
*/
onTargetDomain(targetDomainId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:securityagent:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:target-domain/${targetDomainId}`);
}
/**
* 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:
* - .toCreateAgentSpace()
* - .toCreateApplication()
* - .toCreateIntegration()
* - .toCreatePrivateConnection()
* - .toCreateSecurityRequirementPack()
* - .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:
* - .toAddArtifact()
* - .toBatchCreateSecurityRequirements()
* - .toBatchDeleteCodeReviews()
* - .toBatchDeletePentests()
* - .toBatchDeleteSecurityRequirements()
* - .toBatchDeleteThreatModels()
* - .toBatchDeleteThreats()
* - .toBatchGetAgentSpaces()
* - .toBatchGetArtifactMetadata()
* - .toBatchGetCodeReviewJobTasks()
* - .toBatchGetCodeReviewJobs()
* - .toBatchGetCodeReviews()
* - .toBatchGetFindings()
* - .toBatchGetPentestJobContentMetadata()
* - .toBatchGetPentestJobTasks()
* - .toBatchGetPentestJobs()
* - .toBatchGetPentests()
* - .toBatchGetSecurityRequirements()
* - .toBatchGetTargetDomains()
* - .toBatchGetThreatModelJobTasks()
* - .toBatchGetThreatModelJobs()
* - .toBatchGetThreatModels()
* - .toBatchGetThreats()
* - .toBatchUpdateSecurityRequirements()
* - .toCreateCodeReview()
* - .toCreateDesignReview()
* - .toCreateMembership()
* - .toCreateOneTimeLoginSession()
* - .toCreatePentest()
* - .toCreateSecurityRequirement()
* - .toCreateThreat()
* - .toCreateThreatModel()
* - .toDeleteAgentSpace()
* - .toDeleteApplication()
* - .toDeleteArtifact()
* - .toDeleteDesignReview()
* - .toDeleteIntegration()
* - .toDeleteMembership()
* - .toDeletePrivateConnection()
* - .toDeleteSecurityRequirement()
* - .toDeleteSecurityRequirementPack()
* - .toDeleteTargetDomain()
* - .toDescribePrivateConnection()
* - .toGetApplication()
* - .toGetArtifact()
* - .toGetDesignReview()
* - .toGetDesignReviewArtifact()
* - .toGetDesignReviewFeedback()
* - .toGetIntegration()
* - .toGetSecurityRequirement()
* - .toGetSecurityRequirementPack()
* - .toImportSecurityRequirements()
* - .toListArtifacts()
* - .toListCodeReviewJobTasks()
* - .toListCodeReviewJobsForCodeReview()
* - .toListCodeReviews()
* - .toListDesignReviewComments()
* - .toListDesignReviews()
* - .toListDiscoveredEndpoints()
* - .toListFindings()
* - .toListIntegratedResources()
* - .toListMemberships()
* - .toListPentestJobTasks()
* - .toListPentestJobsForPentest()
* - .toListPentests()
* - .toListResourcesFromIntegration()
* - .toListSecurityRequirements()
* - .toListTagsForResource()
* - .toListThreatModelJobTasks()
* - .toListThreatModelJobs()
* - .toListThreatModels()
* - .toListThreats()
* - .toPutDesignReviewFeedback()
* - .toStartCodeRemediation()
* - .toStartCodeReviewJob()
* - .toStartPentestJob()
* - .toStartThreatModelJob()
* - .toStopCodeReviewJob()
* - .toStopPentestJob()
* - .toStopThreatModelJob()
* - .toTagResource()
* - .toToggleManagedSecurityRequirement()
* - .toUntagResource()
* - .toUpdateAgentSpace()
* - .toUpdateApplication()
* - .toUpdateCodeReview()
* - .toUpdateFinding()
* - .toUpdateIntegratedResources()
* - .toUpdatePentest()
* - .toUpdatePrivateConnectionCertificate()
* - .toUpdateSecurityRequirement()
* - .toUpdateSecurityRequirementPack()
* - .toUpdateTargetDomain()
* - .toUpdateThreat()
* - .toUpdateThreatModel()
* - .toVerifyTargetDomain()
*
* Applies to resource types:
* - AgentSpace
* - Application
* - Integration
* - PrivateConnection
* - SecurityRequirementPack
* - TargetDomain
*
* @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:
* - .toCreateAgentSpace()
* - .toCreateApplication()
* - .toCreateIntegration()
* - .toCreatePrivateConnection()
* - .toCreateSecurityRequirementPack()
* - .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 [securityagent](https://docs.aws.amazon.com/service-authorization/latest/reference/list_securityagent.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'securityagent';
this.accessLevelList = {
Write: [
'AddArtifact',
'BatchCreateSecurityRequirements',
'BatchDeleteCodeReviews',
'BatchDeletePentests',
'BatchDeleteSecurityRequirements',
'BatchDeleteThreatModels',
'BatchDeleteThreats',
'BatchUpdateSecurityRequirements',
'CreateAgentSpace',
'CreateApplication',
'CreateCodeReview',
'CreateDesignReview',
'CreateIntegration',
'CreateMembership',
'CreateOneTimeLoginSession',
'CreatePentest',
'CreatePrivateConnection',
'CreateSecurityRequirement',
'CreateSecurityRequirementPack',
'CreateTargetDomain',
'CreateThreat',
'CreateThreatModel',
'DeleteAgentSpace',
'DeleteApplication',
'DeleteArtifact',
'DeleteDesignReview',
'DeleteIntegration',
'DeleteMembership',
'DeletePrivateConnection',
'DeleteSecurityRequirement',
'DeleteSecurityRequirementPack',
'DeleteTargetDomain',
'HandleProviderRegistrationCallback',
'ImportSecurityRequirements',
'InitiateProviderRegistration',
'PutDesignReviewFeedback',
'StartCodeRemediation',
'StartCodeReviewJob',
'StartPentestJob',
'StartThreatModelJob',
'StopCodeReviewJob',
'StopPentestJob',
'StopThreatModelJob',
'TagResource',
'ToggleManagedSecurityRequirement',
'UntagResource',
'UpdateAgentSpace',
'UpdateApplication',
'UpdateCodeReview',
'UpdateFinding',
'UpdateIntegratedResources',
'UpdatePentest',
'UpdatePrivateConnectionCertificate',
'UpdateSecurityRequirement',
'UpdateSecurityRequirementPack',
'UpdateTargetDomain',
'UpdateThreat',
'UpdateThreatModel',
'VerifyTargetDomain'
],
Read: [
'BatchGetAgentSpaces',
'BatchGetArtifactMetadata',
'BatchGetCodeReviewJobTasks',
'BatchGetCodeReviewJobs',
'BatchGetCodeReviews',
'BatchGetFindings',
'BatchGetPentestJobContentMetadata',
'BatchGetPentestJobTasks',
'BatchGetPentestJobs',
'BatchGetPentests',
'BatchGetSecurityRequirements',
'BatchGetTargetDomains',
'BatchGetThreatModelJobTasks',
'BatchGetThreatModelJobs',
'BatchGetThreatModels',
'BatchGetThreats',
'DescribePrivateConnection',
'GetApplication',
'GetArtifact',
'GetDesignReview',
'GetDesignReviewArtifact',
'GetDesignReviewFeedback',
'GetIntegration',
'GetProviderRegistrationManifest',
'GetSecurityRequirement',
'GetSecurityRequirementPack',
'ListTagsForResource'
],
List: [
'ListAgentSpaces',
'ListApplications',
'ListArtifacts',
'ListCodeReviewJobTasks',
'ListCodeReviewJobsForCodeReview',
'ListCodeReviews',
'ListDesignReviewComments',
'ListDesignReviews',
'ListDiscoveredEndpoints',
'ListFindings',
'ListIntegratedResources',
'ListIntegrations',
'ListMemberships',
'ListPentestJobTasks',
'ListPentestJobsForPentest',
'ListPentests',
'ListPrivateConnections',
'ListResourcesFromIntegration',
'ListSecurityRequirementPacks',
'ListSecurityRequirements',
'ListTargetDomains',
'ListThreatModelJobTasks',
'ListThreatModelJobs',
'ListThreatModels',
'ListThreats'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
}
exports.Securityagent = Securityagent;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHlhZ2VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNlY3VyaXR5YWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXlEO0FBR3pEOzs7O0dBSUc7QUFDSCxNQUFhLGFBQWMsU0FBUSx3QkFBZTtJQUdoRDs7Ozs7O09BTUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksaUNBQWlDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksaUNBQWlDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx5QkFBeUI7UUFDOUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwwQkFBMEI7UUFDL0IsT0FBTyxJQUFJLENBQUMsRUFB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dCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hY2Nlc3MtbGV2ZWwnO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBPcGVyYXRvciB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBhd3NfaWFtIGFzIGlhbSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbc2VjdXJpdHlhZ2VudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3Rfc2VjdXJpdHlhZ2VudC5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFNlY3VyaXR5YWdlbnQgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdzZWN1cml0eWFnZW50JztcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWRkIGFuIEFydGlmYWN0IGZvciB0aGUgZ2l2ZW4gQWdlbnQgU3BhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQWRkQXJ0aWZhY3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQWRkQXJ0aWZhY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0FkZEFydGlmYWN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYmF0Y2ggY3JlYXRlIHNlY3VyaXR5IHJlcXVpcmVtZW50cyBpbiBhIGN1c3RvbWVyIG1hbmFnZWQgcGFja1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9CYXRjaENyZWF0ZVNlY3VyaXR5UmVxdWlyZW1lbnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoQ3JlYXRlU2VjdXJpdHlSZXF1aXJlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoQ3JlYXRlU2VjdXJpdHlSZXF1aXJlbWVudHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgbXVsdGlwbGUgY29kZSByZXZpZXdzIGluIGEgc2luZ2xlIHJlcXVlc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQmF0Y2hEZWxldGVDb2RlUmV2aWV3cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaERlbGV0ZUNvZGVSZXZpZXdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaERlbGV0ZUNvZGVSZXZpZXdzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIG11bHRpcGxlIHBlbmV0cmF0aW9uIHRlc3RzIGluIGEgc2luZ2xlIHJlcXVlc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQmF0Y2hEZWxldGVQZW50ZXN0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaERlbGV0ZVBlbnRlc3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaERlbGV0ZVBlbnRlc3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYmF0Y2ggZGVsZXRlIHNlY3VyaXR5IHJlcXVpcmVtZW50cyBmcm9tIGEgY3VzdG9tZXIgbWFuYWdlZCBwYWNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0JhdGNoRGVsZXRlU2VjdXJpdHlSZXF1aXJlbWVudHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hEZWxldGVTZWN1cml0eVJlcXVpcmVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hEZWxldGVTZWN1cml0eVJlcXVpcmVtZW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBtdWx0aXBsZSB0aHJlYXQgbW9kZWxzIGluIGEgc2luZ2xlIHJlcXVlc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQmF0Y2hEZWxldGVUaHJlYXRNb2RlbHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hEZWxldGVUaHJlYXRNb2RlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoRGVsZXRlVGhyZWF0TW9kZWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIG11bHRpcGxlIHRocmVhdHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQmF0Y2hEZWxldGVUaHJlYXRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoRGVsZXRlVGhyZWF0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hEZWxldGVUaHJlYXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgbXVsdGlwbGUgYWdlbnQgc3BhY2VzIGluIGEgc2luZ2xlIHJlcXVlc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9CYXRjaEdldEFnZW50U3BhY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoR2V0QWdlbnRTcGFjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoR2V0QWdlbnRTcGFjZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBvbmUgb3IgbW9yZSBBcnRpZmFjdCBNZXRhZGF0YSByZWNvcmRzIGZvciB0aGUgZ2l2ZW4gQWdlbnQgU3BhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9CYXRjaEdldEFydGlmYWN0TWV0YWRhdGEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hHZXRBcnRpZmFjdE1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaEdldEFydGlmYWN0TWV0YWRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBtdWx0aXBsZSBjb2RlIHJldmlldyBqb2IgdGFza3MgaW4gYSBzaW5nbGUgcmVxdWVzdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0JhdGNoR2V0Q29kZVJldmlld0pvYlRhc2tzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoR2V0Q29kZVJldmlld0pvYlRhc2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaEdldENvZGVSZXZpZXdKb2JUYXNrcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIG11bHRpcGxlIGNvZGUgcmV2aWV3IGpvYnMgaW4gYSBzaW5nbGUgcmVxdWVzdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0JhdGNoR2V0Q29kZVJldmlld0pvYnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hHZXRDb2RlUmV2aWV3Sm9icygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hHZXRDb2RlUmV2aWV3Sm9icycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIG11bHRpcGxlIGNvZGUgcmV2aWV3cyBpbiBhIHNpbmdsZSByZXF1ZXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQmF0Y2hHZXRDb2RlUmV2aWV3cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaEdldENvZGVSZXZpZXdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaEdldENvZGVSZXZpZXdzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgbXVsdGlwbGUgc2VjdXJpdHkgdGVzdGluZyBmaW5kaW5ncyBpbiBhIHNpbmdsZSByZXF1ZXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQmF0Y2hHZXRGaW5kaW5ncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaEdldEZpbmRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaEdldEZpbmRpbmdzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgbXVsdGlwbGUgcGVudGVzdCBqb2IgY29udGVudHMgbWV0YWRhdGEgaW4gYSBzaW5nbGUgcmVxdWVzdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0JhdGNoR2V0UGVudGVzdEpvYkNvbnRlbnRNZXRhZGF0YS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaEdldFBlbnRlc3RKb2JDb250ZW50TWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoR2V0UGVudGVzdEpvYkNvbnRlbnRNZXRhZGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIG11bHRpcGxlIHBlbnRlc3Qgam9iIHRhc2tzIGluIGEgc2luZ2xlIHJlcXVlc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9CYXRjaEdldFBlbnRlc3RKb2JUYXNrcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaEdldFBlbnRlc3RKb2JUYXNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hHZXRQZW50ZXN0Sm9iVGFza3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBtdWx0aXBsZSBzZWN1cml0eSB0ZXN0aW5nIGpvYnMgaW4gYSBzaW5nbGUgcmVxdWVzdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0JhdGNoR2V0UGVudGVzdEpvYnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hHZXRQZW50ZXN0Sm9icygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hHZXRQZW50ZXN0Sm9icycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIG11bHRpcGxlIHBlbmV0cmF0aW9uIHRlc3RzIGluIGEgc2luZ2xlIHJlcXVlc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9CYXRjaEdldFBlbnRlc3RzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoR2V0UGVudGVzdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoR2V0UGVudGVzdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBtdWx0aXBsZSBzZWN1cml0eSByZXF1aXJlbWVudHMgaW4gYSBzaW5nbGUgcmVxdWVzdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0JhdGNoR2V0U2VjdXJpdHlSZXF1aXJlbWVudHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hHZXRTZWN1cml0eVJlcXVpcmVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hHZXRTZWN1cml0eVJlcXVpcmVtZW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIG11bHRpcGxlIHRhcmdldCBkb21haW5zIGluIGEgc2luZ2xlIHJlcXVlc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9CYXRjaEdldFRhcmdldERvbWFpbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hHZXRUYXJnZXREb21haW5zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaEdldFRhcmdldERvbWFpbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBtdWx0aXBsZSB0YXNrcyBmb3IgYSB0aHJlYXQgbW9kZWwgam9iIGluIGEgc2luZ2xlIHJlcXVlc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9CYXRjaEdldFRocmVhdE1vZGVsSm9iVGFza3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hHZXRUaHJlYXRNb2RlbEpvYlRhc2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaEdldFRocmVhdE1vZGVsSm9iVGFza3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBkZXRhaWxzIGZvciBvbmUgb3IgbW9yZSB0aHJlYXQgbW9kZWwgam9ic1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0JhdGNoR2V0VGhyZWF0TW9kZWxKb2JzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoR2V0VGhyZWF0TW9kZWxKb2JzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaEdldFRocmVhdE1vZGVsSm9icycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIG11bHRpcGxlIHRocmVhdCBtb2RlbHMgaW4gYSBzaW5nbGUgcmVxdWVzdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0JhdGNoR2V0VGhyZWF0TW9kZWxzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoR2V0VGhyZWF0TW9kZWxzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaEdldFRocmVhdE1vZGVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGRldGFpbHMgZm9yIG9uZSBvciBtb3JlIHRocmVhdHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9CYXRjaEdldFRocmVhdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hHZXRUaHJlYXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaEdldFRocmVhdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBiYXRjaCB1cGRhdGUgc2VjdXJpdHkgcmVxdWlyZW1lbnRzIHdpdGhpbiBhIGN1c3RvbWVyIG1hbmFnZWQgcGFja1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9CYXRjaFVwZGF0ZVNlY3VyaXR5UmVxdWlyZW1lbnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoVXBkYXRlU2VjdXJpdHlSZXF1aXJlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoVXBkYXRlU2VjdXJpdHlSZXF1aXJlbWVudHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gYWdlbnQgc3BhY2UgcmVjb3JkXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0NyZWF0ZUFnZW50U3BhY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQWdlbnRTcGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQWdlbnRTcGFjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9DcmVhdGVBcHBsaWNhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVBcHBsaWNhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQXBwbGljYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgY29kZSByZXZpZXcgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9DcmVhdGVDb2RlUmV2aWV3Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUNvZGVSZXZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUNvZGVSZXZpZXcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBkZXNpZ24gcmV2aWV3XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0NyZWF0ZURlc2lnblJldmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVEZXNpZ25SZXZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZURlc2lnblJldmlldycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHNlY3VyaXR5IHRlc3RpbmcgaW50ZWdyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQ3JlYXRlSW50ZWdyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlSW50ZWdyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUludGVncmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWRkIGEgc2luZ2xlIG1lbWJlciB0byBhIGFnZW50IHNwYWNlIHdpdGggc3BlY2lmaWVkIHJvbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQ3JlYXRlTWVtYmVyc2hpcC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVNZW1iZXJzaGlwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVNZW1iZXJzaGlwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgb25lIHRpbWUgbG9naW4gc2Vzc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9DcmVhdGVPbmVUaW1lTG9naW5TZXNzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZU9uZVRpbWVMb2dpblNlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZU9uZVRpbWVMb2dpblNlc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgcGVuZXRyYXRpb24gdGVzdCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0NyZWF0ZVBlbnRlc3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUGVudGVzdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUGVudGVzdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHByaXZhdGUgY29ubmVjdGlvbiBmb3IgVlBDIExhdHRpY2UgaW50ZWdyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQ3JlYXRlUHJpdmF0ZUNvbm5lY3Rpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUHJpdmF0ZUNvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVByaXZhdGVDb25uZWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWRkIGEgY3VzdG9tZXIgbWFuYWdlZCBTZWN1cml0eSBSZXF1aXJlbWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9DcmVhdGVTZWN1cml0eVJlcXVpcmVtZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVNlY3VyaXR5UmVxdWlyZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVNlY3VyaXR5UmVxdWlyZW1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBjdXN0b21lciBtYW5hZ2VkIHNlY3VyaXR5IHJlcXVpcmVtZW50IHBhY2tcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQ3JlYXRlU2VjdXJpdHlSZXF1aXJlbWVudFBhY2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlU2VjdXJpdHlSZXF1aXJlbWVudFBhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVNlY3VyaXR5UmVxdWlyZW1lbnRQYWNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgdGFyZ2V0IGRvbWFpbiByZWNvcmRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfQ3JlYXRlVGFyZ2V0RG9tYWluLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVRhcmdldERvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVGFyZ2V0RG9tYWluJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgdGhyZWF0IGluIGEgdGhyZWF0IG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0NyZWF0ZVRocmVhdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVUaHJlYXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVRocmVhdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyB0aHJlYXQgbW9kZWwgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9DcmVhdGVUaHJlYXRNb2RlbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVUaHJlYXRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVGhyZWF0TW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gYWdlbnQgc3BhY2UgcmVjb3JkXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0RlbGV0ZUFnZW50U3BhY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQWdlbnRTcGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlQWdlbnRTcGFjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhcHBsaWNhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9EZWxldGVBcHBsaWNhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVBcHBsaWNhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlQXBwbGljYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gQXJ0aWZhY3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfRGVsZXRlQXJ0aWZhY3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQXJ0aWZhY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUFydGlmYWN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgZGVzaWduIHJldmlld1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9EZWxldGVEZXNpZ25SZXZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlRGVzaWduUmV2aWV3KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVEZXNpZ25SZXZpZXcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIGludGVncmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0RlbGV0ZUludGVncmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUludGVncmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVJbnRlZ3JhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbW92ZSBhIHNpbmdsZSBtZW1iZXIgYXNzb2NpYXRlZCB0byBhbiBhZ2VudCBzcGFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9EZWxldGVNZW1iZXJzaGlwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU1lbWJlcnNoaXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZU1lbWJlcnNoaXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBwcml2YXRlIGNvbm5lY3Rpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfRGVsZXRlUHJpdmF0ZUNvbm5lY3Rpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlUHJpdmF0ZUNvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVByaXZhdGVDb25uZWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgY3VzdG9tZXIgbWFuYWdlZCBTZWN1cml0eSBSZXF1aXJlbWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9EZWxldGVTZWN1cml0eVJlcXVpcmVtZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVNlY3VyaXR5UmVxdWlyZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVNlY3VyaXR5UmVxdWlyZW1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBjdXN0b21lciBtYW5hZ2VkIHNlY3VyaXR5IHJlcXVpcmVtZW50IHBhY2sgYW5kIGFsbCBpdHMgYXNzb2NpYXRlZCBzZWN1cml0eSByZXF1aXJlbWVudHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfRGVsZXRlU2VjdXJpdHlSZXF1aXJlbWVudFBhY2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlU2VjdXJpdHlSZXF1aXJlbWVudFBhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVNlY3VyaXR5UmVxdWlyZW1lbnRQYWNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdGFyZ2V0IGRvbWFpbiByZWNvcmRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfRGVsZXRlVGFyZ2V0RG9tYWluLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVRhcmdldERvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVGFyZ2V0RG9tYWluJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYSBwcml2YXRlIGNvbm5lY3Rpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9EZXNjcmliZVByaXZhdGVDb25uZWN0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlUHJpdmF0ZUNvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlUHJpdmF0ZUNvbm5lY3Rpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYXBwbGljYXRpb24gZGV0YWlscyBieSBhcHBsaWNhdGlvbiBJRFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0dldEFwcGxpY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEFwcGxpY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRBcHBsaWNhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGFuIEFydGlmYWN0IGZvciB0aGUgZ2l2ZW4gQWdlbnQgU3BhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9HZXRBcnRpZmFjdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRBcnRpZmFjdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0QXJ0aWZhY3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIHN0YXR1cyBvZiB0aGUgYXNzb2NpYXRlZCBhZ2VudCBzcGFjZSBkZXNpZ24gcmV2aWV3XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfR2V0RGVzaWduUmV2aWV3Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldERlc2lnblJldmlldygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RGVzaWduUmV2aWV3Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGRlc2lnbiByZXZpZXcgYXJ0aWZhY3QgZm9yIGEgc3BlY2lmaWMgZG9jdW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9HZXREZXNpZ25SZXZpZXdBcnRpZmFjdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXREZXNpZ25SZXZpZXdBcnRpZmFjdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RGVzaWduUmV2aWV3QXJ0aWZhY3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgZmVlZGJhY2sgZm9yIGEgZGVzaWduIHJldmlldyBjb21tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfR2V0RGVzaWduUmV2aWV3RmVlZGJhY2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0RGVzaWduUmV2aWV3RmVlZGJhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldERlc2lnblJldmlld0ZlZWRiYWNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBpbnRlZ3JhdGlvbiBtZXRhZGF0YSBieSBJRFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0dldEludGVncmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEludGVncmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRJbnRlZ3JhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHRoZSBwcm92aWRlciByZWdpc3RyYXRpb24gbWFuaWZlc3QgdXNlZCBmb3IgYnJvd3Nlci1iYXNlZCBpbnRlZ3JhdGlvbiByZWdpc3RyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9HZXRQcm92aWRlclJlZ2lzdHJhdGlvbk1hbmlmZXN0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFByb3ZpZGVyUmVnaXN0cmF0aW9uTWFuaWZlc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFByb3ZpZGVyUmVnaXN0cmF0aW9uTWFuaWZlc3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhIFNlY3VyaXR5IFJlcXVpcmVtZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfR2V0U2VjdXJpdHlSZXF1aXJlbWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRTZWN1cml0eVJlcXVpcmVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRTZWN1cml0eVJlcXVpcmVtZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYSBzZWN1cml0eSByZXF1aXJlbWVudCBwYWNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfR2V0U2VjdXJpdHlSZXF1aXJlbWVudFBhY2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0U2VjdXJpdHlSZXF1aXJlbWVudFBhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFNlY3VyaXR5UmVxdWlyZW1lbnRQYWNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaGFuZGxlIHRoZSBwcm92aWRlciBPQXV0aCByZWdpc3RyYXRpb24gY2FsbGJhY2sgdGhhdCBjb21wbGV0ZXMgaW50ZWdyYXRpb24gc2V0dXBcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfSGFuZGxlUHJvdmlkZXJSZWdpc3RyYXRpb25DYWxsYmFjay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9IYW5kbGVQcm92aWRlclJlZ2lzdHJhdGlvbkNhbGxiYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdIYW5kbGVQcm92aWRlclJlZ2lzdHJhdGlvbkNhbGxiYWNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW1wb3J0IHNlY3VyaXR5IHJlcXVpcmVtZW50cyBmcm9tIHVwbG9hZGVkIGRvY3VtZW50cyBmb3IgYSBjdXN0b21lciBtYW5hZ2VkIHNlY3VyaXR5IHJlcXVpcmVtZW50IHBhY2tcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfSW1wb3J0U2VjdXJpdHlSZXF1aXJlbWVudHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvSW1wb3J0U2VjdXJpdHlSZXF1aXJlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0ltcG9ydFNlY3VyaXR5UmVxdWlyZW1lbnRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW5pdGlhdGUgdGhlIHJlZ2lzdHJhdGlvbiBvZiBTZWN1cml0eSBBZ2VudCBBcHAgZm9yIHRoZSBnaXZlbiBwcm92aWRlciAoZWc6IEdpdEh1YilcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfSW5pdGlhdGVQcm92aWRlclJlZ2lzdHJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Jbml0aWF0ZVByb3ZpZGVyUmVnaXN0cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdJbml0aWF0ZVByb3ZpZGVyUmVnaXN0cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhZ2VudCBzcGFjZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9MaXN0QWdlbnRTcGFjZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEFnZW50U3BhY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QWdlbnRTcGFjZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBhcHBsaWNhdGlvbnMgaW4gdGhlIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9MaXN0QXBwbGljYXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RBcHBsaWNhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RBcHBsaWNhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBhcnRpZmFjdHMgZm9yIHRoZSBnaXZlbiBhZ2VudCBzcGFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0xpc3RBcnRpZmFjdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEFydGlmYWN0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEFydGlmYWN0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGFza3MgYXNzb2NpYXRlZCB3aXRoIGEgY29kZSByZXZpZXcgam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfTGlzdENvZGVSZXZpZXdKb2JUYXNrcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0Q29kZVJldmlld0pvYlRhc2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q29kZVJldmlld0pvYlRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBjb2RlIHJldmlldyBqb2JzIGFzc29jaWF0ZWQgd2l0aCBhIGNvZGUgcmV2aWV3XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfTGlzdENvZGVSZXZpZXdKb2JzRm9yQ29kZVJldmlldy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0Q29kZVJldmlld0pvYnNGb3JDb2RlUmV2aWV3KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q29kZVJldmlld0pvYnNGb3JDb2RlUmV2aWV3Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBjb2RlIHJldmlld3Mgd2l0aCBvcHRpb25hbCBmaWx0ZXJpbmcgYnkgc3RhdHVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfTGlzdENvZGVSZXZpZXdzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RDb2RlUmV2aWV3cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdENvZGVSZXZpZXdzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBkZXNpZ24gcmV2aWV3IGNvbW1lbnRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfTGlzdERlc2lnblJldmlld0NvbW1lbnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3REZXNpZ25SZXZpZXdDb21tZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdERlc2lnblJldmlld0NvbW1lbnRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgZGVzaWduIHJldmlld3MgZm9yIHRoZSBnaXZlbiBhZ2VudCBzcGFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0xpc3REZXNpZ25SZXZpZXdzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3REZXNpZ25SZXZpZXdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RGVzaWduUmV2aWV3cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgZGlzY292ZXJlZCBlbmRwb2ludHMgYXNzb2NpYXRlZCB3aXRoIGEgcGVudGVzdCBqb2Igd2l0aCBvcHRpb25hbCBVUkkgcHJlZml4IGZpbHRlcmluZ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0xpc3REaXNjb3ZlcmVkRW5kcG9pbnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3REaXNjb3ZlcmVkRW5kcG9pbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RGlzY292ZXJlZEVuZHBvaW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgZmluZGluZ3Mgd2l0aCBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb24gc3VwcG9ydFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0xpc3RGaW5kaW5ncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RmluZGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RGaW5kaW5ncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgaW50ZWdyYXRlZCByZXNvdXJjZXMgZm9yIGFuIGFnZW50IHNwYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfTGlzdEludGVncmF0ZWRSZXNvdXJjZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEludGVncmF0ZWRSZXNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RJbnRlZ3JhdGVkUmVzb3VyY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBpbnRlZ3JhdGlvbnMgb3duZWQgYnkgdGhlIGNhbGxlcidzIEFXUyBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfTGlzdEludGVncmF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0SW50ZWdyYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0SW50ZWdyYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgbWVtYmVycyBhc3NvY2lhdGVkIHRvIGFuIGFnZW50IHNwYWNlIHdpdGggcGFnaW5hdGlvbiBzdXBwb3J0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfTGlzdE1lbWJlcnNoaXBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RNZW1iZXJzaGlwcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdE1lbWJlcnNoaXBzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBwZW50ZXN0IGpvYiB0YXNrcyBhc3NvY2lhdGVkIHdpdGggYSBwZW50ZXN0IGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0xpc3RQZW50ZXN0Sm9iVGFza3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFBlbnRlc3RKb2JUYXNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFBlbnRlc3RKb2JUYXNrcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgcGVuZXRyYXRpb24gdGVzdCBqb2JzIGFzc29jaWF0ZWQgd2l0aCBhIHBlbmV0cmF0aW9uIHRlc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9MaXN0UGVudGVzdEpvYnNGb3JQZW50ZXN0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RQZW50ZXN0Sm9ic0ZvclBlbnRlc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RQZW50ZXN0Sm9ic0ZvclBlbnRlc3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHBlbmV0cmF0aW9uIHRlc3RzIHdpdGggb3B0aW9uYWwgZmlsdGVyaW5nIGJ5IHN0YXR1c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0xpc3RQZW50ZXN0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UGVudGVzdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RQZW50ZXN0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgcHJpdmF0ZSBjb25uZWN0aW9ucyBpbiB0aGUgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0xpc3RQcml2YXRlQ29ubmVjdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFByaXZhdGVDb25uZWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFByaXZhdGVDb25uZWN0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgcmVzb3VyY2VzIGZyb20gSW50ZWdyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9MaXN0UmVzb3VyY2VzRnJvbUludGVncmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RSZXNvdXJjZXNGcm9tSW50ZWdyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RSZXNvdXJjZXNGcm9tSW50ZWdyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBzZWN1cml0eSByZXF1aXJlbWVudCBwYWNrcyBpbiB0aGUgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0xpc3RTZWN1cml0eVJlcXVpcmVtZW50UGFja3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFNlY3VyaXR5UmVxdWlyZW1lbnRQYWNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFNlY3VyaXR5UmVxdWlyZW1lbnRQYWNrcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIFNlY3VyaXR5IFJlcXVpcmVtZW50c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0xpc3RTZWN1cml0eVJlcXVpcmVtZW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U2VjdXJpdHlSZXF1aXJlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTZWN1cml0eVJlcXVpcmVtZW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGhlIHRhZ3MgZm9yIGEgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9MaXN0VGFnc0ZvclJlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUYWdzRm9yUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYWdzRm9yUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRhcmdldCBkb21haW5zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfTGlzdFRhcmdldERvbWFpbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRhcmdldERvbWFpbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYXJnZXREb21haW5zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0YXNrcyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyB0aHJlYXQgbW9kZWwgam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfTGlzdFRocmVhdE1vZGVsSm9iVGFza3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRocmVhdE1vZGVsSm9iVGFza3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUaHJlYXRNb2RlbEpvYlRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0aHJlYXQgbW9kZWwgam9icyBmb3IgYSB0aHJlYXQgbW9kZWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9MaXN0VGhyZWF0TW9kZWxKb2JzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUaHJlYXRNb2RlbEpvYnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUaHJlYXRNb2RlbEpvYnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRocmVhdCBtb2RlbHMgZm9yIGFuIGFnZW50IHNwYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfTGlzdFRocmVhdE1vZGVscy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGhyZWF0TW9kZWxzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGhyZWF0TW9kZWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0aHJlYXRzIGZvciBhIHRocmVhdCBtb2RlbCBqb2Igd2l0aCBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb24gc3VwcG9ydFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX0xpc3RUaHJlYXRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUaHJlYXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGhyZWF0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN1Ym1pdCBmZWVkYmFjayBmb3IgYSBkZXNpZ24gcmV2aWV3IGNvbW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfUHV0RGVzaWduUmV2aWV3RmVlZGJhY2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0RGVzaWduUmV2aWV3RmVlZGJhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dERlc2lnblJldmlld0ZlZWRiYWNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgY29kZSByZW1lZGlhdGlvbiBmb3IgdGhlIGZpbmRpbmdzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX1N0YXJ0Q29kZVJlbWVkaWF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0Q29kZVJlbWVkaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydENvZGVSZW1lZGlhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGluaXRpYXRlIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlIHJldmlld1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9TdGFydENvZGVSZXZpZXdKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRDb2RlUmV2aWV3Sm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydENvZGVSZXZpZXdKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbml0aWF0ZSB0aGUgZXhlY3V0aW9uIG9mIGEgcGVuZXRyYXRpb24gdGVzdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9TdGFydFBlbnRlc3RKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRQZW50ZXN0Sm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydFBlbnRlc3RKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbml0aWF0ZSB0aGUgZXhlY3V0aW9uIG9mIGEgdGhyZWF0IG1vZGVsIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9TdGFydFRocmVhdE1vZGVsSm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0VGhyZWF0TW9kZWxKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0VGhyZWF0TW9kZWxKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdG9wIHRoZSBleGVjdXRpb24gb2YgYSBydW5uaW5nIGNvZGUgcmV2aWV3XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX1N0b3BDb2RlUmV2aWV3Sm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0b3BDb2RlUmV2aWV3Sm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdG9wQ29kZVJldmlld0pvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0b3AgdGhlIGV4ZWN1dGlvbiBvZiBhIHJ1bm5pbmcgcGVuZXRyYXRpb24gdGVzdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9TdG9wUGVudGVzdEpvYi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdG9wUGVudGVzdEpvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RvcFBlbnRlc3RKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdG9wIGEgcnVubmluZyB0aHJlYXQgbW9kZWwgam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX1N0b3BUaHJlYXRNb2RlbEpvYi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdG9wVGhyZWF0TW9kZWxKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0b3BUaHJlYXRNb2RlbEpvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFkZCB0YWdzIHRvIGEgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nLCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfVGFnUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1RhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdG9nZ2xlIHRoZSBzdGF0dXMgb2YgYSBtYW5hZ2VkIFNlY3VyaXR5IFJlcXVpcmVtZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX1RvZ2dsZU1hbmFnZWRTZWN1cml0eVJlcXVpcmVtZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1RvZ2dsZU1hbmFnZWRTZWN1cml0eVJlcXVpcmVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdUb2dnbGVNYW5hZ2VkU2VjdXJpdHlSZXF1aXJlbWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbW92ZSB0YWdzIGZyb20gYSByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmcsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9VbnRhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VudGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VudGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYW4gYWdlbnQgc3BhY2UgcmVjb3JkXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX1VwZGF0ZUFnZW50U3BhY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQWdlbnRTcGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQWdlbnRTcGFjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX1VwZGF0ZUFwcGxpY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUFwcGxpY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVBcHBsaWNhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhbiBleGlzdGluZyBjb2RlIHJldmlldyB3aXRoIG5ldyBjb25maWd1cmF0aW9uIG9yIHNldHRpbmdzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX1VwZGF0ZUNvZGVSZXZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQ29kZVJldmlldygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQ29kZVJldmlldycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhbiBleGlzdGluZyBzZWN1cml0eSBmaW5kaW5nIHdpdGggbmV3IGRldGFpbHMgb3Igc3RhdHVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX1VwZGF0ZUZpbmRpbmcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlRmluZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlRmluZGluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBpbnRlZ3JhdGVkIHJlc291cmNlcyBmb3IgYW4gYWdlbnQgc3BhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfVXBkYXRlSW50ZWdyYXRlZFJlc291cmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVJbnRlZ3JhdGVkUmVzb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVJbnRlZ3JhdGVkUmVzb3VyY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGFuIGV4aXN0aW5nIHBlbmV0cmF0aW9uIHRlc3Qgd2l0aCBuZXcgY29uZmlndXJhdGlvbiBvciBzZXR0aW5nc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9VcGRhdGVQZW50ZXN0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVBlbnRlc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVBlbnRlc3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIGNlcnRpZmljYXRlIGFzc29jaWF0ZWQgd2l0aCBhIHByaXZhdGUgY29ubmVjdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9VcGRhdGVQcml2YXRlQ29ubmVjdGlvbkNlcnRpZmljYXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVByaXZhdGVDb25uZWN0aW9uQ2VydGlmaWNhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVByaXZhdGVDb25uZWN0aW9uQ2VydGlmaWNhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBjdXN0b21lciBtYW5hZ2VkIFNlY3VyaXR5IFJlcXVpcmVtZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX1VwZGF0ZVNlY3VyaXR5UmVxdWlyZW1lbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlU2VjdXJpdHlSZXF1aXJlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlU2VjdXJpdHlSZXF1aXJlbWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHNlY3VyaXR5IHJlcXVpcmVtZW50IHBhY2tcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfVXBkYXRlU2VjdXJpdHlSZXF1aXJlbWVudFBhY2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlU2VjdXJpdHlSZXF1aXJlbWVudFBhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVNlY3VyaXR5UmVxdWlyZW1lbnRQYWNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgdGFyZ2V0IGRvbWFpbiByZWNvcmRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9BUElfVXBkYXRlVGFyZ2V0RG9tYWluLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVRhcmdldERvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlVGFyZ2V0RG9tYWluJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgdGhyZWF0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvQVBJX1VwZGF0ZVRocmVhdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVUaHJlYXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVRocmVhdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhbiBleGlzdGluZyB0aHJlYXQgbW9kZWwgd2l0aCBuZXcgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9VcGRhdGVUaHJlYXRNb2RlbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVUaHJlYXRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlVGhyZWF0TW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB2ZXJpZnkgb3duZXJzaGlwIGZvciBhIHJlZ2lzdGVyZWQgdGFyZ2V0IGRvbWFpblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L0FQSV9WZXJpZnlUYXJnZXREb21haW4uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVmVyaWZ5VGFyZ2V0RG9tYWluKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdWZXJpZnlUYXJnZXREb21haW4nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY2Nlc3NMZXZlbExpc3Q6IEFjY2Vzc0xldmVsTGlzdCA9IHtcbiAgICBXcml0ZTogW1xuICAgICAgJ0FkZEFydGlmYWN0JyxcbiAgICAgICdCYXRjaENyZWF0ZVNlY3VyaXR5UmVxdWlyZW1lbnRzJyxcbiAgICAgICdCYXRjaERlbGV0ZUNvZGVSZXZpZXdzJyxcbiAgICAgICdCYXRjaERlbGV0ZVBlbnRlc3RzJyxcbiAgICAgICdCYXRjaERlbGV0ZVNlY3VyaXR5UmVxdWlyZW1lbnRzJyxcbiAgICAgICdCYXRjaERlbGV0ZVRocmVhdE1vZGVscycsXG4gICAgICAnQmF0Y2hEZWxldGVUaHJlYXRzJyxcbiAgICAgICdCYXRjaFVwZGF0ZVNlY3VyaXR5UmVxdWlyZW1lbnRzJyxcbiAgICAgICdDcmVhdGVBZ2VudFNwYWNlJyxcbiAgICAgICdDcmVhdGVBcHBsaWNhdGlvbicsXG4gICAgICAnQ3JlYXRlQ29kZVJldmlldycsXG4gICAgICAnQ3JlYXRlRGVzaWduUmV2aWV3JyxcbiAgICAgICdDcmVhdGVJbnRlZ3JhdGlvbicsXG4gICAgICAnQ3JlYXRlTWVtYmVyc2hpcCcsXG4gICAgICAnQ3JlYXRlT25lVGltZUxvZ2luU2Vzc2lvbicsXG4gICAgICAnQ3JlYXRlUGVudGVzdCcsXG4gICAgICAnQ3JlYXRlUHJpdmF0ZUNvbm5lY3Rpb24nLFxuICAgICAgJ0NyZWF0ZVNlY3VyaXR5UmVxdWlyZW1lbnQnLFxuICAgICAgJ0NyZWF0ZVNlY3VyaXR5UmVxdWlyZW1lbnRQYWNrJyxcbiAgICAgICdDcmVhdGVUYXJnZXREb21haW4nLFxuICAgICAgJ0NyZWF0ZVRocmVhdCcsXG4gICAgICAnQ3JlYXRlVGhyZWF0TW9kZWwnLFxuICAgICAgJ0RlbGV0ZUFnZW50U3BhY2UnLFxuICAgICAgJ0RlbGV0ZUFwcGxpY2F0aW9uJyxcbiAgICAgICdEZWxldGVBcnRpZmFjdCcsXG4gICAgICAnRGVsZXRlRGVzaWduUmV2aWV3JyxcbiAgICAgICdEZWxldGVJbnRlZ3JhdGlvbicsXG4gICAgICAnRGVsZXRlTWVtYmVyc2hpcCcsXG4gICAgICAnRGVsZXRlUHJpdmF0ZUNvbm5lY3Rpb24nLFxuICAgICAgJ0RlbGV0ZVNlY3VyaXR5UmVxdWlyZW1lbnQnLFxuICAgICAgJ0RlbGV0ZVNlY3VyaXR5UmVxdWlyZW1lbnRQYWNrJyxcbiAgICAgICdEZWxldGVUYXJnZXREb21haW4nLFxuICAgICAgJ0hhbmRsZVByb3ZpZGVyUmVnaXN0cmF0aW9uQ2FsbGJhY2snLFxuICAgICAgJ0ltcG9ydFNlY3VyaXR5UmVxdWlyZW1lbnRzJyxcbiAgICAgICdJbml0aWF0ZVByb3ZpZGVyUmVnaXN0cmF0aW9uJyxcbiAgICAgICdQdXREZXNpZ25SZXZpZXdGZWVkYmFjaycsXG4gICAgICAnU3RhcnRDb2RlUmVtZWRpYXRpb24nLFxuICAgICAgJ1N0YXJ0Q29kZVJldmlld0pvYicsXG4gICAgICAnU3RhcnRQZW50ZXN0Sm9iJyxcbiAgICAgICdTdGFydFRocmVhdE1vZGVsSm9iJyxcbiAgICAgICdTdG9wQ29kZVJldmlld0pvYicsXG4gICAgICAnU3RvcFBlbnRlc3RKb2InLFxuICAgICAgJ1N0b3BUaHJlYXRNb2RlbEpvYicsXG4gICAgICAnVGFnUmVzb3VyY2UnLFxuICAgICAgJ1RvZ2dsZU1hbmFnZWRTZWN1cml0eVJlcXVpcmVtZW50JyxcbiAgICAgICdVbnRhZ1Jlc291cmNlJyxcbiAgICAgICdVcGRhdGVBZ2VudFNwYWNlJyxcbiAgICAgICdVcGRhdGVBcHBsaWNhdGlvbicsXG4gICAgICAnVXBkYXRlQ29kZVJldmlldycsXG4gICAgICAnVXBkYXRlRmluZGluZycsXG4gICAgICAnVXBkYXRlSW50ZWdyYXRlZFJlc291cmNlcycsXG4gICAgICAnVXBkYXRlUGVudGVzdCcsXG4gICAgICAnVXBkYXRlUHJpdmF0ZUNvbm5lY3Rpb25DZXJ0aWZpY2F0ZScsXG4gICAgICAnVXBkYXRlU2VjdXJpdHlSZXF1aXJlbWVudCcsXG4gICAgICAnVXBkYXRlU2VjdXJpdHlSZXF1aXJlbWVudFBhY2snLFxuICAgICAgJ1VwZGF0ZVRhcmdldERvbWFpbicsXG4gICAgICAnVXBkYXRlVGhyZWF0JyxcbiAgICAgICdVcGRhdGVUaHJlYXRNb2RlbCcsXG4gICAgICAnVmVyaWZ5VGFyZ2V0RG9tYWluJ1xuICAgIF0sXG4gICAgUmVhZDogW1xuICAgICAgJ0JhdGNoR2V0QWdlbnRTcGFjZXMnLFxuICAgICAgJ0JhdGNoR2V0QXJ0aWZhY3RNZXRhZGF0YScsXG4gICAgICAnQmF0Y2hHZXRDb2RlUmV2aWV3Sm9iVGFza3MnLFxuICAgICAgJ0JhdGNoR2V0Q29kZVJldmlld0pvYnMnLFxuICAgICAgJ0JhdGNoR2V0Q29kZVJldmlld3MnLFxuICAgICAgJ0JhdGNoR2V0RmluZGluZ3MnLFxuICAgICAgJ0JhdGNoR2V0UGVudGVzdEpvYkNvbnRlbnRNZXRhZGF0YScsXG4gICAgICAnQmF0Y2hHZXRQZW50ZXN0Sm9iVGFza3MnLFxuICAgICAgJ0JhdGNoR2V0UGVudGVzdEpvYnMnLFxuICAgICAgJ0JhdGNoR2V0UGVudGVzdHMnLFxuICAgICAgJ0JhdGNoR2V0U2VjdXJpdHlSZXF1aXJlbWVudHMnLFxuICAgICAgJ0JhdGNoR2V0VGFyZ2V0RG9tYWlucycsXG4gICAgICAnQmF0Y2hHZXRUaHJlYXRNb2RlbEpvYlRhc2tzJyxcbiAgICAgICdCYXRjaEdldFRocmVhdE1vZGVsSm9icycsXG4gICAgICAnQmF0Y2hHZXRUaHJlYXRNb2RlbHMnLFxuICAgICAgJ0JhdGNoR2V0VGhyZWF0cycsXG4gICAgICAnRGVzY3JpYmVQcml2YXRlQ29ubmVjdGlvbicsXG4gICAgICAnR2V0QXBwbGljYXRpb24nLFxuICAgICAgJ0dldEFydGlmYWN0JyxcbiAgICAgICdHZXREZXNpZ25SZXZpZXcnLFxuICAgICAgJ0dldERlc2lnblJldmlld0FydGlmYWN0JyxcbiAgICAgICdHZXREZXNpZ25SZXZpZXdGZWVkYmFjaycsXG4gICAgICAnR2V0SW50ZWdyYXRpb24nLFxuICAgICAgJ0dldFByb3ZpZGVyUmVnaXN0cmF0aW9uTWFuaWZlc3QnLFxuICAgICAgJ0dldFNlY3VyaXR5UmVxdWlyZW1lbnQnLFxuICAgICAgJ0dldFNlY3VyaXR5UmVxdWlyZW1lbnRQYWNrJyxcbiAgICAgICdMaXN0VGFnc0ZvclJlc291cmNlJ1xuICAgIF0sXG4gICAgTGlzdDogW1xuICAgICAgJ0xpc3RBZ2VudFNwYWNlcycsXG4gICAgICAnTGlzdEFwcGxpY2F0aW9ucycsXG4gICAgICAnTGlzdEFydGlmYWN0cycsXG4gICAgICAnTGlzdENvZGVSZXZpZXdKb2JUYXNrcycsXG4gICAgICAnTGlzdENvZGVSZXZpZXdKb2JzRm9yQ29kZVJldmlldycsXG4gICAgICAnTGlzdENvZGVSZXZpZXdzJyxcbiAgICAgICdMaXN0RGVzaWduUmV2aWV3Q29tbWVudHMnLFxuICAgICAgJ0xpc3REZXNpZ25SZXZpZXdzJyxcbiAgICAgICdMaXN0RGlzY292ZXJlZEVuZHBvaW50cycsXG4gICAgICAnTGlzdEZpbmRpbmdzJyxcbiAgICAgICdMaXN0SW50ZWdyYXRlZFJlc291cmNlcycsXG4gICAgICAnTGlzdEludGVncmF0aW9ucycsXG4gICAgICAnTGlzdE1lbWJlcnNoaXBzJyxcbiAgICAgICdMaXN0UGVudGVzdEpvYlRhc2tzJyxcbiAgICAgICdMaXN0UGVudGVzdEpvYnNGb3JQZW50ZXN0JyxcbiAgICAgICdMaXN0UGVudGVzdHMnLFxuICAgICAgJ0xpc3RQcml2YXRlQ29ubmVjdGlvbnMnLFxuICAgICAgJ0xpc3RSZXNvdXJjZXNGcm9tSW50ZWdyYXRpb24nLFxuICAgICAgJ0xpc3RTZWN1cml0eVJlcXVpcmVtZW50UGFja3MnLFxuICAgICAgJ0xpc3RTZWN1cml0eVJlcXVpcmVtZW50cycsXG4gICAgICAnTGlzdFRhcmdldERvbWFpbnMnLFxuICAgICAgJ0xpc3RUaHJlYXRNb2RlbEpvYlRhc2tzJyxcbiAgICAgICdMaXN0VGhyZWF0TW9kZWxKb2JzJyxcbiAgICAgICdMaXN0VGhyZWF0TW9kZWxzJyxcbiAgICAgICdMaXN0VGhyZWF0cydcbiAgICBdLFxuICAgIFRhZ2dpbmc6IFtcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZSdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIEFnZW50U3BhY2UgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL2F1dGgtYW5kLWFjY2Vzcy1jb250cm9sLWlhbS1hY2Nlc3MtY29udHJvbC1pZGVudGl0eS1iYXNlZC5odG1sI2Fybi1mb3JtYXRzXG4gICAqXG4gICAqIEBwYXJhbSBhZ2VudElkIC0gSWRlbnRpZmllciBmb3IgdGhlIGFnZW50SWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkFnZW50U3BhY2UoYWdlbnRJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnNlY3VyaXR5YWdlbnQ6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmFnZW50LXNwYWNlLyR7IGFnZW50SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIEFwcGxpY2F0aW9uIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvbGF0ZXN0L3VzZXJndWlkZS9hdXRoLWFuZC1hY2Nlc3MtY29udHJvbC1pYW0tYWNjZXNzLWNvbnRyb2wtaWRlbnRpdHktYmFzZWQuaHRtbCNhcm4tZm9ybWF0c1xuICAgKlxuICAgKiBAcGFyYW0gYXBwbGljYXRpb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBhcHBsaWNhdGlvbklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25BcHBsaWNhdGlvbihhcHBsaWNhdGlvbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06c2VjdXJpdHlhZ2VudDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06YXBwbGljYXRpb24vJHsgYXBwbGljYXRpb25JZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgSW50ZWdyYXRpb24gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL2F1dGgtYW5kLWFjY2Vzcy1jb250cm9sLWlhbS1hY2Nlc3MtY29udHJvbC1pZGVudGl0eS1iYXNlZC5odG1sI2Fybi1mb3JtYXRzXG4gICAqXG4gICAqIEBwYXJhbSBpbnRlZ3JhdGlvbklkIC0gSWRlbnRpZmllciBmb3IgdGhlIGludGVncmF0aW9uSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkludGVncmF0aW9uKGludGVncmF0aW9uSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpzZWN1cml0eWFnZW50OiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTppbnRlZ3JhdGlvbi8keyBpbnRlZ3JhdGlvbklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBQcml2YXRlQ29ubmVjdGlvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZWN1cml0eWFnZW50L2xhdGVzdC91c2VyZ3VpZGUvYXV0aC1hbmQtYWNjZXNzLWNvbnRyb2wtaWFtLWFjY2Vzcy1jb250cm9sLWlkZW50aXR5LWJhc2VkLmh0bWwjYXJuLWZvcm1hdHNcbiAgICpcbiAgICogQHBhcmFtIHByaXZhdGVDb25uZWN0aW9uTmFtZSAtIElkZW50aWZpZXIgZm9yIHRoZSBwcml2YXRlQ29ubmVjdGlvbk5hbWUuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblByaXZhdGVDb25uZWN0aW9uKHByaXZhdGVDb25uZWN0aW9uTmFtZTogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnNlY3VyaXR5YWdlbnQ6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnByaXZhdGUtY29ubmVjdGlvbi8keyBwcml2YXRlQ29ubmVjdGlvbk5hbWUgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIFNlY3VyaXR5UmVxdWlyZW1lbnRQYWNrIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5YWdlbnQvbGF0ZXN0L3VzZXJndWlkZS9hdXRoLWFuZC1hY2Nlc3MtY29udHJvbC1pYW0tYWNjZXNzLWNvbnRyb2wtaWRlbnRpdHktYmFzZWQuaHRtbCNhcm4tZm9ybWF0c1xuICAgKlxuICAgKiBAcGFyYW0gc2VjdXJpdHlSZXF1aXJlbWVudFBhY2tJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBzZWN1cml0eVJlcXVpcmVtZW50UGFja0lkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25TZWN1cml0eVJlcXVpcmVtZW50UGFjayhzZWN1cml0eVJlcXVpcmVtZW50UGFja0lkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06c2VjdXJpdHlhZ2VudDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06c2VjdXJpdHktcmVxdWlyZW1lbnQtcGFjay8keyBzZWN1cml0eVJlcXVpcmVtZW50UGFja0lkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBUYXJnZXREb21haW4gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHlhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL2F1dGgtYW5kLWFjY2Vzcy1jb250cm9sLWlhbS1hY2Nlc3MtY29udHJvbC1pZGVudGl0eS1iYXNlZC5odG1sI2Fybi1mb3JtYXRzXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXREb21haW5JZCAtIElkZW50aWZpZXIgZm9yIHRoZSB0YXJnZXREb21haW5JZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uVGFyZ2V0RG9tYWluKHRhcmdldERvbWFpbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06c2VjdXJpdHlhZ2VudDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06dGFyZ2V0LWRvbWFpbi8keyB0YXJnZXREb21haW5JZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRhZ3MgdGhhdCBhcmUgcGFzc2VkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy1yZXF1ZXN0dGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVBZ2VudFNwYWNlKClcbiAgICogLSAudG9DcmVhdGVBcHBsaWNhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlSW50ZWdyYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZVByaXZhdGVDb25uZWN0aW9uKClcbiAgICogLSAudG9DcmVhdGVTZWN1cml0eVJlcXVpcmVtZW50UGFjaygpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVxdWVzdFRhZyh0YWdLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpSZXF1ZXN0VGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVzb3VyY2V0YWdcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FkZEFydGlmYWN0KClcbiAgICogLSAudG9CYXRjaENyZWF0ZVNlY3VyaXR5UmVxdWlyZW1lbnRzKClcbiAgICogLSAudG9CYXRjaERlbGV0ZUNvZGVSZXZpZXdzKClcbiAgICogLSAudG9CYXRjaERlbGV0ZVBlbnRlc3RzKClcbiAgICogLSAudG9CYXRjaERlbGV0ZVNlY3VyaXR5UmVxdWlyZW1lbnRzKClcbiAgICogLSAudG9CYXRjaERlbGV0ZVRocmVhdE1vZGVscygpXG4gICAqIC0gLnRvQmF0Y2hEZWxldGVUaHJlYXRzKClcbiAgICogLSAudG9CYXRjaEdldEFnZW50U3BhY2VzKClcbiAgICogLSAudG9CYXRjaEdldEFydGlmYWN0TWV0YWRhdGEoKVxuICAgKiAtIC50b0JhdGNoR2V0Q29kZVJldmlld0pvYlRhc2tzKClcbiAgICogLSAudG9CYXRjaEdldENvZGVSZXZpZXdKb2JzKClcbiAgICogLSAudG9CYXRjaEdldENvZGVSZXZpZXdzKClcbiAgICogLSAudG9CYXRjaEdldEZpbmRpbmdzKClcbiAgICogLSAudG9CYXRjaEdldFBlbnRlc3RKb2JDb250ZW50TWV0YWRhdGEoKVxuICAgKiAtIC50b0JhdGNoR2V0UGVudGVzdEpvYlRhc2tzKClcbiAgICogLSAudG9CYXRjaEdldFBlbnRlc3RKb2JzKClcbiAgICogLSAudG9CYXRjaEdldFBlbnRlc3RzKClcbiAgICogLSAudG9CYXRjaEdldFNlY3VyaXR5UmVxdWlyZW1lbnRzKClcbiAgICogLSAudG9CYXRjaEdldFRhcmdldERvbWFpbnMoKVxuICAgKiAtIC50b0JhdGNoR2V0VGhyZWF0TW9kZWxKb2JUYXNrcygpXG4gICAqIC0gLnRvQmF0Y2hHZXRUaHJlYXRNb2RlbEpvYnMoKVxuICAgKiAtIC50b0JhdGNoR2V0VGhyZWF0TW9kZWxzKClcbiAgICogLSAudG9CYXRjaEdldFRocmVhdHMoKVxuICAgKiAtIC50b0JhdGNoVXBkYXRlU2VjdXJpdHlSZXF1aXJlbWVudHMoKVxuICAgKiAtIC50b0NyZWF0ZUNvZGVSZXZpZXcoKVxuICAgKiAtIC50b0NyZWF0ZURlc2lnblJldmlldygpXG4gICAqIC0gLnRvQ3JlYXRlTWVtYmVyc2hpcCgpXG4gICAqIC0gLnRvQ3JlYXRlT25lVGltZUxvZ2luU2Vzc2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlUGVudGVzdCgpXG4gICAqIC0gLnRvQ3JlYXRlU2VjdXJpdHlSZXF1aXJlbWVudCgpXG4gICAqIC0gLnRvQ3JlYXRlVGhyZWF0KClcbiAgICogLSAudG9DcmVhdGVUaHJlYXRNb2RlbCgpXG4gICAqIC0gLnRvRGVsZXRlQWdlbnRTcGFjZSgpXG4gICAqIC0gLnRvRGVsZXRlQXBwbGljYXRpb24oKVxuICAgKiAtIC50b0RlbGV0ZUFydGlmYWN0KClcbiAgICogLSAudG9EZWxldGVEZXNpZ25SZXZpZXcoKVxuICAgKiAtIC50b0RlbGV0ZUludGVncmF0aW9uKClcbiAgICogLSAudG9EZWxldGVNZW1iZXJzaGlwKClcbiAgICogLSAudG9EZWxldGVQcml2YXRlQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlU2VjdXJpdHlSZXF1aXJlbWVudCgpXG4gICAqIC0gLnRvRGVsZXRlU2VjdXJpdHlSZXF1aXJlbWVudFBhY2soKVxuICAgKiAtIC50b0RlbGV0ZVRhcmdldERvbWFpbigpXG4gICAqIC0gLnRvRGVzY3JpYmVQcml2YXRlQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvR2V0QXBwbGljYXRpb24oKVxuICAgKiAtIC50b0dldEFydGlmYWN0KClcbiAgICogLSAudG9HZXREZXNpZ25SZXZpZXcoKVxuICAgKiAtIC50b0dldERlc2lnblJldmlld0FydGlmYWN0KClcbiAgICogLSAudG9HZXREZXNpZ25SZXZpZXdGZWVkYmFjaygpXG4gICAqIC0gLnRvR2V0SW50ZWdyYXRpb24oKVxuICAgKiAtIC50b0dldFNlY3VyaXR5UmVxdWlyZW1lbnQoKVxuICAgKiAtIC50b0dldFNlY3VyaXR5UmVxdWlyZW1lbnRQYWNrKClcbiAgICogLSAudG9JbXBvcnRTZWN1cml0eVJlcXVpcmVtZW50cygpXG4gICAqIC0gLnRvTGlzdEFydGlmYWN0cygpXG4gICAqIC0gLnRvTGlzdENvZGVSZXZpZXdKb2JUYXNrcygpXG4gICAqIC0gLnRvTGlzdENvZGVSZXZpZXdKb2JzRm9yQ29kZVJldmlldygpXG4gICAqIC0gLnRvTGlzdENvZGVSZXZpZXdzKClcbiAgICogLSAudG9MaXN0RGVzaWduUmV2aWV3Q29tbWVudHMoKVxuICAgKiAtIC50b0xpc3REZXNpZ25SZXZpZXdzKClcbiAgICogLSAudG9MaXN0RGlzY292ZXJlZEVuZHBvaW50cygpXG4gICAqIC0gLnRvTGlzdEZpbmRpbmdzKClcbiAgICogLSAudG9MaXN0SW50ZWdyYXRlZFJlc291cmNlcygpXG4gICAqIC0gLnRvTGlzdE1lbWJlcnNoaXBzKClcbiAgICogLSAudG9MaXN0UGVudGVzdEpvYlRhc2tzKClcbiAgICogLSAudG9MaXN0UGVudGVzdEpvYnNGb3JQZW50ZXN0KClcbiAgICogLSAudG9MaXN0UGVudGVzdHMoKVxuICAgKiAtIC50b0xpc3RSZXNvdXJjZXNGcm9tSW50ZWdyYXRpb24oKVxuICAgKiAtIC50b0xpc3RTZWN1cml0eVJlcXVpcmVtZW50cygpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvTGlzdFRocmVhdE1vZGVsSm9iVGFza3MoKVxuICAgKiAtIC50b0xpc3RUaHJlYXRNb2RlbEpvYnMoKVxuICAgKiAtIC50b0xpc3RUaHJlYXRNb2RlbHMoKVxuICAgKiAtIC50b0xpc3RUaHJlYXRzKClcbiAgICogLSAudG9QdXREZXNpZ25SZXZpZXdGZWVkYmFjaygpXG4gICAqIC0gLnRvU3RhcnRDb2RlUmVtZWRpYXRpb24oKVxuICAgKiAtIC50b1N0YXJ0Q29kZVJldmlld0pvYigpXG4gICAqIC0gLnRvU3RhcnRQZW50ZXN0Sm9iKClcbiAgICogLSAudG9TdGFydFRocmVhdE1vZGVsSm9iKClcbiAgICogLSAudG9TdG9wQ29kZVJldmlld0pvYigpXG4gICAqIC0gLnRvU3RvcFBlbnRlc3RKb2IoKVxuICAgKiAtIC50b1N0b3BUaHJlYXRNb2RlbEpvYigpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1RvZ2dsZU1hbmFnZWRTZWN1cml0eVJlcXVpcmVtZW50KClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVBZ2VudFNwYWNlKClcbiAgICogLSAudG9VcGRhdGVBcHBsaWNhdGlvbigpXG4gICAqIC0gLnRvVXBkYXRlQ29kZVJldmlldygpXG4gICAqIC0gLnRvVXBkYXRlRmluZGluZygpXG4gICAqIC0gLnRvVXBkYXRlSW50ZWdyYXRlZFJlc291cmNlcygpXG4gICAqIC0gLnRvVXBkYXRlUGVudGVzdCgpXG4gICAqIC0gLnRvVXBkYXRlUHJpdmF0ZUNvbm5lY3Rpb25DZXJ0aWZpY2F0ZSgpXG4gICAqIC0gLnRvVXBkYXRlU2VjdXJpdHlSZXF1aXJlbWVudCgpXG4gICAqIC0gLnRvVXBkYXRlU2VjdXJpdHlSZXF1aXJlbWVudFBhY2soKVxuICAgKiAtIC50b1VwZGF0ZVRhcmdldERvbWFpbigpXG4gICAqIC0gLnRvVXBkYXRlVGhyZWF0KClcbiAgICogLSAudG9VcGRhdGVUaHJlYXRNb2RlbCgpXG4gICAqIC0gLnRvVmVyaWZ5VGFyZ2V0RG9tYWluKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBBZ2VudFNwYWNlXG4gICAqIC0gQXBwbGljYXRpb25cbiAgICogLSBJbnRlZ3JhdGlvblxuICAgKiAtIFByaXZhdGVDb25uZWN0aW9uXG4gICAqIC0gU2VjdXJpdHlSZXF1aXJlbWVudFBhY2tcbiAgICogLSBUYXJnZXREb21haW5cbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1Jlc291cmNlVGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlJlc291cmNlVGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRhZyBrZXlzIHRoYXQgYXJlIHBhc3NlZCBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtdGFna2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlQWdlbnRTcGFjZSgpXG4gICAqIC0gLnRvQ3JlYXRlQXBwbGljYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUludGVncmF0aW9uKClcbiAgICogLSAudG9DcmVhdGVQcml2YXRlQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlU2VjdXJpdHlSZXF1aXJlbWVudFBhY2soKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBd3NUYWdLZXlzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6VGFnS2V5c2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbc2VjdXJpdHlhZ2VudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3Rfc2VjdXJpdHlhZ2VudC5odG1sKS5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BzPzogaWFtLlBvbGljeVN0YXRlbWVudFByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG59XG4iXX0=