UNPKG

@catull/igniteui-angular

Version:

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

270 lines 37.7 kB
import { __decorate, __extends, __values } from "tslib"; import { GridBaseAPIService } from '../api.service'; import { DataType } from '../../data-operations/data-util'; import { TransactionType } from '../../services'; import { mergeObjects } from '../../core/utils'; import { Injectable } from '@angular/core'; var IgxTreeGridAPIService = /** @class */ (function (_super) { __extends(IgxTreeGridAPIService, _super); function IgxTreeGridAPIService() { return _super !== null && _super.apply(this, arguments) || this; } IgxTreeGridAPIService.prototype.get_all_data = function (transactions) { var grid = this.grid; var data = transactions ? grid.dataWithAddedInTransactionRows : grid.flatData; return data ? data : []; }; IgxTreeGridAPIService.prototype.get_summary_data = function () { var grid = this.grid; var data = grid.processedRootRecords.filter(function (row) { return row.isFilteredOutParent === undefined || row.isFilteredOutParent === false; }) .map(function (rec) { return rec.data; }); if (grid.transactions.enabled) { var deletedRows = grid.transactions.getTransactionLog().filter(function (t) { return t.type === TransactionType.DELETE; }).map(function (t) { return t.id; }); deletedRows.forEach(function (rowID) { var tempData = grid.primaryKey ? data.map(function (rec) { return rec[grid.primaryKey]; }) : data; var index = tempData.indexOf(rowID); if (index !== -1) { data.splice(index, 1); } }); } return data; }; IgxTreeGridAPIService.prototype.expand_row = function (rowID) { var grid = this.grid; var expandedStates = grid.expansionStates; expandedStates.set(rowID, true); grid.expansionStates = expandedStates; if (grid.rowEditable) { grid.endEdit(true); } }; IgxTreeGridAPIService.prototype.collapse_row = function (rowID) { var grid = this.grid; var expandedStates = grid.expansionStates; expandedStates.set(rowID, false); grid.expansionStates = expandedStates; if (grid.rowEditable) { grid.endEdit(true); } }; IgxTreeGridAPIService.prototype.toggle_row_expansion = function (rowID) { var grid = this.grid; var expandedStates = grid.expansionStates; var treeRecord = grid.records.get(rowID); if (treeRecord) { var isExpanded = this.get_row_expansion_state(treeRecord); expandedStates.set(rowID, !isExpanded); grid.expansionStates = expandedStates; } if (grid.rowEditable) { grid.endEdit(true); } }; // TODO: Maybe move the focus logic in the tree cell ? IgxTreeGridAPIService.prototype.trigger_row_expansion_toggle = function (row, expanded, event, visibleColumnIndex) { var _this = this; var grid = this.grid; if (row.expanded === expanded || ((!row.children || !row.children.length) && (!grid.loadChildrenOnDemand || (grid.hasChildrenKey && !row.data[grid.hasChildrenKey])))) { return; } var args = { rowID: row.rowID, expanded: expanded, event: event, cancel: false }; grid.onRowToggle.emit(args); if (args.cancel) { return; } visibleColumnIndex = visibleColumnIndex ? visibleColumnIndex : 0; var expandedStates = grid.expansionStates; expandedStates.set(row.rowID, expanded); grid.expansionStates = expandedStates; if (grid.rowEditable) { grid.endEdit(true); } // TODO: Leave it to grid observer requestAnimationFrame(function () { var el = _this.grid.selectionService.activeElement; if (el) { var cell = _this.get_cell_by_visible_index(el.row, el.column); if (cell) { cell.nativeElement.focus(); } } }); }; IgxTreeGridAPIService.prototype.expand_path_to_record = function (record) { var grid = this.grid; var expandedStates = grid.expansionStates; while (record.parent) { record = record.parent; var expanded = this.get_row_expansion_state(record); if (!expanded) { expandedStates.set(record.rowID, true); } } grid.expansionStates = expandedStates; if (grid.rowEditable) { grid.endEdit(true); } }; IgxTreeGridAPIService.prototype.get_row_expansion_state = function (record) { var grid = this.grid; var states = grid.expansionStates; var expanded = states.get(record.rowID); if (expanded !== undefined) { return expanded; } else { return record.children && record.children.length && record.level < grid.expansionDepth; } }; IgxTreeGridAPIService.prototype.update_row_in_array = function (value, rowID, index) { var grid = this.grid; if (grid.primaryKey && grid.foreignKey) { _super.prototype.update_row_in_array.call(this, value, rowID, index); } else { var record = grid.records.get(rowID); var childData = record.parent ? record.parent.data[grid.childDataKey] : grid.data; index = grid.primaryKey ? childData.map(function (c) { return c[grid.primaryKey]; }).indexOf(rowID) : childData.indexOf(rowID); childData[index] = value; } }; IgxTreeGridAPIService.prototype.should_apply_number_style = function (column) { return column.dataType === DataType.Number && column.visibleIndex !== 0; }; IgxTreeGridAPIService.prototype.deleteRowById = function (rowID) { var treeGrid = this.grid; var flatDataWithCascadeOnDeleteAndTransactions = treeGrid.primaryKey && treeGrid.foreignKey && treeGrid.cascadeOnDelete && treeGrid.transactions.enabled; if (flatDataWithCascadeOnDeleteAndTransactions) { treeGrid.transactions.startPending(); } _super.prototype.deleteRowById.call(this, rowID); if (flatDataWithCascadeOnDeleteAndTransactions) { treeGrid.transactions.endPending(true); } }; IgxTreeGridAPIService.prototype.deleteRowFromData = function (rowID, index) { var treeGrid = this.grid; var record = treeGrid.records.get(rowID); if (treeGrid.primaryKey && treeGrid.foreignKey) { index = treeGrid.primaryKey ? treeGrid.data.map(function (c) { return c[treeGrid.primaryKey]; }).indexOf(rowID) : treeGrid.data.indexOf(rowID); _super.prototype.deleteRowFromData.call(this, rowID, index); if (treeGrid.cascadeOnDelete) { if (record && record.children && record.children.length > 0) { for (var i = 0; i < record.children.length; i++) { var child = record.children[i]; _super.prototype.deleteRowById.call(this, child.rowID); } } } } else { var collection = record.parent ? record.parent.data[treeGrid.childDataKey] : treeGrid.data; index = treeGrid.primaryKey ? collection.map(function (c) { return c[treeGrid.primaryKey]; }).indexOf(rowID) : collection.indexOf(rowID); var selectedChildren = []; this.get_selected_children(record, selectedChildren); if (selectedChildren.length > 0) { treeGrid.deselectRows(selectedChildren); } if (treeGrid.transactions.enabled) { var path = treeGrid.generateRowPath(rowID); treeGrid.transactions.add({ id: rowID, type: TransactionType.DELETE, newValue: null, path: path }, collection[index]); } else { collection.splice(index, 1); } } }; /** * Updates related row of provided grid's data source with provided new row value * @param grid Grid to update data for * @param rowID ID of the row to update * @param rowValueInDataSource Initial value of the row as it is in data source * @param rowCurrentValue Current value of the row as it is with applied previous transactions * @param rowNewValue New value of the row */ IgxTreeGridAPIService.prototype.updateData = function (grid, rowID, rowValueInDataSource, rowCurrentValue, rowNewValue) { if (grid.transactions.enabled) { var path = grid.generateRowPath(rowID); var transaction = { id: rowID, type: TransactionType.UPDATE, newValue: rowNewValue, path: path }; grid.transactions.add(transaction, rowCurrentValue); } else { mergeObjects(rowValueInDataSource, rowNewValue); } }; IgxTreeGridAPIService.prototype.get_selected_children = function (record, selectedRowIDs) { var e_1, _a; var grid = this.grid; if (!record.children || record.children.length === 0) { return; } try { for (var _b = __values(record.children), _c = _b.next(); !_c.done; _c = _b.next()) { var child = _c.value; if (grid.selectionService.isRowSelected(child.rowID)) { selectedRowIDs.push(child.rowID); } this.get_selected_children(child, selectedRowIDs); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } }; IgxTreeGridAPIService.prototype.row_deleted_transaction = function (rowID) { return this.row_deleted_parent(rowID) || _super.prototype.row_deleted_transaction.call(this, rowID); }; IgxTreeGridAPIService.prototype.row_deleted_parent = function (rowID) { var grid = this.grid; if (!grid) { return false; } if ((grid.cascadeOnDelete && grid.foreignKey) || grid.childDataKey) { var node = grid.records.get(rowID); while (node) { var state = grid.transactions.getState(node.rowID); if (state && state.type === TransactionType.DELETE) { return true; } node = node.parent; } } return false; }; IgxTreeGridAPIService = __decorate([ Injectable() ], IgxTreeGridAPIService); return IgxTreeGridAPIService; }(GridBaseAPIService)); export { IgxTreeGridAPIService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1ncmlkLWFwaS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy90cmVlLWdyaWQvdHJlZS1ncmlkLWFwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHM0QsT0FBTyxFQUEyQixlQUFlLEVBQVMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzQztJQUEyQyx5Q0FBd0M7SUFBbkY7O0lBb1JBLENBQUM7SUFuUlUsNENBQVksR0FBbkIsVUFBb0IsWUFBc0I7UUFDdEMsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixJQUFNLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNoRixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLGdEQUFnQixHQUF2QjtRQUNJLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxtQkFBbUIsS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLG1CQUFtQixLQUFLLEtBQUssRUFBMUUsQ0FBMEUsQ0FBQzthQUMzSCxHQUFHLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxH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SUFBSSxDQUFDLE1BQU0sQ0FBQzthQUN0QjtTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQW5SUSxxQkFBcUI7UUFEakMsVUFBVSxFQUFFO09BQ0EscUJBQXFCLENBb1JqQztJQUFELDRCQUFDO0NBQUEsQUFwUkQsQ0FBMkMsa0JBQWtCLEdBb1I1RDtTQXBSWSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHcmlkQmFzZUFQSVNlcnZpY2UgfSBmcm9tICcuLi9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hUcmVlR3JpZENvbXBvbmVudCB9IGZyb20gJy4vdHJlZS1ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgSVRyZWVHcmlkUmVjb3JkIH0gZnJvbSAnLi90cmVlLWdyaWQuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJUm93VG9nZ2xlRXZlbnRBcmdzIH0gZnJvbSAnLi90cmVlLWdyaWQuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBIaWVyYXJjaGljYWxUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25UeXBlLCBTdGF0ZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IG1lcmdlT2JqZWN0cyB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29sdW1uVHlwZSB9IGZyb20gJy4uL2NvbW1vbi9jb2x1bW4uaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIElneFRyZWVHcmlkQVBJU2VydmljZSBleHRlbmRzIEdyaWRCYXNlQVBJU2VydmljZTxJZ3hUcmVlR3JpZENvbXBvbmVudD4ge1xuICAgIHB1YmxpYyBnZXRfYWxsX2RhdGEodHJhbnNhY3Rpb25zPzogYm9vbGVhbik6IGFueVtdIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRyYW5zYWN0aW9ucyA/IGdyaWQuZGF0YVdpdGhBZGRlZEluVHJhbnNhY3Rpb25Sb3dzIDogZ3JpZC5mbGF0RGF0YTtcbiAgICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhIDogW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldF9zdW1tYXJ5X2RhdGEoKSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBncmlkLnByb2Nlc3NlZFJvb3RSZWNvcmRzLmZpbHRlcihyb3cgPT4gcm93LmlzRmlsdGVyZWRPdXRQYXJlbnQgPT09IHVuZGVmaW5lZCB8fCByb3cuaXNGaWx0ZXJlZE91dFBhcmVudCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAubWFwKHJlYyA9PiByZWMuZGF0YSk7XG4gICAgICAgIGlmIChncmlkLnRyYW5zYWN0aW9ucy5lbmFibGVkKSB7XG4gICAgICAgICAgICBjb25zdCBkZWxldGVkUm93cyA9IGdyaWQudHJhbnNhY3Rpb25zLmdldFRyYW5zYWN0aW9uTG9nKCkuZmlsdGVyKHQgPT4gdC50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuREVMRVRFKS5tYXAodCA9PiB0LmlkKTtcbiAgICAgICAgICAgIGRlbGV0ZWRSb3dzLmZvckVhY2gocm93SUQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBEYXRhID0gZ3JpZC5wcmltYXJ5S2V5ID8gZGF0YS5tYXAocmVjID0+IHJlY1tncmlkLnByaW1hcnlLZXldKSA6IGRhdGE7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0ZW1wRGF0YS5pbmRleE9mKHJvd0lEKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwYW5kX3Jvdyhyb3dJRDogYW55KSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkU3RhdGVzID0gZ3JpZC5leHBhbnNpb25TdGF0ZXM7XG4gICAgICAgIGV4cGFuZGVkU3RhdGVzLnNldChyb3dJRCwgdHJ1ZSk7XG4gICAgICAgIGdyaWQuZXhwYW5zaW9uU3RhdGVzID0gZXhwYW5kZWRTdGF0ZXM7XG4gICAgICAgIGlmIChncmlkLnJvd0VkaXRhYmxlKSB7XG4gICAgICAgICAgICBncmlkLmVuZEVkaXQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY29sbGFwc2Vfcm93KHJvd0lEOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRTdGF0ZXMgPSBncmlkLmV4cGFuc2lvblN0YXRlcztcbiAgICAgICAgZXhwYW5kZWRTdGF0ZXMuc2V0KHJvd0lELCBmYWxzZSk7XG4gICAgICAgIGdyaWQuZXhwYW5zaW9uU3RhdGVzID0gZXhwYW5kZWRTdGF0ZXM7XG4gICAgICAgIGlmIChncmlkLnJvd0VkaXRhYmxlKSB7XG4gICAgICAgICAgICBncmlkLmVuZEVkaXQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9nZ2xlX3Jvd19leHBhbnNpb24ocm93SUQ6IGFueSkge1xuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuICAgICAgICBjb25zdCBleHBhbmRlZFN0YXRlcyA9IGdyaWQuZXhwYW5zaW9uU3RhdGVzO1xuICAgICAgICBjb25zdCB0cmVlUmVjb3JkID0gZ3JpZC5yZWNvcmRzLmdldChyb3dJRCk7XG5cbiAgICAgICAgaWYgKHRyZWVSZWNvcmQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzRXhwYW5kZWQgPSB0aGlzLmdldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHRyZWVSZWNvcmQpO1xuICAgICAgICAgICAgZXhwYW5kZWRTdGF0ZXMuc2V0KHJvd0lELCAhaXNFeHBhbmRlZCk7XG4gICAgICAgICAgICBncmlkLmV4cGFuc2lvblN0YXRlcyA9IGV4cGFuZGVkU3RhdGVzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChncmlkLnJvd0VkaXRhYmxlKSB7XG4gICAgICAgICAgICBncmlkLmVuZEVkaXQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBNYXliZSBtb3ZlIHRoZSBmb2N1cyBsb2dpYyBpbiB0aGUgdHJlZSBjZWxsID9cbiAgICBwdWJsaWMgdHJpZ2dlcl9yb3dfZXhwYW5zaW9uX3RvZ2dsZShyb3c6IElUcmVlR3JpZFJlY29yZCwgZXhwYW5kZWQ6IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQsIHZpc2libGVDb2x1bW5JbmRleD8pIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcblxuICAgICAgICBpZiAocm93LmV4cGFuZGVkID09PSBleHBhbmRlZCB8fFxuICAgICAgICAgICAgKCghcm93LmNoaWxkcmVuIHx8ICFyb3cuY2hpbGRyZW4ubGVuZ3RoKSAmJiAoIWdyaWQubG9hZENoaWxkcmVuT25EZW1hbmQgfHxcbiAgICAgICAgICAgIChncmlkLmhhc0NoaWxkcmVuS2V5ICYmICFyb3cuZGF0YVtncmlkLmhhc0NoaWxkcmVuS2V5XSkpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJnczogSVJvd1RvZ2dsZUV2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIHJvd0lEOiByb3cucm93SUQsXG4gICAgICAgICAgICBleHBhbmRlZDogZXhwYW5kZWQsXG4gICAgICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgICAgICBjYW5jZWw6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGdyaWQub25Sb3dUb2dnbGUuZW1pdChhcmdzKTtcblxuICAgICAgICBpZiAoYXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2aXNpYmxlQ29sdW1uSW5kZXggPSB2aXNpYmxlQ29sdW1uSW5kZXggPyB2aXNpYmxlQ29sdW1uSW5kZXggOiAwO1xuICAgICAgICBjb25zdCBleHBhbmRlZFN0YXRlcyA9IGdyaWQuZXhwYW5zaW9uU3RhdGVzO1xuICAgICAgICBleHBhbmRlZFN0YXRlcy5zZXQocm93LnJvd0lELCBleHBhbmRlZCk7XG4gICAgICAgIGdyaWQuZXhwYW5zaW9uU3RhdGVzID0gZXhwYW5kZWRTdGF0ZXM7XG5cbiAgICAgICAgaWYgKGdyaWQucm93RWRpdGFibGUpIHtcbiAgICAgICAgICAgIGdyaWQuZW5kRWRpdCh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IExlYXZlIGl0IHRvIGdyaWQgb2JzZXJ2ZXJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gdGhpcy5ncmlkLnNlbGVjdGlvblNlcnZpY2UuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmdldF9jZWxsX2J5X3Zpc2libGVfaW5kZXgoZWwucm93LCBlbC5jb2x1bW4pO1xuICAgICAgICAgICAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNlbGwubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGV4cGFuZF9wYXRoX3RvX3JlY29yZChyZWNvcmQ6IElUcmVlR3JpZFJlY29yZCkge1xuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuICAgICAgICBjb25zdCBleHBhbmRlZFN0YXRlcyA9IGdyaWQuZXhwYW5zaW9uU3RhdGVzO1xuXG4gICAgICAgIHdoaWxlIChyZWNvcmQucGFyZW50KSB7XG4gICAgICAgICAgICByZWNvcmQgPSByZWNvcmQucGFyZW50O1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmdldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHJlY29yZCk7XG5cbiAgICAgICAgICAgIGlmICghZXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICBleHBhbmRlZFN0YXRlcy5zZXQocmVjb3JkLnJvd0lELCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBncmlkLmV4cGFuc2lvblN0YXRlcyA9IGV4cGFuZGVkU3RhdGVzO1xuXG4gICAgICAgIGlmIChncmlkLnJvd0VkaXRhYmxlKSB7XG4gICAgICAgICAgICBncmlkLmVuZEVkaXQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0X3Jvd19leHBhbnNpb25fc3RhdGUocmVjb3JkOiBJVHJlZUdyaWRSZWNvcmQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgY29uc3Qgc3RhdGVzID0gZ3JpZC5leHBhbnNpb25TdGF0ZXM7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkID0gc3RhdGVzLmdldChyZWNvcmQucm93SUQpO1xuXG4gICAgICAgIGlmIChleHBhbmRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwYW5kZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkLmNoaWxkcmVuICYmIHJlY29yZC5jaGlsZHJlbi5sZW5ndGggJiYgcmVjb3JkLmxldmVsIDwgZ3JpZC5leHBhbnNpb25EZXB0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCB1cGRhdGVfcm93X2luX2FycmF5KHZhbHVlOiBhbnksIHJvd0lEOiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgaWYgKGdyaWQucHJpbWFyeUtleSAmJiBncmlkLmZvcmVpZ25LZXkpIHtcbiAgICAgICAgICAgIHN1cGVyLnVwZGF0ZV9yb3dfaW5fYXJyYXkodmFsdWUsIHJvd0lELCBpbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBncmlkLnJlY29yZHMuZ2V0KHJvd0lEKTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkRGF0YSA9IHJlY29yZC5wYXJlbnQgPyByZWNvcmQucGFyZW50LmRhdGFbZ3JpZC5jaGlsZERhdGFLZXldIDogZ3JpZC5kYXRhO1xuICAgICAgICAgICAgaW5kZXggPSBncmlkLnByaW1hcnlLZXkgPyBjaGlsZERhdGEubWFwKGMgPT4gY1tncmlkLnByaW1hcnlLZXldKS5pbmRleE9mKHJvd0lEKSA6XG4gICAgICAgICAgICAgICAgY2hpbGREYXRhLmluZGV4T2Yocm93SUQpO1xuICAgICAgICAgICAgY2hpbGREYXRhW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNob3VsZF9hcHBseV9udW1iZXJfc3R5bGUoY29sdW1uOiBDb2x1bW5UeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjb2x1bW4uZGF0YVR5cGUgPT09IERhdGFUeXBlLk51bWJlciAmJiBjb2x1bW4udmlzaWJsZUluZGV4ICE9PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGVSb3dCeUlkKHJvd0lEOiBhbnkpIHtcbiAgICAgICAgY29uc3QgdHJlZUdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGNvbnN0IGZsYXREYXRhV2l0aENhc2NhZGVPbkRlbGV0ZUFuZFRyYW5zYWN0aW9ucyA9XG4gICAgICAgIHRyZWVHcmlkLnByaW1hcnlLZXkgJiZcbiAgICAgICAgdHJlZUdyaWQuZm9yZWlnbktleSAmJlxuICAgICAgICB0cmVlR3JpZC5jYXNjYWRlT25EZWxldGUgJiZcbiAgICAgICAgdHJlZUdyaWQudHJhbnNhY3Rpb25zLmVuYWJsZWQ7XG5cbiAgICAgICAgaWYgKGZsYXREYXRhV2l0aENhc2NhZGVPbkRlbGV0ZUFuZFRyYW5zYWN0aW9ucykge1xuICAgICAgICAgICAgdHJlZUdyaWQudHJhbnNhY3Rpb25zLnN0YXJ0UGVuZGluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIuZGVsZXRlUm93QnlJZChyb3dJRCk7XG5cbiAgICAgICAgaWYgKGZsYXREYXRhV2l0aENhc2NhZGVPbkRlbGV0ZUFuZFRyYW5zYWN0aW9ucykge1xuICAgICAgICAgICAgdHJlZUdyaWQudHJhbnNhY3Rpb25zLmVuZFBlbmRpbmcodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlUm93RnJvbURhdGEocm93SUQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCB0cmVlR3JpZCA9IHRoaXMuZ3JpZDtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gdHJlZUdyaWQucmVjb3Jkcy5nZXQocm93SUQpO1xuXG4gICAgICAgIGlmICh0cmVlR3JpZC5wcmltYXJ5S2V5ICYmIHRyZWVHcmlkLmZvcmVpZ25LZXkpIHtcbiAgICAgICAgICAgIGluZGV4ID0gdHJlZUdyaWQucHJpbWFyeUtleSA/XG4gICAgICAgICAgICAgICAgdHJlZUdyaWQuZGF0YS5tYXAoYyA9PiBjW3RyZWVHcmlkLnByaW1hcnlLZXldKS5pbmRleE9mKHJvd0lEKSA6XG4gICAgICAgICAgICAgICAgdHJlZUdyaWQuZGF0YS5pbmRleE9mKHJvd0lEKTtcbiAgICAgICAgICAgIHN1cGVyLmRlbGV0ZVJvd0Zyb21EYXRhKHJvd0lELCBpbmRleCk7XG5cbiAgICAgICAgICAgIGlmICh0cmVlR3JpZC5jYXNjYWRlT25EZWxldGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVjb3JkICYmIHJlY29yZC5jaGlsZHJlbiAmJiByZWNvcmQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29yZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSByZWNvcmQuY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5kZWxldGVSb3dCeUlkKGNoaWxkLnJvd0lEKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSByZWNvcmQucGFyZW50ID8gcmVjb3JkLnBhcmVudC5kYXRhW3RyZWVHcmlkLmNoaWxkRGF0YUtleV0gOiB0cmVlR3JpZC5kYXRhO1xuICAgICAgICAgICAgaW5kZXggPSB0cmVlR3JpZC5wcmltYXJ5S2V5ID9cbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLm1hcChjID0+IGNbdHJlZUdyaWQucHJpbWFyeUtleV0pLmluZGV4T2Yocm93SUQpIDpcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmluZGV4T2Yocm93SUQpO1xuXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENoaWxkcmVuID0gW107XG4gICAgICAgICAgICB0aGlzLmdldF9zZWxlY3RlZF9jaGlsZHJlbihyZWNvcmQsIHNlbGVjdGVkQ2hpbGRyZW4pO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRyZWVHcmlkLmRlc2VsZWN0Um93cyhzZWxlY3RlZENoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRyZWVHcmlkLnRyYW5zYWN0aW9ucy5lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IHRyZWVHcmlkLmdlbmVyYXRlUm93UGF0aChyb3dJRCk7XG4gICAgICAgICAgICAgICAgdHJlZUdyaWQudHJhbnNhY3Rpb25zLmFkZCh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiByb3dJRCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkRFTEVURSxcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHBhdGhcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uW2luZGV4XVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgcmVsYXRlZCByb3cgb2YgcHJvdmlkZWQgZ3JpZCdzIGRhdGEgc291cmNlIHdpdGggcHJvdmlkZWQgbmV3IHJvdyB2YWx1ZVxuICAgICAqIEBwYXJhbSBncmlkIEdyaWQgdG8gdXBkYXRlIGRhdGEgZm9yXG4gICAgICogQHBhcmFtIHJvd0lEIElEIG9mIHRoZSByb3cgdG8gdXBkYXRlXG4gICAgICogQHBhcmFtIHJvd1ZhbHVlSW5EYXRhU291cmNlIEluaXRpYWwgdmFsdWUgb2YgdGhlIHJvdyBhcyBpdCBpcyBpbiBkYXRhIHNvdXJjZVxuICAgICAqIEBwYXJhbSByb3dDdXJyZW50VmFsdWUgQ3VycmVudCB2YWx1ZSBvZiB0aGUgcm93IGFzIGl0IGlzIHdpdGggYXBwbGllZCBwcmV2aW91cyB0cmFuc2FjdGlvbnNcbiAgICAgKiBAcGFyYW0gcm93TmV3VmFsdWUgTmV3IHZhbHVlIG9mIHRoZSByb3dcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlRGF0YShcbiAgICAgICAgZ3JpZDogSWd4VHJlZUdyaWRDb21wb25lbnQsXG4gICAgICAgIHJvd0lEOiBhbnksXG4gICAgICAgIHJvd1ZhbHVlSW5EYXRhU291cmNlOiBhbnksXG4gICAgICAgIHJvd0N1cnJlbnRWYWx1ZTogYW55LFxuICAgICAgICByb3dOZXdWYWx1ZTogeyBbeDogc3RyaW5nXTogYW55IH0pIHtcbiAgICAgICAgaWYgKGdyaWQudHJhbnNhY3Rpb25zLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBncmlkLmdlbmVyYXRlUm93UGF0aChyb3dJRCk7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbjogSGllcmFyY2hpY2FsVHJhbnNhY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IHJvd0lELFxuICAgICAgICAgICAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5VUERBVEUsXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHJvd05ld1ZhbHVlLFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBncmlkLnRyYW5zYWN0aW9ucy5hZGQodHJhbnNhY3Rpb24sIHJvd0N1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXJnZU9iamVjdHMocm93VmFsdWVJbkRhdGFTb3VyY2UsIHJvd05ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRfc2VsZWN0ZWRfY2hpbGRyZW4ocmVjb3JkOiBJVHJlZUdyaWRSZWNvcmQsIHNlbGVjdGVkUm93SURzOiBhbnlbXSkge1xuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkO1xuICAgICAgICBpZiAoIXJlY29yZC5jaGlsZHJlbiB8fCByZWNvcmQuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiByZWNvcmQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChncmlkLnNlbGVjdGlvblNlcnZpY2UuaXNSb3dTZWxlY3RlZChjaGlsZC5yb3dJRCkpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFJvd0lEcy5wdXNoKGNoaWxkLnJvd0lEKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ2V0X3NlbGVjdGVkX2NoaWxkcmVuKGNoaWxkLCBzZWxlY3RlZFJvd0lEcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcm93X2RlbGV0ZWRfdHJhbnNhY3Rpb24ocm93SUQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dfZGVsZXRlZF9wYXJlbnQocm93SUQpIHx8IHN1cGVyLnJvd19kZWxldGVkX3RyYW5zYWN0aW9uKHJvd0lEKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJvd19kZWxldGVkX3BhcmVudChyb3dJRDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSB0aGlzLmdyaWQ7XG4gICAgICAgIGlmICghZ3JpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoZ3JpZC5jYXNjYWRlT25EZWxldGUgJiYgZ3JpZC5mb3JlaWduS2V5KSB8fCBncmlkLmNoaWxkRGF0YUtleSkge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBncmlkLnJlY29yZHMuZ2V0KHJvd0lEKTtcbiAgICAgICAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGU6IFN0YXRlID0gZ3JpZC50cmFuc2FjdGlvbnMuZ2V0U3RhdGUobm9kZS5yb3dJRCk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlICYmIHN0YXRlLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5ERUxFVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIl19