UNPKG

cdk-monitoring-constructs

Version:

[![NPM version](https://badge.fury.io/js/cdk-monitoring-constructs.svg)](https://badge.fury.io/js/cdk-monitoring-constructs) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.cdklabs/cdkmonitoringconstructs/badge.svg)](https://m

157 lines 26.5 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.AwsConsoleUrlFactory = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const monitoring_1 = require("../../monitoring"); class AwsConsoleUrlFactory { constructor(props) { this.awsAccountId = props.awsAccountId; this.awsAccountRegion = props.awsAccountRegion; } getAwsConsoleUrl(destinationUrl) { if (this.awsAccountId) { return aws_cdk_lib_1.Lazy.uncachedString({ produce: (context) => { if (destinationUrl) { return this.getResolvedDestinationUrl(context, destinationUrl); } // simply go to the home page of the AWS console return `https://${this.awsAccountRegion}.console.aws.amazon.com`; }, }); } return undefined; } getApiGatewayUrl(restApiId) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/apigateway/home?region=${region}#/apis/${restApiId}/dashboard`; return this.getAwsConsoleUrl(destinationUrl); } getCloudFrontDistributionUrl(distributionId) { const destinationUrl = `https://console.aws.amazon.com/cloudfront/v2/home#/monitoring/${distributionId}`; return this.getAwsConsoleUrl(destinationUrl); } getCloudWatchLogGroupUrl(logGroupName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/cloudwatch/home?region=${region}#logsV2:log-groups/log-group/${logGroupName}`; return this.getAwsConsoleUrl(destinationUrl); } getCodeBuildProjectUrl(projectName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/codebuild/home?region=${region}#/projects/${projectName}`; return this.getAwsConsoleUrl(destinationUrl); } getDocumentDbClusterUrl(clusterId) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/docdb/home?region=${region}#cluster-details/${clusterId}`; return this.getAwsConsoleUrl(destinationUrl); } getDynamoTableUrl(tableName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/dynamodb/home?region=${region}#tables:selected=${tableName}`; return this.getAwsConsoleUrl(destinationUrl); } getElastiCacheClusterUrl(clusterId, clusterType) { const region = this.awsAccountRegion; switch (clusterType) { case monitoring_1.ElastiCacheClusterType.MEMCACHED: const destinationUrlMemcached = `https://${region}.console.aws.amazon.com/elasticache/home?region=${region}#/memcached/${clusterId}`; return this.getAwsConsoleUrl(destinationUrlMemcached); case monitoring_1.ElastiCacheClusterType.REDIS: const destinationUrlRedis = `https://${region}.console.aws.amazon.com/elasticache/home?region=${region}#/redis/${clusterId}`; return this.getAwsConsoleUrl(destinationUrlRedis); default: throw new Error(`Invalid cache type: ${clusterType}`); } } getKinesisAnalyticsUrl(application) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/kinesisanalytics/home?region=${region}#/details?applicationName=${application}`; return this.getAwsConsoleUrl(destinationUrl); } getKinesisDataStreamUrl(streamName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/kinesis/home?region=${region}#/streams/details/${streamName}/monitoring`; return this.getAwsConsoleUrl(destinationUrl); } getKinesisFirehoseDeliveryStreamUrl(streamName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/firehose/home?region=${region}#/details/${streamName}/monitoring`; return this.getAwsConsoleUrl(destinationUrl); } getLambdaFunctionUrl(functionName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/lambda/home?region=${region}#/functions/${functionName}`; return this.getAwsConsoleUrl(destinationUrl); } getOpenSearchClusterUrl(domainName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/es/home?region=${region}#domain:resource=${domainName};action=dashboard;tab=TAB_CLUSTER_HEALTH_ID_V2`; return this.getAwsConsoleUrl(destinationUrl); } getOpenSearchServerlessCollectionUrl(collectionName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/aos/home?region=${region}#opensearch/collections/${collectionName}`; return this.getAwsConsoleUrl(destinationUrl); } getOsisPipelineUrl(pipelineName) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/aos/osis/home?region=${region}#osis/ingestion-pipelines/${pipelineName}`; return this.getAwsConsoleUrl(destinationUrl); } getRdsClusterUrl(clusterId) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/rds/home?region=${region}#database:id=${clusterId};is-cluster=true;tab=monitoring`; return this.getAwsConsoleUrl(destinationUrl); } getRdsInstanceUrl(instanceId) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/rds/home?region=${region}#database:id=${instanceId};is-cluster=false;tab=monitoring`; return this.getAwsConsoleUrl(destinationUrl); } getRedshiftClusterUrl(clusterId) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/redshiftv2/home?region=${region}#cluster-details?cluster=${clusterId}`; return this.getAwsConsoleUrl(destinationUrl); } getSnsTopicUrl(topicArn) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/sns/v3/home?region=${region}#/topic/${topicArn}`; return this.getAwsConsoleUrl(destinationUrl); } getStateMachineUrl(stateMachineArn) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/states/home?region=${region}#/statemachines/view/${stateMachineArn}`; return this.getAwsConsoleUrl(destinationUrl); } getSqsQueueUrl(queueUrl) { const region = this.awsAccountRegion; const destinationUrl = `https://${region}.console.aws.amazon.com/sqs/v3/home?region=${region}#/queues/${queueUrl}`; return this.getAwsConsoleUrl(destinationUrl); } getS3BucketUrl(bucketName) { const region = this.awsAccountRegion; const destinationUrl = `https://s3.console.aws.amazon.com/s3/buckets/${bucketName}?region=${region}&tab=metrics`; return this.getAwsConsoleUrl(destinationUrl); } /** * Resolves a destination URL within a resolution context. * @param context The resolution context. * @param destinationUrl The destination URL to resolve since it may contain CDK tokens. * @see https://docs.aws.amazon.com/cdk/latest/guide/tokens.html */ getResolvedDestinationUrl(context, destinationUrl) { let resolvedDestination = context.resolve(destinationUrl); if (typeof resolvedDestination !== "string") { // keep unresolved since we do not know how to deal with objects resolvedDestination = destinationUrl; } return resolvedDestination; } } exports.AwsConsoleUrlFactory = AwsConsoleUrlFactory; _a = JSII_RTTI_SYMBOL_1; AwsConsoleUrlFactory[_a] = { fqn: "cdk-monitoring-constructs.AwsConsoleUrlFactory", version: "9.15.2" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXdzQ29uc29sZVVybEZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBd3NDb25zb2xlVXJsRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFvRDtBQUVwRCxpREFBMEQ7QUFPMUQsTUFBYSxvQkFBb0I7SUFJL0IsWUFBWSxLQUFnQztRQUMxQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztJQUNqRCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsY0FBdUI7UUFDdEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLE9BQU8sa0JBQUksQ0FBQyxjQUFjLENBQUM7Z0JBQ3pCLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNuQixJQUFJLGNBQWMsRUFBRTt3QkFDbEIsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO3FCQUNoRTtvQkFDRCxnREFBZ0Q7b0JBQ2hELE9BQU8sV0FBVyxJQUFJLENBQUMsZ0JBQWdCLHlCQUF5QixDQUFDO2dCQUNuRSxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsU0FBaUI7UUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLFdBQVcsTUFBTSxrREFBa0QsTUFBTSxVQUFVLFNBQVMsWUFBWSxDQUFDO1FBQ2hJLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCw0QkFBNEIsQ0FBQyxjQUFzQjtRQUNqRCxNQUFNLGNBQWMsR0FBRyxpRUFBaUUsY0FBYyxFQUFFLENBQUM7UUFDekcsT0FBTyxJQUFJLENB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QixDQUFDO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLFdBQVcsTUFBTSw4Q0FBOEMsTUFBTSxZQUFZLFFBQVEsRUFBRSxDQUFDO1FBQ25ILE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxjQUFjLENBQUMsVUFBa0I7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLGdEQUFnRCxVQUFVLFdBQVcsTUFBTSxjQUFjLENBQUM7UUFDakgsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08seUJBQXlCLENBQ2pDLE9BQXdCLEVBQ3hCLGNBQXNCO1FBRXRCLElBQUksbUJBQW1CLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUUxRCxJQUFJLE9BQU8sbUJBQW1CLEtBQUssUUFBUSxFQUFFO1lBQzNDLGdFQUFnRTtZQUNoRSxtQkFBbUIsR0FBRyxjQUFjLENBQUM7U0FDdEM7UUFFRCxPQUFPLG1CQUFtQixDQUFDO0lBQzdCLENBQUM7O0FBcExILG9EQXFMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElSZXNvbHZlQ29udGV4dCwgTGF6eSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5pbXBvcnQgeyBFbGFzdGlDYWNoZUNsdXN0ZXJUeXBlIH0gZnJvbSBcIi4uLy4uL21vbml0b3JpbmdcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBd3NDb25zb2xlVXJsRmFjdG9yeVByb3BzIHtcbiAgcmVhZG9ubHkgYXdzQWNjb3VudElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGF3c0FjY291bnRSZWdpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEF3c0NvbnNvbGVVcmxGYWN0b3J5IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGF3c0FjY291bnRJZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXdzQWNjb3VudFJlZ2lvbjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBBd3NDb25zb2xlVXJsRmFjdG9yeVByb3BzKSB7XG4gICAgdGhpcy5hd3NBY2NvdW50SWQgPSBwcm9wcy5hd3NBY2NvdW50SWQ7XG4gICAgdGhpcy5hd3NBY2NvdW50UmVnaW9uID0gcHJvcHMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgfVxuXG4gIGdldEF3c0NvbnNvbGVVcmwoZGVzdGluYXRpb25Vcmw/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmF3c0FjY291bnRJZCkge1xuICAgICAgcmV0dXJuIExhenkudW5jYWNoZWRTdHJpbmcoe1xuICAgICAgICBwcm9kdWNlOiAoY29udGV4dCkgPT4ge1xuICAgICAgICAgIGlmIChkZXN0aW5hdGlvblVybCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzb2x2ZWREZXN0aW5hdGlvblVybChjb250ZXh0LCBkZXN0aW5hdGlvblVybCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHNpbXBseSBnbyB0byB0aGUgaG9tZSBwYWdlIG9mIHRoZSBBV1MgY29uc29sZVxuICAgICAgICAgIHJldHVybiBgaHR0cHM6Ly8ke3RoaXMuYXdzQWNjb3VudFJlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbWA7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldEFwaUdhdGV3YXlVcmwocmVzdEFwaUlkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblVybCA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvaG9tZT9yZWdpb249JHtyZWdpb259Iy9hcGlzLyR7cmVzdEFwaUlkfS9kYXNoYm9hcmRgO1xuICAgIHJldHVybiB0aGlzLmdldEF3c0NvbnNvbGVVcmwoZGVzdGluYXRpb25VcmwpO1xuICB9XG5cbiAgZ2V0Q2xvdWRGcm9udERpc3RyaWJ1dGlvblVybChkaXN0cmlidXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkZXN0aW5hdGlvblVybCA9IGBodHRwczovL2NvbnNvbGUuYXdzLmFtYXpvbi5jb20vY2xvdWRmcm9udC92Mi9ob21lIy9tb25pdG9yaW5nLyR7ZGlzdHJpYnV0aW9uSWR9YDtcbiAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsKTtcbiAgfVxuXG4gIGdldENsb3VkV2F0Y2hMb2dHcm91cFVybChsb2dHcm91cE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5hd3NBY2NvdW50UmVnaW9uO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uVXJsID0gYGh0dHBzOi8vJHtyZWdpb259LmNvbnNvbGUuYXdzLmFtYXpvbi5jb20vY2xvdWR3YXRjaC9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jbG9nc1YyOmxvZy1ncm91cHMvbG9nLWdyb3VwLyR7bG9nR3JvdXBOYW1lfWA7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybCk7XG4gIH1cblxuICBnZXRDb2RlQnVpbGRQcm9qZWN0VXJsKHByb2plY3ROYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblVybCA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL2NvZGVidWlsZC9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jL3Byb2plY3RzLyR7cHJvamVjdE5hbWV9YDtcbiAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsKTtcbiAgfVxuXG4gIGdldERvY3VtZW50RGJDbHVzdGVyVXJsKGNsdXN0ZXJJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9kb2NkYi9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jY2x1c3Rlci1kZXRhaWxzLyR7Y2x1c3RlcklkfWA7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybCk7XG4gIH1cblxuICBnZXREeW5hbW9UYWJsZVVybCh0YWJsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5hd3NBY2NvdW50UmVnaW9uO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uVXJsID0gYGh0dHBzOi8vJHtyZWdpb259LmNvbnNvbGUuYXdzLmFtYXpvbi5jb20vZHluYW1vZGIvaG9tZT9yZWdpb249JHtyZWdpb259I3RhYmxlczpzZWxlY3RlZD0ke3RhYmxlTmFtZX1gO1xuICAgIHJldHVybiB0aGlzLmdldEF3c0NvbnNvbGVVcmwoZGVzdGluYXRpb25VcmwpO1xuICB9XG5cbiAgZ2V0RWxhc3RpQ2FjaGVDbHVzdGVyVXJsKFxuICAgIGNsdXN0ZXJJZDogc3RyaW5nLFxuICAgIGNsdXN0ZXJUeXBlOiBFbGFzdGlDYWNoZUNsdXN0ZXJUeXBlLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgICBzd2l0Y2ggKGNsdXN0ZXJUeXBlKSB7XG4gICAgICBjYXNlIEVsYXN0aUNhY2hlQ2x1c3RlclR5cGUuTUVNQ0FDSEVEOlxuICAgICAgICBjb25zdCBkZXN0aW5hdGlvblVybE1lbWNhY2hlZCA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL2VsYXN0aWNhY2hlL2hvbWU/cmVnaW9uPSR7cmVnaW9ufSMvbWVtY2FjaGVkLyR7Y2x1c3RlcklkfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEF3c0NvbnNvbGVVcmwoZGVzdGluYXRpb25VcmxNZW1jYWNoZWQpO1xuICAgICAgY2FzZSBFbGFzdGlDYWNoZUNsdXN0ZXJUeXBlLlJFRElTOlxuICAgICAgICBjb25zdCBkZXN0aW5hdGlvblVybFJlZGlzID0gYGh0dHBzOi8vJHtyZWdpb259LmNvbnNvbGUuYXdzLmFtYXpvbi5jb20vZWxhc3RpY2FjaGUvaG9tZT9yZWdpb249JHtyZWdpb259Iy9yZWRpcy8ke2NsdXN0ZXJJZH1gO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsUmVkaXMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNhY2hlIHR5cGU6ICR7Y2x1c3RlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0S2luZXNpc0FuYWx5dGljc1VybChhcHBsaWNhdGlvbjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9raW5lc2lzYW5hbHl0aWNzL2hvbWU/cmVnaW9uPSR7cmVnaW9ufSMvZGV0YWlscz9hcHBsaWNhdGlvbk5hbWU9JHthcHBsaWNhdGlvbn1gO1xuICAgIHJldHVybiB0aGlzLmdldEF3c0NvbnNvbGVVcmwoZGVzdGluYXRpb25VcmwpO1xuICB9XG5cbiAgZ2V0S2luZXNpc0RhdGFTdHJlYW1Vcmwoc3RyZWFtTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9raW5lc2lzL2hvbWU/cmVnaW9uPSR7cmVnaW9ufSMvc3RyZWFtcy9kZXRhaWxzLyR7c3RyZWFtTmFtZX0vbW9uaXRvcmluZ2A7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybCk7XG4gIH1cblxuICBnZXRLaW5lc2lzRmlyZWhvc2VEZWxpdmVyeVN0cmVhbVVybChzdHJlYW1OYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblVybCA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL2ZpcmVob3NlL2hvbWU/cmVnaW9uPSR7cmVnaW9ufSMvZGV0YWlscy8ke3N0cmVhbU5hbWV9L21vbml0b3JpbmdgO1xuICAgIHJldHVybiB0aGlzLmdldEF3c0NvbnNvbGVVcmwoZGVzdGluYXRpb25VcmwpO1xuICB9XG5cbiAgZ2V0TGFtYmRhRnVuY3Rpb25VcmwoZnVuY3Rpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblVybCA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL2xhbWJkYS9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jL2Z1bmN0aW9ucy8ke2Z1bmN0aW9uTmFtZX1gO1xuICAgIHJldHVybiB0aGlzLmdldEF3c0NvbnNvbGVVcmwoZGVzdGluYXRpb25VcmwpO1xuICB9XG5cbiAgZ2V0T3BlblNlYXJjaENsdXN0ZXJVcmwoZG9tYWluTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9lcy9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jZG9tYWluOnJlc291cmNlPSR7ZG9tYWluTmFtZX07YWN0aW9uPWRhc2hib2FyZDt0YWI9VEFCX0NMVVNURVJfSEVBTFRIX0lEX1YyYDtcbiAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsKTtcbiAgfVxuXG4gIGdldE9wZW5TZWFyY2hTZXJ2ZXJsZXNzQ29sbGVjdGlvblVybChcbiAgICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblVybCA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL2Fvcy9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jb3BlbnNlYXJjaC9jb2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25OYW1lfWA7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybCk7XG4gIH1cblxuICBnZXRPc2lzUGlwZWxpbmVVcmwocGlwZWxpbmVOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblVybCA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL2Fvcy9vc2lzL2hvbWU/cmVnaW9uPSR7cmVnaW9ufSNvc2lzL2luZ2VzdGlvbi1waXBlbGluZXMvJHtwaXBlbGluZU5hbWV9YDtcbiAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsKTtcbiAgfVxuXG4gIGdldFJkc0NsdXN0ZXJVcmwoY2x1c3RlcklkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblVybCA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL3Jkcy9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jZGF0YWJhc2U6aWQ9JHtjbHVzdGVySWR9O2lzLWNsdXN0ZXI9dHJ1ZTt0YWI9bW9uaXRvcmluZ2A7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybCk7XG4gIH1cblxuICBnZXRSZHNJbnN0YW5jZVVybChpbnN0YW5jZUlkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblVybCA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL3Jkcy9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jZGF0YWJhc2U6aWQ9JHtpbnN0YW5jZUlkfTtpcy1jbHVzdGVyPWZhbHNlO3RhYj1tb25pdG9yaW5nYDtcbiAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsKTtcbiAgfVxuXG4gIGdldFJlZHNoaWZ0Q2x1c3RlclVybChjbHVzdGVySWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5hd3NBY2NvdW50UmVnaW9uO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uVXJsID0gYGh0dHBzOi8vJHtyZWdpb259LmNvbnNvbGUuYXdzLmFtYXpvbi5jb20vcmVkc2hpZnR2Mi9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jY2x1c3Rlci1kZXRhaWxzP2NsdXN0ZXI9JHtjbHVzdGVySWR9YDtcbiAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsKTtcbiAgfVxuXG4gIGdldFNuc1RvcGljVXJsKHRvcGljQXJuOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXdzQWNjb3VudFJlZ2lvbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblVybCA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL3Nucy92My9ob21lP3JlZ2lvbj0ke3JlZ2lvbn0jL3RvcGljLyR7dG9waWNBcm59YDtcbiAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsKTtcbiAgfVxuXG4gIGdldFN0YXRlTWFjaGluZVVybChzdGF0ZU1hY2hpbmVBcm46IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5hd3NBY2NvdW50UmVnaW9uO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uVXJsID0gYGh0dHBzOi8vJHtyZWdpb259LmNvbnNvbGUuYXdzLmFtYXpvbi5jb20vc3RhdGVzL2hvbWU/cmVnaW9uPSR7cmVnaW9ufSMvc3RhdGVtYWNoaW5lcy92aWV3LyR7c3RhdGVNYWNoaW5lQXJufWA7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXdzQ29uc29sZVVybChkZXN0aW5hdGlvblVybCk7XG4gIH1cblxuICBnZXRTcXNRdWV1ZVVybChxdWV1ZVVybDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9zcXMvdjMvaG9tZT9yZWdpb249JHtyZWdpb259Iy9xdWV1ZXMvJHtxdWV1ZVVybH1gO1xuICAgIHJldHVybiB0aGlzLmdldEF3c0NvbnNvbGVVcmwoZGVzdGluYXRpb25VcmwpO1xuICB9XG5cbiAgZ2V0UzNCdWNrZXRVcmwoYnVja2V0TmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLmF3c0FjY291bnRSZWdpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSBgaHR0cHM6Ly9zMy5jb25zb2xlLmF3cy5hbWF6b24uY29tL3MzL2J1Y2tldHMvJHtidWNrZXROYW1lfT9yZWdpb249JHtyZWdpb259JnRhYj1tZXRyaWNzYDtcbiAgICByZXR1cm4gdGhpcy5nZXRBd3NDb25zb2xlVXJsKGRlc3RpbmF0aW9uVXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIGRlc3RpbmF0aW9uIFVSTCB3aXRoaW4gYSByZXNvbHV0aW9uIGNvbnRleHQuXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSByZXNvbHV0aW9uIGNvbnRleHQuXG4gICAqIEBwYXJhbSBkZXN0aW5hdGlvblVybCBUaGUgZGVzdGluYXRpb24gVVJMIHRvIHJlc29sdmUgc2luY2UgaXQgbWF5IGNvbnRhaW4gQ0RLIHRva2Vucy5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2RrL2xhdGVzdC9ndWlkZS90b2tlbnMuaHRtbFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFJlc29sdmVkRGVzdGluYXRpb25VcmwoXG4gICAgY29udGV4dDogSVJlc29sdmVDb250ZXh0LFxuICAgIGRlc3RpbmF0aW9uVXJsOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHJlc29sdmVkRGVzdGluYXRpb24gPSBjb250ZXh0LnJlc29sdmUoZGVzdGluYXRpb25VcmwpO1xuXG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZERlc3RpbmF0aW9uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAvLyBrZWVwIHVucmVzb2x2ZWQgc2luY2Ugd2UgZG8gbm90IGtub3cgaG93IHRvIGRlYWwgd2l0aCBvYmplY3RzXG4gICAgICByZXNvbHZlZERlc3RpbmF0aW9uID0gZGVzdGluYXRpb25Vcmw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkRGVzdGluYXRpb247XG4gIH1cbn1cbiJdfQ==