@aws-cdk/aws-glue-alpha
Version:
The CDK Construct Library for AWS::Glue
120 lines • 19 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SparkJob = void 0;
const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const s3 = require("aws-cdk-lib/aws-s3");
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
const job_1 = require("./job");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const os_1 = require("os");
/**
* Base class for different types of Spark Jobs.
*/
class SparkJob extends job_1.Job {
constructor(scope, id, props) {
super(scope, id, {
physicalName: props.jobName,
});
try {
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_SparkJobProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, SparkJob);
}
throw error;
}
// Enhanced CDK Analytics Telemetry
(0, metadata_resource_1.addConstructMetadata)(this, props);
this.role = props.role;
this.grantPrincipal = this.role;
this.sparkUILoggingLocation = props.sparkUI ? this.setupSparkUILoggingLocation(props.sparkUI) : undefined;
}
nonExecutableCommonArguments(props) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_SparkJobProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.nonExecutableCommonArguments);
}
throw error;
}
// Enable CloudWatch metrics and continuous logging by default as a best practice
const continuousLoggingArgs = this.setupContinuousLogging(this.role, props.continuousLogging);
const profilingMetricsArgs = { '--enable-metrics': '' };
const observabilityMetricsArgs = { '--enable-observability-metrics': 'true' };
// Set spark ui args, if spark ui logging had been setup
const sparkUIArgs = this.sparkUILoggingLocation ? ({
'--enable-spark-ui': 'true',
'--spark-event-logs-path': this.sparkUILoggingLocation.bucket.s3UrlForObject(this.sparkUILoggingLocation.prefix).replace(/\/?$/, '/'), // path will always end with a slash
}) : {};
return {
...continuousLoggingArgs,
...profilingMetricsArgs,
...observabilityMetricsArgs,
...sparkUIArgs,
...this.checkNoReservedArgs(props.defaultArguments),
};
}
/**
* Set the arguments for extra {@link Code}-related properties
*/
setupExtraCodeArguments(args, props) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_SparkExtraCodeProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.setupExtraCodeArguments);
}
throw error;
}
if (props.extraJars && props.extraJars.length > 0) {
args['--extra-jars'] = props.extraJars.map(code => this.codeS3ObjectUrl(code)).join(',');
}
if (props.extraJarsFirst) {
args['--user-jars-first'] = 'true';
}
if (props.extraPythonFiles && props.extraPythonFiles.length > 0) {
args['--extra-py-files'] = props.extraPythonFiles.map(code => this.codeS3ObjectUrl(code)).join(',');
}
if (props.extraFiles && props.extraFiles.length > 0) {
args['--extra-files'] = props.extraFiles.map(code => this.codeS3ObjectUrl(code)).join(',');
}
}
setupSparkUILoggingLocation(props) {
validateSparkUiPrefix(props.prefix);
const bucket = props.bucket ?? new s3.Bucket(this, 'SparkUIBucket', { enforceSSL: true, encryption: s3.BucketEncryption.S3_MANAGED });
bucket.grantReadWrite(this, cleanSparkUiPrefixForGrant(props.prefix));
return {
prefix: props.prefix,
bucket,
};
}
}
exports.SparkJob = SparkJob;
_a = JSII_RTTI_SYMBOL_1;
SparkJob[_a] = { fqn: "@aws-cdk/aws-glue-alpha.SparkJob", version: "2.208.0-alpha.0" };
function validateSparkUiPrefix(prefix) {
if (!prefix || aws_cdk_lib_1.Token.isUnresolved(prefix)) {
// skip validation if prefix is not specified or is a token
return;
}
const errors = [];
if (!prefix.startsWith('/')) {
errors.push('Prefix must begin with \'/\'');
}
if (prefix.endsWith('/')) {
errors.push('Prefix must not end with \'/\'');
}
if (errors.length > 0) {
throw new aws_cdk_lib_1.UnscopedValidationError(`Invalid prefix format (value: ${prefix})${os_1.EOL}${errors.join(os_1.EOL)}`);
}
}
function cleanSparkUiPrefixForGrant(prefix) {
return prefix !== undefined ? prefix.slice(1) + '/*' : undefined;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhcmstam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3Bhcmstam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLHlDQUF5QztBQUN6Qyw4RUFBOEU7QUFHOUUsK0JBQXNDO0FBQ3RDLDZDQUE2RDtBQUM3RCwyQkFBeUI7QUFrR3pCOztHQUVHO0FBQ0gsTUFBc0IsUUFBUyxTQUFRLFNBQUc7SUFZeEMsWUFBWSxLQUEyQixFQUFFLEVBQVUsRUFBRSxLQUFvQjtRQUN2RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFlBQVksRUFBRSxLQUFLLENBQUMsT0FBTztTQUM1QixDQUFDLENBQUM7Ozs7OzsrQ0FmZSxRQUFROzs7O1FBZ0IxQixtQ0FBbUM7UUFDbkMsSUFBQSx3Q0FBb0IsRUFBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbEMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUVoQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0tBQzNHO0lBRVMsNEJBQTRCLENBQUMsS0FBb0I7Ozs7Ozs7Ozs7UUFDekQsaUZBQWlGO1FBQ2pGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUYsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLGtCQUFrQixFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3hELE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUU5RSx3REFBd0Q7UUFDeEQs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SUFFNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxxQ0FBdUIsQ0FBQyxpQ0FBaUMsTUFBTSxJQUFJLFFBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6RyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsMEJBQTBCLENBQUMsTUFBZTtJQUNqRCxPQUFPLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBDb2RlIH0gZnJvbSAnLi4vY29kZSc7XG5pbXBvcnQgeyBKb2IsIEpvYlByb3BzIH0gZnJvbSAnLi9qb2InO1xuaW1wb3J0IHsgVG9rZW4sIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuXG4vKipcbiAqIENvZGUgcHJvcHMgZm9yIGRpZmZlcmVudCB7QGxpbmsgQ29kZX0gYXNzZXRzIHVzZWQgYnkgZGlmZmVyZW50IHR5cGVzIG9mIFNwYXJrIGpvYnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhcmtFeHRyYUNvZGVQcm9wcyB7XG4gIC8qKlxuICAgKiBFeHRyYSBQeXRob24gRmlsZXMgUzMgVVJMIChvcHRpb25hbClcbiAgICogUzMgVVJMIHdoZXJlIGFkZGl0aW9uYWwgcHl0aG9uIGRlcGVuZGVuY2llcyBhcmUgbG9jYXRlZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dHJhIGZpbGVzXG4gICAqL1xuICByZWFkb25seSBleHRyYVB5dGhvbkZpbGVzPzogQ29kZVtdO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGZpbGVzLCBzdWNoIGFzIGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhhdCBBV1MgR2x1ZSBjb3BpZXMgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHlvdXIgc2NyaXB0IGJlZm9yZSBleGVjdXRpbmcgaXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgZmlsZXMgc3BlY2lmaWVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFGaWxlcz86IENvZGVbXTtcblxuICAvKipcbiAgICogRXh0cmEgSmFycyBTMyBVUkwgKG9wdGlvbmFsKVxuICAgKiBTMyBVUkwgd2hlcmUgYWRkaXRpb25hbCBqYXIgZGVwZW5kZW5jaWVzIGFyZSBsb2NhdGVkXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgamFyIGZpbGVzXG4gICAqL1xuICByZWFkb25seSBleHRyYUphcnM/OiBDb2RlW107XG5cbiAgLyoqXG4gICAqIFNldHRpbmcgdGhpcyB2YWx1ZSB0byB0cnVlIHByaW9yaXRpemVzIHRoZSBjdXN0b21lcidzIGV4dHJhIEpBUiBmaWxlcyBpbiB0aGUgY2xhc3NwYXRoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZSAtIHByaW9yaXR5IGlzIG5vdCBnaXZlbiB0byB1c2VyLXByb3ZpZGVkIGphcnNcbiAgICpcbiAgICogQHNlZSBgLS11c2VyLWphcnMtZmlyc3RgIGluIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFKYXJzRmlyc3Q/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGVuYWJsaW5nIFNwYXJrIFVJIG1vbml0b3JpbmcgZmVhdHVyZSBmb3IgU3BhcmstYmFzZWQgR2x1ZSBqb2JzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL21vbml0b3Itc3BhcmstdWktam9icy5odG1sXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXJrVUlQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVja2V0IHdoZXJlIHRoZSBHbHVlIGpvYiBzdG9yZXMgdGhlIGxvZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGEgbmV3IGJ1Y2tldCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBidWNrZXQ/OiBzMy5JQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBpbnNpZGUgdGhlIGJ1Y2tldCAob2JqZWN0cyBwcmVmaXgpIHdoZXJlIHRoZSBHbHVlIGpvYiBzdG9yZXMgdGhlIGxvZ3MuXG4gICAqIFVzZSBmb3JtYXQgYCcvZm9vL2JhcidgXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGxvZ3Mgd2lsbCBiZSB3cml0dGVuIGF0IHRoZSByb290IG9mIHRoZSBidWNrZXRcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgU3BhcmsgVUkgbG9nZ2luZyBsb2NhdGlvbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yLXNwYXJrLXVpLWpvYnMuaHRtbFxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGFya1VJTG9nZ2luZ0xvY2F0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBidWNrZXQgd2hlcmUgdGhlIEdsdWUgam9iIHN0b3JlcyB0aGUgbG9ncy5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldDogczMuSUJ1Y2tldDtcblxuICAvKipcbiAgICogVGhlIHBhdGggaW5zaWRlIHRoZSBidWNrZXQgKG9iamVjdHMgcHJlZml4KSB3aGVyZSB0aGUgR2x1ZSBqb2Igc3RvcmVzIHRoZSBsb2dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnLycgLSB0aGUgbG9ncyB3aWxsIGJlIHdyaXR0ZW4gYXQgdGhlIHJvb3Qgb2YgdGhlIGJ1Y2tldFxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbW1vbiBwcm9wZXJ0aWVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgU3Bhcmsgam9icy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGFya0pvYlByb3BzIGV4dGVuZHMgSm9iUHJvcHMge1xuICAvKipcbiAgICogRW5hYmxlcyB0aGUgU3BhcmsgVUkgZGVidWdnaW5nIGFuZCBtb25pdG9yaW5nIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTcGFyayBVSSBkZWJ1Z2dpbmcgYW5kIG1vbml0b3JpbmcgaXMgZGlzYWJsZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL21vbml0b3Itc3BhcmstdWktam9icy5odG1sXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICByZWFkb25seSBzcGFya1VJPzogU3BhcmtVSVByb3BzO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBTcGFyayBKb2JzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3BhcmtKb2IgZXh0ZW5kcyBKb2Ige1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuXG4gIC8qKlxuICAgKiBUaGUgU3BhcmsgVUkgbG9ncyBsb2NhdGlvbiBpZiBTcGFyayBVSSBtb25pdG9yaW5nIGFuZCBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvbW9uaXRvci1zcGFyay11aS1qb2JzLmh0bWxcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzcGFya1VJTG9nZ2luZ0xvY2F0aW9uPzogU3BhcmtVSUxvZ2dpbmdMb2NhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTcGFya0pvYlByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBwaHlzaWNhbE5hbWU6IHByb3BzLmpvYk5hbWUsXG4gICAgfSk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICB0aGlzLnJvbGUgPSBwcm9wcy5yb2xlO1xuICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSB0aGlzLnJvbGU7XG5cbiAgICB0aGlzLnNwYXJrVUlMb2dnaW5nTG9jYXRpb24gPSBwcm9wcy5zcGFya1VJID8gdGhpcy5zZXR1cFNwYXJrVUlMb2dnaW5nTG9jYXRpb24ocHJvcHMuc3BhcmtVSSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgbm9uRXhlY3V0YWJsZUNvbW1vbkFyZ3VtZW50cyhwcm9wczogU3BhcmtKb2JQcm9wcyk6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9IHtcbiAgICAvLyBFbmFibGUgQ2xvdWRXYXRjaCBtZXRyaWNzIGFuZCBjb250aW51b3VzIGxvZ2dpbmcgYnkgZGVmYXVsdCBhcyBhIGJlc3QgcHJhY3RpY2VcbiAgICBjb25zdCBjb250aW51b3VzTG9nZ2luZ0FyZ3MgPSB0aGlzLnNldHVwQ29udGludW91c0xvZ2dpbmcodGhpcy5yb2xlLCBwcm9wcy5jb250aW51b3VzTG9nZ2luZyk7XG4gICAgY29uc3QgcHJvZmlsaW5nTWV0cmljc0FyZ3MgPSB7ICctLWVuYWJsZS1tZXRyaWNzJzogJycgfTtcbiAgICBjb25zdCBvYnNlcnZhYmlsaXR5TWV0cmljc0FyZ3MgPSB7ICctLWVuYWJsZS1vYnNlcnZhYmlsaXR5LW1ldHJpY3MnOiAndHJ1ZScgfTtcblxuICAgIC8vIFNldCBzcGFyayB1aSBhcmdzLCBpZiBzcGFyayB1aSBsb2dnaW5nIGhhZCBiZWVuIHNldHVwXG4gICAgY29uc3Qgc3BhcmtVSUFyZ3MgPSB0aGlzLnNwYXJrVUlMb2dnaW5nTG9jYXRpb24gPyAoe1xuICAgICAgJy0tZW5hYmxlLXNwYXJrLXVpJzogJ3RydWUnLFxuICAgICAgJy0tc3BhcmstZXZlbnQtbG9ncy1wYXRoJzogdGhpcy5zcGFya1VJTG9nZ2luZ0xvY2F0aW9uLmJ1Y2tldC5zM1VybEZvck9iamVjdCh0aGlzLnNwYXJrVUlMb2dnaW5nTG9jYXRpb24ucHJlZml4KS5yZXBsYWNlKC9cXC8/JC8sICcvJyksIC8vIHBhdGggd2lsbCBhbHdheXMgZW5kIHdpdGggYSBzbGFzaFxuICAgIH0pOiB7fTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb250aW51b3VzTG9nZ2luZ0FyZ3MsXG4gICAgICAuLi5wcm9maWxpbmdNZXRyaWNzQXJncyxcbiAgICAgIC4uLm9ic2VydmFiaWxpdHlNZXRyaWNzQXJncyxcbiAgICAgIC4uLnNwYXJrVUlBcmdzLFxuICAgICAgLi4udGhpcy5jaGVja05vUmVzZXJ2ZWRBcmdzKHByb3BzLmRlZmF1bHRBcmd1bWVudHMpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBhcmd1bWVudHMgZm9yIGV4dHJhIHtAbGluayBDb2RlfS1yZWxhdGVkIHByb3BlcnRpZXNcbiAgICovXG4gIHByb3RlY3RlZCBzZXR1cEV4dHJhQ29kZUFyZ3VtZW50cyhhcmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9LCBwcm9wczogU3BhcmtFeHRyYUNvZGVQcm9wcykge1xuICAgIGlmIChwcm9wcy5leHRyYUphcnMgJiYgcHJvcHMuZXh0cmFKYXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFyZ3NbJy0tZXh0cmEtamFycyddID0gcHJvcHMuZXh0cmFKYXJzLm1hcChjb2RlID0+IHRoaXMuY29kZVMzT2JqZWN0VXJsKGNvZGUpKS5qb2luKCcsJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5leHRyYUphcnNGaXJzdCkge1xuICAgICAgYXJnc1snLS11c2VyLWphcnMtZmlyc3QnXSA9ICd0cnVlJztcbiAgICB9XG4gICAgaWYgKHByb3BzLmV4dHJhUHl0aG9uRmlsZXMgJiYgcHJvcHMuZXh0cmFQeXRob25GaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBhcmdzWyctLWV4dHJhLXB5LWZpbGVzJ10gPSBwcm9wcy5leHRyYVB5dGhvbkZpbGVzLm1hcChjb2RlID0+IHRoaXMuY29kZVMzT2JqZWN0VXJsKGNvZGUpKS5qb2luKCcsJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5leHRyYUZpbGVzICYmIHByb3BzLmV4dHJhRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXJnc1snLS1leHRyYS1maWxlcyddID0gcHJvcHMuZXh0cmFGaWxlcy5tYXAoY29kZSA9PiB0aGlzLmNvZGVTM09iamVjdFVybChjb2RlKSkuam9pbignLCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBTcGFya1VJTG9nZ2luZ0xvY2F0aW9uKHByb3BzOiBTcGFya1VJUHJvcHMpOiBTcGFya1VJTG9nZ2luZ0xvY2F0aW9uIHtcbiAgICB2YWxpZGF0ZVNwYXJrVWlQcmVmaXgocHJvcHMucHJlZml4KTtcbiAgICBjb25zdCBidWNrZXQgPSBwcm9wcy5idWNrZXQgPz8gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnU3BhcmtVSUJ1Y2tldCcsIHsgZW5mb3JjZVNTTDogdHJ1ZSwgZW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEIH0pO1xuICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLCBjbGVhblNwYXJrVWlQcmVmaXhGb3JHcmFudChwcm9wcy5wcmVmaXgpKTtcbiAgICByZXR1cm4ge1xuICAgICAgcHJlZml4OiBwcm9wcy5wcmVmaXgsXG4gICAgICBidWNrZXQsXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNwYXJrVWlQcmVmaXgocHJlZml4Pzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghcHJlZml4IHx8IFRva2VuLmlzVW5yZXNvbHZlZChwcmVmaXgpKSB7XG4gICAgLy8gc2tpcCB2YWxpZGF0aW9uIGlmIHByZWZpeCBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIGEgdG9rZW5cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKCFwcmVmaXguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgZXJyb3JzLnB1c2goJ1ByZWZpeCBtdXN0IGJlZ2luIHdpdGggXFwnL1xcJycpO1xuICB9XG5cbiAgaWYgKHByZWZpeC5lbmRzV2l0aCgnLycpKSB7XG4gICAgZXJyb3JzLnB1c2goJ1ByZWZpeCBtdXN0IG5vdCBlbmQgd2l0aCBcXCcvXFwnJyk7XG4gIH1cblxuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgcHJlZml4IGZvcm1hdCAodmFsdWU6ICR7cHJlZml4fSkke0VPTH0ke2Vycm9ycy5qb2luKEVPTCl9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYW5TcGFya1VpUHJlZml4Rm9yR3JhbnQocHJlZml4Pzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHByZWZpeCAhPT0gdW5kZWZpbmVkID8gcHJlZml4LnNsaWNlKDEpICsgJy8qJyA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==