all files / src/js/base/editing/ Table.js

90.14% Statements 256/284
78.48% Branches 124/158
95.83% Functions 23/24
90.11% Lines 255/283
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551               24× 24× 24×             24×       24× 24×       24×                     112×             112× 52×   112×               42×                             102× 42×   60× 45×   15× 15× 16× 16× 15×                   94× 94× 94× 94× 94×   94× 94× 10× 10× 10×       94× 94×                       18×           24× 24× 52× 52× 94×                 22×   17×   14×         17×             20×         12×       14×   24× 24×               24× 24× 24× 24× 24× 24× 66× 66× 66× 66× 13× 13×   53× 53× 11× 11×     42× 42×   20× 20×   22× 22×   42× 42×       24×                                                                                     12× 12× 12×                                                                         28× 28×     28× 28× 26× 18×       28×                                                                                       17×     17×                     14× 14×                                                    
(function(global){global.wrappers['/Users/lqez/Dev/summernote/src/js/base/editing/Table.js']=[function(require,module,exports,__dirname,__filename){ "use strict";
exports.__esModule = true;
var jquery_1 = require("jquery");
var dom_1 = require("../core/dom");
var range_1 = require("../core/range");
var lists_1 = require("../core/lists");
/**
 * @class Create a virtual table to create what actions to do in change.
 * @param {object} startPoint Cell selected to apply change.
 * @param {enum} where  Where change will be applied Row or Col. Use enum: TableResultAction.where
 * @param {enum} action Action to be applied. Use enum: TableResultAction.requestAction
 * @param {object} domTable Dom element of table to make changes.
 */
var TableResultAction = function (startPoint, where, action, domTable) {
    var _startPoint = { 'colPos': 0, 'rowPos': 0 };
    var _virtualTable = [];
    var _actionCellList = [];
    /// ///////////////////////////////////////////
    // Private functions
    /// ///////////////////////////////////////////
    /**
     * Set the startPoint of action.
     */
    function setStartPoint() {
        Iif (!startPoint || !startPoint.tagName || (startPoint.tagName.toLowerCase() !== 'td' && startPoint.tagName.toLowerCase() !== 'th')) {
            console.error('Impossible to identify start Cell point.', startPoint);
            return;
        }
        _startPoint.colPos = startPoint.cellIndex;
        Iif (!startPoint.parentElement || !startPoint.parentElement.tagName || startPoint.parentElement.tagName.toLowerCase() !== 'tr') {
            console.error('Impossible to identify start Row point.', startPoint);
            return;
        }
        _startPoint.rowPos = startPoint.parentElement.rowIndex;
    }
    /**
     * Define virtual table position info object.
     *
     * @param {int} rowIndex Index position in line of virtual table.
     * @param {int} cellIndex Index position in column of virtual table.
     * @param {object} baseRow Row affected by this position.
     * @param {object} baseCell Cell affected by this position.
     * @param {bool} isSpan Inform if it is an span cell/row.
     */
    function setVirtualTablePosition(rowIndex, cellIndex, baseRow, baseCell, isRowSpan, isColSpan, isVirtualCell) {
        var objPosition = {
            'baseRow': baseRow,
            'baseCell': baseCell,
            'isRowSpan': isRowSpan,
            'isColSpan': isColSpan,
            'isVirtual': isVirtualCell
        };
        if (!_virtualTable[rowIndex]) {
            _virtualTable[rowIndex] = [];
        }
        _virtualTable[rowIndex][cellIndex] = objPosition;
    }
    /**
     * Create action cell object.
     *
     * @param {object} virtualTableCellObj Object of specific position on virtual table.
     * @param {enum} resultAction Action to be applied in that item.
     */
    function getActionCell(virtualTableCellObj, resultAction, virtualRowPosition, virtualColPosition) {
        return {
            'baseCell': virtualTableCellObj.baseCell,
            'action': resultAction,
            'virtualTable': {
                'rowIndex': virtualRowPosition,
                'cellIndex': virtualColPosition
            }
        };
    }
    /**
     * Recover free index of row to append Cell.
     *
     * @param {int} rowIndex Index of row to find free space.
     * @param {int} cellIndex Index of cell to find free space in table.
     */
    function recoverCellIndex(rowIndex, cellIndex) {
        if (!_virtualTable[rowIndex]) {
            return cellIndex;
        }
        if (!_virtualTable[rowIndex][cellIndex]) {
            return cellIndex;
        }
        var newCellIndex = cellIndex;
        while (_virtualTable[rowIndex][newCellIndex]) {
            newCellIndex++;
            if (!_virtualTable[rowIndex][newCellIndex]) {
                return newCellIndex;
            }
        }
    }
    /**
     * Recover info about row and cell and add information to virtual table.
     *
     * @param {object} row Row to recover information.
     * @param {object} cell Cell to recover information.
     */
    function addCellInfoToVirtual(row, cell) {
        var cellIndex = recoverCellIndex(row.rowIndex, cell.cellIndex);
        var cellHasColspan = (cell.colSpan > 1);
        var cellHasRowspan = (cell.rowSpan > 1);
        var isThisSelectedCell = (row.rowIndex === _startPoint.rowPos && cell.cellIndex === _startPoint.colPos);
        setVirtualTablePosition(row.rowIndex, cellIndex, row, cell, cellHasRowspan, cellHasColspan, false);
        // Add span rows to virtual Table.
        var rowspanNumber = cell.attributes.rowSpan ? parseInt(cell.attributes.rowSpan.value, 10) : 0;
        if (rowspanNumber > 1) {
            for (var rp = 1; rp < rowspanNumber; rp++) {
                var rowspanIndex = row.rowIndex + rp;
                adjustStartPoint(rowspanIndex, cellIndex, cell, isThisSelectedCell);
                setVirtualTablePosition(rowspanIndex, cellIndex, row, cell, true, cellHasColspan, true);
            }
        }
        // Add span cols to virtual table.
        var colspanNumber = cell.attributes.colSpan ? parseInt(cell.attributes.colSpan.value, 10) : 0;
        if (colspanNumber > 1) {
            for (var cp = 1; cp < colspanNumber; cp++) {
                var cellspanIndex = recoverCellIndex(row.rowIndex, (cellIndex + cp));
                adjustStartPoint(row.rowIndex, cellspanIndex, cell, isThisSelectedCell);
                setVirtualTablePosition(row.rowIndex, cellspanIndex, row, cell, cellHasRowspan, true, true);
            }
        }
    }
    /**
     * Process validation and adjust of start point if needed
     *
     * @param {int} rowIndex
     * @param {int} cellIndex
     * @param {object} cell
     * @param {bool} isSelectedCell
     */
    function adjustStartPoint(rowIndex, cellIndex, cell, isSelectedCell) {
        if (rowIndex === _startPoint.rowPos && _startPoint.colPos >= cell.cellIndex && cell.cellIndex <= cellIndex && !isSelectedCell) {
            _startPoint.colPos++;
        }
    }
    /**
     * Create virtual table of cells with all cells, including span cells.
     */
    function createVirtualTable() {
        var rows = domTable.rows;
        for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {
            var cells = rows[rowIndex].cells;
            for (var cellIndex = 0; cellIndex < cells.length; cellIndex++) {
                addCellInfoToVirtual(rows[rowIndex], cells[cellIndex]);
            }
        }
    }
    /**
     * Get action to be applied on the cell.
     *
     * @param {object} cell virtual table cell to apply action
     */
    function getDeleteResultActionToCell(cell) {
        switch (where) {
            case TableResultAction.where.Column:
                if (cell.isColSpan) {
                    return TableResultAction.resultAction.SubtractSpanCount;
                }
                break;
            case TableResultAction.where.Row:
                if (!cell.isVirtual && cell.isRowSpan) {
                    return TableResultAction.resultAction.AddCell;
                }
                else if (cell.isRowSpan) {
                    return TableResultAction.resultAction.SubtractSpanCount;
                }
                break;
        }
        return TableResultAction.resultAction.RemoveCell;
    }
    /**
     * Get action to be applied on the cell.
     *
     * @param {object} cell virtual table cell to apply action
     */
    function getAddResultActionToCell(cell) {
        switch (where) {
            case TableResultAction.where.Column:
                if (cell.isColSpan) {
                    return TableResultAction.resultAction.SumSpanCount;
                }
                else if (cell.isRowSpan && cell.isVirtual) {
                    return TableResultAction.resultAction.Ignore;
                }
                break;
            case TableResultAction.where.Row:
                if (cell.isRowSpan) {
                    return TableResultAction.resultAction.SumSpanCount;
                }
                else if (cell.isColSpan && cell.isVirtual) {
                    return TableResultAction.resultAction.Ignore;
                }
                break;
        }
        return TableResultAction.resultAction.AddCell;
    }
    function init() {
        setStartPoint();
        createVirtualTable();
    }
    /// ///////////////////////////////////////////
    // Public functions
    /// ///////////////////////////////////////////
    /**
     * Recover array os what to do in table.
     */
    this.getActionList = function () {
        var fixedRow = (where === TableResultAction.where.Row) ? _startPoint.rowPos : -1;
        var fixedCol = (where === TableResultAction.where.Column) ? _startPoint.colPos : -1;
        var actualPosition = 0;
        var canContinue = true;
        while (canContinue) {
            var rowPosition = (fixedRow >= 0) ? fixedRow : actualPosition;
            var colPosition = (fixedCol >= 0) ? fixedCol : actualPosition;
            var row = _virtualTable[rowPosition];
            if (!row) {
                canContinue = false;
                return _actionCellList;
            }
            var cell = row[colPosition];
            if (!cell) {
                canContinue = false;
                return _actionCellList;
            }
            // Define action to be applied in this cell
            var resultAction = TableResultAction.resultAction.Ignore;
            switch (action) {
                case TableResultAction.requestAction.Add:
                    resultAction = getAddResultActionToCell(cell);
                    break;
                case TableResultAction.requestAction.Delete:
                    resultAction = getDeleteResultActionToCell(cell);
                    break;
            }
            _actionCellList.push(getActionCell(cell, resultAction, rowPosition, colPosition));
            actualPosition++;
        }
        return _actionCellList;
    };
    init();
};
/**
*
* Where action occours enum.
*/
TableResultAction.where = { 'Row': 0, 'Column': 1 };
/**
*
* Requested action to apply enum.
*/
TableResultAction.requestAction = { 'Add': 0, 'Delete': 1 };
/**
*
* Result action to be executed enum.
*/
TableResultAction.resultAction = { 'Ignore': 0, 'SubtractSpanCount': 1, 'RemoveCell': 2, 'AddCell': 3, 'SumSpanCount': 4 };
/**
 *
 * @class editing.Table
 *
 * Table
 *
 */
var Table = /** @class */ (function () {
    function Table() {
    }
    /**
     * handle tab key
     *
     * @param {WrappedRange} rng
     * @param {Boolean} isShift
     */
    Table.prototype.tab = function (rng, isShift) {
        var cell = dom_1["default"].ancestor(rng.commonAncestor(), dom_1["default"].isCell);
        var table = dom_1["default"].ancestor(cell, dom_1["default"].isTable);
        var cells = dom_1["default"].listDescendant(table, dom_1["default"].isCell);
        var nextCell = lists_1["default"][isShift ? 'prev' : 'next'](cells, cell);
        if (nextCell) {
            range_1["default"].create(nextCell, 0).select();
        }
    };
    /**
     * Add a new row
     *
     * @param {WrappedRange} rng
     * @param {String} position (top/bottom)
     * @return {Node}
     */
    Table.prototype.addRow = function (rng, position) {
        var cell = dom_1["default"].ancestor(rng.commonAncestor(), dom_1["default"].isCell);
        var currentTr = jquery_1["default"](cell).closest('tr');
        var trAttributes = this.recoverAttributes(currentTr);
        var html = jquery_1["default"]('<tr' + trAttributes + '></tr>');
        var vTable = new TableResultAction(cell, TableResultAction.where.Row, TableResultAction.requestAction.Add, jquery_1["default"](currentTr).closest('table')[0]);
        var actions = vTable.getActionList();
        for (var idCell = 0; idCell < actions.length; idCell++) {
            var currentCell = actions[idCell];
            var tdAttributes = this.recoverAttributes(currentCell.baseCell);
            switch (currentCell.action) {
                case TableResultAction.resultAction.AddCell:
                    html.append('<td' + tdAttributes + '>' + dom_1["default"].blank + '</td>');
                    break;
                case TableResultAction.resultAction.SumSpanCount:
                    if (position === 'top') {
                        var baseCellTr = currentCell.baseCell.parent;
                        var isTopFromRowSpan = (!baseCellTr ? 0 : currentCell.baseCell.closest('tr').rowIndex) <= currentTr[0].rowIndex;
                        Eif (isTopFromRowSpan) {
                            var newTd = jquery_1["default"]('<div></div>').append(jquery_1["default"]('<td' + tdAttributes + '>' + dom_1["default"].blank + '</td>').removeAttr('rowspan')).html();
                            html.append(newTd);
                            break;
                        }
                    }
                    var rowspanNumber = parseInt(currentCell.baseCell.rowSpan, 10);
                    rowspanNumber++;
                    currentCell.baseCell.setAttribute('rowSpan', rowspanNumber);
                    break;
            }
        }
        if (position === 'top') {
            currentTr.before(html);
        }
        else {
            var cellHasRowspan = (cell.rowSpan > 1);
            if (cellHasRowspan) {
                var lastTrIndex = currentTr[0].rowIndex + (cell.rowSpan - 2);
                jquery_1["default"](jquery_1["default"](currentTr).parent().find('tr')[lastTrIndex]).after(jquery_1["default"](html));
                return;
            }
            currentTr.after(html);
        }
    };
    /**
     * Add a new col
     *
     * @param {WrappedRange} rng
     * @param {String} position (left/right)
     * @return {Node}
     */
    Table.prototype.addCol = function (rng, position) {
        var cell = dom_1["default"].ancestor(rng.commonAncestor(), dom_1["default"].isCell);
        var row = jquery_1["default"](cell).closest('tr');
        var rowsGroup = jquery_1["default"](row).siblings();
        rowsGroup.push(row);
        var vTable = new TableResultAction(cell, TableResultAction.where.Column, TableResultAction.requestAction.Add, jquery_1["default"](row).closest('table')[0]);
        var actions = vTable.getActionList();
        for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
            var currentCell = actions[actionIndex];
            var tdAttributes = this.recoverAttributes(currentCell.baseCell);
            switch (currentCell.action) {
                case TableResultAction.resultAction.AddCell:
                    if (position === 'right') {
                        jquery_1["default"](currentCell.baseCell).after('<td' + tdAttributes + '>' + dom_1["default"].blank + '</td>');
                    }
                    else {
                        jquery_1["default"](currentCell.baseCell).before('<td' + tdAttributes + '>' + dom_1["default"].blank + '</td>');
                    }
                    break;
                case TableResultAction.resultAction.SumSpanCount:
                    Eif (position === 'right') {
                        var colspanNumber = parseInt(currentCell.baseCell.colSpan, 10);
                        colspanNumber++;
                        currentCell.baseCell.setAttribute('colSpan', colspanNumber);
                    }
                    else {
                        jquery_1["default"](currentCell.baseCell).before('<td' + tdAttributes + '>' + dom_1["default"].blank + '</td>');
                    }
                    break;
            }
        }
    };
    /*
    * Copy attributes from element.
    *
    * @param {object} Element to recover attributes.
    * @return {string} Copied string elements.
    */
    Table.prototype.recoverAttributes = function (el) {
        var resultStr = '';
        Iif (!el) {
            return resultStr;
        }
        var attrList = el.attributes || [];
        for (var i = 0; i < attrList.length; i++) {
            if (attrList[i].name.toLowerCase() === 'id') {
                continue;
            }
            Eif (attrList[i].specified) {
                resultStr += ' ' + attrList[i].name + '=\'' + attrList[i].value + '\'';
            }
        }
        return resultStr;
    };
    /**
     * Delete current row
     *
     * @param {WrappedRange} rng
     * @return {Node}
     */
    Table.prototype.deleteRow = function (rng) {
        var cell = dom_1["default"].ancestor(rng.commonAncestor(), dom_1["default"].isCell);
        var row = jquery_1["default"](cell).closest('tr');
        var cellPos = row.children('td, th').index(jquery_1["default"](cell));
        var rowPos = row[0].rowIndex;
        var vTable = new TableResultAction(cell, TableResultAction.where.Row, TableResultAction.requestAction.Delete, jquery_1["default"](row).closest('table')[0]);
        var actions = vTable.getActionList();
        for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
            Iif (!actions[actionIndex]) {
                continue;
            }
            var baseCell = actions[actionIndex].baseCell;
            var virtualPosition = actions[actionIndex].virtualTable;
            var hasRowspan = (baseCell.rowSpan && baseCell.rowSpan > 1);
            var rowspanNumber = (hasRowspan) ? parseInt(baseCell.rowSpan, 10) : 0;
            switch (actions[actionIndex].action) {
                case TableResultAction.resultAction.Ignore:
                    continue;
                case TableResultAction.resultAction.AddCell:
                    var nextRow = row.next('tr')[0];
                    Iif (!nextRow) {
                        continue;
                    }
                    var cloneRow = row[0].cells[cellPos];
                    Eif (hasRowspan) {
                        Iif (rowspanNumber > 2) {
                            rowspanNumber--;
                            nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);
                            nextRow.cells[cellPos].setAttribute('rowSpan', rowspanNumber);
                            nextRow.cells[cellPos].innerHTML = '';
                        }
                        else Eif (rowspanNumber === 2) {
                            nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);
                            nextRow.cells[cellPos].removeAttribute('rowSpan');
                            nextRow.cells[cellPos].innerHTML = '';
                        }
                    }
                    continue;
                case TableResultAction.resultAction.SubtractSpanCount:
                    Eif (hasRowspan) {
                        Eif (rowspanNumber > 2) {
                            rowspanNumber--;
                            baseCell.setAttribute('rowSpan', rowspanNumber);
                            Iif (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) {
                                baseCell.innerHTML = '';
                            }
                        }
                        else if (rowspanNumber === 2) {
                            baseCell.removeAttribute('rowSpan');
                            if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) {
                                baseCell.innerHTML = '';
                            }
                        }
                    }
                    continue;
                case TableResultAction.resultAction.RemoveCell:
                    // Do not need remove cell because row will be deleted.
                    continue;
            }
        }
        row.remove();
    };
    /**
     * Delete current col
     *
     * @param {WrappedRange} rng
     * @return {Node}
     */
    Table.prototype.deleteCol = function (rng) {
        var cell = dom_1["default"].ancestor(rng.commonAncestor(), dom_1["default"].isCell);
        var row = jquery_1["default"](cell).closest('tr');
        var cellPos = row.children('td, th').index(jquery_1["default"](cell));
        var vTable = new TableResultAction(cell, TableResultAction.where.Column, TableResultAction.requestAction.Delete, jquery_1["default"](row).closest('table')[0]);
        var actions = vTable.getActionList();
        for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
            Iif (!actions[actionIndex]) {
                continue;
            }
            switch (actions[actionIndex].action) {
                case TableResultAction.resultAction.Ignore:
                    continue;
                case TableResultAction.resultAction.SubtractSpanCount:
                    var baseCell = actions[actionIndex].baseCell;
                    var hasColspan = (baseCell.colSpan && baseCell.colSpan > 1);
                    Eif (hasColspan) {
                        var colspanNumber = (baseCell.colSpan) ? parseInt(baseCell.colSpan, 10) : 0;
                        if (colspanNumber > 2) {
                            colspanNumber--;
                            baseCell.setAttribute('colSpan', colspanNumber);
                            Iif (baseCell.cellIndex === cellPos) {
                                baseCell.innerHTML = '';
                            }
                        }
                        else Eif (colspanNumber === 2) {
                            baseCell.removeAttribute('colSpan');
                            if (baseCell.cellIndex === cellPos) {
                                baseCell.innerHTML = '';
                            }
                        }
                    }
                    continue;
                case TableResultAction.resultAction.RemoveCell:
                    dom_1["default"].remove(actions[actionIndex].baseCell, true);
                    continue;
            }
        }
    };
    /**
     * create empty table element
     *
     * @param {Number} rowCount
     * @param {Number} colCount
     * @return {Node}
     */
    Table.prototype.createTable = function (colCount, rowCount, options) {
        var tds = [];
        var tdHTML;
        for (var idxCol = 0; idxCol < colCount; idxCol++) {
            tds.push('<td>' + dom_1["default"].blank + '</td>');
        }
        tdHTML = tds.join('');
        var trs = [];
        var trHTML;
        for (var idxRow = 0; idxRow < rowCount; idxRow++) {
            trs.push('<tr>' + tdHTML + '</tr>');
        }
        trHTML = trs.join('');
        var $table = jquery_1["default"]('<table>' + trHTML + '</table>');
        if (options && options.tableClassName) {
            $table.addClass(options.tableClassName);
        }
        return $table[0];
    };
    /**
     * Delete current table
     *
     * @param {WrappedRange} rng
     * @return {Node}
     */
    Table.prototype.deleteTable = function (rng) {
        var cell = dom_1["default"].ancestor(rng.commonAncestor(), dom_1["default"].isCell);
        jquery_1["default"](cell).closest('table').remove();
    };
    return Table;
}());
exports["default"] = Table;
 
},'src/js/base/editing/Table.js',{"jquery":"/Users/lqez/Dev/summernote/node_modules/jquery/dist/jquery.js","../core/dom":"/Users/lqez/Dev/summernote/src/js/base/core/dom.js","../core/range":"/Users/lqez/Dev/summernote/src/js/base/core/range.js","../core/lists":"/Users/lqez/Dev/summernote/src/js/base/core/lists.js"}];})(this);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJUYWJsZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlDQUF1QjtBQUN2QixtQ0FBOEI7QUFDOUIsdUNBQWtDO0FBQ2xDLHVDQUFrQztBQUVsQzs7Ozs7O0dBTUc7QUFDSCxJQUFNLGlCQUFpQixHQUFHLFVBQVMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUTtJQUNwRSxJQUFNLFdBQVcsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2pELElBQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUN6QixJQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFFM0IsK0NBQStDO0lBQy9DLG9CQUFvQjtJQUNwQiwrQ0FBK0M7SUFFL0M7O09BRUc7SUFDSCxTQUFTLGFBQWE7UUFDcEIsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQ2xJLE9BQU8sQ0FBQyxLQUFLLENBQUMsMENBQTBDLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDdEUsT0FBTztTQUNSO1FBQ0QsV0FBVyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQzFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzdILE9BQU8sQ0FBQyxLQUFLLENBQUMseUNBQXlDLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDckUsT0FBTztTQUNSO1FBQ0QsV0FBVyxDQUFDLE1B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QyxFQUFFLE1BQU0sR0FBRyxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDaEQsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEIsSUFBTSxNQUFNLEdBQUcsbUJBQUMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQ2xELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUU7WUFDckMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDekM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCwyQkFBVyxHQUFYLFVBQVksR0FBRztRQUNiLElBQU0sSUFBSSxHQUFHLGdCQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBRSxnQkFBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVELG1CQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFDSCxZQUFDO0FBQUQsQ0FBQyxBQWxTRCxJQWtTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgZG9tIGZyb20gJy4uL2NvcmUvZG9tJztcbmltcG9ydCByYW5nZSBmcm9tICcuLi9jb3JlL3JhbmdlJztcbmltcG9ydCBsaXN0cyBmcm9tICcuLi9jb3JlL2xpc3RzJztcblxuLyoqXG4gKiBAY2xhc3MgQ3JlYXRlIGEgdmlydHVhbCB0YWJsZSB0byBjcmVhdGUgd2hhdCBhY3Rpb25zIHRvIGRvIGluIGNoYW5nZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBzdGFydFBvaW50IENlbGwgc2VsZWN0ZWQgdG8gYXBwbHkgY2hhbmdlLlxuICogQHBhcmFtIHtlbnVtfSB3aGVyZSAgV2hlcmUgY2hhbmdlIHdpbGwgYmUgYXBwbGllZCBSb3cgb3IgQ29sLiBVc2UgZW51bTogVGFibGVSZXN1bHRBY3Rpb24ud2hlcmVcbiAqIEBwYXJhbSB7ZW51bX0gYWN0aW9uIEFjdGlvbiB0byBiZSBhcHBsaWVkLiBVc2UgZW51bTogVGFibGVSZXN1bHRBY3Rpb24ucmVxdWVzdEFjdGlvblxuICogQHBhcmFtIHtvYmplY3R9IGRvbVRhYmxlIERvbSBlbGVtZW50IG9mIHRhYmxlIHRvIG1ha2UgY2hhbmdlcy5cbiAqL1xuY29uc3QgVGFibGVSZXN1bHRBY3Rpb24gPSBmdW5jdGlvbihzdGFydFBvaW50LCB3aGVyZSwgYWN0aW9uLCBkb21UYWJsZSkge1xuICBjb25zdCBfc3RhcnRQb2ludCA9IHsgJ2NvbFBvcyc6IDAsICdyb3dQb3MnOiAwIH07XG4gIGNvbnN0IF92aXJ0dWFsVGFibGUgPSBbXTtcbiAgY29uc3QgX2FjdGlvbkNlbGxMaXN0ID0gW107XG5cbiAgLy8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gUHJpdmF0ZSBmdW5jdGlvbnNcbiAgLy8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAvKipcbiAgICogU2V0IHRoZSBzdGFydFBvaW50IG9mIGFjdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFN0YXJ0UG9pbnQoKSB7XG4gICAgaWYgKCFzdGFydFBvaW50IHx8ICFzdGFydFBvaW50LnRhZ05hbWUgfHwgKHN0YXJ0UG9pbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAndGQnICYmIHN0YXJ0UG9pbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAndGgnKSkge1xuICAgICAgY29uc29sZS5lcnJvcignSW1wb3NzaWJsZSB0byBpZGVudGlmeSBzdGFydCBDZWxsIHBvaW50LicsIHN0YXJ0UG9pbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBfc3RhcnRQb2ludC5jb2xQb3MgPSBzdGFydFBvaW50LmNlbGxJbmRleDtcbiAgICBpZiAoIXN0YXJ0UG9pbnQucGFyZW50RWxlbWVudCB8fCAhc3RhcnRQb2ludC5wYXJlbnRFbGVtZW50LnRhZ05hbWUgfHwgc3RhcnRQb2ludC5wYXJlbnRFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3RyJykge1xuICAgICAgY29uc29sZS5lcnJvcignSW1wb3NzaWJsZSB0byBpZGVudGlmeSBzdGFydCBSb3cgcG9pbnQuJywgc3RhcnRQb2ludCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIF9zdGFydFBvaW50LnJvd1BvcyA9IHN0YXJ0UG9pbnQucGFyZW50RWxlbWVudC5yb3dJbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgdmlydHVhbCB0YWJsZSBwb3NpdGlvbiBpbmZvIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtpbnR9IHJvd0luZGV4IEluZGV4IHBvc2l0aW9uIGluIGxpbmUgb2YgdmlydHVhbCB0YWJsZS5cbiAgICogQHBhcmFtIHtpbnR9IGNlbGxJbmRleCBJbmRleCBwb3NpdGlvbiBpbiBjb2x1bW4gb2YgdmlydHVhbCB0YWJsZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGJhc2VSb3cgUm93IGFmZmVjdGVkIGJ5IHRoaXMgcG9zaXRpb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBiYXNlQ2VsbCBDZWxsIGFmZmVjdGVkIGJ5IHRoaXMgcG9zaXRpb24uXG4gICAqIEBwYXJhbSB7Ym9vbH0gaXNTcGFuIEluZm9ybSBpZiBpdCBpcyBhbiBzcGFuIGNlbGwvcm93LlxuICAgKi9cbiAgZnVuY3Rpb24gc2V0VmlydHVhbFRhYmxlUG9zaXRpb24ocm93SW5kZXgsIGNlbGxJbmRleCwgYmFzZVJvdywgYmFzZUNlbGwsIGlzUm93U3BhbiwgaXNDb2xTcGFuLCBpc1ZpcnR1YWxDZWxsKSB7XG4gICAgY29uc3Qgb2JqUG9zaXRpb24gPSB7XG4gICAgICAnYmFzZVJvdyc6IGJhc2VSb3csXG4gICAgICAnYmFzZUNlbGwnOiBiYXNlQ2VsbCxcbiAgICAgICdpc1Jvd1NwYW4nOiBpc1Jvd1NwYW4sXG4gICAgICAnaXNDb2xTcGFuJzogaXNDb2xTcGFuLFxuICAgICAgJ2lzVmlydHVhbCc6IGlzVmlydHVhbENlbGwsXG4gICAgfTtcbiAgICBpZiAoIV92aXJ0dWFsVGFibGVbcm93SW5kZXhdKSB7XG4gICAgICBfdmlydHVhbFRhYmxlW3Jvd0luZGV4XSA9IFtdO1xuICAgIH1cbiAgICBfdmlydHVhbFRhYmxlW3Jvd0luZGV4XVtjZWxsSW5kZXhdID0gb2JqUG9zaXRpb247XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFjdGlvbiBjZWxsIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHZpcnR1YWxUYWJsZUNlbGxPYmogT2JqZWN0IG9mIHNwZWNpZmljIHBvc2l0aW9uIG9uIHZpcnR1YWwgdGFibGUuXG4gICAqIEBwYXJhbSB7ZW51bX0gcmVzdWx0QWN0aW9uIEFjdGlvbiB0byBiZSBhcHBsaWVkIGluIHRoYXQgaXRlbS5cbiAgICovXG4gIGZ1bmN0aW9uIGdldEFjdGlvbkNlbGwodmlydHVhbFRhYmxlQ2VsbE9iaiwgcmVzdWx0QWN0aW9uLCB2aXJ0dWFsUm93UG9zaXRpb24sIHZpcnR1YWxDb2xQb3NpdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICAnYmFzZUNlbGwnOiB2aXJ0dWFsVGFibGVDZWxsT2JqLmJhc2VDZWxsLFxuICAgICAgJ2FjdGlvbic6IHJlc3VsdEFjdGlvbixcbiAgICAgICd2aXJ0dWFsVGFibGUnOiB7XG4gICAgICAgICdyb3dJbmRleCc6IHZpcnR1YWxSb3dQb3NpdGlvbixcbiAgICAgICAgJ2NlbGxJbmRleCc6IHZpcnR1YWxDb2xQb3NpdGlvbixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIGZyZWUgaW5kZXggb2Ygcm93IHRvIGFwcGVuZCBDZWxsLlxuICAgKlxuICAgKiBAcGFyYW0ge2ludH0gcm93SW5kZXggSW5kZXggb2Ygcm93IHRvIGZpbmQgZnJlZSBzcGFjZS5cbiAgICogQHBhcmFtIHtpbnR9IGNlbGxJbmRleCBJbmRleCBvZiBjZWxsIHRvIGZpbmQgZnJlZSBzcGFjZSBpbiB0YWJsZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlY292ZXJDZWxsSW5kZXgocm93SW5kZXgsIGNlbGxJbmRleCkge1xuICAgIGlmICghX3ZpcnR1YWxUYWJsZVtyb3dJbmRleF0pIHtcbiAgICAgIHJldHVybiBjZWxsSW5kZXg7XG4gICAgfVxuICAgIGlmICghX3ZpcnR1YWxUYWJsZVtyb3dJbmRleF1bY2VsbEluZGV4XSkge1xuICAgICAgcmV0dXJuIGNlbGxJbmRleDtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q2VsbEluZGV4ID0gY2VsbEluZGV4O1xuICAgIHdoaWxlIChfdmlydHVhbFRhYmxlW3Jvd0luZGV4XVtuZXdDZWxsSW5kZXhdKSB7XG4gICAgICBuZXdDZWxsSW5kZXgrKztcbiAgICAgIGlmICghX3ZpcnR1YWxUYWJsZVtyb3dJbmRleF1bbmV3Q2VsbEluZGV4XSkge1xuICAgICAgICByZXR1cm4gbmV3Q2VsbEluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIGluZm8gYWJvdXQgcm93IGFuZCBjZWxsIGFuZCBhZGQgaW5mb3JtYXRpb24gdG8gdmlydHVhbCB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHJvdyBSb3cgdG8gcmVjb3ZlciBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNlbGwgQ2VsbCB0byByZWNvdmVyIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2VsbEluZm9Ub1ZpcnR1YWwocm93LCBjZWxsKSB7XG4gICAgY29uc3QgY2VsbEluZGV4ID0gcmVjb3ZlckNlbGxJbmRleChyb3cucm93SW5kZXgsIGNlbGwuY2VsbEluZGV4KTtcbiAgICBjb25zdCBjZWxsSGFzQ29sc3BhbiA9IChjZWxsLmNvbFNwYW4gPiAxKTtcbiAgICBjb25zdCBjZWxsSGFzUm93c3BhbiA9IChjZWxsLnJvd1NwYW4gPiAxKTtcbiAgICBjb25zdCBpc1RoaXNTZWxlY3RlZENlbGwgPSAocm93LnJvd0luZGV4ID09PSBfc3RhcnRQb2ludC5yb3dQb3MgJiYgY2VsbC5jZWxsSW5kZXggPT09IF9zdGFydFBvaW50LmNvbFBvcyk7XG4gICAgc2V0VmlydHVhbFRhYmxlUG9zaXRpb24ocm93LnJvd0luZGV4LCBjZWxsSW5kZXgsIHJvdywgY2VsbCwgY2VsbEhhc1Jvd3NwYW4sIGNlbGxIYXNDb2xzcGFuLCBmYWxzZSk7XG5cbiAgICAvLyBBZGQgc3BhbiByb3dzIHRvIHZpcnR1YWwgVGFibGUuXG4gICAgY29uc3Qgcm93c3Bhbk51bWJlciA9IGNlbGwuYXR0cmlidXRlcy5yb3dTcGFuID8gcGFyc2VJbnQoY2VsbC5hdHRyaWJ1dGVzLnJvd1NwYW4udmFsdWUsIDEwKSA6IDA7XG4gICAgaWYgKHJvd3NwYW5OdW1iZXIgPiAxKSB7XG4gICAgICBmb3IgKGxldCBycCA9IDE7IHJwIDwgcm93c3Bhbk51bWJlcjsgcnArKykge1xuICAgICAgICBjb25zdCByb3dzcGFuSW5kZXggPSByb3cucm93SW5kZXggKyBycDtcbiAgICAgICAgYWRqdXN0U3RhcnRQb2ludChyb3dzcGFuSW5kZXgsIGNlbGxJbmRleCwgY2VsbCwgaXNUaGlzU2VsZWN0ZWRDZWxsKTtcbiAgICAgICAgc2V0VmlydHVhbFRhYmxlUG9zaXRpb24ocm93c3BhbkluZGV4LCBjZWxsSW5kZXgsIHJvdywgY2VsbCwgdHJ1ZSwgY2VsbEhhc0NvbHNwYW4sIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBzcGFuIGNvbHMgdG8gdmlydHVhbCB0YWJsZS5cbiAgICBjb25zdCBjb2xzcGFuTnVtYmVyID0gY2VsbC5hdHRyaWJ1dGVzLmNvbFNwYW4gPyBwYXJzZUludChjZWxsLmF0dHJpYnV0ZXMuY29sU3Bhbi52YWx1ZSwgMTApIDogMDtcbiAgICBpZiAoY29sc3Bhbk51bWJlciA+IDEpIHtcbiAgICAgIGZvciAobGV0IGNwID0gMTsgY3AgPCBjb2xzcGFuTnVtYmVyOyBjcCsrKSB7XG4gICAgICAgIGNvbnN0IGNlbGxzcGFuSW5kZXggPSByZWNvdmVyQ2VsbEluZGV4KHJvdy5yb3dJbmRleCwgKGNlbGxJbmRleCArIGNwKSk7XG4gICAgICAgIGFkanVzdFN0YXJ0UG9pbnQocm93LnJvd0luZGV4LCBjZWxsc3BhbkluZGV4LCBjZWxsLCBpc1RoaXNTZWxlY3RlZENlbGwpO1xuICAgICAgICBzZXRWaXJ0dWFsVGFibGVQb3NpdGlvbihyb3cucm93SW5kZXgsIGNlbGxzcGFuSW5kZXgsIHJvdywgY2VsbCwgY2VsbEhhc1Jvd3NwYW4sIHRydWUsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHZhbGlkYXRpb24gYW5kIGFkanVzdCBvZiBzdGFydCBwb2ludCBpZiBuZWVkZWRcbiAgICpcbiAgICogQHBhcmFtIHtpbnR9IHJvd0luZGV4XG4gICAqIEBwYXJhbSB7aW50fSBjZWxsSW5kZXhcbiAgICogQHBhcmFtIHtvYmplY3R9IGNlbGxcbiAgICogQHBhcmFtIHtib29sfSBpc1NlbGVjdGVkQ2VsbFxuICAgKi9cbiAgZnVuY3Rpb24gYWRqdXN0U3RhcnRQb2ludChyb3dJbmRleCwgY2VsbEluZGV4LCBjZWxsLCBpc1NlbGVjdGVkQ2VsbCkge1xuICAgIGlmIChyb3dJbmRleCA9PT0gX3N0YXJ0UG9pbnQucm93UG9zICYmIF9zdGFydFBvaW50LmNvbFBvcyA+PSBjZWxsLmNlbGxJbmRleCAmJiBjZWxsLmNlbGxJbmRleCA8PSBjZWxsSW5kZXggJiYgIWlzU2VsZWN0ZWRDZWxsKSB7XG4gICAgICBfc3RhcnRQb2ludC5jb2xQb3MrKztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHZpcnR1YWwgdGFibGUgb2YgY2VsbHMgd2l0aCBhbGwgY2VsbHMsIGluY2x1ZGluZyBzcGFuIGNlbGxzLlxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlVmlydHVhbFRhYmxlKCkge1xuICAgIGNvbnN0IHJvd3MgPSBkb21UYWJsZS5yb3dzO1xuICAgIGZvciAobGV0IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCByb3dzLmxlbmd0aDsgcm93SW5kZXgrKykge1xuICAgICAgY29uc3QgY2VsbHMgPSByb3dzW3Jvd0luZGV4XS5jZWxscztcbiAgICAgIGZvciAobGV0IGNlbGxJbmRleCA9IDA7IGNlbGxJbmRleCA8IGNlbGxzLmxlbmd0aDsgY2VsbEluZGV4KyspIHtcbiAgICAgICAgYWRkQ2VsbEluZm9Ub1ZpcnR1YWwocm93c1tyb3dJbmRleF0sIGNlbGxzW2NlbGxJbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWN0aW9uIHRvIGJlIGFwcGxpZWQgb24gdGhlIGNlbGwuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjZWxsIHZpcnR1YWwgdGFibGUgY2VsbCB0byBhcHBseSBhY3Rpb25cbiAgICovXG4gIGZ1bmN0aW9uIGdldERlbGV0ZVJlc3VsdEFjdGlvblRvQ2VsbChjZWxsKSB7XG4gICAgc3dpdGNoICh3aGVyZSkge1xuICAgICAgY2FzZSBUYWJsZVJlc3VsdEFjdGlvbi53aGVyZS5Db2x1bW46XG4gICAgICAgIGlmIChjZWxsLmlzQ29sU3Bhbikge1xuICAgICAgICAgIHJldHVybiBUYWJsZVJlc3VsdEFjdGlvbi5yZXN1bHRBY3Rpb24uU3VidHJhY3RTcGFuQ291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRhYmxlUmVzdWx0QWN0aW9uLndoZXJlLlJvdzpcbiAgICAgICAgaWYgKCFjZWxsLmlzVmlydHVhbCAmJiBjZWxsLmlzUm93U3Bhbikge1xuICAgICAgICAgIHJldHVybiBUYWJsZVJlc3VsdEFjdGlvbi5yZXN1bHRBY3Rpb24uQWRkQ2VsbDtcbiAgICAgICAgfSBlbHNlIGlmIChjZWxsLmlzUm93U3Bhbikge1xuICAgICAgICAgIHJldHVybiBUYWJsZVJlc3VsdEFjdGlvbi5yZXN1bHRBY3Rpb24uU3VidHJhY3RTcGFuQ291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBUYWJsZVJlc3VsdEFjdGlvbi5yZXN1bHRBY3Rpb24uUmVtb3ZlQ2VsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWN0aW9uIHRvIGJlIGFwcGxpZWQgb24gdGhlIGNlbGwuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjZWxsIHZpcnR1YWwgdGFibGUgY2VsbCB0byBhcHBseSBhY3Rpb25cbiAgICovXG4gIGZ1bmN0aW9uIGdldEFkZFJlc3VsdEFjdGlvblRvQ2VsbChjZWxsKSB7XG4gICAgc3dpdGNoICh3aGVyZSkge1xuICAgICAgY2FzZSBUYWJsZVJlc3VsdEFjdGlvbi53aGVyZS5Db2x1bW46XG4gICAgICAgIGlmIChjZWxsLmlzQ29sU3Bhbikge1xuICAgICAgICAgIHJldHVybiBUYWJsZVJlc3VsdEFjdGlvbi5yZXN1bHRBY3Rpb24uU3VtU3BhbkNvdW50O1xuICAgICAgICB9IGVsc2UgaWYgKGNlbGwuaXNSb3dTcGFuICYmIGNlbGwuaXNWaXJ0dWFsKSB7XG4gICAgICAgICAgcmV0dXJuIFRhYmxlUmVzdWx0QWN0aW9uLnJlc3VsdEFjdGlvbi5JZ25vcmU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRhYmxlUmVzdWx0QWN0aW9uLndoZXJlLlJvdzpcbiAgICAgICAgaWYgKGNlbGwuaXNSb3dTcGFuKSB7XG4gICAgICAgICAgcmV0dXJuIFRhYmxlUmVzdWx0QWN0aW9uLnJlc3VsdEFjdGlvbi5TdW1TcGFuQ291bnQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY2VsbC5pc0NvbFNwYW4gJiYgY2VsbC5pc1ZpcnR1YWwpIHtcbiAgICAgICAgICByZXR1cm4gVGFibGVSZXN1bHRBY3Rpb24ucmVzdWx0QWN0aW9uLklnbm9yZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIFRhYmxlUmVzdWx0QWN0aW9uLnJlc3VsdEFjdGlvbi5BZGRDZWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBzZXRTdGFydFBvaW50KCk7XG4gICAgY3JlYXRlVmlydHVhbFRhYmxlKCk7XG4gIH1cblxuICAvLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyBQdWJsaWMgZnVuY3Rpb25zXG4gIC8vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIFJlY292ZXIgYXJyYXkgb3Mgd2hhdCB0byBkbyBpbiB0YWJsZS5cbiAgICovXG4gIHRoaXMuZ2V0QWN0aW9uTGlzdCA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IGZpeGVkUm93ID0gKHdoZXJlID09PSBUYWJsZVJlc3VsdEFjdGlvbi53aGVyZS5Sb3cpID8gX3N0YXJ0UG9pbnQucm93UG9zIDogLTE7XG4gICAgY29uc3QgZml4ZWRDb2wgPSAod2hlcmUgPT09IFRhYmxlUmVzdWx0QWN0aW9uLndoZXJlLkNvbHVtbikgPyBfc3RhcnRQb2ludC5jb2xQb3MgOiAtMTtcblxuICAgIGxldCBhY3R1YWxQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGNhbkNvbnRpbnVlID0gdHJ1ZTtcbiAgICB3aGlsZSAoY2FuQ29udGludWUpIHtcbiAgICAgIGNvbnN0IHJvd1Bvc2l0aW9uID0gKGZpeGVkUm93ID49IDApID8gZml4ZWRSb3cgOiBhY3R1YWxQb3NpdGlvbjtcbiAgICAgIGNvbnN0IGNvbFBvc2l0aW9uID0gKGZpeGVkQ29sID49IDApID8gZml4ZWRDb2wgOiBhY3R1YWxQb3NpdGlvbjtcbiAgICAgIGNvbnN0IHJvdyA9IF92aXJ0dWFsVGFibGVbcm93UG9zaXRpb25dO1xuICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgY2FuQ29udGludWUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIF9hY3Rpb25DZWxsTGlzdDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNlbGwgPSByb3dbY29sUG9zaXRpb25dO1xuICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgIGNhbkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBfYWN0aW9uQ2VsbExpc3Q7XG4gICAgICB9XG5cbiAgICAgIC8vIERlZmluZSBhY3Rpb24gdG8gYmUgYXBwbGllZCBpbiB0aGlzIGNlbGxcbiAgICAgIGxldCByZXN1bHRBY3Rpb24gPSBUYWJsZVJlc3VsdEFjdGlvbi5yZXN1bHRBY3Rpb24uSWdub3JlO1xuICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgY2FzZSBUYWJsZVJlc3VsdEFjdGlvbi5yZXF1ZXN0QWN0aW9uLkFkZDpcbiAgICAgICAgICByZXN1bHRBY3Rpb24gPSBnZXRBZGRSZXN1bHRBY3Rpb25Ub0NlbGwoY2VsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVGFibGVSZXN1bHRBY3Rpb24ucmVxdWVzdEFjdGlvbi5EZWxldGU6XG4gICAgICAgICAgcmVzdWx0QWN0aW9uID0gZ2V0RGVsZXRlUmVzdWx0QWN0aW9uVG9DZWxsKGNlbGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgX2FjdGlvbkNlbGxMaXN0LnB1c2goZ2V0QWN0aW9uQ2VsbChjZWxsLCByZXN1bHRBY3Rpb24sIHJvd1Bvc2l0aW9uLCBjb2xQb3NpdGlvbikpO1xuICAgICAgYWN0dWFsUG9zaXRpb24rKztcbiAgICB9XG5cbiAgICByZXR1cm4gX2FjdGlvbkNlbGxMaXN0O1xuICB9O1xuXG4gIGluaXQoKTtcbn07XG4vKipcbipcbiogV2hlcmUgYWN0aW9uIG9jY291cnMgZW51bS5cbiovXG5UYWJsZVJlc3VsdEFjdGlvbi53aGVyZSA9IHsgJ1Jvdyc6IDAsICdDb2x1bW4nOiAxIH07XG4vKipcbipcbiogUmVxdWVzdGVkIGFjdGlvbiB0byBhcHBseSBlbnVtLlxuKi9cblRhYmxlUmVzdWx0QWN0aW9uLnJlcXVlc3RBY3Rpb24gPSB7ICdBZGQnOiAwLCAnRGVsZXRlJzogMSB9O1xuLyoqXG4qXG4qIFJlc3VsdCBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQgZW51bS5cbiovXG5UYWJsZVJlc3VsdEFjdGlvbi5yZXN1bHRBY3Rpb24gPSB7ICdJZ25vcmUnOiAwLCAnU3VidHJhY3RTcGFuQ291bnQnOiAxLCAnUmVtb3ZlQ2VsbCc6IDIsICdBZGRDZWxsJzogMywgJ1N1bVNwYW5Db3VudCc6IDQgfTtcblxuLyoqXG4gKlxuICogQGNsYXNzIGVkaXRpbmcuVGFibGVcbiAqXG4gKiBUYWJsZVxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFibGUge1xuICAvKipcbiAgICogaGFuZGxlIHRhYiBrZXlcbiAgICpcbiAgICogQHBhcmFtIHtXcmFwcGVkUmFuZ2V9IHJuZ1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzU2hpZnRcbiAgICovXG4gIHRhYihybmcsIGlzU2hpZnQpIHtcbiAgICBjb25zdCBjZWxsID0gZG9tLmFuY2VzdG9yKHJuZy5jb21tb25BbmNlc3RvcigpLCBkb20uaXNDZWxsKTtcbiAgICBjb25zdCB0YWJsZSA9IGRvbS5hbmNlc3RvcihjZWxsLCBkb20uaXNUYWJsZSk7XG4gICAgY29uc3QgY2VsbHMgPSBkb20ubGlzdERlc2NlbmRhbnQodGFibGUsIGRvbS5pc0NlbGwpO1xuXG4gICAgY29uc3QgbmV4dENlbGwgPSBsaXN0c1tpc1NoaWZ0ID8gJ3ByZXYnIDogJ25leHQnXShjZWxscywgY2VsbCk7XG4gICAgaWYgKG5leHRDZWxsKSB7XG4gICAgICByYW5nZS5jcmVhdGUobmV4dENlbGwsIDApLnNlbGVjdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgcm93XG4gICAqXG4gICAqIEBwYXJhbSB7V3JhcHBlZFJhbmdlfSBybmdcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBvc2l0aW9uICh0b3AvYm90dG9tKVxuICAgKiBAcmV0dXJuIHtOb2RlfVxuICAgKi9cbiAgYWRkUm93KHJuZywgcG9zaXRpb24pIHtcbiAgICBjb25zdCBjZWxsID0gZG9tLmFuY2VzdG9yKHJuZy5jb21tb25BbmNlc3RvcigpLCBkb20uaXNDZWxsKTtcblxuICAgIGNvbnN0IGN1cnJlbnRUciA9ICQoY2VsbCkuY2xvc2VzdCgndHInKTtcbiAgICBjb25zdCB0ckF0dHJpYnV0ZXMgPSB0aGlzLnJlY292ZXJBdHRyaWJ1dGVzKGN1cnJlbnRUcik7XG4gICAgY29uc3QgaHRtbCA9ICQoJzx0cicgKyB0ckF0dHJpYnV0ZXMgKyAnPjwvdHI+Jyk7XG5cbiAgICBjb25zdCB2VGFibGUgPSBuZXcgVGFibGVSZXN1bHRBY3Rpb24oY2VsbCwgVGFibGVSZXN1bHRBY3Rpb24ud2hlcmUuUm93LFxuICAgICAgVGFibGVSZXN1bHRBY3Rpb24ucmVxdWVzdEFjdGlvbi5BZGQsICQoY3VycmVudFRyKS5jbG9zZXN0KCd0YWJsZScpWzBdKTtcbiAgICBjb25zdCBhY3Rpb25zID0gdlRhYmxlLmdldEFjdGlvbkxpc3QoKTtcblxuICAgIGZvciAobGV0IGlkQ2VsbCA9IDA7IGlkQ2VsbCA8IGFjdGlvbnMubGVuZ3RoOyBpZENlbGwrKykge1xuICAgICAgY29uc3QgY3VycmVudENlbGwgPSBhY3Rpb25zW2lkQ2VsbF07XG4gICAgICBjb25zdCB0ZEF0dHJpYnV0ZXMgPSB0aGlzLnJlY292ZXJBdHRyaWJ1dGVzKGN1cnJlbnRDZWxsLmJhc2VDZWxsKTtcbiAgICAgIHN3aXRjaCAoY3VycmVudENlbGwuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgVGFibGVSZXN1bHRBY3Rpb24ucmVzdWx0QWN0aW9uLkFkZENlbGw6XG4gICAgICAgICAgaHRtbC5hcHBlbmQoJzx0ZCcgKyB0ZEF0dHJpYnV0ZXMgKyAnPicgKyBkb20uYmxhbmsgKyAnPC90ZD4nKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUYWJsZVJlc3VsdEFjdGlvbi5yZXN1bHRBY3Rpb24uU3VtU3BhbkNvdW50OlxuICAgICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VDZWxsVHIgPSBjdXJyZW50Q2VsbC5iYXNlQ2VsbC5wYXJlbnQ7XG4gICAgICAgICAgICBjb25zdCBpc1RvcEZyb21Sb3dTcGFuID0gKCFiYXNlQ2VsbFRyID8gMCA6IGN1cnJlbnRDZWxsLmJhc2VDZWxsLmNsb3Nlc3QoJ3RyJykucm93SW5kZXgpIDw9IGN1cnJlbnRUclswXS5yb3dJbmRleDtcbiAgICAgICAgICAgIGlmIChpc1RvcEZyb21Sb3dTcGFuKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld1RkID0gJCgnPGRpdj48L2Rpdj4nKS5hcHBlbmQoJCgnPHRkJyArIHRkQXR0cmlidXRlcyArICc+JyArIGRvbS5ibGFuayArICc8L3RkPicpLnJlbW92ZUF0dHIoJ3Jvd3NwYW4nKSkuaHRtbCgpO1xuICAgICAgICAgICAgICBodG1sLmFwcGVuZChuZXdUZCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgcm93c3Bhbk51bWJlciA9IHBhcnNlSW50KGN1cnJlbnRDZWxsLmJhc2VDZWxsLnJvd1NwYW4sIDEwKTtcbiAgICAgICAgICByb3dzcGFuTnVtYmVyKys7XG4gICAgICAgICAgY3VycmVudENlbGwuYmFzZUNlbGwuc2V0QXR0cmlidXRlKCdyb3dTcGFuJywgcm93c3Bhbk51bWJlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uID09PSAndG9wJykge1xuICAgICAgY3VycmVudFRyLmJlZm9yZShodG1sKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2VsbEhhc1Jvd3NwYW4gPSAoY2VsbC5yb3dTcGFuID4gMSk7XG4gICAgICBpZiAoY2VsbEhhc1Jvd3NwYW4pIHtcbiAgICAgICAgY29uc3QgbGFzdFRySW5kZXggPSBjdXJyZW50VHJbMF0ucm93SW5kZXggKyAoY2VsbC5yb3dTcGFuIC0gMik7XG4gICAgICAgICQoJChjdXJyZW50VHIpLnBhcmVudCgpLmZpbmQoJ3RyJylbbGFzdFRySW5kZXhdKS5hZnRlcigkKGh0bWwpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3VycmVudFRyLmFmdGVyKGh0bWwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgY29sXG4gICAqXG4gICAqIEBwYXJhbSB7V3JhcHBlZFJhbmdlfSBybmdcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBvc2l0aW9uIChsZWZ0L3JpZ2h0KVxuICAgKiBAcmV0dXJuIHtOb2RlfVxuICAgKi9cbiAgYWRkQ29sKHJuZywgcG9zaXRpb24pIHtcbiAgICBjb25zdCBjZWxsID0gZG9tLmFuY2VzdG9yKHJuZy5jb21tb25BbmNlc3RvcigpLCBkb20uaXNDZWxsKTtcbiAgICBjb25zdCByb3cgPSAkKGNlbGwpLmNsb3Nlc3QoJ3RyJyk7XG4gICAgY29uc3Qgcm93c0dyb3VwID0gJChyb3cpLnNpYmxpbmdzKCk7XG4gICAgcm93c0dyb3VwLnB1c2gocm93KTtcblxuICAgIGNvbnN0IHZUYWJsZSA9IG5ldyBUYWJsZVJlc3VsdEFjdGlvbihjZWxsLCBUYWJsZVJlc3VsdEFjdGlvbi53aGVyZS5Db2x1bW4sXG4gICAgICBUYWJsZVJlc3VsdEFjdGlvbi5yZXF1ZXN0QWN0aW9uLkFkZCwgJChyb3cpLmNsb3Nlc3QoJ3RhYmxlJylbMF0pO1xuICAgIGNvbnN0IGFjdGlvbnMgPSB2VGFibGUuZ2V0QWN0aW9uTGlzdCgpO1xuXG4gICAgZm9yIChsZXQgYWN0aW9uSW5kZXggPSAwOyBhY3Rpb25JbmRleCA8IGFjdGlvbnMubGVuZ3RoOyBhY3Rpb25JbmRleCsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50Q2VsbCA9IGFjdGlvbnNbYWN0aW9uSW5kZXhdO1xuICAgICAgY29uc3QgdGRBdHRyaWJ1dGVzID0gdGhpcy5yZWNvdmVyQXR0cmlidXRlcyhjdXJyZW50Q2VsbC5iYXNlQ2VsbCk7XG4gICAgICBzd2l0Y2ggKGN1cnJlbnRDZWxsLmFjdGlvbikge1xuICAgICAgICBjYXNlIFRhYmxlUmVzdWx0QWN0aW9uLnJlc3VsdEFjdGlvbi5BZGRDZWxsOlxuICAgICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgJChjdXJyZW50Q2VsbC5iYXNlQ2VsbCkuYWZ0ZXIoJzx0ZCcgKyB0ZEF0dHJpYnV0ZXMgKyAnPicgKyBkb20uYmxhbmsgKyAnPC90ZD4nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJChjdXJyZW50Q2VsbC5iYXNlQ2VsbCkuYmVmb3JlKCc8dGQnICsgdGRBdHRyaWJ1dGVzICsgJz4nICsgZG9tLmJsYW5rICsgJzwvdGQ+Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRhYmxlUmVzdWx0QWN0aW9uLnJlc3VsdEFjdGlvbi5TdW1TcGFuQ291bnQ6XG4gICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICBsZXQgY29sc3Bhbk51bWJlciA9IHBhcnNlSW50KGN1cnJlbnRDZWxsLmJhc2VDZWxsLmNvbFNwYW4sIDEwKTtcbiAgICAgICAgICAgIGNvbHNwYW5OdW1iZXIrKztcbiAgICAgICAgICAgIGN1cnJlbnRDZWxsLmJhc2VDZWxsLnNldEF0dHJpYnV0ZSgnY29sU3BhbicsIGNvbHNwYW5OdW1iZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKGN1cnJlbnRDZWxsLmJhc2VDZWxsKS5iZWZvcmUoJzx0ZCcgKyB0ZEF0dHJpYnV0ZXMgKyAnPicgKyBkb20uYmxhbmsgKyAnPC90ZD4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLypcbiAgKiBDb3B5IGF0dHJpYnV0ZXMgZnJvbSBlbGVtZW50LlxuICAqXG4gICogQHBhcmFtIHtvYmplY3R9IEVsZW1lbnQgdG8gcmVjb3ZlciBhdHRyaWJ1dGVzLlxuICAqIEByZXR1cm4ge3N0cmluZ30gQ29waWVkIHN0cmluZyBlbGVtZW50cy5cbiAgKi9cbiAgcmVjb3ZlckF0dHJpYnV0ZXMoZWwpIHtcbiAgICBsZXQgcmVzdWx0U3RyID0gJyc7XG5cbiAgICBpZiAoIWVsKSB7XG4gICAgICByZXR1cm4gcmVzdWx0U3RyO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dHJMaXN0ID0gZWwuYXR0cmlidXRlcyB8fCBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0ckxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhdHRyTGlzdFtpXS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpZCcpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChhdHRyTGlzdFtpXS5zcGVjaWZpZWQpIHtcbiAgICAgICAgcmVzdWx0U3RyICs9ICcgJyArIGF0dHJMaXN0W2ldLm5hbWUgKyAnPVxcJycgKyBhdHRyTGlzdFtpXS52YWx1ZSArICdcXCcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRTdHI7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGN1cnJlbnQgcm93XG4gICAqXG4gICAqIEBwYXJhbSB7V3JhcHBlZFJhbmdlfSBybmdcbiAgICogQHJldHVybiB7Tm9kZX1cbiAgICovXG4gIGRlbGV0ZVJvdyhybmcpIHtcbiAgICBjb25zdCBjZWxsID0gZG9tLmFuY2VzdG9yKHJuZy5jb21tb25BbmNlc3RvcigpLCBkb20uaXNDZWxsKTtcbiAgICBjb25zdCByb3cgPSAkKGNlbGwpLmNsb3Nlc3QoJ3RyJyk7XG4gICAgY29uc3QgY2VsbFBvcyA9IHJvdy5jaGlsZHJlbigndGQsIHRoJykuaW5kZXgoJChjZWxsKSk7XG4gICAgY29uc3Qgcm93UG9zID0gcm93WzBdLnJvd0luZGV4O1xuXG4gICAgY29uc3QgdlRhYmxlID0gbmV3IFRhYmxlUmVzdWx0QWN0aW9uKGNlbGwsIFRhYmxlUmVzdWx0QWN0aW9uLndoZXJlLlJvdyxcbiAgICAgIFRhYmxlUmVzdWx0QWN0aW9uLnJlcXVlc3RBY3Rpb24uRGVsZXRlLCAkKHJvdykuY2xvc2VzdCgndGFibGUnKVswXSk7XG4gICAgY29uc3QgYWN0aW9ucyA9IHZUYWJsZS5nZXRBY3Rpb25MaXN0KCk7XG5cbiAgICBmb3IgKGxldCBhY3Rpb25JbmRleCA9IDA7IGFjdGlvbkluZGV4IDwgYWN0aW9ucy5sZW5ndGg7IGFjdGlvbkluZGV4KyspIHtcbiAgICAgIGlmICghYWN0aW9uc1thY3Rpb25JbmRleF0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VDZWxsID0gYWN0aW9uc1thY3Rpb25JbmRleF0uYmFzZUNlbGw7XG4gICAgICBjb25zdCB2aXJ0dWFsUG9zaXRpb24gPSBhY3Rpb25zW2FjdGlvbkluZGV4XS52aXJ0dWFsVGFibGU7XG4gICAgICBjb25zdCBoYXNSb3dzcGFuID0gKGJhc2VDZWxsLnJvd1NwYW4gJiYgYmFzZUNlbGwucm93U3BhbiA+IDEpO1xuICAgICAgbGV0IHJvd3NwYW5OdW1iZXIgPSAoaGFzUm93c3BhbikgPyBwYXJzZUludChiYXNlQ2VsbC5yb3dTcGFuLCAxMCkgOiAwO1xuICAgICAgc3dpdGNoIChhY3Rpb25zW2FjdGlvbkluZGV4XS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSBUYWJsZVJlc3VsdEFjdGlvbi5yZXN1bHRBY3Rpb24uSWdub3JlOlxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlIFRhYmxlUmVzdWx0QWN0aW9uLnJlc3VsdEFjdGlvbi5BZGRDZWxsOlxuICAgICAgICAgIGNvbnN0IG5leHRSb3cgPSByb3cubmV4dCgndHInKVswXTtcbiAgICAgICAgICBpZiAoIW5leHRSb3cpIHsgY29udGludWU7IH1cbiAgICAgICAgICBjb25zdCBjbG9uZVJvdyA9IHJvd1swXS5jZWxsc1tjZWxsUG9zXTtcbiAgICAgICAgICBpZiAoaGFzUm93c3Bhbikge1xuICAgICAgICAgICAgaWYgKHJvd3NwYW5OdW1iZXIgPiAyKSB7XG4gICAgICAgICAgICAgIHJvd3NwYW5OdW1iZXItLTtcbiAgICAgICAgICAgICAgbmV4dFJvdy5pbnNlcnRCZWZvcmUoY2xvbmVSb3csIG5leHRSb3cuY2VsbHNbY2VsbFBvc10pO1xuICAgICAgICAgICAgICBuZXh0Um93LmNlbGxzW2NlbGxQb3NdLnNldEF0dHJpYnV0ZSgncm93U3BhbicsIHJvd3NwYW5OdW1iZXIpO1xuICAgICAgICAgICAgICBuZXh0Um93LmNlbGxzW2NlbGxQb3NdLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyb3dzcGFuTnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgIG5leHRSb3cuaW5zZXJ0QmVmb3JlKGNsb25lUm93LCBuZXh0Um93LmNlbGxzW2NlbGxQb3NdKTtcbiAgICAgICAgICAgICAgbmV4dFJvdy5jZWxsc1tjZWxsUG9zXS5yZW1vdmVBdHRyaWJ1dGUoJ3Jvd1NwYW4nKTtcbiAgICAgICAgICAgICAgbmV4dFJvdy5jZWxsc1tjZWxsUG9zXS5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgVGFibGVSZXN1bHRBY3Rpb24ucmVzdWx0QWN0aW9uLlN1YnRyYWN0U3BhbkNvdW50OlxuICAgICAgICAgIGlmIChoYXNSb3dzcGFuKSB7XG4gICAgICAgICAgICBpZiAocm93c3Bhbk51bWJlciA+IDIpIHtcbiAgICAgICAgICAgICAgcm93c3Bhbk51bWJlci0tO1xuICAgICAgICAgICAgICBiYXNlQ2VsbC5zZXRBdHRyaWJ1dGUoJ3Jvd1NwYW4nLCByb3dzcGFuTnVtYmVyKTtcbiAgICAgICAgICAgICAgaWYgKHZpcnR1YWxQb3NpdGlvbi5yb3dJbmRleCAhPT0gcm93UG9zICYmIGJhc2VDZWxsLmNlbGxJbmRleCA9PT0gY2VsbFBvcykgeyBiYXNlQ2VsbC5pbm5lckhUTUwgPSAnJzsgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyb3dzcGFuTnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgIGJhc2VDZWxsLnJlbW92ZUF0dHJpYnV0ZSgncm93U3BhbicpO1xuICAgICAgICAgICAgICBpZiAodmlydHVhbFBvc2l0aW9uLnJvd0luZGV4ICE9PSByb3dQb3MgJiYgYmFzZUNlbGwuY2VsbEluZGV4ID09PSBjZWxsUG9zKSB7IGJhc2VDZWxsLmlubmVySFRNTCA9ICcnOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlIFRhYmxlUmVzdWx0QWN0aW9uLnJlc3VsdEFjdGlvbi5SZW1vdmVDZWxsOlxuICAgICAgICAgIC8vIERvIG5vdCBuZWVkIHJlbW92ZSBjZWxsIGJlY2F1c2Ugcm93IHdpbGwgYmUgZGVsZXRlZC5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcm93LnJlbW92ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBjdXJyZW50IGNvbFxuICAgKlxuICAgKiBAcGFyYW0ge1dyYXBwZWRSYW5nZX0gcm5nXG4gICAqIEByZXR1cm4ge05vZGV9XG4gICAqL1xuICBkZWxldGVDb2wocm5nKSB7XG4gICAgY29uc3QgY2VsbCA9IGRvbS5hbmNlc3RvcihybmcuY29tbW9uQW5jZXN0b3IoKSwgZG9tLmlzQ2VsbCk7XG4gICAgY29uc3Qgcm93ID0gJChjZWxsKS5jbG9zZXN0KCd0cicpO1xuICAgIGNvbnN0IGNlbGxQb3MgPSByb3cuY2hpbGRyZW4oJ3RkLCB0aCcpLmluZGV4KCQoY2VsbCkpO1xuXG4gICAgY29uc3QgdlRhYmxlID0gbmV3IFRhYmxlUmVzdWx0QWN0aW9uKGNlbGwsIFRhYmxlUmVzdWx0QWN0aW9uLndoZXJlLkNvbHVtbixcbiAgICAgIFRhYmxlUmVzdWx0QWN0aW9uLnJlcXVlc3RBY3Rpb24uRGVsZXRlLCAkKHJvdykuY2xvc2VzdCgndGFibGUnKVswXSk7XG4gICAgY29uc3QgYWN0aW9ucyA9IHZUYWJsZS5nZXRBY3Rpb25MaXN0KCk7XG5cbiAgICBmb3IgKGxldCBhY3Rpb25JbmRleCA9IDA7IGFjdGlvbkluZGV4IDwgYWN0aW9ucy5sZW5ndGg7IGFjdGlvbkluZGV4KyspIHtcbiAgICAgIGlmICghYWN0aW9uc1thY3Rpb25JbmRleF0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGFjdGlvbnNbYWN0aW9uSW5kZXhdLmFjdGlvbikge1xuICAgICAgICBjYXNlIFRhYmxlUmVzdWx0QWN0aW9uLnJlc3VsdEFjdGlvbi5JZ25vcmU6XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgVGFibGVSZXN1bHRBY3Rpb24ucmVzdWx0QWN0aW9uLlN1YnRyYWN0U3BhbkNvdW50OlxuICAgICAgICAgIGNvbnN0IGJhc2VDZWxsID0gYWN0aW9uc1thY3Rpb25JbmRleF0uYmFzZUNlbGw7XG4gICAgICAgICAgY29uc3QgaGFzQ29sc3BhbiA9IChiYXNlQ2VsbC5jb2xTcGFuICYmIGJhc2VDZWxsLmNvbFNwYW4gPiAxKTtcbiAgICAgICAgICBpZiAoaGFzQ29sc3Bhbikge1xuICAgICAgICAgICAgbGV0IGNvbHNwYW5OdW1iZXIgPSAoYmFzZUNlbGwuY29sU3BhbikgPyBwYXJzZUludChiYXNlQ2VsbC5jb2xTcGFuLCAxMCkgOiAwO1xuICAgICAgICAgICAgaWYgKGNvbHNwYW5OdW1iZXIgPiAyKSB7XG4gICAgICAgICAgICAgIGNvbHNwYW5OdW1iZXItLTtcbiAgICAgICAgICAgICAgYmFzZUNlbGwuc2V0QXR0cmlidXRlKCdjb2xTcGFuJywgY29sc3Bhbk51bWJlcik7XG4gICAgICAgICAgICAgIGlmIChiYXNlQ2VsbC5jZWxsSW5kZXggPT09IGNlbGxQb3MpIHsgYmFzZUNlbGwuaW5uZXJIVE1MID0gJyc7IH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sc3Bhbk51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICBiYXNlQ2VsbC5yZW1vdmVBdHRyaWJ1dGUoJ2NvbFNwYW4nKTtcbiAgICAgICAgICAgICAgaWYgKGJhc2VDZWxsLmNlbGxJbmRleCA9PT0gY2VsbFBvcykgeyBiYXNlQ2VsbC5pbm5lckhUTUwgPSAnJzsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY2FzZSBUYWJsZVJlc3VsdEFjdGlvbi5yZXN1bHRBY3Rpb24uUmVtb3ZlQ2VsbDpcbiAgICAgICAgICBkb20ucmVtb3ZlKGFjdGlvbnNbYWN0aW9uSW5kZXhdLmJhc2VDZWxsLCB0cnVlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIGVtcHR5IHRhYmxlIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHJvd0NvdW50XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBjb2xDb3VudFxuICAgKiBAcmV0dXJuIHtOb2RlfVxuICAgKi9cbiAgY3JlYXRlVGFibGUoY29sQ291bnQsIHJvd0NvdW50LCBvcHRpb25zKSB7XG4gICAgY29uc3QgdGRzID0gW107XG4gICAgbGV0IHRkSFRNTDtcbiAgICBmb3IgKGxldCBpZHhDb2wgPSAwOyBpZHhDb2wgPCBjb2xDb3VudDsgaWR4Q29sKyspIHtcbiAgICAgIHRkcy5wdXNoKCc8dGQ+JyArIGRvbS5ibGFuayArICc8L3RkPicpO1xuICAgIH1cbiAgICB0ZEhUTUwgPSB0ZHMuam9pbignJyk7XG5cbiAgICBjb25zdCB0cnMgPSBbXTtcbiAgICBsZXQgdHJIVE1MO1xuICAgIGZvciAobGV0IGlkeFJvdyA9IDA7IGlkeFJvdyA8IHJvd0NvdW50OyBpZHhSb3crKykge1xuICAgICAgdHJzLnB1c2goJzx0cj4nICsgdGRIVE1MICsgJzwvdHI+Jyk7XG4gICAgfVxuICAgIHRySFRNTCA9IHRycy5qb2luKCcnKTtcbiAgICBjb25zdCAkdGFibGUgPSAkKCc8dGFibGU+JyArIHRySFRNTCArICc8L3RhYmxlPicpO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudGFibGVDbGFzc05hbWUpIHtcbiAgICAgICR0YWJsZS5hZGRDbGFzcyhvcHRpb25zLnRhYmxlQ2xhc3NOYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJHRhYmxlWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBjdXJyZW50IHRhYmxlXG4gICAqXG4gICAqIEBwYXJhbSB7V3JhcHBlZFJhbmdlfSBybmdcbiAgICogQHJldHVybiB7Tm9kZX1cbiAgICovXG4gIGRlbGV0ZVRhYmxlKHJuZykge1xuICAgIGNvbnN0IGNlbGwgPSBkb20uYW5jZXN0b3Iocm5nLmNvbW1vbkFuY2VzdG9yKCksIGRvbS5pc0NlbGwpO1xuICAgICQoY2VsbCkuY2xvc2VzdCgndGFibGUnKS5yZW1vdmUoKTtcbiAgfVxufVxuIl19