ms-data-grid
Version:
A powerful, customizable Angular data grid component with advanced features like sorting, filtering, pagination, column pinning, and taskbar actions. Perfect for enterprise applications.
209 lines • 32.6 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
export class CopyServiceService {
constructor() {
this.updateRows = [];
}
getSelectedDataForCopy(dataSet, columns, rowSelectedIndexes, selectedCells, getNestedValue) {
const copiedRows = [];
const findRowByVirtualIndex = (vIndex) => dataSet.find((r) => r.__virtualIndex === vIndex);
if (rowSelectedIndexes && rowSelectedIndexes.size > 0) {
const sortedIndexes = [...rowSelectedIndexes].sort((a, b) => a - b);
for (const vIndex of sortedIndexes) {
const row = findRowByVirtualIndex(vIndex);
if (!row)
continue;
const extractValue = (field) => {
const nested = getNestedValue(row, field);
const value = nested?.value ??
nested?.name ??
nested ??
'-';
if (Array.isArray(value)) {
return value
.map(v => typeof v === 'object'
? (v.departmentName ?? v.roleName ?? '')
: (v?.toString() ?? ''))
.join(', ');
}
return value ?? '';
};
const mapped = columns.map(col => {
if (col.children && Array.isArray(col.children)) {
return col.children.map((c) => extractValue(c.field));
}
return [extractValue(col.field)];
});
const rowValues = mapped.reduce((acc, curr) => acc.concat(curr), []);
copiedRows.push(rowValues);
}
}
if (selectedCells && selectedCells.length > 0) {
const rowsMap = new Map();
for (const cell of selectedCells) {
const row = findRowByVirtualIndex(cell.rowIndex);
if (!row)
continue;
const col = columns[cell.colIndex];
let fieldName = col?.field;
if (col?.children && col.children[cell.subColIndex]) {
fieldName = col.children[cell.subColIndex].field;
}
let value = getNestedValue(row, fieldName) || getNestedValue(row, fieldName)?.name || getNestedValue(row, fieldName) || '-';
if (Array.isArray(value)) {
value = value
.map(v => typeof v === 'object'
? v.departmentName ?? v.roleName ?? ''
: v?.toString() ?? '')
.join(', ');
}
else {
value = value ?? '';
}
if (!rowsMap.has(cell.rowIndex))
rowsMap.set(cell.rowIndex, []);
rowsMap.get(cell.rowIndex).push(value);
}
const sortedCells = [...rowsMap.entries()]
.sort(([a], [b]) => a - b)
.map(([_, v]) => v);
copiedRows.push(...sortedCells);
}
if (copiedRows.length === 0) {
const activeCell = document.querySelector('.active-cell');
if (activeCell)
return [[activeCell.textContent?.trim() || '']];
}
const maxCols = copiedRows.reduce((max, row) => Math.max(max, row.length), 0);
return copiedRows.map(row => {
const newRow = [...row];
while (newRow.length < maxCols)
newRow.push('');
return newRow;
});
}
copyToClipboard(selectedData, selector = '.selected-cell, .active-cell, .row-selected') {
if (!selectedData || selectedData.length === 0)
return;
const textToCopy = selectedData
.map(row => row.map(cell => (cell ?? '').toString()).join('\t'))
.join('\n');
navigator.clipboard.writeText(textToCopy).catch(err => console.error(err));
const selectedEls = document.querySelectorAll(selector);
selectedEls.forEach(el => el.classList.add('flash-bg'));
setTimeout(() => {
selectedEls.forEach(el => el.classList.remove('flash-bg'));
}, 1000);
}
async pasteFromClipboardText(text, dataSet, columns, startRowIndex, startColIndex, startSubColIndex = 0) {
if (!text)
return [];
this.updateRows = [];
const rows = text.split(/\r?\n/).map(r => r.split('\t'));
const flattenedColumns = [];
columns.forEach(col => {
if (col.children?.length) {
col.children.forEach((child) => flattenedColumns.push({ parent: col, ...child }));
}
else {
flattenedColumns.push(col);
}
});
let startFlattenedIndex = 0;
for (let i = 0; i < startColIndex; i++) {
const col = columns[i];
startFlattenedIndex += col.children?.length || 1;
}
const startCol = columns[startColIndex];
if (startCol?.children?.length) {
startFlattenedIndex += Math.min(startSubColIndex, startCol.children.length - 1);
}
rows.forEach((rowValues, rOffset) => {
const targetRowIndex = startRowIndex + rOffset;
const row = dataSet.find(r => r?.__virtualIndex === targetRowIndex);
if (!row)
return;
rowValues.forEach((value, cOffset) => {
const targetIndex = startFlattenedIndex + cOffset;
if (targetIndex < 0 || targetIndex >= flattenedColumns.length)
return;
const targetColumn = flattenedColumns[targetIndex];
this.setNestedValue(row, targetColumn, value);
});
});
return this.updateRows;
}
setNestedValue(obj, column, option, calledFromInput = false) {
debugger;
if (column.type === 'date' || column.type === 'image')
return;
const path = column.field;
if (!path)
return;
const keys = path.split('.');
const lastKey = keys.pop();
const parent = keys.reduce((acc, key) => (acc[key] ??= {}), obj);
if (parent && lastKey) {
if (typeof option === 'object' && option !== null) {
parent[lastKey] = {
id: option.id ?? 1,
value: option.value ?? option,
};
}
else {
parent[lastKey] = option;
}
}
const sendObj = {
data: { ...obj },
eventType: 'onCellEdit',
};
this.updateRows.push(obj);
}
cutSelectedSelectedData(dataSet, rowSelectedIndexes, selectedCells, columns, setNestedValue) {
let updatedData = [...dataSet];
if (rowSelectedIndexes?.size) {
const indexes = [...rowSelectedIndexes];
updatedData = updatedData.filter((row) => !indexes.includes(row.__virtualIndex));
// rowSelectedIndexes.clear();
}
else if (selectedCells?.length) {
this.updateRows = [];
for (const cell of selectedCells) {
const row = updatedData.find(r => r.__virtualIndex === cell.rowIndex);
if (!row)
continue;
let col = columns[cell.colIndex];
if (col?.children && col.children[cell.subColIndex]) {
col = col.children[cell.subColIndex];
}
this.setNestedValue(row, col, '');
}
// selectedCells.length = 0;
}
return { updatedData: updatedData, updatedRows: this.updateRows };
}
cutWithAnimation(selectedData, selector = '.selected-cell, .active-cell, .row-selected') {
if (!selectedData || selectedData.length === 0)
return;
const textToCopy = selectedData
.map(row => row.map(cell => (cell ?? '').toString()).join('\t'))
.join('\n');
navigator.clipboard.writeText(textToCopy).catch(err => console.error(err));
// Apply red cut animation
const selectedEls = document.querySelectorAll(selector);
selectedEls.forEach(el => el.classList.add('cut-flash-bg'));
setTimeout(() => {
selectedEls.forEach(el => el.classList.remove('cut-flash-bg'));
}, 1000);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CopyServiceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CopyServiceService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CopyServiceService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29weS1zZXJ2aWNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhLWdyaWQvc3JjL2xpYi9zZXJ2aWNlcy9jb3B5LXNlcnZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8sa0JBQWtCO0lBRTdCO1FBMEdBLGVBQVUsR0FBVSxFQUFFLENBQUM7SUExR1AsQ0FBQztJQUNqQixzQkFBc0IsQ0FDcEIsT0FBYyxFQUNkLE9BQWMsRUFDZCxrQkFBK0IsRUFDL0IsYUFBb0IsRUFDcEIsY0FBK0M7UUFFL0MsTUFBTSxVQUFVLEdBQVksRUFBRSxDQUFDO1FBQy9CLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUMvQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELElBQUksa0JBQWtCLElBQUksa0JBQWtCLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNyRCxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEUsS0FBSyxNQUFNLE1BQU0sSUFBSSxhQUFhLEVBQUU7Z0JBQ2xDLE1BQU0sR0FBRyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsR0FBRztvQkFBRSxTQUFTO2dCQUNuQixNQUFNLFlBQVksR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFO29CQUM3QyxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFD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QUssQ0FBQztZQUFFLE9BQU87UUFFdkQsTUFBTSxVQUFVLEdBQUcsWUFBWTthQUM1QixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTNFLDBCQUEwQjtRQUMxQixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEQsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7K0dBeE9VLGtCQUFrQjttSEFBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3B5U2VydmljZVNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG4gIGdldFNlbGVjdGVkRGF0YUZvckNvcHkoXHJcbiAgICBkYXRhU2V0OiBhbnlbXSxcclxuICAgIGNvbHVtbnM6IGFueVtdLFxyXG4gICAgcm93U2VsZWN0ZWRJbmRleGVzOiBTZXQ8bnVtYmVyPixcclxuICAgIHNlbGVjdGVkQ2VsbHM6IGFueVtdLFxyXG4gICAgZ2V0TmVzdGVkVmFsdWU6IChvYmo6IGFueSwgcGF0aDogc3RyaW5nKSA9PiBhbnlcclxuICApOiBhbnlbXVtdIHtcclxuICAgIGNvbnN0IGNvcGllZFJvd3M6IGFueVtdW10gPSBbXTtcclxuICAgIGNvbnN0IGZpbmRSb3dCeVZpcnR1YWxJbmRleCA9ICh2SW5kZXg6IG51bWJlcikgPT5cclxuICAgICAgZGF0YVNldC5maW5kKChyOiBhbnkpID0+IHIuX192aXJ0dWFsSW5kZXggPT09IHZJbmRleCk7XHJcbiAgICBpZiAocm93U2VsZWN0ZWRJbmRleGVzICYmIHJvd1NlbGVjdGVkSW5kZXhlcy5zaXplID4gMCkge1xyXG4gICAgICBjb25zdCBzb3J0ZWRJbmRleGVzID0gWy4uLnJvd1NlbGVjdGVkSW5kZXhlc10uc29ydCgoYSwgYikgPT4gYSAtIGIpO1xyXG4gICAgICBmb3IgKGNvbnN0IHZJbmRleCBvZiBzb3J0ZWRJbmRleGVzKSB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0gZmluZFJvd0J5VmlydHVhbEluZGV4KHZJbmRleCk7XHJcbiAgICAgICAgaWYgKCFyb3cpIGNvbnRpbnVlO1xyXG4gICAgICAgIGNvbnN0IGV4dHJhY3RWYWx1ZSA9IChmaWVsZDogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICAgICAgICAgIGNvbnN0IG5lc3RlZCA9IGdldE5lc3RlZFZhbHVlKHJvdywgZmllbGQpO1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPVxyXG4gICAgICAgICAgICBuZXN0ZWQ/LnZhbHVlID8/XHJcbiAgICAgICAgICAgIG5lc3RlZD8ubmFtZSA/P1xyXG4gICAgICAgICAgICBuZXN0ZWQgPz9cclxuICAgICAgICAgICAgJy0nO1xyXG5cclxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVcclxuICAgICAgICAgICAgICAubWFwKHYgPT5cclxuICAgICAgICAgICAgICAgIHR5cGVvZiB2ID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICAgICAgICA/ICh2LmRlcGFydG1lbnROYW1lID8/IHYucm9sZU5hbWUgPz8gJycpXHJcbiAgICAgICAgICAgICAgICAgIDogKHY/LnRvU3RyaW5nKCkgPz8gJycpXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHZhbHVlID8/ICcnO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgbWFwcGVkID0gY29sdW1ucy5tYXAoY29sID0+IHtcclxuICAgICAgICAgIGlmIChjb2wuY2hpbGRyZW4gJiYgQXJyYXkuaXNBcnJheShjb2wuY2hpbGRyZW4pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb2wuY2hpbGRyZW4ubWFwKChjOiB7IGZpZWxkOiBzdHJpbmcgfSkgPT4gZXh0cmFjdFZhbHVlKGMuZmllbGQpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBbZXh0cmFjdFZhbHVlKGNvbC5maWVsZCldO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IHJvd1ZhbHVlcyA9IG1hcHBlZC5yZWR1Y2U8c3RyaW5nW10+KChhY2MsIGN1cnIpID0+IGFjYy5jb25jYXQoY3VyciksIFtdKTtcclxuICAgICAgICBjb3BpZWRSb3dzLnB1c2gocm93VmFsdWVzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHNlbGVjdGVkQ2VsbHMgJiYgc2VsZWN0ZWRDZWxscy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IHJvd3NNYXAgPSBuZXcgTWFwPG51bWJlciwgYW55W10+KCk7XHJcbiAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBzZWxlY3RlZENlbGxzKSB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0gZmluZFJvd0J5VmlydHVhbEluZGV4KGNlbGwucm93SW5kZXgpO1xyXG4gICAgICAgIGlmICghcm93KSBjb250aW51ZTtcclxuICAgICAgICBjb25zdCBjb2wgPSBjb2x1bW5zW2NlbGwuY29sSW5kZXhdO1xyXG4gICAgICAgIGxldCBmaWVsZE5hbWUgPSBjb2w/LmZpZWxkO1xyXG4gICAgICAgIGlmIChjb2w/LmNoaWxkcmVuICYmIGNvbC5jaGlsZHJlbltjZWxsLnN1YkNvbEluZGV4XSkge1xyXG4gICAgICAgICAgZmllbGROYW1lID0gY29sLmNoaWxkcmVuW2NlbGwuc3ViQ29sSW5kZXhdLmZpZWxkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdmFsdWUgPSBnZXROZXN0ZWRWYWx1ZShyb3csIGZpZWxkTmFtZSkgfHwgZ2V0TmVzdGVkVmFsdWUocm93LCBmaWVsZE5hbWUpPy5uYW1lIHx8IGdldE5lc3RlZFZhbHVlKHJvdywgZmllbGROYW1lKSB8fCAnLSc7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlXHJcbiAgICAgICAgICAgIC5tYXAodiA9PlxyXG4gICAgICAgICAgICAgIHR5cGVvZiB2ID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICAgICAgPyB2LmRlcGFydG1lbnROYW1lID8/IHYucm9sZU5hbWUgPz8gJydcclxuICAgICAgICAgICAgICAgIDogdj8udG9TdHJpbmcoKSA/PyAnJ1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5qb2luKCcsICcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlID8/ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXJvd3NNYXAuaGFzKGNlbGwucm93SW5kZXgpKSByb3dzTWFwLnNldChjZWxsLnJvd0luZGV4LCBbXSk7XHJcbiAgICAgICAgcm93c01hcC5nZXQoY2VsbC5yb3dJbmRleCkhLnB1c2godmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHNvcnRlZENlbGxzID0gWy4uLnJvd3NNYXAuZW50cmllcygpXVxyXG4gICAgICAgIC5zb3J0KChbYV0sIFtiXSkgPT4gYSAtIGIpXHJcbiAgICAgICAgLm1hcCgoW18sIHZdKSA9PiB2KTtcclxuICAgICAgY29waWVkUm93cy5wdXNoKC4uLnNvcnRlZENlbGxzKTtcclxuICAgIH1cclxuICAgIGlmIChjb3BpZWRSb3dzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb25zdCBhY3RpdmVDZWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFjdGl2ZS1jZWxsJyk7XHJcbiAgICAgIGlmIChhY3RpdmVDZWxsKSByZXR1cm4gW1thY3RpdmVDZWxsLnRleHRDb250ZW50Py50cmltKCkgfHwgJyddXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtYXhDb2xzID0gY29waWVkUm93cy5yZWR1Y2UoKG1heCwgcm93KSA9PiBNYXRoLm1heChtYXgsIHJvdy5sZW5ndGgpLCAwKTtcclxuICAgIHJldHVybiBjb3BpZWRSb3dzLm1hcChyb3cgPT4ge1xyXG4gICAgICBjb25zdCBuZXdSb3cgPSBbLi4ucm93XTtcclxuICAgICAgd2hpbGUgKG5ld1Jvdy5sZW5ndGggPCBtYXhDb2xzKSBuZXdSb3cucHVzaCgnJyk7XHJcbiAgICAgIHJldHVybiBuZXdSb3c7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBjb3B5VG9DbGlwYm9hcmQoXHJcbiAgICBzZWxlY3RlZERhdGE6IGFueVtdW10sXHJcbiAgICBzZWxlY3RvciA9ICcuc2VsZWN0ZWQtY2VsbCwgLmFjdGl2ZS1jZWxsLCAucm93LXNlbGVjdGVkJ1xyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKCFzZWxlY3RlZERhdGEgfHwgc2VsZWN0ZWREYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgY29uc3QgdGV4dFRvQ29weSA9IHNlbGVjdGVkRGF0YVxyXG4gICAgICAubWFwKHJvdyA9PiByb3cubWFwKGNlbGwgPT4gKGNlbGwgPz8gJycpLnRvU3RyaW5nKCkpLmpvaW4oJ1xcdCcpKVxyXG4gICAgICAuam9pbignXFxuJyk7XHJcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0VG9Db3B5KS5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcclxuICAgIGNvbnN0IHNlbGVjdGVkRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XHJcbiAgICBzZWxlY3RlZEVscy5mb3JFYWNoKGVsID0+IGVsLmNsYXNzTGlzdC5hZGQoJ2ZsYXNoLWJnJykpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHNlbGVjdGVkRWxzLmZvckVhY2goZWwgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSgnZmxhc2gtYmcnKSk7XHJcbiAgICB9LCAxMDAwKTtcclxuICB9XHJcblxyXG5cclxuICB1cGRhdGVSb3dzOiBhbnlbXSA9IFtdO1xyXG4gIGFzeW5jIHBhc3RlRnJvbUNsaXBib2FyZFRleHQoXHJcbiAgICB0ZXh0OiBzdHJpbmcsXHJcbiAgICBkYXRhU2V0OiBhbnlbXSxcclxuICAgIGNvbHVtbnM6IGFueVtdLFxyXG4gICAgc3RhcnRSb3dJbmRleDogbnVtYmVyLFxyXG4gICAgc3RhcnRDb2xJbmRleDogbnVtYmVyLFxyXG4gICAgc3RhcnRTdWJDb2xJbmRleDogbnVtYmVyID0gMFxyXG4gICk6IFByb21pc2U8YW55W10+IHtcclxuICAgIGlmICghdGV4dCkgcmV0dXJuIFtdO1xyXG4gICAgdGhpcy51cGRhdGVSb3dzID0gW107XHJcbiAgICBjb25zdCByb3dzID0gdGV4dC5zcGxpdCgvXFxyP1xcbi8pLm1hcChyID0+IHIuc3BsaXQoJ1xcdCcpKTtcclxuICAgIGNvbnN0IGZsYXR0ZW5lZENvbHVtbnM6IGFueVtdID0gW107XHJcbiAgICBjb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgaWYgKGNvbC5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgY29sLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IGZsYXR0ZW5lZENvbHVtbnMucHVzaCh7IHBhcmVudDogY29sLCAuLi5jaGlsZCB9KSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZmxhdHRlbmVkQ29sdW1ucy5wdXNoKGNvbCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbGV0IHN0YXJ0RmxhdHRlbmVkSW5kZXggPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFydENvbEluZGV4OyBpKyspIHtcclxuICAgICAgY29uc3QgY29sID0gY29sdW1uc1tpXTtcclxuICAgICAgc3RhcnRGbGF0dGVuZWRJbmRleCArPSBjb2wuY2hpbGRyZW4/Lmxlbmd0aCB8fCAxO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc3RhcnRDb2wgPSBjb2x1bW5zW3N0YXJ0Q29sSW5kZXhdO1xyXG4gICAgaWYgKHN0YXJ0Q29sPy5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgIHN0YXJ0RmxhdHRlbmVkSW5kZXggKz0gTWF0aC5taW4oc3RhcnRTdWJDb2xJbmRleCwgc3RhcnRDb2wuY2hpbGRyZW4ubGVuZ3RoIC0gMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcm93cy5mb3JFYWNoKChyb3dWYWx1ZXMsIHJPZmZzZXQpID0+IHtcclxuICAgICAgY29uc3QgdGFyZ2V0Um93SW5kZXggPSBzdGFydFJvd0luZGV4ICsgck9mZnNldDtcclxuICAgICAgY29uc3Qgcm93ID0gZGF0YVNldC5maW5kKHIgPT4gcj8uX192aXJ0dWFsSW5kZXggPT09IHRhcmdldFJvd0luZGV4KTtcclxuICAgICAgaWYgKCFyb3cpIHJldHVybjtcclxuXHJcbiAgICAgIHJvd1ZhbHVlcy5mb3JFYWNoKCh2YWx1ZSwgY09mZnNldCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gc3RhcnRGbGF0dGVuZWRJbmRleCArIGNPZmZzZXQ7XHJcbiAgICAgICAgaWYgKHRhcmdldEluZGV4IDwgMCB8fCB0YXJnZXRJbmRleCA+PSBmbGF0dGVuZWRDb2x1bW5zLmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSBmbGF0dGVuZWRDb2x1bW5zW3RhcmdldEluZGV4XTtcclxuICAgICAgICB0aGlzLnNldE5lc3RlZFZhbHVlKHJvdywgdGFyZ2V0Q29sdW1uLCB2YWx1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlUm93cztcclxuICB9XHJcblxyXG5cclxuICBzZXROZXN0ZWRWYWx1ZShvYmo6IGFueSwgY29sdW1uOiBhbnksIG9wdGlvbjogYW55LCBjYWxsZWRGcm9tSW5wdXQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgZGVidWdnZXJcclxuICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ2RhdGUnIHx8IGNvbHVtbi50eXBlID09PSAnaW1hZ2UnKSByZXR1cm47XHJcbiAgICBjb25zdCBwYXRoID0gY29sdW1uLmZpZWxkO1xyXG4gICAgaWYgKCFwYXRoKSByZXR1cm47XHJcbiAgICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpO1xyXG4gICAgY29uc3QgbGFzdEtleSA9IGtleXMucG9wKCk7XHJcbiAgICBjb25zdCBwYXJlbnQgPSBrZXlzLnJlZHVjZSgoYWNjOiBhbnksIGtleTogc3RyaW5nKSA9PiAoYWNjW2tleV0gPz89IHt9KSwgb2JqKTtcclxuICAgIGlmIChwYXJlbnQgJiYgbGFzdEtleSkge1xyXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcgJiYgb3B0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgcGFyZW50W2xhc3RLZXldID0ge1xyXG4gICAgICAgICAgaWQ6IG9wdGlvbi5pZCA/PyAxLFxyXG4gICAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSA/PyBvcHRpb24sXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJlbnRbbGFzdEtleV0gPSBvcHRpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IHNlbmRPYmogPSB7XHJcbiAgICAgIGRhdGE6IHsgLi4ub2JqIH0sXHJcbiAgICAgIGV2ZW50VHlwZTogJ29uQ2VsbEVkaXQnLFxyXG4gICAgfTtcclxuICAgIHRoaXMudXBkYXRlUm93cy5wdXNoKG9iaik7XHJcbiAgfVxyXG5cclxuXHJcbiAgY3V0U2VsZWN0ZWRTZWxlY3RlZERhdGEoXHJcbiAgICBkYXRhU2V0OiBhbnlbXSxcclxuICAgIHJvd1NlbGVjdGVkSW5kZXhlczogU2V0PG51bWJlcj4sXHJcbiAgICBzZWxlY3RlZENlbGxzOiBhbnlbXSxcclxuICAgIGNvbHVtbnM6IGFueVtdLFxyXG4gICAgc2V0TmVzdGVkVmFsdWU6IChvYmo6IGFueSwgY29sdW1uOiBhbnksIHZhbHVlOiBhbnkpID0+IHZvaWRcclxuICApOiBhbnkge1xyXG4gICAgbGV0IHVwZGF0ZWREYXRhID0gWy4uLmRhdGFTZXRdO1xyXG4gICAgaWYgKHJvd1NlbGVjdGVkSW5kZXhlcz8uc2l6ZSkge1xyXG4gICAgICBjb25zdCBpbmRleGVzID0gWy4uLnJvd1NlbGVjdGVkSW5kZXhlc107XHJcbiAgICAgIHVwZGF0ZWREYXRhID0gdXBkYXRlZERhdGEuZmlsdGVyKFxyXG4gICAgICAgIChyb3c6IGFueSkgPT4gIWluZGV4ZXMuaW5jbHVkZXMocm93Ll9fdmlydHVhbEluZGV4KVxyXG4gICAgICApO1xyXG4gICAgICAvLyByb3dTZWxlY3RlZEluZGV4ZXMuY2xlYXIoKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHNlbGVjdGVkQ2VsbHM/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZVJvd3MgPSBbXTtcclxuICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHNlbGVjdGVkQ2VsbHMpIHtcclxuICAgICAgICBjb25zdCByb3cgPSB1cGRhdGVkRGF0YS5maW5kKHIgPT4gci5fX3ZpcnR1YWxJbmRleCA9PT0gY2VsbC5yb3dJbmRleCk7XHJcbiAgICAgICAgaWYgKCFyb3cpIGNvbnRpbnVlO1xyXG4gICAgICAgIGxldCBjb2wgPSBjb2x1bW5zW2NlbGwuY29sSW5kZXhdO1xyXG4gICAgICAgIGlmIChjb2w/LmNoaWxkcmVuICYmIGNvbC5jaGlsZHJlbltjZWxsLnN1YkNvbEluZGV4XSkge1xyXG4gICAgICAgICAgY29sID0gY29sLmNoaWxkcmVuW2NlbGwuc3ViQ29sSW5kZXhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldE5lc3RlZFZhbHVlKHJvdywgY29sLCAnJyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gc2VsZWN0ZWRDZWxscy5sZW5ndGggPSAwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHt1cGRhdGVkRGF0YTogdXBkYXRlZERhdGEsIHVwZGF0ZWRSb3dzOiB0aGlzLnVwZGF0ZVJvd3N9O1xyXG4gIH1cclxuXHJcblxyXG4gIGN1dFdpdGhBbmltYXRpb24oXHJcbiAgICBzZWxlY3RlZERhdGE6IGFueVtdW10sXHJcbiAgICBzZWxlY3RvciA9ICcuc2VsZWN0ZWQtY2VsbCwgLmFjdGl2ZS1jZWxsLCAucm93LXNlbGVjdGVkJ1xyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKCFzZWxlY3RlZERhdGEgfHwgc2VsZWN0ZWREYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHRleHRUb0NvcHkgPSBzZWxlY3RlZERhdGFcclxuICAgICAgLm1hcChyb3cgPT4gcm93Lm1hcChjZWxsID0+IChjZWxsID8/ICcnKS50b1N0cmluZygpKS5qb2luKCdcXHQnKSlcclxuICAgICAgLmpvaW4oJ1xcbicpO1xyXG5cclxuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHRUb0NvcHkpLmNhdGNoKGVyciA9PiBjb25zb2xlLmVycm9yKGVycikpO1xyXG5cclxuICAgIC8vIEFwcGx5IHJlZCBjdXQgYW5pbWF0aW9uXHJcbiAgICBjb25zdCBzZWxlY3RlZEVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xyXG4gICAgc2VsZWN0ZWRFbHMuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QuYWRkKCdjdXQtZmxhc2gtYmcnKSk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgc2VsZWN0ZWRFbHMuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCdjdXQtZmxhc2gtYmcnKSk7XHJcbiAgICB9LCAxMDAwKTtcclxuICB9XHJcblxyXG5cclxufVxyXG4iXX0=