filestack-adaptive
Version:
HTML5 picture elements powered by Filestack
477 lines (476 loc) • 54.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var tree_1 = require("./tree");
var assert = tslib_1.__importStar(require("assert"));
var handle = 'seW1thvcR1aQBfOCF8bX';
var apiKey = 'BBcu94EFL1STGYvkM6a8usz';
var baseURL = 'https://cdn.filestackcontent.com';
var result = function (base, opts) {
if (opts) {
return base + "/" + opts + "/" + handle;
}
return base + "/" + handle;
};
describe('makePictureTree', function () {
it('should throw if handle is not a string', function () {
assert.throws(function () { return tree_1.makePictureTree(); });
});
it('should not let a user use width descriptors without at least one size (numbers)', function () {
var options = {
resolutions: [320, 420],
};
assert.throws(function () { return tree_1.makePictureTree(handle, options); });
});
it('should not let a user use width descriptors without at least one size (strings)', function () {
var options = {
resolutions: ['320w', '420w'],
};
assert.throws(function () { return tree_1.makePictureTree(handle, options); });
});
it('should not let a user pass sizes with pixel densities', function () {
var options = {
sizes: {
'(min-width: 1080px)': '100vw',
fallback: '90vw',
},
resolutions: ['1x', '2x'],
};
assert.throws(function () { return tree_1.makePictureTree(handle, options); });
});
it('should not let a user specify resolutions if no width is set', function () {
var options = {
resolutions: ['1x', '2x'],
};
assert.throws(function () { return tree_1.makePictureTree(handle, options); });
});
it('should generate a picture object with no sources', function () {
var obj = tree_1.makePictureTree(handle, { keys: false });
var url = result(baseURL);
var expected = {
img: {
src: url,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with no sources (no resolutions) with security', function () {
var obj = tree_1.makePictureTree(handle, {
resolutions: [],
security: {
policy: 'abc',
signature: 'xyz',
},
keys: false,
});
var url = result(baseURL, "security=policy:abc,signature:xyz");
var expected = {
img: {
src: url,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 source', function () {
var testSize1 = { '(min-width: 640px)': '50vw' };
var resolutions = [320, 640];
var obj = tree_1.makePictureTree(handle, { sizes: testSize1, resolutions: resolutions, keys: false });
var srcSet = result(baseURL, 'resize=width:320') + " 320w, " + result(baseURL, 'resize=width:640') + " 640w";
var expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: srcSet,
},
],
img: {
src: result(baseURL),
srcSet: srcSet,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 source and img fallback size', function () {
var testSize1 = {
'(min-width: 640px)': '50vw',
fallback: '300px',
};
var resolutions = [320, 640];
var obj = tree_1.makePictureTree(handle, { sizes: testSize1, resolutions: resolutions, keys: false });
var srcSet = result(baseURL, 'resize=width:320') + " 320w, " + result(baseURL, 'resize=width:640') + " 640w";
var expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: srcSet,
},
],
img: {
sizes: '300px',
src: result(baseURL, 'resize=width:300'),
srcSet: srcSet,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 source with security', function () {
var testSize1 = { '(min-width: 640px)': '50vw' };
var resolutions = [320, 640];
var obj = tree_1.makePictureTree(handle, {
sizes: testSize1,
resolutions: resolutions,
security: {
policy: 'abc',
signature: 'xyz',
},
keys: false,
});
var srcSet = result(baseURL, 'security=policy:abc,signature:xyz/resize=width:320') + " 320w, " + result(baseURL, 'security=policy:abc,signature:xyz/resize=width:640') + " 640w";
var expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: srcSet,
},
],
img: {
src: result(baseURL, 'security=policy:abc,signature:xyz'),
srcSet: srcSet,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 source and 1 format', function () {
var testSize1 = { '(min-width: 640px)': '50vw' };
var resolutions = [320, 640];
var obj = tree_1.makePictureTree(handle, {
sizes: testSize1,
resolutions: resolutions,
formats: ['webp'],
keys: false,
});
var imgSrcset = result(baseURL, 'resize=width:320') + " 320w, " + result(baseURL, 'resize=width:640') + " 640w";
var url = result(baseURL, 'output=format:webp/resize=width:320') + " 320w, " + result(baseURL, 'output=format:webp/resize=width:640') + " 640w";
var expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: url,
type: 'image/webp',
},
],
img: {
src: result(baseURL),
srcSet: imgSrcset,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 format', function () {
var obj = tree_1.makePictureTree(handle, { formats: ['webp'], keys: false });
var url = result(baseURL, 'output=format:webp');
var expected = {
sources: [
{
srcSet: url,
type: 'image/webp',
},
],
img: {
src: result(baseURL),
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 2 formats and 1 size with fallback size', function () {
var obj = tree_1.makePictureTree(handle, {
formats: ['webp', 'jpg'],
resolutions: [640],
sizes: {
'(min-width: 640px)': '90vw',
fallback: '80vw',
},
keys: false,
});
var expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '90vw',
srcSet: result(baseURL, 'output=format:webp/resize=width:640') + " 640w",
type: 'image/webp',
},
{
media: '(min-width: 640px)',
sizes: '90vw',
srcSet: result(baseURL, 'output=format:jpg/resize=width:640') + " 640w",
type: 'image/jpg',
},
{
sizes: '80vw',
srcSet: result(baseURL, 'output=format:webp/resize=width:640') + " 640w",
type: 'image/webp',
},
{
sizes: '80vw',
srcSet: result(baseURL, 'output=format:jpg/resize=width:640') + " 640w",
type: 'image/jpg',
},
],
img: {
sizes: '80vw',
src: result(baseURL),
srcSet: result(baseURL, 'resize=width:640') + " 640w",
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 format with fallback size', function () {
var obj = tree_1.makePictureTree(handle, {
formats: ['webp'],
resolutions: [640],
sizes: {
fallback: '700px',
},
keys: false,
});
var expected = {
sources: [
{
sizes: '700px',
srcSet: result(baseURL, 'output=format:webp/resize=width:640') + " 640w",
type: 'image/webp',
},
],
img: {
sizes: '700px',
src: result(baseURL, 'resize=width:700'),
srcSet: result(baseURL, 'resize=width:640') + " 640w",
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 2 sources and 2 formats in order', function () {
var testSize1 = {
'(min-width: 640px)': '50vw',
'(min-width: 340px)': '33vw',
};
var resolutions = ['320w', '640w'];
var obj = tree_1.makePictureTree(handle, {
sizes: testSize1,
formats: ['jpg', 'webp'],
resolutions: resolutions,
keys: false,
});
var imgSrcset = result(baseURL, 'resize=width:320') + " 320w, " + result(baseURL, 'resize=width:640') + " 640w";
var srcSet1 = result(baseURL, 'output=format:jpg/resize=width:320') + " 320w, " + result(baseURL, 'output=format:jpg/resize=width:640') + " 640w";
var srcSet2 = result(baseURL, 'output=format:webp/resize=width:320') + " 320w, " + result(baseURL, 'output=format:webp/resize=width:640') + " 640w";
var srcSet3 = result(baseURL, 'output=format:jpg/resize=width:320') + " 320w, " + result(baseURL, 'output=format:jpg/resize=width:640') + " 640w";
var srcSet4 = result(baseURL, 'output=format:webp/resize=width:320') + " 320w, " + result(baseURL, 'output=format:webp/resize=width:640') + " 640w";
var expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: srcSet3,
type: 'image/jpg',
},
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: srcSet4,
type: 'image/webp',
},
{
media: '(min-width: 340px)',
sizes: '33vw',
srcSet: srcSet1,
type: 'image/jpg',
},
{
media: '(min-width: 340px)',
sizes: '33vw',
srcSet: srcSet2,
type: 'image/webp',
},
],
img: {
src: result(baseURL),
srcSet: imgSrcset,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with a fallback size (no resolutions)', function () {
var options = {
sizes: {
fallback: '100vw',
},
resolutions: [],
keys: false,
};
var tree = tree_1.makePictureTree(handle, options);
var expected = {
img: {
src: result(baseURL),
sizes: '100vw',
},
};
assert.deepStrictEqual(tree, expected);
});
it('should generate a picture object with a fallback size (resolutions)', function () {
var options = {
sizes: {
fallback: '100vw',
},
resolutions: [320, 640],
keys: false,
};
var srcSet = result(baseURL, 'resize=width:320') + " 320w, " + result(baseURL, 'resize=width:640') + " 640w";
var tree = tree_1.makePictureTree(handle, options);
var expected = {
img: {
src: result(baseURL),
sizes: '100vw',
srcSet: srcSet,
},
};
assert.deepStrictEqual(tree, expected);
});
it('should generate a picture object with a fallback img and 1 source (1 resolution)', function () {
var options = {
sizes: {
'(min-width: 1080px)': '100vw',
fallback: '300px',
},
resolutions: [320, 640],
keys: false,
};
var srcSet = result(baseURL, 'resize=width:320') + " 320w, " + result(baseURL, 'resize=width:640') + " 640w";
var tree = tree_1.makePictureTree(handle, options);
var expected = {
img: {
src: result(baseURL, 'resize=width:300'),
sizes: '300px',
srcSet: srcSet,
},
sources: [
{
media: '(min-width: 1080px)',
sizes: '100vw',
srcSet: srcSet,
},
],
};
assert.deepStrictEqual(tree, expected);
});
it('should generate a single img element using width and pixel densities', function () {
var options = {
width: '768px',
keys: false,
};
var srcSet = result(baseURL, 'resize=width:768') + " 1x, " + result(baseURL, 'resize=width:1536') + " 2x";
var expected = {
img: {
width: 768,
src: result(baseURL, 'resize=width:768'),
srcSet: srcSet,
},
};
var tree = tree_1.makePictureTree(handle, options);
assert.deepStrictEqual(tree, expected);
});
it('should generate a single img element using storage alias handle', function () {
var storageAliasHandle = {
srcHandle: handle,
apiKey: apiKey,
};
var options = {
width: '768px',
keys: false,
transforms: {
quality: {
value: 5,
},
},
};
var expected = {
img: {
src: 'https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:768/seW1thvcR1aQBfOCF8bX',
srcSet: 'https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:768/seW1thvcR1aQBfOCF8bX 1x, https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:1536/seW1thvcR1aQBfOCF8bX 2x',
width: 768,
},
};
var tree = tree_1.makePictureTree(storageAliasHandle, options);
assert.deepStrictEqual(tree, expected);
});
it('should be able to disable a transformation validator', function () {
var storageAliasHandle = {
srcHandle: handle,
apiKey: apiKey,
};
var options = {
width: '768px',
keys: false,
transforms: {
quality: {
value: 5,
},
},
useValidator: false,
};
var expected = {
img: {
src: 'https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:768/seW1thvcR1aQBfOCF8bX',
srcSet: 'https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:768/seW1thvcR1aQBfOCF8bX 1x, https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:1536/seW1thvcR1aQBfOCF8bX 2x',
width: 768,
},
};
var tree = tree_1.makePictureTree(storageAliasHandle, options);
assert.deepStrictEqual(tree, expected);
});
it('should move output task always as the first in the filelink', function () {
var options = {
transforms: {
quality: {
value: 5,
},
output: {
format: 'webp',
},
sepia: {
tone: 70,
},
},
};
var expected = {
img: {
src: 'https://cdn.filestackcontent.com/output=format:webp/quality=value:5/sepia=tone:70/seW1thvcR1aQBfOCF8bX',
},
};
var tree = tree_1.makePictureTree(handle, options);
assert.deepStrictEqual(tree, expected);
});
it('should return filelinks with custom cname', function () {
var options = {
cname: 'fs.test123.com',
width: '768px',
keys: false,
};
var srcSet = result("https://cdn." + options.cname, 'resize=width:768') + " 1x, " + result("https://cdn." + options.cname, 'resize=width:1536') + " 2x";
var expected = {
img: {
width: 768,
src: result("https://cdn." + options.cname, 'resize=width:768'),
srcSet: srcSet,
},
};
var tree = tree_1.makePictureTree(handle, options);
assert.deepStrictEqual(tree, expected);
});
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFFLEtBQUs7U0FDWixDQUFDO1FBQ0YsSUFBTSxNQUFNLEdBQU0sTUFBTSxDQUFDLGlCQUFlLE9BQU8sQ0FBQyxLQUFPLEVBQUUsa0JBQWtCLENBQUMsYUFBUSxNQUFNLENBQUMsaUJBQWUsT0FBTyxDQUFDLEtBQU8sRUFBRSxtQkFBbUIsQ0FBQyxRQUFLLENBQUM7UUFDckosSUFBTSxRQUFRLEdBQUc7WUFDZixHQUFHLEVBQUU7Z0JBQ0gsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsR0FBRyxFQUFFLE1BQU0sQ0FBQyxpQkFBZSxPQUFPLENBQUMsS0FBTyxFQUFFLGtCQUFrQixDQUFDO2dCQUMvRCxNQUFNLFFBQUE7YUFDUDtTQUNGLENBQUM7UUFDRixJQUFNLElBQUksR0FBRyxzQkFBZSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6InRyZWUuc3BlYy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1ha2VQaWN0dXJlVHJlZSB9IGZyb20gJy4vdHJlZSc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuY29uc3QgaGFuZGxlID0gJ3NlVzF0aHZjUjFhUUJmT0NGOGJYJztcbmNvbnN0IGFwaUtleSA9ICdCQmN1OTRFRkwxU1RHWXZrTTZhOHVzeic7XG5jb25zdCBiYXNlVVJMID0gJ2h0dHBzOi8vY2RuLmZpbGVzdGFja2NvbnRlbnQuY29tJztcbmNvbnN0IHJlc3VsdCA9IChiYXNlOiBzdHJpbmcsIG9wdHM/OiBhbnkpID0+IHtcbiAgaWYgKG9wdHMpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0vJHtvcHRzfS8ke2hhbmRsZX1gO1xuICB9XG4gIHJldHVybiBgJHtiYXNlfS8ke2hhbmRsZX1gO1xufTtcblxuZGVzY3JpYmUoJ21ha2VQaWN0dXJlVHJlZScsICgpID0+IHtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIGhhbmRsZSBpcyBub3QgYSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBtYWtlUGljdHVyZVRyZWUoKSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbm90IGxldCBhIHVzZXIgdXNlIHdpZHRoIGRlc2NyaXB0b3JzIHdpdGhvdXQgYXQgbGVhc3Qgb25lIHNpemUgKG51bWJlcnMpJywgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByZXNvbHV0aW9uczogWzMyMCwgNDIwXSxcbiAgICB9O1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbWFrZVBpY3R1cmVUcmVlKGhhbmRsZSwgb3B0aW9ucykpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCBsZXQgYSB1c2VyIHVzZSB3aWR0aCBkZXNjcmlwdG9ycyB3aXRob3V0IGF0IGxlYXN0IG9uZSBzaXplIChzdHJpbmdzKScsICgpID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgcmVzb2x1dGlvbnM6IFsnMzIwdycsICc0MjB3J10sXG4gICAgfTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IG1ha2VQaWN0dXJlVHJlZShoYW5kbGUsIG9wdGlvbnMpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgbGV0IGEgdXNlciBwYXNzIHNpemVzIHdpdGggcGl4ZWwgZGVuc2l0aWVzJywgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBzaXplczoge1xuICAgICAgICAnKG1pbi13aWR0aDogMTA4MHB4KSc6ICcxMDB2dycsXG4gICAgICAgIGZhbGxiYWNrOiAnOTB2dycsXG4gICAgICB9LFxuICAgICAgcmVzb2x1dGlvbnM6IFsnMXgnLCAnMngnXSxcbiAgICB9O1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbWFrZVBpY3R1cmVUcmVlKGhhbmRsZSwgb3B0aW9ucykpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCBsZXQgYSB1c2VyIHNwZWNpZnkgcmVzb2x1dGlvbnMgaWYgbm8gd2lkdGggaXMgc2V0JywgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByZXNvbHV0aW9uczogWycxeCcsICcyeCddLFxuICAgIH07XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBtYWtlUGljdHVyZVRyZWUoaGFuZGxlLCBvcHRpb25zKSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBwaWN0dXJlIG9iamVjdCB3aXRoIG5vIHNvdXJjZXMnLCAoKSA9PiB7XG4gICAgY29uc3Qgb2JqID0gbWFrZVBpY3R1cmVUcmVlKGhhbmRsZSwgeyBrZXlzOiBmYWxzZSB9KTtcbiAgICBjb25zdCB1cmwgPSByZXN1bHQoYmFzZVVSTCk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSB7XG4gICAgICBpbWc6IHtcbiAgICAgICAgc3JjOiB1cmwsXG4gICAgICB9LFxuICAgIH07XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvYmosIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIHBpY3R1cmUgb2JqZWN0IHdpdGggbm8gc291cmNlcyAobm8gcmVzb2x1dGlvbnMpIHdpdGggc2VjdXJpdHknLCAoKSA9PiB7XG4gICAgY29uc3Qgb2JqID0gbWFrZVBpY3R1cmVUcmVlKGhhbmRsZSwge1xuICAgICAgcmVzb2x1dGlvbnM6IFtdLFxuICAgICAgc2VjdXJpdHk6IHtcbiAgICAgICAgcG9saWN5OiAnYWJjJyxcbiAgICAgICAgc2lnbmF0dXJlOiAneHl6JyxcbiAgICAgIH0sXG4gICAgICBrZXlzOiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCB1cmwgPSByZXN1bHQoYmFzZVVSTCwgYHNlY3VyaXR5PXBvbGljeTphYmMsc2lnbmF0dXJlOnh5emApO1xuICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgaW1nOiB7XG4gICAgICAgIHNyYzogdXJsLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob2JqLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBwaWN0dXJlIG9iamVjdCB3aXRoIDEgc291cmNlJywgKCkgPT4ge1xuICAgIGNvbnN0IHRlc3RTaXplMSA9IHsgJyhtaW4td2lkdGg6IDY0MHB4KSc6ICc1MHZ3JyB9O1xuICAgIGNvbnN0IHJlc29sdXRpb25zID0gWzMyMCwgNjQwXTtcbiAgICBjb25zdCBvYmogPSBtYWtlUGljdHVyZVRyZWUoaGFuZGxlLCB7IHNpemVzOiB0ZXN0U2l6ZTEsIHJlc29sdXRpb25zLCBrZXlzOiBmYWxzZSB9KTtcbiAgICBjb25zdCBzcmNTZXQgPSBgJHtyZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDozMjAnKX0gMzIwdywgJHtyZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDo2NDAnKX0gNjQwd2A7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSB7XG4gICAgICBzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBtZWRpYTogJyhtaW4td2lkdGg6IDY0MHB4KScsXG4gICAgICAgICAgc2l6ZXM6ICc1MHZ3JyxcbiAgICAgICAgICBzcmNTZXQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgaW1nOiB7XG4gICAgICAgIHNyYzogcmVzdWx0KGJhc2VVUkwpLFxuICAgICAgICBzcmNTZXQsXG4gICAgICB9LFxuICAgIH07XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvYmosIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIHBpY3R1cmUgb2JqZWN0IHdpdGggMSBzb3VyY2UgYW5kIGltZyBmYWxsYmFjayBzaXplJywgKCkgPT4ge1xuICAgIGNvbnN0IHRlc3RTaXplMSA9IHtcbiAgICAgICcobWluLXdpZHRoOiA2NDBweCknOiAnNTB2dycsXG4gICAgICBmYWxsYmFjazogJzMwMHB4JyxcbiAgICB9O1xuICAgIGNvbnN0IHJlc29sdXRpb25zID0gWzMyMCwgNjQwXTtcbiAgICBjb25zdCBvYmogPSBtYWtlUGljdHVyZVRyZWUoaGFuZGxlLCB7IHNpemVzOiB0ZXN0U2l6ZTEsIHJlc29sdXRpb25zLCBrZXlzOiBmYWxzZSB9KTtcbiAgICBjb25zdCBzcmNTZXQgPSBgJHtyZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDozMjAnKX0gMzIwdywgJHtyZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDo2NDAnKX0gNjQwd2A7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSB7XG4gICAgICBzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBtZWRpYTogJyhtaW4td2lkdGg6IDY0MHB4KScsXG4gICAgICAgICAgc2l6ZXM6ICc1MHZ3JyxcbiAgICAgICAgICBzcmNTZXQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgaW1nOiB7XG4gICAgICAgIHNpemVzOiAnMzAwcHgnLFxuICAgICAgICBzcmM6IHJlc3VsdChiYXNlVVJMLCAncmVzaXplPXdpZHRoOjMwMCcpLFxuICAgICAgICBzcmNTZXQsXG4gICAgICB9LFxuICAgIH07XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvYmosIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIHBpY3R1cmUgb2JqZWN0IHdpdGggMSBzb3VyY2Ugd2l0aCBzZWN1cml0eScsICgpID0+IHtcbiAgICBjb25zdCB0ZXN0U2l6ZTEgPSB7ICcobWluLXdpZHRoOiA2NDBweCknOiAnNTB2dycgfTtcbiAgICBjb25zdCByZXNvbHV0aW9ucyA9IFszMjAsIDY0MF07XG4gICAgY29uc3Qgb2JqID0gbWFrZVBpY3R1cmVUcmVlKGhhbmRsZSwge1xuICAgICAgc2l6ZXM6IHRlc3RTaXplMSxcbiAgICAgIHJlc29sdXRpb25zLFxuICAgICAgc2VjdXJpdHk6IHtcbiAgICAgICAgcG9saWN5OiAnYWJjJyxcbiAgICAgICAgc2lnbmF0dXJlOiAneHl6JyxcbiAgICAgIH0sXG4gICAgICBrZXlzOiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCBzcmNTZXQgPSBgJHtyZXN1bHQoYmFzZVVSTCwgJ3NlY3VyaXR5PXBvbGljeTphYmMsc2lnbmF0dXJlOnh5ei9yZXNpemU9d2lkdGg6MzIwJyl9IDMyMHcsICR7cmVzdWx0KGJhc2VVUkwsICdzZWN1cml0eT1wb2xpY3k6YWJjLHNpZ25hdHVyZTp4eXovcmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YDtcbiAgICBjb25zdCBleHBlY3RlZCA9IHtcbiAgICAgIHNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG1lZGlhOiAnKG1pbi13aWR0aDogNjQwcHgpJyxcbiAgICAgICAgICBzaXplczogJzUwdncnLFxuICAgICAgICAgIHNyY1NldCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBpbWc6IHtcbiAgICAgICAgc3JjOiByZXN1bHQoYmFzZVVSTCwgJ3NlY3VyaXR5PXBvbGljeTphYmMsc2lnbmF0dXJlOnh5eicpLFxuICAgICAgICBzcmNTZXQsXG4gICAgICB9LFxuICAgIH07XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvYmosIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIHBpY3R1cmUgb2JqZWN0IHdpdGggMSBzb3VyY2UgYW5kIDEgZm9ybWF0JywgKCkgPT4ge1xuICAgIGNvbnN0IHRlc3RTaXplMSA9IHsgJyhtaW4td2lkdGg6IDY0MHB4KSc6ICc1MHZ3JyB9O1xuICAgIGNvbnN0IHJlc29sdXRpb25zID0gWzMyMCwgNjQwXTtcbiAgICBjb25zdCBvYmogPSBtYWtlUGljdHVyZVRyZWUoaGFuZGxlLCB7XG4gICAgICBzaXplczogdGVzdFNpemUxLFxuICAgICAgcmVzb2x1dGlvbnMsXG4gICAgICBmb3JtYXRzOiBbJ3dlYnAnXSxcbiAgICAgIGtleXM6IGZhbHNlLFxuICAgIH0pO1xuICAgIGNvbnN0IGltZ1NyY3NldCA9IGAke3Jlc3VsdChiYXNlVVJMLCAncmVzaXplPXdpZHRoOjMyMCcpfSAzMjB3LCAke3Jlc3VsdChiYXNlVVJMLCAncmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YDtcbiAgICBjb25zdCB1cmwgPSBgJHtyZXN1bHQoYmFzZVVSTCwgJ291dHB1dD1mb3JtYXQ6d2VicC9yZXNpemU9d2lkdGg6MzIwJyl9IDMyMHcsICR7cmVzdWx0KGJhc2VVUkwsICdvdXRwdXQ9Zm9ybWF0OndlYnAvcmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YDtcbiAgICBjb25zdCBleHBlY3RlZCA9IHtcbiAgICAgIHNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG1lZGlhOiAnKG1pbi13aWR0aDogNjQwcHgpJyxcbiAgICAgICAgICBzaXplczogJzUwdncnLFxuICAgICAgICAgIHNyY1NldDogdXJsLFxuICAgICAgICAgIHR5cGU6ICdpbWFnZS93ZWJwJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBpbWc6IHtcbiAgICAgICAgc3JjOiByZXN1bHQoYmFzZVVSTCksXG4gICAgICAgIHNyY1NldDogaW1nU3Jjc2V0LFxuICAgICAgfSxcbiAgICB9O1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob2JqLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBwaWN0dXJlIG9iamVjdCB3aXRoIDEgZm9ybWF0JywgKCkgPT4ge1xuICAgIGNvbnN0IG9iaiA9IG1ha2VQaWN0dXJlVHJlZShoYW5kbGUsIHsgZm9ybWF0czogWyd3ZWJwJ10sIGtleXM6IGZhbHNlIH0pO1xuICAgIGNvbnN0IHVybCA9IHJlc3VsdChiYXNlVVJMLCAnb3V0cHV0PWZvcm1hdDp3ZWJwJyk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSB7XG4gICAgICBzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzcmNTZXQ6IHVybCxcbiAgICAgICAgICB0eXBlOiAnaW1hZ2Uvd2VicCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgaW1nOiB7XG4gICAgICAgIHNyYzogcmVzdWx0KGJhc2VVUkwpLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob2JqLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBwaWN0dXJlIG9iamVjdCB3aXRoIDIgZm9ybWF0cyBhbmQgMSBzaXplIHdpdGggZmFsbGJhY2sgc2l6ZScsICgpID0+IHtcbiAgICBjb25zdCBvYmogPSBtYWtlUGljdHVyZVRyZWUoaGFuZGxlLCB7XG4gICAgICBmb3JtYXRzOiBbJ3dlYnAnLCAnanBnJ10sXG4gICAgICByZXNvbHV0aW9uczogWzY0MF0sXG4gICAgICBzaXplczoge1xuICAgICAgICAnKG1pbi13aWR0aDogNjQwcHgpJzogJzkwdncnLFxuICAgICAgICBmYWxsYmFjazogJzgwdncnLFxuICAgICAgfSxcbiAgICAgIGtleXM6IGZhbHNlLFxuICAgIH0pO1xuICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbWVkaWE6ICcobWluLXdpZHRoOiA2NDBweCknLFxuICAgICAgICAgIHNpemVzOiAnOTB2dycsXG4gICAgICAgICAgc3JjU2V0OiBgJHtyZXN1bHQoYmFzZVVSTCwgJ291dHB1dD1mb3JtYXQ6d2VicC9yZXNpemU9d2lkdGg6NjQwJyl9IDY0MHdgLFxuICAgICAgICAgIHR5cGU6ICdpbWFnZS93ZWJwJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1lZGlhOiAnKG1pbi13aWR0aDogNjQwcHgpJyxcbiAgICAgICAgICBzaXplczogJzkwdncnLFxuICAgICAgICAgIHNyY1NldDogYCR7cmVzdWx0KGJhc2VVUkwsICdvdXRwdXQ9Zm9ybWF0OmpwZy9yZXNpemU9d2lkdGg6NjQwJyl9IDY0MHdgLFxuICAgICAgICAgIHR5cGU6ICdpbWFnZS9qcGcnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2l6ZXM6ICc4MHZ3JyxcbiAgICAgICAgICBzcmNTZXQ6IGAke3Jlc3VsdChiYXNlVVJMLCAnb3V0cHV0PWZvcm1hdDp3ZWJwL3Jlc2l6ZT13aWR0aDo2NDAnKX0gNjQwd2AsXG4gICAgICAgICAgdHlwZTogJ2ltYWdlL3dlYnAnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2l6ZXM6ICc4MHZ3JyxcbiAgICAgICAgICBzcmNTZXQ6IGAke3Jlc3VsdChiYXNlVVJMLCAnb3V0cHV0PWZvcm1hdDpqcGcvcmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YCxcbiAgICAgICAgICB0eXBlOiAnaW1hZ2UvanBnJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBpbWc6IHtcbiAgICAgICAgc2l6ZXM6ICc4MHZ3JyxcbiAgICAgICAgc3JjOiByZXN1bHQoYmFzZVVSTCksXG4gICAgICAgIHNyY1NldDogYCR7cmVzdWx0KGJhc2VVUkwsICdyZXNpemU9d2lkdGg6NjQwJyl9IDY0MHdgLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob2JqLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBwaWN0dXJlIG9iamVjdCB3aXRoIDEgZm9ybWF0IHdpdGggZmFsbGJhY2sgc2l6ZScsICgpID0+IHtcbiAgICBjb25zdCBvYmogPSBtYWtlUGljdHVyZVRyZWUoaGFuZGxlLCB7XG4gICAgICBmb3JtYXRzOiBbJ3dlYnAnXSxcbiAgICAgIHJlc29sdXRpb25zOiBbNjQwXSxcbiAgICAgIHNpemVzOiB7XG4gICAgICAgIGZhbGxiYWNrOiAnNzAwcHgnLFxuICAgICAgfSxcbiAgICAgIGtleXM6IGZhbHNlLFxuICAgIH0pO1xuICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgc2l6ZXM6ICc3MDBweCcsXG4gICAgICAgICAgc3JjU2V0OiBgJHtyZXN1bHQoYmFzZVVSTCwgJ291dHB1dD1mb3JtYXQ6d2VicC9yZXNpemU9d2lkdGg6NjQwJyl9IDY0MHdgLFxuICAgICAgICAgIHR5cGU6ICdpbWFnZS93ZWJwJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBpbWc6IHtcbiAgICAgICAgc2l6ZXM6ICc3MDBweCcsXG4gICAgICAgIHNyYzogcmVzdWx0KGJhc2VVUkwsICdyZXNpemU9d2lkdGg6NzAwJyksXG4gICAgICAgIHNyY1NldDogYCR7cmVzdWx0KGJhc2VVUkwsICdyZXNpemU9d2lkdGg6NjQwJyl9IDY0MHdgLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob2JqLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBwaWN0dXJlIG9iamVjdCB3aXRoIDIgc291cmNlcyBhbmQgMiBmb3JtYXRzIGluIG9yZGVyJywgKCkgPT4ge1xuICAgIGNvbnN0IHRlc3RTaXplMSA9IHtcbiAgICAgICcobWluLXdpZHRoOiA2NDBweCknOiAnNTB2dycsXG4gICAgICAnKG1pbi13aWR0aDogMzQwcHgpJzogJzMzdncnLFxuICAgIH07XG4gICAgY29uc3QgcmVzb2x1dGlvbnMgPSBbJzMyMHcnLCAnNjQwdyddO1xuICAgIGNvbnN0IG9iaiA9IG1ha2VQaWN0dXJlVHJlZShoYW5kbGUsIHtcbiAgICAgIHNpemVzOiB0ZXN0U2l6ZTEsXG4gICAgICBmb3JtYXRzOiBbJ2pwZycsICd3ZWJwJ10sXG4gICAgICByZXNvbHV0aW9ucyxcbiAgICAgIGtleXM6IGZhbHNlLFxuICAgIH0pO1xuICAgIGNvbnN0IGltZ1NyY3NldCA9IGAke3Jlc3VsdChiYXNlVVJMLCAncmVzaXplPXdpZHRoOjMyMCcpfSAzMjB3LCAke3Jlc3VsdChiYXNlVVJMLCAncmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YDtcbiAgICBjb25zdCBzcmNTZXQxID0gYCR7cmVzdWx0KGJhc2VVUkwsICdvdXRwdXQ9Zm9ybWF0OmpwZy9yZXNpemU9d2lkdGg6MzIwJyl9IDMyMHcsICR7cmVzdWx0KGJhc2VVUkwsICdvdXRwdXQ9Zm9ybWF0OmpwZy9yZXNpemU9d2lkdGg6NjQwJyl9IDY0MHdgO1xuICAgIGNvbnN0IHNyY1NldDIgPSBgJHtyZXN1bHQoYmFzZVVSTCwgJ291dHB1dD1mb3JtYXQ6d2VicC9yZXNpemU9d2lkdGg6MzIwJyl9IDMyMHcsICR7cmVzdWx0KGJhc2VVUkwsICdvdXRwdXQ9Zm9ybWF0OndlYnAvcmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YDtcbiAgICBjb25zdCBzcmNTZXQzID0gYCR7cmVzdWx0KGJhc2VVUkwsICdvdXRwdXQ9Zm9ybWF0OmpwZy9yZXNpemU9d2lkdGg6MzIwJyl9IDMyMHcsICR7cmVzdWx0KGJhc2VVUkwsICdvdXRwdXQ9Zm9ybWF0OmpwZy9yZXNpemU9d2lkdGg6NjQwJyl9IDY0MHdgO1xuICAgIGNvbnN0IHNyY1NldDQgPSBgJHtyZXN1bHQoYmFzZVVSTCwgJ291dHB1dD1mb3JtYXQ6d2VicC9yZXNpemU9d2lkdGg6MzIwJyl9IDMyMHcsICR7cmVzdWx0KGJhc2VVUkwsICdvdXRwdXQ9Zm9ybWF0OndlYnAvcmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YDtcbiAgICBjb25zdCBleHBlY3RlZCA9IHtcbiAgICAgIHNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG1lZGlhOiAnKG1pbi13aWR0aDogNjQwcHgpJyxcbiAgICAgICAgICBzaXplczogJzUwdncnLFxuICAgICAgICAgIHNyY1NldDogc3JjU2V0MyxcbiAgICAgICAgICB0eXBlOiAnaW1hZ2UvanBnJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1lZGlhOiAnKG1pbi13aWR0aDogNjQwcHgpJyxcbiAgICAgICAgICBzaXplczogJzUwdncnLFxuICAgICAgICAgIHNyY1NldDogc3JjU2V0NCxcbiAgICAgICAgICB0eXBlOiAnaW1hZ2Uvd2VicCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBtZWRpYTogJyhtaW4td2lkdGg6IDM0MHB4KScsXG4gICAgICAgICAgc2l6ZXM6ICczM3Z3JyxcbiAgICAgICAgICBzcmNTZXQ6IHNyY1NldDEsXG4gICAgICAgICAgdHlwZTogJ2ltYWdlL2pwZycsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBtZWRpYTogJyhtaW4td2lkdGg6IDM0MHB4KScsXG4gICAgICAgICAgc2l6ZXM6ICczM3Z3JyxcbiAgICAgICAgICBzcmNTZXQ6IHNyY1NldDIsXG4gICAgICAgICAgdHlwZTogJ2ltYWdlL3dlYnAnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGltZzoge1xuICAgICAgICBzcmM6IHJlc3VsdChiYXNlVVJMKSxcbiAgICAgICAgc3JjU2V0OiBpbWdTcmNzZXQsXG4gICAgICB9LFxuICAgIH07XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChvYmosIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIHBpY3R1cmUgb2JqZWN0IHdpdGggYSBmYWxsYmFjayBzaXplIChubyByZXNvbHV0aW9ucyknLCAoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHNpemVzOiB7XG4gICAgICAgIGZhbGxiYWNrOiAnMTAwdncnLFxuICAgICAgfSxcbiAgICAgIHJlc29sdXRpb25zOiBbXSxcbiAgICAgIGtleXM6IGZhbHNlLFxuICAgIH07XG4gICAgY29uc3QgdHJlZSA9IG1ha2VQaWN0dXJlVHJlZShoYW5kbGUsIG9wdGlvbnMpO1xuICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgaW1nOiB7XG4gICAgICAgIHNyYzogcmVzdWx0KGJhc2VVUkwpLFxuICAgICAgICBzaXplczogJzEwMHZ3JyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHRyZWUsIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIHBpY3R1cmUgb2JqZWN0IHdpdGggYSBmYWxsYmFjayBzaXplIChyZXNvbHV0aW9ucyknLCAoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHNpemVzOiB7XG4gICAgICAgIGZhbGxiYWNrOiAnMTAwdncnLFxuICAgICAgfSxcbiAgICAgIHJlc29sdXRpb25zOiBbMzIwLCA2NDBdLFxuICAgICAga2V5czogZmFsc2UsXG4gICAgfTtcbiAgICBjb25zdCBzcmNTZXQgPSBgJHtyZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDozMjAnKX0gMzIwdywgJHtyZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDo2NDAnKX0gNjQwd2A7XG4gICAgY29uc3QgdHJlZSA9IG1ha2VQaWN0dXJlVHJlZShoYW5kbGUsIG9wdGlvbnMpO1xuICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgaW1nOiB7XG4gICAgICAgIHNyYzogcmVzdWx0KGJhc2VVUkwpLFxuICAgICAgICBzaXplczogJzEwMHZ3JyxcbiAgICAgICAgc3JjU2V0LFxuICAgICAgfSxcbiAgICB9O1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodHJlZSwgZXhwZWN0ZWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgcGljdHVyZSBvYmplY3Qgd2l0aCBhIGZhbGxiYWNrIGltZyBhbmQgMSBzb3VyY2UgKDEgcmVzb2x1dGlvbiknLCAoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHNpemVzOiB7XG4gICAgICAgICcobWluLXdpZHRoOiAxMDgwcHgpJzogJzEwMHZ3JyxcbiAgICAgICAgZmFsbGJhY2s6ICczMDBweCcsXG4gICAgICB9LFxuICAgICAgcmVzb2x1dGlvbnM6IFszMjAsIDY0MF0sXG4gICAgICBrZXlzOiBmYWxzZSxcbiAgICB9O1xuICAgIGNvbnN0IHNyY1NldCA9IGAke3Jlc3VsdChiYXNlVVJMLCAncmVzaXplPXdpZHRoOjMyMCcpfSAzMjB3LCAke3Jlc3VsdChiYXNlVVJMLCAncmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YDtcbiAgICBjb25zdCB0cmVlID0gbWFrZVBpY3R1cmVUcmVlKGhhbmRsZSwgb3B0aW9ucyk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSB7XG4gICAgICBpbWc6IHtcbiAgICAgICAgc3JjOiByZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDozMDAnKSxcbiAgICAgICAgc2l6ZXM6ICczMDBweCcsXG4gICAgICAgIHNyY1NldCxcbiAgICAgIH0sXG4gICAgICBzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBtZWRpYTogJyhtaW4td2lkdGg6IDEwODBweCknLFxuICAgICAgICAgIHNpemVzOiAnMTAwdncnLFxuICAgICAgICAgIHNyY1NldCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHRyZWUsIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIHNpbmdsZSBpbWcgZWxlbWVudCB1c2luZyB3aWR0aCBhbmQgcGl4ZWwgZGVuc2l0aWVzJywgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICB3aWR0aDogJzc2OHB4JyxcbiAgICAgIGtleXM6IGZhbHNlLFxuICAgIH07XG4gICAgY29uc3Qgc3JjU2V0ID0gYCR7cmVzdWx0KGJhc2VVUkwsICdyZXNpemU9d2lkdGg6NzY4Jyl9IDF4LCAke3Jlc3VsdChiYXNlVVJMLCAncmVzaXplPXdpZHRoOjE1MzYnKX0gMnhgO1xuI