@aws-cdk/aws-ecs
Version:
The CDK Construct Library for AWS::ECS
180 lines • 22.6 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExternalService = void 0;
const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const core_1 = require("@aws-cdk/core");
const base_service_1 = require("../base/base-service");
const from_service_attributes_1 = require("../base/from-service-attributes");
const task_definition_1 = require("../base/task-definition");
/**
* This creates a service using the External launch type on an ECS cluster.
*
* @resource AWS::ECS::Service
*/
class ExternalService extends base_service_1.BaseService {
/**
* Constructs a new instance of the ExternalService class.
*/
constructor(scope, id, props) {
var _b, _c;
try {
jsiiDeprecationWarnings._aws_cdk_aws_ecs_ExternalServiceProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.constructor);
}
throw error;
}
if (props.minHealthyPercent !== undefined && props.maxHealthyPercent !== undefined && props.minHealthyPercent >= props.maxHealthyPercent) {
throw new Error('Minimum healthy percent must be less than maximum healthy percent.');
}
if (props.taskDefinition.compatibility !== task_definition_1.Compatibility.EXTERNAL) {
throw new Error('Supplied TaskDefinition is not configured for compatibility with ECS Anywhere cluster');
}
if (props.cluster.defaultCloudMapNamespace !== undefined) {
throw new Error(`Cloud map integration is not supported for External service ${props.cluster.defaultCloudMapNamespace}`);
}
if (props.cloudMapOptions !== undefined) {
throw new Error('Cloud map options are not supported for External service');
}
if (props.enableExecuteCommand !== undefined) {
throw new Error('Enable Execute Command options are not supported for External service');
}
if (props.capacityProviderStrategies !== undefined) {
throw new Error('Capacity Providers are not supported for External service');
}
const propagateTagsFromSource = (_b = props.propagateTags) !== null && _b !== void 0 ? _b : base_service_1.PropagatedTagSource.NONE;
super(scope, id, {
...props,
desiredCount: props.desiredCount,
maxHealthyPercent: props.maxHealthyPercent === undefined ? 100 : props.maxHealthyPercent,
minHealthyPercent: props.minHealthyPercent === undefined ? 0 : props.minHealthyPercent,
launchType: base_service_1.LaunchType.EXTERNAL,
propagateTags: propagateTagsFromSource,
enableECSManagedTags: props.enableECSManagedTags,
}, {
cluster: props.cluster.clusterName,
taskDefinition: ((_c = props.deploymentController) === null || _c === void 0 ? void 0 : _c.type) === base_service_1.DeploymentControllerType.EXTERNAL ? undefined : props.taskDefinition.taskDefinitionArn,
}, props.taskDefinition);
this.node.addValidation({
validate: () => !this.taskDefinition.defaultContainer ? ['A TaskDefinition must have at least one essential container'] : [],
});
this.node.addValidation({
validate: () => this.networkConfiguration !== undefined ? ['Network configurations not supported for an external service'] : [],
});
}
/**
* Imports from the specified service ARN.
*/
static fromExternalServiceArn(scope, id, externalServiceArn) {
class Import extends core_1.Resource {
constructor() {
super(...arguments);
this.serviceArn = externalServiceArn;
this.serviceName = core_1.Stack.of(scope).splitArn(externalServiceArn, core_1.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
}
}
return new Import(scope, id);
}
/**
* Imports from the specified service attrributes.
*/
static fromExternalServiceAttributes(scope, id, attrs) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_ecs_ExternalServiceAttributes(attrs);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.fromExternalServiceAttributes);
}
throw error;
}
return from_service_attributes_1.fromServiceAtrributes(scope, id, attrs);
}
/**
* Overriden method to throw error as `attachToApplicationTargetGroup` is not supported for external service
*/
attachToApplicationTargetGroup(_targetGroup) {
throw new Error('Application load balancer cannot be attached to an external service');
}
/**
* Overriden method to throw error as `loadBalancerTarget` is not supported for external service
*/
loadBalancerTarget(_options) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_ecs_LoadBalancerTargetOptions(_options);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.loadBalancerTarget);
}
throw error;
}
throw new Error('External service cannot be attached as load balancer targets');
}
/**
* Overriden method to throw error as `registerLoadBalancerTargets` is not supported for external service
*/
registerLoadBalancerTargets(..._targets) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_ecs_EcsTarget(_targets);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.registerLoadBalancerTargets);
}
throw error;
}
throw new Error('External service cannot be registered as load balancer targets');
}
/**
* Overriden method to throw error as `configureAwsVpcNetworkingWithSecurityGroups` is not supported for external service
*/
// eslint-disable-next-line max-len, no-unused-vars
configureAwsVpcNetworkingWithSecurityGroups(_vpc, _assignPublicIp, _vpcSubnets, _securityGroups) {
throw new Error('Only Bridge network mode is supported for external service');
}
/**
* Overriden method to throw error as `autoScaleTaskCount` is not supported for external service
*/
autoScaleTaskCount(_props) {
throw new Error('Autoscaling not supported for external service');
}
/**
* Overriden method to throw error as `enableCloudMap` is not supported for external service
*/
enableCloudMap(_options) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_ecs_CloudMapOptions(_options);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.enableCloudMap);
}
throw error;
}
throw new Error('Cloud map integration not supported for an external service');
}
/**
* Overriden method to throw error as `associateCloudMapService` is not supported for external service
*/
associateCloudMapService(_options) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_ecs_AssociateCloudMapServiceOptions(_options);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.associateCloudMapService);
}
throw error;
}
throw new Error('Cloud map service association is not supported for an external service');
}
}
exports.ExternalService = ExternalService;
_a = JSII_RTTI_SYMBOL_1;
ExternalService[_a] = { fqn: "@aws-cdk/aws-ecs.ExternalService", version: "1.156.1" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZXJuYWwtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImV4dGVybmFsLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBSUEsd0NBQTJEO0FBRTNELHVEQUErTztBQUMvTyw2RUFBd0U7QUFFeEUsNkRBQW1HO0FBcURuRzs7OztHQUlHO0FBQ0gsTUFBYSxlQUFnQixTQUFRLDBCQUFXO0lBb0I5Qzs7T0FFRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkI7Ozs7Ozs7Ozs7O1FBQ25FLElBQUksS0FBSyxDQUFDLGlCQUFpQixLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEVBQUU7WUFDeEksTUFBTSxJQUFJLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1NBQ3ZGO1FBRUQsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLGFBQWEsS0FBSywrQkFBYSxDQUFDLFFBQVEsRUFBRTtZQUNqRSxNQUFNLElBQUksS0FBSyxDQUFDLHVGQUF1RixDQUFDLENBQUM7U0FDMUc7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEtBQUssU0FBUyxFQUFFO1lBQ3hELE1BQU0sSUFBSSxLQUFLLENBQUUsK0RBQStELEtBQUssQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO1NBQzNIO1FBRUQsSUFBSSxLQUFLLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRTtZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFFLDBEQUEwRCxDQUFDLENBQUM7U0FDOUU7UUFFRCxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLEVBQUU7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBRSx1RUFBdUUsQ0FBQyxDQUFDO1NBQzNGO1FBRUQsSUFBSSxLQUFLLENBQUMsMEJBQTBCLEtBQUssU0FBUyxFQUFFO1lBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUUsMkRBQTJELENBQUMsQ0FBQztTQUMvRTtRQUVELE1BQU0sdUJBQXVCLFNBQUcsS0FBSyxDQUFDLGFBQWEsbUNBQUksa0NBQW1CLENBQUMsSUFBSSxDQUFDO1FBRWhGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1IsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGlCQUFpQjtZQUN4RixpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUI7WUFDdEYsVUFBVSxFQUFFLHlCQUFVLENBQUMsUUFBUTtZQUMvQixhQUFhLEVBQUUsdUJBQXVCO1lBQ3RDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxvQkFBb0I7U0FDakQsRUFDRDtZQUNFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDbEMsY0FBYyxFQUFFLE9BQUEsS0FBSyxDQUFDLG9CQUFvQiwwQ0FBRSxJQUFJLE1BQUssdUNBQXdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsaUJBQWlCO1NBQzVJLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXpCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3RCLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsNkRBQTZELENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUM3SCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN0QixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw4REFBOEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQ2hJLENBQUMsQ0FBQztLQUNKO0lBckVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLGtCQUEwQjtRQUMzRixNQUFNLE1BQU8sU0FBUSxlQUFRO1lBQTdCOztnQkFDa0IsZUFBVSxHQUFHLGtCQUFrQixDQUFDO2dCQUNoQyxnQkFBVyxHQUFHLFlBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLGdCQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxZQUFzQixDQUFDO1lBQ25JLENBQUM7U0FBQTtRQUNELE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzlCO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsNkJBQTZCLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZ0M7Ozs7Ozs7Ozs7UUFDeEcsT0FBTywrQ0FBcUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2hEO0lBdUREOztPQUVHO0lBQ0ksOEJBQThCLENBQUMsWUFBMkM7UUFDL0UsTUFBTSxJQUFJLEtBQUssQ0FBRSxxRUFBcUUsQ0FBQyxDQUFDO0tBQ3pGO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0IsQ0FBQyxRQUFtQzs7Ozs7Ozs7OztRQUMzRCxNQUFNLElBQUksS0FBSyxDQUFFLDhEQUE4RCxDQUFDLENBQUM7S0FDbEY7SUFFRDs7T0FFRztJQUNJLDJCQUEyQixDQUFDLEdBQUcsUUFBcUI7Ozs7Ozs7Ozs7UUFDekQsTUFBTSxJQUFJLEtBQUssQ0FBRSxnRUFBZ0UsQ0FBQyxDQUFDO0tBQ3BGO0lBRUQ7O09BRUc7SUFDSCxtREFBbUQ7SUFDekMsMkNBQTJDLENBQUMsSUFBYyxFQUFFLGVBQXlCLEVBQUUsV0FBaUMsRUFBRSxlQUFzQztRQUN4SyxNQUFNLElBQUksS0FBSyxDQUFFLDREQUE0RCxDQUFDLENBQUM7S0FDaEY7SUFFRDs7T0FFRztJQUNJLGtCQUFrQixDQUFDLE1BQXFDO1FBQzdELE1BQU0sSUFBSSxLQUFLLENBQUUsZ0RBQWdELENBQUMsQ0FBQztLQUNwRTtJQUVEOztPQUVHO0lBQ0ksY0FBYyxDQUFDLFFBQXlCOzs7Ozs7Ozs7O1FBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUUsNkRBQTZELENBQUMsQ0FBQztLQUNqRjtJQUVEOztPQUVHO0lBQ0ksd0JBQXdCLENBQUMsUUFBeUM7Ozs7Ozs7Ozs7UUFDdkUsTUFBTSxJQUFJLEtBQUssQ0FBRSx3RUFBd0UsQ0FBQyxDQUFDO0tBQzVGOztBQXpISCwwQ0EwSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhcHBzY2FsaW5nIGZyb20gJ0Bhd3MtY2RrL2F3cy1hcHBsaWNhdGlvbmF1dG9zY2FsaW5nJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdAYXdzLWNkay9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGVsYnYyIGZyb20gJ0Bhd3MtY2RrL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyJztcbmltcG9ydCAqIGFzIGNsb3VkbWFwIGZyb20gJ0Bhd3MtY2RrL2F3cy1zZXJ2aWNlZGlzY292ZXJ5JztcbmltcG9ydCB7IEFybkZvcm1hdCwgUmVzb3VyY2UsIFN0YWNrIH0gZnJvbSAnQGF3cy1jZGsvY29yZSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEFzc29jaWF0ZUNsb3VkTWFwU2VydmljZU9wdGlvbnMsIEJhc2VTZXJ2aWNlLCBCYXNlU2VydmljZU9wdGlvbnMsIENsb3VkTWFwT3B0aW9ucywgRGVwbG95bWVudENvbnRyb2xsZXJUeXBlLCBFY3NUYXJnZXQsIElCYXNlU2VydmljZSwgSUVjc0xvYWRCYWxhbmNlclRhcmdldCwgSVNlcnZpY2UsIExhdW5jaFR5cGUsIFByb3BhZ2F0ZWRUYWdTb3VyY2UgfSBmcm9tICcuLi9iYXNlL2Jhc2Utc2VydmljZSc7XG5pbXBvcnQgeyBmcm9tU2VydmljZUF0cnJpYnV0ZXMgfSBmcm9tICcuLi9iYXNlL2Zyb20tc2VydmljZS1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IFNjYWxhYmxlVGFza0NvdW50IH0gZnJvbSAnLi4vYmFzZS9zY2FsYWJsZS10YXNrLWNvdW50JztcbmltcG9ydCB7IENvbXBhdGliaWxpdHksIExvYWRCYWxhbmNlclRhcmdldE9wdGlvbnMsIFRhc2tEZWZpbml0aW9uIH0gZnJvbSAnLi4vYmFzZS90YXNrLWRlZmluaXRpb24nO1xuaW1wb3J0IHsgSUNsdXN0ZXIgfSBmcm9tICcuLi9jbHVzdGVyJztcbi8qKlxuICogVGhlIHByb3BlcnRpZXMgZm9yIGRlZmluaW5nIGEgc2VydmljZSB1c2luZyB0aGUgRXh0ZXJuYWwgbGF1bmNoIHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxTZXJ2aWNlUHJvcHMgZXh0ZW5kcyBCYXNlU2VydmljZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHRhc2sgZGVmaW5pdGlvbiB0byB1c2UgZm9yIHRhc2tzIGluIHRoZSBzZXJ2aWNlLlxuICAgKlxuICAgKiBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcmVhZG9ubHkgdGFza0RlZmluaXRpb246IFRhc2tEZWZpbml0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VjdXJpdHkgZ3JvdXBzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzZXJ2aWNlLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBzZWN1cml0eSBncm91cCwgYSBuZXcgc2VjdXJpdHkgZ3JvdXAgaXMgY3JlYXRlZC5cbiAgICpcbiAgICpcbiAgICogQGRlZmF1bHQgLSBBIG5ldyBzZWN1cml0eSBncm91cCBpcyBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBlYzIuSVNlY3VyaXR5R3JvdXBbXTtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHNlcnZpY2UgdXNpbmcgdGhlIEV4dGVybmFsIGxhdW5jaCB0eXBlIG9uIGFuIEVDUyBjbHVzdGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHRlcm5hbFNlcnZpY2UgZXh0ZW5kcyBJU2VydmljZSB7XG5cbn1cblxuLyoqXG4gKiBUaGUgcHJvcGVydGllcyB0byBpbXBvcnQgZnJvbSB0aGUgc2VydmljZSB1c2luZyB0aGUgRXh0ZXJuYWwgbGF1bmNoIHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxTZXJ2aWNlQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgY2x1c3RlciB0aGF0IGhvc3RzIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgY2x1c3RlcjogSUNsdXN0ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIEFSTi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBlaXRoZXIgdGhpcywgb3Ige0BsaW5rIHNlcnZpY2VOYW1lfSwgaXMgcmVxdWlyZWRcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGVpdGhlciB0aGlzLCBvciB7QGxpbmsgc2VydmljZUFybn0sIGlzIHJlcXVpcmVkXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGlzIGNyZWF0ZXMgYSBzZXJ2aWNlIHVzaW5nIHRoZSBFeHRlcm5hbCBsYXVuY2ggdHlwZSBvbiBhbiBFQ1MgY2x1c3Rlci5cbiAqXG4gKiBAcmVzb3VyY2UgQVdTOjpFQ1M6OlNlcnZpY2VcbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsU2VydmljZSBleHRlbmRzIEJhc2VTZXJ2aWNlIGltcGxlbWVudHMgSUV4dGVybmFsU2VydmljZSB7XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgQVJOLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRXh0ZXJuYWxTZXJ2aWNlQXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGV4dGVybmFsU2VydmljZUFybjogc3RyaW5nKTogSUV4dGVybmFsU2VydmljZSB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJRXh0ZXJuYWxTZXJ2aWNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBzZXJ2aWNlQXJuID0gZXh0ZXJuYWxTZXJ2aWNlQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHNlcnZpY2VOYW1lID0gU3RhY2sub2Yoc2NvcGUpLnNwbGl0QXJuKGV4dGVybmFsU2VydmljZUFybiwgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpLnJlc291cmNlTmFtZSBhcyBzdHJpbmc7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBmcm9tIHRoZSBzcGVjaWZpZWQgc2VydmljZSBhdHRycmlidXRlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUV4dGVybmFsU2VydmljZUF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IEV4dGVybmFsU2VydmljZUF0dHJpYnV0ZXMpOiBJQmFzZVNlcnZpY2Uge1xuICAgIHJldHVybiBmcm9tU2VydmljZUF0cnJpYnV0ZXMoc2NvcGUsIGlkLCBhdHRycyk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRXh0ZXJuYWxTZXJ2aWNlIGNsYXNzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEV4dGVybmFsU2VydmljZVByb3BzKSB7XG4gICAgaWYgKHByb3BzLm1pbkhlYWx0aHlQZXJjZW50ICE9PSB1bmRlZmluZWQgJiYgcHJvcHMubWF4SGVhbHRoeVBlcmNlbnQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5taW5IZWFsdGh5UGVyY2VudCA+PSBwcm9wcy5tYXhIZWFsdGh5UGVyY2VudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaW5pbXVtIGhlYWx0aHkgcGVyY2VudCBtdXN0IGJlIGxlc3MgdGhhbiBtYXhpbXVtIGhlYWx0aHkgcGVyY2VudC4nKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMudGFza0RlZmluaXRpb24uY29tcGF0aWJpbGl0eSAhPT0gQ29tcGF0aWJpbGl0eS5FWFRFUk5BTCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwbGllZCBUYXNrRGVmaW5pdGlvbiBpcyBub3QgY29uZmlndXJlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIEVDUyBBbnl3aGVyZSBjbHVzdGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmNsdXN0ZXIuZGVmYXVsdENsb3VkTWFwTmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvciAoYENsb3VkIG1hcCBpbnRlZ3JhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBFeHRlcm5hbCBzZXJ2aWNlICR7cHJvcHMuY2x1c3Rlci5kZWZhdWx0Q2xvdWRNYXBOYW1lc3BhY2V9YCk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmNsb3VkTWFwT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IgKCdDbG91ZCBtYXAgb3B0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgRXh0ZXJuYWwgc2VydmljZScpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5lbmFibGVFeGVjdXRlQ29tbWFuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IgKCdFbmFibGUgRXhlY3V0ZSBDb21tYW5kIG9wdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIEV4dGVybmFsIHNlcnZpY2UnKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuY2FwYWNpdHlQcm92aWRlclN0cmF0ZWdpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yICgnQ2FwYWNpdHkgUHJvdmlkZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBFeHRlcm5hbCBzZXJ2aWNlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGFnYXRlVGFnc0Zyb21Tb3VyY2UgPSBwcm9wcy5wcm9wYWdhdGVUYWdzID8/IFByb3BhZ2F0ZWRUYWdTb3VyY2UuTk9ORTtcblxuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBkZXNpcmVkQ291bnQ6IHByb3BzLmRlc2lyZWRDb3VudCxcbiAgICAgIG1heEhlYWx0aHlQZXJjZW50OiBwcm9wcy5tYXhIZWFsdGh5UGVyY2VudCA9PT0gdW5kZWZpbmVkID8gMTAwIDogcHJvcHMubWF4SGVhbHRoeVBlcmNlbnQsXG4gICAgICBtaW5IZWFsdGh5UGVyY2VudDogcHJvcHMubWluSGVhbHRoeVBlcmNlbnQgPT09IHVuZGVmaW5lZCA/IDAgOiBwcm9wcy5taW5IZWFsdGh5UGVyY2VudCxcbiAgICAgIGxhdW5jaFR5cGU6IExhdW5jaFR5cGUuRVhURVJOQUwsXG4gICAgICBwcm9wYWdhdGVUYWdzOiBwcm9wYWdhdGVUYWdzRnJvbVNvdXJjZSxcbiAgICAgIGVuYWJsZUVDU01hbmFnZWRUYWdzOiBwcm9wcy5lbmFibGVFQ1NNYW5hZ2VkVGFncyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGNsdXN0ZXI6IHByb3BzLmNsdXN0ZXIuY2x1c3Rlck5hbWUsXG4gICAgICB0YXNrRGVmaW5pdGlvbjogcHJvcHMuZGVwbG95bWVudENvbnRyb2xsZXI/LnR5cGUgPT09IERlcGxveW1lbnRDb250cm9sbGVyVHlwZS5FWFRFUk5BTCA/IHVuZGVmaW5lZCA6IHByb3BzLnRhc2tEZWZpbml0aW9uLnRhc2tEZWZpbml0aW9uQXJuLFxuICAgIH0sIHByb3BzLnRhc2tEZWZpbml0aW9uKTtcblxuICAgIHRoaXMubm9kZS5hZGRWYWxpZGF0aW9uKHtcbiAgICAgIHZhbGlkYXRlOiAoKSA9PiAhdGhpcy50YXNrRGVmaW5pdGlvbi5kZWZhdWx0Q29udGFpbmVyID8gWydBIFRhc2tEZWZpbml0aW9uIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZXNzZW50aWFsIGNvbnRhaW5lciddIDogW10sXG4gICAgfSk7XG5cbiAgICB0aGlzLm5vZGUuYWRkVmFsaWRhdGlvbih7XG4gICAgICB2YWxpZGF0ZTogKCkgPT4gdGhpcy5uZXR3b3JrQ29uZmlndXJhdGlvbiAhPT0gdW5kZWZpbmVkID8gWydOZXR3b3JrIGNvbmZpZ3VyYXRpb25zIG5vdCBzdXBwb3J0ZWQgZm9yIGFuIGV4dGVybmFsIHNlcnZpY2UnXSA6IFtdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlbiBtZXRob2QgdG8gdGhyb3cgZXJyb3IgYXMgYGF0dGFjaFRvQXBwbGljYXRpb25UYXJnZXRHcm91cGAgaXMgbm90IHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgc2VydmljZVxuICAgKi9cbiAgcHVibGljIGF0dGFjaFRvQXBwbGljYXRpb25UYXJnZXRHcm91cChfdGFyZ2V0R3JvdXA6IGVsYnYyLklBcHBsaWNhdGlvblRhcmdldEdyb3VwKTogZWxidjIuTG9hZEJhbGFuY2VyVGFyZ2V0UHJvcHMge1xuICAgIHRocm93IG5ldyBFcnJvciAoJ0FwcGxpY2F0aW9uIGxvYWQgYmFsYW5jZXIgY2Fubm90IGJlIGF0dGFjaGVkIHRvIGFuIGV4dGVybmFsIHNlcnZpY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZW4gbWV0aG9kIHRvIHRocm93IGVycm9yIGFzIGBsb2FkQmFsYW5jZXJUYXJnZXRgIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGV4dGVybmFsIHNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBsb2FkQmFsYW5jZXJUYXJnZXQoX29wdGlvbnM6IExvYWRCYWxhbmNlclRhcmdldE9wdGlvbnMpOiBJRWNzTG9hZEJhbGFuY2VyVGFyZ2V0IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IgKCdFeHRlcm5hbCBzZXJ2aWNlIGNhbm5vdCBiZSBhdHRhY2hlZCBhcyBsb2FkIGJhbGFuY2VyIHRhcmdldHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZW4gbWV0aG9kIHRvIHRocm93IGVycm9yIGFzIGByZWdpc3RlckxvYWRCYWxhbmNlclRhcmdldHNgIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGV4dGVybmFsIHNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckxvYWRCYWxhbmNlclRhcmdldHMoLi4uX3RhcmdldHM6IEVjc1RhcmdldFtdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yICgnRXh0ZXJuYWwgc2VydmljZSBjYW5ub3QgYmUgcmVnaXN0ZXJlZCBhcyBsb2FkIGJhbGFuY2VyIHRhcmdldHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZW4gbWV0aG9kIHRvIHRocm93IGVycm9yIGFzIGBjb25maWd1cmVBd3NWcGNOZXR3b3JraW5nV2l0aFNlY3VyaXR5R3JvdXBzYCBpcyBub3Qgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzZXJ2aWNlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlbiwgbm8tdW51c2VkLXZhcnNcbiAgcHJvdGVjdGVkIGNvbmZpZ3VyZUF3c1ZwY05ldHdvcmtpbmdXaXRoU2VjdXJpdHlHcm91cHMoX3ZwYzogZWMyLklWcGMsIF9hc3NpZ25QdWJsaWNJcD86IGJvb2xlYW4sIF92cGNTdWJuZXRzPzogZWMyLlN1Ym5ldFNlbGVjdGlvbiwgX3NlY3VyaXR5R3JvdXBzPzogZWMyLklTZWN1cml0eUdyb3VwW10pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IgKCdPbmx5IEJyaWRnZSBuZXR3b3JrIG1vZGUgaXMgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzZXJ2aWNlJyk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVuIG1ldGhvZCB0byB0aHJvdyBlcnJvciBhcyBgYXV0b1NjYWxlVGFza0NvdW50YCBpcyBub3Qgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgYXV0b1NjYWxlVGFza0NvdW50KF9wcm9wczogYXBwc2NhbGluZy5FbmFibGVTY2FsaW5nUHJvcHMpOiBTY2FsYWJsZVRhc2tDb3VudCB7XG4gICAgdGhyb3cgbmV3IEVycm9yICgnQXV0b3NjYWxpbmcgbm90IHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgc2VydmljZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlbiBtZXRob2QgdG8gdGhyb3cgZXJyb3IgYXMgYGVuYWJsZUNsb3VkTWFwYCBpcyBub3Qgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgZW5hYmxlQ2xvdWRNYXAoX29wdGlvbnM6IENsb3VkTWFwT3B0aW9ucyk6IGNsb3VkbWFwLlNlcnZpY2Uge1xuICAgIHRocm93IG5ldyBFcnJvciAoJ0Nsb3VkIG1hcCBpbnRlZ3JhdGlvbiBub3Qgc3VwcG9ydGVkIGZvciBhbiBleHRlcm5hbCBzZXJ2aWNlJyk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVuIG1ldGhvZCB0byB0aHJvdyBlcnJvciBhcyBgYXNzb2NpYXRlQ2xvdWRNYXBTZXJ2aWNlYCBpcyBub3Qgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgYXNzb2NpYXRlQ2xvdWRNYXBTZXJ2aWNlKF9vcHRpb25zOiBBc3NvY2lhdGVDbG91ZE1hcFNlcnZpY2VPcHRpb25zKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yICgnQ2xvdWQgbWFwIHNlcnZpY2UgYXNzb2NpYXRpb24gaXMgbm90IHN1cHBvcnRlZCBmb3IgYW4gZXh0ZXJuYWwgc2VydmljZScpO1xuICB9XG59XG4iXX0=