@cdklabs/cdk-amazonmq
Version:
<!--BEGIN STABILITY BANNER-->
174 lines • 31.8 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ActiveMqBrokerRedundantPair = 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 activemq_broker_deployment_1 = require("./activemq-broker-deployment");
const broker_deployment_mode_1 = require("../broker-deployment-mode");
/**
* A representation of an active/standby broker that is comprised of two brokers in two different Availability Zones.
*
* Additional optimizations:
* - When subnet selection returns more then 2 subnets. Construct picks first two that do belong to different AZ. Warning is annotated. If subnet selection does not meet AZ criteria an error is thrown.
*
*
* see: https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/active-standby-broker-deployment.html
*/
class ActiveMqBrokerRedundantPair extends activemq_broker_deployment_1.ActiveMqBrokerDeploymentBase {
/**
* Reference an existing ActiveMQ Broker Redundant Pair, defined outside of the CDK code, by ARN.
*
* @param scope
* @param logicalId the construct's logical ID
* @param arn the ARN of the existing ActiveMQ Broker Redundant Pair that is imported
* @param securityGroups optionally pass security groups for working with network connections
* @returns a representation of the ActiveMQ Broker Redundant Pair
*/
static fromActiveMqBrokerRedundantPairArn(scope, logicalId, arn, securityGroups) {
return ActiveMqBrokerRedundantPair._assignEndpoints(ActiveMqBrokerRedundantPair._fromActiveMqBrokerDeploymentAttributes(scope, logicalId, arn, undefined, undefined, securityGroups));
}
/**
* Reference an existing ActiveMQ Broker Redundant Pair, defined outside of the CDK code, by its name and id.
*
* @param scope
* @param logicalId
* @param name the name of the existing ActiveMQ Broker Redundant Pair to be imported
* @param id the ID of the existing ActiveMQ Broker Redundant Pair to be imported
* @param securityGroups (optional) pass security groups for working with network connections
* @returns a representation of the ActiveMQ Broker Redundant Pair
*/
static fromActiveMqBrokerRedundantPairNameAndId(scope, logicalId, name, id, securityGroups) {
return ActiveMqBrokerRedundantPair._assignEndpoints(ActiveMqBrokerRedundantPair._fromActiveMqBrokerDeploymentAttributes(scope, logicalId, undefined, name, id, securityGroups));
}
/**
*
* @internal
*/
static _assignEndpoints(imported) {
return Object.assign(imported, {
first: ActiveMqBrokerRedundantPair._buildActiveMqBroker(imported, "-1"),
second: ActiveMqBrokerRedundantPair._buildActiveMqBroker(imported, "-2"),
});
}
constructor(scope, id, props) {
let subnetSelection = props.vpcSubnets;
/* START - Validate subnets and select two with different AZ if more then 2 where found */
// This flag is used to determine if a annotation needs to be done
const annotations = {
warnings: new Array(),
errors: new Array(),
};
// check if subnet selection has been specified
if (props.vpcSubnets && props.vpc) {
let subnets = props.vpc?.selectSubnets(props.vpcSubnets);
if (subnets) {
if (subnets?.subnets.length < 2) {
annotations.errors.push(`Need exactly 2 subnets. '${JSON.stringify(props.vpcSubnets)}', please use a different selection.`);
}
if (subnets?.subnets.length >= 2) {
const azSubnet = [];
// find first two entries that has different az from subnets.availabilityZones
subnets.subnets.find((subnet, index) => {
const candidates = subnets.subnets.filter((p) => p.availabilityZone != subnet.availabilityZone);
if (candidates.length > 0) {
azSubnet.push(subnets.subnets[index]);
azSubnet.push(candidates[0]);
return true;
}
return false;
});
if (azSubnet.length >= 2) {
// take only first two
subnetSelection = { subnets: [azSubnet[0], azSubnet[1]] };
// display warning if other were rejected
if (azSubnet.length > 2)
annotations.warnings.push(`Need exactly 2 subnets from different AZ found more. Selecting only two from different AZs: ${azSubnet[0].subnetId}, ${azSubnet[1].subnetId}`);
}
else {
annotations.warnings.push(`Requirement for exactly 2 subnets from different AZ is not be meet with '${JSON.stringify(props.vpcSubnets)}'`);
}
}
}
}
/* END - Validate subnets and select two with different AZ if more then 2 where found */
super(scope, id, {
...props,
vpcSubnets: subnetSelection,
deploymentMode: broker_deployment_mode_1.BrokerDeploymentMode.ACTIVE_STANDBY_MULTI_AZ,
});
// Provide Annotation to the resource.
if (annotations.warnings.length > 0) {
annotations.warnings.forEach((msg) => aws_cdk_lib_1.Annotations.of(this).addWarning(msg));
}
if (annotations.errors.length > 0) {
annotations.errors.forEach((msg) => aws_cdk_lib_1.Annotations.of(this).addWarning(msg));
}
this.first = {
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)))),
},
stomp: {
url: aws_cdk_lib_1.Fn.select(0, this._resource.attrStompEndpoints),
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.attrStompEndpoints)))),
},
openWire: {
url: aws_cdk_lib_1.Fn.select(0, this._resource.attrOpenWireEndpoints),
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.attrOpenWireEndpoints)))),
},
mqtt: {
url: aws_cdk_lib_1.Fn.select(0, this._resource.attrMqttEndpoints),
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.attrMqttEndpoints)))),
},
wss: {
url: aws_cdk_lib_1.Fn.select(0, this._resource.attrWssEndpoints),
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.attrWssEndpoints)))),
},
console: {
url: `https://${this.id}-1.mq.${aws_cdk_lib_1.Aws.REGION}.amazonaws.com:8162`,
port: 8162,
},
},
ipAddress: aws_cdk_lib_1.Fn.select(0, this._resource.attrIpAddresses),
};
this.second = {
endpoints: {
amqp: {
url: aws_cdk_lib_1.Fn.select(1, 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(1, this._resource.attrAmqpEndpoints)))),
},
stomp: {
url: aws_cdk_lib_1.Fn.select(1, this._resource.attrStompEndpoints),
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(1, this._resource.attrStompEndpoints)))),
},
openWire: {
url: aws_cdk_lib_1.Fn.select(1, this._resource.attrOpenWireEndpoints),
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(1, this._resource.attrOpenWireEndpoints)))),
},
mqtt: {
url: aws_cdk_lib_1.Fn.select(1, this._resource.attrMqttEndpoints),
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(1, this._resource.attrMqttEndpoints)))),
},
wss: {
url: aws_cdk_lib_1.Fn.select(1, this._resource.attrWssEndpoints),
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(1, this._resource.attrWssEndpoints)))),
},
console: {
url: `https://${this.id}-2.mq.${aws_cdk_lib_1.Aws.REGION}.amazonaws.com:8162`,
port: 8162,
},
},
ipAddress: aws_cdk_lib_1.Fn.select(1, this._resource.attrIpAddresses),
};
}
}
exports.ActiveMqBrokerRedundantPair = ActiveMqBrokerRedundantPair;
_a = JSII_RTTI_SYMBOL_1;
ActiveMqBrokerRedundantPair[_a] = { fqn: "@cdklabs/cdk-amazonmq.ActiveMqBrokerRedundantPair", version: "0.1.4" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlbXEtYnJva2VyLXJlZHVuZGFudC1wYWlyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGl2ZW1xL2FjdGl2ZW1xLWJyb2tlci1yZWR1bmRhbnQtcGFpci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBOzs7RUFHRTtBQUNGLDZDQUEwRDtBQUkxRCw2RUFJc0M7QUFDdEMsc0VBQWlFO0FBV2pFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBYSwyQkFDWCxTQUFRLHlEQUE0QjtJQUdwQzs7Ozs7Ozs7T0FRRztJQUNJLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FDOUMsS0FBZ0IsRUFDaEIsU0FBaUIsRUFDakIsR0FBVyxFQUNYLGNBQWlDO1FBRWpDLE9BQU8sMkJBQTJCLENBQUMsZ0JBQWdCLENBQ2pELDJCQUEyQixDQUFDLHVDQUF1QyxDQUNqRSxLQUFLLEVBQ0wsU0FBUyxFQUNULEdBQUcsRUFDSCxTQUFTLEVBQ1QsU0FBUyxFQUNULGNBQWMsQ0FDZixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksTUFBTSxDQUFDLHdDQUF3QyxDQUNwRCxLQUFnQixFQUNoQixTQUFpQixFQUNqQixJQUFZLEVBQ1osRUFBVSxFQUNWLGNBQWlDO1FBRWpDLE9BQU8sMkJBQTJCLENBQUMsZ0JBQWdCLENBQ2pELDJCQUEyQixDQUFDLHVDQUF1QyxDQUNqRSxLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEVBQ0osRUFBRSxFQUNGLGNBQWMsQ0FDZixDQUM4QixDQUFDO0lBQ3BDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxNQUFNLENBQUMsZ0JBQWdCLENBQzdCLFFBQW1DO1FBRW5DLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDN0IsS0FBSyxFQUFFLDJCQUEyQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7WUFDdkUsTUFBTSxFQUFFLDJCQUEyQixD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Q0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO1NBQ3hELENBQUM7SUFDSixDQUFDOztBQWhSSCxrRUFpUkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuKi9cbmltcG9ydCB7IEF3cywgRm4sIFRva2VuLCBBbm5vdGF0aW9ucyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgSVN1Ym5ldCwgSVNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElBY3RpdmVNcUJyb2tlciB9IGZyb20gXCIuL2FjdGl2ZW1xLWJyb2tlclwiO1xuaW1wb3J0IHtcbiAgQWN0aXZlTXFCcm9rZXJEZXBsb3ltZW50QmFzZSxcbiAgQWN0aXZlTXFCcm9rZXJEZXBsb3ltZW50UHJvcHMsXG4gIElBY3RpdmVNcUJyb2tlckRlcGxveW1lbnQsXG59IGZyb20gXCIuL2FjdGl2ZW1xLWJyb2tlci1kZXBsb3ltZW50XCI7XG5pbXBvcnQgeyBCcm9rZXJEZXBsb3ltZW50TW9kZSB9IGZyb20gXCIuLi9icm9rZXItZGVwbG95bWVudC1tb2RlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFjdGl2ZU1xQnJva2VyUmVkdW5kYW50UGFpclxuICBleHRlbmRzIElBY3RpdmVNcUJyb2tlckRlcGxveW1lbnQge1xuICByZWFkb25seSBmaXJzdDogSUFjdGl2ZU1xQnJva2VyO1xuICByZWFkb25seSBzZWNvbmQ6IElBY3RpdmVNcUJyb2tlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXJQcm9wc1xuICBleHRlbmRzIEFjdGl2ZU1xQnJva2VyRGVwbG95bWVudFByb3BzIHt9XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhbiBhY3RpdmUvc3RhbmRieSBicm9rZXIgdGhhdCBpcyBjb21wcmlzZWQgb2YgdHdvIGJyb2tlcnMgaW4gdHdvIGRpZmZlcmVudCBBdmFpbGFiaWxpdHkgWm9uZXMuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpbWl6YXRpb25zOlxuICogLSBXaGVuIHN1Ym5ldCBzZWxlY3Rpb24gcmV0dXJucyBtb3JlIHRoZW4gMiBzdWJuZXRzLiBDb25zdHJ1Y3QgcGlja3MgZmlyc3QgdHdvIHRoYXQgZG8gYmVsb25nIHRvIGRpZmZlcmVudCBBWi4gV2FybmluZyBpcyBhbm5vdGF0ZWQuIElmIHN1Ym5ldCBzZWxlY3Rpb24gZG9lcyBub3QgbWVldCBBWiBjcml0ZXJpYSBhbiBlcnJvciBpcyB0aHJvd24uXG4gKlxuICpcbiAqIHNlZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbi1tcS9sYXRlc3QvZGV2ZWxvcGVyLWd1aWRlL2FjdGl2ZS1zdGFuZGJ5LWJyb2tlci1kZXBsb3ltZW50Lmh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIEFjdGl2ZU1xQnJva2VyUmVkdW5kYW50UGFpclxuICBleHRlbmRzIEFjdGl2ZU1xQnJva2VyRGVwbG95bWVudEJhc2VcbiAgaW1wbGVtZW50cyBJQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyXG57XG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgYW4gZXhpc3RpbmcgQWN0aXZlTVEgQnJva2VyIFJlZHVuZGFudCBQYWlyLCBkZWZpbmVkIG91dHNpZGUgb2YgdGhlIENESyBjb2RlLCBieSBBUk4uXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZVxuICAgKiBAcGFyYW0gbG9naWNhbElkIHRoZSBjb25zdHJ1Y3QncyBsb2dpY2FsIElEXG4gICAqIEBwYXJhbSBhcm4gdGhlIEFSTiBvZiB0aGUgZXhpc3RpbmcgQWN0aXZlTVEgQnJva2VyIFJlZHVuZGFudCBQYWlyIHRoYXQgaXMgaW1wb3J0ZWRcbiAgICogQHBhcmFtIHNlY3VyaXR5R3JvdXBzIG9wdGlvbmFsbHkgcGFzcyBzZWN1cml0eSBncm91cHMgZm9yIHdvcmtpbmcgd2l0aCBuZXR3b3JrIGNvbm5lY3Rpb25zXG4gICAqIEByZXR1cm5zIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIEFjdGl2ZU1RIEJyb2tlciBSZWR1bmRhbnQgUGFpclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyQXJuKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgbG9naWNhbElkOiBzdHJpbmcsXG4gICAgYXJuOiBzdHJpbmcsXG4gICAgc2VjdXJpdHlHcm91cHM/OiBJU2VjdXJpdHlHcm91cFtdLFxuICApOiBJQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyIHtcbiAgICByZXR1cm4gQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyLl9hc3NpZ25FbmRwb2ludHMoXG4gICAgICBBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXIuX2Zyb21BY3RpdmVNcUJyb2tlckRlcGxveW1lbnRBdHRyaWJ1dGVzKFxuICAgICAgICBzY29wZSxcbiAgICAgICAgbG9naWNhbElkLFxuICAgICAgICBhcm4sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBzZWN1cml0eUdyb3VwcyxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgYW4gZXhpc3RpbmcgQWN0aXZlTVEgQnJva2VyIFJlZHVuZGFudCBQYWlyLCBkZWZpbmVkIG91dHNpZGUgb2YgdGhlIENESyBjb2RlLCBieSBpdHMgbmFtZSBhbmQgaWQuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZVxuICAgKiBAcGFyYW0gbG9naWNhbElkXG4gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBleGlzdGluZyBBY3RpdmVNUSBCcm9rZXIgUmVkdW5kYW50IFBhaXIgdG8gYmUgaW1wb3J0ZWRcbiAgICogQHBhcmFtIGlkIHRoZSBJRCBvZiB0aGUgZXhpc3RpbmcgQWN0aXZlTVEgQnJva2VyIFJlZHVuZGFudCBQYWlyIHRvIGJlIGltcG9ydGVkXG4gICAqIEBwYXJhbSBzZWN1cml0eUdyb3VwcyAob3B0aW9uYWwpIHBhc3Mgc2VjdXJpdHkgZ3JvdXBzIGZvciB3b3JraW5nIHdpdGggbmV0d29yayBjb25uZWN0aW9uc1xuICAgKiBAcmV0dXJucyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBBY3RpdmVNUSBCcm9rZXIgUmVkdW5kYW50IFBhaXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUFjdGl2ZU1xQnJva2VyUmVkdW5kYW50UGFpck5hbWVBbmRJZChcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGxvZ2ljYWxJZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHNlY3VyaXR5R3JvdXBzPzogSVNlY3VyaXR5R3JvdXBbXSxcbiAgKSB7XG4gICAgcmV0dXJuIEFjdGl2ZU1xQnJva2VyUmVkdW5kYW50UGFpci5fYXNzaWduRW5kcG9pbnRzKFxuICAgICAgQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyLl9mcm9tQWN0aXZlTXFCcm9rZXJEZXBsb3ltZW50QXR0cmlidXRlcyhcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBuYW1lLFxuICAgICAgICBpZCxcbiAgICAgICAgc2VjdXJpdHlHcm91cHMsXG4gICAgICApLFxuICAgICkgYXMgSUFjdGl2ZU1xQnJva2VyUmVkdW5kYW50UGFpcjtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9hc3NpZ25FbmRwb2ludHMoXG4gICAgaW1wb3J0ZWQ6IElBY3RpdmVNcUJyb2tlckRlcGxveW1lbnQsXG4gICk6IElBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXIge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGltcG9ydGVkLCB7XG4gICAgICBmaXJzdDogQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyLl9idWlsZEFjdGl2ZU1xQnJva2VyKGltcG9ydGVkLCBcIi0xXCIpLFxuICAgICAgc2Vjb25kOiBBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXIuX2J1aWxkQWN0aXZlTXFCcm9rZXIoaW1wb3J0ZWQsIFwiLTJcIiksXG4gICAgfSBhcyBJQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgYnJva2VyIG9mIHRoZSByZWR1bmRhbnQgcGFpciBmb3IgdGhlIGRlcGxveW1lbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZmlyc3Q6IElBY3RpdmVNcUJyb2tlcjtcblxuICAvKipcbiAgICogVGhlIHNlY29uZCBicm9rZXIgb2YgdGhlIHJlZHVuZGFudCBwYWlyIGZvciB0aGUgZGVwbG95bWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzZWNvbmQ6IElBY3RpdmVNcUJyb2tlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEFjdGl2ZU1xQnJva2VyUmVkdW5kYW50UGFpclByb3BzLFxuICApIHtcbiAgICBsZXQgc3VibmV0U2VsZWN0aW9uID0gcHJvcHMudnBjU3VibmV0cztcblxuICAgIC8qIFNUQVJUIC0gVmFsaWRhdGUgc3VibmV0cyBhbmQgc2VsZWN0IHR3byB3aXRoIGRpZmZlcmVudCBBWiBpZiBtb3JlIHRoZW4gMiB3aGVyZSBmb3VuZCAqL1xuICAgIC8vIFRoaXMgZmxhZyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGFubm90YXRpb24gbmVlZHMgdG8gYmUgZG9uZVxuICAgIGNvbnN0IGFubm90YXRpb25zID0ge1xuICAgICAgd2FybmluZ3M6IG5ldyBBcnJheTxzdHJpbmc+KCksXG4gICAgICBlcnJvcnM6IG5ldyBBcnJheTxzdHJpbmc+KCksXG4gICAgfTtcblxuICAgIC8vIGNoZWNrIGlmIHN1Ym5ldCBzZWxlY3Rpb24gaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAgaWYgKHByb3BzLnZwY1N1Ym5ldHMgJiYgcHJvcHMudnBjKSB7XG4gICAgICBsZXQgc3VibmV0cyA9IHByb3BzLnZwYz8uc2VsZWN0U3VibmV0cyhwcm9wcy52cGNTdWJuZXRzKTtcblxuICAgICAgaWYgKHN1Ym5ldHMpIHtcbiAgICAgICAgaWYgKHN1Ym5ldHM/LnN1Ym5ldHMubGVuZ3RoIDwgMikge1xuICAgICAgICAgIGFubm90YXRpb25zLmVycm9ycy5wdXNoKFxuICAgICAgICAgICAgYE5lZWQgZXhhY3RseSAyIHN1Ym5ldHMuICcke0pTT04uc3RyaW5naWZ5KHByb3BzLnZwY1N1Ym5ldHMpfScsIHBsZWFzZSB1c2UgYSBkaWZmZXJlbnQgc2VsZWN0aW9uLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWJuZXRzPy5zdWJuZXRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgY29uc3QgYXpTdWJuZXQ6IElTdWJuZXRbXSA9IFtdO1xuXG4gICAgICAgICAgLy8gZmluZCBmaXJzdCB0d28gZW50cmllcyB0aGF0IGhhcyBkaWZmZXJlbnQgYXogZnJvbSBzdWJuZXRzLmF2YWlsYWJpbGl0eVpvbmVzXG4gICAgICAgICAgc3VibmV0cy5zdWJuZXRzLmZpbmQoKHN1Ym5ldCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBzdWJuZXRzLnN1Ym5ldHMuZmlsdGVyKFxuICAgICAgICAgICAgICAocCkgPT4gcC5hdmFpbGFiaWxpdHlab25lICE9IHN1Ym5ldC5hdmFpbGFiaWxpdHlab25lLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBhelN1Ym5ldC5wdXNoKHN1Ym5ldHMuc3VibmV0c1tpbmRleF0pO1xuICAgICAgICAgICAgICBhelN1Ym5ldC5wdXNoKGNhbmRpZGF0ZXNbMF0pO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKGF6U3VibmV0Lmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAvLyB0YWtlIG9ubHkgZmlyc3QgdHdvXG4gICAgICAgICAgICBzdWJuZXRTZWxlY3Rpb24gPSB7IHN1Ym5ldHM6IFthelN1Ym5ldFswXSwgYXpTdWJuZXRbMV1dIH07XG5cbiAgICAgICAgICAgIC8vIGRpc3BsYXkgd2FybmluZyBpZiBvdGhlciB3ZXJlIHJlamVjdGVkXG4gICAgICAgICAgICBpZiAoYXpTdWJuZXQubGVuZ3RoID4gMilcbiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMud2FybmluZ3MucHVzaChcbiAgICAgICAgICAgICAgICBgTmVlZCBleGFjdGx5IDIgc3VibmV0cyBmcm9tIGRpZmZlcmVudCBBWiBmb3VuZCBtb3JlLiBTZWxlY3Rpbmcgb25seSB0d28gZnJvbSBkaWZmZXJlbnQgQVpzOiAke2F6U3VibmV0WzBdLnN1Ym5ldElkfSwgJHthelN1Ym5ldFsxXS5zdWJuZXRJZH1gLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9ucy53YXJuaW5ncy5wdXNoKFxuICAgICAgICAgICAgICBgUmVxdWlyZW1lbnQgZm9yIGV4YWN0bHkgMiBzdWJuZXRzIGZyb20gZGlmZmVyZW50IEFaIGlzIG5vdCBiZSBtZWV0IHdpdGggJyR7SlNPTi5zdHJpbmdpZnkocHJvcHMudnBjU3VibmV0cyl9J2AsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEVORCAtIFZhbGlkYXRlIHN1Ym5ldHMgYW5kIHNlbGVjdCB0d28gd2l0aCBkaWZmZXJlbnQgQVogaWYgbW9yZSB0aGVuIDIgd2hlcmUgZm91bmQgKi9cblxuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICB2cGNTdWJuZXRzOiBzdWJuZXRTZWxlY3Rpb24sXG4gICAgICBkZXBsb3ltZW50TW9kZTogQnJva2VyRGVwbG95bWVudE1vZGUuQUNUSVZFX1NUQU5EQllfTVVMVElfQVosXG4gICAgfSk7XG5cbiAgICAvLyBQcm92aWRlIEFubm90YXRpb24gdG8gdGhlIHJlc291cmNlLlxuICAgIGlmIChhbm5vdGF0aW9ucy53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBhbm5vdGF0aW9ucy53YXJuaW5ncy5mb3JFYWNoKChtc2cpID0+XG4gICAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmcobXNnKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGFubm90YXRpb25zLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBhbm5vdGF0aW9ucy5lcnJvcnMuZm9yRWFjaCgobXNnKSA9PiBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nKG1zZykpO1xuICAgIH1cblxuICAgIHRoaXMuZmlyc3QgPSB7XG4gICAgICBlbmRwb2ludHM6IHtcbiAgICAgICAgYW1xcDoge1xuICAgICAgICAgIHVybDogRm4uc2VsZWN0KDAsIHRoaXMuX3Jlc291cmNlLmF0dHJBbXFwRW5kcG9pbnRzKSxcbiAgICAgICAgICBwb3J0OiBUb2tlbi5hc051bWJlcihcbiAgICAgICAgICAgIEZuLnNlbGVjdChcbiAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgRm4uc3BsaXQoXCI6XCIsIEZuLnNlbGVjdCgwLCB0aGlzLl9yZXNvdXJjZS5hdHRyQW1xcEVuZHBvaW50cykpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBzdG9tcDoge1xuICAgICAgICAgIHVybDogRm4uc2VsZWN0KDAsIHRoaXMuX3Jlc291cmNlLmF0dHJTdG9tcEVuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMCwgdGhpcy5fcmVzb3VyY2UuYXR0clN0b21wRW5kcG9pbnRzKSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG9wZW5XaXJlOiB7XG4gICAgICAgICAgdXJsOiBGbi5zZWxlY3QoMCwgdGhpcy5fcmVzb3VyY2UuYXR0ck9wZW5XaXJlRW5kcG9pbnRzKSxcbiAgICAgICAgICBwb3J0OiBUb2tlbi5hc051bWJlcihcbiAgICAgICAgICAgIEZuLnNlbGVjdChcbiAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgRm4uc3BsaXQoXCI6XCIsIEZuLnNlbGVjdCgwLCB0aGlzLl9yZXNvdXJjZS5hdHRyT3BlbldpcmVFbmRwb2ludHMpKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgbXF0dDoge1xuICAgICAgICAgIHVybDogRm4uc2VsZWN0KDAsIHRoaXMuX3Jlc291cmNlLmF0dHJNcXR0RW5kcG9pbnRzKSxcbiAgICAgICAgICBwb3J0OiBUb2tlbi5hc051bWJlcihcbiAgICAgICAgICAgIEZuLnNlbGVjdChcbiAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgRm4uc3BsaXQoXCI6XCIsIEZuLnNlbGVjdCgwLCB0aGlzLl9yZXNvdXJjZS5hdHRyTXF0dEVuZHBvaW50cykpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICB3c3M6IHtcbiAgICAgICAgICB1cmw6IEZuLnNlbGVjdCgwLCB0aGlzLl9yZXNvdXJjZS5hdHRyV3NzRW5kcG9pbnRzKSxcbiAgICAgICAgICBwb3J0OiBUb2tlbi5hc051bWJlcihcbiAgICAgICAgICAgIEZuLnNlbGVjdChcbiAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgRm4uc3BsaXQoXCI6XCIsIEZuLnNlbGVjdCgwLCB0aGlzLl9yZXNvdXJjZS5hdHRyV3NzRW5kcG9pbnRzKSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnNvbGU6IHtcbiAgICAgICAgICB1cmw6IGBodHRwczovLyR7dGhpcy5pZH0tMS5tcS4ke0F3cy5SRUdJT059LmFtYXpvbmF3cy5jb206ODE2MmAsXG4gICAgICAgICAgcG9ydDogODE2MixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBpcEFkZHJlc3M6IEZuLnNlbGVjdCgwLCB0aGlzLl9yZXNvdXJjZS5hdHRySXBBZGRyZXNzZXMpLFxuICAgIH07XG5cbiAgICB0aGlzLnNlY29uZCA9IHtcbiAgICAgIGVuZHBvaW50czoge1xuICAgICAgICBhbXFwOiB7XG4gICAgICAgICAgdXJsOiBGbi5zZWxlY3QoMSwgdGhpcy5fcmVzb3VyY2UuYXR0ckFtcXBFbmRwb2ludHMpLFxuICAgICAgICAgIHBvcnQ6IFRva2VuLmFzTnVtYmVyKFxuICAgICAgICAgICAgRm4uc2VsZWN0KFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICBGbi5zcGxpdChcIjpcIiwgRm4uc2VsZWN0KDEsIHRoaXMuX3Jlc291cmNlLmF0dHJBbXFwRW5kcG9pbnRzKSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIHN0b21wOiB7XG4gICAgICAgICAgdXJsOiBGbi5zZWxlY3QoMSwgdGhpcy5fcmVzb3VyY2UuYXR0clN0b21wRW5kcG9pbnRzKSxcbiAgICAgICAgICBwb3J0OiBUb2tlbi5hc051bWJlcihcbiAgICAgICAgICAgIEZuLnNlbGVjdChcbiAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgRm4uc3BsaXQoXCI6XCIsIEZuLnNlbGVjdCgxLCB0aGlzLl9yZXNvdXJjZS5hdHRyU3RvbXBFbmRwb2ludHMpKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgb3BlbldpcmU6IHtcbiAgICAgICAgICB1cmw6IEZuLnNlbGVjdCgxLCB0aGlzLl9yZXNvdXJjZS5hdHRyT3BlbldpcmVFbmRwb2ludHMpLFxuICAgICAgICAgIHBvcnQ6IFRva2VuLmFzTnVtYmVyKFxuICAgICAgICAgICAgRm4uc2VsZWN0KFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICBGbi5zcGxpdChcIjpcIiwgRm4uc2VsZWN0KDEsIHRoaXMuX3Jlc291cmNlLmF0dHJPcGVuV2lyZUVuZHBvaW50cykpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBtcXR0OiB7XG4gICAgICAgICAgdXJsOiBGbi5zZWxlY3QoMSwgdGhpcy5fcmVzb3VyY2UuYXR0ck1xdHRFbmRwb2ludHMpLFxuICAgICAgICAgIHBvcnQ6IFRva2VuLmFzTnVtYmVyKFxuICAgICAgICAgICAgRm4uc2VsZWN0KFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICBGbi5zcGxpdChcIjpcIiwgRm4uc2VsZWN0KDEsIHRoaXMuX3Jlc291cmNlLmF0dHJNcXR0RW5kcG9pbnRzKSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIHdzczoge1xuICAgICAgICAgIHVybDogRm4uc2VsZWN0KDEsIHRoaXMuX3Jlc291cmNlLmF0dHJXc3NFbmRwb2ludHMpLFxuICAgICAgICAgIHBvcnQ6IFRva2VuLmFzTnVtYmVyKFxuICAgICAgICAgICAgRm4uc2VsZWN0KFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICBGbi5zcGxpdChcIjpcIiwgRm4uc2VsZWN0KDEsIHRoaXMuX3Jlc291cmNlLmF0dHJXc3NFbmRwb2ludHMpKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgY29uc29sZToge1xuICAgICAgICAgIHVybDogYGh0dHBzOi8vJHt0aGlzLmlkfS0yLm1xLiR7QXdzLlJFR0lPTn0uYW1hem9uYXdzLmNvbTo4MTYyYCxcbiAgICAgICAgICBwb3J0OiA4MTYyLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGlwQWRkcmVzczogRm4uc2VsZWN0KDEsIHRoaXMuX3Jlc291cmNlLmF0dHJJcEFkZHJlc3NlcyksXG4gICAgfTtcbiAgfVxufVxuIl19