UNPKG

ng-voice-inputs

Version:

This library provides Voice Recognition service to fill the form input fields (text, datepicker, textarea, button-click) for Angular application.

602 lines 47.1 kB
/** * @fileoverview added by tsickle * Generated from: lib/ng-voice-inputs.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import * as moment_ from 'moment/moment'; import * as i0 from "@angular/core"; /** @type {?} */ var moment = moment_; import { Subject } from 'rxjs'; /** @type {?} */ var UNIT = { zero: 0, first: 1, one: 1, second: 2, two: 2, third: 3, thirteenth: 13, thirteen: 13, three: 3, fourth: 4, fourteenth: 14, fourteen: 14, four: 4, fifteenth: 15, fifteen: 15, fifth: 5, five: 5, sixth: 6, sixteenth: 16, sixteen: 16, six: 6, seventeenth: 17, seventeen: 17, seventh: 7, seven: 7, eighteenth: 18, eighteen: 18, eighth: 8, eight: 8, nineteenth: 19, nineteen: 19, ninth: 9, nine: 9, tenth: 10, ten: 10, eleventh: 11, eleven: 11, twelfth: 12, twelve: 12, a: 1, }; /** @type {?} */ var TWOS = { ten: 10, eleven: 11, twelve: 12, thirteen: 13, fourteen: 14, fifteen: 15, sixteen: 16, seventeen: 17, eighteen: 18, nineteen: 19 }; /** @type {?} */ var TEN = { twenty: 20, twentieth: 20, thirty: 30, thirtieth: 30, forty: 40, fortieth: 40, fifty: 50, fiftieth: 50, sixty: 60, sixtieth: 60, seventy: 70, seventieth: 70, eighty: 80, eightieth: 80, ninety: 90, ninetieth: 90, }; /** @type {?} */ var MAGNITUDE = { hundred: 100, hundredth: 100, thousand: 1000, million: 1000000, billion: 1000000000, trillion: 1000000000000, quadrillion: 1000000000000000, quintillion: 1000000000000000000, sextillion: 1000000000000000000000, septillion: 1000000000000000000000000, octillion: 1000000000000000000000000000, nonillion: 1000000000000000000000000000000, decillion: 1000000000000000000000000000000000, }; /** @type {?} */ var NUMBER = tslib_1.__assign({}, UNIT, TEN, MAGNITUDE); /** @type {?} */ var SUFFIXES = ['st', 'nd', 'rd', 'th']; /** @type {?} */ var MONTHS = ["JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER"]; /** @type {?} */ var KEY_WORDS_FWD_NAV = ['forward', 'next']; /** @type {?} */ var KEY_WORDS_BCK_NAV = ['back', 'backward', 'previous']; /** @type {?} */ var KEY_WORDS_CLEAR = ['clear', 'clean', 'delete', 'remove']; /** @type {?} */ var KEY_WORDS_CLICK = ['click', 'submit', 'expand', 'open', 'show']; /** @type {?} */ var KEY_WORDS_STOP = ['stop', 'end', 'done']; /** @type {?} */ var KEY_WORDS_SCROLL_UP = ['scroll up', 'go up', 'up']; /** @type {?} */ var KEY_WORDS_SCROLL_DOWN = ['scroll down', 'go down', 'down']; /** @type {?} */ var KEY_WORDS_SCROLL_RIGHT = ['scroll right', 'go right', 'right']; /** @type {?} */ var KEY_WORDS_SCROLL_LEFT = ['scroll left', 'go left', 'left']; /** @type {?} */ var KEY_WORDS_SCROLL_TOP = ['scroll top', 'go top', 'top']; /** @type {?} */ var KEY_WORDS_SCROLL_BOTTOM = ['scroll bottom', 'go bottom', 'bottom']; /** @type {?} */ var KEY_WORDS_SCROLL_CONTINUE = ['keep scrolling', 'scroll', 'scrolling', 'continue scrolling']; /** @type {?} */ var KEY_WORDS_SCROLL = tslib_1.__spread(KEY_WORDS_SCROLL_UP, KEY_WORDS_SCROLL_DOWN, KEY_WORDS_SCROLL_RIGHT, KEY_WORDS_SCROLL_LEFT, KEY_WORDS_SCROLL_TOP, KEY_WORDS_SCROLL_BOTTOM, KEY_WORDS_SCROLL_CONTINUE); /** @type {?} */ var KEY_WORDS_INST = tslib_1.__spread(['goto', 'switch', 'go'], KEY_WORDS_CLEAR, KEY_WORDS_CLICK, KEY_WORDS_SCROLL); // Instruction types /** @type {?} */ var KEY_WORDS_NAV = tslib_1.__spread(KEY_WORDS_FWD_NAV, KEY_WORDS_BCK_NAV, KEY_WORDS_STOP, KEY_WORDS_SCROLL, [ 'first', 'last', ]); // Navigation types /** @type {?} */ var KEY_WORDS = tslib_1.__spread(KEY_WORDS_INST, KEY_WORDS_NAV); /** @type {?} */ var INST_MAPPINGS = { next: KEY_WORDS_FWD_NAV, previous: KEY_WORDS_BCK_NAV, first: ['first'], last: ['last'], clear: KEY_WORDS_CLEAR, click: KEY_WORDS_CLICK, stop: KEY_WORDS_STOP, scrollUp: KEY_WORDS_SCROLL_UP, scrollDown: KEY_WORDS_SCROLL_DOWN, scrollLeft: KEY_WORDS_SCROLL_LEFT, scrollRight: KEY_WORDS_SCROLL_RIGHT, scrollTop: KEY_WORDS_SCROLL_TOP, scrollBottom: KEY_WORDS_SCROLL_BOTTOM, scrollContinue: KEY_WORDS_SCROLL_CONTINUE }; var VuiVoiceRecognitionService = /** @class */ (function () { function VuiVoiceRecognitionService() { this.response = new Subject(); this.inputRefs = []; this.currentRef = 0; } /** * @param {?} speechKeys * @param {?} inputType * @return {?} */ VuiVoiceRecognitionService.prototype.isInputSwitch = /** * @param {?} speechKeys * @param {?} inputType * @return {?} */ function (speechKeys, inputType) { if (inputType == 'address' && !speechKeys.some((/** * @param {?} key * @return {?} */ function (key) { return KEY_WORDS_INST.includes(key); }))) { return false; } if (speechKeys.some((/** * @param {?} key * @return {?} */ function (key) { return KEY_WORDS.includes(key); }))) { return true; } return false; }; /** * @param {?} speechText * @param {?} inputType * @return {?} */ VuiVoiceRecognitionService.prototype.findInstructionType = /** * @param {?} speechText * @param {?} inputType * @return {?} */ function (speechText, inputType) { /** @type {?} */ var type = ''; speechText = speechText.trim().toLocaleLowerCase(); /** @type {?} */ var speechKeys = speechText.trim().toLocaleLowerCase().split(' '); if (this.isInputSwitch(speechKeys, inputType)) { /** @type {?} */ var foundKey = Object.keys(INST_MAPPINGS).find((/** * @param {?} instType * @return {?} */ function (instType) { return speechKeys.some((/** * @param {?} key * @return {?} */ function (key) { return INST_MAPPINGS[instType].includes(key); })); })); type = foundKey ? "COMMAND_" + foundKey.toUpperCase() : ''; } else { type = 'INPUT'; } return type; }; /** * @param {?} speechText * @param {?} inputType * @return {?} */ VuiVoiceRecognitionService.prototype.interpretSpeech = /** * @param {?} speechText * @param {?} inputType * @return {?} */ function (speechText, inputType) { var _this = this; /** @type {?} */ var instType = this.findInstructionType(speechText, inputType); if (instType != 'INPUT') { return instType; } if (inputType == 'text' || inputType == 'address') { return speechText; } if (inputType == 'number') { return this.wordsToNumber(speechText); } if (inputType == 'date') { speechText = speechText.replace('from', ''); /** @type {?} */ var dates = speechText.trim().split('to '); /** @type {?} */ var parsedDates_1 = []; dates.forEach((/** * @param {?} dateStr * @return {?} */ function (dateStr) { parsedDates_1.push(_this.dateParser(dateStr)); })); if (parsedDates_1[0].isValid()) { return parsedDates_1; } } return null; }; /** * @param {?} dateStr * @return {?} */ VuiVoiceRecognitionService.prototype.dateParser = /** * @param {?} dateStr * @return {?} */ function (dateStr) { var _this = this; /** @type {?} */ var parsedDate; /** @type {?} */ var cleanDateStr = dateStr; /** @type {?} */ var dateParts = dateStr.trim().split(' '); /** @type {?} */ var datePartObj = {}; /** @type {?} */ var isPureNumber = false; /** @type {?} */ var cleanDateParts = []; if (dateParts.length == 3) { cleanDateParts = dateParts.map((/** * @param {?} dateStr * @return {?} */ function (dateStr) { return _this.eliminateString(dateStr); })); isPureNumber = cleanDateParts.every((/** * @param {?} dateStr * @return {?} */ function (dateStr) { return Number.isInteger(dateStr); })); } if (isPureNumber) { cleanDateStr = cleanDateParts.join('-'); } else { /** @type {?} */ var currentDate = moment(); dateParts.forEach((/** * @param {?} dateStr * @return {?} */ function (dateStr) { datePartObj = _this.parseDatePart(dateStr, datePartObj); })); /** @type {?} */ var availableKeys = Object.keys(datePartObj).join('-'); switch (availableKeys) { case 'date': datePartObj.month = currentDate.format('MM'); case 'date-month': datePartObj.year = currentDate.format('YYYY'); break; case 'year': datePartObj.month = '01'; case 'month-year': datePartObj.date = '01'; break; case 'month': datePartObj.year = currentDate.format('YYYY'); datePartObj.date = '01'; } cleanDateStr = this.dateBuilder(datePartObj); } parsedDate = moment(cleanDateStr).toDate(); return parsedDate; }; /** * @param {?} datePartObj * @return {?} */ VuiVoiceRecognitionService.prototype.dateBuilder = /** * @param {?} datePartObj * @return {?} */ function (datePartObj) { /** @type {?} */ var dateStr = ''; dateStr = datePartObj.year + "-" + datePartObj.month + "-" + datePartObj.date; return dateStr; }; /** * * @param datePart Incomplete date part eg, '21st' is the date part for the date '21st July 2020' * @param datePartObj // Inherited from caller & updated with parsed object. Can be year, month or date */ /** * * @param {?} datePart Incomplete date part eg, '21st' is the date part for the date '21st July 2020' * @param {?} datePartObj // Inherited from caller & updated with parsed object. Can be year, month or date * @return {?} */ VuiVoiceRecognitionService.prototype.parseDatePart = /** * * @param {?} datePart Incomplete date part eg, '21st' is the date part for the date '21st July 2020' * @param {?} datePartObj // Inherited from caller & updated with parsed object. Can be year, month or date * @return {?} */ function (datePart, datePartObj) { if (this.isYearType(datePart)) { /** @type {?} */ var year = this.wordsToNumber(datePart); datePartObj.year = year; } else if (this.isDateType(datePart)) { /** @type {?} */ var date = this.wordsToNumber(datePart); datePartObj.date = date; } else if (this.isMonthType(datePart)) { /** @type {?} */ var month = MONTHS.indexOf(datePart.toUpperCase()) + 1; datePartObj.month = month < 10 ? '0' + month : month; } return datePartObj; }; /** * @param {?} datePart * @return {?} */ VuiVoiceRecognitionService.prototype.isDateType = /** * @param {?} datePart * @return {?} */ function (datePart) { /** @type {?} */ var isDatePart = false; isDatePart = (/\d/.test(datePart) && SUFFIXES.includes(datePart.substr(datePart.length - 2))); if (!isDatePart) { /** @type {?} */ var number = this.wordsToNumber(datePart); if (number > 0 && number <= 31) { isDatePart = true; } } return isDatePart; }; /** * @param {?} datePart * @param {?} datePartObj * @return {?} */ VuiVoiceRecognitionService.prototype.parseDateVal = /** * @param {?} datePart * @param {?} datePartObj * @return {?} */ function (datePart, datePartObj) { /** @type {?} */ var isDatePart = false; /** @type {?} */ var convertedNum = 0; isDatePart = SUFFIXES.some((/** * @param {?} key * @return {?} */ function (key) { return datePart.includes(key); })); if (!isDatePart) { convertedNum = this.wordsToNumber(datePart); if (convertedNum > 0 && convertedNum <= 31) { isDatePart = true; } } if (isDatePart) { datePartObj.date = convertedNum; } }; /** * @param {?} datePart * @return {?} */ VuiVoiceRecognitionService.prototype.isMonthType = /** * @param {?} datePart * @return {?} */ function (datePart) { /** @type {?} */ var month = MONTHS.indexOf(datePart.toUpperCase()); return month > -1; }; /** * @param {?} datePart * @param {?} datePartObj * @return {?} */ VuiVoiceRecognitionService.prototype.parseMonthVal = /** * @param {?} datePart * @param {?} datePartObj * @return {?} */ function (datePart, datePartObj) { /** @type {?} */ var month = MONTHS.indexOf(datePart.toUpperCase()); if (month > -1) { datePartObj.month = month < 10 ? '0' + month : month; } }; /** * @param {?} datePart * @return {?} */ VuiVoiceRecognitionService.prototype.isYearType = /** * @param {?} datePart * @return {?} */ function (datePart) { /** @type {?} */ var year = this.wordsToNumber(datePart); return year > 1000; }; /** * @param {?} datePart * @param {?} datePartObj * @return {?} */ VuiVoiceRecognitionService.prototype.parseYearVal = /** * @param {?} datePart * @param {?} datePartObj * @return {?} */ function (datePart, datePartObj) { /** @type {?} */ var year = this.wordsToNumber(datePart); if (year > 1000) { datePartObj.year = year; } }; /** * @param {?} word * @return {?} */ VuiVoiceRecognitionService.prototype.wordsToNumber = /** * @param {?} word * @return {?} */ function (word) { var _this = this; // Returning integer if it is not actual word if (!Number.isNaN(parseInt(word))) { return parseInt(word); } word = word.replace(/and/g, ''); // Replace joiners // Replace joiners /** @type {?} */ var words = word.toLowerCase().trim().split(' '); /** @type {?} */ var num = 0; /** @type {?} */ var numStr = ''; /** @type {?} */ var tens = 0; words = this.parseColloquialWords(words); words.forEach((/** * @param {?} wordStr * @return {?} */ function (wordStr) { wordStr = _this.eliminateString(wordStr); if (typeof wordStr == 'number') { num = wordStr; } else { if (UNIT[wordStr]) { num = num + NUMBER[wordStr]; } else if (TEN[wordStr]) { num = num + TEN[wordStr]; } else if (MAGNITUDE[wordStr]) { num = num * MAGNITUDE[wordStr]; } } })); return num; }; /** * @param {?} wordsArr * @return {?} */ VuiVoiceRecognitionService.prototype.parseColloquialWords = /** * @param {?} wordsArr * @return {?} */ function (wordsArr) { if (wordsArr.length == 2) { if (TEN[wordsArr[0]] && (TEN[wordsArr[1]] || TWOS[wordsArr[1]])) { wordsArr.splice(1, 0, 'hundred'); } } if (MAGNITUDE[wordsArr[0]]) { wordsArr.splice(0, 0, 'one'); } return wordsArr; }; /** * @param {?} word * @return {?} */ VuiVoiceRecognitionService.prototype.eliminateString = /** * @param {?} word * @return {?} */ function (word) { if (/\d/.test(word) && SUFFIXES.includes(word.substr(word.length - 2))) { word = word.substr(0, word.length - 2); // Remove last suffixes such as 'st', 'th' from 1st, 10th word = parseInt(word); } return word; }; VuiVoiceRecognitionService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ VuiVoiceRecognitionService.ngInjectableDef = i0.defineInjectable({ factory: function VuiVoiceRecognitionService_Factory() { return new VuiVoiceRecognitionService(); }, token: VuiVoiceRecognitionService, providedIn: "root" }); return VuiVoiceRecognitionService; }()); export { VuiVoiceRecognitionService }; if (false) { /** @type {?} */ VuiVoiceRecognitionService.prototype.response; /** @type {?} */ VuiVoiceRecognitionService.prototype.inputRefs; /** @type {?} */ VuiVoiceRecognitionService.prototype.currentRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdm9pY2UtaW5wdXRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy12b2ljZS1pbnB1dHMvIiwic291cmNlcyI6WyJsaWIvbmctdm9pY2UtaW5wdXRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQzs7O0lBQ25DLE1BQU0sR0FBRyxPQUFPO0FBQ3RCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7O0lBR3pCLElBQUksR0FBRztJQUNYLElBQUksRUFBRSxDQUFDO0lBQ1AsS0FBSyxFQUFFLENBQUM7SUFDUixHQUFHLEVBQUUsQ0FBQztJQUNOLE1BQU0sRUFBRSxDQUFDO0lBQ1QsR0FBRyxFQUFFLENBQUM7SUFDTixLQUFLLEVBQUUsQ0FBQztJQUNSLFVBQVUsRUFBRSxFQUFFO0lBQ2QsUUFBUSxFQUFFLEVBQUU7SUFDWixLQUFLLEVBQUUsQ0FBQztJQUNSLE1BQU0sRUFBRSxDQUFDO0lBQ1QsVUFBVSxFQUFFLEVBQUU7SUFDZCxRQUFRLEVBQUUsRUFBRTtJQUNaLElBQUksRUFBRSxDQUFDO0lBQ1AsU0FBUyxFQUFFLEVBQUU7SUFDYixPQUFPLEVBQUUsRUFBRTtJQUNYLEtBQUssRUFBRSxDQUFDO0lBQ1IsSUFBSSxFQUFFLENBQUM7SUFDUCxLQUFLLEVBQUUsQ0FBQztJQUNSLFNBQVMsRUFBRSxFQUFFO0lBQ2IsT0FBTyxFQUFFLEVBQUU7SUFDWCxHQUFHLEVBQUUsQ0FBQztJQUNOLFdBQVcsRUFBRSxFQUFFO0lBQ2YsU0FBUyxFQUFFLEVBQUU7SUFDYixPQUFPLEVBQUUsQ0FBQztJQUNWLEtBQUssRUFBRSxDQUFDO0lBQ1IsVUFBVSxFQUFFLEVBQUU7SUFDZCxRQUFRLEVBQUUsRUFBRTtJQUNaLE1BQU0sRUFBRSxDQUFDO0lBQ1QsS0FBSyxFQUFFLENBQUM7SUFD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QUFFLE1BQU07aUJBQ25COzs7cUNBekpEO0NBc1lDLEFBL09ELElBK09DO1NBNU9ZLDBCQUEwQjs7O0lBQ3JDLDhDQUE0RDs7SUFFNUQsK0NBQWtDOztJQUNsQyxnREFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudC9tb21lbnQnO1xuY29uc3QgbW9tZW50ID0gbW9tZW50XztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCBWdWlSZXNwb25zZSBmcm9tICcuL3Z1aS1yZXNwb25zZSc7XG5cbmNvbnN0IFVOSVQgPSB7XG4gIHplcm86IDAsXG4gIGZpcnN0OiAxLFxuICBvbmU6IDEsXG4gIHNlY29uZDogMixcbiAgdHdvOiAyLFxuICB0aGlyZDogMyxcbiAgdGhpcnRlZW50aDogMTMsXG4gIHRoaXJ0ZWVuOiAxMyxcbiAgdGhyZWU6IDMsXG4gIGZvdXJ0aDogNCxcbiAgZm91cnRlZW50aDogMTQsXG4gIGZvdXJ0ZWVuOiAxNCxcbiAgZm91cjogNCxcbiAgZmlmdGVlbnRoOiAxNSxcbiAgZmlmdGVlbjogMTUsXG4gIGZpZnRoOiA1LFxuICBmaXZlOiA1LFxuICBzaXh0aDogNixcbiAgc2l4dGVlbnRoOiAxNixcbiAgc2l4dGVlbjogMTYsXG4gIHNpeDogNixcbiAgc2V2ZW50ZWVudGg6IDE3LFxuICBzZXZlbnRlZW46IDE3LFxuICBzZXZlbnRoOiA3LFxuICBzZXZlbjogNyxcbiAgZWlnaHRlZW50aDogMTgsXG4gIGVpZ2h0ZWVuOiAxOCxcbiAgZWlnaHRoOiA4LFxuICBlaWdodDogOCxcbiAgbmluZXRlZW50aDogMTksXG4gIG5pbmV0ZWVuOiAxOSxcbiAgbmludGg6IDksXG4gIG5pbmU6IDksXG4gIHRlbnRoOiAxMCxcbiAgdGVuOiAxMCxcbiAgZWxldmVudGg6IDExLFxuICBlbGV2ZW46IDExLFxuICB0d2VsZnRoOiAxMixcbiAgdHdlbHZlOiAxMixcbiAgYTogMSxcbn07XG5cbmNvbnN0IFRXT1MgPSB7XG4gIHRlbjogMTAsXG4gIGVsZXZlbjogMTEsIFxuICB0d2VsdmU6IDEyLCBcbiAgdGhpcnRlZW46IDEzLCBcbiAgZm91cnRlZW46IDE0LCBcbiAgZmlmdGVlbjogMTUsIFxuICBzaXh0ZWVuOiAxNiwgXG4gIHNldmVudGVlbjogMTcsXG4gIGVpZ2h0ZWVuOiAxOCxcbiAgbmluZXRlZW46IDE5XG59XG5cbmNvbnN0IFRFTiA9IHtcbiAgdHdlbnR5OiAyMCxcbiAgdHdlbnRpZXRoOiAyMCxcbiAgdGhpcnR5OiAzMCxcbiAgdGhpcnRpZXRoOiAzMCxcbiAgZm9ydHk6IDQwLFxuICBmb3J0aWV0aDogNDAsXG4gIGZpZnR5OiA1MCxcbiAgZmlmdGlldGg6IDUwLFxuICBzaXh0eTogNjAsXG4gIHNpeHRpZXRoOiA2MCxcbiAgc2V2ZW50eTogNzAsXG4gIHNldmVudGlldGg6IDcwLFxuICBlaWdodHk6IDgwLFxuICBlaWdodGlldGg6IDgwLFxuICBuaW5ldHk6IDkwLFxuICBuaW5ldGlldGg6IDkwLFxufTtcblxuY29uc3QgTUFHTklUVURFID0ge1xuICBodW5kcmVkOiAxMDAsXG4gIGh1bmRyZWR0aDogMTAwLFxuICB0aG91c2FuZDogMTAwMCxcbiAgbWlsbGlvbjogMTAwMDAwMCxcbiAgYmlsbGlvbjogMTAwMDAwMDAwMCxcbiAgdHJpbGxpb246IDEwMDAwMDAwMDAwMDAsXG4gIHF1YWRyaWxsaW9uOiAxMDAwMDAwMDAwMDAwMDAwLFxuICBxdWludGlsbGlvbjogMTAwMDAwMDAwMDAwMDAwMDAwMCxcbiAgc2V4dGlsbGlvbjogMTAwMDAwMDAwMDAwMDAwMDAwMDAwMCxcbiAgc2VwdGlsbGlvbjogMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCxcbiAgb2N0aWxsaW9uOiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLFxuICBub25pbGxpb246IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAsXG4gIGRlY2lsbGlvbjogMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCxcbn07XG5cbmNvbnN0IE5VTUJFUiA9IHsgLi4uVU5JVCwgLi4uVEVOLCAuLi5NQUdOSVRVREUgfTtcbmNvbnN0IFNVRkZJWEVTID0gWydzdCcsICduZCcsICdyZCcsICd0aCddO1xuXG5jb25zdCBNT05USFMgPSBbXCJKQU5VQVJZXCIsIFwiRkVCUlVBUllcIiwgXCJNQVJDSFwiLCBcIkFQUklMXCIsIFwiTUFZXCIsIFwiSlVORVwiLCBcIkpVTFlcIiwgXCJBVUdVU1RcIiwgXCJTRVBURU1CRVJcIiwgXCJPQ1RPQkVSXCIsIFwiTk9WRU1CRVJcIiwgXCJERUNFTUJFUlwiXTtcblxuY29uc3QgS0VZX1dPUkRTX0ZXRF9OQVYgPSBbJ2ZvcndhcmQnLCAnbmV4dCddO1xuY29uc3QgS0VZX1dPUkRTX0JDS19OQVYgPSBbJ2JhY2snLCAnYmFja3dhcmQnLCAncHJldmlvdXMnXTtcbmNvbnN0IEtFWV9XT1JEU19DTEVBUiA9IFsnY2xlYXInLCAnY2xlYW4nLCAnZGVsZXRlJywgJ3JlbW92ZSddO1xuY29uc3QgS0VZX1dPUkRTX0NMSUNLID0gWydjbGljaycsICdzdWJtaXQnLCAnZXhwYW5kJywgJ29wZW4nLCAnc2hvdyddO1xuY29uc3QgS0VZX1dPUkRTX1NUT1AgPSBbJ3N0b3AnLCAnZW5kJywgJ2RvbmUnXTtcbmNvbnN0IEtFWV9XT1JEU19TQ1JPTExfVVAgPSBbJ3Njcm9sbCB1cCcsICdnbyB1cCcsICd1cCddO1xuY29uc3QgS0VZX1dPUkRTX1NDUk9MTF9ET1dOID0gWydzY3JvbGwgZG93bicsICdnbyBkb3duJywgJ2Rvd24nXTtcbmNvbnN0IEtFWV9XT1JEU19TQ1JPTExfUklHSFQgPSBbJ3Njcm9sbCByaWdodCcsICdnbyByaWdodCcsICdyaWdodCddO1xuY29uc3QgS0VZX1dPUkRTX1NDUk9MTF9MRUZUID0gWydzY3JvbGwgbGVmdCcsICdnbyBsZWZ0JywgJ2xlZnQnXTtcbmNvbnN0IEtFWV9XT1JEU19TQ1JPTExfVE9QID0gWydzY3JvbGwgdG9wJywgJ2dvIHRvcCcsICd0b3AnXTtcbmNvbnN0IEtFWV9XT1JEU19TQ1JPTExfQk9UVE9NID0gWydzY3JvbGwgYm90dG9tJywgJ2dvIGJvdHRvbScsICdib3R0b20nXTtcbmNvbnN0IEtFWV9XT1JEU19TQ1JPTExfQ09OVElOVUUgPSBbJ2tlZXAgc2Nyb2xsaW5nJywgJ3Njcm9sbCcsICdzY3JvbGxpbmcnLCAnY29udGludWUgc2Nyb2xsaW5nJ11cbmNvbnN0IEtFWV9XT1JEU19TQ1JPTEwgPSBbXG4gIC4uLktFWV9XT1JEU19TQ1JPTExfVVAsXG4gIC4uLktFWV9XT1JEU19TQ1JPTExfRE9XTixcbiAgLi4uS0VZX1dPUkRTX1NDUk9MTF9SSUdIVCxcbiAgLi4uS0VZX1dPUkRTX1NDUk9MTF9MRUZULFxuICAuLi5LRVlfV09SRFNfU0NST0xMX1RPUCxcbiAgLi4uS0VZX1dPUkRTX1NDUk9MTF9CT1RUT00sXG4gIC4uLktFWV9XT1JEU19TQ1JPTExfQ09OVElOVUVcbl07XG5cbmNvbnN0IEtFWV9XT1JEU19JTlNUID0gWydnb3RvJywgJ3N3aXRjaCcsICdnbycsIC4uLktFWV9XT1JEU19DTEVBUiwgLi4uS0VZX1dPUkRTX0NMSUNLLCAuLi5LRVlfV09SRFNfU0NST0xMXTsgLy8gSW5zdHJ1Y3Rpb24gdHlwZXNcbmNvbnN0IEtFWV9XT1JEU19OQVYgPSBbXG4gIC4uLktFWV9XT1JEU19GV0RfTkFWLFxuICAuLi5LRVlfV09SRFNfQkNLX05BVixcbiAgLi4uS0VZX1dPUkRTX1NUT1AsXG4gIC4uLktFWV9XT1JEU19TQ1JPTExcbiAgLCAnZmlyc3QnLCAnbGFzdCcsXG5dOyAvLyBOYXZpZ2F0aW9uIHR5cGVzXG5cbmNvbnN0IEtFWV9XT1JEUyA9IFsuLi5LRVlfV09SRFNfSU5TVCwgLi4uS0VZX1dPUkRTX05BVl07XG5cbmNvbnN0IElOU1RfTUFQUElOR1MgPSB7XG4gIG5leHQ6IEtFWV9XT1JEU19GV0RfTkFWLFxuICBwcmV2aW91czogS0VZX1dPUkRTX0JDS19OQVYsXG4gIGZpcnN0OiBbJ2ZpcnN0J10sXG4gIGxhc3Q6IFsnbGFzdCddLFxuICBjbGVhcjogS0VZX1dPUkRTX0NMRUFSLFxuICBjbGljazogS0VZX1dPUkRTX0NMSUNLLFxuICBzdG9wOiBLRVlfV09SRFNfU1RPUCxcbiAgc2Nyb2xsVXA6IEtFWV9XT1JEU19TQ1JPTExfVVAsXG4gIHNjcm9sbERvd246IEtFWV9XT1JEU19TQ1JPTExfRE9XTixcbiAgc2Nyb2xsTGVmdDogS0VZX1dPUkRTX1NDUk9MTF9MRUZULFxuICBzY3JvbGxSaWdodDogS0VZX1dPUkRTX1NDUk9MTF9SSUdIVCxcbiAgc2Nyb2xsVG9wOiBLRVlfV09SRFNfU0NST0xMX1RPUCxcbiAgc2Nyb2xsQm90dG9tOiBLRVlfV09SRFNfU0NST0xMX0JPVFRPTSxcbiAgc2Nyb2xsQ29udGludWU6IEtFWV9XT1JEU19TQ1JPTExfQ09OVElOVUVcbn1cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFZ1aVZvaWNlUmVjb2duaXRpb25TZXJ2aWNlIHtcbiAgcmVzcG9uc2U6IFN1YmplY3Q8VnVpUmVzcG9uc2U+ID0gbmV3IFN1YmplY3Q8VnVpUmVzcG9uc2U+KCk7XG5cbiAgaW5wdXRSZWZzOiBBcnJheTxFbGVtZW50UmVmPiA9IFtdO1xuICBjdXJyZW50UmVmOiBudW1iZXIgPSAwO1xuXG4gIGlzSW5wdXRTd2l0Y2goc3BlZWNoS2V5czogYW55W10sIGlucHV0VHlwZTogc3RyaW5nKSB7XG4gICAgaWYgKGlucHV0VHlwZSA9PSAnYWRkcmVzcycgJiYgIXNwZWVjaEtleXMuc29tZShrZXkgPT4gS0VZX1dPUkRTX0lOU1QuaW5jbHVkZXMoa2V5KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHNwZWVjaEtleXMuc29tZShrZXkgPT4gS0VZX1dPUkRTLmluY2x1ZGVzKGtleSkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZmluZEluc3RydWN0aW9uVHlwZShzcGVlY2hUZXh0OiBzdHJpbmcsIGlucHV0VHlwZTogc3RyaW5nKSB7XG4gICAgbGV0IHR5cGUgPSAnJztcbiAgICBzcGVlY2hUZXh0ID0gc3BlZWNoVGV4dC50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICBsZXQgc3BlZWNoS2V5cyA9IHNwZWVjaFRleHQudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCkuc3BsaXQoJyAnKTtcbiAgICBpZiAodGhpcy5pc0lucHV0U3dpdGNoKHNwZWVjaEtleXMsIGlucHV0VHlwZSkpIHtcbiAgICAgIGNvbnN0IGZvdW5kS2V5ID0gT2JqZWN0LmtleXMoSU5TVF9NQVBQSU5HUykuZmluZCgoaW5zdFR5cGU6IHN0cmluZykgPT4gc3BlZWNoS2V5cy5zb21lKGtleSA9PiBJTlNUX01BUFBJTkdTW2luc3RUeXBlXS5pbmNsdWRlcyhrZXkpKSk7XG4gICAgICB0eXBlID0gZm91bmRLZXkgPyBgQ09NTUFORF8ke2ZvdW5kS2V5LnRvVXBwZXJDYXNlKCl9YCA6ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlID0gJ0lOUFVUJztcbiAgICB9XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBpbnRlcnByZXRTcGVlY2goc3BlZWNoVGV4dDogc3RyaW5nLCBpbnB1dFR5cGU6IHN0cmluZykge1xuICAgIGxldCBpbnN0VHlwZSA9IHRoaXMuZmluZEluc3RydWN0aW9uVHlwZShzcGVlY2hUZXh0LCBpbnB1dFR5cGUpO1xuICAgIGlmIChpbnN0VHlwZSAhPSAnSU5QVVQnKSB7XG4gICAgICByZXR1cm4gaW5zdFR5cGU7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0VHlwZSA9PSAndGV4dCcgfHwgaW5wdXRUeXBlID09ICdhZGRyZXNzJykge1xuICAgICAgcmV0dXJuIHNwZWVjaFRleHQ7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0VHlwZSA9PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHRoaXMud29yZHNUb051bWJlcihzcGVlY2hUZXh0KTtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXRUeXBlID09ICdkYXRlJykge1xuICAgICAgc3BlZWNoVGV4dCA9IHNwZWVjaFRleHQucmVwbGFjZSgnZnJvbScsICcnKTtcbiAgICAgIGxldCBkYXRlcyA9ICBzcGVlY2hUZXh0LnRyaW0oKS5zcGxpdCgndG8gJyk7XG4gICAgICBsZXQgcGFyc2VkRGF0ZXM6IEFycmF5PGFueT4gPSBbXTtcbiAgICAgIGRhdGVzLmZvckVhY2goKGRhdGVTdHI6IHN0cmluZykgPT4ge1xuICAgICAgICBwYXJzZWREYXRlcy5wdXNoKHRoaXMuZGF0ZVBhcnNlcihkYXRlU3RyKSk7XG4gICAgICB9KTtcbiAgXG4gICAgICBpZiAocGFyc2VkRGF0ZXNbMF0uaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZWREYXRlcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkYXRlUGFyc2VyKGRhdGVTdHI6IHN0cmluZyk6IERhdGUge1xuICAgIGxldCBwYXJzZWREYXRlOiBEYXRlO1xuICAgIGxldCBjbGVhbkRhdGVTdHIgPSBkYXRlU3RyO1xuICAgIGxldCBkYXRlUGFydHMgPSBkYXRlU3RyLnRyaW0oKS5zcGxpdCgnICcpO1xuICAgIGxldCBkYXRlUGFydE9iajogYW55ID0ge307XG4gICAgbGV0IGlzUHVyZU51bWJlciA9IGZhbHNlO1xuICAgIGxldCBjbGVhbkRhdGVQYXJ0cyA9IFtdO1xuXG4gICAgaWYgKGRhdGVQYXJ0cy5sZW5ndGggPT0gMykge1xuICAgICAgY2xlYW5EYXRlUGFydHMgPSBkYXRlUGFydHMubWFwKChkYXRlU3RyKSA9PiB0aGlzLmVsaW1pbmF0ZVN0cmluZyhkYXRlU3RyKSk7XG4gICAgICBpc1B1cmVOdW1iZXIgPSBjbGVhbkRhdGVQYXJ0cy5ldmVyeSgoZGF0ZVN0cikgPT4gTnVtYmVyLmlzSW50ZWdlcihkYXRlU3RyKSk7XG4gICAgfVxuXG4gICAgaWYgKGlzUHVyZU51bWJlcikge1xuICAgICAgY2xlYW5EYXRlU3RyID0gY2xlYW5EYXRlUGFydHMuam9pbignLScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG1vbWVudCgpO1xuICAgICAgZGF0ZVBhcnRzLmZvckVhY2goKGRhdGVTdHIpID0+IHtcbiAgICAgICAgZGF0ZVBhcnRPYmogPSB0aGlzLnBhcnNlRGF0ZVBhcnQoZGF0ZVN0ciwgZGF0ZVBhcnRPYmopO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGF2YWlsYWJsZUtleXMgPSBPYmplY3Qua2V5cyhkYXRlUGFydE9iaikuam9pbignLScpO1xuICAgICBcbiAgICAgIHN3aXRjaCAoYXZhaWxhYmxlS2V5cykge1xuICAgICAgICBjYXNlICdkYXRlJzogXG4gICAgICAgICAgZGF0ZVBhcnRPYmoubW9udGggPSBjdXJyZW50RGF0ZS5mb3JtYXQoJ01NJyk7XG4gICAgICAgIGNhc2UgJ2RhdGUtbW9udGgnOlxuICAgICAgICAgIGRhdGVQYXJ0T2JqLnllYXIgPSBjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVknKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgZGF0ZVBhcnRPYmoubW9udGggPSAnMDEnO1xuICAgICAgICBjYXNlICdtb250aC15ZWFyJzpcbiAgICAgICAgICBkYXRlUGFydE9iai5kYXRlID0gJzAxJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgIGRhdGVQYXJ0T2JqLnllYXIgPSBjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVknKTtcbiAgICAgICAgICBkYXRlUGFydE9iai5kYXRlID0gJzAxJztcbiAgICAgIH1cbiAgICAgIGNsZWFuRGF0ZVN0ciA9IHRoaXMuZGF0ZUJ1aWxkZXIoZGF0ZVBhcnRPYmopO1xuICAgIH1cbiAgICBwYXJzZWREYXRlID0gbW9tZW50KGNsZWFuRGF0ZVN0cikudG9EYXRlKCk7XG4gICAgcmV0dXJuIHBhcnNlZERhdGU7XG4gIH1cblxuICBkYXRlQnVpbGRlcihkYXRlUGFydE9iajogYW55KTogc3RyaW5nIHtcbiAgICBsZXQgZGF0ZVN0ciA9ICcnO1xuICAgIGRhdGVTdHIgPSBgJHtkYXRlUGFydE9iai55ZWFyfS0ke2RhdGVQYXJ0T2JqLm1vbnRofS0ke2RhdGVQYXJ0T2JqLmRhdGV9YDtcbiAgICByZXR1cm4gZGF0ZVN0cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBcbiAgICogQHBhcmFtIGRhdGVQYXJ0IEluY29tcGxldGUgZGF0ZSBwYXJ0IGVnLCAnMjFzdCcgaXMgdGhlIGRhdGUgcGFydCBmb3IgdGhlIGRhdGUgJzIxc3QgSnVseSAyMDIwJ1xuICAgKiBAcGFyYW0gZGF0ZVBhcnRPYmogLy8gSW5oZXJpdGVkIGZyb20gY2FsbGVyICYgdXBkYXRlZCB3aXRoIHBhcnNlZCBvYmplY3QuIENhbiBiZSB5ZWFyLCBtb250aCBvciBkYXRlXG4gICAqL1xuICBwYXJzZURhdGVQYXJ0KGRhdGVQYXJ0OiBzdHJpbmcsIGRhdGVQYXJ0T2JqOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzWWVhclR5cGUoZGF0ZVBhcnQpKSB7XG4gICAgICBjb25zdCB5ZWFyID0gdGhpcy53b3Jkc1RvTnVtYmVyKGRhdGVQYXJ0KTtcbiAgICAgIGRhdGVQYXJ0T2JqLnllYXIgPSB5ZWFyO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0RhdGVUeXBlKGRhdGVQYXJ0KSkge1xuICAgICAgY29uc3QgZGF0ZSA9IHRoaXMud29yZHNUb051bWJlcihkYXRlUGFydCk7XG4gICAgICBkYXRlUGFydE9iai5kYXRlID0gZGF0ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNNb250aFR5cGUoZGF0ZVBhcnQpKSB7XG4gICAgICBjb25zdCBtb250aCA9IE1PTlRIUy5pbmRleE9mKGRhdGVQYXJ0LnRvVXBwZXJDYXNlKCkpICsgMTtcbiAgICAgIGRhdGVQYXJ0T2JqLm1vbnRoID0gbW9udGggPCAxMCA/ICcwJyArIG1vbnRoIDogbW9udGg7XG4gICAgfVxuICAgIHJldHVybiBkYXRlUGFydE9iajtcbiAgfVxuXG4gIGlzRGF0ZVR5cGUoZGF0ZVBhcnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCBpc0RhdGVQYXJ0ID0gZmFsc2U7XG4gICAgaXNEYXRlUGFydCA9ICgvXFxkLy50ZXN0KGRhdGVQYXJ0KSAmJiBTVUZGSVhFUy5pbmNsdWRlcyhkYXRlUGFydC5zdWJzdHIoIGRhdGVQYXJ0Lmxlbmd0aCAtIDIpKSk7XG5cbiAgICBpZiAoIWlzRGF0ZVBhcnQpIHtcbiAgICAgIGNvbnN0IG51bWJlciA9IHRoaXMud29yZHNUb051bWJlcihkYXRlUGFydCk7XG4gICAgICBpZiAobnVtYmVyID4gMCAmJiBudW1iZXIgPD0gMzEpIHtcbiAgICAgICAgaXNEYXRlUGFydCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpc0RhdGVQYXJ0O1xuICB9XG5cbiAgcGFyc2VEYXRlVmFsKGRhdGVQYXJ0LCBkYXRlUGFydE9iaikge1xuICAgIGxldCBpc0RhdGVQYXJ0ID0gZmFsc2U7XG4gICAgbGV0IGNvbnZlcnRlZE51bSA9IDA7XG4gICAgaXNEYXRlUGFydCA9IFNVRkZJWEVTLnNvbWUoKGtleSkgPT4ge1xuICAgICAgcmV0dXJuIGRhdGVQYXJ0LmluY2x1ZGVzKGtleSk7XG4gICAgfSk7XG5cbiAgICBpZiAoIWlzRGF0ZVBhcnQpIHtcbiAgICAgIGNvbnZlcnRlZE51bSA9IHRoaXMud29yZHNUb051bWJlcihkYXRlUGFydCk7XG4gICAgICBpZiAoY29udmVydGVkTnVtID4gMCAmJiBjb252ZXJ0ZWROdW0gPD0gMzEpIHtcbiAgICAgICAgaXNEYXRlUGFydCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzRGF0ZVBhcnQpIHtcbiAgICAgIGRhdGVQYXJ0T2JqLmRhdGUgPSBjb252ZXJ0ZWROdW07XG4gICAgfVxuICB9XG5cbiAgaXNNb250aFR5cGUoZGF0ZVBhcnQpIHtcbiAgICBjb25zdCBtb250aCA9IE1PTlRIUy5pbmRleE9mKGRhdGVQYXJ0LnRvVXBwZXJDYXNlKCkpO1xuICAgIHJldHVybiBtb250aCA+IC0xO1xuICB9XG5cbiAgcGFyc2VNb250aFZhbChkYXRlUGFydCwgZGF0ZVBhcnRPYmopIHtcbiAgICBjb25zdCBtb250aCA9IE1PTlRIUy5pbmRleE9mKGRhdGVQYXJ0LnRvVXBwZXJDYXNlKCkpO1xuICAgIGlmIChtb250aCA+IC0xKSB7XG4gICAgICBkYXRlUGFydE9iai5tb250aCA9IG1vbnRoIDwgMTAgPyAnMCcgKyBtb250aCA6IG1vbnRoO1xuICAgIH1cbiAgfVxuXG4gIGlzWWVhclR5cGUoZGF0ZVBhcnQpIHtcbiAgICBsZXQgeWVhciA9IHRoaXMud29yZHNUb051bWJlcihkYXRlUGFydCk7XG4gICAgcmV0dXJuIHllYXIgPiAxMDAwO1xuICB9XG5cbiAgcGFyc2VZZWFyVmFsKGRhdGVQYXJ0LCBkYXRlUGFydE9iaikge1xuICAgIGNvbnN0IHllYXIgPSB0aGlzLndvcmRzVG9OdW1iZXIoZGF0ZVBhcnQpO1xuICAgIGlmICh5ZWFyID4gMTAwMCkge1xuICAgICAgZGF0ZVBhcnRPYmoueWVhciA9IHllYXI7XG4gICAgfVxuICB9XG5cbiAgd29yZHNUb051bWJlcih3b3JkKSB7XG4gICAgXG4gICAgLy8gUmV0dXJuaW5nIGludGVnZXIgaWYgaXQgaXMgbm90IGFjdHVhbCB3b3JkXG4gICAgaWYgKCFOdW1iZXIuaXNOYU4ocGFyc2VJbnQod29yZCkpKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQod29yZCk7XG4gICAgfVxuXG4gICAgd29yZCA9IHdvcmQucmVwbGFjZSgvYW5kL2csICcnKTsgLy8gUmVwbGFjZSBqb2luZXJzXG4gICAgbGV0IHdvcmRzID0gd29yZC50b0xvd2VyQ2FzZSgpLnRyaW0oKS5zcGxpdCgnICcpO1xuICAgIGxldCBudW0gPSAwO1xuICAgIGxldCBudW1TdHIgPSAnJztcbiAgICBsZXQgdGVucyA9IDA7XG4gICAgXG4gICAgd29yZHMgPSB0aGlzLnBhcnNlQ29sbG9xdWlhbFdvcmRzKHdvcmRzKTtcbiAgICAgXG4gICAgd29yZHMuZm9yRWFjaCh3b3JkU3RyID0+IHtcbiAgICAgIHdvcmRTdHIgPSB0aGlzLmVsaW1pbmF0ZVN0cmluZyh3b3JkU3RyKTtcbiAgICAgIGlmICh0eXBlb2Ygd29yZFN0ciA9PSAnbnVtYmVyJykge1xuICAgICAgICBudW0gPSB3b3JkU3RyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFVOSVRbd29yZFN0cl0pIHtcbiAgICAgICAgICBudW0gPSBudW0gKyAgTlVNQkVSW3dvcmRTdHJdO1xuICAgICAgICB9IGVsc2UgaWYgKFRFTlt3b3JkU3RyXSkge1xuICAgICAgICAgIG51bSA9IG51bSArIFRFTlt3b3JkU3RyXTtcbiAgICAgICAgfSBlbHNlIGlmIChNQUdOSVRVREVbd29yZFN0cl0pIHsgXG4gICAgICAgICAgbnVtID0gbnVtICogTUFHTklUVURFW3dvcmRTdHJdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICByZXR1cm4gbnVtO1xuICB9XG5cbiAgcGFyc2VDb2xsb3F1aWFsV29yZHMod29yZHNBcnIpIHtcbiAgICBpZiAod29yZHNBcnIubGVuZ3RoID09IDIpIHtcbiAgICAgIGlmIChURU5bd29yZHNBcnJbMF1dICYmIChURU5bd29yZHNBcnJbMV1dIHx8IFRXT1Nbd29yZHNBcnJbMV1dKSkge1xuICAgICAgICB3b3Jkc0Fyci5zcGxpY2UoMSwgMCwgJ2h1bmRyZWQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKE1BR05JVFVERVt3b3Jkc0FyclswXV0pIHtcbiAgICAgIHdvcmRzQXJyLnNwbGljZSgwLCAwLCAnb25lJyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB3b3Jkc0FycjtcbiAgfVxuXG4gIGVsaW1pbmF0ZVN0cmluZyh3b3JkKSB7XG4gICAgaWYgKC9cXGQvLnRlc3Qod29yZCkgJiYgU1VGRklYRVMuaW5jbHVkZXMod29yZC5zdWJzdHIoIHdvcmQubGVuZ3RoIC0gMikpKSB7XG4gICAgICB3b3JkID0gd29yZC5zdWJzdHIoMCwgd29yZC5sZW5ndGggLSAyKTsgLy8gUmVtb3ZlIGxhc3Qgc3VmZml4ZXMgc3VjaCBhcyAnc3QnLCAndGgnIGZyb20gMXN0LCAxMHRoXG4gICAgICB3b3JkID0gcGFyc2VJbnQod29yZCk7XG4gICAgfVxuICAgIHJldHVybiB3b3JkO1xuICB9XG59XG4iXX0=