UNPKG

@catull/igniteui-angular

Version:

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

198 lines 29.6 kB
import { IgxSorting, IgxDataRecordSorting } from './sorting-strategy'; import { IgxGrouping } from './grouping-strategy'; import { PagingError } from './paging-state.interface'; import { FilteringStrategy } from './filtering-strategy'; import { cloneValue, mergeObjects } from '../core/utils'; import { TransactionType } from '../services/transaction/transaction'; import { getHierarchy, isHierarchyMatch } from './operations'; /** * @hidden */ export var DataType; (function (DataType) { DataType["String"] = "string"; DataType["Number"] = "number"; DataType["Boolean"] = "boolean"; DataType["Date"] = "date"; })(DataType || (DataType = {})); /** * @hidden */ export class DataUtil { static sort(data, expressions, sorting = new IgxSorting()) { return sorting.sort(data, expressions); } static treeGridSort(hierarchicalData, expressions, sorting = new IgxDataRecordSorting(), parent) { let res = []; hierarchicalData.forEach((hr) => { const rec = DataUtil.cloneTreeGridRecord(hr); rec.parent = parent; if (rec.children) { rec.children = DataUtil.treeGridSort(rec.children, expressions, sorting, rec); } res.push(rec); }); res = DataUtil.sort(res, expressions, sorting); return res; } static cloneTreeGridRecord(hierarchicalRecord) { const rec = { rowID: hierarchicalRecord.rowID, data: hierarchicalRecord.data, children: hierarchicalRecord.children, isFilteredOutParent: hierarchicalRecord.isFilteredOutParent, level: hierarchicalRecord.level, expanded: hierarchicalRecord.expanded }; return rec; } static group(data, state, grid = null, groupsRecords = [], fullResult = { data: [], metadata: [] }) { const grouping = new IgxGrouping(); groupsRecords.splice(0, groupsRecords.length); return grouping.groupBy(data, state, grid, groupsRecords, fullResult); } static page(data, state) { if (!state) { return data; } const len = data.length; const index = state.index; const res = []; const recordsPerPage = state.recordsPerPage; state.metadata = { countPages: 0, countRecords: data.length, error: PagingError.None }; if (index < 0 || isNaN(index)) { state.metadata.error = PagingError.IncorrectPageIndex; return res; } if (recordsPerPage <= 0 || isNaN(recordsPerPage)) { state.metadata.error = PagingError.IncorrectRecordsPerPage; return res; } state.metadata.countPages = Math.ceil(len / recordsPerPage); if (!len) { return data; } if (index >= state.metadata.countPages) { state.metadata.error = PagingError.IncorrectPageIndex; return res; } return data.slice(index * recordsPerPage, (index + 1) * recordsPerPage); } static filter(data, state) { if (!state.strategy) { state.strategy = new FilteringStrategy(); } return state.strategy.filter(data, state.expressionsTree, state.advancedExpressionsTree); } static correctPagingState(state, length) { const maxPage = Math.ceil(length / state.recordsPerPage) - 1; if (!isNaN(maxPage) && state.index > maxPage) { state.index = maxPage; } } static getHierarchy(gRow) { return getHierarchy(gRow); } static isHierarchyMatch(h1, h2) { return isHierarchyMatch(h1, h2); } /** * Merges all changes from provided transactions into provided data collection * @param data Collection to merge * @param transactions Transactions to merge into data * @param primaryKey Primary key of the collection, if any * @param deleteRows Should delete rows with DELETE transaction type from data * @returns Provided data collections updated with all provided transactions */ static mergeTransactions(data, transactions, primaryKey, deleteRows = false) { data.forEach((item, index) => { const rowId = primaryKey ? item[primaryKey] : item; const transaction = transactions.find(t => t.id === rowId); if (transaction && transaction.type === TransactionType.UPDATE) { data[index] = transaction.newValue; } }); if (deleteRows) { transactions .filter(t => t.type === TransactionType.DELETE) .forEach(t => { const index = primaryKey ? data.findIndex(d => d[primaryKey] === t.id) : data.findIndex(d => d === t.id); if (0 <= index && index < data.length) { data.splice(index, 1); } }); } data.push(...transactions .filter(t => t.type === TransactionType.ADD) .map(t => t.newValue)); return data; } /** * Merges all changes from provided transactions into provided hierarchical data collection * @param data Collection to merge * @param transactions Transactions to merge into data * @param childDataKey Data key of child collections * @param primaryKey Primary key of the collection, if any * @param deleteRows Should delete rows with DELETE transaction type from data * @returns Provided data collections updated with all provided transactions */ static mergeHierarchicalTransactions(data, transactions, childDataKey, primaryKey, deleteRows = false) { for (const transaction of transactions) { if (transaction.path) { const parent = this.findParentFromPath(data, primaryKey, childDataKey, transaction.path); let collection = parent ? parent[childDataKey] : data; switch (transaction.type) { case TransactionType.ADD: // if there is no parent this is ADD row at root level if (parent && !parent[childDataKey]) { parent[childDataKey] = collection = []; } collection.push(transaction.newValue); break; case TransactionType.UPDATE: const updateIndex = collection.findIndex(x => x[primaryKey] === transaction.id); if (updateIndex !== -1) { collection[updateIndex] = mergeObjects(cloneValue(collection[updateIndex]), transaction.newValue); } break; case TransactionType.DELETE: if (deleteRows) { const deleteIndex = collection.findIndex(r => r[primaryKey] === transaction.id); if (deleteIndex !== -1) { collection.splice(deleteIndex, 1); } } break; } } else { // if there is no path this is ADD row in root. Push the newValue to data data.push(transaction.newValue); } } return data; } static parseValue(dataType, value) { if (dataType === DataType.Number) { value = parseFloat(value); } return value; } static findParentFromPath(data, primaryKey, childDataKey, path) { let collection = data; let result; for (const id of path) { result = collection && collection.find(x => x[primaryKey] === id); if (!result) { break; } collection = result[childDataKey]; } return result; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS11dGlsLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQXdCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR2xELE9BQU8sRUFBZ0IsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFNckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFlLGVBQWUsRUFBMkIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM1RyxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTlEOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksUUFLWDtBQUxELFdBQVksUUFBUTtJQUNoQiw2QkFBaUIsQ0FBQTtJQUNqQiw2QkFBaUIsQ0FBQTtJQUNqQiwrQkFBbUIsQ0FBQTtJQUNuQix5QkFBYSxDQUFBO0FBQ2pCLENBQUMsRUFMVyxRQUFRLEtBQVIsUUFBUSxRQUtuQjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFDVixNQUFNLENBQUMsSUFBSSxDQUFJLElBQVMsRUFBRSxXQUFpQyxFQUFFLFVBQWdDLElBQUksVUFBVSxFQUFFO1FBQ2hILE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVNLE1BQU0sQ0FBQyxZQUFZLENBQUMsZ0JBQW1DLEVBQzFELFdBQWlDLEVBQ2pDLFVBQWdDLElBQUksb0JBQW9CLEVBQUUsRUFDMUQsTUFBd0I7UUFDeEIsSUFBSSxH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Q0FBQztJQUVPLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFXLEVBQUUsVUFBZSxFQUFFLFlBQWlCLEVBQUUsSUFBVztRQUMxRixJQUFJLFVBQVUsR0FBVSxJQUFJLENBQUM7UUFDN0IsSUFBSSxNQUFXLENBQUM7UUFFaEIsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDbkIsTUFBTSxHQUFHLFVBQVUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1QsTUFBTTthQUNUO1lBRUQsVUFBVSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNyQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElGaWx0ZXJpbmdTdGF0ZSB9IGZyb20gJy4vZmlsdGVyaW5nLXN0YXRlLmludGVyZmFjZSc7XG5cbmltcG9ydCB7IElneFNvcnRpbmcsIElneERhdGFSZWNvcmRTb3J0aW5nLCBJR3JpZFNvcnRpbmdTdHJhdGVneSB9IGZyb20gJy4vc29ydGluZy1zdHJhdGVneSc7XG5pbXBvcnQgeyBJZ3hHcm91cGluZyB9IGZyb20gJy4vZ3JvdXBpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHsgSUdyb3VwQnlSZXN1bHQgfSBmcm9tICcuL2dyb3VwaW5nLXJlc3VsdC5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyBJUGFnaW5nU3RhdGUsIFBhZ2luZ0Vycm9yIH0gZnJvbSAnLi9wYWdpbmctc3RhdGUuaW50ZXJmYWNlJztcblxuaW1wb3J0IHsgSUdyb3VwQnlLZXkgfSBmcm9tICcuL2dyb3VwYnktZXhwYW5kLXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJR3JvdXBCeVJlY29yZCB9IGZyb20gJy4vZ3JvdXBieS1yZWNvcmQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElHcm91cGluZ1N0YXRlIH0gZnJvbSAnLi9ncm91cGJ5LXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJU29ydGluZ0V4cHJlc3Npb24gfSBmcm9tICcuL3NvcnRpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmlsdGVyaW5nU3RyYXRlZ3kgfSBmcm9tICcuL2ZpbHRlcmluZy1zdHJhdGVneSc7XG5pbXBvcnQgeyBJVHJlZUdyaWRSZWNvcmQgfSBmcm9tICcuLi9ncmlkcy90cmVlLWdyaWQnO1xuaW1wb3J0IHsgY2xvbmVWYWx1ZSwgbWVyZ2VPYmplY3RzIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25UeXBlLCBIaWVyYXJjaGljYWxUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3NlcnZpY2VzL3RyYW5zYWN0aW9uL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IGdldEhpZXJhcmNoeSwgaXNIaWVyYXJjaHlNYXRjaCB9IGZyb20gJy4vb3BlcmF0aW9ucyc7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZW51bSBEYXRhVHlwZSB7XG4gICAgU3RyaW5nID0gJ3N0cmluZycsXG4gICAgTnVtYmVyID0gJ251bWJlcicsXG4gICAgQm9vbGVhbiA9ICdib29sZWFuJyxcbiAgICBEYXRlID0gJ2RhdGUnXG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgRGF0YVV0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgc29ydDxUPihkYXRhOiBUW10sIGV4cHJlc3Npb25zOiBJU29ydGluZ0V4cHJlc3Npb25bXSwgc29ydGluZzogSUdyaWRTb3J0aW5nU3RyYXRlZ3kgPSBuZXcgSWd4U29ydGluZygpKTogVFtdIHtcbiAgICAgICAgcmV0dXJuIHNvcnRpbmcuc29ydChkYXRhLCBleHByZXNzaW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0cmVlR3JpZFNvcnQoaGllcmFyY2hpY2FsRGF0YTogSVRyZWVHcmlkUmVjb3JkW10sXG4gICAgICAgIGV4cHJlc3Npb25zOiBJU29ydGluZ0V4cHJlc3Npb25bXSxcbiAgICAgICAgc29ydGluZzogSUdyaWRTb3J0aW5nU3RyYXRlZ3kgPSBuZXcgSWd4RGF0YVJlY29yZFNvcnRpbmcoKSxcbiAgICAgICAgcGFyZW50PzogSVRyZWVHcmlkUmVjb3JkKTogSVRyZWVHcmlkUmVjb3JkW10ge1xuICAgICAgICBsZXQgcmVzOiBJVHJlZUdyaWRSZWNvcmRbXSA9IFtdO1xuICAgICAgICBoaWVyYXJjaGljYWxEYXRhLmZvckVhY2goKGhyOiBJVHJlZUdyaWRSZWNvcmQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYzogSVRyZWVHcmlkUmVjb3JkID0gRGF0YVV0aWwuY2xvbmVUcmVlR3JpZFJlY29yZChocik7XG4gICAgICAgICAgICByZWMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICAgICAgaWYgKHJlYy5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIHJlYy5jaGlsZHJlbiA9IERhdGFVdGlsLnRyZWVHcmlkU29ydChyZWMuY2hpbGRyZW4sIGV4cHJlc3Npb25zLCBzb3J0aW5nLCByZWMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnB1c2gocmVjKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzID0gRGF0YVV0aWwuc29ydChyZXMsIGV4cHJlc3Npb25zLCBzb3J0aW5nKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xvbmVUcmVlR3JpZFJlY29yZChoaWVyYXJjaGljYWxSZWNvcmQ6IElUcmVlR3JpZFJlY29yZCkge1xuICAgICAgICBjb25zdCByZWM6IElUcmVlR3JpZFJlY29yZCA9IHtcbiAgICAgICAgICAgIHJvd0lEOiBoaWVyYXJjaGljYWxSZWNvcmQucm93SUQsXG4gICAgICAgICAgICBkYXRhOiBoaWVyYXJjaGljYWxSZWNvcmQuZGF0YSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBoaWVyYXJjaGljYWxSZWNvcmQuY2hpbGRyZW4sXG4gICAgICAgICAgICBpc0ZpbHRlcmVkT3V0UGFyZW50OiBoaWVyYXJjaGljYWxSZWNvcmQuaXNGaWx0ZXJlZE91dFBhcmVudCxcbiAgICAgICAgICAgIGxldmVsOiBoaWVyYXJjaGljYWxSZWNvcmQubGV2ZWwsXG4gICAgICAgICAgICBleHBhbmRlZDogaGllcmFyY2hpY2FsUmVjb3JkLmV4cGFuZGVkXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZWM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBncm91cDxUPihkYXRhOiBUW10sIHN0YXRlOiBJR3JvdXBpbmdTdGF0ZSwgZ3JpZDogYW55ID0gbnVsbCxcbiAgICAgICAgZ3JvdXBzUmVjb3JkczogYW55W10gPSBbXSwgZnVsbFJlc3VsdDogSUdyb3VwQnlSZXN1bHQgPSB7IGRhdGE6IFtdLCBtZXRhZGF0YTogW10gfSk6IElHcm91cEJ5UmVzdWx0IHtcbiAgICAgICAgY29uc3QgZ3JvdXBpbmcgPSBuZXcgSWd4R3JvdXBpbmcoKTtcbiAgICAgICAgZ3JvdXBzUmVjb3Jkcy5zcGxpY2UoMCwgZ3JvdXBzUmVjb3Jkcy5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gZ3JvdXBpbmcuZ3JvdXBCeShkYXRhLCBzdGF0ZSwgZ3JpZCwgZ3JvdXBzUmVjb3JkcywgZnVsbFJlc3VsdCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwYWdlPFQ+KGRhdGE6IFRbXSwgc3RhdGU6IElQYWdpbmdTdGF0ZSk6IFRbXSB7XG4gICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlbiA9IGRhdGEubGVuZ3RoO1xuICAgICAgICBjb25zdCBpbmRleCA9IHN0YXRlLmluZGV4O1xuICAgICAgICBjb25zdCByZXMgPSBbXTtcbiAgICAgICAgY29uc3QgcmVjb3Jkc1BlclBhZ2UgPSBzdGF0ZS5yZWNvcmRzUGVyUGFnZTtcbiAgICAgICAgc3RhdGUubWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjb3VudFBhZ2VzOiAwLFxuICAgICAgICAgICAgY291bnRSZWNvcmRzOiBkYXRhLmxlbmd0aCxcbiAgICAgICAgICAgIGVycm9yOiBQYWdpbmdFcnJvci5Ob25lXG4gICAgICAgIH07XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaXNOYU4oaW5kZXgpKSB7XG4gICAgICAgICAgICBzdGF0ZS5tZXRhZGF0YS5lcnJvciA9IFBhZ2luZ0Vycm9yLkluY29ycmVjdFBhZ2VJbmRleDtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlY29yZHNQZXJQYWdlIDw9IDAgfHwgaXNOYU4ocmVjb3Jkc1BlclBhZ2UpKSB7XG4gICAgICAgICAgICBzdGF0ZS5tZXRhZGF0YS5lcnJvciA9IFBhZ2luZ0Vycm9yLkluY29ycmVjdFJlY29yZHNQZXJQYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tZXRhZGF0YS5jb3VudFBhZ2VzID0gTWF0aC5jZWlsKGxlbiAvIHJlY29yZHNQZXJQYWdlKTtcbiAgICAgICAgaWYgKCFsZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA+PSBzdGF0ZS5tZXRhZGF0YS5jb3VudFBhZ2VzKSB7XG4gICAgICAgICAgICBzdGF0ZS5tZXRhZGF0YS5lcnJvciA9IFBhZ2luZ0Vycm9yLkluY29ycmVjdFBhZ2VJbmRleDtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGEuc2xpY2UoaW5kZXggKiByZWNvcmRzUGVyUGFnZSwgKGluZGV4ICsgMSkgKiByZWNvcmRzUGVyUGFnZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmaWx0ZXI8VD4oZGF0YTogVFtdLCBzdGF0ZTogSUZpbHRlcmluZ1N0YXRlKTogVFtdIHtcbiAgICAgICAgaWYgKCFzdGF0ZS5zdHJhdGVneSkge1xuICAgICAgICAgICAgc3RhdGUuc3RyYXRlZ3kgPSBuZXcgRmlsdGVyaW5nU3RyYXRlZ3koKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGUuc3RyYXRlZ3kuZmlsdGVyKGRhdGEsIHN0YXRlLmV4cHJlc3Npb25zVHJlZSwgc3RhdGUuYWR2YW5jZWRFeHByZXNzaW9uc1RyZWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY29ycmVjdFBhZ2luZ1N0YXRlKHN0YXRlOiBJUGFnaW5nU3RhdGUsIGxlbmd0aDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG1heFBhZ2UgPSBNYXRoLmNlaWwobGVuZ3RoIC8gc3RhdGUucmVjb3Jkc1BlclBhZ2UpIC0gMTtcbiAgICAgICAgaWYgKCFpc05hTihtYXhQYWdlKSAmJiBzdGF0ZS5pbmRleCA+IG1heFBhZ2UpIHtcbiAgICAgICAgICAgIHN0YXRlLmluZGV4ID0gbWF4UGFnZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SGllcmFyY2h5KGdSb3c6IElHcm91cEJ5UmVjb3JkKTogQXJyYXk8SUdyb3VwQnlLZXk+IHtcbiAgICAgICAgcmV0dXJuIGdldEhpZXJhcmNoeShnUm93KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzSGllcmFyY2h5TWF0Y2goaDE6IEFycmF5PElHcm91cEJ5S2V5PiwgaDI6IEFycmF5PElHcm91cEJ5S2V5Pik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNIaWVyYXJjaHlNYXRjaChoMSwgaDIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyBhbGwgY2hhbmdlcyBmcm9tIHByb3ZpZGVkIHRyYW5zYWN0aW9ucyBpbnRvIHByb3ZpZGVkIGRhdGEgY29sbGVjdGlvblxuICAgICAqIEBwYXJhbSBkYXRhIENvbGxlY3Rpb24gdG8gbWVyZ2VcbiAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25zIFRyYW5zYWN0aW9ucyB0byBtZXJnZSBpbnRvIGRhdGFcbiAgICAgKiBAcGFyYW0gcHJpbWFyeUtleSBQcmltYXJ5IGtleSBvZiB0aGUgY29sbGVjdGlvbiwgaWYgYW55XG4gICAgICogQHBhcmFtIGRlbGV0ZVJvd3MgU2hvdWxkIGRlbGV0ZSByb3dzIHdpdGggREVMRVRFIHRyYW5zYWN0aW9uIHR5cGUgZnJvbSBkYXRhXG4gICAgICogQHJldHVybnMgUHJvdmlkZWQgZGF0YSBjb2xsZWN0aW9ucyB1cGRhdGVkIHdpdGggYWxsIHByb3ZpZGVkIHRyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VUcmFuc2FjdGlvbnM8VD4oZGF0YTogVFtdLCB0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10sIHByaW1hcnlLZXk/OiBhbnksIGRlbGV0ZVJvd3M6IGJvb2xlYW4gPSBmYWxzZSk6IFRbXSB7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByb3dJZCA9IHByaW1hcnlLZXkgPyBpdGVtW3ByaW1hcnlLZXldIDogaXRlbTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb25zLmZpbmQodCA9PiB0LmlkID09PSByb3dJZCk7XG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb24gJiYgdHJhbnNhY3Rpb24udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlVQREFURSkge1xuICAgICAgICAgICAgICAgIGRhdGFbaW5kZXhdID0gdHJhbnNhY3Rpb24ubmV3VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkZWxldGVSb3dzKSB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHQgPT4gdC50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuREVMRVRFKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHByaW1hcnlLZXkgPyBkYXRhLmZpbmRJbmRleChkID0+IGRbcHJpbWFyeUtleV0gPT09IHQuaWQpIDogZGF0YS5maW5kSW5kZXgoZCA9PiBkID09PSB0LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXggJiYgaW5kZXggPCBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLnB1c2goLi4udHJhbnNhY3Rpb25zXG4gICAgICAgICAgICAuZmlsdGVyKHQgPT4gdC50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQUREKVxuICAgICAgICAgICAgLm1hcCh0ID0+IHQubmV3VmFsdWUpKTtcblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZXMgYWxsIGNoYW5nZXMgZnJvbSBwcm92aWRlZCB0cmFuc2FjdGlvbnMgaW50byBwcm92aWRlZCBoaWVyYXJjaGljYWwgZGF0YSBjb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIGRhdGEgQ29sbGVjdGlvbiB0byBtZXJnZVxuICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbnMgVHJhbnNhY3Rpb25zIHRvIG1lcmdlIGludG8gZGF0YVxuICAgICAqIEBwYXJhbSBjaGlsZERhdGFLZXkgRGF0YSBrZXkgb2YgY2hpbGQgY29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0gcHJpbWFyeUtleSBQcmltYXJ5IGtleSBvZiB0aGUgY29sbGVjdGlvbiwgaWYgYW55XG4gICAgICogQHBhcmFtIGRlbGV0ZVJvd3MgU2hvdWxkIGRlbGV0ZSByb3dzIHdpdGggREVMRVRFIHRyYW5zYWN0aW9uIHR5cGUgZnJvbSBkYXRhXG4gICAgICogQHJldHVybnMgUHJvdmlkZWQgZGF0YSBjb2xsZWN0aW9ucyB1cGRhdGVkIHdpdGggYWxsIHByb3ZpZGVkIHRyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VIaWVyYXJjaGljYWxUcmFuc2FjdGlvbnMoXG4gICAgICAgIGRhdGE6IGFueVtdLFxuICAgICAgICB0cmFuc2FjdGlvbnM6IEhpZXJhcmNoaWNhbFRyYW5zYWN0aW9uW10sXG4gICAgICAgIGNoaWxkRGF0YUtleTogYW55LFxuICAgICAgICBwcmltYXJ5S2V5PzogYW55LFxuICAgICAgICBkZWxldGVSb3dzOiBib29sZWFuID0gZmFsc2UpOiBhbnlbXSB7XG4gICAgICAgIGZvciAoY29uc3QgdHJhbnNhY3Rpb24gb2YgdHJhbnNhY3Rpb25zKSB7XG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb24ucGF0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZmluZFBhcmVudEZyb21QYXRoKGRhdGEsIHByaW1hcnlLZXksIGNoaWxkRGF0YUtleSwgdHJhbnNhY3Rpb24ucGF0aCk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbGxlY3Rpb246IGFueVtdID0gcGFyZW50ID8gcGFyZW50W2NoaWxkRGF0YUtleV0gOiBkYXRhO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHJhbnNhY3Rpb24udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BREQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgaWYgdGhlcmUgaXMgbm8gcGFyZW50IHRoaXMgaXMgQUREIHJvdyBhdCByb290IGxldmVsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50ICYmICFwYXJlbnRbY2hpbGREYXRhS2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFtjaGlsZERhdGFLZXldID0gY29sbGVjdGlvbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5wdXNoKHRyYW5zYWN0aW9uLm5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5VUERBVEU6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVJbmRleCA9IGNvbGxlY3Rpb24uZmluZEluZGV4KHggPT4geFtwcmltYXJ5S2V5XSA9PT0gdHJhbnNhY3Rpb24uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25bdXBkYXRlSW5kZXhdID0gbWVyZ2VPYmplY3RzKGNsb25lVmFsdWUoY29sbGVjdGlvblt1cGRhdGVJbmRleF0pLCB0cmFuc2FjdGlvbi5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuREVMRVRFOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGV0ZVJvd3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxldGVJbmRleCA9IGNvbGxlY3Rpb24uZmluZEluZGV4KHIgPT4gcltwcmltYXJ5S2V5XSA9PT0gdHJhbnNhY3Rpb24uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWxldGVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5zcGxpY2UoZGVsZXRlSW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gIGlmIHRoZXJlIGlzIG5vIHBhdGggdGhpcyBpcyBBREQgcm93IGluIHJvb3QuIFB1c2ggdGhlIG5ld1ZhbHVlIHRvIGRhdGFcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2godHJhbnNhY3Rpb24ubmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcGFyc2VWYWx1ZShkYXRhVHlwZTogRGF0YVR5cGUsIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAoZGF0YVR5cGUgPT09IERhdGFUeXBlLk51bWJlcikge1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmaW5kUGFyZW50RnJvbVBhdGgoZGF0YTogYW55W10sIHByaW1hcnlLZXk6IGFueSwgY2hpbGREYXRhS2V5OiBhbnksIHBhdGg6IGFueVtdKTogYW55IHtcbiAgICAgICAgbGV0IGNvbGxlY3Rpb246IGFueVtdID0gZGF0YTtcbiAgICAgICAgbGV0IHJlc3VsdDogYW55O1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgcGF0aCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gY29sbGVjdGlvbiAmJiBjb2xsZWN0aW9uLmZpbmQoeCA9PiB4W3ByaW1hcnlLZXldID09PSBpZCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb2xsZWN0aW9uID0gcmVzdWx0W2NoaWxkRGF0YUtleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbiJdfQ==