UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

604 lines 54.5 kB
"use strict";
/*
 * Copyright (c) 2018 by Filestack.
 * Some rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var assert = tslib_1.__importStar(require("assert"));
var _1 = require("./");
describe('Transforms Schema', function () {
    var validator = (0, _1.getValidator)(_1.TransformSchema);
    var validate = function (params) {
        var res = validator(params);
        return res.errors.length === 0 ? true : false;
    };
    var assertFail = function (res) { return assert.ok(!res); };
    it('should load json schema', function () {
        // console.log(schema);
    });
    describe('Watermark', function () {
        it('should validate correct params', function () {
            assert.ok(validate({
                watermark: {
                    file: 'testfilehandle',
                    size: 300,
                    position: 'top',
                },
            }));
        });
        it('should validate correct params (position array)', function () {
            assert.ok(validate({
                watermark: {
                    file: 'testfilehandle',
                    size: 300,
                    position: ['top', 'left'],
                },
            }));
        });
        it('should fail on wrong position params [top, bottom]', function () {
            assertFail(validate({
                watermark: {
                    file: 'testfilehandle',
                    size: 300,
                    position: ['top', 'bottom'],
                },
            }));
        });
    });
    describe('Partial Blur', function () {
        it('should validate correct params', function () {
            assert.ok(validate({
                partial_blur: {
                    objects: [
                        [1, 1, 2, 2],
                        [1, 1, 32, 15],
                    ],
                    amount: 18.2,
                    blur: 12,
                    type: 'rect',
                },
            }));
        });
        it('should fail on wrong params (amount, blur, type)', function () {
            assertFail(validate({
                partial_blur: {
                    objects: [
                        [1, 1, 2, 2],
                        [1, 1, 32, 15],
                    ],
                    amount: -10,
                    blur: 300,
                    type: 'wrong_type',
                },
            }));
        });
        it('should fail on wrong params (objects)', function () {
            assertFail(validate({
                partial_blur: {
                    objects: [
                        [1, 1, 2],
                        [1, 1, 32, 15, 32],
                    ],
                    amount: 10,
                    blur: 20,
                },
            }));
        });
    });
    describe('Partial Pixelate', function () {
        it('should validate correct params', function () {
            assert.ok(validate({
                partial_pixelate: {
                    objects: [
                        [1, 1, 2, 2],
                        [1, 1, 32, 15],
                    ],
                    amount: 100,
                    blur: 12.2,
                    type: 'oval',
                },
            }));
        });
        it('should fail on wrong params (amount, blur, type)', function () {
            assertFail(validate({
                partial_pixelate: {
                    objects: [
                        [1, 1, 2, 2],
                        [1, 1, 32, 15],
                    ],
                    amount: -10,
                    blur: 300,
                    type: 'wrong_type',
                },
            }));
        });
        it('should fail on wrong params (objects)', function () {
            assertFail(validate({
                partial_pixelate: {
                    objects: [
                        [1, 1, 2],
                        [1, 1, 32, 15, 32],
                    ],
                    amount: 10,
                    blur: 20,
                },
            }));
        });
    });
    describe('Crop', function () {
        it('should validate correct params', function () {
            assert.ok(validate({
                crop: {
                    dim: [1, 1, 2, 2],
                },
            }));
        });
        it('should fail on empty dim params', function () {
            assertFail(validate({
                crop: {
                    dim: [],
                },
            }));
        });
        it('should fail on wrong params (minimum value for 2 first items)', function () {
            assertFail(validate({
                crop: {
                    dim: [2, 1, 0, 2],
                },
            }));
        });
        it('should fail on wrong params (5 items in array)', function () {
            assertFail(validate({
                crop: {
                    dim: [1, 1, 2, 2, 4],
                },
            }));
        });
    });
    describe('Resize', function () {
        it('should validate correct params', function () {
            assert.ok(validate({
                resize: {
                    width: 10,
                    height: 20,
                    fit: 'crop',
                    align: ['top', 'left'],
                },
            }));
        });
        it('should validate correct when only one width or height is provided', function () {
            assert.ok(validate({
                resize: {
                    width: 10,
                    fit: 'crop',
                    align: 'left',
                },
            }));
            assert.ok(validate({
                resize: {
                    height: 10,
                    fit: 'crop',
                    align: 'left',
                },
            }));
        });
        it('should fail on wrong params (missing width and height)', function () {
            assertFail(validate({
                resize: {
                    fit: 'crop',
                    align: 'left',
                },
            }));
        });
    });
    describe('Resize', function () {
        it('should validate correct params', function () {
            assert.ok(validate({
                rotate: {
                    deg: 'exif',
                    exif: false,
                    background: 'fff',
                },
            }));
        });
        it('should validate correct params', function () {
            assert.ok(validate({
                rotate: {
                    deg: 200,
                    exif: true,
                    background: 'ffffff',
                },
            }));
        });
        it('should fail on wrong params (wrong exif rotation)', function () {
            assertFail(validate({
                rotate: {
                    deg: 123,
                    exif: 'true',
                    background: 'ffffff',
                },
            }));
        });
    });
    describe('Pdfinfo', function () {
        it('should validate correct params with bool value', function () {
            assert.ok(validate({
                pdfinfo: true,
            }));
        });
        it('should validate correct params with color info', function () {
            assert.ok(validate({
                pdfinfo: {
                    colorinfo: true,
                },
            }));
        });
    });
    describe('Pdfconvert', function () {
        describe('Pages', function () {
            [[1, 2], ['1-', 3], ['-2']].forEach(function (val) {
                it("should validate on correct page \"".concat(val, "\""), function () {
                    assert.ok(validate({
                        pdfconvert: {
                            pages: val,
                        },
                    }));
                });
            });
            it('should return error on fail page "1a"', function () {
                assertFail(validate({
                    pdfconvert: {
                        pages: '1a',
                    },
                }));
            });
        });
        describe('Page orientation', function () {
            it('should pass on correct orientation "landscape"', function () {
                assert.ok(validate({
                    pdfconvert: {
                        pageorientation: 'landscape',
                    },
                }));
            });
            it('should pass on correct orientation "portrait"', function () {
                assert.ok(validate({
                    pdfconvert: {
                        pageorientation: 'portrait',
                    },
                }));
            });
            it('should fail on wrong orientation "landscape1"', function () {
                assertFail(validate({
                    pdfconvert: {
                        pageorientation: 'landscape1',
                    },
                }));
            });
        });
        describe('Page format', function () {
            ['a2', 'a3', 'a4', 'a5', 'b4', 'b5', 'letter', 'legal', 'tabloid'].forEach(function (val) {
                it("should when correct page format is provided ".concat(val), function () {
                    assert.ok(validate({
                        pdfconvert: {
                            pages: [1, 2],
                            pageformat: val,
                        },
                    }));
                });
            });
            it('should fail on wrong page format ie a22', function () {
                assertFail(validate({
                    pdfconvert: {
                        pageformat: 'a22',
                    },
                }));
            });
        });
    });
});
// import * as assert from 'assert';
// import { getValidator, TransformSchema } from './';
// describe('Transforms Schema', () => {
//   const validate = getValidator(TransformSchema);
//   const assertFail = (val) => assert.ok(!val);
//   it('should load json schema', () => {
//     // console.log(schema);
//   });
//   describe('Watermark', () => {
//     it('should validate correct params', () => {
//       assert.ok(validate({
//         watermark: {
//           file: 'testfilehandle',
//           size: 300,
//           position: 'top',
//         },
//       }));
//     });
//     it('should validate correct params (position array)', () => {
//       assert.ok(validate({
//         watermark: {
//           file: 'testfilehandle',
//           size: 300,
//           position: ['top', 'left'],
//         },
//       }));
//     });
//     it('should fail on wrong position params [top, bottom]', () => {
//       assertFail(validate({
//         watermark: {
//           file: 'testfilehandle',
//           size: 300,
//           position: ['top', 'bottom'],
//         },
//       }));
//     });
//   });
//   describe('Partial Blur', () => {
//     it('should validate correct params', () => {
//       assert.ok(validate({
//         partial_blur: {
//           objects: [
//             [1, 1, 2, 2],
//             [1, 1, 32, 15],
//           ],
//           amount: 18.2,
//           blur: 12,
//           type: 'rect',
//         },
//       }));
//     });
//     it('should fail on wrong params (amount, blur, type)', () => {
//       assertFail(validate({
//         partial_blur: {
//           objects: [
//             [1, 1, 2, 2],
//             [1, 1, 32, 15],
//           ],
//           amount: -10,
//           blur: 300,
//           type: 'wrong_type',
//         },
//       }));
//     });
//     it('should fail on wrong params (objects)', () => {
//       assertFail(validate({
//         partial_blur: {
//           objects: [
//             [1, 1, 2],
//             [1, 1, 32, 15, 32],
//           ],
//           amount: 10,
//           blur: 20,
//         },
//       }));
//     });
//   });
//   describe('Partial Pixelate', () => {
//     it('should validate correct params', () => {
//       assert.ok(validate({
//         partial_pixelate: {
//           objects: [
//             [1, 1, 2, 2],
//             [1, 1, 32, 15],
//           ],
//           amount: 100,
//           blur: 12.2,
//           type: 'oval',
//         },
//       }));
//     });
//     it('should fail on wrong params (amount, blur, type)', () => {
//       assertFail(validate({
//         partial_pixelate: {
//           objects: [
//             [1, 1, 2, 2],
//             [1, 1, 32, 15],
//           ],
//           amount: -10,
//           blur: 300,
//           type: 'wrong_type',
//         },
//       }));
//     });
//     it('should fail on wrong params (objects)', () => {
//       assertFail(validate({
//         partial_pixelate: {
//           objects: [
//             [1, 1, 2],
//             [1, 1, 32, 15, 32],
//           ],
//           amount: 10,
//           blur: 20,
//         },
//       }));
//     });
//   });
//   describe('Crop', () => {
//     it('should validate correct params', () => {
//       assert.ok(validate({
//         crop: {
//           dim: [1, 1, 2, 2],
//         },
//       }));
//     });
//     it('should fail on empty dim params', () => {
//       assertFail(validate({
//         crop: {
//           dim: [],
//         },
//       }));
//     });
//     it('should fail on wrong params (minimum value for 2 first items)', () => {
//       assertFail(validate({
//         crop: {
//           dim: [2, 1, 0, 2],
//         },
//       }));
//     });
//     it('should fail on wrong params (5 items in array)', () => {
//       assertFail(validate({
//         crop: {
//           dim: [1, 1, 2, 2, 4],
//         },
//       }));
//     });
//   });
//   describe('Resize', () => {
//     it('should validate correct params', () => {
//       assert.ok(validate({
//         resize: {
//           width: 10,
//           height: 20,
//           fit: 'crop',
//           align: ['top', 'left'],
//         },
//       }));
//     });
//     it('should validate correct when only one width or height is provided', () => {
//       assert.ok(validate({
//         resize: {
//           width: 10,
//           fit: 'crop',
//           align: 'left',
//         },
//       }));
//       assert.ok(validate({
//         resize: {
//           height: 10,
//           fit: 'crop',
//           align: 'left',
//         },
//       }));
//     });
//     it('should fail on wrong params (missing width and height)', () => {
//       assertFail(validate({
//         resize: {
//           fit: 'crop',
//           align: 'left',
//         },
//       }));
//     });
//   });
//   describe('Resize', () => {
//     it('should validate correct params', () => {
//       assert.ok(validate({
//         rotate: {
//           deg: 'exif',
//           exif: false,
//           background: 'fff',
//         },
//       }));
//     });
//     it('should validate correct params', () => {
//       assert.ok(validate({
//         rotate: {
//           deg: 200,
//           exif: true,
//           background: 'ffffff',
//         },
//       }));
//     });
//     it('should fail on wrong params (wrong exif rotation)', () => {
//       assertFail(validate({
//         rotate: {
//           deg: 123,
//           exif: 'true',
//           background: 'ffffff',
//         },
//       }));
//     });
//   });
//   describe('Pdfinfo', () => {
//     it('should validate correct params with bool value', () => {
//       assert.ok(validate({
//         pdfinfo: true,
//       }));
//     });
//     it('should validate correct params with color info', () => {
//       assert.ok(validate({
//         pdfinfo: {
//           colorinfo: true,
//         },
//       }));
//     });
//   });
//   describe('Pdfconvert', () => {
//     describe('Pages', () => {
//       [[1,2], ['1-', 3], ['-2']].forEach((val) => {
//         it(`should validate on correct page "${val}"`, () => {
//           assert.ok(validate({
//             pdfconvert: {
//               pages: val,
//             },
//           }));
//         });
//       });
//       it('should return error on fail page "1a"', () => {
//         assertFail(validate({
//           pdfconvert: {
//             pages: '1a',
//           },
//         }));
//       });
//     });
//     describe('Page orientation', () => {
//       it('should pass on correct orientation "landscape"', () => {
//         assert.ok(validate({
//           pdfconvert: {
//             pageorientation: 'landscape',
//           },
//         }));
//       });
//       it('should pass on correct orientation "portrait"', () => {
//         assert.ok(validate({
//           pdfconvert: {
//             pageorientation: 'portrait',
//           },
//         }));
//       });
//       it('should fail on wrong orientation "landscape1"', () => {
//         assertFail(validate({
//           pdfconvert: {
//             pageorientation: 'landscape1',
//           },
//         }));
//       });
//     });
//     describe('Page format', () => {
//       ['a2', 'a3', 'a4', 'a5', 'b4', 'b5', 'letter', 'legal', 'tabloid'].forEach((val) => {
//         it(`should when correct page format is provided ${val}`, () => {
//           assert.ok(validate({
//             pdfconvert: {
//               pages: [1,2],
//               pageformat: val,
//             },
//           }));
//         });
//       });
//       it('should fail on wrong page format ie a22', () => {
//         assertFail(validate({
//           pdfconvert: {
//             pageformat: 'a22',
//           },
//         }));
//       });
//     });
//   });
// });

//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWEvdHJhbnNmb3Jtcy5zY2hlbWEuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFFSCxxREFBaUM7QUFDakMsdUJBQW1EO0FBRW5ELFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUU1QixJQUFNLFNBQVMsR0FBRyxJQUFBLGVBQVksRUFBQyxrQkFBZSxDQUFDLENBQUM7SUFFaEQsSUFBTSxRQUFRLEdBQUcsVUFBQyxNQUFNO1FBQ3RCLElBQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDaEQsQ0FBQyxDQUFDO0lBRUYsSUFBTSxVQUFVLEdBQUcsVUFBQyxHQUFHLElBQUssT0FBQSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQWYsQ0FBZSxDQUFDO0lBRTVDLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRTtRQUM1Qix1QkFBdUI7SUFDekIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsV0FBVyxFQUFFO1FBQ3BCLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRTtZQUNuQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDakIsU0FBUyxFQUFFO29CQUNULElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLElBQUksRUFBRSxHQUFHO29CQUNULFFBQVEsRUFBRSxLQUFLO2lCQUNoQjthQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUU7WUFDcEQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQ2pCLFNBQVMsRUFBRTtvQkFDVCxJQUFJLEVBQUUsZ0JBQWdCO29CQUN0QixJQUFJLEVBQUUs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NEJBQTRCO0FBQzVCLDRCQUE0QjtBQUM1QixpQkFBaUI7QUFDakIsaUJBQWlCO0FBQ2pCLGNBQWM7QUFDZCxZQUFZO0FBRVosNERBQTREO0FBQzVELGdDQUFnQztBQUNoQywwQkFBMEI7QUFDMUIsMkJBQTJCO0FBQzNCLGVBQWU7QUFDZixlQUFlO0FBQ2YsWUFBWTtBQUVaLFVBQVU7QUFFViwyQ0FBMkM7QUFDM0MscUVBQXFFO0FBQ3JFLCtCQUErQjtBQUMvQiwwQkFBMEI7QUFDMUIsNENBQTRDO0FBQzVDLGVBQWU7QUFDZixlQUFlO0FBQ2YsWUFBWTtBQUVaLG9FQUFvRTtBQUNwRSwrQkFBK0I7QUFDL0IsMEJBQTBCO0FBQzFCLDJDQUEyQztBQUMzQyxlQUFlO0FBQ2YsZUFBZTtBQUNmLFlBQVk7QUFFWixvRUFBb0U7QUFDcEUsZ0NBQWdDO0FBQ2hDLDBCQUEwQjtBQUMxQiw2Q0FBNkM7QUFDN0MsZUFBZTtBQUNmLGVBQWU7QUFDZixZQUFZO0FBQ1osVUFBVTtBQUVWLHNDQUFzQztBQUN0Qyw4RkFBOEY7QUFDOUYsMkVBQTJFO0FBQzNFLGlDQUFpQztBQUNqQyw0QkFBNEI7QUFDNUIsOEJBQThCO0FBQzlCLGlDQUFpQztBQUNqQyxpQkFBaUI7QUFDakIsaUJBQWlCO0FBQ2pCLGNBQWM7QUFDZCxZQUFZO0FBRVosOERBQThEO0FBQzlELGdDQUFnQztBQUNoQywwQkFBMEI7QUFDMUIsaUNBQWlDO0FBQ2pDLGVBQWU7QUFDZixlQUFlO0FBQ2YsWUFBWTtBQUNaLFVBQVU7QUFDVixRQUFRO0FBQ1IsTUFBTSIsImZpbGUiOiJzY2hlbWEvdHJhbnNmb3Jtcy5zY2hlbWEuc3BlYy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggYnkgRmlsZXN0YWNrLlxuICogU29tZSByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgZ2V0VmFsaWRhdG9yLCBUcmFuc2Zvcm1TY2hlbWEgfSBmcm9tICcuLyc7XG5cbmRlc2NyaWJlKCdUcmFuc2Zvcm1zIFNjaGVtYScsICgpID0+IHtcblxuICBjb25zdCB2YWxpZGF0b3IgPSBnZXRWYWxpZGF0b3IoVHJhbnNmb3JtU2NoZW1hKTtcblxuICBjb25zdCB2YWxpZGF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICBjb25zdCByZXMgPSB2YWxpZGF0b3IocGFyYW1zKTtcbiAgICByZXR1cm4gcmVzLmVycm9ycy5sZW5ndGggPT09IDAgPyB0cnVlIDogZmFsc2U7XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0RmFpbCA9IChyZXMpID0+IGFzc2VydC5vayghcmVzKTtcblxuICBpdCgnc2hvdWxkIGxvYWQganNvbiBzY2hlbWEnLCAoKSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coc2NoZW1hKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1dhdGVybWFyaycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgcGFyYW1zJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgd2F0ZXJtYXJrOiB7XG4gICAgICAgICAgZmlsZTogJ3Rlc3RmaWxlaGFuZGxlJyxcbiAgICAgICAgICBzaXplOiAzMDAsXG4gICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcyAocG9zaXRpb24gYXJyYXkpJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgd2F0ZXJtYXJrOiB7XG4gICAgICAgICAgZmlsZTogJ3Rlc3RmaWxlaGFuZGxlJyxcbiAgICAgICAgICBzaXplOiAzMDAsXG4gICAgICAgICAgcG9zaXRpb246IFsndG9wJywgJ2xlZnQnXSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwb3NpdGlvbiBwYXJhbXMgW3RvcCwgYm90dG9tXScsICgpID0+IHtcbiAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuICAgICAgICB3YXRlcm1hcms6IHtcbiAgICAgICAgICBmaWxlOiAndGVzdGZpbGVoYW5kbGUnLFxuICAgICAgICAgIHNpemU6IDMwMCxcbiAgICAgICAgICBwb3NpdGlvbjogWyd0b3AnLCAnYm90dG9tJ10sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQYXJ0aWFsIEJsdXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHBhcnRpYWxfYmx1cjoge1xuICAgICAgICAgIG9iamVjdHM6IFtcbiAgICAgICAgICAgIFsxLCAxLCAyLCAyXSxcbiAgICAgICAgICAgIFsxLCAxLCAzMiwgMTVdLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYW1vdW50OiAxOC4yLFxuICAgICAgICAgIGJsdXI6IDEyLFxuICAgICAgICAgIHR5cGU6ICdyZWN0JyxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKGFtb3VudCwgYmx1ciwgdHlwZSknLCAoKSA9PiB7XG4gICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbiAgICAgICAgcGFydGlhbF9ibHVyOiB7XG4gICAgICAgICAgb2JqZWN0czogW1xuICAgICAgICAgICAgWzEsIDEsIDIsIDJdLFxuICAgICAgICAgICAgWzEsIDEsIDMyLCAxNV0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhbW91bnQ6IC0xMCxcbiAgICAgICAgICBibHVyOiAzMDAsXG4gICAgICAgICAgdHlwZTogJ3dyb25nX3R5cGUnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAob2JqZWN0cyknLCAoKSA9PiB7XG4gICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbiAgICAgICAgcGFydGlhbF9ibHVyOiB7XG4gICAgICAgICAgb2JqZWN0czogW1xuICAgICAgICAgICAgWzEsIDEsIDJdLFxuICAgICAgICAgICAgWzEsIDEsIDMyLCAxNSwgMzJdLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYW1vdW50OiAxMCxcbiAgICAgICAgICBibHVyOiAyMCxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1BhcnRpYWwgUGl4ZWxhdGUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHBhcnRpYWxfcGl4ZWxhdGU6IHtcbiAgICAgICAgICBvYmplY3RzOiBbXG4gICAgICAgICAgICBbMSwgMSwgMiwgMl0sXG4gICAgICAgICAgICBbMSwgMSwgMzIsIDE1XSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFtb3VudDogMTAwLFxuICAgICAgICAgIGJsdXI6IDEyLjIsXG4gICAgICAgICAgdHlwZTogJ292YWwnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAoYW1vdW50LCBibHVyLCB0eXBlKScsICgpID0+IHtcbiAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuICAgICAgICBwYXJ0aWFsX3BpeGVsYXRlOiB7XG4gICAgICAgICAgb2JqZWN0czogW1xuICAgICAgICAgICAgWzEsIDEsIDIsIDJdLFxuICAgICAgICAgICAgWzEsIDEsIDMyLCAxNV0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhbW91bnQ6IC0xMCxcbiAgICAgICAgICBibHVyOiAzMDAsXG4gICAgICAgICAgdHlwZTogJ3dyb25nX3R5cGUnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAob2JqZWN0cyknLCAoKSA9PiB7XG4gICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbiAgICAgICAgcGFydGlhbF9waXhlbGF0ZToge1xuICAgICAgICAgIG9iamVjdHM6IFtcbiAgICAgICAgICAgIFsxLCAxLCAyXSxcbiAgICAgICAgICAgIFsxLCAxLCAzMiwgMTUsIDMyXSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFtb3VudDogMTAsXG4gICAgICAgICAgYmx1cjogMjAsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDcm9wJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuICAgICAgICBjcm9wOiB7XG4gICAgICAgICAgZGltOiBbMSwgMSwgMiwgMl0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgb24gZW1wdHkgZGltIHBhcmFtcycsICgpID0+IHtcbiAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuICAgICAgICBjcm9wOiB7XG4gICAgICAgICAgZGltOiBbXSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKG1pbmltdW0gdmFsdWUgZm9yIDIgZmlyc3QgaXRlbXMpJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4gICAgICAgIGNyb3A6IHtcbiAgICAgICAgICBkaW06IFsyLCAxLCAwLCAyXSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKDUgaXRlbXMgaW4gYXJyYXkpJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4gICAgICAgIGNyb3A6IHtcbiAgICAgICAgICBkaW06IFsxLCAxLCAyLCAyLCA0XSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Jlc2l6ZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgcGFyYW1zJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgcmVzaXplOiB7XG4gICAgICAgICAgd2lkdGg6IDEwLFxuICAgICAgICAgIGhlaWdodDogMjAsXG4gICAgICAgICAgZml0OiAnY3JvcCcsXG4gICAgICAgICAgYWxpZ246IFsndG9wJywgJ2xlZnQnXSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCB3aGVuIG9ubHkgb25lIHdpZHRoIG9yIGhlaWdodCBpcyBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHJlc2l6ZToge1xuICAgICAgICAgIHdpZHRoOiAxMCxcbiAgICAgICAgICBmaXQ6ICdjcm9wJyxcbiAgICAgICAgICBhbGlnbjogJ2xlZnQnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuICAgICAgICByZXNpemU6IHtcbiAgICAgICAgICBoZWlnaHQ6IDEwLFxuICAgICAgICAgIGZpdDogJ2Nyb3AnLFxuICAgICAgICAgIGFsaWduOiAnbGVmdCcsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFyYW1zIChtaXNzaW5nIHdpZHRoIGFuZCBoZWlnaHQpJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4gICAgICAgIHJlc2l6ZToge1xuICAgICAgICAgIGZpdDogJ2Nyb3AnLFxuICAgICAgICAgIGFsaWduOiAnbGVmdCcsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZXNpemUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHJvdGF0ZToge1xuICAgICAgICAgIGRlZzogJ2V4aWYnLFxuICAgICAgICAgIGV4aWY6IGZhbHNlLFxuICAgICAgICAgIGJhY2tncm91bmQ6ICdmZmYnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHJvdGF0ZToge1xuICAgICAgICAgIGRlZzogMjAwLFxuICAgICAgICAgIGV4aWY6IHRydWUsXG4gICAgICAgICAgYmFja2dyb3VuZDogJ2ZmZmZmZicsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFyYW1zICh3cm9uZyBleGlmIHJvdGF0aW9uKScsICgpID0+IHtcbiAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuICAgICAgICByb3RhdGU6IHtcbiAgICAgICAgICBkZWc6IDEyMyxcbiAgICAgICAgICBleGlmOiAndHJ1ZScsXG4gICAgICAgICAgYmFja2dyb3VuZDogJ2ZmZmZmZicsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQZGZpbmZvJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMgd2l0aCBib29sIHZhbHVlJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgcGRmaW5mbzogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMgd2l0aCBjb2xvciBpbmZvJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgcGRmaW5mbzoge1xuICAgICAgICAgIGNvbG9yaW5mbzogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1BkZmNvbnZlcnQnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ1BhZ2VzJywgKCkgPT4ge1xuICAgICAgW1sxLDJdLCBbJzEtJywgM10sIFsnLTInXV0uZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgIGl0KGBzaG91bGQgdmFsaWRhdGUgb24gY29ycmVjdCBwYWdlIFwiJHt2YWx9XCJgLCAoKSA9PiB7XG4gICAgICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgICAgIHBkZmNvbnZlcnQ6IHtcbiAgICAgICAgICAgICAgcGFnZXM6IHZhbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBlcnJvciBvbiBmYWlsIHBhZ2UgXCIxYVwiJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbiAgICAgICAgICBwZGZjb252ZXJ0OiB7XG4gICAgICAgICAgICBwYWdlczogJzFhJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSk7XG4gICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1BhZ2Ugb3JpZW50YXRpb24nLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHBhc3Mgb24gY29ycmVjdCBvcmllbnRhdGlvbiBcImxhbmRzY2FwZVwiJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuICAgICAgICAgIHBkZmNvbnZlcnQ6IHtcbiAgICAgICAgICAgIHBhZ2VvcmllbnRhdGlvbjogJ2xhbmRzY2FwZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcGFzcyBvbiBjb3JyZWN0IG9yaWVudGF0aW9uIFwicG9ydHJhaXRcIicsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgICBwZGZjb252ZXJ0OiB7XG4gICAgICAgICAgICBwYWdlb3JpZW50YXRpb246ICdwb3J0cmFpdCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBvcmllbnRhdGlvbiBcImxhbmRzY2FwZTFcIicsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4gICAgICAgICAgcGRmY29udmVydDoge1xuICAgICAgICAgICAgcGFnZW9yaWVudGF0aW9uOiAnbGFuZHNjYXBlMScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnUGFnZSBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBbJ2EyJywgJ2EzJywgJ2E0JywgJ2E1JywgJ2I0JywgJ2I1JywgJ2xldHRlcicsICdsZWdhbCcsICd0YWJsb2lkJ10uZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgIGl0KGBzaG91bGQgd2hlbiBjb3JyZWN0IHBhZ2UgZm9ybWF0IGlzIHByb3ZpZGVkICR7dmFsfWAsICgpID0+IHtcbiAgICAgICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuICAgICAgICAgICAgcGRmY29udmVydDoge1xuICAgICAgICAgICAgICBwYWdlczogWzEsMl0sXG4gICAgICAgICAgICAgIHBhZ2Vmb3JtYXQ6IHZhbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFnZSBmb3JtYXQgaWUgYTIyJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbiAgICAgICAgICBwZGZjb252ZXJ0OiB7XG4gICAgICAgICAgICBwYWdlZm9ybWF0OiAnYTIyJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuLy8gaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG4vLyBpbXBvcnQgeyBnZXRWYWxpZGF0b3IsIFRyYW5zZm9ybVNjaGVtYSB9IGZyb20gJy4vJztcblxuLy8gZGVzY3JpYmUoJ1RyYW5zZm9ybXMgU2NoZW1hJywgKCkgPT4ge1xuXG4vLyAgIGNvbnN0IHZhbGlkYXRlID0gZ2V0VmFsaWRhdG9yKFRyYW5zZm9ybVNjaGVtYSk7XG5cbi8vICAgY29uc3QgYXNzZXJ0RmFpbCA9ICh2YWwpID0+IGFzc2VydC5vayghdmFsKTtcblxuLy8gICBpdCgnc2hvdWxkIGxvYWQganNvbiBzY2hlbWEnLCAoKSA9PiB7XG4vLyAgICAgLy8gY29uc29sZS5sb2coc2NoZW1hKTtcbi8vICAgfSk7XG5cbi8vICAgZGVzY3JpYmUoJ1dhdGVybWFyaycsICgpID0+IHtcbi8vICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgcGFyYW1zJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbi8vICAgICAgICAgd2F0ZXJtYXJrOiB7XG4vLyAgICAgICAgICAgZmlsZTogJ3Rlc3RmaWxlaGFuZGxlJyxcbi8vICAgICAgICAgICBzaXplOiAzMDAsXG4vLyAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuLy8gICAgIH0pO1xuXG4vLyAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcyAocG9zaXRpb24gYXJyYXkpJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbi8vICAgICAgICAgd2F0ZXJtYXJrOiB7XG4vLyAgICAgICAgICAgZmlsZTogJ3Rlc3RmaWxlaGFuZGxlJyxcbi8vICAgICAgICAgICBzaXplOiAzMDAsXG4vLyAgICAgICAgICAgcG9zaXRpb246IFsndG9wJywgJ2xlZnQnXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwb3NpdGlvbiBwYXJhbXMgW3RvcCwgYm90dG9tXScsICgpID0+IHtcbi8vICAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuLy8gICAgICAgICB3YXRlcm1hcms6IHtcbi8vICAgICAgICAgICBmaWxlOiAndGVzdGZpbGVoYW5kbGUnLFxuLy8gICAgICAgICAgIHNpemU6IDMwMCxcbi8vICAgICAgICAgICBwb3NpdGlvbjogWyd0b3AnLCAnYm90dG9tJ10sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG4vLyAgIH0pO1xuXG4vLyAgIGRlc2NyaWJlKCdQYXJ0aWFsIEJsdXInLCAoKSA9PiB7XG4vLyAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbi8vICAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHBhcnRpYWxfYmx1cjoge1xuLy8gICAgICAgICAgIG9iamVjdHM6IFtcbi8vICAgICAgICAgICAgIFsxLCAxLCAyLCAyXSxcbi8vICAgICAgICAgICAgIFsxLCAxLCAzMiwgMTVdLFxuLy8gICAgICAgICAgIF0sXG4vLyAgICAgICAgICAgYW1vdW50OiAxOC4yLFxuLy8gICAgICAgICAgIGJsdXI6IDEyLFxuLy8gICAgICAgICAgIHR5cGU6ICdyZWN0Jyxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKGFtb3VudCwgYmx1ciwgdHlwZSknLCAoKSA9PiB7XG4vLyAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbi8vICAgICAgICAgcGFydGlhbF9ibHVyOiB7XG4vLyAgICAgICAgICAgb2JqZWN0czogW1xuLy8gICAgICAgICAgICAgWzEsIDEsIDIsIDJdLFxuLy8gICAgICAgICAgICAgWzEsIDEsIDMyLCAxNV0sXG4vLyAgICAgICAgICAgXSxcbi8vICAgICAgICAgICBhbW91bnQ6IC0xMCxcbi8vICAgICAgICAgICBibHVyOiAzMDAsXG4vLyAgICAgICAgICAgdHlwZTogJ3dyb25nX3R5cGUnLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuLy8gICAgIH0pO1xuXG4vLyAgICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAob2JqZWN0cyknLCAoKSA9PiB7XG4vLyAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbi8vICAgICAgICAgcGFydGlhbF9ibHVyOiB7XG4vLyAgICAgICAgICAgb2JqZWN0czogW1xuLy8gICAgICAgICAgICAgWzEsIDEsIDJdLFxuLy8gICAgICAgICAgICAgWzEsIDEsIDMyLCAxNSwgMzJdLFxuLy8gICAgICAgICAgIF0sXG4vLyAgICAgICAgICAgYW1vdW50OiAxMCxcbi8vICAgICAgICAgICBibHVyOiAyMCxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcbi8vICAgfSk7XG5cbi8vICAgZGVzY3JpYmUoJ1BhcnRpYWwgUGl4ZWxhdGUnLCAoKSA9PiB7XG4vLyAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbi8vICAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHBhcnRpYWxfcGl4ZWxhdGU6IHtcbi8vICAgICAgICAgICBvYmplY3RzOiBbXG4vLyAgICAgICAgICAgICBbMSwgMSwgMiwgMl0sXG4vLyAgICAgICAgICAgICBbMSwgMSwgMzIsIDE1XSxcbi8vICAgICAgICAgICBdLFxuLy8gICAgICAgICAgIGFtb3VudDogMTAwLFxuLy8gICAgICAgICAgIGJsdXI6IDEyLjIsXG4vLyAgICAgICAgICAgdHlwZTogJ292YWwnLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuLy8gICAgIH0pO1xuXG4vLyAgICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAoYW1vdW50LCBibHVyLCB0eXBlKScsICgpID0+IHtcbi8vICAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuLy8gICAgICAgICBwYXJ0aWFsX3BpeGVsYXRlOiB7XG4vLyAgICAgICAgICAgb2JqZWN0czogW1xuLy8gICAgICAgICAgICAgWzEsIDEsIDIsIDJdLFxuLy8gICAgICAgICAgICAgWzEsIDEsIDMyLCAxNV0sXG4vLyAgICAgICAgICAgXSxcbi8vICAgICAgICAgICBhbW91bnQ6IC0xMCxcbi8vICAgICAgICAgICBibHVyOiAzMDAsXG4vLyAgICAgICAgICAgdHlwZTogJ3dyb25nX3R5cGUnLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuLy8gICAgIH0pO1xuXG4vLyAgICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAob2JqZWN0cyknLCAoKSA9PiB7XG4vLyAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbi8vICAgICAgICAgcGFydGlhbF9waXhlbGF0ZToge1xuLy8gICAgICAgICAgIG9iamVjdHM6IFtcbi8vICAgICAgICAgICAgIFsxLCAxLCAyXSxcbi8vICAgICAgICAgICAgIFsxLCAxLCAzMiwgMTUsIDMyXSxcbi8vICAgICAgICAgICBdLFxuLy8gICAgICAgICAgIGFtb3VudDogMTAsXG4vLyAgICAgICAgICAgYmx1cjogMjAsXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG4vLyAgIH0pO1xuXG4vLyAgIGRlc2NyaWJlKCdDcm9wJywgKCkgPT4ge1xuLy8gICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMnLCAoKSA9PiB7XG4vLyAgICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuLy8gICAgICAgICBjcm9wOiB7XG4vLyAgICAgICAgICAgZGltOiBbMSwgMSwgMiwgMl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG5cbi8vICAgICBpdCgnc2hvdWxkIGZhaWwgb24gZW1wdHkgZGltIHBhcmFtcycsICgpID0+IHtcbi8vICAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuLy8gICAgICAgICBjcm9wOiB7XG4vLyAgICAgICAgICAgZGltOiBbXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKG1pbmltdW0gdmFsdWUgZm9yIDIgZmlyc3QgaXRlbXMpJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIGNyb3A6IHtcbi8vICAgICAgICAgICBkaW06IFsyLCAxLCAwLCAyXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKDUgaXRlbXMgaW4gYXJyYXkpJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIGNyb3A6IHtcbi8vICAgICAgICAgICBkaW06IFsxLCAxLCAyLCAyLCA0XSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcbi8vICAgfSk7XG5cbi8vICAgZGVzY3JpYmUoJ1Jlc2l6ZScsICgpID0+IHtcbi8vICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgcGFyYW1zJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbi8vICAgICAgICAgcmVzaXplOiB7XG4vLyAgICAgICAgICAgd2lkdGg6IDEwLFxuLy8gICAgICAgICAgIGhlaWdodDogMjAsXG4vLyAgICAgICAgICAgZml0OiAnY3JvcCcsXG4vLyAgICAgICAgICAgYWxpZ246IFsndG9wJywgJ2xlZnQnXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCB3aGVuIG9ubHkgb25lIHdpZHRoIG9yIGhlaWdodCBpcyBwcm92aWRlZCcsICgpID0+IHtcbi8vICAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHJlc2l6ZToge1xuLy8gICAgICAgICAgIHdpZHRoOiAxMCxcbi8vICAgICAgICAgICBmaXQ6ICdjcm9wJyxcbi8vICAgICAgICAgICBhbGlnbjogJ2xlZnQnLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuXG4vLyAgICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuLy8gICAgICAgICByZXNpemU6IHtcbi8vICAgICAgICAgICBoZWlnaHQ6IDEwLFxuLy8gICAgICAgICAgIGZpdDogJ2Nyb3AnLFxuLy8gICAgICAgICAgIGFsaWduOiAnbGVmdCcsXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG5cbi8vICAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFyYW1zIChtaXNzaW5nIHdpZHRoIGFuZCBoZWlnaHQpJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHJlc2l6ZToge1xuLy8gICAgICAgICAgIGZpdDogJ2Nyb3AnLFxuLy8gICAgICAgICAgIGFsaWduOiAnbGVmdCcsXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG4vLyAgIH0pO1xuXG4vLyAgIGRlc2NyaWJlKCdSZXNpemUnLCAoKSA9PiB7XG4vLyAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbi8vICAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHJvdGF0ZToge1xuLy8gICAgICAgICAgIGRlZzogJ2V4aWYnLFxuLy8gICAgICAgICAgIGV4aWY6IGZhbHNlLFxuLy8gICAgICAgICAgIGJhY2tncm91bmQ6ICdmZmYnLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuLy8gICAgIH0pO1xuXG4vLyAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbi8vICAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHJvdGF0ZToge1xuLy8gICAgICAgICAgIGRlZzogMjAwLFxuLy8gICAgICAgICAgIGV4aWY6IHRydWUsXG4vLyAgICAgICAgICAgYmFja2dyb3VuZDogJ2ZmZmZmZicsXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG5cbi8vICAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFyYW1zICh3cm9uZyBleGlmIHJvdGF0aW9uKScsICgpID0+IHtcbi8vICAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuLy8gICAgICAgICByb3RhdGU6IHtcbi8vICAgICAgICAgICBkZWc6IDEyMyxcbi8vICAgICAgICAgICBleGlmOiAndHJ1ZScsXG4vLyAgICAgICAgICAgYmFja2dyb3VuZDogJ2ZmZmZmZicsXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG4vLyAgIH0pO1xuXG4vLyAgIGRlc2NyaWJlKCdQZGZpbmZvJywgKCkgPT4ge1xuLy8gICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMgd2l0aCBib29sIHZhbHVlJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbi8vICAgICAgICAgcGRmaW5mbzogdHJ1ZSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMgd2l0aCBjb2xvciBpbmZvJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbi8vICAgICAgICAgcGRmaW5mbzoge1xuLy8gICAgICAgICAgIGNvbG9yaW5mbzogdHJ1ZSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcbi8vICAgfSk7XG5cbi8vICAgZGVzY3JpYmUoJ1BkZmNvbnZlcnQnLCAoKSA9PiB7XG4vLyAgICAgZGVzY3JpYmUoJ1BhZ2VzJywgKCkgPT4ge1xuLy8gICAgICAgW1sxLDJdLCBbJzEtJywgM10sIFsnLTInXV0uZm9yRWFjaCgodmFsKSA9PiB7XG4vLyAgICAgICAgIGl0KGBzaG91bGQgdmFsaWRhdGUgb24gY29ycmVjdCBwYWdlIFwiJHt2YWx9XCJgLCAoKSA9PiB7XG4vLyAgICAgICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbi8vICAgICAgICAgICAgIHBkZmNvbnZlcnQ6IHtcbi8vICAgICAgICAgICAgICAgcGFnZXM6IHZhbCxcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgfSkpO1xuLy8gICAgICAgICB9KTtcbi8vICAgICAgIH0pO1xuXG4vLyAgICAgICBpdCgnc2hvdWxkIHJldHVybiBlcnJvciBvbiBmYWlsIHBhZ2UgXCIxYVwiJywgKCkgPT4ge1xuLy8gICAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbi8vICAgICAgICAgICBwZGZjb252ZXJ0OiB7XG4vLyAgICAgICAgICAgICBwYWdlczogJzFhJyxcbi8vICAgICAgICAgICB9LFxuLy8gICAgICAgICB9KSk7XG4vLyAgICAgICB9KTtcblxuLy8gICAgIH0pO1xuXG4vLyAgICAgZGVzY3JpYmUoJ1BhZ2Ugb3JpZW50YXRpb24nLCAoKSA9PiB7XG4vLyAgICAgICBpdCgnc2hvdWxkIHBhc3Mgb24gY29ycmVjdCBvcmllbnRhdGlvbiBcImxhbmRzY2FwZVwiJywgKCkgPT4ge1xuLy8gICAgICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuLy8gICAgICAgICAgIHBkZmNvbnZlcnQ6IHtcbi8vICAgICAgICAgICAgIHBhZ2VvcmllbnRhdGlvbjogJ2xhbmRzY2FwZScsXG4vLyAgICAgICAgICAgfSxcbi8vICAgICAgICAgfSkpO1xuLy8gICAgICAgfSk7XG5cbi8vICAgICAgIGl0KCdzaG91bGQgcGFzcyBvbiBjb3JyZWN0IG9yaWVudGF0aW9uIFwicG9ydHJhaXRcIicsICgpID0+IHtcbi8vICAgICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbi8vICAgICAgICAgICBwZGZjb252ZXJ0OiB7XG4vLyAgICAgICAgICAgICBwYWdlb3JpZW50YXRpb246ICdwb3J0cmFpdCcsXG4vLyAgICAgICAgICAgfSxcbi8vICAgICAgICAgfSkpO1xuLy8gICAgICAgfSk7XG5cbi8vICAgICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBvcmllbnRhdGlvbiBcImxhbmRzY2FwZTFcIicsICgpID0+IHtcbi8vICAgICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4vLyAgICAgICAgICAgcGRmY29udmVydDoge1xuLy8gICAgICAgICAgICAgcGFnZW9yaWVudGF0aW9uOiAnbGFuZHNjYXBlMScsXG4vLyAgICAgICAgICAgfSxcbi8vICAgICAgICAgfSkpO1xuLy8gICAgICAgfSk7XG4vLyAgICAgfSk7XG5cbi8vICAgICBkZXNjcmliZSgnUGFnZSBmb3JtYXQnLCAoKSA9PiB7XG4vLyAgICAgICBbJ2EyJywgJ2EzJywgJ2E0JywgJ2E1JywgJ2I0JywgJ2I1JywgJ2xldHRlcicsICdsZWdhbCcsICd0YWJsb2lkJ10uZm9yRWFjaCgodmFsKSA9PiB7XG4vLyAgICAgICAgIGl0KGBzaG91bGQgd2hlbiBjb3JyZWN0IHBhZ2UgZm9ybWF0IGlzIHByb3ZpZGVkICR7dmFsfWAsICgpID0+IHtcbi8vICAgICAgICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuLy8gICAgICAgICAgICAgcGRmY29udmVydDoge1xuLy8gICAgICAgICAgICAgICBwYWdlczogWzEsMl0sXG4vLyAgICAgICAgICAgICAgIHBhZ2Vmb3JtYXQ6IHZhbCxcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgfSkpO1xuLy8gICAgICAgICB9KTtcbi8vICAgICAgIH0pO1xuXG4vLyAgICAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFnZSBmb3JtYXQgaWUgYTIyJywgKCkgPT4ge1xuLy8gICAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbi8vICAgICAgICAgICBwZGZjb252ZXJ0OiB7XG4vLyAgICAgICAgICAgICBwYWdlZm9ybWF0OiAnYTIyJyxcbi8vICAgICAgICAgICB9LFxuLy8gICAgICAgICB9KSk7XG4vLyAgICAgICB9KTtcbi8vICAgICB9KTtcbi8vICAgfSk7XG4vLyB9KTtcbiJdfQ==