@aws-cdk/aws-cloud9-alpha
Version:
The CDK Construct Library for AWS::Cloud9
270 lines • 28.8 kB
JavaScript
;
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
var _, done = false;
for (var i = decorators.length - 1; i >= 0; i--) {
var context = {};
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
if (kind === "accessor") {
if (result === void 0) continue;
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
if (_ = accept(result.get)) descriptor.get = _;
if (_ = accept(result.set)) descriptor.set = _;
if (_ = accept(result.init)) initializers.unshift(_);
}
else if (_ = accept(result)) {
if (kind === "field") initializers.unshift(_);
else descriptor[key] = _;
}
}
if (target) Object.defineProperty(target, contextIn.name, descriptor);
done = true;
};
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
var useValue = arguments.length > 2;
for (var i = 0; i < initializers.length; i++) {
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
}
return useValue ? value : void 0;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Owner = exports.CloneRepository = exports.Ec2Environment = exports.ImageId = exports.ConnectionType = void 0;
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const ec2 = require("aws-cdk-lib/aws-ec2");
const cdk = require("aws-cdk-lib/core");
const aws_cloud9_1 = require("aws-cdk-lib/aws-cloud9");
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
/**
* The connection type used for connecting to an Amazon EC2 environment.
*/
var ConnectionType;
(function (ConnectionType) {
/**
* Connect through SSH
*/
ConnectionType["CONNECT_SSH"] = "CONNECT_SSH";
/**
* Connect through AWS Systems Manager
* When using SSM, service role and instance profile aren't automatically created.
* See https://docs.aws.amazon.com/cloud9/latest/user-guide/ec2-ssm.html#service-role-ssm
*/
ConnectionType["CONNECT_SSM"] = "CONNECT_SSM";
})(ConnectionType || (exports.ConnectionType = ConnectionType = {}));
/**
* The image ID used for creating an Amazon EC2 environment.
*/
var ImageId;
(function (ImageId) {
/**
* Create using Amazon Linux 2
*/
ImageId["AMAZON_LINUX_2"] = "amazonlinux-2-x86_64";
/**
* Create using Amazon Linux 2023
*/
ImageId["AMAZON_LINUX_2023"] = "amazonlinux-2023-x86_64";
/**
* Create using Ubuntu 18.04
*
* @deprecated Since Ubuntu 18.04 has ended standard support as of May 31, 2023, we recommend you choose Ubuntu 22.04.
*/
ImageId["UBUNTU_18_04"] = "ubuntu-18.04-x86_64";
/**
* Create using Ubuntu 22.04
*/
ImageId["UBUNTU_22_04"] = "ubuntu-22.04-x86_64";
})(ImageId || (exports.ImageId = ImageId = {}));
/**
* A Cloud9 Environment with Amazon EC2
* @resource AWS::Cloud9::EnvironmentEC2
*/
let Ec2Environment = (() => {
let _classDecorators = [prop_injectable_1.propertyInjectable];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
let _classSuper = cdk.Resource;
var Ec2Environment = class extends _classSuper {
static { _classThis = this; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
Ec2Environment = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
}
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-cloud9-alpha.Ec2Environment", version: "2.222.0-alpha.0" };
/** Uniquely identifies this class. */
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-cloud9-alpha.Ec2Environment';
/**
* import from EnvironmentEc2Name
*/
static fromEc2EnvironmentName(scope, id, ec2EnvironmentName) {
class Import extends cdk.Resource {
ec2EnvironmentName = ec2EnvironmentName;
ec2EnvironmentArn = cdk.Stack.of(this).formatArn({
service: 'cloud9',
resource: 'environment',
resourceName: this.ec2EnvironmentName,
});
}
return new Import(scope, id);
}
/**
* The environment name of this Cloud9 environment
*
* @attribute
*/
ec2EnvironmentName;
/**
* The environment ARN of this Cloud9 environment
*
* @attribute
*/
ec2EnvironmentArn;
/**
* The environment ID of this Cloud9 environment
*/
environmentId;
/**
* The complete IDE URL of this Cloud9 environment
*/
ideUrl;
/**
* VPC ID
*/
vpc;
constructor(scope, id, props) {
super(scope, id);
try {
jsiiDeprecationWarnings._aws_cdk_aws_cloud9_alpha_Ec2EnvironmentProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, Ec2Environment);
}
throw error;
}
// Enhanced CDK Analytics Telemetry
(0, metadata_resource_1.addConstructMetadata)(this, props);
this.vpc = props.vpc;
if (!props.subnetSelection && this.vpc.publicSubnets.length === 0) {
throw new Error('no subnetSelection specified and no public subnet found in the vpc, please specify subnetSelection');
}
if (!props.imageId) {
throw new Error('No imageId specified, please specify imageId');
}
const vpcSubnets = props.subnetSelection ?? { subnetType: ec2.SubnetType.PUBLIC };
const c9env = new aws_cloud9_1.CfnEnvironmentEC2(this, 'Resource', {
name: props.ec2EnvironmentName,
description: props.description,
ownerArn: props.owner?.ownerArn,
instanceType: props.instanceType?.toString() ?? ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE2, ec2.InstanceSize.MICRO).toString(),
subnetId: this.vpc.selectSubnets(vpcSubnets).subnetIds[0],
repositories: props.clonedRepositories ? props.clonedRepositories.map(r => ({
repositoryUrl: r.repositoryUrl,
pathComponent: r.pathComponent,
})) : undefined,
connectionType: props.connectionType ?? ConnectionType.CONNECT_SSH,
imageId: props.imageId,
automaticStopTimeMinutes: props.automaticStop?.toMinutes(),
});
this.environmentId = c9env.ref;
this.ec2EnvironmentArn = c9env.getAtt('Arn').toString();
this.ec2EnvironmentName = c9env.getAtt('Name').toString();
this.ideUrl = `https://${this.env.region}.console.aws.amazon.com/cloud9/ide/${this.environmentId}`;
}
static {
__runInitializers(_classThis, _classExtraInitializers);
}
};
return Ec2Environment = _classThis;
})();
exports.Ec2Environment = Ec2Environment;
/**
* The class for different repository providers
*/
class CloneRepository {
repositoryUrl;
pathComponent;
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-cloud9-alpha.CloneRepository", version: "2.222.0-alpha.0" };
/**
* import repository to cloud9 environment from AWS CodeCommit
*
* @param repository the codecommit repository to clone from
* @param path the target path in cloud9 environment
*/
static fromCodeCommit(repository, path) {
return {
repositoryUrl: repository.repositoryCloneUrlHttp,
pathComponent: path,
};
}
constructor(repositoryUrl, pathComponent) {
this.repositoryUrl = repositoryUrl;
this.pathComponent = pathComponent;
}
}
exports.CloneRepository = CloneRepository;
/**
* An environment owner
*
*
*/
class Owner {
ownerArn;
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-cloud9-alpha.Owner", version: "2.222.0-alpha.0" };
/**
* Make an IAM user the environment owner
*
* User need to have AWSCloud9Administrator permissions
* @see https://docs.aws.amazon.com/cloud9/latest/user-guide/share-environment.html#share-environment-about
*
* @param user the User object to use as the environment owner
*/
static user(user) {
return { ownerArn: user.userArn };
}
/**
* Make an IAM assumed role the environment owner
*
* @param accountId The account id of the target account
* @param roleName The name of the assumed role
*/
static assumedRole(accountId, roleName) {
return { ownerArn: `arn:${cdk.Aws.PARTITION}:sts::${accountId}:assumed-role/${roleName}` };
}
/**
* Make an IAM federated user the environment owner
*
* @param accountId The AccountId of the target account
* @param userName The name of the federated user
*/
static federatedUser(accountId, userName) {
return { ownerArn: `arn:${cdk.Aws.PARTITION}:sts::${accountId}:federated-user/${userName}` };
}
/**
* Make the Account Root User the environment owner (not recommended)
*
* @param accountId the AccountId to use as the environment owner.
*/
static accountRoot(accountId) {
return { ownerArn: `arn:${cdk.Aws.PARTITION}:iam::${accountId}:root` };
}
/**
*
* @param ownerArn of environment owner.
*/
constructor(ownerArn) {
this.ownerArn = ownerArn;
}
}
exports.Owner = Owner;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJlbnZpcm9ubWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSwyQ0FBMkM7QUFFM0Msd0NBQXdDO0FBRXhDLHVEQUEyRDtBQUMzRCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBc0IxRTs7R0FFRztBQUNILElBQVksY0FXWDtBQVhELFdBQVksY0FBYztJQUN4Qjs7T0FFRztJQUNILDZDQUEyQixDQUFBO0lBQzNCOzs7O09BSUc7SUFDSCw2Q0FBMkIsQ0FBQTtBQUM3QixDQUFDLEVBWFcsY0FBYyw4QkFBZCxjQUFjLFFBV3pCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLE9BbUJYO0FBbkJELFdBQVksT0FBTztJQUNqQjs7T0FFRztJQUNILGtEQUF1QyxDQUFBO0lBQ3ZDOztPQUVHO0lBQ0gsd0RBQTZDLENBQUE7SUFDN0M7Ozs7T0FJRztJQUNILCtDQUFvQyxDQUFBO0lBQ3BDOztPQUVHO0lBQ0gsK0NBQW9DLENBQUE7QUFDdEMsQ0FBQyxFQW5CVyxPQUFPLHVCQUFQLE9BQU8sUUFtQmxCO0FBbUZEOzs7R0FHRztJQUVVLGNBQWM7NEJBRDFCLG9DQUFrQjs7OztzQkFDaUIsR0FBRyxDQUFDLFFBQVE7OEJBQXBCLFNBQVEsV0FBWTs7OztZQUFoRCw2S0FrRkM7Ozs7O1FBakZDLHNDQUFzQztRQUMvQixNQUFNLENBQVUscUJBQXFCLEdBQVcsMENBQTBDLENBQUM7UUFFbEc7O1dBRUc7UUFDSSxNQUFNLENBQUMsc0JBQXNCLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsa0JBQTBCO1lBQzNGLE1BQU0sTUFBTyxTQUFRLEdBQUcsQ0FBQyxRQUFRO2dCQUN4QixrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztnQkFDeEMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMs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O1FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsU0FBUyxTQUFTLE9BQU8sRUFBRSxDQUFDO0tBQ3hFO0lBRUQ7OztPQUdHO0lBQ0gsWUFBb0MsUUFBZ0I7UUFBaEIsYUFBUSxHQUFSLFFBQVEsQ0FBUTtLQUFJOztBQTlDMUQsc0JBK0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29kZWNvbW1pdCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZWNvbW1pdCc7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBJVXNlciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBDZm5FbnZpcm9ubWVudEVDMiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZDknO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuXG4vKipcbiAqIEEgQ2xvdWQ5IEVudmlyb25tZW50XG4gKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFYzJFbnZpcm9ubWVudCBleHRlbmRzIGNkay5JUmVzb3VyY2Uge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIEVudmlyb25tZW50RWMyXG4gICAqXG4gICAqIEBhdHRyaWJ1dGUgZW52aXJvbm1lbnRFYzJOYW1lXG4gICAqL1xuICByZWFkb25seSBlYzJFbnZpcm9ubWVudE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFybiBvZiB0aGUgRW52aXJvbm1lbnRFYzJcbiAgICpcbiAgICogQGF0dHJpYnV0ZSBlbnZpcm9ubWVudEUyQXJuXG4gICAqL1xuICByZWFkb25seSBlYzJFbnZpcm9ubWVudEFybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBjb25uZWN0aW9uIHR5cGUgdXNlZCBmb3IgY29ubmVjdGluZyB0byBhbiBBbWF6b24gRUMyIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZW51bSBDb25uZWN0aW9uVHlwZSB7XG4gIC8qKlxuICAgKiBDb25uZWN0IHRocm91Z2ggU1NIXG4gICAqL1xuICBDT05ORUNUX1NTSCA9ICdDT05ORUNUX1NTSCcsXG4gIC8qKlxuICAgKiBDb25uZWN0IHRocm91Z2ggQVdTIFN5c3RlbXMgTWFuYWdlclxuICAgKiBXaGVuIHVzaW5nIFNTTSwgc2VydmljZSByb2xlIGFuZCBpbnN0YW5jZSBwcm9maWxlIGFyZW4ndCBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuXG4gICAqIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xvdWQ5L2xhdGVzdC91c2VyLWd1aWRlL2VjMi1zc20uaHRtbCNzZXJ2aWNlLXJvbGUtc3NtXG4gICAqL1xuICBDT05ORUNUX1NTTSA9ICdDT05ORUNUX1NTTScsXG59XG5cbi8qKlxuICogVGhlIGltYWdlIElEIHVzZWQgZm9yIGNyZWF0aW5nIGFuIEFtYXpvbiBFQzIgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBlbnVtIEltYWdlSWQge1xuICAvKipcbiAgICogQ3JlYXRlIHVzaW5nIEFtYXpvbiBMaW51eCAyXG4gICAqL1xuICBBTUFaT05fTElOVVhfMiA9ICdhbWF6b25saW51eC0yLXg4Nl82NCcsXG4gIC8qKlxuICAgKiBDcmVhdGUgdXNpbmcgQW1hem9uIExpbnV4IDIwMjNcbiAgICovXG4gIEFNQVpPTl9MSU5VWF8yMDIzID0gJ2FtYXpvbmxpbnV4LTIwMjMteDg2XzY0JyxcbiAgLyoqXG4gICAqIENyZWF0ZSB1c2luZyBVYnVudHUgMTguMDRcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgVWJ1bnR1IDE4LjA0IGhhcyBlbmRlZCBzdGFuZGFyZCBzdXBwb3J0IGFzIG9mIE1heSAzMSwgMjAyMywgd2UgcmVjb21tZW5kIHlvdSBjaG9vc2UgVWJ1bnR1IDIyLjA0LlxuICAgKi9cbiAgVUJVTlRVXzE4XzA0ID0gJ3VidW50dS0xOC4wNC14ODZfNjQnLFxuICAvKipcbiAgICogQ3JlYXRlIHVzaW5nIFVidW50dSAyMi4wNFxuICAgKi9cbiAgVUJVTlRVXzIyXzA0ID0gJ3VidW50dS0yMi4wNC14ODZfNjQnLFxufVxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBFYzJFbnZpcm9ubWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjMkVudmlyb25tZW50UHJvcHMge1xuICAvKipcbiAgICogT3duZXIgb2YgdGhlIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBUaGUgb3duZXIgaGFzIGZ1bGwgY29udHJvbCBvZiB0aGUgZW52aXJvbm1lbnQgYW5kIGNhbiBpbnZpdGUgYWRkaXRpb25hbCBtZW1iZXJzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBpZGVudGl0eSB0aGF0IENsb3VkRm9ybWF0aW9uIGV4ZWN1dGVzIHVuZGVyIHdpbGwgYmUgdGhlIG93bmVyXG4gICAqL1xuICByZWFkb25seSBvd25lcj86IE93bmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBpbnN0YW5jZSB0byBjb25uZWN0IHRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0Mi5taWNyb1xuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VUeXBlPzogZWMyLkluc3RhbmNlVHlwZTtcblxuICAvKipcbiAgICogVGhlIHN1Ym5ldFNlbGVjdGlvbiBvZiB0aGUgVlBDIHRoYXQgQVdTIENsb3VkOSB3aWxsIHVzZSB0byBjb21tdW5pY2F0ZSB3aXRoXG4gICAqIHRoZSBBbWF6b24gRUMyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFsbCBwdWJsaWMgc3VibmV0cyBvZiB0aGUgVlBDIGFyZSBzZWxlY3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldFNlbGVjdGlvbj86IGVjMi5TdWJuZXRTZWxlY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgdGhhdCBBV1MgQ2xvdWQ5IHdpbGwgdXNlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIEFtYXpvbiBFbGFzdGljIENvbXB1dGUgQ2xvdWQgKEFtYXpvbiBFQzIpIGluc3RhbmNlLlxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgdnBjOiBlYzIuSVZwYztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgZW52aXJvbm1lbnRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBuYW1lXG4gICAqL1xuICByZWFkb25seSBlYzJFbnZpcm9ubWVudE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFXUyBDb2RlQ29tbWl0IHJlcG9zaXRvcnkgdG8gYmUgY2xvbmVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZG8gbm90IGNsb25lIGFueSByZXBvc2l0b3J5XG4gICAqL1xuICAvLyByZWFkb25seSBjbG9uZWRSZXBvc2l0b3JpZXM/OiBDbG91ZDlSZXBvc2l0b3J5W107XG4gIHJlYWRvbmx5IGNsb25lZFJlcG9zaXRvcmllcz86IENsb25lUmVwb3NpdG9yeVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgY29ubmVjdGlvbiB0eXBlIHVzZWQgZm9yIGNvbm5lY3RpbmcgdG8gYW4gQW1hem9uIEVDMiBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogVmFsaWQgdmFsdWVzIGFyZTogQ09OTkVDVF9TU0ggKGRlZmF1bHQpIGFuZCBDT05ORUNUX1NTTSAoY29ubmVjdGVkIHRocm91Z2ggQVdTIFN5c3RlbXMgTWFuYWdlcilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBDT05ORUNUX1NTSFxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvblR5cGU/OiBDb25uZWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogVGhlIGltYWdlIElEIHVzZWQgZm9yIGNyZWF0aW5nIGFuIEFtYXpvbiBFQzIgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqL1xuICByZWFkb25seSBpbWFnZUlkOiBJbWFnZUlkO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgdW50aWwgdGhlIHJ1bm5pbmcgaW5zdGFuY2UgaXMgc2h1dCBkb3duIGFmdGVyIHRoZVxuICAgKiBlbnZpcm9ubWVudCB3YXMgbGFzdCB1c2VkLlxuICAgKlxuICAgKiBTZXR0aW5nIGEgdmFsdWUgb2YgMCBtZWFucyB0aGUgaW5zdGFuY2Ugd2lsbCBuZXZlciBiZSBhdXRvbWF0aWNhbGx5IHNodXQgZG93bi5cIlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBpbnN0YW5jZSB3aWxsIG5vdCBiZSBzaHV0IGRvd24gYXV0b21hdGljYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGF1dG9tYXRpY1N0b3A/OiBjZGsuRHVyYXRpb247XG59XG5cbi8qKlxuICogQSBDbG91ZDkgRW52aXJvbm1lbnQgd2l0aCBBbWF6b24gRUMyXG4gKiBAcmVzb3VyY2UgQVdTOjpDbG91ZDk6OkVudmlyb25tZW50RUMyXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBFYzJFbnZpcm9ubWVudCBleHRlbmRzIGNkay5SZXNvdXJjZSBpbXBsZW1lbnRzIElFYzJFbnZpcm9ubWVudCB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWNsb3VkOS1hbHBoYS5FYzJFbnZpcm9ubWVudCc7XG5cbiAgLyoqXG4gICAqIGltcG9ydCBmcm9tIEVudmlyb25tZW50RWMyTmFtZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRWMyRW52aXJvbm1lbnROYW1lKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGVjMkVudmlyb25tZW50TmFtZTogc3RyaW5nKTogSUVjMkVudmlyb25tZW50IHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBjZGsuUmVzb3VyY2Uge1xuICAgICAgcHVibGljIGVjMkVudmlyb25tZW50TmFtZSA9IGVjMkVudmlyb25tZW50TmFtZTtcbiAgICAgIHB1YmxpYyBlYzJFbnZpcm9ubWVudEFybiA9IGNkay5TdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgICBzZXJ2aWNlOiAnY2xvdWQ5JyxcbiAgICAgICAgcmVzb3VyY2U6ICdlbnZpcm9ubWVudCcsXG4gICAgICAgIHJlc291cmNlTmFtZTogdGhpcy5lYzJFbnZpcm9ubWVudE5hbWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZW52aXJvbm1lbnQgbmFtZSBvZiB0aGlzIENsb3VkOSBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZWMyRW52aXJvbm1lbnROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBBUk4gb2YgdGhpcyBDbG91ZDkgZW52aXJvbm1lbnRcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVjMkVudmlyb25tZW50QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBJRCBvZiB0aGlzIENsb3VkOSBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudmlyb25tZW50SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbXBsZXRlIElERSBVUkwgb2YgdGhpcyBDbG91ZDkgZW52aXJvbm1lbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVVcmw6IHN0cmluZztcblxuICAvKipcbiAgICogVlBDIElEXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdnBjOiBlYzIuSVZwYztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRWMyRW52aXJvbm1lbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICB0aGlzLnZwYyA9IHByb3BzLnZwYztcbiAgICBpZiAoIXByb3BzLnN1Ym5ldFNlbGVjdGlvbiAmJiB0aGlzLnZwYy5wdWJsaWNTdWJuZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBzdWJuZXRTZWxlY3Rpb24gc3BlY2lmaWVkIGFuZCBubyBwdWJsaWMgc3VibmV0IGZvdW5kIGluIHRoZSB2cGMsIHBsZWFzZSBzcGVjaWZ5IHN1Ym5ldFNlbGVjdGlvbicpO1xuICAgIH1cblxuICAgIGlmICghcHJvcHMuaW1hZ2VJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBpbWFnZUlkIHNwZWNpZmllZCwgcGxlYXNlIHNwZWNpZnkgaW1hZ2VJZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHZwY1N1Ym5ldHMgPSBwcm9wcy5zdWJuZXRTZWxlY3Rpb24gPz8geyBzdWJuZXRUeXBlOiBlYzIuU3VibmV0VHlwZS5QVUJMSUMgfTtcbiAgICBjb25zdCBjOWVudiA9IG5ldyBDZm5FbnZpcm9ubWVudEVDMih0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiBwcm9wcy5lYzJFbnZpcm9ubWVudE5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBvd25lckFybjogcHJvcHMub3duZXI/Lm93bmVyQXJuLFxuICAgICAgaW5zdGFuY2VUeXBlOiBwcm9wcy5pbnN0YW5jZVR5cGU/LnRvU3RyaW5nKCkgPz8gZWMyLkluc3RhbmNlVHlwZS5vZihlYzIuSW5zdGFuY2VDbGFzcy5CVVJTVEFCTEUyLCBlYzIuSW5zdGFuY2VTaXplLk1JQ1JPKS50b1N0cmluZygpLFxuICAgICAgc3VibmV0SWQ6IHRoaXMudnBjLnNlbGVjdFN1Ym5ldHModnBjU3VibmV0cykuc3VibmV0SWRzWzBdLFxuICAgICAgcmVwb3NpdG9yaWVzOiBwcm9wcy5jbG9uZWRSZXBvc2l0b3JpZXMgPyBwcm9wcy5jbG9uZWRSZXBvc2l0b3JpZXMubWFwKHIgPT4gKHtcbiAgICAgICAgcmVwb3NpdG9yeVVybDogci5yZXBvc2l0b3J5VXJsLFxuICAgICAgICBwYXRoQ29tcG9uZW50OiByLnBhdGhDb21wb25lbnQsXG4gICAgICB9KSkgOiB1bmRlZmluZWQsXG4gICAgICBjb25uZWN0aW9uVHlwZTogcHJvcHMuY29ubmVjdGlvblR5cGUgPz8gQ29ubmVjdGlvblR5cGUuQ09OTkVDVF9TU0gsXG4gICAgICBpbWFnZUlkOiBwcm9wcy5pbWFnZUlkLFxuICAgICAgYXV0b21hdGljU3RvcFRpbWVNaW51dGVzOiBwcm9wcy5hdXRvbWF0aWNTdG9wPy50b01pbnV0ZXMoKSxcbiAgICB9KTtcbiAgICB0aGlzLmVudmlyb25tZW50SWQgPSBjOWVudi5yZWY7XG4gICAgdGhpcy5lYzJFbnZpcm9ubWVudEFybiA9IGM5ZW52LmdldEF0dCgnQXJuJykudG9TdHJpbmcoKTtcbiAgICB0aGlzLmVjMkVudmlyb25tZW50TmFtZSA9IGM5ZW52LmdldEF0dCgnTmFtZScpLnRvU3RyaW5nKCk7XG4gICAgdGhpcy5pZGVVcmwgPSBgaHR0cHM6Ly8ke3RoaXMuZW52LnJlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9jbG91ZDkvaWRlLyR7dGhpcy5lbnZpcm9ubWVudElkfWA7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY2xhc3MgZm9yIGRpZmZlcmVudCByZXBvc2l0b3J5IHByb3ZpZGVyc1xuICovXG5leHBvcnQgY2xhc3MgQ2xvbmVSZXBvc2l0b3J5IHtcbiAgLyoqXG4gICAqIGltcG9ydCByZXBvc2l0b3J5IHRvIGNsb3VkOSBlbnZpcm9ubWVudCBmcm9tIEFXUyBDb2RlQ29tbWl0XG4gICAqXG4gICAqIEBwYXJhbSByZXBvc2l0b3J5IHRoZSBjb2RlY29tbWl0IHJlcG9zaXRvcnkgdG8gY2xvbmUgZnJvbVxuICAgKiBAcGFyYW0gcGF0aCAgdGhlIHRhcmdldCBwYXRoIGluIGNsb3VkOSBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29kZUNvbW1pdChyZXBvc2l0b3J5OiBjb2RlY29tbWl0LklSZXBvc2l0b3J5LCBwYXRoOiBzdHJpbmcpOiBDbG9uZVJlcG9zaXRvcnkge1xuICAgIHJldHVybiB7XG4gICAgICByZXBvc2l0b3J5VXJsOiByZXBvc2l0b3J5LnJlcG9zaXRvcnlDbG9uZVVybEh0dHAsXG4gICAgICBwYXRoQ29tcG9uZW50OiBwYXRoLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSByZXBvc2l0b3J5VXJsOiBzdHJpbmcsIHB1YmxpYyByZWFkb25seSBwYXRoQ29tcG9uZW50OiBzdHJpbmcpIHt9XG59XG5cbi8qKlxuICogQW4gZW52aXJvbm1lbnQgb3duZXJcbiAqXG4gKlxuICovXG5leHBvcnQgY2xhc3MgT3duZXIge1xuICAvKipcbiAgICogTWFrZSBhbiBJQU0gdXNlciB0aGUgZW52aXJvbm1lbnQgb3duZXJcbiAgICpcbiAgICogVXNlciBuZWVkIHRvIGhhdmUgQVdTQ2xvdWQ5QWRtaW5pc3RyYXRvciBwZXJtaXNzaW9uc1xuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbG91ZDkvbGF0ZXN0L3VzZXItZ3VpZGUvc2hhcmUtZW52aXJvbm1lbnQuaHRtbCNzaGFyZS1lbnZpcm9ubWVudC1hYm91dFxuICAgKlxuICAgKiBAcGFyYW0gdXNlciB0aGUgVXNlciBvYmplY3QgdG8gdXNlIGFzIHRoZSBlbnZpcm9ubWVudCBvd25lclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1c2VyKHVzZXI6IElVc2VyKTogT3duZXIge1xuICAgIHJldHVybiB7IG93bmVyQXJuOiB1c2VyLnVzZXJBcm4gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGFuIElBTSBhc3N1bWVkIHJvbGUgdGhlIGVudmlyb25tZW50IG93bmVyXG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50SWQgVGhlIGFjY291bnQgaWQgb2YgdGhlIHRhcmdldCBhY2NvdW50XG4gICAqIEBwYXJhbSByb2xlTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXNzdW1lZCByb2xlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzc3VtZWRSb2xlKGFjY291bnRJZDogc3RyaW5nLCByb2xlTmFtZTogc3RyaW5nKTogT3duZXIge1xuICAgIHJldHVybiB7IG93bmVyQXJuOiBgYXJuOiR7Y2RrLkF3cy5QQVJUSVRJT059OnN0czo6JHthY2NvdW50SWR9OmFzc3VtZWQtcm9sZS8ke3JvbGVOYW1lfWAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGFuIElBTSBmZWRlcmF0ZWQgdXNlciB0aGUgZW52aXJvbm1lbnQgb3duZXJcbiAgICpcbiAgICogQHBhcmFtIGFjY291bnRJZCBUaGUgQWNjb3VudElkIG9mIHRoZSB0YXJnZXQgYWNjb3VudFxuICAgKiBAcGFyYW0gdXNlck5hbWUgVGhlIG5hbWUgb2YgdGhlIGZlZGVyYXRlZCB1c2VyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZlZGVyYXRlZFVzZXIoYWNjb3VudElkOiBzdHJpbmcsIHVzZXJOYW1lOiBzdHJpbmcpOiBPd25lciB7XG4gICAgcmV0dXJuIHsgb3duZXJBcm46IGBhcm46JHtjZGsuQXdzLlBBUlRJVElPTn06c3RzOjoke2FjY291bnRJZH06ZmVkZXJhdGVkLXVzZXIvJHt1c2VyTmFtZX1gIH07XG4gIH1cblxuICAvKipcbiAgICogTWFrZSB0aGUgQWNjb3VudCBSb290IFVzZXIgdGhlIGVudmlyb25tZW50IG93bmVyIChub3QgcmVjb21tZW5kZWQpXG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50SWQgdGhlIEFjY291bnRJZCB0byB1c2UgYXMgdGhlIGVudmlyb25tZW50IG93bmVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhY2NvdW50Um9vdChhY2NvdW50SWQ6IHN0cmluZyk6IE93bmVyIHtcbiAgICByZXR1cm4geyBvd25lckFybjogYGFybjoke2Nkay5Bd3MuUEFSVElUSU9OfTppYW06OiR7YWNjb3VudElkfTpyb290YCB9O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvd25lckFybiBvZiBlbnZpcm9ubWVudCBvd25lci5cbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG93bmVyQXJuOiBzdHJpbmcpIHt9XG59XG4iXX0=