UNPKG

@cdklabs/cdk-amazonmq

Version:
158 lines 26.2 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.BrokerDeploymentBase = exports.BrokerEngine = 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_amazonmq_1 = require("aws-cdk-lib/aws-amazonmq"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const aws_ec2_1 = require("aws-cdk-lib/aws-ec2"); const aws_logs_1 = require("aws-cdk-lib/aws-logs"); const broker_deployment_mode_1 = require("./broker-deployment-mode"); var BrokerEngine; (function (BrokerEngine) { BrokerEngine["RABBITMQ"] = "RABBITMQ"; BrokerEngine["ACTIVEMQ"] = "ACTIVEMQ"; })(BrokerEngine || (exports.BrokerEngine = BrokerEngine = {})); class BrokerDeploymentBase extends aws_cdk_lib_1.Resource { /** Manages connections for the cluster */ get connections() { return this._conns; } constructor(scope, id, props) { super(scope, id, { physicalName: props.brokerName || aws_cdk_lib_1.Lazy.string({ produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 50, allowedSpecialCharacters: "-_", }), }), }); // this._authenticationStrategy = props.authenticationStrategy; this._engineVersion = props.version; this._conns = props.vpcSubnets && props.vpc ? new aws_ec2_1.Connections({ defaultPort: props.defaultPort, securityGroups: props.securityGroups ?? [ new aws_ec2_1.SecurityGroup(this, "AMQ_SG", { description: `Automatic security group for broker ${aws_cdk_lib_1.Names.uniqueId(this)}`, vpc: props.vpc, allowAllOutbound: false, }), ], }) : undefined; this._resource = new aws_amazonmq_1.CfnBroker(this, "Resource", { brokerName: this.physicalName, configuration: aws_cdk_lib_1.Lazy.any({ produce: () => this._configurationIdProperty && { id: this._configurationIdProperty.id, revision: this._configurationIdProperty.revision, }, }), engineType: props.engine, engineVersion: props.version, autoMinorVersionUpgrade: props.autoMinorVersionUpgrade, deploymentMode: props.deploymentMode, encryptionOptions: { kmsKeyId: props.key?.keyId, useAwsOwnedKey: props.key === undefined, }, maintenanceWindowStartTime: props.maintenanceWindowStartTime && { dayOfWeek: props.maintenanceWindowStartTime.dayOfWeek, timeOfDay: props.maintenanceWindowStartTime.timeOfDay, timeZone: props.maintenanceWindowStartTime.timeZone?.timezoneName, }, storageType: props.storageType, logs: props.cloudwatchLogsExports, hostInstanceType: `mq.${props.instanceType.toString()}`, publiclyAccessible: props.publiclyAccessible, securityGroups: this._conns?.securityGroups.map((sg) => sg.securityGroupId), subnetIds: props.vpc?.selectSubnets(props.vpcSubnets).subnetIds, users: props.users, authenticationStrategy: props.authenticationStrategy, ldapServerMetadata: props.ldapServerMetadata, }); this.name = this.physicalName; this.arn = this._resource.attrArn; this.id = this._resource.ref; // TODO: this is ugly. Make it more self-explanatory this.cloudwatchLogsExports = props.engine === BrokerEngine.RABBITMQ && props.cloudwatchLogsExports && "general" in props.cloudwatchLogsExports ? { general: true, channel: true, connection: true, mirroring: props.deploymentMode === broker_deployment_mode_1.BrokerDeploymentMode.CLUSTER_MULTI_AZ, } : props.cloudwatchLogsExports; this.cloudwatchLogsRetention = props.cloudwatchLogsRetention; this.cloudwatchLogsRetentionRole = props.cloudwatchLogsRetentionRole; if (props.configuration) { this._attachConfiguration(props.configuration); } this.configureLogRetention(); } assignConfigurationIdProperty(configuration) { if (this._configurationIdProperty) { throw new Error("Configuration already set"); } this._configurationIdProperty = configuration; } metric(metricName, options) { return new aws_cloudwatch_1.Metric({ namespace: "AWS/AmazonMQ", metricName, dimensionsMap: { Broker: this.id, }, ...options, }); } configureLogRetention() { const [logExports, retention, retentionRole] = [ this.cloudwatchLogsExports, this.cloudwatchLogsRetention, this.cloudwatchLogsRetentionRole, ]; if (logExports !== undefined && retention !== undefined) { const availableValues = [ "general", "audit", "channel", "connection", "mirroring", ]; Object.entries(logExports) .filter(([log, enabled]) => availableValues.includes(log) && enabled) .map(([log, _]) => log) .forEach((log) => { new aws_logs_1.LogRetention(this, `LogRetention${log}`, { logGroupName: `/aws/amazonmq/broker/${this.id}/${log}`, retention, role: retentionRole, }); }); } } /*** * @internal */ _attachConfiguration(configuration) { // this._configuration = configuration.node.defaultChild as CfnConfiguration; this.assignConfigurationIdProperty(configuration); this.node.addDependency(configuration); } } exports.BrokerDeploymentBase = BrokerDeploymentBase; _a = JSII_RTTI_SYMBOL_1; BrokerDeploymentBase[_a] = { fqn: "@cdklabs/cdk-amazonmq.BrokerDeploymentBase", version: "0.1.8" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJva2VyLWRlcGxveW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYnJva2VyLWRlcGxveW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7O0VBR0U7QUFDRiw2Q0FBNEU7QUFDNUUsMkRBQXFEO0FBQ3JELCtEQUFtRTtBQUNuRSxpREFRNkI7QUFHN0IsbURBQW1FO0FBR25FLHFFQUFnRTtBQXFGaEUsSUFBWSxZQUdYO0FBSEQsV0FBWSxZQUFZO0lBQ3RCLHFDQUFxQixDQUFBO0lBQ3JCLHFDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFIVyxZQUFZLDRCQUFaLFlBQVksUUFHdkI7QUFpQkQsTUFBc0Isb0JBQ3BCLFNBQVEsc0JBQVE7SUFpQ2hCLDBDQUEwQztJQUMxQyxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWdDO1FBQ3hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsWUFBWSxFQUNWLEtBQUssQ0FBQyxVQUFVO2dCQUNoQixrQkFBSSxDQUFDLE1BQU0sQ0FBQztvQkFDVixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQ1osbUJBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUU7d0JBQzdCLFNBQVMsRUFBRSxFQUFFO3dCQUNiLHdCQUF3QixFQUFFLElBQUk7cUJBQy9CLENBQUM7aUJBQ0wsQ0FBQztTQUNMLENBQUMsQ0FBQztRQUVILCtEQUErRDtRQUMvRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFFcEMsSUFBSSxDQUFDLE1BQU07WUFDVCxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxHQUFHO2dCQUMzQixDQUFDLENBQUMsSUFBSSxxQkFBVyxDQUFDO29CQUNkLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztvQkFDOUIsY0FBYyxF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QUFPO2dCQUNQLFNBQVM7Z0JBQ1QsWUFBWTtnQkFDWixXQUFXO2FBQ1osQ0FBQztZQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO2lCQUN2QixNQUFNLENBQ0wsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQW9CLEVBQUUsRUFBRSxDQUNwQyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FDM0M7aUJBQ0EsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQztpQkFDdEIsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSx1QkFBWSxDQUFDLElBQUksRUFBRSxlQUFlLEdBQUcsRUFBRSxFQUFFO29CQUMzQyxZQUFZLEVBQUUsd0JBQXdCLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFO29CQUN0RCxTQUFTO29CQUNULElBQUksRUFBRSxhQUFhO2lCQUNwQixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxvQkFBb0IsQ0FBQyxhQUFtQztRQUNoRSw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7O0FBaE1ILG9EQWlNQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4qL1xuaW1wb3J0IHsgSVJlc29sdmFibGUsIElSZXNvdXJjZSwgTGF6eSwgTmFtZXMsIFJlc291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDZm5Ccm9rZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFtYXpvbm1xXCI7XG5pbXBvcnQgeyBNZXRyaWMsIE1ldHJpY09wdGlvbnMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7XG4gIElTZWN1cml0eUdyb3VwLFxuICBJbnN0YW5jZVR5cGUsXG4gIElWcGMsXG4gIFN1Ym5ldFNlbGVjdGlvbixcbiAgQ29ubmVjdGlvbnMsXG4gIFBvcnQsXG4gIFNlY3VyaXR5R3JvdXAsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyBJUm9sZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBJS2V5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1rbXNcIjtcbmltcG9ydCB7IExvZ1JldGVudGlvbiwgUmV0ZW50aW9uRGF5cyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEJyb2tlckNsb3Vkd2F0Y2hMb2dzRXhwb3J0cyB9IGZyb20gXCIuL2Jyb2tlci1jbG91ZHdhdGNoLWxvZ3MtZXhwb3J0c1wiO1xuaW1wb3J0IHsgQnJva2VyRGVwbG95bWVudE1vZGUgfSBmcm9tIFwiLi9icm9rZXItZGVwbG95bWVudC1tb2RlXCI7XG5pbXBvcnQgeyBJQnJva2VyQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7IE1haW50ZW5hbmNlV2luZG93U3RhcnRUaW1lIH0gZnJvbSBcIi4vbWFpbnRlbmFuY2Utd2luZG93LXN0YXJ0LXRpbWVcIjtcbmltcG9ydCB7IFN0b3JhZ2VUeXBlIH0gZnJvbSBcIi4vc3RvcmFnZS10eXBlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJyb2tlckRlcGxveW1lbnQgZXh0ZW5kcyBJUmVzb3VyY2Uge1xuICByZWFkb25seSBhcm46IHN0cmluZztcblxuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICByZWFkb25seSBjb25uZWN0aW9uczogQ29ubmVjdGlvbnMgfCB1bmRlZmluZWQ7XG5cbiAgLyoqKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlYWRvbmx5IF9hdXRoZW50aWNhdGlvblN0cmF0ZWd5Pzogc3RyaW5nO1xuXG4gIC8qKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZWFkb25seSBfZW5naW5lVmVyc2lvbjogc3RyaW5nO1xuXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJyb2tlckRlcGxveW1lbnRQcm9wcyB7XG4gIHJlYWRvbmx5IGtleT86IElLZXk7XG4gIHJlYWRvbmx5IGJyb2tlck5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBicm9rZXIgaXMgb3BlbiB0byBwdWJsaWMgSW50ZXJuZXQgb3IgZGVwbG95ZWQgd2l0aFxuICAgKiBlbmRwb2ludHMgaW4gb3duIFZQQy5cbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpY2x5QWNjZXNzaWJsZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIHZwY1N1Ym5ldHMgYW5kIHZwYyBhcmUgb3B0aW9uYWwuIEJ1dCB3aGVuIHByZXNlbnQgLSBwdWJsaWNseUFjY2Vzc2libGUgYXR0cmlidXRlIG11c3QgZXF1YWwgZmFsc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkLiBJZiB2cGMgaXMgcHJlc2VudCAtIHRoaXMgYXR0cmlidXRlIG11c3QgYmUgcHJlc2VudC5cbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBTdWJuZXRTZWxlY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgaW4gd2hpY2ggY3JlYXRlIHRoZSBjb21tdW5pY2F0aW9uIGVuZHBvaW50cyBmb3IgYSBwcml2YXRlIGJyb2tlci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQuIEEgZGVmYXVsdCBWUEMgd2lsbCBiZSB1c2VkXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBJVnBjO1xuICAvKipcbiAgICogVGhlIFNlY3VyaXR5IEdyb3VwcyB0byBhcHBseSBmb3IgYSBub24gcHVibGljbHkgYWNjZXNzaWJsZSBicm9rZXIuXG4gICAqXG4gICAqIE5PVEU6IFRoaXMgbmVlZHMgdG8gYmUgc2V0IG9ubHkgaWYgYHB1YmxpY2x5QWNjZXNzaWJsZWAgaXMgdHJ1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQuIElmIG5vIFZQQyBpcyBzZWxlY3RlZCB0aGVuIGEgZGVmYXVsdCBWUEMncyBkZWZhdWx0IFNHIHdpbGwgYmUgdXNlZC5cbiAgICogICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSAtIGEgc2VjdXJpdHkgZ3JvdXAgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBJU2VjdXJpdHlHcm91cFtdO1xuXG4gIC8qKlxuICAgKiBBbiBpbnN0YW5jZSB0eXBlIHRvIHVzZSBmb3IgdGhlIGJyb2tlci4gT25seSBhIHN1YnNldCBvZiBhdmFpbGFibGUgaW5zdGFuY2UgdHlwZXMgaXMgYWxsb3dlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9uLW1xL2xhdGVzdC9kZXZlbG9wZXItZ3VpZGUvYnJva2VyLWluc3RhbmNlLXR5cGVzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlVHlwZTogSW5zdGFuY2VUeXBlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGJyb2tlciB3aWxsIHVuZGVyZ28gYSBwYXRjaCB2ZXJzaW9uIHVwZ3JhZGUgZHVyaW5nIHRoZSBtYWludGVuYW5jZSB3aW5kb3cuXG4gICAqXG4gICAqIE5PVEU6IENvbnRyYXJ5IHRvIHRoZSBuYW1lIHRoaXMgIHNldHRpbmcgZG9lcyBub3QgdXBncmFkZSB0aGUgbWlub3IgdmVyc2lvbnMsIGJ1dCBwYXRjaCB2ZXJzaW9ucyAoaS5lLiBpbiB0aGUgWC5ZLlogbm90YXRpb24gLSBvbmx5IHRoZSBaIG51bWJlcnMgYXJlIHVwZ3JhZGVkKVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZvciB2ZXJzaW9ucyB3aXRoIHRoZSBwYXRjaCB2ZXJzaW9uIG51bWJlciB0aGUgZGVmYXVsdCBpcyBub3QgdG8gdXBncmFkZSB0aGUgcGF0Y2ggdmVyc2lvbnM7IGZvciB2ZXJzaW9ucyB3aXRob3V0aCB0aGUgcGF0Y2ggdmVyc2lvbiBudW1iZXIgcGF0Y2ggdmVyc2lvbnMgYXJlIHVwZGF0ZWQgYW5kIHRoaXMgc2V0dGluZyB0YWtlcyBubyBlZmZlY3QuXG4gICAqL1xuICByZWFkb25seSBhdXRvTWlub3JWZXJzaW9uVXBncmFkZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1haW50ZW5hbmNlV2luZG93U3RhcnRUaW1lPzogTWFpbnRlbmFuY2VXaW5kb3dTdGFydFRpbWU7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJldGVudGlvbiBkYXlzIGZvciB0aGUgYnJva2VyJ3MgQ2xvdWRXYXRjaCBMb2dHcm91cHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQ7IENsb3VkV2F0Y2ggTG9nIEdyb3VwcyByZXRlbnRpb24gaXMgc2V0IHRvIG5ldmVyIGV4cGlyZVxuICAgKi9cbiAgcmVhZG9ubHkgY2xvdWR3YXRjaExvZ3NSZXRlbnRpb24/OiBSZXRlbnRpb25EYXlzO1xuICByZWFkb25seSBjbG91ZHdhdGNoTG9nc1JldGVudGlvblJvbGU/OiBJUm9sZTtcbn1cblxuZXhwb3J0IGVudW0gQnJva2VyRW5naW5lIHtcbiAgUkFCQklUTVEgPSBcIlJBQkJJVE1RXCIsXG4gIEFDVElWRU1RID0gXCJBQ1RJVkVNUVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJyb2tlckRlcGxveW1lbnRCYXNlUHJvcHMgZXh0ZW5kcyBCcm9rZXJEZXBsb3ltZW50UHJvcHMge1xuICByZWFkb25seSBhdXRoZW50aWNhdGlvblN0cmF0ZWd5Pzogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlcGxveW1lbnRNb2RlOiBCcm9rZXJEZXBsb3ltZW50TW9kZTtcbiAgcmVhZG9ubHkgZGVmYXVsdFBvcnQ/OiBQb3J0O1xuICByZWFkb25seSBlbmdpbmU6IEJyb2tlckVuZ2luZTtcbiAgcmVhZG9ubHkgc3RvcmFnZVR5cGU/OiBTdG9yYWdlVHlwZTtcbiAgcmVhZG9ubHkgY29uZmlndXJhdGlvbj86IElCcm9rZXJDb25maWd1cmF0aW9uO1xuICByZWFkb25seSBjbG91ZHdhdGNoTG9nc0V4cG9ydHM/OiBCcm9rZXJDbG91ZHdhdGNoTG9nc0V4cG9ydHM7XG4gIHJlYWRvbmx5IHVzZXJzOiBDZm5Ccm9rZXIuVXNlclByb3BlcnR5W107XG4gIHJlYWRvbmx5IGxkYXBTZXJ2ZXJNZXRhZGF0YT86XG4gICAgfCBJUmVzb2x2YWJsZVxuICAgIHwgQ2ZuQnJva2VyLkxkYXBTZXJ2ZXJNZXRhZGF0YVByb3BlcnR5O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnJva2VyRGVwbG95bWVudEJhc2VcbiAgZXh0ZW5kcyBSZXNvdXJjZVxuICBpbXBsZW1lbnRzIElCcm9rZXJEZXBsb3ltZW50XG57XG4gIHB1YmxpYyByZWFkb25seSBhcm46IHN0cmluZztcblxuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBAaW50ZXJuYWwgICovXG4gIHB1YmxpYyByZWFkb25seSBfYXV0aGVudGljYXRpb25TdHJhdGVneT86IHN0cmluZztcblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyByZWFkb25seSBfZW5naW5lVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jb25uczogQ29ubmVjdGlvbnMgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3Jlc291cmNlOiBDZm5Ccm9rZXI7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgX2NvbmZpZ3VyYXRpb25JZFByb3BlcnR5OlxuICAgIHwgQ2ZuQnJva2VyLkNvbmZpZ3VyYXRpb25JZFByb3BlcnR5XG4gICAgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgX2NvbmZpZ3VyYXRpb246IElCcm9rZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2xvdWR3YXRjaExvZ3NFeHBvcnRzPzogQnJva2VyQ2xvdWR3YXRjaExvZ3NFeHBvcnRzO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsb3Vkd2F0Y2hMb2dzUmV0ZW50aW9uPzogUmV0ZW50aW9uRGF5cztcbiAgcHJpdmF0ZSByZWFkb25seSBjbG91ZHdhdGNoTG9nc1JldGVudGlvblJvbGU/OiBJUm9sZTtcblxuICAvKiogTWFuYWdlcyBjb25uZWN0aW9ucyBmb3IgdGhlIGNsdXN0ZXIgKi9cbiAgcHVibGljIGdldCBjb25uZWN0aW9ucygpOiBDb25uZWN0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5zO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEJyb2tlckRlcGxveW1lbnRCYXNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTpcbiAgICAgICAgcHJvcHMuYnJva2VyTmFtZSB8fFxuICAgICAgICBMYXp5LnN0cmluZyh7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT5cbiAgICAgICAgICAgIE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICAgICAgICAgIG1heExlbmd0aDogNTAsXG4gICAgICAgICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogXCItX1wiLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgLy8gdGhpcy5fYXV0aGVudGljYXRpb25TdHJhdGVneSA9IHByb3BzLmF1dGhlbnRpY2F0aW9uU3RyYXRlZ3k7XG4gICAgdGhpcy5fZW5naW5lVmVyc2lvbiA9IHByb3BzLnZlcnNpb247XG5cbiAgICB0aGlzLl9jb25ucyA9XG4gICAgICBwcm9wcy52cGNTdWJuZXRzICYmIHByb3BzLnZwY1xuICAgICAgICA/IG5ldyBDb25uZWN0aW9ucyh7XG4gICAgICAgICAgICBkZWZhdWx0UG9ydDogcHJvcHMuZGVmYXVsdFBvcnQsXG4gICAgICAgICAgICBzZWN1cml0eUdyb3VwczogcHJvcHMuc2VjdXJpdHlHcm91cHMgPz8gW1xuICAgICAgICAgICAgICBuZXcgU2VjdXJpdHlHcm91cCh0aGlzLCBcIkFNUV9TR1wiLCB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGBBdXRvbWF0aWMgc2VjdXJpdHkgZ3JvdXAgZm9yIGJyb2tlciAke05hbWVzLnVuaXF1ZUlkKFxuICAgICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICApfWAsXG4gICAgICAgICAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgICAgICAgICAgYWxsb3dBbGxPdXRib3VuZDogZmFsc2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHRoaXMuX3Jlc291cmNlID0gbmV3IENmbkJyb2tlcih0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgIGJyb2tlck5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgY29uZmlndXJhdGlvbjogTGF6eS5hbnkoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PlxuICAgICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRpb25JZFByb3BlcnR5ICYmIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLl9jb25maWd1cmF0aW9uSWRQcm9wZXJ0eS5pZCxcbiAgICAgICAgICAgIHJldmlzaW9uOiB0aGlzLl9jb25maWd1cmF0aW9uSWRQcm9wZXJ0eS5yZXZpc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBlbmdpbmVUeXBlOiBwcm9wcy5lbmdpbmUsXG4gICAgICBlbmdpbmVWZXJzaW9uOiBwcm9wcy52ZXJzaW9uLFxuICAgICAgYXV0b01pbm9yVmVyc2lvblVwZ3JhZGU6IHByb3BzLmF1dG9NaW5vclZlcnNpb25VcGdyYWRlLFxuICAgICAgZGVwbG95bWVudE1vZGU6IHByb3BzLmRlcGxveW1lbnRNb2RlLFxuICAgICAgZW5jcnlwdGlvbk9wdGlvbnM6IHtcbiAgICAgICAga21zS2V5SWQ6IHByb3BzLmtleT8ua2V5SWQsXG4gICAgICAgIHVzZUF3c093bmVkS2V5OiBwcm9wcy5rZXkgPT09IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICBtYWludGVuYW5jZVdpbmRvd1N0YXJ0VGltZTogcHJvcHMubWFpbnRlbmFuY2VXaW5kb3dTdGFydFRpbWUgJiYge1xuICAgICAgICBkYXlPZldlZWs6IHByb3BzLm1haW50ZW5hbmNlV2luZG93U3RhcnRUaW1lLmRheU9mV2VlayxcbiAgICAgICAgdGltZU9mRGF5OiBwcm9wcy5tYWludGVuYW5jZVdpbmRvd1N0YXJ0VGltZS50aW1lT2ZEYXksXG4gICAgICAgIHRpbWVab25lOiBwcm9wcy5tYWludGVuYW5jZVdpbmRvd1N0YXJ0VGltZS50aW1lWm9uZT8udGltZXpvbmVOYW1lLFxuICAgICAgfSxcbiAgICAgIHN0b3JhZ2VUeXBlOiBwcm9wcy5zdG9yYWdlVHlwZSxcbiAgICAgIGxvZ3M6IHByb3BzLmNsb3Vkd2F0Y2hMb2dzRXhwb3J0cyxcbiAgICAgIGhvc3RJbnN0YW5jZVR5cGU6IGBtcS4ke3Byb3BzLmluc3RhbmNlVHlwZS50b1N0cmluZygpfWAsXG4gICAgICBwdWJsaWNseUFjY2Vzc2libGU6IHByb3BzLnB1YmxpY2x5QWNjZXNzaWJsZSxcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiB0aGlzLl9jb25ucz8uc2VjdXJpdHlHcm91cHMubWFwKFxuICAgICAgICAoc2cpID0+IHNnLnNlY3VyaXR5R3JvdXBJZCxcbiAgICAgICksXG4gICAgICBzdWJuZXRJZHM6IHByb3BzLnZwYz8uc2VsZWN0U3VibmV0cyhwcm9wcy52cGNTdWJuZXRzKS5zdWJuZXRJZHMsXG4gICAgICB1c2VyczogcHJvcHMudXNlcnMsXG4gICAgICBhdXRoZW50aWNhdGlvblN0cmF0ZWd5OiBwcm9wcy5hdXRoZW50aWNhdGlvblN0cmF0ZWd5LFxuICAgICAgbGRhcFNlcnZlck1ldGFkYXRhOiBwcm9wcy5sZGFwU2VydmVyTWV0YWRhdGEsXG4gICAgfSk7XG5cbiAgICB0aGlzLm5hbWUgPSB0aGlzLnBoeXNpY2FsTmFtZTtcbiAgICB0aGlzLmFybiA9IHRoaXMuX3Jlc291cmNlLmF0dHJBcm47XG4gICAgdGhpcy5pZCA9IHRoaXMuX3Jlc291cmNlLnJlZjtcblxuICAgIC8vIFRPRE86IHRoaXMgaXMgdWdseS4gTWFrZSBpdCBtb3JlIHNlbGYtZXhwbGFuYXRvcnlcbiAgICB0aGlzLmNsb3Vkd2F0Y2hMb2dzRXhwb3J0cyA9XG4gICAgICBwcm9wcy5lbmdpbmUgPT09IEJyb2tlckVuZ2luZS5SQUJCSVRNUSAmJlxuICAgICAgcHJvcHMuY2xvdWR3YXRjaExvZ3NFeHBvcnRzICYmXG4gICAgICBcImdlbmVyYWxcIiBpbiBwcm9wcy5jbG91ZHdhdGNoTG9nc0V4cG9ydHNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBnZW5lcmFsOiB0cnVlLFxuICAgICAgICAgICAgY2hhbm5lbDogdHJ1ZSxcbiAgICAgICAgICAgIGNvbm5lY3Rpb246IHRydWUsXG4gICAgICAgICAgICBtaXJyb3Jpbmc6XG4gICAgICAgICAgICAgIHByb3BzLmRlcGxveW1lbnRNb2RlID09PSBCcm9rZXJEZXBsb3ltZW50TW9kZS5DTFVTVEVSX01VTFRJX0FaLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBwcm9wcy5jbG91ZHdhdGNoTG9nc0V4cG9ydHM7XG5cbiAgICB0aGlzLmNsb3Vkd2F0Y2hMb2dzUmV0ZW50aW9uID0gcHJvcHMuY2xvdWR3YXRjaExvZ3NSZXRlbnRpb247XG4gICAgdGhpcy5jbG91ZHdhdGNoTG9nc1JldGVudGlvblJvbGUgPSBwcm9wcy5jbG91ZHdhdGNoTG9nc1JldGVudGlvblJvbGU7XG5cbiAgICBpZiAocHJvcHMuY29uZmlndXJhdGlvbikge1xuICAgICAgdGhpcy5fYXR0YWNoQ29uZmlndXJhdGlvbihwcm9wcy5jb25maWd1cmF0aW9uKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZ3VyZUxvZ1JldGVudGlvbigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzc2lnbkNvbmZpZ3VyYXRpb25JZFByb3BlcnR5KFxuICAgIGNvbmZpZ3VyYXRpb246IENmbkJyb2tlci5Db25maWd1cmF0aW9uSWRQcm9wZXJ0eSxcbiAgKSB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZ3VyYXRpb25JZFByb3BlcnR5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25maWd1cmF0aW9uIGFscmVhZHkgc2V0XCIpO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbmZpZ3VyYXRpb25JZFByb3BlcnR5ID0gY29uZmlndXJhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBvcHRpb25zPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgbmFtZXNwYWNlOiBcIkFXUy9BbWF6b25NUVwiLFxuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgQnJva2VyOiB0aGlzLmlkLFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlTG9nUmV0ZW50aW9uKCkge1xuICAgIGNvbnN0IFtsb2dFeHBvcnRzLCByZXRlbnRpb24sIHJldGVudGlvblJvbGVdID0gW1xuICAgICAgdGhpcy5jbG91ZHdhdGNoTG9nc0V4cG9ydHMsXG4gICAgICB0aGlzLmNsb3Vkd2F0Y2hMb2dzUmV0ZW50aW9uLFxuICAgICAgdGhpcy5jbG91ZHdhdGNoTG9nc1JldGVudGlvblJvbGUsXG4gICAgXTtcbiAgICBpZiAobG9nRXhwb3J0cyAhPT0gdW5kZWZpbmVkICYmIHJldGVudGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBhdmFpbGFibGVWYWx1ZXMgPSBbXG4gICAgICAgIFwiZ2VuZXJhbFwiLFxuICAgICAgICBcImF1ZGl0XCIsXG4gICAgICAgIFwiY2hhbm5lbFwiLFxuICAgICAgICBcImNvbm5lY3Rpb25cIixcbiAgICAgICAgXCJtaXJyb3JpbmdcIixcbiAgICAgIF07XG4gICAgICBPYmplY3QuZW50cmllcyhsb2dFeHBvcnRzKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChbbG9nLCBlbmFibGVkXTogW3N0cmluZywgYm9vbGVhbl0pID0+XG4gICAgICAgICAgICBhdmFpbGFibGVWYWx1ZXMuaW5jbHVkZXMobG9nKSAmJiBlbmFibGVkLFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKFtsb2csIF9dKSA9PiBsb2cpXG4gICAgICAgIC5mb3JFYWNoKChsb2cpID0+IHtcbiAgICAgICAgICBuZXcgTG9nUmV0ZW50aW9uKHRoaXMsIGBMb2dSZXRlbnRpb24ke2xvZ31gLCB7XG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2FtYXpvbm1xL2Jyb2tlci8ke3RoaXMuaWR9LyR7bG9nfWAsXG4gICAgICAgICAgICByZXRlbnRpb24sXG4gICAgICAgICAgICByb2xlOiByZXRlbnRpb25Sb2xlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKioqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9hdHRhY2hDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb246IElCcm9rZXJDb25maWd1cmF0aW9uKSB7XG4gICAgLy8gdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb24ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuQ29uZmlndXJhdGlvbjtcbiAgICB0aGlzLmFzc2lnbkNvbmZpZ3VyYXRpb25JZFByb3BlcnR5KGNvbmZpZ3VyYXRpb24pO1xuICAgIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KGNvbmZpZ3VyYXRpb24pO1xuICB9XG59XG4iXX0=