awscdk-construct-live-channel-from-mp4-file
Version:
CDK Construct for setting up a simple live channel for testing
148 lines • 22.1 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MediaPackageV1 = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const crypto = require("crypto");
const aws_mediapackage_1 = require("aws-cdk-lib/aws-mediapackage");
const constructs_1 = require("constructs");
function isMediaPakcageV1MidEndpointSpec(spec) {
return spec.segmentDurationSeconds !== undefined
|| spec.manifestWindowSeconds !== undefined
|| spec.hlsAdMarkers !== undefined
|| spec.separateAudioRendition !== undefined;
}
class MediaPackageV1 extends constructs_1.Construct {
constructor(scope, id, { startoverWindowSeconds = 0, endpointSpec = {
segmentDurationSeconds: 6,
manifestWindowSeconds: 60,
hlsAdMarkers: 'DATERANGE',
separateAudioRendition: false,
}, }) {
super(scope, id);
// Create MediaPackage channel
this.channel = new aws_mediapackage_1.CfnChannel(this, 'MediaPackageV1Channel', {
id: `${crypto.randomUUID()}`,
description: 'MediaPackage channel for testing',
});
// Create MediaPackage endpoints
if (isMediaPakcageV1MidEndpointSpec(endpointSpec)) {
const { segmentDurationSeconds = 6, manifestWindowSeconds = 60, hlsAdMarkers = 'DATERANGE', separateAudioRendition = false, } = endpointSpec;
const adTriggers = [
'DISTRIBUTOR_ADVERTISEMENT',
'DISTRIBUTOR_OVERLAY_PLACEMENT_OPPORTUNITY',
'DISTRIBUTOR_PLACEMENT_OPPORTUNITY',
'PROVIDER_ADVERTISEMENT',
'PROVIDER_OVERLAY_PLACEMENT_OPPORTUNITY',
'PROVIDER_PLACEMENT_OPPORTUNITY',
'SPLICE_INSERT',
];
this.endpoints = {
hls: new aws_mediapackage_1.CfnOriginEndpoint(this, 'MediaPackageV1HlsEndpoint', {
channelId: this.channel.ref,
id: `${crypto.randomUUID()}`,
description: 'MediaPackage HLS endpoint for testing',
hlsPackage: {
segmentDurationSeconds,
playlistWindowSeconds: manifestWindowSeconds,
adMarkers: hlsAdMarkers,
adTriggers,
programDateTimeIntervalSeconds: 1,
useAudioRenditionGroup: separateAudioRendition,
},
startoverWindowSeconds,
}),
dash: new aws_mediapackage_1.CfnOriginEndpoint(this, 'MediaPackageV1DashEndpoint', {
channelId: this.channel.ref,
id: `${crypto.randomUUID()}`,
description: 'MediaPackage DASH endpoint for testing',
dashPackage: {
segmentDurationSeconds,
manifestWindowSeconds,
periodTriggers: ['ADS'],
adTriggers,
},
startoverWindowSeconds,
}),
cmaf: new aws_mediapackage_1.CfnOriginEndpoint(this, 'MediaPackageV1CmafEndpoint', {
channelId: this.channel.ref,
id: `${crypto.randomUUID()}`,
description: 'MediaPackage CMAF endpoint for testing',
cmafPackage: {
segmentDurationSeconds,
hlsManifests: [
{
id: '1',
playlistWindowSeconds: manifestWindowSeconds,
adMarkers: hlsAdMarkers,
adTriggers,
programDateTimeIntervalSeconds: 1,
},
],
},
startoverWindowSeconds,
}),
mss: new aws_mediapackage_1.CfnOriginEndpoint(this, 'MediaPackageV1MssEndpoint', {
channelId: this.channel.ref,
id: `${crypto.randomUUID()}`,
description: 'MediaPackage MSS endpoint for testing',
mssPackage: {
segmentDurationSeconds,
manifestWindowSeconds,
},
startoverWindowSeconds,
}),
};
}
else {
// endpointSpec is CfnOriginEndpointProps[]
let hls;
let dash;
let cmaf;
let mss;
for (const prop of endpointSpec) {
if ('hlsPackage' in prop && hls === undefined) {
hls = new aws_mediapackage_1.CfnOriginEndpoint(this, 'MediaPackageV1HlsEndpoint', {
channelId: this.channel.ref,
id: `${crypto.randomUUID()}`,
description: 'MediaPackage HLS endpoint for testing',
hlsPackage: prop.hlsPackage,
startoverWindowSeconds,
});
}
else if ('dashPackage' in prop && dash === undefined) {
dash = new aws_mediapackage_1.CfnOriginEndpoint(this, 'MediaPackageV1DashEndpoint', {
channelId: this.channel.ref,
id: `${crypto.randomUUID()}`,
description: 'MediaPackage DASH endpoint for testing',
dashPackage: prop.dashPackage,
startoverWindowSeconds,
});
}
else if ('cmafPackage' in prop && cmaf === undefined) {
cmaf = new aws_mediapackage_1.CfnOriginEndpoint(this, 'MediaPackageV1CmafEndpoint', {
channelId: this.channel.ref,
id: `${crypto.randomUUID()}`,
description: 'MediaPackage CMAF endpoint for testing',
cmafPackage: prop.cmafPackage,
startoverWindowSeconds,
});
}
else if ('mssPackage' in prop && mss === undefined) {
mss = new aws_mediapackage_1.CfnOriginEndpoint(this, 'MediaPackageV1MssEndpoint', {
channelId: this.channel.ref,
id: `${crypto.randomUUID()}`,
description: 'MediaPackage MSS endpoint for testing',
mssPackage: prop.mssPackage,
startoverWindowSeconds,
});
}
}
this.endpoints = { hls, dash, cmaf, mss };
}
}
}
exports.MediaPackageV1 = MediaPackageV1;
_a = JSII_RTTI_SYMBOL_1;
MediaPackageV1[_a] = { fqn: "awscdk-construct-live-channel-from-mp4-file.MediaPackageV1", version: "1.2.27" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVkaWFQYWNrYWdlVjEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvTWVkaWFQYWNrYWdlVjEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBaUM7QUFDakMsbUVBR3NDO0FBQ3RDLDJDQUF1QztBQThCdkMsU0FBUywrQkFBK0IsQ0FBQyxJQUFnQztJQUV2RSxPQUFRLElBQXNDLENBQUMsc0JBQXNCLEtBQUssU0FBUztXQUMvRSxJQUFzQyxDQUFDLHFCQUFxQixLQUFLLFNBQVM7V0FDMUUsSUFBc0MsQ0FBQyxZQUFZLEtBQUssU0FBUztXQUNqRSxJQUFzQyxDQUFDLHNCQUFzQixLQUFLLFNBQVMsQ0FBQztBQUNsRixDQUFDO0FBRUQsTUFBYSxjQUFlLFNBQVEsc0JBQVM7SUFJM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxFQUN4QyxzQkFBc0IsR0FBRyxDQUFDLEVBQzFCLFlBQVksR0FBRztRQUNiLHNCQUFzQixFQUFFLENBQUM7UUFDekIscUJBQXFCLEVBQUUsRUFBRTtRQUN6QixZQUFZLEVBQUUsV0FBVztRQUN6QixzQkFBc0IsRUFBRSxLQUFLO0tBQzlCLEdBQ21CO1FBQ3BCLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSw2QkFBVSxDQUFDLElBQUksRUFBRSx1QkFBdUIsRUFBRTtZQUMzRCxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDNUIsV0FBVyxFQUFFLGtDQUFrQztTQUNoRCxDQUFDLENBQUM7UUFFSCxnQ0FBZ0M7UUFDaEMsSUFBSSwrQkFBK0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBRWxELE1BQU0sRUFDSixzQkFBc0IsR0FBRyxDQUFDLEVBQzFCLHFCQUFxQixHQUFHLEVBQUUsRUFDMUIsWUFBWSxHQUFHLFdBQVcsRUFDMUIsc0JBQXNCLEdBQUcsS0FB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QUFFLHVDQUF1Qzt3QkFDcEQsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFrRDt3QkFDbkUsc0JBQXNCO3FCQUN2QixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDNUMsQ0FBQztJQUNILENBQUM7O0FBNUlILHdDQTZJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHtcbiAgQ2ZuQ2hhbm5lbCxcbiAgQ2ZuT3JpZ2luRW5kcG9pbnQsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYXBhY2thZ2UnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFQYWtjYWdlVjFNaWRFbmRwb2ludFNwZWMge1xuICByZWFkb25seSBzZWdtZW50RHVyYXRpb25TZWNvbmRzPzogbnVtYmVyOyAvLyBUaGUgZHVyYXRpb24gb2YgZWFjaCBzZWdtZW50IGluIHNlY29uZHMuXG4gIHJlYWRvbmx5IG1hbmlmZXN0V2luZG93U2Vjb25kcz86IG51bWJlcjsgLy8gVGhlIGR1cmF0aW9uIG9mIG1hbmlmZXN0IGluIHNlY29uZHMuXG4gIHJlYWRvbmx5IGhsc0FkTWFya2Vycz86IHN0cmluZzsgLy8gQ29udHJvbHMgaG93IGFkIG1hcmtlcnMgYXJlIGluY2x1ZGVkIGluIHRoZSBwYWNrYWdlZCBlbmRwb2ludC5cbiAgcmVhZG9ubHkgc2VwYXJhdGVBdWRpb1JlbmRpdGlvbj86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gc2VwYXJhdGUgYXVkaW8gcmVuZGl0aW9uLlxufVxuXG5leHBvcnQgdHlwZSBNZWRpYVBhY2thZ2VWMUZ1bGxFbmRwb2ludFNwZWMgPSAoXG4gIENmbk9yaWdpbkVuZHBvaW50Lkhsc1BhY2thZ2VQcm9wZXJ0eVxuICB8IENmbk9yaWdpbkVuZHBvaW50LkRhc2hQYWNrYWdlUHJvcGVydHlcbiAgfCBDZm5PcmlnaW5FbmRwb2ludC5DbWFmUGFja2FnZVByb3BlcnR5XG4gIHwgQ2ZuT3JpZ2luRW5kcG9pbnQuTXNzUGFja2FnZVByb3BlcnR5XG4pW107XG5cbmV4cG9ydCB0eXBlIE1lZGlhUGFrY2FnZVYxRW5kcG9pbnRTcGVjID0gTWVkaWFQYWtjYWdlVjFNaWRFbmRwb2ludFNwZWMgfCBNZWRpYVBhY2thZ2VWMUZ1bGxFbmRwb2ludFNwZWM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFQYWtjYWdlVjFQcm9wcyB7XG4gIHJlYWRvbmx5IHN0YXJ0b3ZlcldpbmRvd1NlY29uZHM/OiBudW1iZXI7IC8vIFRoZSBkdXJhdGlvbiBvZiBzdGFydG92ZXIgd2luZG93IGluIHNlY29uZHMuXG4gIHJlYWRvbmx5IGVuZHBvaW50U3BlYz86IE1lZGlhUGFrY2FnZVYxRW5kcG9pbnRTcGVjOyAvLyBUaGUgc2V0dGluZ3MgZm9yIHRoZSBNZWRpYVBhY2thZ2UgZW5kcG9pbnRzLlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhUGFja2FnZVYxRW5kcG9pbnRzVGFibGUge1xuICByZWFkb25seSBobHM/OiBDZm5PcmlnaW5FbmRwb2ludDsgLy8gVGhlIEhMUyBlbmRwb2ludC5cbiAgcmVhZG9ubHkgZGFzaD86IENmbk9yaWdpbkVuZHBvaW50OyAvLyBUaGUgREFTSCBlbmRwb2ludC5cbiAgcmVhZG9ubHkgY21hZj86IENmbk9yaWdpbkVuZHBvaW50OyAvLyBUaGUgQ01BRiBlbmRwb2ludC5cbiAgcmVhZG9ubHkgbXNzPzogQ2ZuT3JpZ2luRW5kcG9pbnQ7IC8vIFRoZSBNU1MgZW5kcG9pbnQuXG59XG5cbmZ1bmN0aW9uIGlzTWVkaWFQYWtjYWdlVjFNaWRFbmRwb2ludFNwZWMoc3BlYzogTWVkaWFQYWtjYWdlVjFFbmRwb2ludFNwZWMsXG4pOiBzcGVjIGlzIE1lZGlhUGFrY2FnZVYxTWlkRW5kcG9pbnRTcGVjIHtcbiAgcmV0dXJuIChzcGVjIGFzIE1lZGlhUGFrY2FnZVYxTWlkRW5kcG9pbnRTcGVjKS5zZWdtZW50RHVyYXRpb25TZWNvbmRzICE9PSB1bmRlZmluZWRcbiAgfHwgKHNwZWMgYXMgTWVkaWFQYWtjYWdlVjFNaWRFbmRwb2ludFNwZWMpLm1hbmlmZXN0V2luZG93U2Vjb25kcyAhPT0gdW5kZWZpbmVkXG4gIHx8IChzcGVjIGFzIE1lZGlhUGFrY2FnZVYxTWlkRW5kcG9pbnRTcGVjKS5obHNBZE1hcmtlcnMgIT09IHVuZGVmaW5lZFxuICB8fCAoc3BlYyBhcyBNZWRpYVBha2NhZ2VWMU1pZEVuZHBvaW50U3BlYykuc2VwYXJhdGVBdWRpb1JlbmRpdGlvbiAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgTWVkaWFQYWNrYWdlVjEgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbDogQ2ZuQ2hhbm5lbDsgLy8gVGhlIHJlZmVyZW5jZSB0byB0aGUgTWVkaWFQYWNrYWdlIGNoYW5uZWwuXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludHM6IE1lZGlhUGFja2FnZVYxRW5kcG9pbnRzVGFibGU7IC8vIFRoZSByZWZlcmVuY2UgdG8gdGhlIE1lZGlhUGFja2FnZSBlbmRwb2ludHMuXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywge1xuICAgIHN0YXJ0b3ZlcldpbmRvd1NlY29uZHMgPSAwLFxuICAgIGVuZHBvaW50U3BlYyA9IHtcbiAgICAgIHNlZ21lbnREdXJhdGlvblNlY29uZHM6IDYsXG4gICAgICBtYW5pZmVzdFdpbmRvd1NlY29uZHM6IDYwLFxuICAgICAgaGxzQWRNYXJrZXJzOiAnREFURVJBTkdFJyxcbiAgICAgIHNlcGFyYXRlQXVkaW9SZW5kaXRpb246IGZhbHNlLFxuICAgIH0sXG4gIH06IE1lZGlhUGFrY2FnZVYxUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gQ3JlYXRlIE1lZGlhUGFja2FnZSBjaGFubmVsXG4gICAgdGhpcy5jaGFubmVsID0gbmV3IENmbkNoYW5uZWwodGhpcywgJ01lZGlhUGFja2FnZVYxQ2hhbm5lbCcsIHtcbiAgICAgIGlkOiBgJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWAsXG4gICAgICBkZXNjcmlwdGlvbjogJ01lZGlhUGFja2FnZSBjaGFubmVsIGZvciB0ZXN0aW5nJyxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBNZWRpYVBhY2thZ2UgZW5kcG9pbnRzXG4gICAgaWYgKGlzTWVkaWFQYWtjYWdlVjFNaWRFbmRwb2ludFNwZWMoZW5kcG9pbnRTcGVjKSkge1xuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHNlZ21lbnREdXJhdGlvblNlY29uZHMgPSA2LFxuICAgICAgICBtYW5pZmVzdFdpbmRvd1NlY29uZHMgPSA2MCxcbiAgICAgICAgaGxzQWRNYXJrZXJzID0gJ0RBVEVSQU5HRScsXG4gICAgICAgIHNlcGFyYXRlQXVkaW9SZW5kaXRpb24gPSBmYWxzZSxcbiAgICAgIH0gPSBlbmRwb2ludFNwZWM7XG5cbiAgICAgIGNvbnN0IGFkVHJpZ2dlcnMgPSBbXG4gICAgICAgICdESVNUUklCVVRPUl9BRFZFUlRJU0VNRU5UJyxcbiAgICAgICAgJ0RJU1RSSUJVVE9SX09WRVJMQVlfUExBQ0VNRU5UX09QUE9SVFVOSVRZJyxcbiAgICAgICAgJ0RJU1RSSUJVVE9SX1BMQUNFTUVOVF9PUFBPUlRVTklUWScsXG4gICAgICAgICdQUk9WSURFUl9BRFZFUlRJU0VNRU5UJyxcbiAgICAgICAgJ1BST1ZJREVSX09WRVJMQVlfUExBQ0VNRU5UX09QUE9SVFVOSVRZJyxcbiAgICAgICAgJ1BST1ZJREVSX1BMQUNFTUVOVF9PUFBPUlRVTklUWScsXG4gICAgICAgICdTUExJQ0VfSU5TRVJUJyxcbiAgICAgIF07XG5cbiAgICAgIHRoaXMuZW5kcG9pbnRzID0ge1xuICAgICAgICBobHM6IG5ldyBDZm5PcmlnaW5FbmRwb2ludCh0aGlzLCAnTWVkaWFQYWNrYWdlVjFIbHNFbmRwb2ludCcsIHtcbiAgICAgICAgICBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbC5yZWYsXG4gICAgICAgICAgaWQ6IGAke2NyeXB0by5yYW5kb21VVUlEKCl9YCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ01lZGlhUGFja2FnZSBITFMgZW5kcG9pbnQgZm9yIHRlc3RpbmcnLFxuICAgICAgICAgIGhsc1BhY2thZ2U6IHtcbiAgICAgICAgICAgIHNlZ21lbnREdXJhdGlvblNlY29uZHMsXG4gICAgICAgICAgICBwbGF5bGlzdFdpbmRvd1NlY29uZHM6IG1hbmlmZXN0V2luZG93U2Vjb25kcyxcbiAgICAgICAgICAgIGFkTWFya2VyczogaGxzQWRNYXJrZXJzLFxuICAgICAgICAgICAgYWRUcmlnZ2VycyxcbiAgICAgICAgICAgIHByb2dyYW1EYXRlVGltZUludGVydmFsU2Vjb25kczogMSxcbiAgICAgICAgICAgIHVzZUF1ZGlvUmVuZGl0aW9uR3JvdXA6IHNlcGFyYXRlQXVkaW9SZW5kaXRpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGFydG92ZXJXaW5kb3dTZWNvbmRzLFxuICAgICAgICB9KSxcbiAgICAgICAgZGFzaDogbmV3IENmbk9yaWdpbkVuZHBvaW50KHRoaXMsICdNZWRpYVBhY2thZ2VWMURhc2hFbmRwb2ludCcsIHtcbiAgICAgICAgICBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbC5yZWYsXG4gICAgICAgICAgaWQ6IGAke2NyeXB0by5yYW5kb21VVUlEKCl9YCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ01lZGlhUGFja2FnZSBEQVNIIGVuZHBvaW50IGZvciB0ZXN0aW5nJyxcbiAgICAgICAgICBkYXNoUGFja2FnZToge1xuICAgICAgICAgICAgc2VnbWVudER1cmF0aW9uU2Vjb25kcyxcbiAgICAgICAgICAgIG1hbmlmZXN0V2luZG93U2Vjb25kcyxcbiAgICAgICAgICAgIHBlcmlvZFRyaWdnZXJzOiBbJ0FEUyddLFxuICAgICAgICAgICAgYWRUcmlnZ2VycyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXJ0b3ZlcldpbmRvd1NlY29uZHMsXG4gICAgICAgIH0pLFxuICAgICAgICBjbWFmOiBuZXcgQ2ZuT3JpZ2luRW5kcG9pbnQodGhpcywgJ01lZGlhUGFja2FnZVYxQ21hZkVuZHBvaW50Jywge1xuICAgICAgICAgIGNoYW5uZWxJZDogdGhpcy5jaGFubmVsLnJlZixcbiAgICAgICAgICBpZDogYCR7Y3J5cHRvLnJhbmRvbVVVSUQoKX1gLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTWVkaWFQYWNrYWdlIENNQUYgZW5kcG9pbnQgZm9yIHRlc3RpbmcnLFxuICAgICAgICAgIGNtYWZQYWNrYWdlOiB7XG4gICAgICAgICAgICBzZWdtZW50RHVyYXRpb25TZWNvbmRzLFxuICAgICAgICAgICAgaGxzTWFuaWZlc3RzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAgICAgIHBsYXlsaXN0V2luZG93U2Vjb25kczogbWFuaWZlc3RXaW5kb3dTZWNvbmRzLFxuICAgICAgICAgICAgICAgIGFkTWFya2VyczogaGxzQWRNYXJrZXJzLFxuICAgICAgICAgICAgICAgIGFkVHJpZ2dlcnMsXG4gICAgICAgICAgICAgICAgcHJvZ3JhbURhdGVUaW1lSW50ZXJ2YWxTZWNvbmRzOiAxLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXJ0b3ZlcldpbmRvd1NlY29uZHMsXG4gICAgICAgIH0pLFxuICAgICAgICBtc3M6IG5ldyBDZm5PcmlnaW5FbmRwb2ludCh0aGlzLCAnTWVkaWFQYWNrYWdlVjFNc3NFbmRwb2ludCcsIHtcbiAgICAgICAgICBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbC5yZWYsXG4gICAgICAgICAgaWQ6IGAke2NyeXB0by5yYW5kb21VVUlEKCl9YCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ01lZGlhUGFja2FnZSBNU1MgZW5kcG9pbnQgZm9yIHRlc3RpbmcnLFxuICAgICAgICAgIG1zc1BhY2thZ2U6IHtcbiAgICAgICAgICAgIHNlZ21lbnREdXJhdGlvblNlY29uZHMsXG4gICAgICAgICAgICBtYW5pZmVzdFdpbmRvd1NlY29uZHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGFydG92ZXJXaW5kb3dTZWNvbmRzLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVuZHBvaW50U3BlYyBpcyBDZm5PcmlnaW5FbmRwb2ludFByb3BzW11cbiAgICAgIGxldCBobHM6IENmbk9yaWdpbkVuZHBvaW50IHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IGRhc2g6IENmbk9yaWdpbkVuZHBvaW50IHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IGNtYWY6IENmbk9yaWdpbkVuZHBvaW50IHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IG1zczogQ2ZuT3JpZ2luRW5kcG9pbnQgfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW5kcG9pbnRTcGVjKSB7XG4gICAgICAgIGlmICgnaGxzUGFja2FnZScgaW4gcHJvcCAmJiBobHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGhscyA9IG5ldyBDZm5PcmlnaW5FbmRwb2ludCh0aGlzLCAnTWVkaWFQYWNrYWdlVjFIbHNFbmRwb2ludCcsIHtcbiAgICAgICAgICAgIGNoYW5uZWxJZDogdGhpcy5jaGFubmVsLnJlZixcbiAgICAgICAgICAgIGlkOiBgJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ01lZGlhUGFja2FnZSBITFMgZW5kcG9pbnQgZm9yIHRlc3RpbmcnLFxuICAgICAgICAgICAgaGxzUGFja2FnZTogcHJvcC5obHNQYWNrYWdlIGFzIENmbk9yaWdpbkVuZHBvaW50Lkhsc1BhY2thZ2VQcm9wZXJ0eSxcbiAgICAgICAgICAgIHN0YXJ0b3ZlcldpbmRvd1NlY29uZHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoJ2Rhc2hQYWNrYWdlJyBpbiBwcm9wICYmIGRhc2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRhc2ggPSBuZXcgQ2ZuT3JpZ2luRW5kcG9pbnQodGhpcywgJ01lZGlhUGFja2FnZVYxRGFzaEVuZHBvaW50Jywge1xuICAgICAgICAgICAgY2hhbm5lbElkOiB0aGlzLmNoYW5uZWwucmVmLFxuICAgICAgICAgICAgaWQ6IGAke2NyeXB0by5yYW5kb21VVUlEKCl9YCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTWVkaWFQYWNrYWdlIERBU0ggZW5kcG9pbnQgZm9yIHRlc3RpbmcnLFxuICAgICAgICAgICAgZGFzaFBhY2thZ2U6IHByb3AuZGFzaFBhY2thZ2UgYXMgQ2ZuT3JpZ2luRW5kcG9pbnQuRGFzaFBhY2thZ2VQcm9wZXJ0eSxcbiAgICAgICAgICAgIHN0YXJ0b3ZlcldpbmRvd1NlY29uZHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoJ2NtYWZQYWNrYWdlJyBpbiBwcm9wICYmIGNtYWYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNtYWYgPSBuZXcgQ2ZuT3JpZ2luRW5kcG9pbnQodGhpcywgJ01lZGlhUGFja2FnZVYxQ21hZkVuZHBvaW50Jywge1xuICAgICAgICAgICAgY2hhbm5lbElkOiB0aGlzLmNoYW5uZWwucmVmLFxuICAgICAgICAgICAgaWQ6IGAke2NyeXB0by5yYW5kb21VVUlEKCl9YCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTWVkaWFQYWNrYWdlIENNQUYgZW5kcG9pbnQgZm9yIHRlc3RpbmcnLFxuICAgICAgICAgICAgY21hZlBhY2thZ2U6IHByb3AuY21hZlBhY2thZ2UgYXMgQ2ZuT3JpZ2luRW5kcG9pbnQuQ21hZlBhY2thZ2VQcm9wZXJ0eSxcbiAgICAgICAgICAgIHN0YXJ0b3ZlcldpbmRvd1NlY29uZHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoJ21zc1BhY2thZ2UnIGluIHByb3AgJiYgbXNzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBtc3MgPSBuZXcgQ2ZuT3JpZ2luRW5kcG9pbnQodGhpcywgJ01lZGlhUGFja2FnZVYxTXNzRW5kcG9pbnQnLCB7XG4gICAgICAgICAgICBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbC5yZWYsXG4gICAgICAgICAgICBpZDogYCR7Y3J5cHRvLnJhbmRvbVVVSUQoKX1gLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdNZWRpYVBhY2thZ2UgTVNTIGVuZHBvaW50IGZvciB0ZXN0aW5nJyxcbiAgICAgICAgICAgIG1zc1BhY2thZ2U6IHByb3AubXNzUGFja2FnZSBhcyBDZm5PcmlnaW5FbmRwb2ludC5Nc3NQYWNrYWdlUHJvcGVydHksXG4gICAgICAgICAgICBzdGFydG92ZXJXaW5kb3dTZWNvbmRzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmVuZHBvaW50cyA9IHsgaGxzLCBkYXNoLCBjbWFmLCBtc3MgfTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==