UNPKG

@cdklabs/cdk-amazonmq

Version:
252 lines 38.7 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.RabbitMqBrokerDeploymentBase = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); /* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ const aws_cdk_lib_1 = require("aws-cdk-lib"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const aws_ec2_1 = require("aws-cdk-lib/aws-ec2"); const rabbitmq_broker_configuration_1 = require("./rabbitmq-broker-configuration"); const broker_deployment_1 = require("../broker-deployment"); class RabbitMqBrokerDeploymentBase extends broker_deployment_1.BrokerDeploymentBase { /** * * @internal */ static _fromRabbitMqBrokerDeploymentBase(scope, logicalId, arn, name, id, securityGroups, urlSuffix) { if ((name === undefined || id === undefined) && arn === undefined) { throw new Error("Either the pair 'name' and 'id', or 'arn' needs to be defined"); } class Import extends aws_cdk_lib_1.Resource { constructor() { super(scope, logicalId); this.connections = securityGroups ? new aws_ec2_1.Connections({ securityGroups }) : undefined; this._engineVersion = "UNKNOWN"; this.arn = arn ? arn : aws_cdk_lib_1.Stack.of(this).formatArn({ service: "mq", resource: "broker", resourceName: `${name}:${id}`, arnFormat: aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME, }); this.name = name ? name : aws_cdk_lib_1.Arn.split(arn, aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME).resourceName.split(":")[0]; this.id = id ? id : aws_cdk_lib_1.Arn.split(arn, aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME).resourceName.split(":")[1]; const self = this; this.urlSuffix = urlSuffix; this.endpoints = { amqp: { get url() { if (self.urlSuffix !== undefined) { return `amqps://${self.id}.mq.${aws_cdk_lib_1.Aws.REGION}.${self.urlSuffix}:5671`; } throw new Error("To use the endpoints.amqp.url property of an imported broker urlSuffix needs to be specified on intialization"); }, port: 5671, }, console: { get url() { if (self.urlSuffix !== undefined) { return `https://${self.id}.mq.${aws_cdk_lib_1.Aws.REGION}.${self.urlSuffix}`; } throw new Error("To use the endpoints.console.url property of an imported broker urlSuffix needs to be specified on intialization"); }, port: 443, }, }; } metric(metricName, options) { return new aws_cloudwatch_1.Metric({ namespace: "AWS/AmazonMQ", metricName, dimensionsMap: { Broker: this.id, }, ...options, }); } metricExchangeCount(props) { return this.metric("ExchangeCount", props); } metricQueueCount(props) { return this.metric("QueueCount", props); } metricConnectionCount(props) { return this.metric("ConnectionCount", props); } metricChannelCount(props) { return this.metric("ChannelCount", props); } metricConsumerCount(props) { return this.metric("ConsumerCount", props); } metricMessageCount(props) { return this.metric("MessageCount", props); } metricMessageReadyCount(props) { return this.metric("MessageReadyCount", props); } metricMessageUnacknowledgedCount(props) { return this.metric("MessageUnacknowledgedCount", props); } metricPublishRate(props) { return this.metric("PublishRate", props); } metricConfirmRate(props) { return this.metric("ConfirmRate", props); } metricAckRate(props) { return this.metric("AckRate", props); } metricSystemCpuUtilization(props) { return this.metric("SystemCpuUtilization", props); } metricRabbitMQMemLimit(props) { return this.metric("RabbitMQMemLimit", props); } metricRabbitMQMemUsed(props) { return this.metric("RabbitMQMemUsed", props); } metricRabbitMQDiskFreeLimit(props) { return this.metric("RabbitMQDiskFreeLimit", props); } metricRabbitMQDiskFree(props) { return this.metric("RabbitMQDiskFree", props); } metricRabbitMQFdUsed(props) { return this.metric("RabbitMQFdUsed", props); } metricRabbitMQIOReadAverageTime(props) { return this.metric("RabbitMQIOReadAverageTime", props); } metricRabbitMQIOWriteAverageTime(props) { return this.metric("RabbitMQIOWriteAverageTime", props); } } return new Import(); } constructor(scope, id, props) { const { admin, userManagement } = props; if (admin && userManagement) { throw new Error("Only one of 'admin' or 'userManagement' can be specified"); } if (admin === undefined && userManagement === undefined) { throw new Error("One of 'admin' or 'userManagement' needs to be specified"); } const { users, authenticationStrategy } = userManagement ? userManagement.render() : { users: [ { username: admin.username, password: admin.password.unsafeUnwrap(), }, ], authenticationStrategy: undefined, }; super(scope, id, { ...props, version: props.version.toString(), defaultPort: aws_ec2_1.Port.tcp(5671), engine: broker_deployment_1.BrokerEngine.RABBITMQ, users, authenticationStrategy, cloudwatchLogsExports: props.cloudwatchLogsExports, }); this.endpoints = { amqp: { url: aws_cdk_lib_1.Fn.select(0, this._resource.attrAmqpEndpoints), port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(0, this._resource.attrAmqpEndpoints)))), }, console: { url: `https:${aws_cdk_lib_1.Fn.select(1, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(0, this._resource.attrAmqpEndpoints)))}`, port: 443, }, }; this._configuration = props.configuration ?? rabbitmq_broker_configuration_1.RabbitMqBrokerConfiguration.fromAttributes(this, "Configuration", { id: this._resource.attrConfigurationId, revision: this._resource.attrConfigurationRevision, }); } // public withConfiguration(id: string, options: RabbitMqBrokerConfigurationOptions): IRabbitMqBrokerConfiguration { // const configuration = new RabbitMqBrokerConfiguration(this.node.scope!, id, { // engineVersion: this.engineVersion, // ...options, // }); // this._attachConfiguration(configuration); // return configuration; // } metricExchangeCount(props) { return this.metric("ExchangeCount", props); } metricQueueCount(props) { return this.metric("QueueCount", props); } metricConnectionCount(props) { return this.metric("ConnectionCount", props); } metricChannelCount(props) { return this.metric("ChannelCount", props); } metricConsumerCount(props) { return this.metric("ConsumerCount", props); } metricMessageCount(props) { return this.metric("MessageCount", props); } metricMessageReadyCount(props) { return this.metric("MessageReadyCount", props); } metricMessageUnacknowledgedCount(props) { return this.metric("MessageUnacknowledgedCount", props); } metricPublishRate(props) { return this.metric("PublishRate", props); } metricConfirmRate(props) { return this.metric("ConfirmRate", props); } metricAckRate(props) { return this.metric("AckRate", props); } metricSystemCpuUtilization(props) { return this.metric("SystemCpuUtilization", props); } metricRabbitMQMemLimit(props) { return this.metric("RabbitMQMemLimit", props); } metricRabbitMQMemUsed(props) { return this.metric("RabbitMQMemUsed", props); } metricRabbitMQDiskFreeLimit(props) { return this.metric("RabbitMQDiskFreeLimit", props); } metricRabbitMQDiskFree(props) { return this.metric("RabbitMQDiskFree", props); } metricRabbitMQFdUsed(props) { return this.metric("RabbitMQFdUsed", props); } metricRabbitMQIOReadAverageTime(props) { return this.metric("RabbitMQIOReadAverageTime", props); } metricRabbitMQIOWriteAverageTime(props) { return this.metric("RabbitMQIOWriteAverageTime", props); } } exports.RabbitMqBrokerDeploymentBase = RabbitMqBrokerDeploymentBase; _a = JSII_RTTI_SYMBOL_1; RabbitMqBrokerDeploymentBase[_a] = { fqn: "@cdklabs/cdk-amazonmq.RabbitMqBrokerDeploymentBase", version: "0.1.8" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFiYml0bXEtYnJva2VyLWRlcGxveW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmFiYml0bXEvcmFiYml0bXEtYnJva2VyLWRlcGxveW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7O0VBR0U7QUFDRiw2Q0FBOEU7QUFDOUUsK0RBQW1FO0FBQ25FLGlEQUF3RTtBQUl4RSxtRkFHeUM7QUFHekMsNERBSzhCO0FBNkY5QixNQUFzQiw0QkFDcEIsU0FBUSx3Q0FBb0I7SUFHNUI7OztPQUdHO0lBQ08sTUFBTSxDQUFDLGlDQUFpQyxDQUNoRCxLQUFnQixFQUNoQixTQUFpQixFQUNqQixHQUFZLEVBQ1osSUFBYSxFQUNiLEVBQVcsRUFDWCxjQUFpQyxFQUNqQyxTQUFrQjtRQUVsQixJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxFQUFFLEtBQUssU0FBUyxDQUFDLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0RBQStELENBQ2hFLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxNQUFPLFNBQVEsc0JBQVE7WUFhM0I7Z0JBQ0UsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFQMUIsZ0JBQVcsR0FBNEIsY0FBYztvQkFDbkQsQ0FBQyxDQUFDLElBQUkscUJBQVcsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDO29CQUNyQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUVkLG1CQUFjLEdBQVcsU0FBUyxDQUFDO2dCQUlqQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUc7b0JBQ1osQ0FBQyxDQUFDLEdBQUc7b0JBQ0wsQ0FBQyxDQUFDLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQzt3QkFDdkIsT0FBTyxFQUFFLElBQUk7d0JBQ2IsUUFBUSxFQUFFLFFBQVE7d0JBQ2xCLFlBQVksRUFBRSxH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QUFxQjtRQUMzRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUQsQ0FBQzs7QUExVUgsb0VBMlVDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiovXG5pbXBvcnQgeyBBcm4sIEFybkZvcm1hdCwgQXdzLCBGbiwgUmVzb3VyY2UsIFN0YWNrLCBUb2tlbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgTWV0cmljLCBNZXRyaWNPcHRpb25zIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9ucywgSVNlY3VyaXR5R3JvdXAsIFBvcnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFkbWluIH0gZnJvbSBcIi4vYWRtaW5cIjtcbmltcG9ydCB7IElSYWJiaXRNcUJyb2tlciB9IGZyb20gXCIuL3JhYmJpdG1xLWJyb2tlclwiO1xuaW1wb3J0IHtcbiAgSVJhYmJpdE1xQnJva2VyQ29uZmlndXJhdGlvbixcbiAgUmFiYml0TXFCcm9rZXJDb25maWd1cmF0aW9uLFxufSBmcm9tIFwiLi9yYWJiaXRtcS1icm9rZXItY29uZmlndXJhdGlvblwiO1xuaW1wb3J0IHsgUmFiYml0TXFCcm9rZXJFbmRwb2ludHMgfSBmcm9tIFwiLi9yYWJiaXRtcS1icm9rZXItZW5kcG9pbnRzXCI7XG5pbXBvcnQgeyBSYWJiaXRNcUJyb2tlckVuZ2luZVZlcnNpb24gfSBmcm9tIFwiLi9yYWJiaXRtcS1icm9rZXItZW5naW5lLXZlcnNpb25cIjtcbmltcG9ydCB7XG4gIEJyb2tlckRlcGxveW1lbnRCYXNlLFxuICBCcm9rZXJFbmdpbmUsXG4gIEJyb2tlckRlcGxveW1lbnRQcm9wcyxcbiAgSUJyb2tlckRlcGxveW1lbnQsXG59IGZyb20gXCIuLi9icm9rZXItZGVwbG95bWVudFwiO1xuaW1wb3J0IHsgQnJva2VyRGVwbG95bWVudE1vZGUgfSBmcm9tIFwiLi4vYnJva2VyLWRlcGxveW1lbnQtbW9kZVwiO1xuaW1wb3J0IHsgSVJhYmJpdE1xQnJva2VyVXNlck1hbmFnZW1lbnQgfSBmcm9tIFwiLi91c2VybWFuYWdlbWVudC9yYWJiaXRtcS1icm9rZXItdXNlci1tYW5hZ2VtZW50XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFiYml0TXFDbG91ZHdhdGNoTG9nc0V4cG9ydHMge1xuICAvKipcbiAgICogRXhwb3J0IGdlbmVyYWwgbG9ncyB0byBDbG91ZFdhdGNoLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZDsgZG8gbm90IGV4cG9ydCBnZW5lcmFsIGxvZ3MuXG4gICAqL1xuICByZWFkb25seSBnZW5lcmFsPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSYWJiaXRNcUJyb2tlckRlcGxveW1lbnRQcm9wcyBleHRlbmRzIEJyb2tlckRlcGxveW1lbnRQcm9wcyB7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjcmVkZW50aWFscyBvZiB0aGUgYnJva2VyIGFkbWluaXN0cmF0aXZlIHVzZXIuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIC0gcHJlZmVyIHVzZXJNYW5hZ2VtZW50XG4gICAqL1xuICByZWFkb25seSBhZG1pbj86IEFkbWluO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBSYWJiaXRNcSBicm9rZXIgdXNlciBtYW5hZ2VtZW50XG4gICAqL1xuICByZWFkb25seSB1c2VyTWFuYWdlbWVudD86IElSYWJiaXRNcUJyb2tlclVzZXJNYW5hZ2VtZW50O1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2ZXJzaW9uIG9mIHRoZSBicm9rZXIgZW5naW5lLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogUmFiYml0TXFCcm9rZXJFbmdpbmVWZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBicm9rZXIuXG4gICAqL1xuICByZWFkb25seSBjb25maWd1cmF0aW9uPzogSVJhYmJpdE1xQnJva2VyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogU2V0cyB0aGUgQ2xvdWRXYXRjaCBsb2dzIGV4cG9ydHMgZm9yIHRoZSBicm9rZXIuXG4gICAqL1xuICByZWFkb25seSBjbG91ZHdhdGNoTG9nc0V4cG9ydHM/OiBSYWJiaXRNcUNsb3Vkd2F0Y2hMb2dzRXhwb3J0cztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSYWJiaXRNcUJyb2tlckRlcGxveW1lbnRCYXNlUHJvcHNcbiAgZXh0ZW5kcyBSYWJiaXRNcUJyb2tlckRlcGxveW1lbnRQcm9wcyB7XG4gIHJlYWRvbmx5IGRlcGxveW1lbnRNb2RlOiBCcm9rZXJEZXBsb3ltZW50TW9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUmFiYml0TXFCcm9rZXJEZXBsb3ltZW50IGV4dGVuZHMgSUJyb2tlckRlcGxveW1lbnQge1xuICBtZXRyaWNFeGNoYW5nZUNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNRdWV1ZUNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNDb25uZWN0aW9uQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY0NoYW5uZWxDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljQ29uc3VtZXJDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljTWVzc2FnZUNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNNZXNzYWdlUmVhZHlDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljTWVzc2FnZVVuYWNrbm93bGVkZ2VkQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY1B1Ymxpc2hSYXRlKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNDb25maXJtUmF0ZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljQWNrUmF0ZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljU3lzdGVtQ3B1VXRpbGl6YXRpb24ocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY1JhYmJpdE1RTWVtTGltaXQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY1JhYmJpdE1RTWVtVXNlZChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljU3lzdGVtQ3B1VXRpbGl6YXRpb24ocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY1JhYmJpdE1RTWVtTGltaXQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY1JhYmJpdE1RTWVtVXNlZChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljUmFiYml0TVFEaXNrRnJlZUxpbWl0KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNSYWJiaXRNUURpc2tGcmVlKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNSYWJiaXRNUUZkVXNlZChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljUmFiYml0TVFJT1JlYWRBdmVyYWdlVGltZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljUmFiYml0TVFJT1dyaXRlQXZlcmFnZVRpbWUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmFiYml0TXFCcm9rZXJEZXBsb3ltZW50QmFzZVxuICBleHRlbmRzIEJyb2tlckRlcGxveW1lbnRCYXNlXG4gIGltcGxlbWVudHMgSVJhYmJpdE1xQnJva2VyRGVwbG95bWVudCwgSVJhYmJpdE1xQnJva2VyXG57XG4gIC8qKlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgX2Zyb21SYWJiaXRNcUJyb2tlckRlcGxveW1lbnRCYXNlKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgbG9naWNhbElkOiBzdHJpbmcsXG4gICAgYXJuPzogc3RyaW5nLFxuICAgIG5hbWU/OiBzdHJpbmcsXG4gICAgaWQ/OiBzdHJpbmcsXG4gICAgc2VjdXJpdHlHcm91cHM/OiBJU2VjdXJpdHlHcm91cFtdLFxuICAgIHVybFN1ZmZpeD86IHN0cmluZyxcbiAgKTogSVJhYmJpdE1xQnJva2VyRGVwbG95bWVudCB7XG4gICAgaWYgKChuYW1lID09PSB1bmRlZmluZWQgfHwgaWQgPT09IHVuZGVmaW5lZCkgJiYgYXJuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJFaXRoZXIgdGhlIHBhaXIgJ25hbWUnIGFuZCAnaWQnLCBvciAnYXJuJyBuZWVkcyB0byBiZSBkZWZpbmVkXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVJhYmJpdE1xQnJva2VyRGVwbG95bWVudCB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSBhcm46IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnRzOiBSYWJiaXRNcUJyb2tlckVuZHBvaW50cztcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgdXJsU3VmZml4OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucyB8IHVuZGVmaW5lZCA9IHNlY3VyaXR5R3JvdXBzXG4gICAgICAgID8gbmV3IENvbm5lY3Rpb25zKHsgc2VjdXJpdHlHcm91cHMgfSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBfYXV0aGVudGljYXRpb25TdHJhdGVneT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIF9lbmdpbmVWZXJzaW9uOiBzdHJpbmcgPSBcIlVOS05PV05cIjtcblxuICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKHNjb3BlLCBsb2dpY2FsSWQpO1xuICAgICAgICB0aGlzLmFybiA9IGFyblxuICAgICAgICAgID8gYXJuXG4gICAgICAgICAgOiBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgICAgICAgICBzZXJ2aWNlOiBcIm1xXCIsXG4gICAgICAgICAgICAgIHJlc291cmNlOiBcImJyb2tlclwiLFxuICAgICAgICAgICAgICByZXNvdXJjZU5hbWU6IGAke25hbWV9OiR7aWR9YCxcbiAgICAgICAgICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICAgICAgICA/IG5hbWVcbiAgICAgICAgICA6IEFybi5zcGxpdChhcm4hLCBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSkucmVzb3VyY2VOYW1lIS5zcGxpdChcbiAgICAgICAgICAgICAgXCI6XCIsXG4gICAgICAgICAgICApWzBdO1xuICAgICAgICB0aGlzLmlkID0gaWRcbiAgICAgICAgICA/IGlkXG4gICAgICAgICAgOiBBcm4uc3BsaXQoYXJuISwgQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUpLnJlc291cmNlTmFtZSEuc3BsaXQoXG4gICAgICAgICAgICAgIFwiOlwiLFxuICAgICAgICAgICAgKVsxXTtcblxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy51cmxTdWZmaXggPSB1cmxTdWZmaXg7XG5cbiAgICAgICAgdGhpcy5lbmRwb2ludHMgPSB7XG4gICAgICAgICAgYW1xcDoge1xuICAgICAgICAgICAgZ2V0IHVybCgpIHtcbiAgICAgICAgICAgICAgaWYgKHNlbGYudXJsU3VmZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYGFtcXBzOi8vJHtzZWxmLmlkfS5tcS4ke0F3cy5SRUdJT059LiR7c2VsZi51cmxTdWZmaXh9OjU2NzFgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIlRvIHVzZSB0aGUgZW5kcG9pbnRzLmFtcXAudXJsIHByb3BlcnR5IG9mIGFuIGltcG9ydGVkIGJyb2tlciB1cmxTdWZmaXggbmVlZHMgdG8gYmUgc3BlY2lmaWVkIG9uIGludGlhbGl6YXRpb25cIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb3J0OiA1NjcxLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29uc29sZToge1xuICAgICAgICAgICAgZ2V0IHVybCgpIHtcbiAgICAgICAgICAgICAgaWYgKHNlbGYudXJsU3VmZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYGh0dHBzOi8vJHtzZWxmLmlkfS5tcS4ke0F3cy5SRUdJT059LiR7c2VsZi51cmxTdWZmaXh9YDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJUbyB1c2UgdGhlIGVuZHBvaW50cy5jb25zb2xlLnVybCBwcm9wZXJ0eSBvZiBhbiBpbXBvcnRlZCBicm9rZXIgdXJsU3VmZml4IG5lZWRzIHRvIGJlIHNwZWNpZmllZCBvbiBpbnRpYWxpemF0aW9uXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcG9ydDogNDQzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBvcHRpb25zPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiBuZXcgTWV0cmljKHtcbiAgICAgICAgICBuYW1lc3BhY2U6IFwiQVdTL0FtYXpvbk1RXCIsXG4gICAgICAgICAgbWV0cmljTmFtZSxcbiAgICAgICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgICAgICBCcm9rZXI6IHRoaXMuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY0V4Y2hhbmdlQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiRXhjaGFuZ2VDb3VudFwiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNRdWV1ZUNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlF1ZXVlQ291bnRcIiwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgbWV0cmljQ29ubmVjdGlvbkNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkNvbm5lY3Rpb25Db3VudFwiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNDaGFubmVsQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiQ2hhbm5lbENvdW50XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY0NvbnN1bWVyQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiQ29uc3VtZXJDb3VudFwiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNNZXNzYWdlQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiTWVzc2FnZUNvdW50XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY01lc3NhZ2VSZWFkeUNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIk1lc3NhZ2VSZWFkeUNvdW50XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY01lc3NhZ2VVbmFja25vd2xlZGdlZENvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIk1lc3NhZ2VVbmFja25vd2xlZGdlZENvdW50XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY1B1Ymxpc2hSYXRlKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlB1Ymxpc2hSYXRlXCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY0NvbmZpcm1SYXRlKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkNvbmZpcm1SYXRlXCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY0Fja1JhdGUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiQWNrUmF0ZVwiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNTeXN0ZW1DcHVVdGlsaXphdGlvbihwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJTeXN0ZW1DcHVVdGlsaXphdGlvblwiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNSYWJiaXRNUU1lbUxpbWl0KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlJhYmJpdE1RTWVtTGltaXRcIiwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgbWV0cmljUmFiYml0TVFNZW1Vc2VkKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlJhYmJpdE1RTWVtVXNlZFwiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNSYWJiaXRNUURpc2tGcmVlTGltaXQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiUmFiYml0TVFEaXNrRnJlZUxpbWl0XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY1JhYmJpdE1RRGlza0ZyZWUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiUmFiYml0TVFEaXNrRnJlZVwiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNSYWJiaXRNUUZkVXNlZChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJSYWJiaXRNUUZkVXNlZFwiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNSYWJiaXRNUUlPUmVhZEF2ZXJhZ2VUaW1lKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlJhYmJpdE1RSU9SZWFkQXZlcmFnZVRpbWVcIiwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgbWV0cmljUmFiYml0TVFJT1dyaXRlQXZlcmFnZVRpbWUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiUmFiYml0TVFJT1dyaXRlQXZlcmFnZVRpbWVcIiwgcHJvcHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnRzOiBSYWJiaXRNcUJyb2tlckVuZHBvaW50cztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFJhYmJpdE1xQnJva2VyRGVwbG95bWVudEJhc2VQcm9wcyxcbiAgKSB7XG4gICAgY29uc3QgeyBhZG1pbiwgdXNlck1hbmFnZW1lbnQgfSA9IHByb3BzO1xuXG4gICAgaWYgKGFkbWluICYmIHVzZXJNYW5hZ2VtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiT25seSBvbmUgb2YgJ2FkbWluJyBvciAndXNlck1hbmFnZW1lbnQnIGNhbiBiZSBzcGVjaWZpZWRcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGFkbWluID09PSB1bmRlZmluZWQgJiYgdXNlck1hbmFnZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk9uZSBvZiAnYWRtaW4nIG9yICd1c2VyTWFuYWdlbWVudCcgbmVlZHMgdG8gYmUgc3BlY2lmaWVkXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdXNlcnMsIGF1dGhlbnRpY2F0aW9uU3RyYXRlZ3kgfSA9IHVzZXJNYW5hZ2VtZW50XG4gICAgICA/IHVzZXJNYW5hZ2VtZW50LnJlbmRlcigpXG4gICAgICA6IHtcbiAgICAgICAgICB1c2VyczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB1c2VybmFtZTogYWRtaW4hLnVzZXJuYW1lLFxuICAgICAgICAgICAgICBwYXNzd29yZDogYWRtaW4hLnBhc3N3b3JkLnVuc2FmZVVud3JhcCgpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGF1dGhlbnRpY2F0aW9uU3RyYXRlZ3k6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcblxuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICB2ZXJzaW9uOiBwcm9wcy52ZXJzaW9uLnRvU3RyaW5nKCksXG4gICAgICBkZWZhdWx0UG9ydDogUG9ydC50Y3AoNTY3MSksXG4gICAgICBlbmdpbmU6IEJyb2tlckVuZ2luZS5SQUJCSVRNUSxcbiAgICAgIHVzZXJzLFxuICAgICAgYXV0aGVudGljYXRpb25TdHJhdGVneSxcbiAgICAgIGNsb3Vkd2F0Y2hMb2dzRXhwb3J0czogcHJvcHMuY2xvdWR3YXRjaExvZ3NFeHBvcnRzLFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbmRwb2ludHMgPSB7XG4gICAgICBhbXFwOiB7XG4gICAgICAgIHVybDogRm4uc2VsZWN0KDAsIHRoaXMuX3Jlc291cmNlLmF0dHJBbXFwRW5kcG9pbnRzKSxcbiAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgRm4uc2VsZWN0KFxuICAgICAgICAgICAgMixcbiAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMCwgdGhpcy5fcmVzb3VyY2UuYXR0ckFtcXBFbmRwb2ludHMpKSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICAgIGNvbnNvbGU6IHtcbiAgICAgICAgdXJsOiBgaHR0cHM6JHtGbi5zZWxlY3QoMSwgRm4uc3BsaXQoXCI6XCIsIEZuLnNlbGVjdCgwLCB0aGlzLl9yZXNvdXJjZS5hdHRyQW1xcEVuZHBvaW50cykpKX1gLFxuICAgICAgICBwb3J0OiA0NDMsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0aGlzLl9jb25maWd1cmF0aW9uID1cbiAgICAgIHByb3BzLmNvbmZpZ3VyYXRpb24gPz9cbiAgICAgIFJhYmJpdE1xQnJva2VyQ29uZmlndXJhdGlvbi5mcm9tQXR0cmlidXRlcyh0aGlzLCBcIkNvbmZpZ3VyYXRpb25cIiwge1xuICAgICAgICBpZDogdGhpcy5fcmVzb3VyY2UuYXR0ckNvbmZpZ3VyYXRpb25JZCxcbiAgICAgICAgcmV2aXNpb246IHRoaXMuX3Jlc291cmNlLmF0dHJDb25maWd1cmF0aW9uUmV2aXNpb24sXG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIHB1YmxpYyB3aXRoQ29uZmlndXJhdGlvbihpZDogc3RyaW5nLCBvcHRpb25zOiBSYWJiaXRNcUJyb2tlckNvbmZpZ3VyYXRpb25PcHRpb25zKTogSVJhYmJpdE1xQnJva2VyQ29uZmlndXJhdGlvbiB7XG4gIC8vICAgY29uc3QgY29uZmlndXJhdGlvbiA9IG5ldyBSYWJiaXRNcUJyb2tlckNvbmZpZ3VyYXRpb24odGhpcy5ub2RlLnNjb3BlISwgaWQsIHtcbiAgLy8gICAgIGVuZ2luZVZlcnNpb246IHRoaXMuZW5naW5lVmVyc2lvbixcbiAgLy8gICAgIC4uLm9wdGlvbnMsXG4gIC8vICAgfSk7XG5cbiAgLy8gICB0aGlzLl9hdHRhY2hDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pO1xuXG4gIC8vICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247XG4gIC8vIH1cblxuICBwdWJsaWMgbWV0cmljRXhjaGFuZ2VDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkV4Y2hhbmdlQ291bnRcIiwgcHJvcHMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY1F1ZXVlQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJRdWV1ZUNvdW50XCIsIHByb3BzKTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWNDb25uZWN0aW9uQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJDb25uZWN0aW9uQ291bnRcIiwgcHJvcHMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY0NoYW5uZWxDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkNoYW5uZWxDb3VudFwiLCBwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljQ29uc3VtZXJDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkNvbnN1bWVyQ291bnRcIiwgcHJvcHMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY01lc3NhZ2VDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIk1lc3NhZ2VDb3VudFwiLCBwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljTWVzc2FnZVJlYWR5Q291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJNZXNzYWdlUmVhZHlDb3VudFwiLCBwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljTWVzc2FnZVVuYWNrbm93bGVkZ2VkQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJNZXNzYWdlVW5hY2tub3dsZWRnZWRDb3VudFwiLCBwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljUHVibGlzaFJhdGUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJQdWJsaXNoUmF0ZVwiLCBwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljQ29uZmlybVJhdGUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJDb25maXJtUmF0ZVwiLCBwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljQWNrUmF0ZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkFja1JhdGVcIiwgcHJvcHMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY1N5c3RlbUNwdVV0aWxpemF0aW9uKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiU3lzdGVtQ3B1VXRpbGl6YXRpb25cIiwgcHJvcHMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY1JhYmJpdE1RTWVtTGltaXQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJSYWJiaXRNUU1lbUxpbWl0XCIsIHByb3BzKTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWNSYWJiaXRNUU1lbVVzZWQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJSYWJiaXRNUU1lbVVzZWRcIiwgcHJvcHMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY1JhYmJpdE1RRGlza0ZyZWVMaW1pdChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlJhYmJpdE1RRGlza0ZyZWVMaW1pdFwiLCBwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljUmFiYml0TVFEaXNrRnJlZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlJhYmJpdE1RRGlza0ZyZWVcIiwgcHJvcHMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY1JhYmJpdE1RRmRVc2VkKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiUmFiYml0TVFGZFVzZWRcIiwgcHJvcHMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY1JhYmJpdE1RSU9SZWFkQXZlcmFnZVRpbWUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJSYWJiaXRNUUlPUmVhZEF2ZXJhZ2VUaW1lXCIsIHByb3BzKTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWNSYWJiaXRNUUlPV3JpdGVBdmVyYWdlVGltZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlJhYmJpdE1RSU9Xcml0ZUF2ZXJhZ2VUaW1lXCIsIHByb3BzKTtcbiAgfVxufVxuIl19