UNPKG

@aws-cdk/aws-s3objectlambda-alpha

Version:

The CDK Construct Library for AWS::S3ObjectLambda

254 lines 29.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); 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; }; var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.AccessPoint = void 0; const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const iam = __importStar(require("aws-cdk-lib/aws-iam")); const s3 = __importStar(require("aws-cdk-lib/aws-s3")); const aws_s3objectlambda_1 = require("aws-cdk-lib/aws-s3objectlambda"); const core = __importStar(require("aws-cdk-lib/core")); const core_1 = require("aws-cdk-lib/core"); const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal"); const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource"); const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable"); class AccessPointBase extends core.Resource { /** Implement the `IAccessPoint.domainName` field. */ get domainName() { const urlSuffix = this.stack.urlSuffix; return `${this.accessPointName}-${this.env.account}.s3-object-lambda.${urlSuffix}`; } /** Implement the `IAccessPoint.regionalDomainName` field. */ get regionalDomainName() { const urlSuffix = this.stack.urlSuffix; const region = this.env.region; return `${this.accessPointName}-${this.env.account}.s3-object-lambda.${region}.${urlSuffix}`; } /** Implement the `IAccessPoint.virtualHostedUrlForObject` method. */ virtualHostedUrlForObject(key, options) { const domainName = options?.regional ?? true ? this.regionalDomainName : this.domainName; const prefix = `https://${domainName}`; if (!key) { return prefix; } if (key.startsWith('/')) { key = key.slice(1); } if (key.endsWith('/')) { key = key.slice(0, -1); } return `${prefix}/${key}`; } } /** * Checks the access point name against the rules in https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-access-points.html#access-points-names * @param name The name of the access point */ function validateAccessPointName(name) { if (name.length < 3 || name.length > 50) { throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `AccessPointNameLengthInvalid`, 'Access point name must be between 3 and 50 characters long'); } if (name.endsWith('-s3alias')) { throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `AccessPointNameEndsWithS3Alias`, 'Access point name cannot end with the suffix -s3alias'); } if (name[0] === '-' || name[name.length - 1] === '-') { throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `AccessPointNameBeginsOrEndsWithDash`, 'Access point name cannot begin or end with a dash'); } if (!/^[0-9a-z](.(?![\.A-Z_]))+[0-9a-z]$/.test(name)) { throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `AccessPointNameInvalidCharacters`, 'Access point name must begin with a number or lowercase letter and not contain underscores, uppercase letters, or periods'); } } /** * An S3 object lambda access point for intercepting and * transforming `GetObject` requests. */ let AccessPoint = (() => { let _classDecorators = [prop_injectable_1.propertyInjectable]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; let _classSuper = AccessPointBase; var AccessPoint = 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); AccessPoint = _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-s3objectlambda-alpha.AccessPoint", version: "2.261.0-alpha.0" }; /** Uniquely identifies this class. */ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-s3objectlambda-alpha.AccessPoint'; /** * Reference an existing AccessPoint defined outside of the CDK code. */ static fromAccessPointAttributes(scope, id, attrs) { try { jsiiDeprecationWarnings._aws_cdk_aws_s3objectlambda_alpha_AccessPointAttributes(attrs); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromAccessPointAttributes); } throw error; } const arn = core.Arn.split(attrs.accessPointArn, core.ArnFormat.SLASH_RESOURCE_NAME); if (!arn.resourceName) { throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `UnableToParseAccessPointName`, 'Unable to parse access point name'); } const name = arn.resourceName; class Import extends AccessPointBase { accessPointArn = attrs.accessPointArn; accessPointCreationDate = attrs.accessPointCreationDate; accessPointName = name; } return new Import(scope, id); } /** * The ARN of the access point. */ accessPointName; /** * The ARN of the access point. * @attribute */ accessPointArn; /** * The creation data of the access point. * @attribute */ accessPointCreationDate; /** * The ARN of the S3 access point. */ s3AccessPointArn; constructor(scope, id, props) { super(scope, id, { physicalName: props.accessPointName, }); try { jsiiDeprecationWarnings._aws_cdk_aws_s3objectlambda_alpha_AccessPointProps(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, AccessPoint); } throw error; } // Enhanced CDK Analytics Telemetry (0, metadata_resource_1.addConstructMetadata)(this, props); if (props.accessPointName) { validateAccessPointName(props.accessPointName); } const supporting = new s3.CfnAccessPoint(this, 'SupportingAccessPoint', { bucket: props.bucket.bucketRef.bucketName, }); const allowedFeatures = []; if (props.supportsGetObjectPartNumber) { allowedFeatures.push('GetObject-PartNumber'); } if (props.supportsGetObjectRange) { allowedFeatures.push('GetObject-Range'); } const accessPoint = new aws_s3objectlambda_1.CfnAccessPoint(this, id, { name: this.physicalName, objectLambdaConfiguration: { allowedFeatures, cloudWatchMetricsEnabled: props.cloudWatchMetricsEnabled, supportingAccessPoint: supporting.attrArn, transformationConfigurations: [ { actions: ['GetObject'], contentTransformation: { AwsLambda: { FunctionArn: props.handler.functionArn, FunctionPayload: props.payload ? JSON.stringify(props.payload) : undefined, }, }, }, ], }, }); this.s3AccessPointArn = supporting.attrArn; this.accessPointName = accessPoint.ref; this.accessPointArn = accessPoint.attrArn; this.accessPointCreationDate = accessPoint.attrCreationDate; props.handler.addToRolePolicy(new iam.PolicyStatement({ actions: ['s3-object-lambda:WriteGetObjectResponse'], resources: ['*'], })); } static { __runInitializers(_classThis, _classExtraInitializers); } }; return AccessPoint = _classThis; })(); exports.AccessPoint = AccessPoint; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLXBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYWNjZXNzLXBvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlEQUEyQztBQUUzQyx1REFBeUM7QUFDekMsdUVBQWdFO0FBQ2hFLHVEQUF5QztBQUN6QywyQ0FBMkQ7QUFDM0QsNEVBQTREO0FBQzVELDhFQUE4RTtBQUM5RSwwRUFBMEU7QUEyRjFFLE1BQWUsZUFBZ0IsU0FBUSxJQUFJLENBQUMsUUFBUTtJQUtsRCxxREFBcUQ7SUFDckQsSUFBSSxVQUFVO1FBQ1osTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDdkMsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLHFCQUFxQixTQUFTLEVBQUUsQ0FBQztLQUNwRjtJQUVELDZEQUE2RDtJQUM3RCxJQUFJLGtCQUFrQjtRQUNwQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUMvQixPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8scUJBQXFCLE1BQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztLQUM5RjtJQUVELHFFQUFxRTtJQUM5RCx5QkFBeUIsQ0FBQyxHQUFZLEVBQUUsT0FBeUM7UUFDdEYsTUFBTSxVQUFVLEdBQUcsT0FBTyxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN6RixNQUFNLE1BQU0sR0FBRyxX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QUNFLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQzs0QkFDdEIscUJBQXFCLEVBQUU7Z0NBQ3JCLFNBQVMsRUFBRTtvQ0FDVCxXQUFXLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXO29DQUN0QyxlQUFlLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7aUNBQzNFOzZCQUNGO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxjQUFjLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztZQUMxQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDO1lBRTVELEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUMzQixJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7Z0JBQ3RCLE9BQU8sRUFBRSxDQUFDLHlDQUF5QyxDQUFDO2dCQUNwRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7YUFDakIsQ0FBQyxDQUNILENBQUM7U0FDSDs7WUFoR1UsdURBQVc7Ozs7O0FBQVgsa0NBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgdHlwZSAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBDZm5BY2Nlc3NQb2ludCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zM29iamVjdGxhbWJkYSc7XG5pbXBvcnQgKiBhcyBjb3JlIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyB0aGUgQWNjZXNzUG9pbnQgcmVzb3VyY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUFjY2Vzc1BvaW50IGV4dGVuZHMgY29yZS5JUmVzb3VyY2Uge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgYWNjZXNzIHBvaW50LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NQb2ludEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY3JlYXRpb24gZGF0YSBvZiB0aGUgYWNjZXNzIHBvaW50LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NQb2ludENyZWF0aW9uRGF0ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NCBETlMgbmFtZSBvZiB0aGUgYWNjZXNzIHBvaW50LlxuICAgKi9cbiAgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uYWwgZG9tYWluIG5hbWUgb2YgdGhlIGFjY2VzcyBwb2ludC5cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbmFsRG9tYWluTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlydHVhbCBob3N0ZWQtc3R5bGUgVVJMIG9mIGFuIFMzIG9iamVjdCB0aHJvdWdoIHRoaXMgYWNjZXNzIHBvaW50LlxuICAgKiBTcGVjaWZ5IGByZWdpb25hbDogZmFsc2VgIGF0IHRoZSBvcHRpb25zIGZvciBub24tcmVnaW9uYWwgVVJMLlxuICAgKiBAcGFyYW0ga2V5IFRoZSBTMyBrZXkgb2YgdGhlIG9iamVjdC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIFVSTCBvZiB0aGVcbiAgICogICAgICBidWNrZXQgaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgVVJMLlxuICAgKiBAcmV0dXJucyBhbiBPYmplY3RTM1VybCB0b2tlblxuICAgKi9cbiAgdmlydHVhbEhvc3RlZFVybEZvck9iamVjdChrZXk/OiBzdHJpbmcsIG9wdGlvbnM/OiBzMy5WaXJ0dWFsSG9zdGVkU3R5bGVVcmxPcHRpb25zKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBTMyBvYmplY3QgbGFtYmRhIGFjY2VzcyBwb2ludCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY2Vzc1BvaW50UHJvcHMge1xuICAvKipcbiAgICogVGhlIGJ1Y2tldCB0byB3aGljaCB0aGlzIGFjY2VzcyBwb2ludCBiZWxvbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0OiBzMy5JQnVja2V0UmVmO1xuXG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHVzZWQgdG8gdHJhbnNmb3JtIG9iamVjdHMuXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVyOiBsYW1iZGEuSUZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgUzMgb2JqZWN0IGxhbWJkYSBhY2Nlc3MgcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGEgdW5pcXVlIG5hbWUgd2lsbCBiZSBnZW5lcmF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGFjY2Vzc1BvaW50TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBDbG91ZFdhdGNoIG1ldHJpY3MgYXJlIGVuYWJsZWQgZm9yIHRoZSBhY2Nlc3MgcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBMYW1iZGEgZnVuY3Rpb24gY2FuIHByb2Nlc3MgYEdldE9iamVjdC1SYW5nZWAgcmVxdWVzdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBzdXBwb3J0c0dldE9iamVjdFJhbmdlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgTGFtYmRhIGZ1bmN0aW9uIGNhbiBwcm9jZXNzIGBHZXRPYmplY3QtUGFydE51bWJlcmAgcmVxdWVzdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBzdXBwb3J0c0dldE9iamVjdFBhcnROdW1iZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIEpTT04gdGhhdCBwcm92aWRlcyBzdXBwbGVtZW50YWwgZGF0YSBwYXNzZWQgdG8gdGhlXG4gICAqIExhbWJkYSBmdW5jdGlvbiBvbiBldmVyeSByZXF1ZXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGRhdGEuXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbn1cblxuYWJzdHJhY3QgY2xhc3MgQWNjZXNzUG9pbnRCYXNlIGV4dGVuZHMgY29yZS5SZXNvdXJjZSBpbXBsZW1lbnRzIElBY2Nlc3NQb2ludCB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBhY2Nlc3NQb2ludEFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYWNjZXNzUG9pbnRDcmVhdGlvbkRhdGU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGFjY2Vzc1BvaW50TmFtZTogc3RyaW5nO1xuXG4gIC8qKiBJbXBsZW1lbnQgdGhlIGBJQWNjZXNzUG9pbnQuZG9tYWluTmFtZWAgZmllbGQuICovXG4gIGdldCBkb21haW5OYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdXJsU3VmZml4ID0gdGhpcy5zdGFjay51cmxTdWZmaXg7XG4gICAgcmV0dXJuIGAke3RoaXMuYWNjZXNzUG9pbnROYW1lfS0ke3RoaXMuZW52LmFjY291bnR9LnMzLW9iamVjdC1sYW1iZGEuJHt1cmxTdWZmaXh9YDtcbiAgfVxuXG4gIC8qKiBJbXBsZW1lbnQgdGhlIGBJQWNjZXNzUG9pbnQucmVnaW9uYWxEb21haW5OYW1lYCBmaWVsZC4gKi9cbiAgZ2V0IHJlZ2lvbmFsRG9tYWluTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVybFN1ZmZpeCA9IHRoaXMuc3RhY2sudXJsU3VmZml4O1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuZW52LnJlZ2lvbjtcbiAgICByZXR1cm4gYCR7dGhpcy5hY2Nlc3NQb2ludE5hbWV9LSR7dGhpcy5lbnYuYWNjb3VudH0uczMtb2JqZWN0LWxhbWJkYS4ke3JlZ2lvbn0uJHt1cmxTdWZmaXh9YDtcbiAgfVxuXG4gIC8qKiBJbXBsZW1lbnQgdGhlIGBJQWNjZXNzUG9pbnQudmlydHVhbEhvc3RlZFVybEZvck9iamVjdGAgbWV0aG9kLiAqL1xuICBwdWJsaWMgdmlydHVhbEhvc3RlZFVybEZvck9iamVjdChrZXk/OiBzdHJpbmcsIG9wdGlvbnM/OiBzMy5WaXJ0dWFsSG9zdGVkU3R5bGVVcmxPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBkb21haW5OYW1lID0gb3B0aW9ucz8ucmVnaW9uYWwgPz8gdHJ1ZSA/IHRoaXMucmVnaW9uYWxEb21haW5OYW1lIDogdGhpcy5kb21haW5OYW1lO1xuICAgIGNvbnN0IHByZWZpeCA9IGBodHRwczovLyR7ZG9tYWluTmFtZX1gO1xuICAgIGlmICgha2V5KSB7XG4gICAgICByZXR1cm4gcHJlZml4O1xuICAgIH1cbiAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAga2V5ID0ga2V5LnNsaWNlKDEpO1xuICAgIH1cbiAgICBpZiAoa2V5LmVuZHNXaXRoKCcvJykpIHtcbiAgICAgIGtleSA9IGtleS5zbGljZSgwLCAtMSk7XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9LyR7a2V5fWA7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgYWNjZXNzIHBvaW50IHJlc291cmNlIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzUG9pbnRBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGFjY2VzcyBwb2ludC5cbiAgICovXG4gIHJlYWRvbmx5IGFjY2Vzc1BvaW50QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjcmVhdGlvbiBkYXRhIG9mIHRoZSBhY2Nlc3MgcG9pbnQuXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NQb2ludENyZWF0aW9uRGF0ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgYWNjZXNzIHBvaW50IG5hbWUgYWdhaW5zdCB0aGUgcnVsZXMgaW4gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvY3JlYXRpbmctYWNjZXNzLXBvaW50cy5odG1sI2FjY2Vzcy1wb2ludHMtbmFtZXNcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhY2Nlc3MgcG9pbnRcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVBY2Nlc3NQb2ludE5hbWUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChuYW1lLmxlbmd0aCA8IDMgfHwgbmFtZS5sZW5ndGggPiA1MCkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgQWNjZXNzUG9pbnROYW1lTGVuZ3RoSW52YWxpZGAsICdBY2Nlc3MgcG9pbnQgbmFtZSBtdXN0IGJlIGJldHdlZW4gMyBhbmQgNTAgY2hhcmFjdGVycyBsb25nJyk7XG4gIH1cbiAgaWYgKG5hbWUuZW5kc1dpdGgoJy1zM2FsaWFzJykpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEFjY2Vzc1BvaW50TmFtZUVuZHNXaXRoUzNBbGlhc2AsICdBY2Nlc3MgcG9pbnQgbmFtZSBjYW5ub3QgZW5kIHdpdGggdGhlIHN1ZmZpeCAtczNhbGlhcycpO1xuICB9XG4gIGlmIChuYW1lWzBdID09PSAnLScgfHwgbmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnLScpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEFjY2Vzc1BvaW50TmFtZUJlZ2luc09yRW5kc1dpdGhEYXNoYCwgJ0FjY2VzcyBwb2ludCBuYW1lIGNhbm5vdCBiZWdpbiBvciBlbmQgd2l0aCBhIGRhc2gnKTtcbiAgfVxuICBpZiAoIS9eWzAtOWEtel0oLig/IVtcXC5BLVpfXSkpK1swLTlhLXpdJC8udGVzdChuYW1lKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgQWNjZXNzUG9pbnROYW1lSW52YWxpZENoYXJhY3RlcnNgLCAnQWNjZXNzIHBvaW50IG5hbWUgbXVzdCBiZWdpbiB3aXRoIGEgbnVtYmVyIG9yIGxvd2VyY2FzZSBsZXR0ZXIgYW5kIG5vdCBjb250YWluIHVuZGVyc2NvcmVzLCB1cHBlcmNhc2UgbGV0dGVycywgb3IgcGVyaW9kcycpO1xuICB9XG59XG5cbi8qKlxuICogQW4gUzMgb2JqZWN0IGxhbWJkYSBhY2Nlc3MgcG9pbnQgZm9yIGludGVyY2VwdGluZyBhbmRcbiAqIHRyYW5zZm9ybWluZyBgR2V0T2JqZWN0YCByZXF1ZXN0cy5cbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIEFjY2Vzc1BvaW50IGV4dGVuZHMgQWNjZXNzUG9pbnRCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtczNvYmplY3RsYW1iZGEtYWxwaGEuQWNjZXNzUG9pbnQnO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgYW4gZXhpc3RpbmcgQWNjZXNzUG9pbnQgZGVmaW5lZCBvdXRzaWRlIG9mIHRoZSBDREsgY29kZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUFjY2Vzc1BvaW50QXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogQWNjZXNzUG9pbnRBdHRyaWJ1dGVzKTogSUFjY2Vzc1BvaW50IHtcbiAgICBjb25zdCBhcm4gPSBjb3JlLkFybi5zcGxpdChhdHRycy5hY2Nlc3NQb2ludEFybiwgY29yZS5Bcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSk7XG4gICAgaWYgKCFhcm4ucmVzb3VyY2VOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFVuYWJsZVRvUGFyc2VBY2Nlc3NQb2ludE5hbWVgLCAnVW5hYmxlIHRvIHBhcnNlIGFjY2VzcyBwb2ludCBuYW1lJyk7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBhcm4ucmVzb3VyY2VOYW1lO1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIEFjY2Vzc1BvaW50QmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYWNjZXNzUG9pbnRBcm46IHN0cmluZyA9IGF0dHJzLmFjY2Vzc1BvaW50QXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFjY2Vzc1BvaW50Q3JlYXRpb25EYXRlOiBzdHJpbmcgPSBhdHRycy5hY2Nlc3NQb2ludENyZWF0aW9uRGF0ZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBhY2Nlc3NQb2ludE5hbWU6IHN0cmluZyA9IG5hbWU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgYWNjZXNzIHBvaW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFjY2Vzc1BvaW50TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBhY2Nlc3MgcG9pbnQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhY2Nlc3NQb2ludEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY3JlYXRpb24gZGF0YSBvZiB0aGUgYWNjZXNzIHBvaW50LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWNjZXNzUG9pbnRDcmVhdGlvbkRhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgUzMgYWNjZXNzIHBvaW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHMzQWNjZXNzUG9pbnRBcm46IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQWNjZXNzUG9pbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5hY2Nlc3NQb2ludE5hbWUsXG4gICAgfSk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMuYWNjZXNzUG9pbnROYW1lKSB7XG4gICAgICB2YWxpZGF0ZUFjY2Vzc1BvaW50TmFtZShwcm9wcy5hY2Nlc3NQb2ludE5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHN1cHBvcnRpbmcgPSBuZXcgczMuQ2ZuQWNjZXNzUG9pbnQodGhpcywgJ1N1cHBvcnRpbmdBY2Nlc3NQb2ludCcsIHtcbiAgICAgIGJ1Y2tldDogcHJvcHMuYnVja2V0LmJ1Y2tldFJlZi5idWNrZXROYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYWxsb3dlZEZlYXR1cmVzID0gW107XG4gICAgaWYgKHByb3BzLnN1cHBvcnRzR2V0T2JqZWN0UGFydE51bWJlcikge1xuICAgICAgYWxsb3dlZEZlYXR1cmVzLnB1c2goJ0dldE9iamVjdC1QYXJ0TnVtYmVyJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5zdXBwb3J0c0dldE9iamVjdFJhbmdlKSB7XG4gICAgICBhbGxvd2VkRmVhdHVyZXMucHVzaCgnR2V0T2JqZWN0LVJhbmdlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjZXNzUG9pbnQgPSBuZXcgQ2ZuQWNjZXNzUG9pbnQodGhpcywgaWQsIHtcbiAgICAgIG5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgb2JqZWN0TGFtYmRhQ29uZmlndXJhdGlvbjoge1xuICAgICAgICBhbGxvd2VkRmVhdHVyZXMsXG4gICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogcHJvcHMuY2xvdWRXYXRjaE1ldHJpY3NFbmFibGVkLFxuICAgICAgICBzdXBwb3J0aW5nQWNjZXNzUG9pbnQ6IHN1cHBvcnRpbmcuYXR0ckFybixcbiAgICAgICAgdHJhbnNmb3JtYXRpb25Db25maWd1cmF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFsnR2V0T2JqZWN0J10sXG4gICAgICAgICAgICBjb250ZW50VHJhbnNmb3JtYXRpb246IHtcbiAgICAgICAgICAgICAgQXdzTGFtYmRhOiB7XG4gICAgICAgICAgICAgICAgRnVuY3Rpb25Bcm46IHByb3BzLmhhbmRsZXIuZnVuY3Rpb25Bcm4sXG4gICAgICAgICAgICAgICAgRnVuY3Rpb25QYXlsb2FkOiBwcm9wcy5wYXlsb2FkID8gSlNPTi5zdHJpbmdpZnkocHJvcHMucGF5bG9hZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuczNBY2Nlc3NQb2ludEFybiA9IHN1cHBvcnRpbmcuYXR0ckFybjtcbiAgICB0aGlzLmFjY2Vzc1BvaW50TmFtZSA9IGFjY2Vzc1BvaW50LnJlZjtcbiAgICB0aGlzLmFjY2Vzc1BvaW50QXJuID0gYWNjZXNzUG9pbnQuYXR0ckFybjtcbiAgICB0aGlzLmFjY2Vzc1BvaW50Q3JlYXRpb25EYXRlID0gYWNjZXNzUG9pbnQuYXR0ckNyZWF0aW9uRGF0ZTtcblxuICAgIHByb3BzLmhhbmRsZXIuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbJ3MzLW9iamVjdC1sYW1iZGE6V3JpdGVHZXRPYmplY3RSZXNwb25zZSddLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuIl19