@colijnit/corecomponents_v12 258.1.6 → 258.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/colijnit-corecomponents_v12.umd.js +163 -57
- package/bundles/colijnit-corecomponents_v12.umd.js.map +1 -1
- package/colijnit-corecomponents_v12.d.ts +17 -16
- package/colijnit-corecomponents_v12.metadata.json +1 -1
- package/esm2015/colijnit-corecomponents_v12.js +18 -17
- package/esm2015/lib/components/simple-grid/simple-grid.component.js +158 -174
- package/esm2015/lib/service/excel-export.service.js +125 -0
- package/fesm2015/colijnit-corecomponents_v12.js +277 -171
- package/fesm2015/colijnit-corecomponents_v12.js.map +1 -1
- package/lib/components/simple-grid/simple-grid.component.d.ts +5 -6
- package/lib/components/simple-grid/style/_layout.scss +5 -8
- package/lib/service/excel-export.service.d.ts +44 -0
- package/package.json +1 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as XLSX from 'xlsx';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class ExcelExportService {
|
|
5
|
+
/**
|
|
6
|
+
* Export data to Excel file
|
|
7
|
+
* @param data - Array of objects to export
|
|
8
|
+
* @param columns - Column configuration (optional)
|
|
9
|
+
* @param fileName - Name of the exported file
|
|
10
|
+
* @param sheetName - Name of the Excel sheet
|
|
11
|
+
*/
|
|
12
|
+
exportToExcel(data, columns, fileName = 'export', sheetName = 'Sheet1') {
|
|
13
|
+
// If columns are specified, transform data to match column structure
|
|
14
|
+
let exportData = data;
|
|
15
|
+
if (columns && columns.length > 0) {
|
|
16
|
+
exportData = data.map(item => {
|
|
17
|
+
const newItem = {};
|
|
18
|
+
columns.forEach(col => {
|
|
19
|
+
newItem[col.header] = this.getNestedValue(item, col.key);
|
|
20
|
+
});
|
|
21
|
+
return newItem;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
// Create workbook and worksheet
|
|
25
|
+
const wb = XLSX.utils.book_new();
|
|
26
|
+
const ws = XLSX.utils.json_to_sheet(exportData);
|
|
27
|
+
// Set column widths if specified
|
|
28
|
+
if (columns && columns.some(col => col.width)) {
|
|
29
|
+
const colWidths = columns.map(col => ({ wch: col.width || 20 }));
|
|
30
|
+
ws['!cols'] = colWidths;
|
|
31
|
+
}
|
|
32
|
+
// Add worksheet to workbook
|
|
33
|
+
XLSX.utils.book_append_sheet(wb, ws, sheetName);
|
|
34
|
+
// Save file
|
|
35
|
+
XLSX.writeFile(wb, `${fileName}.xlsx`);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Export multiple sheets to one Excel file
|
|
39
|
+
* @param sheets - Array of sheet data
|
|
40
|
+
* @param fileName - Name of the exported file
|
|
41
|
+
*/
|
|
42
|
+
exportMultipleSheets(sheets, fileName = 'multi-sheet-export') {
|
|
43
|
+
const wb = XLSX.utils.book_new();
|
|
44
|
+
sheets.forEach(sheet => {
|
|
45
|
+
let exportData = sheet.data;
|
|
46
|
+
if (sheet.columns && sheet.columns.length > 0) {
|
|
47
|
+
exportData = sheet.data.map(item => {
|
|
48
|
+
const newItem = {};
|
|
49
|
+
sheet.columns.forEach(col => {
|
|
50
|
+
newItem[col.header] = this.getNestedValue(item, col.key);
|
|
51
|
+
});
|
|
52
|
+
return newItem;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const ws = XLSX.utils.json_to_sheet(exportData);
|
|
56
|
+
if (sheet.columns && sheet.columns.some(col => col.width)) {
|
|
57
|
+
const colWidths = sheet.columns.map(col => ({ wch: col.width || 20 }));
|
|
58
|
+
ws['!cols'] = colWidths;
|
|
59
|
+
}
|
|
60
|
+
XLSX.utils.book_append_sheet(wb, ws, sheet.sheetName);
|
|
61
|
+
});
|
|
62
|
+
XLSX.writeFile(wb, `${fileName}.xlsx`);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Export HTML table to Excel
|
|
66
|
+
* @param tableId - ID of the HTML table element
|
|
67
|
+
* @param fileName - Name of the exported file
|
|
68
|
+
* @param sheetName - Name of the Excel sheet
|
|
69
|
+
*/
|
|
70
|
+
exportTableToExcel(tableId, fileName = 'table-export', sheetName = 'Sheet1') {
|
|
71
|
+
const table = document.getElementById(tableId);
|
|
72
|
+
if (!table) {
|
|
73
|
+
console.error(`Table with ID '${tableId}' not found`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const wb = XLSX.utils.book_new();
|
|
77
|
+
const ws = XLSX.utils.table_to_sheet(table);
|
|
78
|
+
XLSX.utils.book_append_sheet(wb, ws, sheetName);
|
|
79
|
+
XLSX.writeFile(wb, `${fileName}.xlsx`);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get nested object value using dot notation
|
|
83
|
+
* @param obj - Object to search in
|
|
84
|
+
* @param path - Dot notation path (e.g., 'user.address.city')
|
|
85
|
+
*/
|
|
86
|
+
getNestedValue(obj, path) {
|
|
87
|
+
return path.split('.').reduce((current, key) => {
|
|
88
|
+
return current && current[key] !== undefined ? current[key] : '';
|
|
89
|
+
}, obj);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Format date for Excel export
|
|
93
|
+
* @param date - Date to format
|
|
94
|
+
* @param format - Format string (default: 'MM/DD/YYYY')
|
|
95
|
+
*/
|
|
96
|
+
formatDateForExport(date, format = 'MM/DD/YYYY') {
|
|
97
|
+
if (!date) {
|
|
98
|
+
return '';
|
|
99
|
+
}
|
|
100
|
+
const d = new Date(date);
|
|
101
|
+
if (isNaN(d.getTime())) {
|
|
102
|
+
return '';
|
|
103
|
+
}
|
|
104
|
+
const month = (d.getMonth() + 1).toString().padStart(2, '0');
|
|
105
|
+
const day = d.getDate().toString().padStart(2, '0');
|
|
106
|
+
const year = d.getFullYear();
|
|
107
|
+
switch (format) {
|
|
108
|
+
case 'MM/DD/YYYY':
|
|
109
|
+
return `${month}/${day}/${year}`;
|
|
110
|
+
case 'DD/MM/YYYY':
|
|
111
|
+
return `${day}/${month}/${year}`;
|
|
112
|
+
case 'YYYY-MM-DD':
|
|
113
|
+
return `${year}-${month}-${day}`;
|
|
114
|
+
default:
|
|
115
|
+
return d.toLocaleDateString();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
ExcelExportService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ExcelExportService_Factory() { return new ExcelExportService(); }, token: ExcelExportService, providedIn: "root" });
|
|
120
|
+
ExcelExportService.decorators = [
|
|
121
|
+
{ type: Injectable, args: [{
|
|
122
|
+
providedIn: 'root'
|
|
123
|
+
},] }
|
|
124
|
+
];
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwtZXhwb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlY29tcG9uZW50cy9zcmMvbGliL3NlcnZpY2UvZXhjZWwtZXhwb3J0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQzs7QUFXN0IsTUFBTSxPQUFPLGtCQUFrQjtJQUU3Qjs7Ozs7O09BTUc7SUFDSCxhQUFhLENBQ1gsSUFBVyxFQUNYLE9BQXdCLEVBQ3hCLFdBQW1CLFFBQVEsRUFDM0IsWUFBb0IsUUFBUTtRQUc1QixxRUFBcUU7UUFDckUsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMzQixNQUFNLE9BQU8sR0FBUSxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMzRCxDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsZ0NBQWdDO1FBQ2hDLE1BQU0sRUFBRSxHQUFrQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hELE1BQU0sRUFBRSxHQUFtQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVoRSxpQ0FBaUM7UUFDakMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBQyxDQUFDLENBQUMsQ0FBQztZQUMvRCxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDO1NBQ3pCO1FBRUQsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVoRCxZQUFZO1FBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsb0JBQW9CLENBQ2xCLE1BSUUsRUFDRixXQUFtQixvQkFBb0I7UUFFdkMsTUFBTSxFQUFFLEdBQWtCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBRTVCLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzdDLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDakMsTUFBTSxPQUFPLEdBQVEsRUFBRSxDQUFDO29CQUN4QixLQUFLLENBQUMsT0FBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzNELENBQUMsQ0FBQyxDQUFDO29CQUNILE9BQU8sT0FBTyxDQUFDO2dCQUNqQixDQUFDLENBQUMsQ0FBQzthQUNKO1lBRUQsTUFBTSxFQUFFLEdBQW1CLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRWhFLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDekQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDO2FBQ3pCO1lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxrQkFBa0IsQ0FDaEIsT0FBZSxFQUNmLFdBQW1CLGNBQWMsRUFDakMsWUFBb0IsUUFBUTtRQUU1QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPLENBQUMsS0FBSyxDQUFDLGtCQUFrQixPQUFPLGFBQWEsQ0FBQyxDQUFDO1lBQ3RELE9BQU87U0FDUjtRQUVELE1BQU0sRUFBRSxHQUFrQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hELE1BQU0sRUFBRSxHQUFtQixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1RCxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssY0FBYyxDQUFDLEdBQVEsRUFBRSxJQUFZO1FBQzNDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDN0MsT0FBTyxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBQyxJQUFtQixFQUFFLFNBQWlCLFlBQVk7UUFDcEUsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtZQUN0QixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBRUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3RCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRCxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFN0IsUUFBUSxNQUFNLEVBQUU7WUFDZCxLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbkMsS0FBSyxZQUFZO2dCQUNmLE9BQU8sR0FBRyxHQUFHLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ25DLEtBQUssWUFBWTtnQkFDZixPQUFPLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNuQztnQkFDRSxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQzs7OztZQXpKRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRDb2x1bW4ge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGhlYWRlcjogc3RyaW5nO1xyXG4gIHdpZHRoPzogbnVtYmVyO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFeGNlbEV4cG9ydFNlcnZpY2Uge1xyXG5cclxuICAvKipcclxuICAgKiBFeHBvcnQgZGF0YSB0byBFeGNlbCBmaWxlXHJcbiAgICogQHBhcmFtIGRhdGEgLSBBcnJheSBvZiBvYmplY3RzIHRvIGV4cG9ydFxyXG4gICAqIEBwYXJhbSBjb2x1bW5zIC0gQ29sdW1uIGNvbmZpZ3VyYXRpb24gKG9wdGlvbmFsKVxyXG4gICAqIEBwYXJhbSBmaWxlTmFtZSAtIE5hbWUgb2YgdGhlIGV4cG9ydGVkIGZpbGVcclxuICAgKiBAcGFyYW0gc2hlZXROYW1lIC0gTmFtZSBvZiB0aGUgRXhjZWwgc2hlZXRcclxuICAgKi9cclxuICBleHBvcnRUb0V4Y2VsKFxyXG4gICAgZGF0YTogYW55W10sXHJcbiAgICBjb2x1bW5zPzogRXhwb3J0Q29sdW1uW10sXHJcbiAgICBmaWxlTmFtZTogc3RyaW5nID0gJ2V4cG9ydCcsXHJcbiAgICBzaGVldE5hbWU6IHN0cmluZyA9ICdTaGVldDEnXHJcbiAgKTogdm9pZCB7XHJcblxyXG4gICAgLy8gSWYgY29sdW1ucyBhcmUgc3BlY2lmaWVkLCB0cmFuc2Zvcm0gZGF0YSB0byBtYXRjaCBjb2x1bW4gc3RydWN0dXJlXHJcbiAgICBsZXQgZXhwb3J0RGF0YSA9IGRhdGE7XHJcbiAgICBpZiAoY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgZXhwb3J0RGF0YSA9IGRhdGEubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IG5ld0l0ZW06IGFueSA9IHt9O1xyXG4gICAgICAgIGNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgbmV3SXRlbVtjb2wuaGVhZGVyXSA9IHRoaXMuZ2V0TmVzdGVkVmFsdWUoaXRlbSwgY29sLmtleSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG5ld0l0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENyZWF0ZSB3b3JrYm9vayBhbmQgd29ya3NoZWV0XHJcbiAgICBjb25zdCB3YjogWExTWC5Xb3JrQm9vayA9IFhMU1gudXRpbHMuYm9va19uZXcoKTtcclxuICAgIGNvbnN0IHdzOiBYTFNYLldvcmtTaGVldCA9IFhMU1gudXRpbHMuanNvbl90b19zaGVldChleHBvcnREYXRhKTtcclxuXHJcbiAgICAvLyBTZXQgY29sdW1uIHdpZHRocyBpZiBzcGVjaWZpZWRcclxuICAgIGlmIChjb2x1bW5zICYmIGNvbHVtbnMuc29tZShjb2wgPT4gY29sLndpZHRoKSkge1xyXG4gICAgICBjb25zdCBjb2xXaWR0aHMgPSBjb2x1bW5zLm1hcChjb2wgPT4gKHt3Y2g6IGNvbC53aWR0aCB8fCAyMH0pKTtcclxuICAgICAgd3NbJyFjb2xzJ10gPSBjb2xXaWR0aHM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIHdvcmtzaGVldCB0byB3b3JrYm9va1xyXG4gICAgWExTWC51dGlscy5ib29rX2FwcGVuZF9zaGVldCh3Yiwgd3MsIHNoZWV0TmFtZSk7XHJcblxyXG4gICAgLy8gU2F2ZSBmaWxlXHJcbiAgICBYTFNYLndyaXRlRmlsZSh3YiwgYCR7ZmlsZU5hbWV9Lnhsc3hgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4cG9ydCBtdWx0aXBsZSBzaGVldHMgdG8gb25lIEV4Y2VsIGZpbGVcclxuICAgKiBAcGFyYW0gc2hlZXRzIC0gQXJyYXkgb2Ygc2hlZXQgZGF0YVxyXG4gICAqIEBwYXJhbSBmaWxlTmFtZSAtIE5hbWUgb2YgdGhlIGV4cG9ydGVkIGZpbGVcclxuICAgKi9cclxuICBleHBvcnRNdWx0aXBsZVNoZWV0cyhcclxuICAgIHNoZWV0czogQXJyYXk8e1xyXG4gICAgICBkYXRhOiBhbnlbXTtcclxuICAgICAgY29sdW1ucz86IEV4cG9ydENvbHVtbltdO1xyXG4gICAgICBzaGVldE5hbWU6IHN0cmluZztcclxuICAgIH0+LFxyXG4gICAgZmlsZU5hbWU6IHN0cmluZyA9ICdtdWx0aS1zaGVldC1leHBvcnQnXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCB3YjogWExTWC5Xb3JrQm9vayA9IFhMU1gudXRpbHMuYm9va19uZXcoKTtcclxuXHJcbiAgICBzaGVldHMuZm9yRWFjaChzaGVldCA9PiB7XHJcbiAgICAgIGxldCBleHBvcnREYXRhID0gc2hlZXQuZGF0YTtcclxuXHJcbiAgICAgIGlmIChzaGVldC5jb2x1bW5zICYmIHNoZWV0LmNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGV4cG9ydERhdGEgPSBzaGVldC5kYXRhLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgIGNvbnN0IG5ld0l0ZW06IGFueSA9IHt9O1xyXG4gICAgICAgICAgc2hlZXQuY29sdW1ucyEuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICBuZXdJdGVtW2NvbC5oZWFkZXJdID0gdGhpcy5nZXROZXN0ZWRWYWx1ZShpdGVtLCBjb2wua2V5KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuIG5ld0l0ZW07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHdzOiBYTFNYLldvcmtTaGVldCA9IFhMU1gudXRpbHMuanNvbl90b19zaGVldChleHBvcnREYXRhKTtcclxuXHJcbiAgICAgIGlmIChzaGVldC5jb2x1bW5zICYmIHNoZWV0LmNvbHVtbnMuc29tZShjb2wgPT4gY29sLndpZHRoKSkge1xyXG4gICAgICAgIGNvbnN0IGNvbFdpZHRocyA9IHNoZWV0LmNvbHVtbnMubWFwKGNvbCA9PiAoe3djaDogY29sLndpZHRoIHx8IDIwfSkpO1xyXG4gICAgICAgIHdzWychY29scyddID0gY29sV2lkdGhzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBYTFNYLnV0aWxzLmJvb2tfYXBwZW5kX3NoZWV0KHdiLCB3cywgc2hlZXQuc2hlZXROYW1lKTtcclxuICAgIH0pO1xyXG5cclxuICAgIFhMU1gud3JpdGVGaWxlKHdiLCBgJHtmaWxlTmFtZX0ueGxzeGApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhwb3J0IEhUTUwgdGFibGUgdG8gRXhjZWxcclxuICAgKiBAcGFyYW0gdGFibGVJZCAtIElEIG9mIHRoZSBIVE1MIHRhYmxlIGVsZW1lbnRcclxuICAgKiBAcGFyYW0gZmlsZU5hbWUgLSBOYW1lIG9mIHRoZSBleHBvcnRlZCBmaWxlXHJcbiAgICogQHBhcmFtIHNoZWV0TmFtZSAtIE5hbWUgb2YgdGhlIEV4Y2VsIHNoZWV0XHJcbiAgICovXHJcbiAgZXhwb3J0VGFibGVUb0V4Y2VsKFxyXG4gICAgdGFibGVJZDogc3RyaW5nLFxyXG4gICAgZmlsZU5hbWU6IHN0cmluZyA9ICd0YWJsZS1leHBvcnQnLFxyXG4gICAgc2hlZXROYW1lOiBzdHJpbmcgPSAnU2hlZXQxJ1xyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJsZUlkKTtcclxuICAgIGlmICghdGFibGUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgVGFibGUgd2l0aCBJRCAnJHt0YWJsZUlkfScgbm90IGZvdW5kYCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB3YjogWExTWC5Xb3JrQm9vayA9IFhMU1gudXRpbHMuYm9va19uZXcoKTtcclxuICAgIGNvbnN0IHdzOiBYTFNYLldvcmtTaGVldCA9IFhMU1gudXRpbHMudGFibGVfdG9fc2hlZXQodGFibGUpO1xyXG5cclxuICAgIFhMU1gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQod2IsIHdzLCBzaGVldE5hbWUpO1xyXG4gICAgWExTWC53cml0ZUZpbGUod2IsIGAke2ZpbGVOYW1lfS54bHN4YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgbmVzdGVkIG9iamVjdCB2YWx1ZSB1c2luZyBkb3Qgbm90YXRpb25cclxuICAgKiBAcGFyYW0gb2JqIC0gT2JqZWN0IHRvIHNlYXJjaCBpblxyXG4gICAqIEBwYXJhbSBwYXRoIC0gRG90IG5vdGF0aW9uIHBhdGggKGUuZy4sICd1c2VyLmFkZHJlc3MuY2l0eScpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXROZXN0ZWRWYWx1ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChjdXJyZW50LCBrZXkpID0+IHtcclxuICAgICAgcmV0dXJuIGN1cnJlbnQgJiYgY3VycmVudFtrZXldICE9PSB1bmRlZmluZWQgPyBjdXJyZW50W2tleV0gOiAnJztcclxuICAgIH0sIG9iaik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3JtYXQgZGF0ZSBmb3IgRXhjZWwgZXhwb3J0XHJcbiAgICogQHBhcmFtIGRhdGUgLSBEYXRlIHRvIGZvcm1hdFxyXG4gICAqIEBwYXJhbSBmb3JtYXQgLSBGb3JtYXQgc3RyaW5nIChkZWZhdWx0OiAnTU0vREQvWVlZWScpXHJcbiAgICovXHJcbiAgZm9ybWF0RGF0ZUZvckV4cG9ydChkYXRlOiBEYXRlIHwgc3RyaW5nLCBmb3JtYXQ6IHN0cmluZyA9ICdNTS9ERC9ZWVlZJyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWRhdGUpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShkYXRlKTtcclxuICAgIGlmIChpc05hTihkLmdldFRpbWUoKSkpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1vbnRoID0gKGQuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IGRheSA9IGQuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IHllYXIgPSBkLmdldEZ1bGxZZWFyKCk7XHJcblxyXG4gICAgc3dpdGNoIChmb3JtYXQpIHtcclxuICAgICAgY2FzZSAnTU0vREQvWVlZWSc6XHJcbiAgICAgICAgcmV0dXJuIGAke21vbnRofS8ke2RheX0vJHt5ZWFyfWA7XHJcbiAgICAgIGNhc2UgJ0REL01NL1lZWVknOlxyXG4gICAgICAgIHJldHVybiBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gO1xyXG4gICAgICBjYXNlICdZWVlZLU1NLUREJzpcclxuICAgICAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gZC50b0xvY2FsZURhdGVTdHJpbmcoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|