UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

445 lines 55.9 kB
import { __values } from "tslib"; /** * @hidden */ export var MASK_FLAGS = ['C', '&', 'a', 'A', '?', 'L', '9', '0', '#']; /** * @hidden */ export var KEYS = { Ctrl: 17, Z: 90, Y: 89, X: 88, BACKSPACE: 8, DELETE: 46 }; /** * @hidden */ var MaskHelper = /** @class */ (function () { function MaskHelper() { } Object.defineProperty(MaskHelper.prototype, "cursor", { get: function () { return this._cursor; }, enumerable: true, configurable: true }); MaskHelper.prototype.parseValueByMask = function (value, maskOptions, cursor) { var inputValue = value; var mask = maskOptions.format; var literals = this.getMaskLiterals(mask); var literalKeys = Array.from(literals.keys()); var nonLiteralIndeces = this.getNonLiteralIndeces(mask, literalKeys); if (inputValue.length < mask.length) { // BACKSPACE, DELETE if (inputValue === '' && cursor === -1) { this._cursor = 0; return this.parseValueByMaskOnInit(value, maskOptions); } // workaround for IE 'x' button if (nonLiteralIndeces.indexOf(cursor + 1) !== -1) { inputValue = this.insertCharAt(inputValue, cursor + 1, maskOptions.promptChar); this._cursor = cursor + 1; } else { inputValue = this.insertCharAt(inputValue, cursor + 1, mask[cursor + 1]); this._cursor = cursor + 1; for (var i = this._cursor; i < 0; i--) { if (literalKeys.indexOf(this._cursor) !== -1) { this._cursor--; } else { break; } } } } else { var char = inputValue[cursor]; var isCharValid = this.validateCharOnPostion(char, cursor, mask); if (nonLiteralIndeces.indexOf(cursor) !== -1) { inputValue = this.replaceCharAt(inputValue, cursor, ''); if (isCharValid) { inputValue = this.replaceCharAt(inputValue, cursor, char); this._cursor = cursor + 1; } else { this._cursor = cursor; } } else { inputValue = this.replaceCharAt(inputValue, cursor, ''); this._cursor = ++cursor; for (var i = cursor; i < mask.length; i++) { if (literalKeys.indexOf(this._cursor) !== -1) { this._cursor = ++cursor; } else { isCharValid = this.validateCharOnPostion(char, cursor, mask); if (isCharValid) { inputValue = this.replaceCharAt(inputValue, cursor, char); this._cursor = ++cursor; break; } else { break; } } } } } return inputValue; }; MaskHelper.prototype.parseMask = function (maskOptions) { var e_1, _a; var _this = this; var outputVal = ''; var mask = maskOptions.format; var literals = this.getMaskLiterals(mask); try { for (var mask_1 = __values(mask), mask_1_1 = mask_1.next(); !mask_1_1.done; mask_1_1 = mask_1.next()) { var maskSym = mask_1_1.value; outputVal += maskOptions.promptChar; } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (mask_1_1 && !mask_1_1.done && (_a = mask_1.return)) _a.call(mask_1); } finally { if (e_1) throw e_1.error; } } literals.forEach(function (val, key) { outputVal = _this.replaceCharAt(outputVal, key, val); }); return outputVal; }; MaskHelper.prototype.parseValueByMaskOnInit = function (inputVal, maskOptions) { var e_2, _a, e_3, _b; var _this = this; var outputVal = ''; var value = ''; var mask = maskOptions.format; var literals = this.getMaskLiterals(mask); var literalKeys = Array.from(literals.keys()); var nonLiteralIndeces = this.getNonLiteralIndeces(mask, literalKeys); var literalValues = Array.from(literals.values()); if (inputVal != null) { value = inputVal.toString(); } try { for (var mask_2 = __values(mask), mask_2_1 = mask_2.next(); !mask_2_1.done; mask_2_1 = mask_2.next()) { var maskSym = mask_2_1.value; outputVal += maskOptions.promptChar; } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (mask_2_1 && !mask_2_1.done && (_a = mask_2.return)) _a.call(mask_2); } finally { if (e_2) throw e_2.error; } } literals.forEach(function (val, key) { outputVal = _this.replaceCharAt(outputVal, key, val); }); if (!value) { return outputVal; } var nonLiteralValues = this.getNonLiteralValues(value, literalValues); for (var i = 0; i < nonLiteralValues.length; i++) { var char = nonLiteralValues[i]; var isCharValid = this.validateCharOnPostion(char, nonLiteralIndeces[i], mask); if (!isCharValid && char !== maskOptions.promptChar) { nonLiteralValues[i] = maskOptions.promptChar; } } if (nonLiteralValues.length > nonLiteralIndeces.length) { nonLiteralValues.splice(nonLiteralIndeces.length); } var pos = 0; try { for (var nonLiteralValues_1 = __values(nonLiteralValues), nonLiteralValues_1_1 = nonLiteralValues_1.next(); !nonLiteralValues_1_1.done; nonLiteralValues_1_1 = nonLiteralValues_1.next()) { var nonLiteralValue = nonLiteralValues_1_1.value; var char = nonLiteralValue; outputVal = this.replaceCharAt(outputVal, nonLiteralIndeces[pos++], char); } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (nonLiteralValues_1_1 && !nonLiteralValues_1_1.done && (_b = nonLiteralValues_1.return)) _b.call(nonLiteralValues_1); } finally { if (e_3) throw e_3.error; } } return outputVal; }; MaskHelper.prototype.restoreValueFromMask = function (value, maskOptions) { var e_4, _a; var outputVal = ''; var mask = maskOptions.format; var literals = this.getMaskLiterals(mask); var literalValues = Array.from(literals.values()); try { for (var value_1 = __values(value), value_1_1 = value_1.next(); !value_1_1.done; value_1_1 = value_1.next()) { var val = value_1_1.value; if (literalValues.indexOf(val) === -1) { if (val !== maskOptions.promptChar) { outputVal += val; } } } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (value_1_1 && !value_1_1.done && (_a = value_1.return)) _a.call(value_1); } finally { if (e_4) throw e_4.error; } } return outputVal; }; MaskHelper.prototype.parseValueByMaskUponSelection = function (value, maskOptions, cursor, selection) { var isCharValid; var inputValue = value; var char = inputValue[cursor]; var mask = maskOptions.format; var literals = this.getMaskLiterals(mask); var literalKeys = Array.from(literals.keys()); var nonLiteralIndeces = this.getNonLiteralIndeces(mask, literalKeys); if (!this.data) { this._cursor = cursor < 0 ? ++cursor : cursor; if (nonLiteralIndeces.indexOf(this._cursor) !== -1) { isCharValid = this.validateCharOnPostion(char, this._cursor, mask); inputValue = isCharValid ? this.replaceCharAt(inputValue, this._cursor++, char) : inputValue = this.replaceCharAt(inputValue, this._cursor++, maskOptions.promptChar); selection--; if (selection > 0) { for (var i = 0; i < selection; i++) { cursor++; inputValue = nonLiteralIndeces.indexOf(cursor) !== -1 ? this.insertCharAt(inputValue, cursor, maskOptions.promptChar) : this.insertCharAt(inputValue, cursor, mask[cursor]); } } } else { inputValue = this.replaceCharAt(inputValue, this._cursor, mask[this._cursor]); this._cursor++; selection--; var isMarked = false; if (selection > 0) { cursor = this._cursor; for (var i = 0; i < selection; i++) { if (nonLiteralIndeces.indexOf(cursor) !== -1) { isCharValid = this.validateCharOnPostion(char, cursor, mask); if (isCharValid && !isMarked) { inputValue = this.insertCharAt(inputValue, cursor, char); cursor++; this._cursor++; isMarked = true; } else { inputValue = this.insertCharAt(inputValue, cursor, maskOptions.promptChar); cursor++; } } else { inputValue = this.insertCharAt(inputValue, cursor, mask[cursor]); if (cursor === this._cursor) { this._cursor++; } cursor++; } } } } } else { if (inputValue === '' && cursor === -1) { this._cursor = 0; return this.parseValueByMaskOnInit(value, maskOptions); } // workaround for IE 'x' button if (this._cursor < 0) { this._cursor++; cursor++; } cursor++; this._cursor = cursor; for (var i = 0; i < selection; i++) { if (nonLiteralIndeces.indexOf(cursor) !== -1) { inputValue = this.insertCharAt(inputValue, cursor, maskOptions.promptChar); cursor++; } else { inputValue = this.insertCharAt(inputValue, cursor, mask[cursor]); cursor++; } } } return inputValue; }; MaskHelper.prototype.parseValueByMaskUponCopyPaste = function (value, maskOptions, cursor, clipboardData, selection) { var e_5, _a; var inputValue = value; var mask = maskOptions.format; var literals = this.getMaskLiterals(mask); var literalKeys = Array.from(literals.keys()); var nonLiteralIndeces = this.getNonLiteralIndeces(mask, literalKeys); var selectionEnd = cursor + selection; this._cursor = cursor; try { for (var clipboardData_1 = __values(clipboardData), clipboardData_1_1 = clipboardData_1.next(); !clipboardData_1_1.done; clipboardData_1_1 = clipboardData_1.next()) { var clipboardSym = clipboardData_1_1.value; var char = clipboardSym; if (this._cursor > mask.length) { return inputValue; } if (nonLiteralIndeces.indexOf(this._cursor) !== -1) { var isCharValid = this.validateCharOnPostion(char, this._cursor, mask); if (isCharValid) { inputValue = this.replaceCharAt(inputValue, this._cursor++, char); } } else { for (var i = cursor; i < mask.length; i++) { if (literalKeys.indexOf(this._cursor) !== -1) { this._cursor++; } else { var isCharValid = this.validateCharOnPostion(char, this._cursor, mask); if (isCharValid) { inputValue = this.replaceCharAt(inputValue, this._cursor++, char); } break; } } } selection--; } } catch (e_5_1) { e_5 = { error: e_5_1 }; } finally { try { if (clipboardData_1_1 && !clipboardData_1_1.done && (_a = clipboardData_1.return)) _a.call(clipboardData_1); } finally { if (e_5) throw e_5.error; } } if (selection > 0) { for (var i = this._cursor; i < selectionEnd; i++) { if (literalKeys.indexOf(this._cursor) !== -1) { this._cursor++; } else { inputValue = this.replaceCharAt(inputValue, this._cursor++, maskOptions.promptChar); } } } return inputValue; }; MaskHelper.prototype.validateCharOnPostion = function (inputChar, position, mask) { var regex; var isValid; var letterOrDigitRegEx = '[\\d\\u00C0-\\u1FFF\\u2C00-\\uD7FFa-zA-Z]'; var letterDigitOrSpaceRegEx = '[\\d\\u00C0-\\u1FFF\\u2C00-\\uD7FFa-zA-Z\\u0020]'; var letterRegEx = '[\\u00C0-\\u1FFF\\u2C00-\\uD7FFa-zA-Z]'; var letteSpaceRegEx = '[\\u00C0-\\u1FFF\\u2C00-\\uD7FFa-zA-Z\\u0020]'; var digitRegEx = '[\\d]'; var digitSpaceRegEx = '[\\d\\u0020]'; var digitSpecialRegEx = '[\\d-\\+]'; switch (mask.charAt(position)) { case 'C': isValid = inputChar !== ''; break; case '&': regex = new RegExp('[\\u0020]'); isValid = !regex.test(inputChar); break; case 'a': regex = new RegExp(letterDigitOrSpaceRegEx); isValid = regex.test(inputChar); break; case 'A': regex = new RegExp(letterOrDigitRegEx); isValid = regex.test(inputChar); break; case '?': regex = new RegExp(letteSpaceRegEx); isValid = regex.test(inputChar); break; case 'L': regex = new RegExp(letterRegEx); isValid = regex.test(inputChar); break; case '0': regex = new RegExp(digitRegEx); isValid = regex.test(inputChar); break; case '9': regex = new RegExp(digitSpaceRegEx); isValid = regex.test(inputChar); break; case '#': regex = new RegExp(digitSpecialRegEx); isValid = regex.test(inputChar); break; default: { isValid = null; } } return isValid; }; MaskHelper.prototype.replaceCharAt = function (strValue, index, char) { if (strValue !== undefined) { return strValue.substring(0, index) + char + strValue.substring(index + 1); } }; MaskHelper.prototype.insertCharAt = function (strValue, index, char) { if (strValue !== undefined) { return strValue.substring(0, index) + char + strValue.substring(index); } }; MaskHelper.prototype.getMaskLiterals = function (mask) { var literals = new Map(); for (var i = 0; i < mask.length; i++) { var char = mask.charAt(i); if (MASK_FLAGS.indexOf(char) === -1) { literals.set(i, char); } } return literals; }; MaskHelper.prototype.getNonLiteralIndeces = function (mask, literalKeys) { var nonLiteralsIndeces = new Array(); for (var i = 0; i < mask.length; i++) { if (literalKeys.indexOf(i) === -1) { nonLiteralsIndeces.push(i); } } return nonLiteralsIndeces; }; MaskHelper.prototype.getNonLiteralValues = function (value, literalValues) { var e_6, _a; var nonLiteralValues = new Array(); try { for (var value_2 = __values(value), value_2_1 = value_2.next(); !value_2_1.done; value_2_1 = value_2.next()) { var val = value_2_1.value; if (literalValues.indexOf(val) === -1) { nonLiteralValues.push(val); } } } catch (e_6_1) { e_6 = { error: e_6_1 }; } finally { try { if (value_2_1 && !value_2_1.done && (_a = value_2.return)) _a.call(value_2); } finally { if (e_6) throw e_6.error; } } return nonLiteralValues; }; return MaskHelper; }()); export { MaskHelper }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay1oZWxwZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvbWFzay9tYXNrLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7QUFDSCxNQUFNLENBQUMsSUFBTSxVQUFVLEdBQUcsQ0FBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBRSxDQUFDO0FBRTFFOztHQUVHO0FBQ0gsTUFBTSxDQUFDLElBQU0sSUFBSSxHQUFHO0lBQ2hCLElBQUksRUFBRyxFQUFFO0lBQ1QsQ0FBQyxFQUFHLEVBQUU7SUFDTixDQUFDLEVBQUcsRUFBRTtJQUNOLENBQUMsRUFBRyxFQUFFO0lBQ04sU0FBUyxFQUFHLENBQUM7SUFDYixNQUFNLEVBQUcsRUFBRTtDQUNaLENBQUM7QUFHSjs7R0FFRztBQUNIO0lBQUE7SUEyWEEsQ0FBQztJQXpYRyxzQkFBVyw4QkFBTTthQUFqQjtZQUNJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN4QixDQUFDOzs7T0FBQTtJQUdNLHFDQUFnQixHQUF2QixVQUF3QixLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU07UUFDOUMsSUFBSSxVQUFVLEdBQVcsS0FBSyxDQUFDO1FBQy9CLElBQU0sSUFBSSxHQUFXLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDeEMsSUFBTSxRQUFRLEdBQXdCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakUsSUFBTSxXQUFXLEdBQWEsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFNLGlCQUFpQixHQUFhLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFakYsSUFBSSxVQUFV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QUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUMvQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDOUI7U0FDSjtRQUVELE9BQU8sa0JBQWtCLENBQUM7SUFDOUIsQ0FBQztJQUNPLHdDQUFtQixHQUEzQixVQUE0QixLQUFhLEVBQUUsYUFBdUI7O1FBQzlELElBQU0sZ0JBQWdCLEdBQWEsSUFBSSxLQUFLLEVBQUUsQ0FBQzs7WUFFL0MsS0FBa0IsSUFBQSxVQUFBLFNBQUEsS0FBSyxDQUFBLDRCQUFBLCtDQUFFO2dCQUFwQixJQUFNLEdBQUcsa0JBQUE7Z0JBQ1YsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNuQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQzlCO2FBQ0o7Ozs7Ozs7OztRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDNUIsQ0FBQztJQUNMLGlCQUFDO0FBQUQsQ0FBQyxBQTNYRCxJQTJYQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgTUFTS19GTEFHUyA9IFsgJ0MnLCAnJicsICdhJywgJ0EnLCAnPycsICdMJywgJzknLCAnMCcsICcjJyBdO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IEtFWVMgPSB7XG4gICAgQ3RybCA6IDE3LFxuICAgIFogOiA5MCxcbiAgICBZIDogODksXG4gICAgWCA6IDg4LFxuICAgIEJBQ0tTUEFDRSA6IDgsXG4gICAgREVMRVRFIDogNDZcbiAgfTtcblxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hc2tIZWxwZXIge1xuICAgIHByaXZhdGUgX2N1cnNvcjtcbiAgICBwdWJsaWMgZ2V0IGN1cnNvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnNvcjtcbiAgICB9XG4gICAgcHVibGljIGRhdGE6IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgcGFyc2VWYWx1ZUJ5TWFzayh2YWx1ZSwgbWFza09wdGlvbnMsIGN1cnNvcik6IHN0cmluZyB7XG4gICAgICAgIGxldCBpbnB1dFZhbHVlOiBzdHJpbmcgPSB2YWx1ZTtcbiAgICAgICAgY29uc3QgbWFzazogc3RyaW5nID0gbWFza09wdGlvbnMuZm9ybWF0O1xuICAgICAgICBjb25zdCBsaXRlcmFsczogTWFwPG51bWJlciwgc3RyaW5nPiA9IHRoaXMuZ2V0TWFza0xpdGVyYWxzKG1hc2spO1xuICAgICAgICBjb25zdCBsaXRlcmFsS2V5czogbnVtYmVyW10gPSBBcnJheS5mcm9tKGxpdGVyYWxzLmtleXMoKSk7XG4gICAgICAgIGNvbnN0IG5vbkxpdGVyYWxJbmRlY2VzOiBudW1iZXJbXSA9IHRoaXMuZ2V0Tm9uTGl0ZXJhbEluZGVjZXMobWFzaywgbGl0ZXJhbEtleXMpO1xuXG4gICAgICAgIGlmIChpbnB1dFZhbHVlLmxlbmd0aCA8IG1hc2subGVuZ3RoKSB7IC8vIEJBQ0tTUEFDRSwgREVMRVRFXG4gICAgICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gJycgJiYgY3Vyc29yID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvciA9IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWYWx1ZUJ5TWFza09uSW5pdCh2YWx1ZSwgbWFza09wdGlvbnMpO1xuICAgICAgICAgICAgfSAvLyB3b3JrYXJvdW5kIGZvciBJRSAneCcgYnV0dG9uXG5cbiAgICAgICAgICAgIGlmIChub25MaXRlcmFsSW5kZWNlcy5pbmRleE9mKGN1cnNvciArIDEpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLmluc2VydENoYXJBdChpbnB1dFZhbHVlLCBjdXJzb3IgKyAxLCBtYXNrT3B0aW9ucy5wcm9tcHRDaGFyKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3IgPSBjdXJzb3IgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5pbnNlcnRDaGFyQXQoaW5wdXRWYWx1ZSwgY3Vyc29yICsgMSwgbWFza1tjdXJzb3IgKyAxXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yID0gY3Vyc29yICsgMTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5fY3Vyc29yOyBpIDwgMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXRlcmFsS2V5cy5pbmRleE9mKHRoaXMuX2N1cnNvcikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3ItLTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IGlucHV0VmFsdWVbY3Vyc29yXTtcbiAgICAgICAgICAgIGxldCBpc0NoYXJWYWxpZCA9IHRoaXMudmFsaWRhdGVDaGFyT25Qb3N0aW9uKGNoYXIsIGN1cnNvciwgbWFzayk7XG4gICAgICAgICAgICBpZiAobm9uTGl0ZXJhbEluZGVjZXMuaW5kZXhPZihjdXJzb3IpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLnJlcGxhY2VDaGFyQXQoaW5wdXRWYWx1ZSwgY3Vyc29yLCAnJyk7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ2hhclZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLnJlcGxhY2VDaGFyQXQoaW5wdXRWYWx1ZSwgY3Vyc29yLCBjaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yID0gY3Vyc29yICsgMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3IgPSBjdXJzb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5yZXBsYWNlQ2hhckF0KGlucHV0VmFsdWUsIGN1cnNvciwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvciA9ICsrY3Vyc29yO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBjdXJzb3I7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXRlcmFsS2V5cy5pbmRleE9mKHRoaXMuX2N1cnNvcikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3IgPSArK2N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hhclZhbGlkID0gdGhpcy52YWxpZGF0ZUNoYXJPblBvc3Rpb24oY2hhciwgY3Vyc29yLCBtYXNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0NoYXJWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLnJlcGxhY2VDaGFyQXQoaW5wdXRWYWx1ZSwgY3Vyc29yLCBjaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3IgPSArK2N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VNYXNrKG1hc2tPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG91dHB1dFZhbCA9ICcnO1xuICAgICAgICBjb25zdCBtYXNrOiBzdHJpbmcgPSBtYXNrT3B0aW9ucy5mb3JtYXQ7XG4gICAgICAgIGNvbnN0IGxpdGVyYWxzOiBNYXA8bnVtYmVyLCBzdHJpbmc+ID0gdGhpcy5nZXRNYXNrTGl0ZXJhbHMobWFzayk7XG5cbiAgICAgICAgZm9yIChjb25zdCBtYXNrU3ltIG9mIG1hc2spIHtcbiAgICAgICAgICAgIG91dHB1dFZhbCArPSBtYXNrT3B0aW9ucy5wcm9tcHRDaGFyO1xuICAgICAgICB9XG5cbiAgICAgICAgbGl0ZXJhbHMuZm9yRWFjaCgodmFsOiBzdHJpbmcsIGtleTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBvdXRwdXRWYWwgPSB0aGlzLnJlcGxhY2VDaGFyQXQob3V0cHV0VmFsLCBrZXksIHZhbCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBvdXRwdXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVmFsdWVCeU1hc2tPbkluaXQoaW5wdXRWYWwsIG1hc2tPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG91dHB1dFZhbCA9ICcnO1xuICAgICAgICBsZXQgdmFsdWUgPSAnJztcbiAgICAgICAgY29uc3QgbWFzazogc3RyaW5nID0gbWFza09wdGlvbnMuZm9ybWF0O1xuICAgICAgICBjb25zdCBsaXRlcmFsczogTWFwPG51bWJlciwgc3RyaW5nPiA9IHRoaXMuZ2V0TWFza0xpdGVyYWxzKG1hc2spO1xuICAgICAgICBjb25zdCBsaXRlcmFsS2V5czogbnVtYmVyW10gPSBBcnJheS5mcm9tKGxpdGVyYWxzLmtleXMoKSk7XG4gICAgICAgIGNvbnN0IG5vbkxpdGVyYWxJbmRlY2VzOiBudW1iZXJbXSA9IHRoaXMuZ2V0Tm9uTGl0ZXJhbEluZGVjZXMobWFzaywgbGl0ZXJhbEtleXMpO1xuICAgICAgICBjb25zdCBsaXRlcmFsVmFsdWVzOiBzdHJpbmdbXSA9IEFycmF5LmZyb20obGl0ZXJhbHMudmFsdWVzKCkpO1xuXG4gICAgICAgIGlmIChpbnB1dFZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGlucHV0VmFsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IG1hc2tTeW0gb2YgbWFzaykge1xuICAgICAgICAgICAgb3V0cHV0VmFsICs9IG1hc2tPcHRpb25zLnByb21wdENoYXI7XG4gICAgICAgIH1cblxuICAgICAgICBsaXRlcmFscy5mb3JFYWNoKCh2YWw6IHN0cmluZywga2V5OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIG91dHB1dFZhbCA9IHRoaXMucmVwbGFjZUNoYXJBdChvdXRwdXRWYWwsIGtleSwgdmFsKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dFZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vbkxpdGVyYWxWYWx1ZXM6IHN0cmluZ1tdID0gdGhpcy5nZXROb25MaXRlcmFsVmFsdWVzKHZhbHVlLCBsaXRlcmFsVmFsdWVzKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vbkxpdGVyYWxWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBub25MaXRlcmFsVmFsdWVzW2ldO1xuICAgICAgICAgICAgY29uc3QgaXNDaGFyVmFsaWQgPSB0aGlzLnZhbGlkYXRlQ2hhck9uUG9zdGlvbihjaGFyLCBub25MaXRlcmFsSW5kZWNlc1tpXSwgbWFzayk7XG5cbiAgICAgICAgICAgIGlmICghaXNDaGFyVmFsaWQgJiYgY2hhciAhPT0gbWFza09wdGlvbnMucHJvbXB0Q2hhcikge1xuICAgICAgICAgICAgICAgIG5vbkxpdGVyYWxWYWx1ZXNbaV0gPSBtYXNrT3B0aW9ucy5wcm9tcHRDaGFyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vbkxpdGVyYWxWYWx1ZXMubGVuZ3RoID4gbm9uTGl0ZXJhbEluZGVjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBub25MaXRlcmFsVmFsdWVzLnNwbGljZShub25MaXRlcmFsSW5kZWNlcy5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICAgIGZvciAoY29uc3Qgbm9uTGl0ZXJhbFZhbHVlIG9mIG5vbkxpdGVyYWxWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBub25MaXRlcmFsVmFsdWU7XG4gICAgICAgICAgICBvdXRwdXRWYWwgPSB0aGlzLnJlcGxhY2VDaGFyQXQob3V0cHV0VmFsLCBub25MaXRlcmFsSW5kZWNlc1twb3MrK10sIGNoYXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzdG9yZVZhbHVlRnJvbU1hc2sodmFsdWUsIG1hc2tPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG91dHB1dFZhbCA9ICcnO1xuICAgICAgICBjb25zdCBtYXNrOiBzdHJpbmcgPSBtYXNrT3B0aW9ucy5mb3JtYXQ7XG4gICAgICAgIGNvbnN0IGxpdGVyYWxzOiBNYXA8bnVtYmVyLCBzdHJpbmc+ID0gdGhpcy5nZXRNYXNrTGl0ZXJhbHMobWFzayk7XG4gICAgICAgIGNvbnN0IGxpdGVyYWxWYWx1ZXM6IHN0cmluZ1tdID0gQXJyYXkuZnJvbShsaXRlcmFscy52YWx1ZXMoKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChsaXRlcmFsVmFsdWVzLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsICE9PSBtYXNrT3B0aW9ucy5wcm9tcHRDaGFyKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFZhbCArPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VWYWx1ZUJ5TWFza1Vwb25TZWxlY3Rpb24odmFsdWUsIG1hc2tPcHRpb25zLCBjdXJzb3IsIHNlbGVjdGlvbik6IHN0cmluZyB7XG4gICAgICAgIGxldCBpc0NoYXJWYWxpZDogYm9vbGVhbjtcbiAgICAgICAgbGV0IGlucHV0VmFsdWU6IHN0cmluZyA9IHZhbHVlO1xuICAgICAgICBjb25zdCBjaGFyOiBzdHJpbmcgPSBpbnB1dFZhbHVlW2N1cnNvcl07XG4gICAgICAgIGNvbnN0IG1hc2s6IHN0cmluZyA9IG1hc2tPcHRpb25zLmZvcm1hdDtcbiAgICAgICAgY29uc3QgbGl0ZXJhbHM6IE1hcDxudW1iZXIsIHN0cmluZz4gPSB0aGlzLmdldE1hc2tMaXRlcmFscyhtYXNrKTtcbiAgICAgICAgY29uc3QgbGl0ZXJhbEtleXM6IG51bWJlcltdID0gQXJyYXkuZnJvbShsaXRlcmFscy5rZXlzKCkpO1xuICAgICAgICBjb25zdCBub25MaXRlcmFsSW5kZWNlczogbnVtYmVyW10gPSB0aGlzLmdldE5vbkxpdGVyYWxJbmRlY2VzKG1hc2ssIGxpdGVyYWxLZXlzKTtcblxuICAgICAgICBpZiAoIXRoaXMuZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yID0gY3Vyc29yIDwgMCA/ICsrY3Vyc29yIDogY3Vyc29yO1xuICAgICAgICAgICAgaWYgKG5vbkxpdGVyYWxJbmRlY2VzLmluZGV4T2YodGhpcy5fY3Vyc29yKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpc0NoYXJWYWxpZCA9IHRoaXMudmFsaWRhdGVDaGFyT25Qb3N0aW9uKGNoYXIsIHRoaXMuX2N1cnNvciwgbWFzayk7XG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IGlzQ2hhclZhbGlkID8gdGhpcy5yZXBsYWNlQ2hhckF0KGlucHV0VmFsdWUsIHRoaXMuX2N1cnNvcisrLCBjaGFyKSA6XG4gICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLnJlcGxhY2VDaGFyQXQoaW5wdXRWYWx1ZSwgdGhpcy5fY3Vyc29yKyssIG1hc2tPcHRpb25zLnByb21wdENoYXIpO1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi0tO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IG5vbkxpdGVyYWxJbmRlY2VzLmluZGV4T2YoY3Vyc29yKSAhPT0gLTEgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0Q2hhckF0KGlucHV0VmFsdWUsIGN1cnNvciwgbWFza09wdGlvbnMucHJvbXB0Q2hhcikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0Q2hhckF0KGlucHV0VmFsdWUsIGN1cnNvciwgbWFza1tjdXJzb3JdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IHRoaXMucmVwbGFjZUNoYXJBdChpbnB1dFZhbHVlLCB0aGlzLl9jdXJzb3IsIG1hc2tbdGhpcy5fY3Vyc29yXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLS07XG4gICAgICAgICAgICAgICAgbGV0IGlzTWFya2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yID0gdGhpcy5fY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9uTGl0ZXJhbEluZGVjZXMuaW5kZXhPZihjdXJzb3IpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hhclZhbGlkID0gdGhpcy52YWxpZGF0ZUNoYXJPblBvc3Rpb24oY2hhciwgY3Vyc29yLCBtYXNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDaGFyVmFsaWQgJiYgIWlzTWFya2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLmluc2VydENoYXJBdChpbnB1dFZhbHVlLCBjdXJzb3IsIGNoYXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWFya2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5pbnNlcnRDaGFyQXQoaW5wdXRWYWx1ZSwgY3Vyc29yLCBtYXNrT3B0aW9ucy5wcm9tcHRDaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5pbnNlcnRDaGFyQXQoaW5wdXRWYWx1ZSwgY3Vyc29yLCBtYXNrW2N1cnNvcl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgPT09IHRoaXMuX2N1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3IrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gJycgJiYgY3Vyc29yID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvciA9IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWYWx1ZUJ5TWFza09uSW5pdCh2YWx1ZSwgbWFza09wdGlvbnMpO1xuICAgICAgICAgICAgfSAvLyB3b3JrYXJvdW5kIGZvciBJRSAneCcgYnV0dG9uXG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJzb3IgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJzb3IrKztcbiAgICAgICAgICAgIHRoaXMuX2N1cnNvciA9IGN1cnNvcjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAobm9uTGl0ZXJhbEluZGVjZXMuaW5kZXhPZihjdXJzb3IpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5pbnNlcnRDaGFyQXQoaW5wdXRWYWx1ZSwgY3Vyc29yLCBtYXNrT3B0aW9ucy5wcm9tcHRDaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IHRoaXMuaW5zZXJ0Q2hhckF0KGlucHV0VmFsdWUsIGN1cnNvciwgbWFza1tjdXJzb3JdKTtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVmFsdWVCeU1hc2tVcG9uQ29weVBhc3RlKHZhbHVlLCBtYXNrT3B0aW9ucywgY3Vyc29yLCBjbGlwYm9hcmREYXRhLCBzZWxlY3Rpb24pOiBzdHJpbmcge1xuICAgICAgICBsZXQgaW5wdXRWYWx1ZTogc3RyaW5nID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IG1hc2s6IHN0cmluZyA9IG1hc2tPcHRpb25zLmZvcm1hdDtcbiAgICAgICAgY29uc3QgbGl0ZXJhbHM6IE1hcDxudW1iZXIsIHN0cmluZz4gPSB0aGlzLmdldE1hc2tMaXRlcmFscyhtYXNrKTtcbiAgICAgICAgY29uc3QgbGl0ZXJhbEtleXM6IG51bWJlcltdID0gQXJyYXkuZnJvbShsaXRlcmFscy5rZXlzKCkpO1xuICAgICAgICBjb25zdCBub25MaXRlcmFsSW5kZWNlczogbnVtYmVyW10gPSB0aGlzLmdldE5vbkxpdGVyYWxJbmRlY2VzKG1hc2ssIGxpdGVyYWxLZXlzKTtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb25FbmQgPSBjdXJzb3IgKyBzZWxlY3Rpb247XG5cbiAgICAgICAgdGhpcy5fY3Vyc29yID0gY3Vyc29yO1xuICAgICAgICBmb3IgKGNvbnN0IGNsaXBib2FyZFN5bSBvZiBjbGlwYm9hcmREYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gY2xpcGJvYXJkU3ltO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fY3Vyc29yID4gbWFzay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5vbkxpdGVyYWxJbmRlY2VzLmluZGV4T2YodGhpcy5fY3Vyc29yKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0NoYXJWYWxpZCA9IHRoaXMudmFsaWRhdGVDaGFyT25Qb3N0aW9uKGNoYXIsIHRoaXMuX2N1cnNvciwgbWFzayk7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ2hhclZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLnJlcGxhY2VDaGFyQXQoaW5wdXRWYWx1ZSwgdGhpcy5fY3Vyc29yKyssIGNoYXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGN1cnNvcjsgaSA8IG1hc2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpdGVyYWxLZXlzLmluZGV4T2YodGhpcy5fY3Vyc29yKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvcisrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNDaGFyVmFsaWQgPSB0aGlzLnZhbGlkYXRlQ2hhck9uUG9zdGlvbihjaGFyLCB0aGl