@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
174 lines • 26.2 kB
JavaScript
import { cloneArray } from '../core/utils';
import { SortingDirection } from './sorting-expression.interface';
import { getHierarchy, isHierarchyMatch } from './operations';
export class DefaultSortingStrategy {
constructor() {
}
static instance() {
return this._instance || (this._instance = new this());
}
sort(data, fieldName, dir, ignoreCase, valueResolver) {
const key = fieldName;
const reverse = (dir === SortingDirection.Desc ? -1 : 1);
const cmpFunc = (obj1, obj2) => {
return this.compareObjects(obj1, obj2, key, reverse, ignoreCase, valueResolver);
};
return this.arraySort(data, cmpFunc);
}
compareValues(a, b) {
const an = (a === null || a === undefined);
const bn = (b === null || b === undefined);
if (an) {
if (bn) {
return 0;
}
return -1;
}
else if (bn) {
return 1;
}
return a > b ? 1 : a < b ? -1 : 0;
}
compareObjects(obj1, obj2, key, reverse, ignoreCase, valueResolver) {
let a = valueResolver(obj1, key);
let b = valueResolver(obj2, key);
if (ignoreCase) {
a = a && a.toLowerCase ? a.toLowerCase() : a;
b = b && b.toLowerCase ? b.toLowerCase() : b;
}
return reverse * this.compareValues(a, b);
}
arraySort(data, compareFn) {
return data.sort(compareFn);
}
}
DefaultSortingStrategy._instance = null;
export class NoopSortingStrategy {
constructor() {
}
static instance() {
return this._instance || (this._instance = new NoopSortingStrategy());
}
sort(data, expressions) {
return data;
}
}
NoopSortingStrategy._instance = null;
export class IgxSorting {
sort(data, expressions) {
return this.sortDataRecursive(data, expressions);
}
groupedRecordsByExpression(data, index, expression) {
let i;
let groupval;
const res = [];
const key = expression.fieldName;
const len = data.length;
res.push(data[index]);
groupval = this.getFieldValue(data[index], key);
index++;
const comparer = expression.groupingComparer || DefaultSortingStrategy.instance().compareValues;
for (i = index; i < len; i++) {
if (comparer(this.getFieldValue(data[i], key), groupval) === 0) {
res.push(data[i]);
}
else {
break;
}
}
return res;
}
sortDataRecursive(data, expressions, expressionIndex = 0) {
let i;
let j;
let expr;
let gbData;
let gbDataLen;
const exprsLen = expressions.length;
const dataLen = data.length;
expressionIndex = expressionIndex || 0;
if (expressionIndex >= exprsLen || dataLen <= 1) {
return data;
}
expr = expressions[expressionIndex];
if (!expr.strategy) {
expr.strategy = DefaultSortingStrategy.instance();
}
data = expr.strategy.sort(data, expr.fieldName, expr.dir, expr.ignoreCase, this.getFieldValue);
if (expressionIndex === exprsLen - 1) {
return data;
}
// in case of multiple sorting
for (i = 0; i < dataLen; i++) {
gbData = this.groupedRecordsByExpression(data, i, expr);
gbDataLen = gbData.length;
if (gbDataLen > 1) {
gbData = this.sortDataRecursive(gbData, expressions, expressionIndex + 1);
}
for (j = 0; j < gbDataLen; j++) {
data[i + j] = gbData[j];
}
i += gbDataLen - 1;
}
return data;
}
groupDataRecursive(data, state, level, parent, metadata, grid = null, groupsRecords = [], fullResult = { data: [], metadata: [] }) {
const expressions = state.expressions;
const expansion = state.expansion;
let i = 0;
let result = [];
while (i < data.length) {
const group = this.groupedRecordsByExpression(data, i, expressions[level]);
const groupRow = {
expression: expressions[level],
level,
records: cloneArray(group),
value: group[0][expressions[level].fieldName],
groupParent: parent,
groups: [],
height: grid ? grid.renderedRowHeight : null
};
if (parent) {
parent.groups.push(groupRow);
}
else {
groupsRecords.push(groupRow);
}
const hierarchy = getHierarchy(groupRow);
const expandState = expansion.find((s) => isHierarchyMatch(s.hierarchy || [{ fieldName: groupRow.expression.fieldName, value: groupRow.value }], hierarchy));
const expanded = expandState ? expandState.expanded : state.defaultExpanded;
let recursiveResult;
result.push(groupRow);
metadata.push(null);
fullResult.data.push(groupRow);
fullResult.metadata.push(null);
if (level < expressions.length - 1) {
recursiveResult = this.groupDataRecursive(group, state, level + 1, groupRow, expanded ? metadata : [], grid, groupsRecords, fullResult);
if (expanded) {
result = result.concat(recursiveResult);
}
}
else {
for (const groupItem of group) {
fullResult.metadata.push(groupRow);
fullResult.data.push(groupItem);
}
if (expanded) {
metadata.push(...fullResult.metadata.slice(fullResult.metadata.length - group.length));
result.push(...fullResult.data.slice(fullResult.data.length - group.length));
}
}
i += group.length;
}
return result;
}
getFieldValue(obj, key) {
return obj[key];
}
}
export class IgxDataRecordSorting extends IgxSorting {
getFieldValue(obj, key) {
return obj.data[key];
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGluZy1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQXNCLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFLdEYsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVU5RCxNQUFNLE9BQU8sc0JBQXNCO0lBRy9CO0lBQXlCLENBQUM7SUFFbkIsTUFBTSxDQUFDLFFBQVE7UUFDbEIsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVNLElBQUksQ0FBQyxJQUFXLEVBQ1gsU0FBaUIsRUFDakIsR0FBcUIsRUFDckIsVUFBbUIsRUFDbkIsYUFBNkM7UUFDckQsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxLQUFLLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3BGLENBQUMsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVNLGFBQWEsQ0FBQyxD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VSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7aUJBQ2hGO2FBQ0o7WUFDRCxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQztTQUNyQjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFDUyxhQUFhLENBQUMsR0FBUSxFQUFFLEdBQVc7UUFDekMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQztDQUNKO0FBRUQsTUFBTSxPQUFPLG9CQUFxQixTQUFRLFVBQVU7SUFDdEMsYUFBYSxDQUFDLEdBQVEsRUFBRSxHQUFXO1FBQ3pDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbG9uZUFycmF5IH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBJR3JvdXBCeVJlY29yZCB9IGZyb20gJy4vZ3JvdXBieS1yZWNvcmQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElTb3J0aW5nRXhwcmVzc2lvbiwgU29ydGluZ0RpcmVjdGlvbiB9IGZyb20gJy4vc29ydGluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJR3JvdXBpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi9ncm91cGluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJR3JvdXBpbmdTdGF0ZSB9IGZyb20gJy4vZ3JvdXBieS1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUdyb3VwQnlFeHBhbmRTdGF0ZSB9IGZyb20gJy4vZ3JvdXBieS1leHBhbmQtc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IElHcm91cEJ5UmVzdWx0IH0gZnJvbSAnLi9ncm91cGluZy1yZXN1bHQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGdldEhpZXJhcmNoeSwgaXNIaWVyYXJjaHlNYXRjaCB9IGZyb20gJy4vb3BlcmF0aW9ucyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNvcnRpbmdTdHJhdGVneSB7XG4gICAgc29ydDogKGRhdGE6IGFueVtdLFxuICAgICAgICAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgZGlyOiBTb3J0aW5nRGlyZWN0aW9uLFxuICAgICAgICAgICBpZ25vcmVDYXNlOiBib29sZWFuLFxuICAgICAgICAgICB2YWx1ZVJlc29sdmVyOiAob2JqOiBhbnksIGtleTogc3RyaW5nKSA9PiBhbnkpID0+IGFueVtdO1xufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdFNvcnRpbmdTdHJhdGVneSBpbXBsZW1lbnRzIElTb3J0aW5nU3RyYXRlZ3kge1xuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogRGVmYXVsdFNvcnRpbmdTdHJhdGVneSA9IG51bGw7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZSgpOiBEZWZhdWx0U29ydGluZ1N0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlIHx8ICh0aGlzLl9pbnN0YW5jZSA9IG5ldyB0aGlzKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzb3J0KGRhdGE6IGFueVtdLFxuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIGRpcjogU29ydGluZ0RpcmVjdGlvbixcbiAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiBib29sZWFuLFxuICAgICAgICAgICAgICAgIHZhbHVlUmVzb2x2ZXI6IChvYmo6IGFueSwga2V5OiBzdHJpbmcpID0+IGFueSkge1xuICAgICAgICBjb25zdCBrZXkgPSBmaWVsZE5hbWU7XG4gICAgICAgIGNvbnN0IHJldmVyc2UgPSAoZGlyID09PSBTb3J0aW5nRGlyZWN0aW9uLkRlc2MgPyAtMSA6IDEpO1xuICAgICAgICBjb25zdCBjbXBGdW5jID0gKG9iajEsIG9iajIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVPYmplY3RzKG9iajEsIG9iajIsIGtleSwgcmV2ZXJzZSwgaWdub3JlQ2FzZSwgdmFsdWVSZXNvbHZlcik7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmFycmF5U29ydChkYXRhLCBjbXBGdW5jKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcGFyZVZhbHVlcyhhOiBhbnksIGI6IGFueSkge1xuICAgICAgICBjb25zdCBhbiA9IChhID09PSBudWxsIHx8IGEgPT09IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IGJuID0gKGIgPT09IG51bGwgfHwgYiA9PT0gdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKGFuKSB7XG4gICAgICAgICAgICBpZiAoYm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChibikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjb21wYXJlT2JqZWN0cyhvYmoxOiBvYmplY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajI6IG9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2U6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlQ2FzZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVSZXNvbHZlcjogKG9iajogYW55LCBrZXk6IHN0cmluZykgPT4gYW55KSB7XG4gICAgICAgIGxldCBhID0gdmFsdWVSZXNvbHZlcihvYmoxLCBrZXkpO1xuICAgICAgICBsZXQgYiA9IHZhbHVlUmVzb2x2ZXIob2JqMiwga2V5KTtcbiAgICAgICAgaWYgKGlnbm9yZUNhc2UpIHtcbiAgICAgICAgICAgIGEgPSBhICYmIGEudG9Mb3dlckNhc2UgPyBhLnRvTG93ZXJDYXNlKCkgOiBhO1xuICAgICAgICAgICAgYiA9IGIgJiYgYi50b0xvd2VyQ2FzZSA/IGIudG9Mb3dlckNhc2UoKSA6IGI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldmVyc2UgKiB0aGlzLmNvbXBhcmVWYWx1ZXMoYSwgYik7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFycmF5U29ydChkYXRhOiBhbnlbXSwgY29tcGFyZUZuPyk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIGRhdGEuc29ydChjb21wYXJlRm4pO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJR3JpZFNvcnRpbmdTdHJhdGVneSB7XG4gICAgc29ydChkYXRhOiBhbnlbXSwgZXhwcmVzc2lvbnM6IElTb3J0aW5nRXhwcmVzc2lvbltdKTogYW55W107XG59XG5cbmV4cG9ydCBjbGFzcyBOb29wU29ydGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSUdyaWRTb3J0aW5nU3RyYXRlZ3kge1xuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogTm9vcFNvcnRpbmdTdHJhdGVneSA9IG51bGw7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkgeyAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlIHx8ICh0aGlzLl9pbnN0YW5jZSA9IG5ldyBOb29wU29ydGluZ1N0cmF0ZWd5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzb3J0KGRhdGE6IGFueVtdLCBleHByZXNzaW9uczogSVNvcnRpbmdFeHByZXNzaW9uW10pOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElneFNvcnRpbmcgaW1wbGVtZW50cyBJR3JpZFNvcnRpbmdTdHJhdGVneSB7XG4gICAgcHVibGljIHNvcnQoZGF0YTogYW55W10sIGV4cHJlc3Npb25zOiBJU29ydGluZ0V4cHJlc3Npb25bXSk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERhdGFSZWN1cnNpdmUoZGF0YSwgZXhwcmVzc2lvbnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ3JvdXBlZFJlY29yZHNCeUV4cHJlc3Npb24oZGF0YTogYW55W10sXG4gICAgICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogSUdyb3VwaW5nRXhwcmVzc2lvbik6IGFueVtdIHtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGxldCBncm91cHZhbDtcbiAgICAgICAgY29uc3QgcmVzID0gW107XG4gICAgICAgIGNvbnN0IGtleSA9IGV4cHJlc3Npb24uZmllbGROYW1lO1xuICAgICAgICBjb25zdCBsZW4gPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgcmVzLnB1c2goZGF0YVtpbmRleF0pO1xuICAgICAgICBncm91cHZhbCA9IHRoaXMuZ2V0RmllbGRWYWx1ZShkYXRhW2luZGV4XSwga2V5KTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29uc3QgY29tcGFyZXIgPSBleHByZXNzaW9uLmdyb3VwaW5nQ29tcGFyZXIgfHwgRGVmYXVsdFNvcnRpbmdTdHJhdGVneS5pbnN0YW5jZSgpLmNvbXBhcmVWYWx1ZXM7XG4gICAgICAgIGZvciAoaSA9IGluZGV4OyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjb21wYXJlcih0aGlzLmdldEZpZWxkVmFsdWUoZGF0YVtpXSwga2V5KSwgZ3JvdXB2YWwpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goZGF0YVtpXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHByaXZhdGUgc29ydERhdGFSZWN1cnNpdmU8VD4oZGF0YTogVFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnM6IElTb3J0aW5nRXhwcmVzc2lvbltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkluZGV4OiBudW1iZXIgPSAwKTogVFtdIHtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGxldCBqO1xuICAgICAgICBsZXQgZXhwcjogSVNvcnRpbmdFeHByZXNzaW9uO1xuICAgICAgICBsZXQgZ2JEYXRhO1xuICAgICAgICBsZXQgZ2JEYXRhTGVuO1xuICAgICAgICBjb25zdCBleHByc0xlbiA9IGV4cHJlc3Npb25zLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZGF0YUxlbiA9IGRhdGEubGVuZ3RoO1xuICAgICAgICBleHByZXNzaW9uSW5kZXggPSBleHByZXNzaW9uSW5kZXggfHwgMDtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25JbmRleCA+PSBleHByc0xlbiB8fCBkYXRhTGVuIDw9IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGV4cHIgPSBleHByZXNzaW9uc1tleHByZXNzaW9uSW5kZXhdO1xuICAgICAgICBpZiAoIWV4cHIuc3RyYXRlZ3kpIHtcbiAgICAgICAgICAgIGV4cHIuc3RyYXRlZ3kgPSBEZWZhdWx0U29ydGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IGV4cHIuc3RyYXRlZ3kuc29ydChkYXRhLCBleHByLmZpZWxkTmFtZSwgZXhwci5kaXIsIGV4cHIuaWdub3JlQ2FzZSwgdGhpcy5nZXRGaWVsZFZhbHVlKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25JbmRleCA9PT0gZXhwcnNMZW4gLSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbiBjYXNlIG9mIG11bHRpcGxlIHNvcnRpbmdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW47IGkrKykge1xuICAgICAgICAgICAgZ2JEYXRhID0gdGhpcy5ncm91cGVkUmVjb3Jkc0J5RXhwcmVzc2lvbihkYXRhLCBpLCBleHByKTtcbiAgICAgICAgICAgIGdiRGF0YUxlbiA9IGdiRGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZ2JEYXRhTGVuID4gMSkge1xuICAgICAgICAgICAgICAgIGdiRGF0YSA9IHRoaXMuc29ydERhdGFSZWN1cnNpdmUoZ2JEYXRhLCBleHByZXNzaW9ucywgZXhwcmVzc2lvbkluZGV4ICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2JEYXRhTGVuOyBqKyspIHtcbiAgICAgICAgICAgICAgICBkYXRhW2kgKyBqXSA9IGdiRGF0YVtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkgKz0gZ2JEYXRhTGVuIC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdyb3VwRGF0YVJlY3Vyc2l2ZTxUPihkYXRhOiBUW10sIHN0YXRlOiBJR3JvdXBpbmdTdGF0ZSwgbGV2ZWw6IG51bWJlcixcbiAgICAgICAgcGFyZW50OiBJR3JvdXBCeVJlY29yZCwgbWV0YWRhdGE6IElHcm91cEJ5UmVjb3JkW10sIGdyaWQ6IGFueSA9IG51bGwsXG4gICAgICAgIGdyb3Vwc1JlY29yZHM6IGFueVtdID0gW10sIGZ1bGxSZXN1bHQ6IElHcm91cEJ5UmVzdWx0ID0geyBkYXRhOiBbXSwgbWV0YWRhdGE6IFtdIH0pOiBUW10ge1xuICAgICAgICBjb25zdCBleHByZXNzaW9ucyA9IHN0YXRlLmV4cHJlc3Npb25zO1xuICAgICAgICBjb25zdCBleHBhbnNpb24gPSBzdGF0ZS5leHBhbnNpb247XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICB3aGlsZSAoaSA8IGRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBlZFJlY29yZHNCeUV4cHJlc3Npb24oZGF0YSwgaSwgZXhwcmVzc2lvbnNbbGV2ZWxdKTtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwUm93OiBJR3JvdXBCeVJlY29yZCA9IHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uc1tsZXZlbF0sXG4gICAgICAgICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgICAgICAgcmVjb3JkczogY2xvbmVBcnJheShncm91cCksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGdyb3VwWzBdW2V4cHJlc3Npb25zW2xldmVsXS5maWVsZE5hbWVdLFxuICAgICAgICAgICAgICAgIGdyb3VwUGFyZW50OiBwYXJlbnQsXG4gICAgICAgICAgICAgICAgZ3JvdXBzOiBbXSxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGdyaWQgPyBncmlkLnJlbmRlcmVkUm93SGVpZ2h0IDogbnVsbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuZ3JvdXBzLnB1c2goZ3JvdXBSb3cpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBncm91cHNSZWNvcmRzLnB1c2goZ3JvdXBSb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaGllcmFyY2h5ID0gZ2V0SGllcmFyY2h5KGdyb3VwUm93KTtcbiAgICAgICAgICAgIGNvbnN0IGV4cGFuZFN0YXRlOiBJR3JvdXBCeUV4cGFuZFN0YXRlID0gZXhwYW5zaW9uLmZpbmQoKHMpID0+XG4gICAgICAgICAgICAgICAgaXNIaWVyYXJjaHlNYXRjaChzLmhpZXJhcmNoeSB8fCBbeyBmaWVsZE5hbWU6IGdyb3VwUm93LmV4cHJlc3Npb24uZmllbGROYW1lLCB2YWx1ZTogZ3JvdXBSb3cudmFsdWUgfV0sIGhpZXJhcmNoeSkpO1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRTdGF0ZSA/IGV4cGFuZFN0YXRlLmV4cGFuZGVkIDogc3RhdGUuZGVmYXVsdEV4cGFuZGVkO1xuICAgICAgICAgICAgbGV0IHJlY3Vyc2l2ZVJlc3VsdDtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdyb3VwUm93KTtcbiAgICAgICAgICAgIG1ldGFkYXRhLnB1c2gobnVsbCk7XG4gICAgICAgICAgICBmdWxsUmVzdWx0LmRhdGEucHVzaChncm91cFJvdyk7XG4gICAgICAgICAgICBmdWxsUmVzdWx0Lm1ldGFkYXRhLnB1c2gobnVsbCk7XG4gICAgICAgICAgICBpZiAobGV2ZWwgPCBleHByZXNzaW9ucy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgcmVjdXJzaXZlUmVzdWx0ID0gdGhpcy5ncm91cERhdGFSZWN1cnNpdmUoZ3JvdXAsIHN0YXRlLCBsZXZlbCArIDEsIGdyb3VwUm93LFxuICAgICAgICAgICAgICAgICAgICBleHBhbmRlZCA/IG1ldGFkYXRhIDogW10sIGdyaWQsIGdyb3Vwc1JlY29yZHMsIGZ1bGxSZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmIChleHBhbmRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHJlY3Vyc2l2ZVJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwSXRlbSBvZiBncm91cCkge1xuICAgICAgICAgICAgICAgICAgICBmdWxsUmVzdWx0Lm1ldGFkYXRhLnB1c2goZ3JvdXBSb3cpO1xuICAgICAgICAgICAgICAgICAgICBmdWxsUmVzdWx0LmRhdGEucHVzaChncm91cEl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucHVzaCguLi5mdWxsUmVzdWx0Lm1ldGFkYXRhLnNsaWNlKGZ1bGxSZXN1bHQubWV0YWRhdGEubGVuZ3RoIC0gZ3JvdXAubGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLmZ1bGxSZXN1bHQuZGF0YS5zbGljZShmdWxsUmVzdWx0LmRhdGEubGVuZ3RoIC0gZ3JvdXAubGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSArPSBncm91cC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldEZpZWxkVmFsdWUob2JqOiBhbnksIGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIG9ialtrZXldO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElneERhdGFSZWNvcmRTb3J0aW5nIGV4dGVuZHMgSWd4U29ydGluZyB7XG4gICAgcHJvdGVjdGVkIGdldEZpZWxkVmFsdWUob2JqOiBhbnksIGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIG9iai5kYXRhW2tleV07XG4gICAgfVxufVxuIl19