@c80/ui 1.0.6 → 1.0.8
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.
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { Component, Input, Output, signal, EventEmitter } from '@angular/core';
|
|
1
|
+
import { Component, Input, Output, signal, EventEmitter, } from '@angular/core';
|
|
2
2
|
import { C80IconComponent } from '../icon/icon.component';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export class C80TableComponent {
|
|
5
5
|
data$;
|
|
6
6
|
columns = [];
|
|
7
|
+
size = 0; // Tamaño de la tabla (0 = sin límite, > 0 aplica max-height)
|
|
7
8
|
create = new EventEmitter();
|
|
8
9
|
update = new EventEmitter();
|
|
9
10
|
delete = new EventEmitter();
|
|
@@ -34,10 +35,10 @@ export class C80TableComponent {
|
|
|
34
35
|
this.applySorting(items);
|
|
35
36
|
this.data.set(items);
|
|
36
37
|
// Solo mostrar las columnas visibles
|
|
37
|
-
const visibleColumns = this.columns.filter(col => col?.visible !== false);
|
|
38
|
-
this.keys.set(visibleColumns.map(col => col.accessor));
|
|
38
|
+
const visibleColumns = this.columns.filter((col) => col?.visible !== false);
|
|
39
|
+
this.keys.set(visibleColumns.map((col) => col.accessor));
|
|
39
40
|
},
|
|
40
|
-
error: (err) => this.errorEvent.emit(err?.message || 'Error al cargar datos')
|
|
41
|
+
error: (err) => this.errorEvent.emit(err?.message || 'Error al cargar datos'),
|
|
41
42
|
});
|
|
42
43
|
}
|
|
43
44
|
ngOnDestroy() {
|
|
@@ -57,17 +58,13 @@ export class C80TableComponent {
|
|
|
57
58
|
}
|
|
58
59
|
onDelete(row) {
|
|
59
60
|
const id = row['id'];
|
|
60
|
-
if (
|
|
61
|
-
this.errorEvent.emit('No se puede borrar: id inválido');
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
if (confirm('¿Está seguro de que desea borrar este elemento?')) {
|
|
61
|
+
if (confirm('¿Está seguro de que desea realizar esta acción?')) {
|
|
65
62
|
this.delete.emit({
|
|
66
63
|
id,
|
|
67
64
|
done: (success) => {
|
|
68
65
|
if (success)
|
|
69
66
|
this.cancelEdit();
|
|
70
|
-
}
|
|
67
|
+
},
|
|
71
68
|
});
|
|
72
69
|
}
|
|
73
70
|
}
|
|
@@ -75,7 +72,9 @@ export class C80TableComponent {
|
|
|
75
72
|
this.creating.set(true);
|
|
76
73
|
// Inicializa newRow solo con los accessors de columnas visibles
|
|
77
74
|
const row = {};
|
|
78
|
-
this.columns
|
|
75
|
+
this.columns
|
|
76
|
+
.filter((col) => col.visible !== false)
|
|
77
|
+
.forEach((col) => {
|
|
79
78
|
row[col.accessor] = '';
|
|
80
79
|
});
|
|
81
80
|
this.newRow.set(row);
|
|
@@ -94,16 +93,17 @@ export class C80TableComponent {
|
|
|
94
93
|
const row = this.newRow();
|
|
95
94
|
if (!row)
|
|
96
95
|
return;
|
|
97
|
-
const visibleColumns = this.columns.filter(col => col.visible !== false);
|
|
96
|
+
const visibleColumns = this.columns.filter((col) => col.visible !== false);
|
|
98
97
|
const converted = visibleColumns.reduce((acc, col) => {
|
|
99
98
|
acc[col.accessor] = this.convertCellValue(row[col.accessor], col);
|
|
100
99
|
return acc;
|
|
101
100
|
}, {});
|
|
102
101
|
this.create.emit({
|
|
103
|
-
row: converted,
|
|
102
|
+
row: converted,
|
|
103
|
+
done: (success) => {
|
|
104
104
|
if (success)
|
|
105
105
|
this.cancelCreate();
|
|
106
|
-
}
|
|
106
|
+
},
|
|
107
107
|
});
|
|
108
108
|
}
|
|
109
109
|
/**
|
|
@@ -176,7 +176,9 @@ export class C80TableComponent {
|
|
|
176
176
|
onEdit(row) {
|
|
177
177
|
this.editing.set(row['id']);
|
|
178
178
|
const edit = {};
|
|
179
|
-
this.columns
|
|
179
|
+
this.columns
|
|
180
|
+
.filter((col) => col.visible !== false)
|
|
181
|
+
.forEach((col) => {
|
|
180
182
|
edit[col.accessor] = row[col.accessor];
|
|
181
183
|
});
|
|
182
184
|
this.editRow.set(edit);
|
|
@@ -202,26 +204,30 @@ export class C80TableComponent {
|
|
|
202
204
|
}
|
|
203
205
|
saveEdit(row) {
|
|
204
206
|
const id = row['id'];
|
|
205
|
-
if (typeof id !== 'number' || !this.editRow())
|
|
207
|
+
if ((typeof id !== 'string' && typeof id !== 'number') || !this.editRow())
|
|
206
208
|
return;
|
|
207
|
-
const visibleColumns = this.columns.filter(col => col.visible !== false);
|
|
209
|
+
const visibleColumns = this.columns.filter((col) => col.visible !== false);
|
|
208
210
|
const converted = visibleColumns.reduce((acc, col) => {
|
|
209
211
|
acc[col.accessor] = this.convertCellValue(this.editRow()[col.accessor], col);
|
|
210
212
|
return acc;
|
|
211
213
|
}, {});
|
|
212
214
|
this.update.emit({
|
|
213
|
-
id,
|
|
215
|
+
id,
|
|
216
|
+
changes: converted,
|
|
217
|
+
done: (success) => {
|
|
214
218
|
if (success)
|
|
215
219
|
this.cancelEdit();
|
|
216
|
-
}
|
|
220
|
+
},
|
|
217
221
|
});
|
|
218
222
|
}
|
|
219
223
|
/**
|
|
220
224
|
* TrackBy function for ngFor to avoid DOM re-creation (NG0956 warning).
|
|
221
225
|
*/
|
|
222
226
|
trackById(index, row) {
|
|
223
|
-
const id = row && typeof row === 'object' && 'id' in row
|
|
224
|
-
|
|
227
|
+
const id = row && typeof row === 'object' && 'id' in row
|
|
228
|
+
? row['id']
|
|
229
|
+
: undefined;
|
|
230
|
+
return typeof id === 'string' || typeof id === 'number' ? id : index;
|
|
225
231
|
}
|
|
226
232
|
/**
|
|
227
233
|
* Emits the view event with the entire row data
|
|
@@ -229,10 +235,57 @@ export class C80TableComponent {
|
|
|
229
235
|
onView(row) {
|
|
230
236
|
this.view.emit(row);
|
|
231
237
|
}
|
|
238
|
+
/**
|
|
239
|
+
* Returns the display value for a cell, showing '-' for falsy values except 0, false, and empty objects/arrays
|
|
240
|
+
*/
|
|
241
|
+
getDisplayValue(value) {
|
|
242
|
+
// If value is 0, show it
|
|
243
|
+
if (value === 0) {
|
|
244
|
+
return '0';
|
|
245
|
+
}
|
|
246
|
+
// If value is false, it should be handled by boolean logic in template, not here
|
|
247
|
+
if (value === false) {
|
|
248
|
+
return 'false';
|
|
249
|
+
}
|
|
250
|
+
// Handle objects and arrays (including empty ones)
|
|
251
|
+
if (typeof value === 'object' && value !== null) {
|
|
252
|
+
try {
|
|
253
|
+
return JSON.stringify(value);
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return '[object Object]';
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// If value is other falsy values (null, undefined, ''), show '-'
|
|
260
|
+
if (!value) {
|
|
261
|
+
return '-';
|
|
262
|
+
}
|
|
263
|
+
// Handle other types explicitly
|
|
264
|
+
if (typeof value === 'string' ||
|
|
265
|
+
typeof value === 'number' ||
|
|
266
|
+
typeof value === 'boolean') {
|
|
267
|
+
return String(value);
|
|
268
|
+
}
|
|
269
|
+
// For any other type (function, symbol, etc.), return a safe fallback
|
|
270
|
+
return '-';
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Calcula el max-height de la tabla basado en el tamaño
|
|
274
|
+
* Si size es 0, retorna undefined (sin límite de altura)
|
|
275
|
+
*/
|
|
276
|
+
getTableMaxHeight() {
|
|
277
|
+
if (this.size <= 0) {
|
|
278
|
+
return undefined; // Sin límite de altura
|
|
279
|
+
}
|
|
280
|
+
// Altura base de 400px * size
|
|
281
|
+
const baseHeight = 400;
|
|
282
|
+
const maxHeight = Math.round(baseHeight * this.size);
|
|
283
|
+
return `${maxHeight}px`;
|
|
284
|
+
}
|
|
232
285
|
applySorting(items) {
|
|
233
|
-
const orderedColumns = this.columns.filter(col => col.order);
|
|
286
|
+
const orderedColumns = this.columns.filter((col) => col.order);
|
|
234
287
|
if (orderedColumns.length > 0) {
|
|
235
|
-
orderedColumns.forEach(col => {
|
|
288
|
+
orderedColumns.forEach((col) => {
|
|
236
289
|
items.sort((a, b) => {
|
|
237
290
|
const valueA = a[col.accessor];
|
|
238
291
|
const valueB = b[col.accessor];
|
|
@@ -255,15 +308,17 @@ export class C80TableComponent {
|
|
|
255
308
|
}
|
|
256
309
|
}
|
|
257
310
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: C80TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
258
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: C80TableComponent, isStandalone: true, selector: "c80-table", inputs: { data$: "data$", columns: "columns" }, outputs: { create: "create", update: "update", delete: "delete", view: "view", errorEvent: "errorEvent" }, ngImport: i0, template: "<div class=\"table-responsive\">\n <table class=\"table table-bordered table-hover align-middle\">\n <thead class=\"thead table-light\">\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <th class=\"text-center boolean-column\">{{ col.label }}</th>\n }\n @else {\n <th>{{ col.label }}</th>\n }\n }\n }\n @if (hasCreateListener() || hasUpdateListener() || hasDeleteListener() || hasViewListener()) {\n <th class=\"table-actions-header\">\n <div class=\"actions-wrapper\">\n <span>Actions</span>\n @if (hasCreateListener()) {\n <c80-icon button icon=\"add\" [disabled]=\"creating()\" title=\"Agregar\" [size]=\".6\"\n (iconClick)=\"startCreate()\"></c80-icon>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track trackById(i, row); let i = $index) {\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center boolean-column\">\n @if (editing() === row['id']) {\n <input type=\"checkbox\" [checked]=\"!!editRow()?.[col.accessor]\"\n (change)=\"onEditInput($event, col.accessor, col)\" [attr.aria-label]=\"col.label\" />\n }\n @else {\n @if (row[col.accessor] === true) {\n <c80-icon icon=\"check\" [size]=\".7\"></c80-icon>\n <br />\n }\n @else if (row[col.accessor] === false) {\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n <br />\n }\n }\n </td>\n }\n @else {\n <td>\n @if (editing() === row['id']) {\n <input class=\"form-control form-control-sm\"\n [type]=\"col.type === 'number' ? 'number' : col.type === 'password' ? 'password' : 'text'\"\n [value]=\"editRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\"\n (input)=\"onEditInput($event, col.accessor, col)\" />\n }\n @else {\n @if (col.type === 'password') {\n ******\n }\n @else {\n {{ row[col.accessor] }}\n }\n }\n </td>\n }\n }\n }\n @if (hasCreateListener() || hasUpdateListener() || hasDeleteListener()) {\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n @if (editing() === row['id']) {\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveEdit(row)\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelEdit()\"\n [size]=\".7\"></c80-icon>\n }\n @else {\n @if (hasUpdateListener()) {\n <c80-icon button icon=\"edit\" title=\"Editar\" (iconClick)=\"onEdit(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasDeleteListener()) {\n <c80-icon button icon=\"delete\" color=\"warn\" title=\"Borrar\" (iconClick)=\"onDelete(row)\"\n [size]=\".7\"></c80-icon>\n }\n @if (hasViewListener()) {\n <c80-icon button icon=\"view\" color=\"primary\" title=\"Ver\" (iconClick)=\"onView(row)\" [size]=\".7\"></c80-icon>\n }\n }\n </div>\n </td>\n }\n </tr>\n }\n @if (creating() && hasCreateListener()) {\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center\">\n <input type=\"checkbox\" [checked]=\"!!newRow()?.[col.accessor]\" (change)=\"onInput($event, col.accessor, col)\"\n [attr.aria-label]=\"col.label\" />\n </td>\n } @else {\n <td>\n <input class=\"form-control form-control-sm\" [type]=\"col.type === 'number' ? 'number' : 'text'\"\n [value]=\"newRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\"\n (input)=\"onInput($event, col.accessor, col)\" />\n </td>\n }\n }\n }\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveCreate()\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelCreate()\"\n [size]=\".7\"></c80-icon>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (data().length === 0) {\n <div class=\"text-center text-muted py-3\">\n No hay datos para mostrar.\n </div>\n }\n</div>", styles: ["@charset \"UTF-8\";input[type=checkbox]{width:1.5rem;height:1.5rem;accent-color:#1976d2;border-radius:4px;border:2px solid #bdbdbd;background:#fff;transition:box-shadow .2s,border-color .2s;box-shadow:0 1px 2px #0000000a;margin:0 .25rem;vertical-align:middle;cursor:pointer}.table-responsive{width:100%;overflow-x:auto}.table-responsive .table{min-width:0px}.table-responsive .table .
|
|
311
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: C80TableComponent, isStandalone: true, selector: "c80-table", inputs: { data$: "data$", columns: "columns", size: "size" }, outputs: { create: "create", update: "update", delete: "delete", view: "view", errorEvent: "errorEvent" }, ngImport: i0, template: "<div class=\"table-responsive\" [style.max-height]=\"getTableMaxHeight()\"\n [style.overflow-y]=\"size > 0 ? 'auto' : 'visible'\">\n <table class=\"table table-bordered table-hover align-middle\">\n <thead class=\"thead table-light sticky-header\">\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <th class=\"text-center boolean-column\">{{ col.label }}</th>\n }\n @else {\n <th>{{ col.label }}</th>\n }\n }\n }\n @if (hasCreateListener() || hasUpdateListener() || hasDeleteListener() || hasViewListener()) {\n <th class=\"table-actions-header\">\n <div class=\"actions-wrapper\">\n <span>Actions</span>\n @if (hasCreateListener()) {\n <c80-icon button icon=\"add\" [disabled]=\"creating()\" title=\"Agregar\" [size]=\".6\"\n (iconClick)=\"startCreate()\"></c80-icon>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track trackById(i, row); let i = $index) {\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center boolean-column\">\n @if (editing() === row['id']) {\n <input type=\"checkbox\" [checked]=\"!!editRow()?.[col.accessor]\"\n (change)=\"onEditInput($event, col.accessor, col)\" [attr.aria-label]=\"col.label\" />\n }\n @else {\n @if (row[col.accessor] === true) {\n <c80-icon icon=\"check\" [size]=\".7\"></c80-icon>\n <br />\n }\n @else if (row[col.accessor] === false) {\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n <br />\n }\n }\n </td>\n }\n @else {\n <td>\n @if (editing() === row['id']) {\n <input class=\"form-control form-control-sm\"\n [type]=\"col.type === 'number' ? 'number' : col.type === 'password' ? 'password' : 'text'\"\n [value]=\"editRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\"\n (input)=\"onEditInput($event, col.accessor, col)\" />\n }\n @else {\n @if (col.type === 'password') {\n ******\n }\n @else if (row[col.accessor] === true) {\n <c80-icon icon=\"check\" [size]=\".7\"></c80-icon>\n }\n @else if (row[col.accessor] === false) {\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n }\n @else {\n {{ getDisplayValue(row[col.accessor]) }}\n }\n }\n </td>\n }\n }\n }\n @if (hasCreateListener() || hasUpdateListener() || hasDeleteListener() || hasViewListener()) {\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n @if (editing() === row['id']) {\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveEdit(row)\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelEdit()\"\n [size]=\".7\"></c80-icon>\n }\n @else {\n @if (hasUpdateListener()) {\n <c80-icon button icon=\"edit\" title=\"Editar\" (iconClick)=\"onEdit(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasDeleteListener()) {\n <c80-icon button icon=\"delete\" color=\"warn\" title=\"Borrar\" (iconClick)=\"onDelete(row)\"\n [size]=\".7\"></c80-icon>\n }\n @if (hasViewListener()) {\n <c80-icon button icon=\"view\" color=\"primary\" title=\"Ver\" (iconClick)=\"onView(row)\" [size]=\".7\"></c80-icon>\n }\n }\n </div>\n </td>\n }\n </tr>\n }\n @if (creating() && hasCreateListener()) {\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center\">\n <input type=\"checkbox\" [checked]=\"!!newRow()?.[col.accessor]\" (change)=\"onInput($event, col.accessor, col)\"\n [attr.aria-label]=\"col.label\" />\n </td>\n } @else {\n <td>\n <input class=\"form-control form-control-sm\" [type]=\"col.type === 'number' ? 'number' : 'text'\"\n [value]=\"newRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\"\n (input)=\"onInput($event, col.accessor, col)\" />\n </td>\n }\n }\n }\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveCreate()\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelCreate()\"\n [size]=\".7\"></c80-icon>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (data().length === 0) {\n <div class=\"text-center text-muted py-3\">\n No hay datos para mostrar.\n </div>\n }\n</div>", styles: ["@charset \"UTF-8\";input[type=checkbox]{width:1.5rem;height:1.5rem;accent-color:#1976d2;border-radius:4px;border:2px solid #bdbdbd;background:#fff;transition:box-shadow .2s,border-color .2s;box-shadow:0 1px 2px #0000000a;margin:0 .25rem;vertical-align:middle;cursor:pointer}.table-responsive{width:100%;overflow-x:auto}.table-responsive .table{min-width:0px;margin-bottom:.5rem}.table-responsive .table .sticky-header{position:sticky;top:0;z-index:10;background-color:#f8f9fa!important}.table-responsive .table .sticky-header .table-actions-header{display:table-cell;vertical-align:middle;padding:.2rem .6rem!important;background-color:#f8f9fa!important}.table-responsive .table .sticky-header .actions-wrapper{display:flex;align-items:center;justify-content:center;gap:.5rem;height:100%}.table-responsive .table .sticky-header th{max-height:31px!important;vertical-align:middle!important;padding:.2rem .6rem!important;font-size:small!important;background-color:#f8f9fa!important;border-bottom:2px solid #dee2e6}.table-responsive .table tbody td{height:35px!important;min-height:35px!important;max-height:35px!important;vertical-align:middle!important;padding:.2rem .8rem!important;font-size:small}.table-responsive .table tbody tr{height:35px!important;min-height:35px!important;max-height:35px!important;cursor:pointer}.table-responsive .table tbody tr:hover{background-color:#f5f5f5}.table-responsive .table tbody input{border:1px solid rgba(34,0,255,.37);height:100%!important;font-size:smaller!important}.table-responsive .table thead th.boolean-column,.table-responsive .table tbody td.boolean-column,.table-responsive .table thead th.table-actions-header,.table-responsive .table tbody td.table-actions-header{width:1%;white-space:nowrap}.table-responsive .table .actions-cell{white-space:nowrap;padding:0!important}.table-responsive .table .actions-container{display:flex;flex-direction:row;justify-content:center;align-items:center;width:100%;height:100%}\n"], dependencies: [{ kind: "component", type: C80IconComponent, selector: "c80-icon", inputs: ["icon", "color", "disabled", "size", "button", "type"], outputs: ["iconClick"] }] });
|
|
259
312
|
}
|
|
260
313
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: C80TableComponent, decorators: [{
|
|
261
314
|
type: Component,
|
|
262
|
-
args: [{ selector: 'c80-table', standalone: true, imports: [C80IconComponent], template: "<div class=\"table-responsive\">\n <table class=\"table table-bordered table-hover align-middle\">\n <thead class=\"thead table-light\">\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <th class=\"text-center boolean-column\">{{ col.label }}</th>\n }\n @else {\n <th>{{ col.label }}</th>\n }\n }\n }\n @if (hasCreateListener() || hasUpdateListener() || hasDeleteListener() || hasViewListener()) {\n <th class=\"table-actions-header\">\n <div class=\"actions-wrapper\">\n <span>Actions</span>\n @if (hasCreateListener()) {\n <c80-icon button icon=\"add\" [disabled]=\"creating()\" title=\"Agregar\" [size]=\".6\"\n (iconClick)=\"startCreate()\"></c80-icon>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track trackById(i, row); let i = $index) {\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center boolean-column\">\n @if (editing() === row['id']) {\n <input type=\"checkbox\" [checked]=\"!!editRow()?.[col.accessor]\"\n (change)=\"onEditInput($event, col.accessor, col)\" [attr.aria-label]=\"col.label\" />\n }\n @else {\n @if (row[col.accessor] === true) {\n <c80-icon icon=\"check\" [size]=\".7\"></c80-icon>\n <br />\n }\n @else if (row[col.accessor] === false) {\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n <br />\n }\n }\n </td>\n }\n @else {\n <td>\n @if (editing() === row['id']) {\n <input class=\"form-control form-control-sm\"\n [type]=\"col.type === 'number' ? 'number' : col.type === 'password' ? 'password' : 'text'\"\n [value]=\"editRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\"\n (input)=\"onEditInput($event, col.accessor, col)\" />\n }\n @else {\n @if (col.type === 'password') {\n ******\n }\n @else {\n {{ row[col.accessor] }}\n }\n }\n </td>\n }\n }\n }\n @if (hasCreateListener() || hasUpdateListener() || hasDeleteListener()) {\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n @if (editing() === row['id']) {\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveEdit(row)\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelEdit()\"\n [size]=\".7\"></c80-icon>\n }\n @else {\n @if (hasUpdateListener()) {\n <c80-icon button icon=\"edit\" title=\"Editar\" (iconClick)=\"onEdit(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasDeleteListener()) {\n <c80-icon button icon=\"delete\" color=\"warn\" title=\"Borrar\" (iconClick)=\"onDelete(row)\"\n [size]=\".7\"></c80-icon>\n }\n @if (hasViewListener()) {\n <c80-icon button icon=\"view\" color=\"primary\" title=\"Ver\" (iconClick)=\"onView(row)\" [size]=\".7\"></c80-icon>\n }\n }\n </div>\n </td>\n }\n </tr>\n }\n @if (creating() && hasCreateListener()) {\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center\">\n <input type=\"checkbox\" [checked]=\"!!newRow()?.[col.accessor]\" (change)=\"onInput($event, col.accessor, col)\"\n [attr.aria-label]=\"col.label\" />\n </td>\n } @else {\n <td>\n <input class=\"form-control form-control-sm\" [type]=\"col.type === 'number' ? 'number' : 'text'\"\n [value]=\"newRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\"\n (input)=\"onInput($event, col.accessor, col)\" />\n </td>\n }\n }\n }\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveCreate()\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelCreate()\"\n [size]=\".7\"></c80-icon>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (data().length === 0) {\n <div class=\"text-center text-muted py-3\">\n No hay datos para mostrar.\n </div>\n }\n</div>", styles: ["@charset \"UTF-8\";input[type=checkbox]{width:1.5rem;height:1.5rem;accent-color:#1976d2;border-radius:4px;border:2px solid #bdbdbd;background:#fff;transition:box-shadow .2s,border-color .2s;box-shadow:0 1px 2px #0000000a;margin:0 .25rem;vertical-align:middle;cursor:pointer}.table-responsive{width:100%;overflow-x:auto}.table-responsive .table{min-width:0px}.table-responsive .table .
|
|
315
|
+
args: [{ selector: 'c80-table', standalone: true, imports: [C80IconComponent], template: "<div class=\"table-responsive\" [style.max-height]=\"getTableMaxHeight()\"\n [style.overflow-y]=\"size > 0 ? 'auto' : 'visible'\">\n <table class=\"table table-bordered table-hover align-middle\">\n <thead class=\"thead table-light sticky-header\">\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <th class=\"text-center boolean-column\">{{ col.label }}</th>\n }\n @else {\n <th>{{ col.label }}</th>\n }\n }\n }\n @if (hasCreateListener() || hasUpdateListener() || hasDeleteListener() || hasViewListener()) {\n <th class=\"table-actions-header\">\n <div class=\"actions-wrapper\">\n <span>Actions</span>\n @if (hasCreateListener()) {\n <c80-icon button icon=\"add\" [disabled]=\"creating()\" title=\"Agregar\" [size]=\".6\"\n (iconClick)=\"startCreate()\"></c80-icon>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track trackById(i, row); let i = $index) {\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center boolean-column\">\n @if (editing() === row['id']) {\n <input type=\"checkbox\" [checked]=\"!!editRow()?.[col.accessor]\"\n (change)=\"onEditInput($event, col.accessor, col)\" [attr.aria-label]=\"col.label\" />\n }\n @else {\n @if (row[col.accessor] === true) {\n <c80-icon icon=\"check\" [size]=\".7\"></c80-icon>\n <br />\n }\n @else if (row[col.accessor] === false) {\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n <br />\n }\n }\n </td>\n }\n @else {\n <td>\n @if (editing() === row['id']) {\n <input class=\"form-control form-control-sm\"\n [type]=\"col.type === 'number' ? 'number' : col.type === 'password' ? 'password' : 'text'\"\n [value]=\"editRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\"\n (input)=\"onEditInput($event, col.accessor, col)\" />\n }\n @else {\n @if (col.type === 'password') {\n ******\n }\n @else if (row[col.accessor] === true) {\n <c80-icon icon=\"check\" [size]=\".7\"></c80-icon>\n }\n @else if (row[col.accessor] === false) {\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n }\n @else {\n {{ getDisplayValue(row[col.accessor]) }}\n }\n }\n </td>\n }\n }\n }\n @if (hasCreateListener() || hasUpdateListener() || hasDeleteListener() || hasViewListener()) {\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n @if (editing() === row['id']) {\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveEdit(row)\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelEdit()\"\n [size]=\".7\"></c80-icon>\n }\n @else {\n @if (hasUpdateListener()) {\n <c80-icon button icon=\"edit\" title=\"Editar\" (iconClick)=\"onEdit(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasDeleteListener()) {\n <c80-icon button icon=\"delete\" color=\"warn\" title=\"Borrar\" (iconClick)=\"onDelete(row)\"\n [size]=\".7\"></c80-icon>\n }\n @if (hasViewListener()) {\n <c80-icon button icon=\"view\" color=\"primary\" title=\"Ver\" (iconClick)=\"onView(row)\" [size]=\".7\"></c80-icon>\n }\n }\n </div>\n </td>\n }\n </tr>\n }\n @if (creating() && hasCreateListener()) {\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center\">\n <input type=\"checkbox\" [checked]=\"!!newRow()?.[col.accessor]\" (change)=\"onInput($event, col.accessor, col)\"\n [attr.aria-label]=\"col.label\" />\n </td>\n } @else {\n <td>\n <input class=\"form-control form-control-sm\" [type]=\"col.type === 'number' ? 'number' : 'text'\"\n [value]=\"newRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\"\n (input)=\"onInput($event, col.accessor, col)\" />\n </td>\n }\n }\n }\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveCreate()\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelCreate()\"\n [size]=\".7\"></c80-icon>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (data().length === 0) {\n <div class=\"text-center text-muted py-3\">\n No hay datos para mostrar.\n </div>\n }\n</div>", styles: ["@charset \"UTF-8\";input[type=checkbox]{width:1.5rem;height:1.5rem;accent-color:#1976d2;border-radius:4px;border:2px solid #bdbdbd;background:#fff;transition:box-shadow .2s,border-color .2s;box-shadow:0 1px 2px #0000000a;margin:0 .25rem;vertical-align:middle;cursor:pointer}.table-responsive{width:100%;overflow-x:auto}.table-responsive .table{min-width:0px;margin-bottom:.5rem}.table-responsive .table .sticky-header{position:sticky;top:0;z-index:10;background-color:#f8f9fa!important}.table-responsive .table .sticky-header .table-actions-header{display:table-cell;vertical-align:middle;padding:.2rem .6rem!important;background-color:#f8f9fa!important}.table-responsive .table .sticky-header .actions-wrapper{display:flex;align-items:center;justify-content:center;gap:.5rem;height:100%}.table-responsive .table .sticky-header th{max-height:31px!important;vertical-align:middle!important;padding:.2rem .6rem!important;font-size:small!important;background-color:#f8f9fa!important;border-bottom:2px solid #dee2e6}.table-responsive .table tbody td{height:35px!important;min-height:35px!important;max-height:35px!important;vertical-align:middle!important;padding:.2rem .8rem!important;font-size:small}.table-responsive .table tbody tr{height:35px!important;min-height:35px!important;max-height:35px!important;cursor:pointer}.table-responsive .table tbody tr:hover{background-color:#f5f5f5}.table-responsive .table tbody input{border:1px solid rgba(34,0,255,.37);height:100%!important;font-size:smaller!important}.table-responsive .table thead th.boolean-column,.table-responsive .table tbody td.boolean-column,.table-responsive .table thead th.table-actions-header,.table-responsive .table tbody td.table-actions-header{width:1%;white-space:nowrap}.table-responsive .table .actions-cell{white-space:nowrap;padding:0!important}.table-responsive .table .actions-container{display:flex;flex-direction:row;justify-content:center;align-items:center;width:100%;height:100%}\n"] }]
|
|
263
316
|
}], propDecorators: { data$: [{
|
|
264
317
|
type: Input
|
|
265
318
|
}], columns: [{
|
|
266
319
|
type: Input
|
|
320
|
+
}], size: [{
|
|
321
|
+
type: Input
|
|
267
322
|
}], create: [{
|
|
268
323
|
type: Output
|
|
269
324
|
}], update: [{
|
|
@@ -275,4 +330,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
275
330
|
}], errorEvent: [{
|
|
276
331
|
type: Output
|
|
277
332
|
}] } });
|
|
278
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy91aS9zcmMvbGliL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBaUIxRCxNQUFNLE9BQU8saUJBQWlCO0lBQ25CLEtBQUssQ0FBbUI7SUFDeEIsT0FBTyxHQUFxQixFQUFFLENBQUM7SUFDOUIsTUFBTSxHQUFHLElBQUksWUFBWSxFQUF3RCxDQUFDO0lBQ2xGLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBd0UsQ0FBQztJQUNsRyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQW1ELENBQUM7SUFDN0UsSUFBSSxHQUFHLElBQUksWUFBWSxFQUFLLENBQUM7SUFDN0IsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7SUFFekMsSUFBSSxHQUFHLE1BQU0sQ0FBTSxFQUFFLENBQUMsQ0FBQztJQUN2QixJQUFJLEdBQUcsTUFBTSxDQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsTUFBTSxHQUFHLE1BQU0sQ0FBb0IsSUFBSSxDQUFDLENBQUM7SUFDaEMsT0FBTyxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7SUFDaEUsT0FBTyxHQUFHLE1BQU0sQ0FBb0IsSUFBSSxDQUFDLENBQUM7SUFFbkQsMENBQTBDO0lBQ2pDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMs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SSxXQUNQLENBQUMsZ0JBQWdCLENBQUM7OEJBS2xCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIHNpZ25hbCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQzgwSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDODBUYWJsZUNvbERlZiB7XHJcbiAgYWNjZXNzb3I6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZpc2libGU/OiBib29sZWFuOyAvLyBTaSBubyBzZSBlc3BlY2lmaWNhLCBzZSBhc3VtZSB0cnVlXHJcbiAgdHlwZT86ICdzdHJpbmcnIHwgJ251bWJlcicgfCAnYm9vbGVhbicgfCAncGFzc3dvcmQnOyAvLyBUaXBvIGRlIGRhdG8gcGFyYSBsYSBjb2x1bW5hXHJcbiAgb3JkZXI/OiAnQVNDJyB8ICdERVNDJzsgLy8gT3JkZW5hbWllbnRvIGRlIGxhIGNvbHVtbmFcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjODAtdGFibGUnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0M4MEljb25Db21wb25lbnRdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEM4MFRhYmxlQ29tcG9uZW50PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgZGF0YSQhOiBPYnNlcnZhYmxlPFRbXT47XHJcbiAgQElucHV0KCkgY29sdW1uczogQzgwVGFibGVDb2xEZWZbXSA9IFtdO1xyXG4gIEBPdXRwdXQoKSBjcmVhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcm93OiBQYXJ0aWFsPFQ+LCBkb25lOiAocmVzdWx0OiBib29sZWFuKSA9PiB2b2lkIH0+KCk7XHJcbiAgQE91dHB1dCgpIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogbnVtYmVyLCBjaGFuZ2VzOiBQYXJ0aWFsPFQ+LCBkb25lOiAocmVzdWx0OiBib29sZWFuKSA9PiB2b2lkIH0+KCk7XHJcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogbnVtYmVyLCBkb25lOiAocmVzdWx0OiBib29sZWFuKSA9PiB2b2lkIH0+KCk7XHJcbiAgQE91dHB1dCgpIHZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XHJcbiAgQE91dHB1dCgpIGVycm9yRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgcmVhZG9ubHkgZGF0YSA9IHNpZ25hbDxUW10+KFtdKTtcclxuICByZWFkb25seSBrZXlzID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XHJcbiAgY3JlYXRpbmcgPSBzaWduYWwoZmFsc2UpO1xyXG4gIG5ld1JvdyA9IHNpZ25hbDxQYXJ0aWFsPFQ+IHwgbnVsbD4obnVsbCk7XHJcbiAgcmVhZG9ubHkgZWRpdGluZyA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTsgLy8gaWQgb2Ygcm93IGJlaW5nIGVkaXRlZFxyXG4gIHJlYWRvbmx5IGVkaXRSb3cgPSBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+KG51bGwpO1xyXG5cclxuICAvLyBGbGFncyB0byBjaGVjayBpZiBldmVudHMgaGF2ZSBsaXN0ZW5lcnNcclxuICByZWFkb25seSBoYXNDcmVhdGVMaXN0ZW5lciA9IHNpZ25hbChmYWxzZSk7XHJcbiAgcmVhZG9ubHkgaGFzVXBkYXRlTGlzdGVuZXIgPSBzaWduYWwoZmFsc2UpO1xyXG4gIHJlYWRvbmx5IGhhc0RlbGV0ZUxpc3RlbmVyID0gc2lnbmFsKGZhbHNlKTtcclxuICByZWFkb25seSBoYXNWaWV3TGlzdGVuZXIgPSBzaWduYWwoZmFsc2UpO1xyXG5cclxuICBwcml2YXRlIGRhdGFTdWI/OiBTdWJzY3JpcHRpb247XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIG91dHB1dHMgaGF2ZSBsaXN0ZW5lcnNcclxuICAgIHRoaXMuaGFzQ3JlYXRlTGlzdGVuZXIuc2V0KHRoaXMuY3JlYXRlLm9ic2VydmVkKTtcclxuICAgIHRoaXMuaGFzVXBkYXRlTGlzdGVuZXIuc2V0KHRoaXMudXBkYXRlLm9ic2VydmVkKTtcclxuICAgIHRoaXMuaGFzRGVsZXRlTGlzdGVuZXIuc2V0KHRoaXMuZGVsZXRlLm9ic2VydmVkKTtcclxuICAgIHRoaXMuaGFzVmlld0xpc3RlbmVyLnNldCh0aGlzLnZpZXcub2JzZXJ2ZWQpO1xyXG5cclxuICAgIGlmICghdGhpcy5kYXRhJCkgcmV0dXJuO1xyXG4gICAgdGhpcy5kYXRhU3ViID0gdGhpcy5kYXRhJC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoaXRlbXMpID0+IHtcclxuICAgICAgICB0aGlzLmFwcGx5U29ydGluZyhpdGVtcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhLnNldChpdGVtcyk7XHJcbiAgICAgICAgLy8gU29sbyBtb3N0cmFyIGxhcyBjb2x1bW5hcyB2aXNpYmxlc1xyXG4gICAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sPy52aXNpYmxlICE9PSBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5rZXlzLnNldCh2aXNpYmxlQ29sdW1ucy5tYXAoY29sID0+IGNvbC5hY2Nlc3NvcikpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4gdGhpcy5lcnJvckV2ZW50LmVtaXQoZXJyPy5tZXNzYWdlIHx8ICdFcnJvciBhbCBjYXJnYXIgZGF0b3MnKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuZGF0YVN1Yj8udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIG9uSW5wdXQoZXZlbnQ6IEV2ZW50LCBrZXk6IHN0cmluZywgY29sPzogQzgwVGFibGVDb2xEZWYpIHtcclxuICAgIGlmIChjb2w/LnR5cGUgPT09ICdib29sZWFuJykge1xyXG4gICAgICBjb25zdCBjaGVja2VkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xyXG4gICAgICB0aGlzLnVwZGF0ZU5ld1JvdyhrZXksIGNoZWNrZWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KTtcclxuICAgICAgaWYgKHRhcmdldCAmJiB0eXBlb2YgdGFyZ2V0LnZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHRoaXMudXBkYXRlTmV3Um93KGtleSwgdGFyZ2V0LnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25EZWxldGUocm93OiBUKSB7XHJcbiAgICBjb25zdCBpZCA9IHJvd1snaWQnXTtcclxuICAgIGlmICh0eXBlb2YgaWQgIT09ICdudW1iZXInKSB7XHJcbiAgICAgIHRoaXMuZXJyb3JFdmVudC5lbWl0KCdObyBzZSBwdWVkZSBib3JyYXI6IGlkIGludsOhbGlkbycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoY29uZmlybSgnwr9Fc3TDoSBzZWd1cm8gZGUgcXVlIGRlc2VhIGJvcnJhciBlc3RlIGVsZW1lbnRvPycpKSB7XHJcbiAgICAgIHRoaXMuZGVsZXRlLmVtaXQoe1xyXG4gICAgICAgIGlkLFxyXG4gICAgICAgIGRvbmU6IChzdWNjZXNzOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgICBpZiAoc3VjY2VzcykgdGhpcy5jYW5jZWxFZGl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0Q3JlYXRlKCkge1xyXG4gICAgdGhpcy5jcmVhdGluZy5zZXQodHJ1ZSk7XHJcbiAgICAvLyBJbmljaWFsaXphIG5ld1JvdyBzb2xvIGNvbiBsb3MgYWNjZXNzb3JzIGRlIGNvbHVtbmFzIHZpc2libGVzXHJcbiAgICBjb25zdCByb3c6IFBhcnRpYWw8VD4gPSB7fTtcclxuICAgIHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC52aXNpYmxlICE9PSBmYWxzZSkuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAocm93IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtjb2wuYWNjZXNzb3JdID0gJyc7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubmV3Um93LnNldChyb3cpO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsQ3JlYXRlKCkge1xyXG4gICAgdGhpcy5jcmVhdGluZy5zZXQoZmFsc2UpO1xyXG4gICAgdGhpcy5uZXdSb3cuc2V0KG51bGwpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlTmV3Um93KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xyXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMubmV3Um93KCk7XHJcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcclxuICAgIHRoaXMubmV3Um93LnNldCh7IC4uLmN1cnJlbnQsIFtrZXldOiB2YWx1ZSB9KTtcclxuICB9XHJcblxyXG4gIHNhdmVDcmVhdGUoKSB7XHJcbiAgICBjb25zdCByb3cgPSB0aGlzLm5ld1JvdygpO1xyXG4gICAgaWYgKCFyb3cpIHJldHVybjtcclxuICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLnZpc2libGUgIT09IGZhbHNlKTtcclxuICAgIGNvbnN0IGNvbnZlcnRlZCA9IHZpc2libGVDb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2wpID0+IHtcclxuICAgICAgYWNjW2NvbC5hY2Nlc3Nvcl0gPSB0aGlzLmNvbnZlcnRDZWxsVmFsdWUocm93W2NvbC5hY2Nlc3Nvcl0sIGNvbCk7XHJcbiAgICAgIHJldHVybiBhY2M7XHJcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgYXMgUGFydGlhbDxUPjtcclxuICAgIHRoaXMuY3JlYXRlLmVtaXQoe1xyXG4gICAgICByb3c6IGNvbnZlcnRlZCwgZG9uZTogKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAoc3VjY2VzcykgdGhpcy5jYW5jZWxDcmVhdGUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0cyBhIGNlbGwgdmFsdWUgYmFzZWQgb24gY29sdW1uIHR5cGUgb3Igc2FtcGxlIGRhdGEuXHJcbiAgICogSGFuZGxlcyBzdHJpbmdpZmljYXRpb24gb2Ygb2JqZWN0cyBmb3Igc3RyaW5nIGNvbHVtbnMuXHJcbiAgICovXHJcbiAgLyoqXHJcbiAgICogQ29udmVydHMgYSBjZWxsIHZhbHVlIGJhc2VkIG9uIGNvbHVtbiB0eXBlIG9yIHNhbXBsZSBkYXRhLlxyXG4gICAqIERlbGVnYXRlcyB0byB0eXBlLXNwZWNpZmljIGhlbHBlcnMgZm9yIGNsYXJpdHkgYW5kIG1haW50YWluYWJpbGl0eS5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbnZlcnRDZWxsVmFsdWUodmFsdWU6IHVua25vd24sIGNvbDogQzgwVGFibGVDb2xEZWYpOiB1bmtub3duIHtcclxuICAgIGlmIChjb2wudHlwZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdGhpcy50b0Jvb2xlYW4odmFsdWUpO1xyXG4gICAgaWYgKGNvbC50eXBlID09PSAnbnVtYmVyJykgcmV0dXJuIHRoaXMudG9OdW1iZXIodmFsdWUpO1xyXG4gICAgaWYgKGNvbC50eXBlID09PSAnc3RyaW5nJyB8fCBjb2wudHlwZSA9PT0gJ3Bhc3N3b3JkJykgcmV0dXJuIHRoaXMudG9TdHJpbmdWYWx1ZSh2YWx1ZSk7XHJcblxyXG4gICAgLy8gRmFsbGJhY2s6IHVzZSBzYW1wbGUgZGF0YSBpZiBhdmFpbGFibGVcclxuICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuZGF0YSgpWzBdO1xyXG4gICAgaWYgKHNhbXBsZSAmJiBjb2wuYWNjZXNzb3IgaW4gc2FtcGxlKSB7XHJcbiAgICAgIGNvbnN0IHNhbXBsZVZhbHVlID0gc2FtcGxlW2NvbC5hY2Nlc3Nvcl07XHJcbiAgICAgIGlmICh0eXBlb2Ygc2FtcGxlVmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHZhbHVlKTtcclxuICAgICAgaWYgKHR5cGVvZiBzYW1wbGVWYWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB0aGlzLnRvTnVtYmVyKHZhbHVlKTtcclxuICAgICAgaWYgKHR5cGVvZiBzYW1wbGVWYWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB0aGlzLnRvU3RyaW5nVmFsdWUodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbnZlcnRzIHZhbHVlIHRvIGJvb2xlYW4gdXNpbmcgYmVzdCBwcmFjdGljZXMuICovXHJcbiAgcHJpdmF0ZSB0b0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbHVlO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnIHx8IHZhbHVlLnRyaW0oKSA9PT0gJzEnO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB2YWx1ZSA9PT0gMTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiBDb252ZXJ0cyB2YWx1ZSB0byBudW1iZXIgdXNpbmcgYmVzdCBwcmFjdGljZXMuICovXHJcbiAgcHJpdmF0ZSB0b051bWJlcih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHZhbHVlO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZS50cmltKCkgPT09ICcnID8gdW5kZWZpbmVkIDogTnVtYmVyKHZhbHVlKTtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbHVlID8gMSA6IDA7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbnZlcnRzIHZhbHVlIHRvIHN0cmluZyB1c2luZyBiZXN0IHByYWN0aWNlcywgYWx3YXlzIHN0cmluZ2lmaWVzIG9iamVjdHMuICovXHJcbiAgcHJpdmF0ZSB0b1N0cmluZ1ZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gJyc7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiBTdHJpbmcodmFsdWUpO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgICB9IGNhdGNoIHtcclxuICAgICAgICByZXR1cm4gJ1tvYmplY3QgT2JqZWN0XSc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEZvciBmdW5jdGlvbnMsIHN5bWJvbHMsIHVuZGVmaW5lZCwgZXRjLiwgcmV0dXJuIGVtcHR5IHN0cmluZ1xyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgb25FZGl0KHJvdzogVCkge1xyXG4gICAgdGhpcy5lZGl0aW5nLnNldChyb3dbJ2lkJ10gYXMgbnVtYmVyKTtcclxuICAgIGNvbnN0IGVkaXQ6IFBhcnRpYWw8VD4gPSB7fTtcclxuICAgIHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC52aXNpYmxlICE9PSBmYWxzZSkuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAoZWRpdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbY29sLmFjY2Vzc29yXSA9IHJvd1tjb2wuYWNjZXNzb3JdO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmVkaXRSb3cuc2V0KGVkaXQpO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsRWRpdCgpIHtcclxuICAgIHRoaXMuZWRpdGluZy5zZXQobnVsbCk7XHJcbiAgICB0aGlzLmVkaXRSb3cuc2V0KG51bGwpO1xyXG4gIH1cclxuXHJcbiAgb25FZGl0SW5wdXQoZXZlbnQ6IEV2ZW50LCBrZXk6IHN0cmluZywgY29sPzogQzgwVGFibGVDb2xEZWYpIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmVkaXRSb3coKTtcclxuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xyXG4gICAgaWYgKGNvbD8udHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XHJcbiAgICAgIHRoaXMuZWRpdFJvdy5zZXQoeyAuLi5jdXJyZW50LCBba2V5XTogY2hlY2tlZCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCk7XHJcbiAgICAgIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0aGlzLmVkaXRSb3cuc2V0KHsgLi4uY3VycmVudCwgW2tleV06IHRhcmdldC52YWx1ZSB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2F2ZUVkaXQocm93OiBUKSB7XHJcbiAgICBjb25zdCBpZCA9IHJvd1snaWQnXTtcclxuICAgIGlmICh0eXBlb2YgaWQgIT09ICdudW1iZXInIHx8ICF0aGlzLmVkaXRSb3coKSkgcmV0dXJuO1xyXG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wudmlzaWJsZSAhPT0gZmFsc2UpO1xyXG4gICAgY29uc3QgY29udmVydGVkID0gdmlzaWJsZUNvbHVtbnMucmVkdWNlKChhY2MsIGNvbCkgPT4ge1xyXG4gICAgICBhY2NbY29sLmFjY2Vzc29yXSA9IHRoaXMuY29udmVydENlbGxWYWx1ZSh0aGlzLmVkaXRSb3coKSFbY29sLmFjY2Vzc29yXSwgY29sKTtcclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSBhcyBQYXJ0aWFsPFQ+O1xyXG4gICAgdGhpcy51cGRhdGUuZW1pdCh7XHJcbiAgICAgIGlkLCBjaGFuZ2VzOiBjb252ZXJ0ZWQsIGRvbmU6IChzdWNjZXNzOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHRoaXMuY2FuY2VsRWRpdCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYWNrQnkgZnVuY3Rpb24gZm9yIG5nRm9yIHRvIGF2b2lkIERPTSByZS1jcmVhdGlvbiAoTkcwOTU2IHdhcm5pbmcpLlxyXG4gICAqL1xyXG4gIHRyYWNrQnlJZChpbmRleDogbnVtYmVyLCByb3c6IFQpOiBudW1iZXIgfCBzdHJpbmcge1xyXG4gICAgY29uc3QgaWQgPSByb3cgJiYgdHlwZW9mIHJvdyA9PT0gJ29iamVjdCcgJiYgJ2lkJyBpbiByb3cgPyAocm93IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVsnaWQnXSA6IHVuZGVmaW5lZDtcclxuICAgIHJldHVybiAodHlwZW9mIGlkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgaWQgPT09ICdudW1iZXInKSA/IGlkIDogaW5kZXg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB0aGUgdmlldyBldmVudCB3aXRoIHRoZSBlbnRpcmUgcm93IGRhdGFcclxuICAgKi9cclxuICBvblZpZXcocm93OiBUKTogdm9pZCB7XHJcbiAgICB0aGlzLnZpZXcuZW1pdChyb3cpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseVNvcnRpbmcoaXRlbXM6IFRbXSk6IHZvaWQge1xyXG4gICAgY29uc3Qgb3JkZXJlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wub3JkZXIpO1xyXG4gICAgaWYgKG9yZGVyZWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgb3JkZXJlZENvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgIGl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlQSA9IGFbY29sLmFjY2Vzc29yXSBhcyBzdHJpbmcgfCBudW1iZXI7XHJcbiAgICAgICAgICBjb25zdCB2YWx1ZUIgPSBiW2NvbC5hY2Nlc3Nvcl0gYXMgc3RyaW5nIHwgbnVtYmVyO1xyXG5cclxuICAgICAgICAgIGlmIChjb2wub3JkZXIgPT09ICdBU0MnKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZUEgPiB2YWx1ZUIpIHJldHVybiAxO1xyXG4gICAgICAgICAgICBpZiAodmFsdWVBIDwgdmFsdWVCKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlQSA8IHZhbHVlQikgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZUEgPiB2YWx1ZUIpIHJldHVybiAtMTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciBhbGlnbi1taWRkbGVcIj5cbiAgICA8dGhlYWQgY2xhc3M9XCJ0aGVhZCB0YWJsZS1saWdodFwiPlxuICAgICAgPHRyPlxuICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1uczsgdHJhY2sgY29sKSB7XG4gICAgICAgIEBpZiAoY29sLnZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlciBib29sZWFuLWNvbHVtblwiPnt7IGNvbC5sYWJlbCB9fTwvdGg+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2Uge1xuICAgICAgICA8dGg+e3sgY29sLmxhYmVsIH19PC90aD5cbiAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChoYXNDcmVhdGVMaXN0ZW5lcigpIHx8IGhhc1VwZGF0ZUxpc3RlbmVyKCkgfHwgaGFzRGVsZXRlTGlzdGVuZXIoKSB8fCBoYXNWaWV3TGlzdGVuZXIoKSkge1xuICAgICAgICA8dGggY2xhc3M9XCJ0YWJsZS1hY3Rpb25zLWhlYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxzcGFuPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICBAaWYgKGhhc0NyZWF0ZUxpc3RlbmVyKCkpIHtcbiAgICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImFkZFwiIFtkaXNhYmxlZF09XCJjcmVhdGluZygpXCIgdGl0bGU9XCJBZ3JlZ2FyXCIgW3NpemVdPVwiLjZcIlxuICAgICAgICAgICAgICAoaWNvbkNsaWNrKT1cInN0YXJ0Q3JlYXRlKClcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgICB9XG4gICAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG4gICAgPHRib2R5PlxuICAgICAgQGZvciAocm93IG9mIGRhdGEoKTsgdHJhY2sgdHJhY2tCeUlkKGksIHJvdyk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICA8dHI+XG4gICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayBjb2wpIHtcbiAgICAgICAgQGlmIChjb2wudmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgQGlmIChjb2wudHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyIGJvb2xlYW4tY29sdW1uXCI+XG4gICAgICAgICAgQGlmIChlZGl0aW5nKCkgPT09IHJvd1snaWQnXSkge1xuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCIhIWVkaXRSb3coKT8uW2NvbC5hY2Nlc3Nvcl1cIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkVkaXRJbnB1dCgkZXZlbnQsIGNvbC5hY2Nlc3NvciwgY29sKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiY29sLmxhYmVsXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIEBpZiAocm93W2NvbC5hY2Nlc3Nvcl0gPT09IHRydWUpIHtcbiAgICAgICAgICA8YzgwLWljb24gaWNvbj1cImNoZWNrXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgIDxiciAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAZWxzZSBpZiAocm93W2NvbC5hY2Nlc3Nvcl0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgPGM4MC1pY29uIGljb249XCJjYW5jZWxcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC90ZD5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSB7XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICBAaWYgKGVkaXRpbmcoKSA9PT0gcm93WydpZCddKSB7XG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiXG4gICAgICAgICAgICBbdHlwZV09XCJjb2wudHlwZSA9PT0gJ251bWJlcicgPyAnbnVtYmVyJyA6IGNvbC50eXBlID09PSAncGFzc3dvcmQnID8gJ3Bhc3N3b3JkJyA6ICd0ZXh0J1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZWRpdFJvdygpPy5bY29sLmFjY2Vzc29yXSA/PyAnJ1wiIFtwbGFjZWhvbGRlcl09XCJjb2wubGFiZWxcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uRWRpdElucHV0KCRldmVudCwgY29sLmFjY2Vzc29yLCBjb2wpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdwYXNzd29yZCcpIHtcbiAgICAgICAgICAqKioqKipcbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIHt7IHJvd1tjb2wuYWNjZXNzb3JdIH19XG4gICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC90ZD5cbiAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChoYXNDcmVhdGVMaXN0ZW5lcigpIHx8IGhhc1VwZGF0ZUxpc3RlbmVyKCkgfHwgaGFzRGVsZXRlTGlzdGVuZXIoKSkge1xuICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlciBhY3Rpb25zLWNlbGxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIEBpZiAoZWRpdGluZygpID09PSByb3dbJ2lkJ10pIHtcbiAgICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImNoZWNrXCIgdGl0bGU9XCJHdWFyZGFyXCIgKGljb25DbGljayk9XCJzYXZlRWRpdChyb3cpXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgPGM4MC1pY29uIGJ1dHRvbiBpY29uPVwiY2FuY2VsXCIgY29sb3I9XCJ3YXJuXCIgdGl0bGU9XCJDYW5jZWxhclwiIChpY29uQ2xpY2spPVwiY2FuY2VsRWRpdCgpXCJcbiAgICAgICAgICAgICAgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgQGlmIChoYXNVcGRhdGVMaXN0ZW5lcigpKSB7XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJlZGl0XCIgdGl0bGU9XCJFZGl0YXJcIiAoaWNvbkNsaWNrKT1cIm9uRWRpdChyb3cpXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChoYXNEZWxldGVMaXN0ZW5lcigpKSB7XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJkZWxldGVcIiBjb2xvcj1cIndhcm5cIiB0aXRsZT1cIkJvcnJhclwiIChpY29uQ2xpY2spPVwib25EZWxldGUocm93KVwiXG4gICAgICAgICAgICAgIFtzaXplXT1cIi43XCI+PC9jODAtaWNvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoaGFzVmlld0xpc3RlbmVyKCkpIHtcbiAgICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cInZpZXdcIiBjb2xvcj1cInByaW1hcnlcIiB0aXRsZT1cIlZlclwiIChpY29uQ2xpY2spPVwib25WaWV3KHJvdylcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIH1cbiAgICAgIDwvdHI+XG4gICAgICB9XG4gICAgICBAaWYgKGNyZWF0aW5nKCkgJiYgaGFzQ3JlYXRlTGlzdGVuZXIoKSkge1xuICAgICAgPHRyPlxuICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1uczsgdHJhY2sgY29sKSB7XG4gICAgICAgIEBpZiAoY29sLnZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCIhIW5ld1JvdygpPy5bY29sLmFjY2Vzc29yXVwiIChjaGFuZ2UpPVwib25JbnB1dCgkZXZlbnQsIGNvbC5hY2Nlc3NvciwgY29sKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbC5sYWJlbFwiIC8+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8dGQ+XG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIFt0eXBlXT1cImNvbC50eXBlID09PSAnbnVtYmVyJyA/ICdudW1iZXInIDogJ3RleHQnXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJuZXdSb3coKT8uW2NvbC5hY2Nlc3Nvcl0gPz8gJydcIiBbcGxhY2Vob2xkZXJdPVwiY29sLmxhYmVsXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0KCRldmVudCwgY29sLmFjY2Vzc29yLCBjb2wpXCIgLz5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXIgYWN0aW9ucy1jZWxsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJjaGVja1wiIHRpdGxlPVwiR3VhcmRhclwiIChpY29uQ2xpY2spPVwic2F2ZUNyZWF0ZSgpXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgPGM4MC1pY29uIGJ1dHRvbiBpY29uPVwiY2FuY2VsXCIgY29sb3I9XCJ3YXJuXCIgdGl0bGU9XCJDYW5jZWxhclwiIChpY29uQ2xpY2spPVwiY2FuY2VsQ3JlYXRlKClcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgfVxuICAgIDwvdGJvZHk+XG4gIDwvdGFibGU+XG4gIEBpZiAoZGF0YSgpLmxlbmd0aCA9PT0gMCkge1xuICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgdGV4dC1tdXRlZCBweS0zXCI+XG4gICAgTm8gaGF5IGRhdG9zIHBhcmEgbW9zdHJhci5cbiAgPC9kaXY+XG4gIH1cbjwvZGl2PiJdfQ==
|
|
333
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy91aS9zcmMvbGliL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFlBQVksR0FHYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFtQjFELE1BQU0sT0FBTyxpQkFBaUI7SUFHbkIsS0FBSyxDQUFtQjtJQUN4QixPQUFPLEdBQXFCLEVBQUUsQ0FBQztJQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsNkRBQTZEO0lBQ3RFLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFHL0IsQ0FBQztJQUNLLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFJL0IsQ0FBQztJQUNLLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFHL0IsQ0FBQztJQUNLLElBQUksR0FBRyxJQUFJLFlBQVksRUFBSyxDQUFDO0lBQzdCLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBRXpDLElBQUksR0FBRyxNQUFNLENBQU0sRUFBRSxDQUFDLENBQUM7SUFDdkIsSUFBSSxHQUFHLE1BQU0sQ0FBVyxFQUFFLENBQUMsQ0FBQztJQUNyQyxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sR0FBRyxNQUFNLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sR0FBRyxNQUFNLENBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7SUFDNUQsT0FBTyxHQUFHLE1BQU0sQ0FBb0IsSUFBSSxDQUFDLENBQUM7SUFFbkQsMENBQTBDO0lBQ2pD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SWYsaUJBQWlCO2tCQVA3QixTQUFTOytCQUNFLFdBQVcsY0FDVCxJQUFJLFdBQ1AsQ0FBQyxnQkFBZ0IsQ0FBQzs4QkFPbEIsS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNO2dCQUlHLE1BQU07c0JBQWYsTUFBTTtnQkFLRyxNQUFNO3NCQUFmLE1BQU07Z0JBSUcsSUFBSTtzQkFBYixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgc2lnbmFsLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPbkluaXQsXHJcbiAgT25EZXN0cm95LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQzgwSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDODBUYWJsZUNvbERlZiB7XHJcbiAgYWNjZXNzb3I6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZpc2libGU/OiBib29sZWFuOyAvLyBTaSBubyBzZSBlc3BlY2lmaWNhLCBzZSBhc3VtZSB0cnVlXHJcbiAgdHlwZT86ICdzdHJpbmcnIHwgJ251bWJlcicgfCAnYm9vbGVhbicgfCAncGFzc3dvcmQnOyAvLyBUaXBvIGRlIGRhdG8gcGFyYSBsYSBjb2x1bW5hXHJcbiAgb3JkZXI/OiAnQVNDJyB8ICdERVNDJzsgLy8gT3JkZW5hbWllbnRvIGRlIGxhIGNvbHVtbmFcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSUQgPSBudW1iZXIgfCBzdHJpbmc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2M4MC10YWJsZScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQzgwSWNvbkNvbXBvbmVudF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vdGFibGUuY29tcG9uZW50LnNjc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQzgwVGFibGVDb21wb25lbnQ8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3lcclxue1xyXG4gIEBJbnB1dCgpIGRhdGEkITogT2JzZXJ2YWJsZTxUW10+O1xyXG4gIEBJbnB1dCgpIGNvbHVtbnM6IEM4MFRhYmxlQ29sRGVmW10gPSBbXTtcclxuICBASW5wdXQoKSBzaXplID0gMDsgLy8gVGFtYcOxbyBkZSBsYSB0YWJsYSAoMCA9IHNpbiBsw61taXRlLCA+IDAgYXBsaWNhIG1heC1oZWlnaHQpXHJcbiAgQE91dHB1dCgpIGNyZWF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xyXG4gICAgcm93OiBQYXJ0aWFsPFQ+O1xyXG4gICAgZG9uZTogKHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZDtcclxuICB9PigpO1xyXG4gIEBPdXRwdXQoKSB1cGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHtcclxuICAgIGlkOiBJRDtcclxuICAgIGNoYW5nZXM6IFBhcnRpYWw8VD47XHJcbiAgICBkb25lOiAocmVzdWx0OiBib29sZWFuKSA9PiB2b2lkO1xyXG4gIH0+KCk7XHJcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xyXG4gICAgaWQ6IElEO1xyXG4gICAgZG9uZTogKHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZDtcclxuICB9PigpO1xyXG4gIEBPdXRwdXQoKSB2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xyXG4gIEBPdXRwdXQoKSBlcnJvckV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIHJlYWRvbmx5IGRhdGEgPSBzaWduYWw8VFtdPihbXSk7XHJcbiAgcmVhZG9ubHkga2V5cyA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xyXG4gIGNyZWF0aW5nID0gc2lnbmFsKGZhbHNlKTtcclxuICBuZXdSb3cgPSBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+KG51bGwpO1xyXG4gIHJlYWRvbmx5IGVkaXRpbmcgPSBzaWduYWw8SUQgfCBudWxsPihudWxsKTsgLy8gaWQgb2Ygcm93IGJlaW5nIGVkaXRlZFxyXG4gIHJlYWRvbmx5IGVkaXRSb3cgPSBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+KG51bGwpO1xyXG5cclxuICAvLyBGbGFncyB0byBjaGVjayBpZiBldmVudHMgaGF2ZSBsaXN0ZW5lcnNcclxuICByZWFkb25seSBoYXNDcmVhdGVMaXN0ZW5lciA9IHNpZ25hbChmYWxzZSk7XHJcbiAgcmVhZG9ubHkgaGFzVXBkYXRlTGlzdGVuZXIgPSBzaWduYWwoZmFsc2UpO1xyXG4gIHJlYWRvbmx5IGhhc0RlbGV0ZUxpc3RlbmVyID0gc2lnbmFsKGZhbHNlKTtcclxuICByZWFkb25seSBoYXNWaWV3TGlzdGVuZXIgPSBzaWduYWwoZmFsc2UpO1xyXG5cclxuICBwcml2YXRlIGRhdGFTdWI/OiBTdWJzY3JpcHRpb247XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIG91dHB1dHMgaGF2ZSBsaXN0ZW5lcnNcclxuICAgIHRoaXMuaGFzQ3JlYXRlTGlzdGVuZXIuc2V0KHRoaXMuY3JlYXRlLm9ic2VydmVkKTtcclxuICAgIHRoaXMuaGFzVXBkYXRlTGlzdGVuZXIuc2V0KHRoaXMudXBkYXRlLm9ic2VydmVkKTtcclxuICAgIHRoaXMuaGFzRGVsZXRlTGlzdGVuZXIuc2V0KHRoaXMuZGVsZXRlLm9ic2VydmVkKTtcclxuICAgIHRoaXMuaGFzVmlld0xpc3RlbmVyLnNldCh0aGlzLnZpZXcub2JzZXJ2ZWQpO1xyXG5cclxuICAgIGlmICghdGhpcy5kYXRhJCkgcmV0dXJuO1xyXG4gICAgdGhpcy5kYXRhU3ViID0gdGhpcy5kYXRhJC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoaXRlbXMpID0+IHtcclxuICAgICAgICB0aGlzLmFwcGx5U29ydGluZyhpdGVtcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhLnNldChpdGVtcyk7XHJcbiAgICAgICAgLy8gU29sbyBtb3N0cmFyIGxhcyBjb2x1bW5hcyB2aXNpYmxlc1xyXG4gICAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihcclxuICAgICAgICAgIChjb2wpID0+IGNvbD8udmlzaWJsZSAhPT0gZmFsc2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMua2V5cy5zZXQodmlzaWJsZUNvbHVtbnMubWFwKChjb2wpID0+IGNvbC5hY2Nlc3NvcikpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT5cclxuICAgICAgICB0aGlzLmVycm9yRXZlbnQuZW1pdChlcnI/Lm1lc3NhZ2UgfHwgJ0Vycm9yIGFsIGNhcmdhciBkYXRvcycpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuZGF0YVN1Yj8udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIG9uSW5wdXQoZXZlbnQ6IEV2ZW50LCBrZXk6IHN0cmluZywgY29sPzogQzgwVGFibGVDb2xEZWYpIHtcclxuICAgIGlmIChjb2w/LnR5cGUgPT09ICdib29sZWFuJykge1xyXG4gICAgICBjb25zdCBjaGVja2VkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xyXG4gICAgICB0aGlzLnVwZGF0ZU5ld1JvdyhrZXksIGNoZWNrZWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZU5ld1JvdyhrZXksIHRhcmdldC52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRGVsZXRlKHJvdzogVCkge1xyXG4gICAgY29uc3QgaWQgPSByb3dbJ2lkJ10gYXMgSUQ7XHJcbiAgICBpZiAoY29uZmlybSgnwr9Fc3TDoSBzZWd1cm8gZGUgcXVlIGRlc2VhIHJlYWxpemFyIGVzdGEgYWNjacOzbj8nKSkge1xyXG4gICAgICB0aGlzLmRlbGV0ZS5lbWl0KHtcclxuICAgICAgICBpZCxcclxuICAgICAgICBkb25lOiAoc3VjY2VzczogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHN1Y2Nlc3MpIHRoaXMuY2FuY2VsRWRpdCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnRDcmVhdGUoKSB7XHJcbiAgICB0aGlzLmNyZWF0aW5nLnNldCh0cnVlKTtcclxuICAgIC8vIEluaWNpYWxpemEgbmV3Um93IHNvbG8gY29uIGxvcyBhY2Nlc3NvcnMgZGUgY29sdW1uYXMgdmlzaWJsZXNcclxuICAgIGNvbnN0IHJvdzogUGFydGlhbDxUPiA9IHt9O1xyXG4gICAgdGhpcy5jb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gY29sLnZpc2libGUgIT09IGZhbHNlKVxyXG4gICAgICAuZm9yRWFjaCgoY29sKSA9PiB7XHJcbiAgICAgICAgKHJvdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbY29sLmFjY2Vzc29yXSA9ICcnO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMubmV3Um93LnNldChyb3cpO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsQ3JlYXRlKCkge1xyXG4gICAgdGhpcy5jcmVhdGluZy5zZXQoZmFsc2UpO1xyXG4gICAgdGhpcy5uZXdSb3cuc2V0KG51bGwpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlTmV3Um93KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xyXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMubmV3Um93KCk7XHJcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcclxuICAgIHRoaXMubmV3Um93LnNldCh7IC4uLmN1cnJlbnQsIFtrZXldOiB2YWx1ZSB9KTtcclxuICB9XHJcblxyXG4gIHNhdmVDcmVhdGUoKSB7XHJcbiAgICBjb25zdCByb3cgPSB0aGlzLm5ld1JvdygpO1xyXG4gICAgaWYgKCFyb3cpIHJldHVybjtcclxuICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wudmlzaWJsZSAhPT0gZmFsc2UpO1xyXG4gICAgY29uc3QgY29udmVydGVkID0gdmlzaWJsZUNvbHVtbnMucmVkdWNlKChhY2MsIGNvbCkgPT4ge1xyXG4gICAgICBhY2NbY29sLmFjY2Vzc29yXSA9IHRoaXMuY29udmVydENlbGxWYWx1ZShyb3dbY29sLmFjY2Vzc29yXSwgY29sKTtcclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSBhcyBQYXJ0aWFsPFQ+O1xyXG4gICAgdGhpcy5jcmVhdGUuZW1pdCh7XHJcbiAgICAgIHJvdzogY29udmVydGVkLFxyXG4gICAgICBkb25lOiAoc3VjY2VzczogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIGlmIChzdWNjZXNzKSB0aGlzLmNhbmNlbENyZWF0ZSgpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0cyBhIGNlbGwgdmFsdWUgYmFzZWQgb24gY29sdW1uIHR5cGUgb3Igc2FtcGxlIGRhdGEuXHJcbiAgICogSGFuZGxlcyBzdHJpbmdpZmljYXRpb24gb2Ygb2JqZWN0cyBmb3Igc3RyaW5nIGNvbHVtbnMuXHJcbiAgICovXHJcbiAgLyoqXHJcbiAgICogQ29udmVydHMgYSBjZWxsIHZhbHVlIGJhc2VkIG9uIGNvbHVtbiB0eXBlIG9yIHNhbXBsZSBkYXRhLlxyXG4gICAqIERlbGVnYXRlcyB0byB0eXBlLXNwZWNpZmljIGhlbHBlcnMgZm9yIGNsYXJpdHkgYW5kIG1haW50YWluYWJpbGl0eS5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbnZlcnRDZWxsVmFsdWUodmFsdWU6IHVua25vd24sIGNvbDogQzgwVGFibGVDb2xEZWYpOiB1bmtub3duIHtcclxuICAgIGlmIChjb2wudHlwZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdGhpcy50b0Jvb2xlYW4odmFsdWUpO1xyXG4gICAgaWYgKGNvbC50eXBlID09PSAnbnVtYmVyJykgcmV0dXJuIHRoaXMudG9OdW1iZXIodmFsdWUpO1xyXG4gICAgaWYgKGNvbC50eXBlID09PSAnc3RyaW5nJyB8fCBjb2wudHlwZSA9PT0gJ3Bhc3N3b3JkJylcclxuICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmdWYWx1ZSh2YWx1ZSk7XHJcblxyXG4gICAgLy8gRmFsbGJhY2s6IHVzZSBzYW1wbGUgZGF0YSBpZiBhdmFpbGFibGVcclxuICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuZGF0YSgpWzBdO1xyXG4gICAgaWYgKHNhbXBsZSAmJiBjb2wuYWNjZXNzb3IgaW4gc2FtcGxlKSB7XHJcbiAgICAgIGNvbnN0IHNhbXBsZVZhbHVlID0gc2FtcGxlW2NvbC5hY2Nlc3Nvcl07XHJcbiAgICAgIGlmICh0eXBlb2Ygc2FtcGxlVmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHZhbHVlKTtcclxuICAgICAgaWYgKHR5cGVvZiBzYW1wbGVWYWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB0aGlzLnRvTnVtYmVyKHZhbHVlKTtcclxuICAgICAgaWYgKHR5cGVvZiBzYW1wbGVWYWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB0aGlzLnRvU3RyaW5nVmFsdWUodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbnZlcnRzIHZhbHVlIHRvIGJvb2xlYW4gdXNpbmcgYmVzdCBwcmFjdGljZXMuICovXHJcbiAgcHJpdmF0ZSB0b0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbHVlO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpXHJcbiAgICAgIHJldHVybiB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnIHx8IHZhbHVlLnRyaW0oKSA9PT0gJzEnO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB2YWx1ZSA9PT0gMTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiBDb252ZXJ0cyB2YWx1ZSB0byBudW1iZXIgdXNpbmcgYmVzdCBwcmFjdGljZXMuICovXHJcbiAgcHJpdmF0ZSB0b051bWJlcih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHZhbHVlO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpXHJcbiAgICAgIHJldHVybiB2YWx1ZS50cmltKCkgPT09ICcnID8gdW5kZWZpbmVkIDogTnVtYmVyKHZhbHVlKTtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbHVlID8gMSA6IDA7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbnZlcnRzIHZhbHVlIHRvIHN0cmluZyB1c2luZyBiZXN0IHByYWN0aWNlcywgYWx3YXlzIHN0cmluZ2lmaWVzIG9iamVjdHMuICovXHJcbiAgcHJpdmF0ZSB0b1N0cmluZ1ZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gJyc7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpXHJcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgICB9IGNhdGNoIHtcclxuICAgICAgICByZXR1cm4gJ1tvYmplY3QgT2JqZWN0XSc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEZvciBmdW5jdGlvbnMsIHN5bWJvbHMsIHVuZGVmaW5lZCwgZXRjLiwgcmV0dXJuIGVtcHR5IHN0cmluZ1xyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgb25FZGl0KHJvdzogVCkge1xyXG4gICAgdGhpcy5lZGl0aW5nLnNldChyb3dbJ2lkJ10gYXMgSUQpO1xyXG4gICAgY29uc3QgZWRpdDogUGFydGlhbDxUPiA9IHt9O1xyXG4gICAgdGhpcy5jb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gY29sLnZpc2libGUgIT09IGZhbHNlKVxyXG4gICAgICAuZm9yRWFjaCgoY29sKSA9PiB7XHJcbiAgICAgICAgKGVkaXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NvbC5hY2Nlc3Nvcl0gPSByb3dbY29sLmFjY2Vzc29yXTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLmVkaXRSb3cuc2V0KGVkaXQpO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsRWRpdCgpIHtcclxuICAgIHRoaXMuZWRpdGluZy5zZXQobnVsbCk7XHJcbiAgICB0aGlzLmVkaXRSb3cuc2V0KG51bGwpO1xyXG4gIH1cclxuXHJcbiAgb25FZGl0SW5wdXQoZXZlbnQ6IEV2ZW50LCBrZXk6IHN0cmluZywgY29sPzogQzgwVGFibGVDb2xEZWYpIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmVkaXRSb3coKTtcclxuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xyXG4gICAgaWYgKGNvbD8udHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XHJcbiAgICAgIHRoaXMuZWRpdFJvdy5zZXQoeyAuLi5jdXJyZW50LCBba2V5XTogY2hlY2tlZCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQudmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0Um93LnNldCh7IC4uLmN1cnJlbnQsIFtrZXldOiB0YXJnZXQudmFsdWUgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNhdmVFZGl0KHJvdzogVCkge1xyXG4gICAgY29uc3QgaWQgPSByb3dbJ2lkJ107XHJcbiAgICBpZiAoKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIGlkICE9PSAnbnVtYmVyJykgfHwgIXRoaXMuZWRpdFJvdygpKVxyXG4gICAgICByZXR1cm47XHJcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY29sLnZpc2libGUgIT09IGZhbHNlKTtcclxuICAgIGNvbnN0IGNvbnZlcnRlZCA9IHZpc2libGVDb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2wpID0+IHtcclxuICAgICAgYWNjW2NvbC5hY2Nlc3Nvcl0gPSB0aGlzLmNvbnZlcnRDZWxsVmFsdWUoXHJcbiAgICAgICAgdGhpcy5lZGl0Um93KCkhW2NvbC5hY2Nlc3Nvcl0sXHJcbiAgICAgICAgY29sXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBhY2M7XHJcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgYXMgUGFydGlhbDxUPjtcclxuICAgIHRoaXMudXBkYXRlLmVtaXQoe1xyXG4gICAgICBpZCxcclxuICAgICAgY2hhbmdlczogY29udmVydGVkLFxyXG4gICAgICBkb25lOiAoc3VjY2VzczogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIGlmIChzdWNjZXNzKSB0aGlzLmNhbmNlbEVkaXQoKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2tCeSBmdW5jdGlvbiBmb3IgbmdGb3IgdG8gYXZvaWQgRE9NIHJlLWNyZWF0aW9uIChORzA5NTYgd2FybmluZykuXHJcbiAgICovXHJcbiAgdHJhY2tCeUlkKGluZGV4OiBudW1iZXIsIHJvdzogVCk6IG51bWJlciB8IHN0cmluZyB7XHJcbiAgICBjb25zdCBpZCA9XHJcbiAgICAgIHJvdyAmJiB0eXBlb2Ygcm93ID09PSAnb2JqZWN0JyAmJiAnaWQnIGluIHJvd1xyXG4gICAgICAgID8gKHJvdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJ2lkJ11cclxuICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgIHJldHVybiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBpZCA9PT0gJ251bWJlcicgPyBpZCA6IGluZGV4O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHMgdGhlIHZpZXcgZXZlbnQgd2l0aCB0aGUgZW50aXJlIHJvdyBkYXRhXHJcbiAgICovXHJcbiAgb25WaWV3KHJvdzogVCk6IHZvaWQge1xyXG4gICAgdGhpcy52aWV3LmVtaXQocm93KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGRpc3BsYXkgdmFsdWUgZm9yIGEgY2VsbCwgc2hvd2luZyAnLScgZm9yIGZhbHN5IHZhbHVlcyBleGNlcHQgMCwgZmFsc2UsIGFuZCBlbXB0eSBvYmplY3RzL2FycmF5c1xyXG4gICAqL1xyXG4gIGdldERpc3BsYXlWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XHJcbiAgICAvLyBJZiB2YWx1ZSBpcyAwLCBzaG93IGl0XHJcbiAgICBpZiAodmFsdWUgPT09IDApIHtcclxuICAgICAgcmV0dXJuICcwJztcclxuICAgIH1cclxuICAgIC8vIElmIHZhbHVlIGlzIGZhbHNlLCBpdCBzaG91bGQgYmUgaGFuZGxlZCBieSBib29sZWFuIGxvZ2ljIGluIHRlbXBsYXRlLCBub3QgaGVyZVxyXG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm4gJ2ZhbHNlJztcclxuICAgIH1cclxuICAgIC8vIEhhbmRsZSBvYmplY3RzIGFuZCBhcnJheXMgKGluY2x1ZGluZyBlbXB0eSBvbmVzKVxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgICB9IGNhdGNoIHtcclxuICAgICAgICByZXR1cm4gJ1tvYmplY3QgT2JqZWN0XSc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIElmIHZhbHVlIGlzIG90aGVyIGZhbHN5IHZhbHVlcyAobnVsbCwgdW5kZWZpbmVkLCAnJyksIHNob3cgJy0nXHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybiAnLSc7XHJcbiAgICB9XHJcbiAgICAvLyBIYW5kbGUgb3RoZXIgdHlwZXMgZXhwbGljaXRseVxyXG4gICAgaWYgKFxyXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XHJcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHxcclxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbidcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIEZvciBhbnkgb3RoZXIgdHlwZSAoZnVuY3Rpb24sIHN5bWJvbCwgZXRjLiksIHJldHVybiBhIHNhZmUgZmFsbGJhY2tcclxuICAgIHJldHVybiAnLSc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxjdWxhIGVsIG1heC1oZWlnaHQgZGUgbGEgdGFibGEgYmFzYWRvIGVuIGVsIHRhbWHDsW9cclxuICAgKiBTaSBzaXplIGVzIDAsIHJldG9ybmEgdW5kZWZpbmVkIChzaW4gbMOtbWl0ZSBkZSBhbHR1cmEpXHJcbiAgICovXHJcbiAgZ2V0VGFibGVNYXhIZWlnaHQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICh0aGlzLnNpemUgPD0gMCkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBTaW4gbMOtbWl0ZSBkZSBhbHR1cmFcclxuICAgIH1cclxuICAgIC8vIEFsdHVyYSBiYXNlIGRlIDQwMHB4ICogc2l6ZVxyXG4gICAgY29uc3QgYmFzZUhlaWdodCA9IDQwMDtcclxuICAgIGNvbnN0IG1heEhlaWdodCA9IE1hdGgucm91bmQoYmFzZUhlaWdodCAqIHRoaXMuc2l6ZSk7XHJcbiAgICByZXR1cm4gYCR7bWF4SGVpZ2h0fXB4YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlTb3J0aW5nKGl0ZW1zOiBUW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IG9yZGVyZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wub3JkZXIpO1xyXG4gICAgaWYgKG9yZGVyZWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgb3JkZXJlZENvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XHJcbiAgICAgICAgaXRlbXMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWVBID0gYVtjb2wuYWNjZXNzb3JdIGFzIHN0cmluZyB8IG51bWJlcjtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlQiA9IGJbY29sLmFjY2Vzc29yXSBhcyBzdHJpbmcgfCBudW1iZXI7XHJcblxyXG4gICAgICAgICAgaWYgKGNvbC5vcmRlciA9PT0gJ0FTQycpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlQSA+IHZhbHVlQikgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZUEgPCB2YWx1ZUIpIHJldHVybiAtMTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodmFsdWVBIDwgdmFsdWVCKSByZXR1cm4gMTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlQSA+IHZhbHVlQikgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCIgW3N0eWxlLm1heC1oZWlnaHRdPVwiZ2V0VGFibGVNYXhIZWlnaHQoKVwiXG4gIFtzdHlsZS5vdmVyZmxvdy15XT1cInNpemUgPiAwID8gJ2F1dG8nIDogJ3Zpc2libGUnXCI+XG4gIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIGFsaWduLW1pZGRsZVwiPlxuICAgIDx0aGVhZCBjbGFzcz1cInRoZWFkIHRhYmxlLWxpZ2h0IHN0aWNreS1oZWFkZXJcIj5cbiAgICAgIDx0cj5cbiAgICAgICAgQGZvciAoY29sIG9mIGNvbHVtbnM7IHRyYWNrIGNvbCkge1xuICAgICAgICBAaWYgKGNvbC52aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICBAaWYgKGNvbC50eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1jZW50ZXIgYm9vbGVhbi1jb2x1bW5cIj57eyBjb2wubGFiZWwgfX08L3RoPlxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIHtcbiAgICAgICAgPHRoPnt7IGNvbC5sYWJlbCB9fTwvdGg+XG4gICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIEBpZiAoaGFzQ3JlYXRlTGlzdGVuZXIoKSB8fCBoYXNVcGRhdGVMaXN0ZW5lcigpIHx8IGhhc0RlbGV0ZUxpc3RlbmVyKCkgfHwgaGFzVmlld0xpc3RlbmVyKCkpIHtcbiAgICAgICAgPHRoIGNsYXNzPVwidGFibGUtYWN0aW9ucy1oZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9ucy13cmFwcGVyXCI+XG4gICAgICAgICAgICA8c3Bhbj5BY3Rpb25zPC9zcGFuPlxuICAgICAgICAgICAgQGlmIChoYXNDcmVhdGVMaXN0ZW5lcigpKSB7XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJhZGRcIiBbZGlzYWJsZWRdPVwiY3JlYXRpbmcoKVwiIHRpdGxlPVwiQWdyZWdhclwiIFtzaXplXT1cIi42XCJcbiAgICAgICAgICAgICAgKGljb25DbGljayk9XCJzdGFydENyZWF0ZSgpXCI+PC9jODAtaWNvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgfVxuICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuICAgIDx0Ym9keT5cbiAgICAgIEBmb3IgKHJvdyBvZiBkYXRhKCk7IHRyYWNrIHRyYWNrQnlJZChpLCByb3cpOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgPHRyPlxuICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1uczsgdHJhY2sgY29sKSB7XG4gICAgICAgIEBpZiAoY29sLnZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlciBib29sZWFuLWNvbHVtblwiPlxuICAgICAgICAgIEBpZiAoZWRpdGluZygpID09PSByb3dbJ2lkJ10pIHtcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiISFlZGl0Um93KCk/Lltjb2wuYWNjZXNzb3JdXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwib25FZGl0SW5wdXQoJGV2ZW50LCBjb2wuYWNjZXNzb3IsIGNvbClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbC5sYWJlbFwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICBAaWYgKHJvd1tjb2wuYWNjZXNzb3JdID09PSB0cnVlKSB7XG4gICAgICAgICAgPGM4MC1pY29uIGljb249XCJjaGVja1wiIFtzaXplXT1cIi43XCI+PC9jODAtaWNvbj5cbiAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2UgaWYgKHJvd1tjb2wuYWNjZXNzb3JdID09PSBmYWxzZSkge1xuICAgICAgICAgIDxjODAtaWNvbiBpY29uPVwiY2FuY2VsXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgIDxiciAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2Uge1xuICAgICAgICA8dGQ+XG4gICAgICAgICAgQGlmIChlZGl0aW5nKCkgPT09IHJvd1snaWQnXSkge1xuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIlxuICAgICAgICAgICAgW3R5cGVdPVwiY29sLnR5cGUgPT09ICdudW1iZXInID8gJ251bWJlcicgOiBjb2wudHlwZSA9PT0gJ3Bhc3N3b3JkJyA/ICdwYXNzd29yZCcgOiAndGV4dCdcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImVkaXRSb3coKT8uW2NvbC5hY2Nlc3Nvcl0gPz8gJydcIiBbcGxhY2Vob2xkZXJdPVwiY29sLmxhYmVsXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJvbkVkaXRJbnB1dCgkZXZlbnQsIGNvbC5hY2Nlc3NvciwgY29sKVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICBAaWYgKGNvbC50eXBlID09PSAncGFzc3dvcmQnKSB7XG4gICAgICAgICAgKioqKioqXG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIGlmIChyb3dbY29sLmFjY2Vzc29yXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIDxjODAtaWNvbiBpY29uPVwiY2hlY2tcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIGlmIChyb3dbY29sLmFjY2Vzc29yXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICA8YzgwLWljb24gaWNvbj1cImNhbmNlbFwiIFtzaXplXT1cIi43XCI+PC9jODAtaWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIHt7IGdldERpc3BsYXlWYWx1ZShyb3dbY29sLmFjY2Vzc29yXSkgfX1cbiAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGhhc0NyZWF0ZUxpc3RlbmVyKCkgfHwgaGFzVXBkYXRlTGlzdGVuZXIoKSB8fCBoYXNEZWxldGVMaXN0ZW5lcigpIHx8IGhhc1ZpZXdMaXN0ZW5lcigpKSB7XG4gICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyIGFjdGlvbnMtY2VsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgQGlmIChlZGl0aW5nKCkgPT09IHJvd1snaWQnXSkge1xuICAgICAgICAgICAgPGM4MC1pY29uIGJ1dHRvbiBpY29uPVwiY2hlY2tcIiB0aXRsZT1cIkd1YXJkYXJcIiAoaWNvbkNsaWNrKT1cInNhdmVFZGl0KHJvdylcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJjYW5jZWxcIiBjb2xvcj1cIndhcm5cIiB0aXRsZT1cIkNhbmNlbGFyXCIgKGljb25DbGljayk9XCJjYW5jZWxFZGl0KClcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICBAaWYgKGhhc1VwZGF0ZUxpc3RlbmVyKCkpIHtcbiAgICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImVkaXRcIiB0aXRsZT1cIkVkaXRhclwiIChpY29uQ2xpY2spPVwib25FZGl0KHJvdylcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGhhc0RlbGV0ZUxpc3RlbmVyKCkpIHtcbiAgICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImRlbGV0ZVwiIGNvbG9yPVwid2FyblwiIHRpdGxlPVwiQm9ycmFyXCIgKGljb25DbGljayk9XCJvbkRlbGV0ZShyb3cpXCJcbiAgICAgICAgICAgICAgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChoYXNWaWV3TGlzdGVuZXIoKSkge1xuICAgICAgICAgICAgPGM4MC1pY29uIGJ1dHRvbiBpY29uPVwidmlld1wiIGNvbG9yPVwicHJpbWFyeVwiIHRpdGxlPVwiVmVyXCIgKGljb25DbGljayk9XCJvblZpZXcocm93KVwiIFtzaXplXT1cIi43XCI+PC9jODAtaWNvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgfVxuICAgICAgPC90cj5cbiAgICAgIH1cbiAgICAgIEBpZiAoY3JlYXRpbmcoKSAmJiBoYXNDcmVhdGVMaXN0ZW5lcigpKSB7XG4gICAgICA8dHI+XG4gICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayBjb2wpIHtcbiAgICAgICAgQGlmIChjb2wudmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgQGlmIChjb2wudHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cIiEhbmV3Um93KCk/Lltjb2wuYWNjZXNzb3JdXCIgKGNoYW5nZSk9XCJvbklucHV0KCRldmVudCwgY29sLmFjY2Vzc29yLCBjb2wpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29sLmxhYmVsXCIgLz5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgW3R5cGVdPVwiY29sLnR5cGUgPT09ICdudW1iZXInID8gJ251bWJlcicgOiAndGV4dCdcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIm5ld1JvdygpPy5bY29sLmFjY2Vzc29yXSA/PyAnJ1wiIFtwbGFjZWhvbGRlcl09XCJjb2wubGFiZWxcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50LCBjb2wuYWNjZXNzb3IsIGNvbClcIiAvPlxuICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlciBhY3Rpb25zLWNlbGxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImNoZWNrXCIgdGl0bGU9XCJHdWFyZGFyXCIgKGljb25DbGljayk9XCJzYXZlQ3JlYXRlKClcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJjYW5jZWxcIiBjb2xvcj1cIndhcm5cIiB0aXRsZT1cIkNhbmNlbGFyXCIgKGljb25DbGljayk9XCJjYW5jZWxDcmVhdGUoKVwiXG4gICAgICAgICAgICAgIFtzaXplXT1cIi43XCI+PC9jODAtaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgICB9XG4gICAgPC90Ym9keT5cbiAgPC90YWJsZT5cbiAgQGlmIChkYXRhKCkubGVuZ3RoID09PSAwKSB7XG4gIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW11dGVkIHB5LTNcIj5cbiAgICBObyBoYXkgZGF0b3MgcGFyYSBtb3N0cmFyLlxuICA8L2Rpdj5cbiAgfVxuPC9kaXY+Il19
|
|
@@ -8,20 +8,22 @@ export interface C80TableColDef {
|
|
|
8
8
|
type?: 'string' | 'number' | 'boolean' | 'password';
|
|
9
9
|
order?: 'ASC' | 'DESC';
|
|
10
10
|
}
|
|
11
|
+
export type ID = number | string;
|
|
11
12
|
export declare class C80TableComponent<T extends Record<string, unknown>> implements OnInit, OnDestroy {
|
|
12
13
|
data$: Observable<T[]>;
|
|
13
14
|
columns: C80TableColDef[];
|
|
15
|
+
size: number;
|
|
14
16
|
create: EventEmitter<{
|
|
15
17
|
row: Partial<T>;
|
|
16
18
|
done: (result: boolean) => void;
|
|
17
19
|
}>;
|
|
18
20
|
update: EventEmitter<{
|
|
19
|
-
id:
|
|
21
|
+
id: ID;
|
|
20
22
|
changes: Partial<T>;
|
|
21
23
|
done: (result: boolean) => void;
|
|
22
24
|
}>;
|
|
23
25
|
delete: EventEmitter<{
|
|
24
|
-
id:
|
|
26
|
+
id: ID;
|
|
25
27
|
done: (result: boolean) => void;
|
|
26
28
|
}>;
|
|
27
29
|
view: EventEmitter<T>;
|
|
@@ -30,7 +32,7 @@ export declare class C80TableComponent<T extends Record<string, unknown>> implem
|
|
|
30
32
|
readonly keys: import("@angular/core").WritableSignal<string[]>;
|
|
31
33
|
creating: import("@angular/core").WritableSignal<boolean>;
|
|
32
34
|
newRow: import("@angular/core").WritableSignal<Partial<T> | null>;
|
|
33
|
-
readonly editing: import("@angular/core").WritableSignal<
|
|
35
|
+
readonly editing: import("@angular/core").WritableSignal<ID | null>;
|
|
34
36
|
readonly editRow: import("@angular/core").WritableSignal<Partial<T> | null>;
|
|
35
37
|
readonly hasCreateListener: import("@angular/core").WritableSignal<boolean>;
|
|
36
38
|
readonly hasUpdateListener: import("@angular/core").WritableSignal<boolean>;
|
|
@@ -72,7 +74,16 @@ export declare class C80TableComponent<T extends Record<string, unknown>> implem
|
|
|
72
74
|
* Emits the view event with the entire row data
|
|
73
75
|
*/
|
|
74
76
|
onView(row: T): void;
|
|
77
|
+
/**
|
|
78
|
+
* Returns the display value for a cell, showing '-' for falsy values except 0, false, and empty objects/arrays
|
|
79
|
+
*/
|
|
80
|
+
getDisplayValue(value: unknown): string;
|
|
81
|
+
/**
|
|
82
|
+
* Calcula el max-height de la tabla basado en el tamaño
|
|
83
|
+
* Si size es 0, retorna undefined (sin límite de altura)
|
|
84
|
+
*/
|
|
85
|
+
getTableMaxHeight(): string | undefined;
|
|
75
86
|
private applySorting;
|
|
76
87
|
static ɵfac: i0.ɵɵFactoryDeclaration<C80TableComponent<any>, never>;
|
|
77
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<C80TableComponent<any>, "c80-table", never, { "data$": { "alias": "data$"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; }, { "create": "create"; "update": "update"; "delete": "delete"; "view": "view"; "errorEvent": "errorEvent"; }, never, never, true, never>;
|
|
88
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<C80TableComponent<any>, "c80-table", never, { "data$": { "alias": "data$"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "size": { "alias": "size"; "required": false; }; }, { "create": "create"; "update": "update"; "delete": "delete"; "view": "view"; "errorEvent": "errorEvent"; }, never, never, true, never>;
|
|
78
89
|
}
|