keevo-components 1.8.1 → 1.8.21
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/esm2022/lib/api/components/table/table-dropdown-control.mjs +2 -0
- package/esm2022/lib/api/components/table/table.config.column.mjs +1 -1
- package/esm2022/lib/api/components/table/table.config.mjs +1 -1
- package/esm2022/lib/api/components/table/tabledit.config.mjs +2 -0
- package/esm2022/lib/api/components/table/tableedit.config.column.mjs +2 -0
- package/esm2022/lib/api/services/form.service.mjs +2 -1
- package/esm2022/lib/inputs/input-text-checkbox/input-text-checkbox.component.mjs +3 -3
- package/esm2022/lib/keevo-components.module.mjs +8 -4
- package/esm2022/lib/label/label.component.mjs +3 -3
- package/esm2022/lib/label/label.module.mjs +1 -1
- package/esm2022/lib/table-edit/table-edit.component.mjs +502 -0
- package/esm2022/lib/table-edit/table-edit.module.mjs +31 -0
- package/esm2022/public-api.mjs +5 -1
- package/fesm2022/keevo-components.mjs +529 -19
- package/fesm2022/keevo-components.mjs.map +1 -1
- package/lib/api/components/table/table-dropdown-control.d.ts +6 -0
- package/lib/api/components/table/table.config.d.ts +1 -0
- package/lib/api/components/table/tabledit.config.d.ts +6 -0
- package/lib/api/components/table/tableedit.config.column.d.ts +9 -0
- package/lib/api/services/form.service.d.ts +1 -0
- package/lib/keevo-components.module.d.ts +2 -1
- package/lib/table/table.component.d.ts +1 -1
- package/lib/table-edit/table-edit.component.d.ts +109 -0
- package/lib/table-edit/table-edit.module.d.ts +11 -0
- package/package.json +1 -1
- package/public-api.d.ts +4 -0
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, HostListener } from '@angular/core';
|
|
2
|
+
import { FormControl } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
import * as i2 from "../../public-api";
|
|
6
|
+
import * as i3 from "primeng/api";
|
|
7
|
+
import * as i4 from "primeng/autofocus";
|
|
8
|
+
import * as i5 from "primeng/button";
|
|
9
|
+
import * as i6 from "primeng/tooltip";
|
|
10
|
+
import * as i7 from "primeng/dropdown";
|
|
11
|
+
import * as i8 from "primeng/inputtext";
|
|
12
|
+
import * as i9 from "primeng/menu";
|
|
13
|
+
import * as i10 from "primeng/panel";
|
|
14
|
+
import * as i11 from "primeng/ripple";
|
|
15
|
+
import * as i12 from "primeng/table";
|
|
16
|
+
import * as i13 from "primeng/toast";
|
|
17
|
+
import * as i14 from "@angular/forms";
|
|
18
|
+
import * as i15 from "../inputs/input-calendar/input-calendar.component";
|
|
19
|
+
import * as i16 from "../inputs/input-mask/input-mask.component";
|
|
20
|
+
import * as i17 from "../inputs/input-number/input-number.component";
|
|
21
|
+
import * as i18 from "../inputs/input-text/input-text.component";
|
|
22
|
+
import * as i19 from "../inputs/switch/switch.component";
|
|
23
|
+
export class TableEditComponent {
|
|
24
|
+
set setConfig(value) {
|
|
25
|
+
this.config = {
|
|
26
|
+
enableCation: value.enableCation || true,
|
|
27
|
+
enableSelect: value.enableSelect || false,
|
|
28
|
+
enableFilter: value.enableFilter || true,
|
|
29
|
+
...value,
|
|
30
|
+
};
|
|
31
|
+
// if (this.config.enableFilter) {
|
|
32
|
+
// this.config.columns.forEach((col) => {
|
|
33
|
+
// this.globalFilterFields.push(col.field);
|
|
34
|
+
// });
|
|
35
|
+
// }
|
|
36
|
+
}
|
|
37
|
+
constructor(datePipe, decimalPipe, codigoFipePipe, cpfCnpjPipe, telefonePipe, notificationService) {
|
|
38
|
+
this.datePipe = datePipe;
|
|
39
|
+
this.decimalPipe = decimalPipe;
|
|
40
|
+
this.codigoFipePipe = codigoFipePipe;
|
|
41
|
+
this.cpfCnpjPipe = cpfCnpjPipe;
|
|
42
|
+
this.telefonePipe = telefonePipe;
|
|
43
|
+
this.notificationService = notificationService;
|
|
44
|
+
this.globalFilterFields = [];
|
|
45
|
+
this.collapsed = false;
|
|
46
|
+
this.editMode = 'cell';
|
|
47
|
+
this.selectedItems = [];
|
|
48
|
+
this.paginator = true;
|
|
49
|
+
this.rows = 5;
|
|
50
|
+
this.pageLinksOptions = 1;
|
|
51
|
+
this.showFirstLastIcon = false;
|
|
52
|
+
this.applyStyle = (rowData, col) => '';
|
|
53
|
+
this.acoesLinhaTabela = true;
|
|
54
|
+
this.filterColumnsBtn = false;
|
|
55
|
+
this.filtrosAvancados = false;
|
|
56
|
+
this.scrollHeight = '';
|
|
57
|
+
this.isTableScrollable = false;
|
|
58
|
+
this.rowTrackBy = (index, item) => item;
|
|
59
|
+
this.responsiveLayout = true;
|
|
60
|
+
this.espacamentoPai = '2px';
|
|
61
|
+
this.espacamentoLateral = true;
|
|
62
|
+
this.rightCollapse = false;
|
|
63
|
+
this.onFilter = new EventEmitter();
|
|
64
|
+
this.selectedSize = '';
|
|
65
|
+
this.menuItems = [];
|
|
66
|
+
this.imgDefault = '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';
|
|
67
|
+
this.isExpanded = false;
|
|
68
|
+
this.clonedDataSource = {};
|
|
69
|
+
/** Emite evento de salvamento da linha */
|
|
70
|
+
this.onRowSave = new EventEmitter();
|
|
71
|
+
this.onActiveItem = new EventEmitter();
|
|
72
|
+
this.onActiveItemLote = new EventEmitter();
|
|
73
|
+
this.onPaginate = new EventEmitter();
|
|
74
|
+
this.onSelectionChange = new EventEmitter();
|
|
75
|
+
this.doubleClickEvent = new EventEmitter();
|
|
76
|
+
this.filterField = new EventEmitter();
|
|
77
|
+
this.onSwitchTableChange = new EventEmitter();
|
|
78
|
+
this.isRowSelectable = this.isRowSelectable.bind(this);
|
|
79
|
+
}
|
|
80
|
+
ngOnInit() {
|
|
81
|
+
this.tamanhoTela = window.innerWidth;
|
|
82
|
+
}
|
|
83
|
+
isRowSelectable(event) {
|
|
84
|
+
return !this.isDisabledCheckbox(event.data);
|
|
85
|
+
}
|
|
86
|
+
ngOnChanges(changes) {
|
|
87
|
+
//Called before any other lifecycle hook. Use it to inject dependencies, but avoid any serious work here.
|
|
88
|
+
//Add '${implements OnChanges}' to the class.
|
|
89
|
+
if (changes['setConfig'] && this.config) {
|
|
90
|
+
this.config.columns.forEach((e) => {
|
|
91
|
+
if (e.fieldControlType == 'dropdown') {
|
|
92
|
+
this.listarDrop(e.fieldDropDownControl?.fieldControlDropdownService, e);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
onRowEditInit(rowData) {
|
|
98
|
+
this.clonedDataSource[rowData.id] = { ...rowData };
|
|
99
|
+
}
|
|
100
|
+
onRowEditSave(rowData, index) {
|
|
101
|
+
let errors = [];
|
|
102
|
+
//Validação do formulario fake
|
|
103
|
+
this.config.columns.forEach((col) => {
|
|
104
|
+
if (col.required ?? true) {
|
|
105
|
+
if (!rowData[col.field])
|
|
106
|
+
this.notificationService.toastWarn(`O campo ${col.header} e obrigatório! `);
|
|
107
|
+
}
|
|
108
|
+
if (col.validator) {
|
|
109
|
+
const tempFormControl = new FormControl(rowData[col.field], col.validator);
|
|
110
|
+
tempFormControl.markAllAsTouched();
|
|
111
|
+
tempFormControl.valid;
|
|
112
|
+
if (tempFormControl.invalid) {
|
|
113
|
+
this.notificationService.toastWarn(`Erro ao validar dados do campo: ${col.header}! `);
|
|
114
|
+
errors.push({ erro: "Campo invalido", campo: rowData[col.field] });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
if (errors.length == 0) {
|
|
119
|
+
this.onRowSave.emit(rowData);
|
|
120
|
+
delete this.clonedDataSource[rowData.id];
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
this.notificationService.toastWarn(`Erro de validação de dados! `);
|
|
124
|
+
// this.onRowEditCancel(rowData, index)
|
|
125
|
+
// this.onRowEditInit(rowData)
|
|
126
|
+
this.dataSource[index] = this.clonedDataSource[rowData.id];
|
|
127
|
+
delete this.clonedDataSource[rowData.id];
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
onRowEditCancel(product, index) {
|
|
131
|
+
this.dataSource[index] = this.clonedDataSource[product.id];
|
|
132
|
+
delete this.clonedDataSource[product.id];
|
|
133
|
+
}
|
|
134
|
+
async listarDrop(service, col, indtodos) {
|
|
135
|
+
const column = this.config.columns?.indexOf(col);
|
|
136
|
+
if (!col.fieldDropDownControl.fieldControlDropdownSource)
|
|
137
|
+
await service.Listar(indtodos || '').subscribe({
|
|
138
|
+
next: (data) => {
|
|
139
|
+
if (column) {
|
|
140
|
+
if (this.config && this.config.columns && column !== undefined) {
|
|
141
|
+
// @ts-ignore
|
|
142
|
+
this.config.columns[column].fieldDropDownControl.fieldControlDropdownSource = data;
|
|
143
|
+
}
|
|
144
|
+
return this.config.columns[column].fieldDropDownControl?.fieldControlDropdownSource;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
else
|
|
149
|
+
return this.config.columns[column].fieldDropDownControl?.fieldControlDropdownSource;
|
|
150
|
+
}
|
|
151
|
+
retornaDescricaoDrop(rowData, col) {
|
|
152
|
+
const data = col.fieldDropDownControl?.fieldControlDropdownSource;
|
|
153
|
+
const idobjeto = col.fieldDropDownControl?.idobjeto;
|
|
154
|
+
const descricaoobjeto = col.fieldDropDownControl?.descricaoobjeto;
|
|
155
|
+
// @ts-ignore
|
|
156
|
+
const valorAtual = rowData[col.field];
|
|
157
|
+
if (data && idobjeto && descricaoobjeto)
|
|
158
|
+
return data?.find((item) => item[idobjeto] == valorAtual)[descricaoobjeto];
|
|
159
|
+
else
|
|
160
|
+
return 'Carregando';
|
|
161
|
+
}
|
|
162
|
+
onGlobalFilter(table, event) {
|
|
163
|
+
this.onFilter.emit(event.target.value);
|
|
164
|
+
table.filterGlobal(event.target.value, 'contains');
|
|
165
|
+
}
|
|
166
|
+
onWindowResize() {
|
|
167
|
+
this.adjustTableSize();
|
|
168
|
+
this.tamanhoTela = window.innerWidth;
|
|
169
|
+
}
|
|
170
|
+
adjustTableSize() {
|
|
171
|
+
if (this.tableSize < 800) {
|
|
172
|
+
this.selectedSize = 'p-datatable-sm';
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
this.selectedSize = '';
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
paginate($event) {
|
|
179
|
+
if ($event) {
|
|
180
|
+
let paginaInicial = ($event?.first > 0 ? $event.first / $event.rows : $event.first) + 1;
|
|
181
|
+
let termoPesquisa = '';
|
|
182
|
+
let ordenacao = '';
|
|
183
|
+
if ($event.globalFilter)
|
|
184
|
+
termoPesquisa = $event.globalFilter;
|
|
185
|
+
if ($event.sortField)
|
|
186
|
+
ordenacao = `${$event.sortField} ${$event.sortOrder === 1 ? 'ASC' : 'DESC'}`;
|
|
187
|
+
const objeto = {
|
|
188
|
+
paginaInicial: paginaInicial,
|
|
189
|
+
tamanhoPagina: $event.rows,
|
|
190
|
+
termoPesquisa: termoPesquisa,
|
|
191
|
+
ordenacao: ordenacao,
|
|
192
|
+
};
|
|
193
|
+
this.onPaginate.emit(objeto);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
isBooleanField(rowData, col) {
|
|
197
|
+
return col.fieldType == 'boolean';
|
|
198
|
+
}
|
|
199
|
+
isChipField(col) {
|
|
200
|
+
return col.fieldType == 'chip';
|
|
201
|
+
}
|
|
202
|
+
isImageField(col) {
|
|
203
|
+
let retorno = col.fieldType && col.fieldType === 'image' ? true : false;
|
|
204
|
+
return retorno;
|
|
205
|
+
}
|
|
206
|
+
returnRowClass(rowData, col) {
|
|
207
|
+
let value = rowData[col.field];
|
|
208
|
+
let rowClass;
|
|
209
|
+
this.tableSize > 800 ? (rowClass = 'text-base') : (rowClass = 'text-sm');
|
|
210
|
+
if (col.expiredDate == true) {
|
|
211
|
+
new Date(value) < new Date()
|
|
212
|
+
? (rowClass = rowClass + ' text-red-400 font-semibold')
|
|
213
|
+
: '';
|
|
214
|
+
}
|
|
215
|
+
return rowClass;
|
|
216
|
+
}
|
|
217
|
+
transformValue(rowData, col) {
|
|
218
|
+
let value = rowData[col.field];
|
|
219
|
+
if (value != null) {
|
|
220
|
+
if (!col.pipe) {
|
|
221
|
+
return value;
|
|
222
|
+
}
|
|
223
|
+
switch (col.pipe) {
|
|
224
|
+
case 'date':
|
|
225
|
+
return this.datePipe.transform(value, 'dd/MM/yyyy');
|
|
226
|
+
case 'decimal':
|
|
227
|
+
return this.decimalPipe.transform(value, '1.2-2', 'pt-BR');
|
|
228
|
+
case 'cpfcnpj':
|
|
229
|
+
return this.cpfCnpjPipe.transform(value);
|
|
230
|
+
case 'telefone':
|
|
231
|
+
return this.telefonePipe.transform(value);
|
|
232
|
+
case 'codigofipe':
|
|
233
|
+
return this.codigoFipePipe.transform(value);
|
|
234
|
+
case 'money':
|
|
235
|
+
return this.formatarValor(value);
|
|
236
|
+
case 'percentage':
|
|
237
|
+
return `${value} %`;
|
|
238
|
+
default:
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
alignColunasHeader(col) {
|
|
244
|
+
if (col.align) {
|
|
245
|
+
if (col.align == 'right')
|
|
246
|
+
return 'justify-content: end';
|
|
247
|
+
else
|
|
248
|
+
return '';
|
|
249
|
+
}
|
|
250
|
+
else
|
|
251
|
+
return '';
|
|
252
|
+
}
|
|
253
|
+
centralizarColunas(col) {
|
|
254
|
+
if (col.centralize) {
|
|
255
|
+
return 'text-align: center; ';
|
|
256
|
+
}
|
|
257
|
+
else
|
|
258
|
+
return '';
|
|
259
|
+
}
|
|
260
|
+
alignColunas(col) {
|
|
261
|
+
if (col.align) {
|
|
262
|
+
return `text-align: ${col.align}`;
|
|
263
|
+
}
|
|
264
|
+
else
|
|
265
|
+
return '';
|
|
266
|
+
}
|
|
267
|
+
returnClassIcon(rowData, col) {
|
|
268
|
+
return this.retornarRow(rowData, col, 'iconrow');
|
|
269
|
+
}
|
|
270
|
+
returnTooltipIcon(rowData, col) {
|
|
271
|
+
return this.retornarRow(rowData, col, 'tooltipiconrow');
|
|
272
|
+
}
|
|
273
|
+
returnClassChip(rowData, col) {
|
|
274
|
+
return `chip-style w-auto border-round-2xl p-2 text-${this.retornarRow(rowData, col, 'stylechip')} border-${this.retornarRow(rowData, col, 'stylechip')}`;
|
|
275
|
+
}
|
|
276
|
+
retornarRow(rowData, col, field) {
|
|
277
|
+
const _rowaction = this.config.rows ? this.config.rows[col.field] : null;
|
|
278
|
+
const _field = _rowaction && _rowaction[field]
|
|
279
|
+
? _rowaction[field].constructor === Function
|
|
280
|
+
? _rowaction[field].apply(this, [rowData])
|
|
281
|
+
: _rowaction[field]
|
|
282
|
+
: null;
|
|
283
|
+
return _field;
|
|
284
|
+
}
|
|
285
|
+
selectionChange(value = []) {
|
|
286
|
+
this.onSelectionChange.emit(value);
|
|
287
|
+
}
|
|
288
|
+
formatarValor(valor) {
|
|
289
|
+
const formatter = new Intl.NumberFormat('pt-BR', {
|
|
290
|
+
style: 'currency',
|
|
291
|
+
currency: 'BRL',
|
|
292
|
+
});
|
|
293
|
+
return formatter.format(valor);
|
|
294
|
+
}
|
|
295
|
+
loadImage(rowData, col) {
|
|
296
|
+
/*
|
|
297
|
+
Nossa coluna de imagem trabalha com strings do tipo: base64 ou url
|
|
298
|
+
*/
|
|
299
|
+
let retorno = `data:image/jpg;base64, ${this.imgDefault}`;
|
|
300
|
+
if (rowData && col && rowData[col.field] && rowData[col.field] !== '') {
|
|
301
|
+
if (rowData[col.field].includes('http'))
|
|
302
|
+
retorno = rowData[col.field];
|
|
303
|
+
else
|
|
304
|
+
retorno = `data:image/jpg;base64, ${rowData[col.field]}`;
|
|
305
|
+
}
|
|
306
|
+
return retorno;
|
|
307
|
+
}
|
|
308
|
+
getCustomTemplate(templatename) {
|
|
309
|
+
return this._templates[templatename];
|
|
310
|
+
}
|
|
311
|
+
exibirCampo(field, rowData) {
|
|
312
|
+
let visible = field.visible ? field.visible(rowData) : true;
|
|
313
|
+
return visible;
|
|
314
|
+
}
|
|
315
|
+
activeItem(rowData) {
|
|
316
|
+
this.onActiveItem.emit({ rowData: rowData });
|
|
317
|
+
}
|
|
318
|
+
activeItemLote(rowData) {
|
|
319
|
+
this.onActiveItemLote.emit(rowData);
|
|
320
|
+
}
|
|
321
|
+
retornarCampo(action, rowData, field) {
|
|
322
|
+
const _function = action.dynamicfields
|
|
323
|
+
? action.dynamicfields[field]
|
|
324
|
+
: null;
|
|
325
|
+
const _field = _function
|
|
326
|
+
? _function.apply(action, [rowData])
|
|
327
|
+
: action[field];
|
|
328
|
+
return _field;
|
|
329
|
+
}
|
|
330
|
+
callDisabled(action, data) {
|
|
331
|
+
if (action?.disabled) {
|
|
332
|
+
return action.disabled(data);
|
|
333
|
+
}
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
criarMenusModal(data) {
|
|
337
|
+
if (this.config.actions && data) {
|
|
338
|
+
const items = this.config.actions.map((action) => {
|
|
339
|
+
const icon = this.retornarCampo(action, data, 'icon');
|
|
340
|
+
const tooltip = this.retornarCampo(action, data, 'tooltip');
|
|
341
|
+
const label = this.retornarCampo(action, data, 'label');
|
|
342
|
+
const command = this.retornarCampo(action, data, 'command');
|
|
343
|
+
const visible = action.visible
|
|
344
|
+
? action.visible(data)
|
|
345
|
+
: true;
|
|
346
|
+
const disabled = action.disabled
|
|
347
|
+
? action.disabled(data)
|
|
348
|
+
: false;
|
|
349
|
+
const menuInsert = {
|
|
350
|
+
label,
|
|
351
|
+
icon,
|
|
352
|
+
tooltip,
|
|
353
|
+
command,
|
|
354
|
+
disabled,
|
|
355
|
+
visible,
|
|
356
|
+
};
|
|
357
|
+
let item = this.menuItems.filter((x) => x.command == menuInsert.command);
|
|
358
|
+
if (item.length == 0)
|
|
359
|
+
this.menuItems.push(menuInsert);
|
|
360
|
+
else {
|
|
361
|
+
if (menuInsert.label != item[0].label) {
|
|
362
|
+
let index = this.menuItems.indexOf(item[0]);
|
|
363
|
+
this.menuItems.splice(index, 1);
|
|
364
|
+
}
|
|
365
|
+
if (menuInsert.visible != item[0].visible) {
|
|
366
|
+
let index = this.menuItems.indexOf(item[0]);
|
|
367
|
+
this.menuItems.splice(index, 1);
|
|
368
|
+
}
|
|
369
|
+
if (menuInsert.disabled != item[0].disabled) {
|
|
370
|
+
let index = this.menuItems.indexOf(item[0]);
|
|
371
|
+
this.menuItems.splice(index, 1);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
validaLinhaAcaoVazia(rowData) {
|
|
378
|
+
var algumItemVisivel = this.config.actions.some((a) => {
|
|
379
|
+
if (typeof a.visible === 'function') {
|
|
380
|
+
return a.visible(rowData) === true;
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
return true; // Retorna true se a.visible(rowData) não existir
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
return !algumItemVisivel;
|
|
387
|
+
}
|
|
388
|
+
doubleClick(e, rowData) {
|
|
389
|
+
let eventDoubleClick = { event: e, rowData: rowData };
|
|
390
|
+
let array = [];
|
|
391
|
+
e.target.classList.forEach((x) => array.push(x));
|
|
392
|
+
//if (array.find((x: any) => x == 'ng-star-inserted') != undefined)
|
|
393
|
+
this.doubleClickEvent.emit(eventDoubleClick);
|
|
394
|
+
}
|
|
395
|
+
isDisabledCheckbox(rowData) {
|
|
396
|
+
return this.config.disableControlCheckboxFunction
|
|
397
|
+
? this.config.disableControlCheckboxFunction(rowData)
|
|
398
|
+
: false;
|
|
399
|
+
}
|
|
400
|
+
returnTooltipRow(rowData, col) {
|
|
401
|
+
return this.retornarRow(rowData, col, 'tooltiprow');
|
|
402
|
+
}
|
|
403
|
+
isSwitchField(col) {
|
|
404
|
+
let retorno = col.fieldType && col.fieldType === 'switch' ? true : false;
|
|
405
|
+
return retorno;
|
|
406
|
+
}
|
|
407
|
+
onSwitchChange(estado, rowData, col) {
|
|
408
|
+
this.onSwitchTableChange.emit({
|
|
409
|
+
estado: estado,
|
|
410
|
+
rowData: rowData,
|
|
411
|
+
col: col
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
isButtonDisable(action, rowData, commandEvent) {
|
|
415
|
+
if (this.callDisabled(action, rowData)) {
|
|
416
|
+
return '';
|
|
417
|
+
}
|
|
418
|
+
else
|
|
419
|
+
return this.activeItem(rowData), action?.command(commandEvent);
|
|
420
|
+
}
|
|
421
|
+
isDisableEditRowFunction(rowData) {
|
|
422
|
+
return this.config.disableEditRowFunction ? this.config.disableEditRowFunction(rowData) : false;
|
|
423
|
+
}
|
|
424
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableEditComponent, deps: [{ token: i1.DatePipe }, { token: i1.DecimalPipe }, { token: i2.CodigoFipePipe }, { token: i2.CpfCnpjPipe }, { token: i2.TelefonePipe }, { token: i2.NotificationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
425
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableEditComponent, selector: "kv-table-edit", inputs: { setConfig: ["config", "setConfig"], dataSource: "dataSource", editMode: "editMode", selectedItems: "selectedItems", totalRecords: "totalRecords", paginator: "paginator", rowsPerPageOptions: "rowsPerPageOptions", rows: "rows", pageLinksOptions: "pageLinksOptions", showFirstLastIcon: "showFirstLastIcon", tableSize: "tableSize", applyStyle: "applyStyle", acoesLinhaTabela: "acoesLinhaTabela", filterColumnsBtn: "filterColumnsBtn", filtrosAvancados: "filtrosAvancados", scrollHeight: "scrollHeight", isTableScrollable: "isTableScrollable", rowTrackBy: "rowTrackBy", responsiveLayout: "responsiveLayout", espacamentoPai: "espacamentoPai", espacamentoLateral: "espacamentoLateral", tamanhoTotalTabela: "tamanhoTotalTabela", rightCollapse: "rightCollapse", _templates: ["templates", "_templates"] }, outputs: { onFilter: "onFilter", onRowSave: "onRowSave", onActiveItem: "onActiveItem", onActiveItemLote: "onActiveItemLote", onPaginate: "onPaginate", onSelectionChange: "onSelectionChange", doubleClickEvent: "doubleClickEvent", filterField: "filterField", onSwitchTableChange: "onSwitchTableChange" }, host: { listeners: { "window:resize": "onWindowResize($event)" } }, usesOnChanges: true, ngImport: i0, template: "\n<div class=\"card\" >\n <p-toast></p-toast>\n\n <p-panel\n *ngIf=\"filtrosAvancados\"\n header=\"Filtros avan\u00E7ados\"\n [toggleable]=\"true\"\n [collapsed]=\"true\"\n (collapsedChange)=\"collapsed = !collapsed\"\n [style]=\"{ 'margin-bottom': '2px' }\"\n >\n <ng-template pTemplate=\"headericons\">\n <i\n *ngIf=\"!collapsed\"\n class=\"pi pi-filter\"\n ></i>\n <!-- \u00CDcone quando o painel est\u00E1 aberto -->\n <i\n *ngIf=\"collapsed\"\n class=\"pi pi-minus\"\n ></i>\n <!-- \u00CDcone quando o painel est\u00E1 fechado -->\n </ng-template>\n <ng-content></ng-content>\n </p-panel>\n\n <p-table\n #te\n *ngIf=\"config\"\n [value]=\"dataSource\"\n dataKey=\"id\"\n [tableStyle]=\"{ 'min-width': '50rem' }\"\n [columns]=\"config.columns\"\n [editMode]=\"'row'\"\n [scrollable]=\"true\"\n scrollHeight=\"400px\"\n appendTo=\"body\"\n [styleClass]=\"'p-datatable-sm'\"\n [(selection)]=\"selectedItems\"\n [rowSelectable]=\"isRowSelectable\"\n [globalFilterFields]=\"globalFilterFields\"\n [rows]=\"rows\"\n [paginator]=\"paginator\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{first} - {last} de {{ totalRecords }}\"\n (selectionChange)=\"selectionChange($event)\"\n [rowHover]=\"true\"\n [totalRecords]=\"totalRecords\"\n [lazy]=\"config.lazy\"\n (onLazyLoad)=\"paginate($event)\"\n [groupRowsBy]=\"config.fieldGroup\"\n [showFirstLastIcon]=\"showFirstLastIcon\"\n [pageLinks]=\"pageLinksOptions\"\n [scrollable]=\"isTableScrollable\"\n [scrollHeight]=\"scrollHeight\"\n [rowTrackBy]=\"rowTrackBy \"\n >\n\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n <ng-template\n pTemplate=\"caption\"\n *ngIf=\"config.enableCation\"\n >\n <div class=\"flex flex-row flex-wrap justify-content-between align-items-center grid formgrid p-fluid col-12\">\n <div class=\"col-12 flex flex-column\">\n <div\n *ngIf=\"config.title\"\n class=\"text-md font-bold my-3\"\n >\n {{ config.title }}\n </div>\n <div\n *ngIf=\"config.subtitle\"\n class=\"text-sm mb-4 font-medium\"\n >\n {{ config.subtitle }}\n </div>\n </div>\n\n <div class=\"flex flex-row align-items-center md:col-6 lg:col-4 {{\n tamanhoTela < 768 ? 'col-10' : 'col-12'\n }} mt-1 mb-2 \">\n <span\n *ngIf=\"config.enableFilter\"\n class=\"p-input-icon-left\"\n >\n <i class=\"pi pi-search\"></i>\n\n <input\n pInputText\n pAutoFocus\n [autofocus]=\"true\"\n type=\"text\"\n (input)=\"onGlobalFilter(te, $event)\"\n placeholder=\"Pesquisar...\"\n class=\"h-2rem\"\n />\n </span>\n\n </div>\n\n <div class=\"flex flex-row col-1 justify-content-end\">\n <div\n *ngFor=\"let action of config.actionsLote\"\n class=\"btns-options\"\n [style]=\"{ 'margin-right': '7px' }\"\n >\n <button\n id=\"actionLoteBtns\"\n pButton\n *ngIf=\"\n (selectedItems.length > 0 || action.showAcoesLote) &&\n exibirCampo(action, this.action)\n \"\n class=\"actionLoteBtns p-button-raised p-button-text\"\n (click)=\"\n action?.command(commandEvent); activeItemLote(selectedItems)\n \"\n [pTooltip]=\"retornarCampo(action, selectedItems, 'tooltip')\"\n [tooltipPosition]=\"'bottom'\"\n [style.backgroundColor]=\"\n retornarCampo(action, selectedItems, 'btnColor')\n \"\n [disabled]=\"retornarCampo(action, selectedItems, 'disabled')\"\n >\n <span\n class=\"material-symbols-outlined md-22\"\n [style.color]=\"\n retornarCampo(action, selectedItems, 'iconBtnColor')\n \"\n >\n {{ retornarCampo(action, selectedItems, \"icon\") }}\n </span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-template\n pTemplate=\"header\"\n let-columns\n >\n <tr>\n <th\n style=\"width: 4rem; border-left: solid 4px transparent\"\n *ngIf=\"config.enableSelect\"\n >\n <p-tableHeaderCheckbox (click)=\"activeItemLote(selectedItems)\"></p-tableHeaderCheckbox>\n </th>\n\n <th\n *ngFor=\"let col of columns\"\n [pSortableColumn]=\"col.field\"\n [pSortableColumnDisabled]=\"col.sortable === false\"\n [style.min-width]=\"col.width\"\n class=\"text-sm\"\n >\n <div\n [class]=\"\n centralizarColunas(col) && alignColunasHeader(col) == ''\n ? 'flex flex-row justify-content-center'\n : 'flex flex-row'\n \"\n [style]=\"alignColunasHeader(col)\"\n >\n <span>{{ col.header }}</span>\n <p-sortIcon\n *ngIf=\"col.sortable === true\"\n [field]=\"col.field\"\n style=\"font-size: 10px\"\n ></p-sortIcon>\n\n <span\n *ngIf=\"col.headerTooltip\"\n class=\"material-symbols-outlined flex align-items-center\"\n [pTooltip]=\"col.headerTooltip\"\n >info</span>\n </div>\n </th>\n <th *ngIf=\"config.actions && config.actions.length > 0\"></th>\n <th id=\"th-edit\" style=\"width: 20px\">Editar</th>\n </tr>\n </ng-template>\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n\n\n\n <ng-template pTemplate=\"body\" let-rowData let-editing=\"editing\" let-ri=\"rowIndex\" let-columns=\"columns\"\n let-rowgroup=\"rowgroup\" let-rowspan=\"rowspan\">\n <tr [pEditableRow]=\"rowData\" [pEditableRowDisabled]=\"false\" >\n\n\n <td\n *ngIf=\"config.enableSelect\"\n [style]=\"applyStyle(rowData, { field: 'check-box', header: '' })\"\n >\n <!--<p-tableCheckbox *ngIf=\"isVisibleCheckbox(rowData)\"-->\n <p-tableCheckbox\n [value]=\"rowData\"\n [disabled]=\"isDisabledCheckbox(rowData)\"\n (click)=\"activeItemLote(selectedItems)\"\n ></p-tableCheckbox>\n </td>\n\n\n <ng-container *ngFor=\"let col of columns; let i = index\">\n\n\n\n\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n <!-- Celula que armazena os controles de edi\u00E7\u00E3o para os campos -->\n <td *ngIf=\"col.fieldControlType\"\n class=\"rowTable\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col) \" [pTooltip]=\"returnTooltipRow(rowData, col)\"\n >\n <p-cellEditor [ngClass]=\"{'switch': col.fieldControlType == 'switch'}\">\n <!-- Controle de edi\u00E7\u00E3o do campo -->\n <ng-template pTemplate=\"input\">\n <ng-container [ngSwitch]=\"col.fieldControlType\">\n <ng-container *ngSwitchCase=\"'text'\">\n <kv-input-text [(ngModel)]=\"rowData[col.field]\" [required]=\"col.required ?? true\"></kv-input-text>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'number'\">\n <kv-input-number [(ngModel)]=\"rowData[col.field]\" [required]=\"col.required ?? true\"></kv-input-number>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'mask'\">\n <kv-input-mask [mask]=\"col.mask\" [required]=\"col.required ?? true\" [(ngModel)]=\"rowData[col.field]\"></kv-input-mask>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'switch'\">\n <kv-switch [(ngModel)]=\"rowData[col.field]\" ></kv-switch>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'calendar'\">\n <div style=\"width: 300px\">\n <kv-input-calendar [(ngModel)]=\"rowData[col.field]\"></kv-input-calendar>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'dropdown'\">\n <div style=\"width: 300px\">\n <p-dropdown\n appendTo=\"body\"\n [optionLabel]=\"col.fieldDropDownControl.descricaoobjeto\"\n [optionValue]=\"col.fieldDropDownControl.idobjeto\"\n [options]=\"col.fieldDropDownControl.fieldControlDropdownSource\"\n [(ngModel)]=\"rowData[col.field]\"\n >\n </p-dropdown>\n </div>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <!-- Valor atual do campo -->\n <ng-template pTemplate=\"output\">\n <ng-container [ngSwitch]=\"col.fieldControlType\">\n <ng-container *ngSwitchCase=\"'dropdown'\">\n {{\n retornaDescricaoDrop(\n rowData,\n col\n )\n }}\n <!-- {{rowData[col.field]}} -->\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'switch'\">\n <kv-switch [(ngModel)]=\"rowData[col.field]\" [disabled]=\"true\"></kv-switch>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'calendar'\">\n {{ rowData[col.field] | date }}\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n {{ rowData[col.field] }}\n </ng-container>\n </ng-container>\n </ng-template>\n </p-cellEditor>\n </td>\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n\n\n\n\n\n\n\n\n\n\n <td *ngIf=\"rowgroup && !col.template && !col.fieldControlType\" [attr.rowspan]=\"rowgroup && col.grouped ? rowspan : null\"\n class=\"rowTable\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col)\n \" [pTooltip]=\"returnTooltipRow(rowData, col)\">\n <span class=\"p-column-title\">{{ col.header }}:</span>\n\n <span *ngIf=\"!isBooleanField(rowData, col); else booleanField\" [class]=\"returnRowClass(rowData, col)\">\n <span *ngIf=\"\n !isChipField(col) && !col.iconField && !isImageField(col)\n \">\n <i *ngIf=\"col.icon\" [class]=\"col.icon + ' mr-2'\"></i>\n {{ transformValue(rowData, col) }}\n </span>\n\n <div *ngIf=\"isChipField(col) && !col.iconField\">\n <span [class]=\"returnClassChip(rowData, col)\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">{{\n transformValue(rowData, col) }}</span>\n </div>\n </span>\n\n <span *ngIf=\"isImageField(col)\">\n <span>\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\n </span>\n </span>\n\n <i *ngIf=\"col.iconField\" [ngClass]=\"{\n 'material-icons': col.indIconMaterial,\n 'material-symbols-outlined mr-2': !col.indIconMaterial\n }\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\n {{ returnClassIcon(rowData, col) }}\n </i>\n\n <ng-template #booleanField>\n <i *ngIf=\"!col.iconField && !isSwitchField(col)\" [ngClass]=\"\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\n \"><span class=\"material-symbols-outlined\">\n {{ rowData[col.field] ? \"check\" : \"close\" }}\n </span>\n </i>\n\n <span *ngIf=\"isSwitchField(col)\" [class]=\"returnRowClass(rowData, col)\">\n <kv-switch (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\n [disabled]=\"col?.onlyReadField ?? true\" [switchValue]=\"transformValue(rowData, col)\">\n </kv-switch>\n </span>\n </ng-template>\n </td>\n\n <td *ngIf=\"!rowgroup && !col.grouped && !col.template && !col.fieldControlType\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col)\n \" class=\"rowTable\" [pTooltip]=\"returnTooltipRow(rowData, col)\">\n <span class=\"p-column-title\">{{ col.header }}:</span>\n\n <span *ngIf=\"!isBooleanField(rowData, col); else booleanField\" [class]=\"returnRowClass(rowData, col)\">\n <span *ngIf=\"\n !isChipField(col) && !col.iconField && !isImageField(col)\n \">\n <i *ngIf=\"col.icon\" [class]=\"col.icon + ' mr-2'\"></i>\n {{ transformValue(rowData, col) }}\n </span>\n\n <div *ngIf=\"isChipField(col) && !col.iconField\">\n <span [class]=\"returnClassChip(rowData, col)\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\n {{ transformValue(rowData, col) }}</span>\n </div>\n </span>\n\n <span *ngIf=\"isImageField(col)\">\n <span>\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\n </span>\n </span>\n\n <i *ngIf=\"col.iconField\" [ngClass]=\"{\n 'material-icons': col.indIconMaterial,\n 'material-symbols-outlined mr-2': !col.indIconMaterial\n }\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\n {{ returnClassIcon(rowData, col) }}\n </i>\n\n <ng-template #booleanField>\n <i *ngIf=\"!col.iconField && !isSwitchField(col)\" [ngClass]=\"\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\n \"><span class=\"material-symbols-outlined\">\n {{ rowData[col.field] ? \"check\" : \"close\" }}\n </span>\n </i>\n\n <span *ngIf=\"isSwitchField(col)\" [class]=\"returnRowClass(rowData, col)\">\n <kv-switch (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\n [disabled]=\"col?.onlyReadField ?? true\" [switchValue]=\"transformValue(rowData, col)\">\n </kv-switch>\n </span>\n </ng-template>\n </td>\n\n <td *ngIf=\"col.template && !col.fieldControlType\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col)\n \" class=\"rowTable\">\n <span class=\"p-column-title\">{{ col.header }}:</span>\n <ng-container *ngIf=\"getCustomTemplate(col.template.name)\"\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\">\n </ng-container>\n </td>\n\n </ng-container>\n\n\n\n\n\n\n\n\n <!-- ------------------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- Controle de a\u00E7\u00E3o -->\n <td class=\"td-tools\"\n *ngIf=\"config.actions && config.actions.length > 0 && !editing\"\n [style]=\"applyStyle(rowData, { field: 'btns-options', header: '' })\"\n >\n <div\n class=\"flex flex-row justify-content-end w-full gap-1\"\n *ngIf=\"acoesLinhaTabela\"\n >\n <div\n *ngFor=\"let action of config.actions\"\n class=\"mr-1\"\n >\n <!-- <button\n id=\"actionBtns\"\n pButton\n *ngIf=\"exibirCampo(action, rowData)\"\n class=\"actionBtns p-button-text p-button-raised\"\n (click)=\"activeItem(rowData); action?.command(commandEvent)\"\n [pTooltip]=\"retornarCampo(action, rowData, 'tooltip')\"\n [tooltipPosition]=\"\n action.tooltipPosition ? action.tooltipPosition : 'bottom'\n \"\n [disabled]=\"callDisabled(action, rowData)\"\n >\n <span class=\"material-symbols-outlined md-19\">\n {{ retornarCampo(action, rowData, \"icon\") }}</span\n >\n </button> -->\n\n <span\n class=\"material-symbols-outlined {{\n callDisabled(action, rowData)\n ? 'text-gray-400 cursor-auto'\n : 'cursor-pointer'\n }}\"\n style=\"font-size: 20px\"\n (click)=\"isButtonDisable(action, rowData, commandEvent)\"\n [pTooltip]=\"retornarCampo(action, rowData, 'tooltip')\"\n [tooltipPosition]=\"\n action.tooltipPosition ? action.tooltipPosition : 'bottom'\n \"\n >\n {{ retornarCampo(action, rowData, \"icon\") }}\n </span>\n </div>\n </div>\n <div\n class=\"flex flex-row justify-content-end w-full\"\n *ngIf=\"!acoesLinhaTabela\"\n >\n <!-- <button\n id=\"moreVertBtn\"\n pButton\n class=\"actionBtns p-button-text p-button-raised\"\n (click)=\"menu.toggle($event); activeItem(rowData)\"\n > -->\n <span\n class=\"material-symbols-outlined cursor-pointer icon-more-horiz\"\n style=\"font-size: 20px\"\n (click)=\"menu.toggle($event); activeItem(rowData)\"\n >\n more_horiz\n </span>\n <!-- </button> -->\n\n <div *ngFor=\"let action of config.actions\">\n {{ criarMenusModal(rowData) }}\n </div>\n\n <!-- <div *ngFor=\"let action of config.actions\">\n {{ criarMenusModal(rowData) }}\n </div> -->\n\n <p-menu\n #menu\n [popup]=\"true\"\n [model]=\"menuItems\"\n appendTo=\"body\"\n ></p-menu>\n </div>\n </td>\n\n <td\n class=\"td-tools\"\n *ngIf=\"config.actions && config.actions.length > 0 && editing\"\n [style]=\"applyStyle(rowData, { field: 'btns-options', header: '' })\"\n >\n <div\n class=\"flex flex-row justify-content-end w-full gap-1\"\n *ngIf=\"acoesLinhaTabela\"\n >\n\n </div>\n <div\n class=\"flex flex-row justify-content-end w-full\"\n *ngIf=\"!acoesLinhaTabela\"\n >\n </div>\n </td>\n\n\n\n <!-- ------------------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- Controle de edi\u00E7\u00E3o -->\n <td class=\"td-edit\" >\n <div class=\"flex align-items-center justify-content-center gap-2\">\n <button [style.height]=\"'35px'\" [style.width]=\"'35px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\n (click)=\"onRowEditInit(rowData)\" class=\"p-button-rounded p-button-text\"></button>\n <button [style.height]=\"'35px'\" [style.width]=\"'35px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\n (click)=\"onRowEditSave(rowData, ri)\" class=\"p-button-rounded p-button-text p-button-success mr-2\"></button>\n <button [style.height]=\"'35px'\" [style.width]=\"'35px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\n (click)=\"onRowEditCancel(rowData, ri)\" class=\"p-button-rounded p-button-text p-button-danger\"></button>\n </div>\n </td>\n\n\n\n\n </tr>\n </ng-template>\n </p-table>\n</div>\n", styles: ["@charset \"UTF-8\";.td-edit{position:sticky;right:-1px;background-color:#eaeaea}.td-tools{position:sticky;right:54px;border-right:2px solid #fff!important;background-color:#eaeaea}#th-edit{position:sticky;right:0;background-color:#eaeaea}:host ::ng-deep .p-datatable .p-datatable-tbody>tr>td{text-align:center;border:1px solid #eaeaea;border-width:1px 1px;padding:0rem .5rem}:host ::ng-deep .p-datatable .p-datatable-thead>tr>th{text-align:center;padding:0rem .5rem;border:1px solid #dee2e6;border-width:1px 1px;font-weight:700;color:#343a40;background:#eaeaea;transition:box-shadow .2s}.error-show{background-color:red;width:5px;height:10px}.btns-options{position:relative;left:20px}.chip-style{border:solid 1px}:host::ng-deep .p-card .p-card-content{padding:0}.material-symbols-outlined.md-19{font-size:19px}.material-symbols-outlined.md-22{font-size:22px}.checkbox-container{display:flex;align-items:center;gap:2px;margin-top:5px}#botaoFiltro:hover{color:#a9a9a9}.actionLoteBtns{align-items:center;background-color:transparent;color:#a9a9a9;display:flex;font-size:16px;width:2rem;height:2rem;top:2px;margin-left:.5rem;justify-content:center;text-decoration:none;text-align:justify;padding:12px}:host ::ng-deep .center{display:flex;align-items:center;justify-content:center}#actionLoteBtns:hover,.actionLoteBtns:hover{background-color:#29b92d!important}.actionBtns{align-items:center;background-color:transparent;color:#a9a9a9;display:flex;width:.8rem;height:.8rem;margin-left:.22rem;justify-content:center;text-decoration:none;text-align:justify;padding:11px}:host::ng-deep .material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-smoothing:antialiased}#actionBtns:hover{color:#a9a9a9}.image{border-style:solid;border-width:3.5px;border-color:#5289b4;border-radius:100%;height:55px;width:55px;padding:0;margin:0;vertical-align:middle}:host ::ng-deep .p-inputtext{font-size:.8rem}:host ::ng-deep .p-datatable-table{border-spacing:0px 2px;font-size:.8rem}:host ::ng-deep .p-datatable-header{background-color:#eaeaea!important;padding:2px 13px 0!important;border-radius:5px!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th{background-color:#eaeaea!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:first-of-type{border-radius:5px 0 0 5px}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:last-child{border-radius:0 5px 5px 0}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td{border-bottom:1px solid #ddd!important;border-top:1px solid #ddd!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:last-child{border-right:1px solid #ddd!important}:host ::ng-deep .actionBtns,:host ::ng-deep .actionLoteBtns{border-radius:50%;width:2.5rem!important;height:2.5rem!important;box-shadow:#0000003d 0 3px 8px}.icon-more-horiz:hover,.icon-more-horiz:focus{color:#5e5e5e;transform:scale(1.1);transition:color .3s,transform .3s}@media only screen and (min-width: 768px){.actionLoteBtns{top:-1px}}@media only screen and (max-width: 960px){.rowTable{text-align:right!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(p-tablecheckbox){border-bottom:0px!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(img){justify-content:center!important;align-items:center!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(img) .p-column-title{display:none!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:first-of-type{border-left:solid 4px #5289B4!important;border-top:1px solid #ddd!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:last-child{border-bottom:1px solid #ddd!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:last-child div{justify-content:center!important;align-items:center!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td .p-column-title{font-weight:600}}::ng-deep .p-panel.p-panel-toggleable .p-panel-header{background-color:#eaeaea!important}::ng-deep .field.grid,.formgrid.grid{padding:0rem!important}@media screen and (min-width: 961px){.moreVertBtn{position:relative;right:3px}}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:last-of-type{border-radius:0 0 5px!important}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:first-of-type{border-radius:0 0 0 5px!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i4.AutoFocus, selector: "[pAutoFocus]", inputs: ["autofocus"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i7.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "directive", type: i8.InputText, selector: "[pInputText]" }, { kind: "component", type: i9.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i10.Panel, selector: "p-panel", inputs: ["toggleable", "header", "collapsed", "style", "styleClass", "iconPos", "expandIcon", "collapseIcon", "showHeader", "toggler", "transitionOptions"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "directive", type: i11.Ripple, selector: "[pRipple]" }, { kind: "component", type: i12.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i12.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i12.CellEditor, selector: "p-cellEditor" }, { kind: "component", type: i12.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i12.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i12.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i12.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i12.InitEditableRow, selector: "[pInitEditableRow]" }, { kind: "directive", type: i12.SaveEditableRow, selector: "[pSaveEditableRow]" }, { kind: "directive", type: i12.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "component", type: i13.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "directive", type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i14.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i15.InputCalendarComponent, selector: "kv-input-calendar", inputs: ["isYear", "isMonthYear", "minDate", "maxDate", "showButtonBar", "showIcon", "showTime", "selectionMode"], outputs: ["onSelectionChange", "onSelectionValue"] }, { kind: "component", type: i16.InputMaskComponent, selector: "kv-input-mask", inputs: ["mask"], outputs: ["onComplete"] }, { kind: "component", type: i17.InputNumberComponent, selector: "kv-input-number", inputs: ["mode", "digits", "min", "max", "suffix"] }, { kind: "component", type: i18.InputTextComponent, selector: "kv-input-text" }, { kind: "component", type: i19.SwitchComponent, selector: "kv-switch", inputs: ["switchValue", "readonly"], outputs: ["onSwitchChange"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] }); }
|
|
426
|
+
}
|
|
427
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableEditComponent, decorators: [{
|
|
428
|
+
type: Component,
|
|
429
|
+
args: [{ selector: 'kv-table-edit', template: "\n<div class=\"card\" >\n <p-toast></p-toast>\n\n <p-panel\n *ngIf=\"filtrosAvancados\"\n header=\"Filtros avan\u00E7ados\"\n [toggleable]=\"true\"\n [collapsed]=\"true\"\n (collapsedChange)=\"collapsed = !collapsed\"\n [style]=\"{ 'margin-bottom': '2px' }\"\n >\n <ng-template pTemplate=\"headericons\">\n <i\n *ngIf=\"!collapsed\"\n class=\"pi pi-filter\"\n ></i>\n <!-- \u00CDcone quando o painel est\u00E1 aberto -->\n <i\n *ngIf=\"collapsed\"\n class=\"pi pi-minus\"\n ></i>\n <!-- \u00CDcone quando o painel est\u00E1 fechado -->\n </ng-template>\n <ng-content></ng-content>\n </p-panel>\n\n <p-table\n #te\n *ngIf=\"config\"\n [value]=\"dataSource\"\n dataKey=\"id\"\n [tableStyle]=\"{ 'min-width': '50rem' }\"\n [columns]=\"config.columns\"\n [editMode]=\"'row'\"\n [scrollable]=\"true\"\n scrollHeight=\"400px\"\n appendTo=\"body\"\n [styleClass]=\"'p-datatable-sm'\"\n [(selection)]=\"selectedItems\"\n [rowSelectable]=\"isRowSelectable\"\n [globalFilterFields]=\"globalFilterFields\"\n [rows]=\"rows\"\n [paginator]=\"paginator\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{first} - {last} de {{ totalRecords }}\"\n (selectionChange)=\"selectionChange($event)\"\n [rowHover]=\"true\"\n [totalRecords]=\"totalRecords\"\n [lazy]=\"config.lazy\"\n (onLazyLoad)=\"paginate($event)\"\n [groupRowsBy]=\"config.fieldGroup\"\n [showFirstLastIcon]=\"showFirstLastIcon\"\n [pageLinks]=\"pageLinksOptions\"\n [scrollable]=\"isTableScrollable\"\n [scrollHeight]=\"scrollHeight\"\n [rowTrackBy]=\"rowTrackBy \"\n >\n\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n <ng-template\n pTemplate=\"caption\"\n *ngIf=\"config.enableCation\"\n >\n <div class=\"flex flex-row flex-wrap justify-content-between align-items-center grid formgrid p-fluid col-12\">\n <div class=\"col-12 flex flex-column\">\n <div\n *ngIf=\"config.title\"\n class=\"text-md font-bold my-3\"\n >\n {{ config.title }}\n </div>\n <div\n *ngIf=\"config.subtitle\"\n class=\"text-sm mb-4 font-medium\"\n >\n {{ config.subtitle }}\n </div>\n </div>\n\n <div class=\"flex flex-row align-items-center md:col-6 lg:col-4 {{\n tamanhoTela < 768 ? 'col-10' : 'col-12'\n }} mt-1 mb-2 \">\n <span\n *ngIf=\"config.enableFilter\"\n class=\"p-input-icon-left\"\n >\n <i class=\"pi pi-search\"></i>\n\n <input\n pInputText\n pAutoFocus\n [autofocus]=\"true\"\n type=\"text\"\n (input)=\"onGlobalFilter(te, $event)\"\n placeholder=\"Pesquisar...\"\n class=\"h-2rem\"\n />\n </span>\n\n </div>\n\n <div class=\"flex flex-row col-1 justify-content-end\">\n <div\n *ngFor=\"let action of config.actionsLote\"\n class=\"btns-options\"\n [style]=\"{ 'margin-right': '7px' }\"\n >\n <button\n id=\"actionLoteBtns\"\n pButton\n *ngIf=\"\n (selectedItems.length > 0 || action.showAcoesLote) &&\n exibirCampo(action, this.action)\n \"\n class=\"actionLoteBtns p-button-raised p-button-text\"\n (click)=\"\n action?.command(commandEvent); activeItemLote(selectedItems)\n \"\n [pTooltip]=\"retornarCampo(action, selectedItems, 'tooltip')\"\n [tooltipPosition]=\"'bottom'\"\n [style.backgroundColor]=\"\n retornarCampo(action, selectedItems, 'btnColor')\n \"\n [disabled]=\"retornarCampo(action, selectedItems, 'disabled')\"\n >\n <span\n class=\"material-symbols-outlined md-22\"\n [style.color]=\"\n retornarCampo(action, selectedItems, 'iconBtnColor')\n \"\n >\n {{ retornarCampo(action, selectedItems, \"icon\") }}\n </span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-template\n pTemplate=\"header\"\n let-columns\n >\n <tr>\n <th\n style=\"width: 4rem; border-left: solid 4px transparent\"\n *ngIf=\"config.enableSelect\"\n >\n <p-tableHeaderCheckbox (click)=\"activeItemLote(selectedItems)\"></p-tableHeaderCheckbox>\n </th>\n\n <th\n *ngFor=\"let col of columns\"\n [pSortableColumn]=\"col.field\"\n [pSortableColumnDisabled]=\"col.sortable === false\"\n [style.min-width]=\"col.width\"\n class=\"text-sm\"\n >\n <div\n [class]=\"\n centralizarColunas(col) && alignColunasHeader(col) == ''\n ? 'flex flex-row justify-content-center'\n : 'flex flex-row'\n \"\n [style]=\"alignColunasHeader(col)\"\n >\n <span>{{ col.header }}</span>\n <p-sortIcon\n *ngIf=\"col.sortable === true\"\n [field]=\"col.field\"\n style=\"font-size: 10px\"\n ></p-sortIcon>\n\n <span\n *ngIf=\"col.headerTooltip\"\n class=\"material-symbols-outlined flex align-items-center\"\n [pTooltip]=\"col.headerTooltip\"\n >info</span>\n </div>\n </th>\n <th *ngIf=\"config.actions && config.actions.length > 0\"></th>\n <th id=\"th-edit\" style=\"width: 20px\">Editar</th>\n </tr>\n </ng-template>\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n\n\n\n <ng-template pTemplate=\"body\" let-rowData let-editing=\"editing\" let-ri=\"rowIndex\" let-columns=\"columns\"\n let-rowgroup=\"rowgroup\" let-rowspan=\"rowspan\">\n <tr [pEditableRow]=\"rowData\" [pEditableRowDisabled]=\"false\" >\n\n\n <td\n *ngIf=\"config.enableSelect\"\n [style]=\"applyStyle(rowData, { field: 'check-box', header: '' })\"\n >\n <!--<p-tableCheckbox *ngIf=\"isVisibleCheckbox(rowData)\"-->\n <p-tableCheckbox\n [value]=\"rowData\"\n [disabled]=\"isDisabledCheckbox(rowData)\"\n (click)=\"activeItemLote(selectedItems)\"\n ></p-tableCheckbox>\n </td>\n\n\n <ng-container *ngFor=\"let col of columns; let i = index\">\n\n\n\n\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n <!-- Celula que armazena os controles de edi\u00E7\u00E3o para os campos -->\n <td *ngIf=\"col.fieldControlType\"\n class=\"rowTable\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col) \" [pTooltip]=\"returnTooltipRow(rowData, col)\"\n >\n <p-cellEditor [ngClass]=\"{'switch': col.fieldControlType == 'switch'}\">\n <!-- Controle de edi\u00E7\u00E3o do campo -->\n <ng-template pTemplate=\"input\">\n <ng-container [ngSwitch]=\"col.fieldControlType\">\n <ng-container *ngSwitchCase=\"'text'\">\n <kv-input-text [(ngModel)]=\"rowData[col.field]\" [required]=\"col.required ?? true\"></kv-input-text>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'number'\">\n <kv-input-number [(ngModel)]=\"rowData[col.field]\" [required]=\"col.required ?? true\"></kv-input-number>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'mask'\">\n <kv-input-mask [mask]=\"col.mask\" [required]=\"col.required ?? true\" [(ngModel)]=\"rowData[col.field]\"></kv-input-mask>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'switch'\">\n <kv-switch [(ngModel)]=\"rowData[col.field]\" ></kv-switch>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'calendar'\">\n <div style=\"width: 300px\">\n <kv-input-calendar [(ngModel)]=\"rowData[col.field]\"></kv-input-calendar>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'dropdown'\">\n <div style=\"width: 300px\">\n <p-dropdown\n appendTo=\"body\"\n [optionLabel]=\"col.fieldDropDownControl.descricaoobjeto\"\n [optionValue]=\"col.fieldDropDownControl.idobjeto\"\n [options]=\"col.fieldDropDownControl.fieldControlDropdownSource\"\n [(ngModel)]=\"rowData[col.field]\"\n >\n </p-dropdown>\n </div>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <!-- Valor atual do campo -->\n <ng-template pTemplate=\"output\">\n <ng-container [ngSwitch]=\"col.fieldControlType\">\n <ng-container *ngSwitchCase=\"'dropdown'\">\n {{\n retornaDescricaoDrop(\n rowData,\n col\n )\n }}\n <!-- {{rowData[col.field]}} -->\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'switch'\">\n <kv-switch [(ngModel)]=\"rowData[col.field]\" [disabled]=\"true\"></kv-switch>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'calendar'\">\n {{ rowData[col.field] | date }}\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n {{ rowData[col.field] }}\n </ng-container>\n </ng-container>\n </ng-template>\n </p-cellEditor>\n </td>\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n\n\n\n\n\n\n\n\n\n\n <td *ngIf=\"rowgroup && !col.template && !col.fieldControlType\" [attr.rowspan]=\"rowgroup && col.grouped ? rowspan : null\"\n class=\"rowTable\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col)\n \" [pTooltip]=\"returnTooltipRow(rowData, col)\">\n <span class=\"p-column-title\">{{ col.header }}:</span>\n\n <span *ngIf=\"!isBooleanField(rowData, col); else booleanField\" [class]=\"returnRowClass(rowData, col)\">\n <span *ngIf=\"\n !isChipField(col) && !col.iconField && !isImageField(col)\n \">\n <i *ngIf=\"col.icon\" [class]=\"col.icon + ' mr-2'\"></i>\n {{ transformValue(rowData, col) }}\n </span>\n\n <div *ngIf=\"isChipField(col) && !col.iconField\">\n <span [class]=\"returnClassChip(rowData, col)\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">{{\n transformValue(rowData, col) }}</span>\n </div>\n </span>\n\n <span *ngIf=\"isImageField(col)\">\n <span>\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\n </span>\n </span>\n\n <i *ngIf=\"col.iconField\" [ngClass]=\"{\n 'material-icons': col.indIconMaterial,\n 'material-symbols-outlined mr-2': !col.indIconMaterial\n }\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\n {{ returnClassIcon(rowData, col) }}\n </i>\n\n <ng-template #booleanField>\n <i *ngIf=\"!col.iconField && !isSwitchField(col)\" [ngClass]=\"\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\n \"><span class=\"material-symbols-outlined\">\n {{ rowData[col.field] ? \"check\" : \"close\" }}\n </span>\n </i>\n\n <span *ngIf=\"isSwitchField(col)\" [class]=\"returnRowClass(rowData, col)\">\n <kv-switch (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\n [disabled]=\"col?.onlyReadField ?? true\" [switchValue]=\"transformValue(rowData, col)\">\n </kv-switch>\n </span>\n </ng-template>\n </td>\n\n <td *ngIf=\"!rowgroup && !col.grouped && !col.template && !col.fieldControlType\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col)\n \" class=\"rowTable\" [pTooltip]=\"returnTooltipRow(rowData, col)\">\n <span class=\"p-column-title\">{{ col.header }}:</span>\n\n <span *ngIf=\"!isBooleanField(rowData, col); else booleanField\" [class]=\"returnRowClass(rowData, col)\">\n <span *ngIf=\"\n !isChipField(col) && !col.iconField && !isImageField(col)\n \">\n <i *ngIf=\"col.icon\" [class]=\"col.icon + ' mr-2'\"></i>\n {{ transformValue(rowData, col) }}\n </span>\n\n <div *ngIf=\"isChipField(col) && !col.iconField\">\n <span [class]=\"returnClassChip(rowData, col)\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\n {{ transformValue(rowData, col) }}</span>\n </div>\n </span>\n\n <span *ngIf=\"isImageField(col)\">\n <span>\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\n </span>\n </span>\n\n <i *ngIf=\"col.iconField\" [ngClass]=\"{\n 'material-icons': col.indIconMaterial,\n 'material-symbols-outlined mr-2': !col.indIconMaterial\n }\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\n {{ returnClassIcon(rowData, col) }}\n </i>\n\n <ng-template #booleanField>\n <i *ngIf=\"!col.iconField && !isSwitchField(col)\" [ngClass]=\"\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\n \"><span class=\"material-symbols-outlined\">\n {{ rowData[col.field] ? \"check\" : \"close\" }}\n </span>\n </i>\n\n <span *ngIf=\"isSwitchField(col)\" [class]=\"returnRowClass(rowData, col)\">\n <kv-switch (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\n [disabled]=\"col?.onlyReadField ?? true\" [switchValue]=\"transformValue(rowData, col)\">\n </kv-switch>\n </span>\n </ng-template>\n </td>\n\n <td *ngIf=\"col.template && !col.fieldControlType\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col)\n \" class=\"rowTable\">\n <span class=\"p-column-title\">{{ col.header }}:</span>\n <ng-container *ngIf=\"getCustomTemplate(col.template.name)\"\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\">\n </ng-container>\n </td>\n\n </ng-container>\n\n\n\n\n\n\n\n\n <!-- ------------------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- Controle de a\u00E7\u00E3o -->\n <td class=\"td-tools\"\n *ngIf=\"config.actions && config.actions.length > 0 && !editing\"\n [style]=\"applyStyle(rowData, { field: 'btns-options', header: '' })\"\n >\n <div\n class=\"flex flex-row justify-content-end w-full gap-1\"\n *ngIf=\"acoesLinhaTabela\"\n >\n <div\n *ngFor=\"let action of config.actions\"\n class=\"mr-1\"\n >\n <!-- <button\n id=\"actionBtns\"\n pButton\n *ngIf=\"exibirCampo(action, rowData)\"\n class=\"actionBtns p-button-text p-button-raised\"\n (click)=\"activeItem(rowData); action?.command(commandEvent)\"\n [pTooltip]=\"retornarCampo(action, rowData, 'tooltip')\"\n [tooltipPosition]=\"\n action.tooltipPosition ? action.tooltipPosition : 'bottom'\n \"\n [disabled]=\"callDisabled(action, rowData)\"\n >\n <span class=\"material-symbols-outlined md-19\">\n {{ retornarCampo(action, rowData, \"icon\") }}</span\n >\n </button> -->\n\n <span\n class=\"material-symbols-outlined {{\n callDisabled(action, rowData)\n ? 'text-gray-400 cursor-auto'\n : 'cursor-pointer'\n }}\"\n style=\"font-size: 20px\"\n (click)=\"isButtonDisable(action, rowData, commandEvent)\"\n [pTooltip]=\"retornarCampo(action, rowData, 'tooltip')\"\n [tooltipPosition]=\"\n action.tooltipPosition ? action.tooltipPosition : 'bottom'\n \"\n >\n {{ retornarCampo(action, rowData, \"icon\") }}\n </span>\n </div>\n </div>\n <div\n class=\"flex flex-row justify-content-end w-full\"\n *ngIf=\"!acoesLinhaTabela\"\n >\n <!-- <button\n id=\"moreVertBtn\"\n pButton\n class=\"actionBtns p-button-text p-button-raised\"\n (click)=\"menu.toggle($event); activeItem(rowData)\"\n > -->\n <span\n class=\"material-symbols-outlined cursor-pointer icon-more-horiz\"\n style=\"font-size: 20px\"\n (click)=\"menu.toggle($event); activeItem(rowData)\"\n >\n more_horiz\n </span>\n <!-- </button> -->\n\n <div *ngFor=\"let action of config.actions\">\n {{ criarMenusModal(rowData) }}\n </div>\n\n <!-- <div *ngFor=\"let action of config.actions\">\n {{ criarMenusModal(rowData) }}\n </div> -->\n\n <p-menu\n #menu\n [popup]=\"true\"\n [model]=\"menuItems\"\n appendTo=\"body\"\n ></p-menu>\n </div>\n </td>\n\n <td\n class=\"td-tools\"\n *ngIf=\"config.actions && config.actions.length > 0 && editing\"\n [style]=\"applyStyle(rowData, { field: 'btns-options', header: '' })\"\n >\n <div\n class=\"flex flex-row justify-content-end w-full gap-1\"\n *ngIf=\"acoesLinhaTabela\"\n >\n\n </div>\n <div\n class=\"flex flex-row justify-content-end w-full\"\n *ngIf=\"!acoesLinhaTabela\"\n >\n </div>\n </td>\n\n\n\n <!-- ------------------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- Controle de edi\u00E7\u00E3o -->\n <td class=\"td-edit\" >\n <div class=\"flex align-items-center justify-content-center gap-2\">\n <button [style.height]=\"'35px'\" [style.width]=\"'35px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\n (click)=\"onRowEditInit(rowData)\" class=\"p-button-rounded p-button-text\"></button>\n <button [style.height]=\"'35px'\" [style.width]=\"'35px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\n (click)=\"onRowEditSave(rowData, ri)\" class=\"p-button-rounded p-button-text p-button-success mr-2\"></button>\n <button [style.height]=\"'35px'\" [style.width]=\"'35px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\n (click)=\"onRowEditCancel(rowData, ri)\" class=\"p-button-rounded p-button-text p-button-danger\"></button>\n </div>\n </td>\n\n\n\n\n </tr>\n </ng-template>\n </p-table>\n</div>\n", styles: ["@charset \"UTF-8\";.td-edit{position:sticky;right:-1px;background-color:#eaeaea}.td-tools{position:sticky;right:54px;border-right:2px solid #fff!important;background-color:#eaeaea}#th-edit{position:sticky;right:0;background-color:#eaeaea}:host ::ng-deep .p-datatable .p-datatable-tbody>tr>td{text-align:center;border:1px solid #eaeaea;border-width:1px 1px;padding:0rem .5rem}:host ::ng-deep .p-datatable .p-datatable-thead>tr>th{text-align:center;padding:0rem .5rem;border:1px solid #dee2e6;border-width:1px 1px;font-weight:700;color:#343a40;background:#eaeaea;transition:box-shadow .2s}.error-show{background-color:red;width:5px;height:10px}.btns-options{position:relative;left:20px}.chip-style{border:solid 1px}:host::ng-deep .p-card .p-card-content{padding:0}.material-symbols-outlined.md-19{font-size:19px}.material-symbols-outlined.md-22{font-size:22px}.checkbox-container{display:flex;align-items:center;gap:2px;margin-top:5px}#botaoFiltro:hover{color:#a9a9a9}.actionLoteBtns{align-items:center;background-color:transparent;color:#a9a9a9;display:flex;font-size:16px;width:2rem;height:2rem;top:2px;margin-left:.5rem;justify-content:center;text-decoration:none;text-align:justify;padding:12px}:host ::ng-deep .center{display:flex;align-items:center;justify-content:center}#actionLoteBtns:hover,.actionLoteBtns:hover{background-color:#29b92d!important}.actionBtns{align-items:center;background-color:transparent;color:#a9a9a9;display:flex;width:.8rem;height:.8rem;margin-left:.22rem;justify-content:center;text-decoration:none;text-align:justify;padding:11px}:host::ng-deep .material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-smoothing:antialiased}#actionBtns:hover{color:#a9a9a9}.image{border-style:solid;border-width:3.5px;border-color:#5289b4;border-radius:100%;height:55px;width:55px;padding:0;margin:0;vertical-align:middle}:host ::ng-deep .p-inputtext{font-size:.8rem}:host ::ng-deep .p-datatable-table{border-spacing:0px 2px;font-size:.8rem}:host ::ng-deep .p-datatable-header{background-color:#eaeaea!important;padding:2px 13px 0!important;border-radius:5px!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th{background-color:#eaeaea!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:first-of-type{border-radius:5px 0 0 5px}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:last-child{border-radius:0 5px 5px 0}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td{border-bottom:1px solid #ddd!important;border-top:1px solid #ddd!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:last-child{border-right:1px solid #ddd!important}:host ::ng-deep .actionBtns,:host ::ng-deep .actionLoteBtns{border-radius:50%;width:2.5rem!important;height:2.5rem!important;box-shadow:#0000003d 0 3px 8px}.icon-more-horiz:hover,.icon-more-horiz:focus{color:#5e5e5e;transform:scale(1.1);transition:color .3s,transform .3s}@media only screen and (min-width: 768px){.actionLoteBtns{top:-1px}}@media only screen and (max-width: 960px){.rowTable{text-align:right!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(p-tablecheckbox){border-bottom:0px!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(img){justify-content:center!important;align-items:center!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(img) .p-column-title{display:none!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:first-of-type{border-left:solid 4px #5289B4!important;border-top:1px solid #ddd!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:last-child{border-bottom:1px solid #ddd!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:last-child div{justify-content:center!important;align-items:center!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td .p-column-title{font-weight:600}}::ng-deep .p-panel.p-panel-toggleable .p-panel-header{background-color:#eaeaea!important}::ng-deep .field.grid,.formgrid.grid{padding:0rem!important}@media screen and (min-width: 961px){.moreVertBtn{position:relative;right:3px}}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:last-of-type{border-radius:0 0 5px!important}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:first-of-type{border-radius:0 0 0 5px!important}\n"] }]
|
|
430
|
+
}], ctorParameters: function () { return [{ type: i1.DatePipe }, { type: i1.DecimalPipe }, { type: i2.CodigoFipePipe }, { type: i2.CpfCnpjPipe }, { type: i2.TelefonePipe }, { type: i2.NotificationService }]; }, propDecorators: { setConfig: [{
|
|
431
|
+
type: Input,
|
|
432
|
+
args: ['config']
|
|
433
|
+
}], dataSource: [{
|
|
434
|
+
type: Input
|
|
435
|
+
}], editMode: [{
|
|
436
|
+
type: Input
|
|
437
|
+
}], selectedItems: [{
|
|
438
|
+
type: Input
|
|
439
|
+
}], totalRecords: [{
|
|
440
|
+
type: Input
|
|
441
|
+
}], paginator: [{
|
|
442
|
+
type: Input
|
|
443
|
+
}], rowsPerPageOptions: [{
|
|
444
|
+
type: Input
|
|
445
|
+
}], rows: [{
|
|
446
|
+
type: Input
|
|
447
|
+
}], pageLinksOptions: [{
|
|
448
|
+
type: Input
|
|
449
|
+
}], showFirstLastIcon: [{
|
|
450
|
+
type: Input
|
|
451
|
+
}], tableSize: [{
|
|
452
|
+
type: Input
|
|
453
|
+
}], applyStyle: [{
|
|
454
|
+
type: Input
|
|
455
|
+
}], acoesLinhaTabela: [{
|
|
456
|
+
type: Input
|
|
457
|
+
}], filterColumnsBtn: [{
|
|
458
|
+
type: Input
|
|
459
|
+
}], filtrosAvancados: [{
|
|
460
|
+
type: Input
|
|
461
|
+
}], scrollHeight: [{
|
|
462
|
+
type: Input
|
|
463
|
+
}], isTableScrollable: [{
|
|
464
|
+
type: Input
|
|
465
|
+
}], rowTrackBy: [{
|
|
466
|
+
type: Input
|
|
467
|
+
}], responsiveLayout: [{
|
|
468
|
+
type: Input
|
|
469
|
+
}], espacamentoPai: [{
|
|
470
|
+
type: Input
|
|
471
|
+
}], espacamentoLateral: [{
|
|
472
|
+
type: Input
|
|
473
|
+
}], tamanhoTotalTabela: [{
|
|
474
|
+
type: Input
|
|
475
|
+
}], rightCollapse: [{
|
|
476
|
+
type: Input
|
|
477
|
+
}], onFilter: [{
|
|
478
|
+
type: Output
|
|
479
|
+
}], _templates: [{
|
|
480
|
+
type: Input,
|
|
481
|
+
args: ['templates']
|
|
482
|
+
}], onRowSave: [{
|
|
483
|
+
type: Output
|
|
484
|
+
}], onActiveItem: [{
|
|
485
|
+
type: Output
|
|
486
|
+
}], onActiveItemLote: [{
|
|
487
|
+
type: Output
|
|
488
|
+
}], onPaginate: [{
|
|
489
|
+
type: Output
|
|
490
|
+
}], onSelectionChange: [{
|
|
491
|
+
type: Output
|
|
492
|
+
}], doubleClickEvent: [{
|
|
493
|
+
type: Output
|
|
494
|
+
}], filterField: [{
|
|
495
|
+
type: Output
|
|
496
|
+
}], onSwitchTableChange: [{
|
|
497
|
+
type: Output
|
|
498
|
+
}], onWindowResize: [{
|
|
499
|
+
type: HostListener,
|
|
500
|
+
args: ['window:resize', ['$event']]
|
|
501
|
+
}] } });
|
|
502
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZWV2by1jb21wb25lbnRzL3NyYy9saWIvdGFibGUtZWRpdC90YWJsZS1lZGl0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlZXZvLWNvbXBvbmVudHMvc3JjL2xpYi90YWJsZS1lZGl0L3RhYmxlLWVkaXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLFlBQVksRUFBZSxNQUFNLGVBQWUsQ0FBQztBQU9wSSxPQUFPLEVBQUUsV0FBVyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU8xRCxNQUFNLE9BQU8sa0JBQWtCO0lBUzdCLElBQXFCLFNBQVMsQ0FBQyxLQUFrQjtRQUMvQyxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSTtZQUN4QyxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxLQUFLO1lBQ3pDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLElBQUk7WUFDeEMsR0FBRyxLQUFLO1NBQ1QsQ0FBQztRQUVGLGtDQUFrQztRQUNsQywyQ0FBMkM7UUFDM0MsK0NBQStDO1FBQy9DLFFBQVE7UUFDUixJQUFJO0lBQ04sQ0FBQztJQXdERCxZQUNtQixRQUFrQixFQUNsQixXQUF3QixFQUN4QixjQUE4QixFQUM5QixXQUF3QixFQUN4QixZQUEwQixFQUMxQixtQkFBd0M7UUFMeEMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFD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WUFBWTtzQkFBcEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTTtnQkFFYSxVQUFVO3NCQUE3QixLQUFLO3VCQUFDLFdBQVc7Z0JBb0JSLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQW9IUCxjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBIb3N0TGlzdGVuZXIsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNZW51SXRlbUNvbW1hbmRFdmVudCwgU2VsZWN0SXRlbSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IENvZGlnb0ZpcGVQaXBlLCBDcGZDbnBqUGlwZSwgS3ZNZW51SXRlbSwgTm90aWZpY2F0aW9uU2VydmljZSwgVGFibGVDb25maWcsIFRhYmxlQ29uZmlnQ29sdW1uLCBUYWJsZVBhZ2luYXRlLCBUZWxlZm9uZVBpcGUgfSBmcm9tICcuLi8uLi9wdWJsaWMtYXBpJztcbmltcG9ydCB7IERhdGVQaXBlLCBEZWNpbWFsUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuaW1wb3J0IFRhYmxlRWRpdENvbmZpZyBmcm9tICcuLi9hcGkvY29tcG9uZW50cy90YWJsZS90YWJsZWRpdC5jb25maWcnO1xuaW1wb3J0IHsgVGFibGVFZGl0Q29uZmlnQ29sdW1uIH0gZnJvbSAnLi4vYXBpL2NvbXBvbmVudHMvdGFibGUvdGFibGVlZGl0LmNvbmZpZy5jb2x1bW4nO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdrdi10YWJsZS1lZGl0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLWVkaXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1lZGl0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVGFibGVFZGl0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXN7XG5cblxuICBjb25maWchOiBUYWJsZUVkaXRDb25maWc7XG4gIGdsb2JhbEZpbHRlckZpZWxkczogc3RyaW5nW10gPSBbXTtcblxuICBjb2xsYXBzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXG4gIEBJbnB1dCgnY29uZmlnJykgc2V0IHNldENvbmZpZyh2YWx1ZTogVGFibGVDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGVuYWJsZUNhdGlvbjogdmFsdWUuZW5hYmxlQ2F0aW9uIHx8IHRydWUsXG4gICAgICBlbmFibGVTZWxlY3Q6IHZhbHVlLmVuYWJsZVNlbGVjdCB8fCBmYWxzZSxcbiAgICAgIGVuYWJsZUZpbHRlcjogdmFsdWUuZW5hYmxlRmlsdGVyIHx8IHRydWUsXG4gICAgICAuLi52YWx1ZSxcbiAgICB9O1xuXG4gICAgLy8gaWYgKHRoaXMuY29uZmlnLmVuYWJsZUZpbHRlcikge1xuICAgIC8vICAgdGhpcy5jb25maWcuY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAvLyAgICAgdGhpcy5nbG9iYWxGaWx0ZXJGaWVsZHMucHVzaChjb2wuZmllbGQpO1xuICAgIC8vICAgfSk7XG4gICAgLy8gfVxuICB9XG5cbiAgQElucHV0KCkgZGF0YVNvdXJjZSE6IGFueVtdO1xuICBASW5wdXQoKSBlZGl0TW9kZTogJ3JvdycgfCAnY2VsbCcgPSAnY2VsbCc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIHRvdGFsUmVjb3JkcyE6IG51bWJlcjtcbiAgQElucHV0KCkgcGFnaW5hdG9yOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgcm93c1BlclBhZ2VPcHRpb25zITogbnVtYmVyW107XG4gIEBJbnB1dCgpIHJvd3M6IG51bWJlciA9IDU7XG4gIEBJbnB1dCgpIHBhZ2VMaW5rc09wdGlvbnM6IG51bWJlciA9IDE7XG4gIEBJbnB1dCgpIHNob3dGaXJzdExhc3RJY29uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRhYmxlU2l6ZSE6IG51bWJlcjtcbiAgQElucHV0KCkgYXBwbHlTdHlsZTogRnVuY3Rpb24gPSAocm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKSA9PiAnJztcbiAgQElucHV0KCkgYWNvZXNMaW5oYVRhYmVsYTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGZpbHRlckNvbHVtbnNCdG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZmlsdHJvc0F2YW5jYWRvczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzY3JvbGxIZWlnaHQ6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpc1RhYmxlU2Nyb2xsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSByb3dUcmFja0J5OiBGdW5jdGlvbiA9IChpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW07XG4gIEBJbnB1dCgpIHJlc3BvbnNpdmVMYXlvdXQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBlc3BhY2FtZW50b1BhaTogc3RyaW5nID0gJzJweCc7XG4gIEBJbnB1dCgpIGVzcGFjYW1lbnRvTGF0ZXJhbDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHRhbWFuaG9Ub3RhbFRhYmVsYSE6IG51bWJlcjtcbiAgQElucHV0KCkgcmlnaHRDb2xsYXBzZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgb25GaWx0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBJbnB1dCgndGVtcGxhdGVzJykgX3RlbXBsYXRlcyE6IGFueTtcbiAgdGFtYW5ob1RlbGEhOiBudW1iZXI7XG4gIHNlbGVjdGVkU2l6ZTogc3RyaW5nID0gJyc7XG4gIHNlbGVjdGVJZW1zITogYW55W107XG4gIG1lbnVJdGVtczogS3ZNZW51SXRlbVtdID0gW107XG4gIGltZ0RlZmF1bHQ6IHN0cmluZyA9XG4gICAgJy85ai80QUFRU2taSlJnQUJBUUlBZGdCMkFBRC80UUJpUlhocFpnQUFUVTBBS2dBQUFBZ0FCUUVTQUFNQUFBQUJBQUVBQUFFYUFBVUFBQUFCQUFBQVNnRWJBQVVBQUFBQkFBQUFVZ0VvQUFNQUFBQUJBQU1BQUFJVEFBTUFBQUFCQUFFQUFBQUFBQUFBQUFCMkFBQUFBUUFBQUhZQUFBQUIvOXNBUXdBREFnSUNBZ0lEQWdJQ0F3TURBd1FHQkFRRUJBUUlCZ1lGQmdrSUNnb0pDQWtKQ2d3UERBb0xEZ3NKQ1EwUkRRNFBFQkFSRUFvTUVoTVNFQk1QRUJBUS85c0FRd0VEQXdNRUF3UUlCQVFJRUFzSkN4QVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRLzhBQUVRZ0FrQUNRQXdFUkFBSVJBUU1SQWYvRUFCMEFBUUFCQkFNQkFBQUFBQUFBQUFBQUFBQUdBUUlIQ0FNRUNRWC94QUJCRUFBQ0FRUUFCUUlDQ0FRREJBc0FBQUFCQWdNQUJBVVJCZ2NTSVRFVFFRaFJDUlFWR1NKVmxkRXlZWUdSUWxKaUZpTTNPRk5qY1hOMWRwS1RzYk8wLzhRQUdnRUJBQUlEQVFBQUFBQUFBQUFBQUFBQUFBRUZBd1FHQXYvRUFESVJBQUlBQkFNRkNBRUZBUUVCQUFBQUFBQUJBZ01FRVNFeFVRVVNRWkh3RXhVeVlYR0JvYkhSSWpOQ3dlRTA4U1AvMmdBTUF3RUFBaEVERVFBL0FQS3FnRkFLQVVCZERETGNTcEJCRThrc2pCRVJGSlptSjBBQVBKSnFVbkU3SWh0UXE3eUo1dzl5ZHoyVmkrczVlNFhGUk11MFYwOVNVNzBSdEFSMGpSUGs5UUkwVjk2czVHeXBreFhtUGQrWC9uMzVGYk8ycEtsNFFmcWZ4eko5ak9VL0JtTzZXa3NaYjZSSkJJcjNVcE90YTBwVmVsU08zZ2c3MmQ3SGFyT1hzMm5nelYvWHBJcTQ5cFZNZkczb3Z6ZGttc01UaXNYMS9abU10TFAxZGRmb1FMSDFhM3JmU0J2V3ovZXR1Q1hCTHZ1SksrbUJweHpJNWx0OXQyMXhPM1dROENnT3BmNG5GWlRvKzA4WmFYbnBiNlByRUN5ZE85YjExQTYzb2YyckhITGdtZU5KK3FQY0V5T1hmY2JWOU1DTTVQbFB3WmtlcG83R1d4a2VReU05cktSdmU5cUZicVVMMzhBRFdoclE3VnFUTm0wOGVTdDZQLzFHNUJ0S29nNDM5VitMTWdQRVBKM1BZcUw2emlMaGNyR3E3ZEVUMDVSclpPa0pQVU5BZUQxRW5RWDNxc243S21TMXZTM3ZmRC8zNzhpMGs3VWxUSHV4cmRmeHovd2djME0xdk05dmNSUEZMRXhSMGRTckt3T2lDRDRJUHRWWTA0WFpsa21vbGRaRnRRU0tBVUFvQlFDZ0ZBU2pnL2w5bWVMWlJLRmV5c09rc2J1U0lsVzdrYVFkdXM3QkIwZERSMmQ2QjNhV2htVk9PVU92NDFOS3NyWWFWWVl4YWRYL0FOK1Ztemg3aEhBY01SQk1UWUlrcFhwZTRmOEFGSy9ZYjJ4OWowZzlJMHUvWVYwTWltbFU2dEFzZGVKenMycG16LzNJci9YU3kxMVo5bXM1Z0toVFVrWEs2RkJjYUZDTGpRb0xqUW9UY29WTkJjcFVFbnh1SWVFY0J4UkNVeTFnalNoZWxMaFB3eXAyT3RNTzVBNmllazdYZnRXQ2ZTeXFoZnJXT3ZFenlhaWJJZjhBODRyZVhEcDVYejBaaFBqSGwvbCtFWmZVSWE4c0NvSXU0NHlGVTdBMDQ3OUIyUnJaMGRqUjNzRG5hcWltVXJ1OFZyK2REb0tTdmwxS3RGYUdLK1Y4ODhzcjRLNzArU0wxcG0rS0FVQW9CUUU1NWRjdTVlSnBseXVXUjQ4VEczWWJLdGNzRDNWVDdLRDJMZjBIZlpXeW9hRjFEMzQvRDk5Y2VyVnRkWEtuWFp5L0Y5ZjdwMWZPTU1NVnZFbHZieEpIRkdvUkVSUUZWUU5BQUR3QVBhdWlTVUtzc2puVzNFN3Q0bklCODY5SGhzclFnclVBVUFvQlFDZ0ZBVXFRVUlvVGM0NW9ZcDRuZ25pU1NPUlNqbzZobFpTTkVFSHNRUjdWRFNpVm5rZWszQzdwNG1EZVluTHVYaGlWc3Jpa2VURlNOM0hjdGJNVDJWajdxVDRiK2g3NkxjNVhVTHAzMmt2dy9YK2VmVDZPaHJsVUxzNW5pKy85MTZ0QjZyU3lGQUtBbEhML0FJT2w0dXkrcENxMkZteVNYWkpPMlVudEdORUhiYUkzN0FFK2RBN2xGU3VxbVdlU3ovSHVhRmZWcW1sN3F2dlJYdDVlZVRXRjhubnBhNXNGREZGQkVrRUVTUnh4cUVSRVVCVlVEUUFBOEFEMnJxVWtsWkhNdHQ0czVRS2s4dGxhZ2dVQW9DZmNwdVJQTkxuYmtueC9MdmhhNHlFY0RCYm05Y2lLMXR0LzlKSzJsQjEzNlJ0aVBBTllaMVJMcDFlWXpQSXBwdFE3UzBiUDRUNkxianU0dEZrNGg1cVlLd3VTTm1LenNacnBBZmwxc1kvL0FJcXVpMnZBbittRmxsRHNlTnI5VVNJcnpCK2piNTI4SzJjdVI0U3llRzR0aWlCWTI5czdXMTJRUGNSeWZnUC9BR0NUWjlnYXlTdHF5WTNhSzZNVTNaTTZCWGdhWnF2bHNUbGNEa3JuRFp2RzNXUHY3T1F4WEZyZFJORkxFNDhxeU1BVlA4alZrbW9sZFpGWkZDNFhhTE02bFNRS0FVQmFSVTVrcG5ITkRGY1JQYjNFU1NSU0tVZEhVTXJLUm9nZytRYWhwTk5NOXd4T0Y3eXpOZmVZSEIwdkNPWUlqNlRZWGpQSmFFSHVxZ2phSFpKMnV3Tis0MGZPd09XcmFWMHN6RHd2TDhleDB0QlZxcGw3cjhVS1YvUHp5U3h0a3N1UkY2MHpmTG9ZWmJpVklJSW5rbGtZSWlJcExNeE9nQUI1Sk5TazRuWkVOcUZYZVJzcHduZ0l1R2VIN1REb0l6SkVuVk82QWY3eVZ1N0hZQUxEZllFamZTRkh0WFcwMGhVOHBTMTcrdlh3Y2hVVGUybXhUTWNYcS9UVjJ5eFN3dmQ1dG4yQUsyREF5Nm9JRkFLQXlwOE5YSXpKZkVCelFzdUM0SlpMWEZ3SWIzTDNpQWJndEVJRGRPKzNXeEtvdm51MnlDQWExNnFvVk5MY2ZIZ2JOSlRPcG1xRGh4UFluZ3pndmhmbDd3MVk4SWNIWWEzeG1KeDhZamd0NFYwQjgyWStXWW51V095U1NTU2E1V1pNaW14T0tOM1oxa3VYREtoVUVDc2o3ZGVEMktBMXkrTVQ0VzhOeno0TnV1SStIOGRGRHh6aHJkcGJDNGpVSzEvR2cyYldRLzR0amZRVC9DMnU0QmJlL1ExanA0OTJMd3Y0OHpRcnFOVk1HOUN2MUw1OGp5VmRIamRvNUZLc3BJWlNORUg1R3VtT1dLVUFvQlFGcEh2VWtvK054ZHc5RHhSZ0xyRXlCUks2OWR1N2FIUktQNFR2UjBOOWpvYjZTUjcxcjFVaFZFcHkzN2Vwc1UwM3NKc016VDYvdjM0MlpyWk5ETmJ6UGIzRVR4U3hNVWRIVXF5c0RvZ2crQ0Q3VnlUVGhkbWRjbW9sZFpFODVPOFBSWlhQeTVhNUN0RmlsVjFRNk81WDJFT2lEMkFWanZZSVlLYXN0bHlWTW03Ny9qOTlmSldiVXFITGxxV3Y1Y2ZKVysvcTVtK3VqT2RMcUhrclVBVUFvRDBpK2k3NFZzN1RscnhkeHI2Uy9XOGxtMXhwY2p1SXJlQkpBQjhnV3VXL3NQbFZEdGVOdVpEQm9yOWNqb05qd0pTNG85WDlmK202MVZCY0NnRkFLQThZL2kyNFZ0T0RQaVA0OHdWaEVzVnY5cC9Ya1JSb0lMbU5ManBBOWdQVzBCOHE2eWlqY3lSREU5UHJBNUd1Z1V1b2poV3YzaVlqclpOVVVBb0NsU0Myb1BSaERuRnc5RmlzL0ZsN2JvV1BLcXpzZzdhbFRRYzZBQTBReW5leVN4WW4ycm50cVNGTG1LWXY1ZmEvUDNjNlBaYzV6Slc0ODRmcmgvWlB1VStNK3p1RExhUmtsU1Mra2t1bldRYTFzOUtsUnIrRW9pa2VkNzM0SXF6MmJMM0tkUFc3NjlrVmUwbzkrb2ZsWmYzOXNtUUZiNW9NdXFEeUtBVUFvRDBiK2k2NHhzN25nUGpEZ0ZwVkYzajhzbVdWQ2U3UlR3cEVTUG1BMXVOL0xySHpxaDJ2TGFqaGo4ckhRYkhtSndSUWFPNXU3VlFYQW9CUUNnUEZ6NHFPTWJQano0aHVPdUpjZktzdHJKbEd0SUpGTzFranQwVzNWd2ZrUkVDUDVHdXNvNWJseUlZWHA5NG5JMXN4VEtpS0phL1dCaXF0azFSUUNnRkFXa1ZKS0lkell4bjJqd1hjeUtrenlXVWtkMGl4OS9CNldMRFI3QkhjKzJ0YjNvR3EvYVV0ektkMjRZOWN5dzJkTVV1b1YrT0hYdWtTWEVXSDJWaXJMR2VyNnYxTzNqZzYrbnA2dWhRdTliT3Q2OGJyY2x3ZG5Bb05GWTA1a2ZhUnVQVjM1bmRIaXNoalpXb0lGQUtBVUJrYmtCem96ZklYbVpqdVBjUkdiaUNNRzJ5Vm4xZEl1N055UFVqMzdIc3JLZlprVW5ZMkRncVpDcVpiZ1pzVTFSRlRURkdqMko1YmN6T0MrYlhDbHJ4bHdMbW9jampycFJ2cElFa0VtdG1LVlBLT045MVA4aU5nZ25sWnNxT1RGdVJyRTZ5Vk9nbnc3OER1aVUxak1nb0RWajQwdml6dzNLUGhlKzVlOEY1U080NDR5MEJnUG9QdjdKaGNhTXprZnd5bFQrQmZJSkRuc0FHc3FDaWM2SlRJMStsZkpXMTlhcEVMZ2dmNm44SGxkNXJvem1SUUNnRkFLQW8zaXBKUjBzdFlESzRxOHhabTlJWGx2SkI2blQxZEhXcFhldGpldCtOMWptUWRwQTROVTF6TWt1UHM0MUdsZXp1ZHVzaDRSY1BGRHl5dFFCUUNnRkFLQWxQTHptanpCNVVaci9hRGw1eFZmWVM5SUN5R0J3WTVsQjJGa2pZRkpGMzdNQ0t4elpNRTVic3hYTXNxZE1rUGVsdXhzbmhQcE51ZWVQdEZ0c3Z3MXdqbFpFR3ZyRDJzOE1qSDVzRWxDZjJVVlh4YkprdDROb3NJZHJ6a3NVbVJUbUQ5SUQ4UlBIVm5MamJMTTQ3aGExbUJWeGc3Wm9wbVgvdnBHZVJUL05DcHJMTDJiSWx1N1YvVXhUZHAxRXhXVHQ2R3VWemMzRjVjUzNkM1BKUFBNNWtrbGtZczdzVHNzeFBja24zTmI2VnNFVjdiZUxPT2dGQUtBVUFvQ2g4VklSYlE5Q2dSY1BGRHl5dFFCUUNnRkFTZmcvbGZ6SDVneWVud1B3TG5jNE9ycFo3R3drbGpRLzZuVWRLLzFJckhIT2x5dkhFa1pKY21aTjhFTFptREEvQUo4VCtiUlpadUJyWEZSdjNEWCtVdDFPdjVxanN3L3FCV3JGdEtuaC9sZjJOdUhabFRGL0czdVN1SDZNLzRoSlVEU1pmZ3VFLzVYeVU1SS84QVRBUldQdldSbyt2Y3lyWk0vVmRleDFiL0FPamIrSTJ6UXRidHdyZkVEK0czeWpnbi93QnlOUlVyYXNoNjhpSHNtb1duTXg5eFI4RzN4TDhKSTgyUjVUNVc2aVFiNjhZOFYvc2ZNTEF6dC9jVm5ncnFlUEtMK3Zzd1IwRlJCbkR5eCtqRU9UeGVUd3Q3SmpzeGpycXh1NFRxU0M1aGFLUkQvTldBSXJaVFVTdWpVY0xoZG1kYXBJRkFLQVVCUStLa0l0b2VqcVltL3dEdFRGV1dUOUwwdnJsdkhQMGRYVjA5YWh0YjBONjM1MVdPWEgya0NqMVNaN21RZG5HNEwzczdjanVqeFdReHNyVUVDZ01qOGtPUVBNUG43eEljRHdSamxGdmJkTFgrU3VkcmEyU0h3WFlBN1k2T2tVRmpvOXRBa1lLaXBsMDBPOUdiRlBUVEttTGRnNW5vOXliK0F2a2p5d2dndnVJc1d2R21jUUF2ZDVhSU5iSzMvVjJ1eWdIaitQcmI1RWVLb1orMFowN0NGN3E4dnlkQkkyYkprNHhMZWZuK0RZNjJ0YmF5dDQ3U3p0NG9JSWxDUnhSSUZSRkhnQURzQldnMjNpeXdTdGdqbHFBS0FVQW9DT2NhOHVPQXVZK09PSzQ3NFF4V2N0dEVLdDdiTEkwZS9kSEk2a1A4MUlOWkpjMk9VN3dPeGptU29KcXRHcm1rL1A3Nk51M2p0TG5pYmtIZlRlckdHa2ZoNi9tNnVzZkszbmJ2djVMSVR2OEF6anNEYjAyMWNkMmZ6L0pUMU95VmJla2N2d2FGWkhIWkRENUM1eFdXc3A3TzlzNVdndUxlZU1wSkZJcDB5TXA3Z2dnZ2cxZEpxSlhSU05PRjJlWjE2RUNnS0h4VWtvNldXdnhpc1ZlWlF3K3FMTzNrbjlQcTZldm9VdHJlanJldk9xeHpJK3pnY2VpYjVHU1hBNWthZ1R0ZDI1a2E1VDVNWkhndTFqWjVua3NaSkxWMmtPL0I2bENuWi9DRWRBUEd0YThBVnA3Tm1PWlRwUGhoMXpOemFNdnM2aDI0NDllNlpNUWFzQ3ZaZFVFSFp4bU91OHZrclRFMkVmcVhON1BIYndwdlhWSTdCVkg5eUtodFFxN0pTY1RzajIyNUw4cGVIT1NuTHZGY0JjT1c4WVd6aURYbHlGMDk1ZEVEMVozUGtsajQzNFVLbzdBVnlOUk9pcUpqamlPeHA1RU5QTFVFSk9hd21ZVUFvQlFDZ0ZBS0FVQm9WOUpmeVZ3OFdNeFhQSEMya2NGKzEwbUp6UHBycjZ3ckl4Z21iL1V2UVVKOGtNZzhMVjFzcW9kM0pmcWlrMnZUcXluTFBKbm41VjJVUW9DMG1wSlJEdWJHVCt6dUM3cU5YbVNTOWtqdFVhTTYxczlUQmpzZmhLSTQ5OTcxclJOViswcGpsMDd0eHc2NUcvczZXcGxRcjhNZXZkb2dISjNpQ0xGWitYRTNKVllzcXFvcm5RMU1teWcyU094RE1QQkpZcUtyTmx6MUxtN2p5aSsrQlo3VmtPWkxVeUgrUER5ZnR3NVd2NUdiNjZJNTR1cVR5U3psTC94VjRNLzh3WTcvQVBUSFdLZCsxRjZNeXlQM1lmVkh1YlhISFppZ0ZBS0FVQW9CUUNnRkFheS9TSi84cytTLzhWc1Avc3F3MlovMEwwWlhiVS81bjZvOG9hNlU1Z29lMVNDMm9QUmhEbkZ4RERsYzlGaWJib2FQRkt5TTQ3a3l2b3VOZ2thSFNvOEFodW9IMnJudHF6MU1tS1hEL0g3ZjQrN25SN0xrdVhLY2NXY1gxdy9zZ2NNMHR2S2s4RXJ4eXhzSFIwWWhsWUhZSUk4RUdxeE53dTZMSnBSS3p5TmxPRXMvSHhOdy9aNWRUR0pKVTZaMFVqOEVxOW1HZ1NWNzl3RDM2U3A5NjYybW5xb2xLTmUvcjE4SElWRXZzWjBVclQxeXpYREgxV0Y3ck5NK3dEN1ZzR0JuZndlWXZlSHMxajgvaldSYnZHWFVWNWJsMTZsRWtiaDFKSHVOZ2RxOHhRcUpPRjhSREU0V29sd05qdnZGUGlYL0FEbkJmcE1mNzFvZDJVK2o1bGgzclVhcmtQdkZQaVgvQURuQmZwTWY3MDdzcDlIekhldFJxdVErOFUrSmY4NXdYNlRIKzlPN0tmUjh4M3JVYXJrUHZGUGlYL09jRitreC92VHV5bjBmTWQ2MUdxNUQ3eFQ0bC96bkJmcE1mNzA3c3A5SHpIZXRScXVRKzhVK0pmOEFPY0Yra3gvdlR1eW4wZk1kNjFHcTVEN3hUNGwvem5CZnBNZjcwN3NwOUh6SGV0UnF1USs4VStKZjg1d1g2VEgrOU83S2ZSOHgzclVhcmtQdkZQaVgvT2NGK2t4L3ZUdXluMGZNZDYxR3E1RVA1cWZHQnpwNXljSVRjRDhiNUhGell1ZWFLNGRiZkhwRS9YR2RyK0lkL05aWk5ESmtSYjhHWmluVjA2b2czSThqQ2xiWnBscFB0VWtwSHhlTHVJWXVGOEJkWlp5aGxSZWkzUnY4Y3A3S05iR3g3blIzMGcxcjFNOVU4cHpIN2V2WHdiRlBLN2ViREwxK3Y2OThMMk5iWnBwYmlWNTU1WGtsa1l1N3V4TE14T3lTVDVKTmNrMjRuZDVuWEpLRldSYlVFa281ZjhZeThJNWNHVHBOaGVNa2QyQ0R0VkJPcEJvRTdYWk92Y0Vqem9qY29xcDBzekh3dlA4QVBzYUZmU0twbDd5dnZRM3Q1K1dPR05zK0d0cm13VU0wVnhFbHhieXBKRklvZEhSZ3lzcEd3UVI1QnJxVTdxNk9aYWF3WnlBMU9aNWFMcWdnVUFvQlFDZ0ZBS0FVQW9CUUZwTlRrU2tjYzAwVnZFOXhjU3BIRkdwZDNkZ3Fxb0d5U1Q0QXFHMGsyejNEQzRudXJNMTk1Z2NZeThYWmdtUHBGaFpzOGRvQU83S1NOeUhZQjIzU0RyMkdoNTJUeTFiVk9xbVhXU3kvSjB0QlNLbWw3ejhVU1YvTHl6YXd2bXMrUkY2MHpmRkFLQW5ITHZtSkx3eEt1S3lydkppcEc3SHV6V3pFOTJVZTZrK1YvcU8rdzFsUTF6cDMyY3p3L1grZVhUcmE2aFZRdCtYNHZ2cmgxYk9VTTBWeEVrOEVxU1JTS0hSMFlGV1VqWUlJOGdpdWpUVFYwem5HbW5abzVBZm5VbmxvclVFRmFBVUFvQlFDZ0ZBVTNxcEJRbjVVSlNPT2FhSzNpZTR1SlVqaWpVdTd1d0Nxb0d5U1Q0QUZRMmxpejBsZDJSZzNtSnpFbDRtbGJGWXAzanhVYmR6M0RYTEE5bVlleWoyWCtwNzZDODVYVnpxSHVRZUg3NjY4dWpvYUZVNjdTUHhmWFhYbkI2clN5RkFLQVVBb0NVOEg4dzgxd25Jc0pkNzdIaENnczVaU0ZUdVczR2UvUWVwaVRvYU96c2IwUnVVdGJNcG5iT0hUOGFGZlZiT2wxRjRvTFF4TjNidG5rc2NyNEt5ZkN5NFlHYmNCeFpnT0pvZzJJeU1jc2dRTzhEZmhsajdLVHRUM0lCWUFzTnJ2d1RYUlNhbVZVSzh0KzNIcjRPZm0wODZUKzVEYkYvZmxmUE5YeHRtazhENjlaekNWREdwSXNWNmhRV0d4ODZFV0d4ODZDdzZoUW14UXNhQ3hTb0pQa1ovaTNoL2htTXRsOGpIRklVTHBBdjRwWk96RWFVZHhzcVFHT2wzNUlyQlBxWlZPcnpIN2Nldmd6U3FlYlA4QTI0YjRwY01PZHNzM3h0a204RENQR1BNREw4WFMrbVMxbllCUUJhUnlrcXgyRHR6MjZ6c0RXeG9hR2h2WlBPMVZiTXFuWjRMVDg2blJVdEJMcGtuRmFLTFczcmxuYkIyZXZ3UmV0TTNoUUNnRkFLQVVBb0M2R2FXM2xTZUNWNDVZMkRvNk1ReXNEc0VFZUNEVXB1RjNSRFNpVm5rVHpoN25GbjhWRUxiTFFKbFlsWFNNNytuS093QTI0QjZoMlBrRmlUc21yS1R0U2JMVm8xdkw1NitmTXE1K3lwY3gzbHZkMTRyankrcksxaWY0em14d1hrZWxaTDZXeWtlVDAxUzZoSzc4YVlzdlVxanY1TERXanZRNzFaeTlwVTh4MnZiMTZaV3pOblZFdFh0ZjA2VCtDUzJHV3hXVkVoeGVTdGJ3UmE5VDBKbGs2TjcxdnBKMXZSL3NhM0lKa0V6d05QMGR6VGpseHk3S05OWDFPM1dROENnT3BmNWZFNHJvKzA4bmFXZnE3S2V2TXNmVnJ6cnFJMzVIOTZ4eHpJSmZqYVhxekpCTGptZUJOK2lJMWsrYS9CZU42bFMvbHZaRWxNYkpheEZ2RzlzR2JwUmw3ZVF4M3NhMk85YWN6YVZQTGRyMzlPbDhHMUwyZFVURmUxdlhwdGNpQWNRYzRzL2xZamJZbUJNVkV5NmRrZjFKVHNFSFRrQUtPNDhEcUJHdzFWay9hazJaaEIrbGZQTXRKR3lwY3Q3MHg3Mm5CY09mSHl4eTRrRG1tbXVKbnVMaVY1WlpXTHU3c1dabUoyU1NlNUpQdlZhMjRuZGxta29WWlpGdFFTS0FVQW9ELzlrPSc7XG5cbiAgaXNFeHBhbmRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbW1hbmRFdmVudCE6IE1lbnVJdGVtQ29tbWFuZEV2ZW50O1xuXG5cblxuXG4gICAgc3RhdHVzZXMhOiBTZWxlY3RJdGVtW107XG4gIGNsb25lZERhdGFTb3VyY2U6IHsgW3M6IHN0cmluZ106IGFueSB9ID0ge307XG5cblxuICAvKiogIEVtaXRlIGV2ZW50byBkZSBzYWx2YW1lbnRvIGRhIGxpbmhhICovXG4gIEBPdXRwdXQoKSBvblJvd1NhdmU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25BY3RpdmVJdGVtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uQWN0aXZlSXRlbUxvdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25QYWdpbmF0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvblNlbGVjdGlvbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBkb3VibGVDbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGZpbHRlckZpZWxkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uU3dpdGNoVGFibGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXRlUGlwZTogRGF0ZVBpcGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWNpbWFsUGlwZTogRGVjaW1hbFBpcGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb2RpZ29GaXBlUGlwZTogQ29kaWdvRmlwZVBpcGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjcGZDbnBqUGlwZTogQ3BmQ25walBpcGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZWxlZm9uZVBpcGU6IFRlbGVmb25lUGlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2VcblxuICApIHtcbiAgICB0aGlzLmlzUm93U2VsZWN0YWJsZSA9IHRoaXMuaXNSb3dTZWxlY3RhYmxlLmJpbmQodGhpcyk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnRhbWFuaG9UZWxhID0gd2luZG93LmlubmVyV2lkdGg7XG4gIH1cbiAgaXNSb3dTZWxlY3RhYmxlKGV2ZW50OiBhbnkpIHtcbiAgICByZXR1cm4gIXRoaXMuaXNEaXNhYmxlZENoZWNrYm94KGV2ZW50LmRhdGEpO1xuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvL0NhbGxlZCBiZWZvcmUgYW55IG90aGVyIGxpZmVjeWNsZSBob29rLiBVc2UgaXQgdG8gaW5qZWN0IGRlcGVuZGVuY2llcywgYnV0IGF2b2lkIGFueSBzZXJpb3VzIHdvcmsgaGVyZS5cbiAgICAvL0FkZCAnJHtpbXBsZW1lbnRzIE9uQ2hhbmdlc30nIHRvIHRoZSBjbGFzcy5cbiAgICBpZiAoY2hhbmdlc1snc2V0Q29uZmlnJ10gJiYgdGhpcy5jb25maWcpIHtcblxuICAgICAgdGhpcy5jb25maWcuY29sdW1ucy5mb3JFYWNoKChlOlRhYmxlRWRpdENvbmZpZ0NvbHVtbikgPT4ge1xuICAgICAgICBpZihlLmZpZWxkQ29udHJvbFR5cGUgPT0gJ2Ryb3Bkb3duJyl7XG4gICAgICAgICAgdGhpcy5saXN0YXJEcm9wKGUuZmllbGREcm9wRG93bkNvbnRyb2w/LmZpZWxkQ29udHJvbERyb3Bkb3duU2VydmljZSwgZSlcblxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIG9uUm93RWRpdEluaXQocm93RGF0YTogYW55KSB7XG4gICAgdGhpcy5jbG9uZWREYXRhU291cmNlW3Jvd0RhdGEuaWQgYXMgc3RyaW5nXSA9IHsgLi4ucm93RGF0YSB9O1xuICB9XG4gIG9uUm93RWRpdFNhdmUocm93RGF0YTogYW55LCBpbmRleDogYW55KSB7XG5cbiAgICBsZXQgZXJyb3JzID0gW11cbiAgICAvL1ZhbGlkYcOnw6NvIGRvIGZvcm11bGFyaW8gZmFrZVxuICAgIHRoaXMuY29uZmlnLmNvbHVtbnMuZm9yRWFjaCgoY29sOlRhYmxlRWRpdENvbmZpZ0NvbHVtbikgPT4ge1xuXG4gICAgICBpZihjb2wucmVxdWlyZWQgPz8gdHJ1ZSl7XG4gICAgICAgIGlmKCFyb3dEYXRhW2NvbC5maWVsZF0pXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnRvYXN0V2FybihgTyBjYW1wbyAke2NvbC5oZWFkZXJ9IGUgb2JyaWdhdMOzcmlvISBgKVxuICAgICAgfVxuXG4gICAgICBpZihjb2wudmFsaWRhdG9yKVxuICAgICAge1xuICAgICAgICBjb25zdCB0ZW1wRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wocm93RGF0YVtjb2wuZmllbGRdLCBjb2wudmFsaWRhdG9yIGFzIFZhbGlkYXRvckZuKTtcbiAgICAgICAgdGVtcEZvcm1Db250cm9sLm1hcmtBbGxBc1RvdWNoZWQoKVxuICAgICAgICB0ZW1wRm9ybUNvbnRyb2wudmFsaWRcbiAgICAgICAgaWYodGVtcEZvcm1Db250cm9sLmludmFsaWQpe1xuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS50b2FzdFdhcm4oYEVycm8gYW8gdmFsaWRhciBkYWRvcyBkbyBjYW1wbzogJHtjb2wuaGVhZGVyfSEgYClcbiAgICAgICAgICBlcnJvcnMucHVzaCggeyBlcnJvOiBcIkNhbXBvIGludmFsaWRvXCIsIGNhbXBvOiByb3dEYXRhW2NvbC5maWVsZF0gfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZihlcnJvcnMubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMub25Sb3dTYXZlLmVtaXQocm93RGF0YSlcbiAgICAgIGRlbGV0ZSB0aGlzLmNsb25lZERhdGFTb3VyY2Vbcm93RGF0YS5pZCBhcyBzdHJpbmddO1xuICAgIH1lbHNle1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnRvYXN0V2FybihgRXJybyBkZSB2YWxpZGHDp8OjbyBkZSBkYWRvcyEgYClcbiAgICAgIC8vIHRoaXMub25Sb3dFZGl0Q2FuY2VsKHJvd0RhdGEsIGluZGV4KVxuICAgICAgLy8gdGhpcy5vblJvd0VkaXRJbml0KHJvd0RhdGEpXG4gICAgICB0aGlzLmRhdGFTb3VyY2VbaW5kZXhdID0gdGhpcy5jbG9uZWREYXRhU291cmNlW3Jvd0RhdGEuaWQgYXMgc3RyaW5nXTtcbiAgICAgIGRlbGV0ZSB0aGlzLmNsb25lZERhdGFTb3VyY2Vbcm93RGF0YS5pZCBhcyBzdHJpbmddO1xuICAgIH1cbiAgfVxuICBvblJvd0VkaXRDYW5jZWwocHJvZHVjdDogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5kYXRhU291cmNlW2luZGV4XSA9IHRoaXMuY2xvbmVkRGF0YVNvdXJjZVtwcm9kdWN0LmlkIGFzIHN0cmluZ107XG4gICAgZGVsZXRlIHRoaXMuY2xvbmVkRGF0YVNvdXJjZVtwcm9kdWN0LmlkIGFzIHN0cmluZ107XG59XG5cbiAgYXN5bmMgbGlzdGFyRHJvcChzZXJ2aWNlOiBhbnksIGNvbDphbnksIGluZHRvZG9zPzogYm9vbGVhbil7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb25maWcuY29sdW1ucz8uaW5kZXhPZihjb2wpO1xuXG4gICAgaWYoIWNvbC5maWVsZERyb3BEb3duQ29udHJvbC5maWVsZENvbnRyb2xEcm9wZG93blNvdXJjZSlcbiAgICAgIGF3YWl0IHNlcnZpY2UuTGlzdGFyKGluZHRvZG9zIHx8ICcnKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZGF0YTogYW55W10pID0+IHtcbiAgICAgICAgICBpZiAoY29sdW1uKSB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5jb2x1bW5zICYmIGNvbHVtbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuY29sdW1uc1tjb2x1bW5dLmZpZWxkRHJvcERvd25Db250cm9sLmZpZWxkQ29udHJvbERyb3Bkb3duU291cmNlID0gZGF0YTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmNvbHVtbnNbY29sdW1uXS5maWVsZERyb3BEb3duQ29udHJvbD8uZmllbGRDb250cm9sRHJvcGRvd25Tb3VyY2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgZWxzZSByZXR1cm4gdGhpcy5jb25maWcuY29sdW1uc1tjb2x1bW5dLmZpZWxkRHJvcERvd25Db250cm9sPy5maWVsZENvbnRyb2xEcm9wZG93blNvdXJjZVxuICB9XG4gIHJldG9ybmFEZXNjcmljYW9Ecm9wKHJvd0RhdGE6IGFueVtdLCBjb2w6IFRhYmxlRWRpdENvbmZpZ0NvbHVtbil7XG5cbiAgICBjb25zdCBkYXRhID0gY29sLmZpZWxkRHJvcERvd25Db250cm9sPy5maWVsZENvbnRyb2xEcm9wZG93blNvdXJjZVxuICAgIGNvbnN0IGlkb2JqZXRvID0gY29sLmZpZWxkRHJvcERvd25Db250cm9sPy5pZG9iamV0b1xuICAgIGNvbnN0IGRlc2NyaWNhb29iamV0byA9IGNvbC5maWVsZERyb3BEb3duQ29udHJvbD8uZGVzY3JpY2Fvb2JqZXRvXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHZhbG9yQXR1YWwgPSByb3dEYXRhW2NvbC5maWVsZF1cblxuICAgIGlmKGRhdGEgJiYgaWRvYmpldG8gJiYgZGVzY3JpY2Fvb2JqZXRvKVxuICAgIHJldHVybiBkYXRhPy5maW5kKChpdGVtOmFueSkgPT4gaXRlbVtpZG9iamV0b10gPT0gdmFsb3JBdHVhbClbZGVzY3JpY2Fvb2JqZXRvXVxuICAgIGVsc2UgcmV0dXJuICdDYXJyZWdhbmRvJ1xuICB9XG5cblxuICBwdWJsaWMgb25HbG9iYWxGaWx0ZXIodGFibGU6IFRhYmxlLCBldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLm9uRmlsdGVyLmVtaXQoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XG4gICAgdGFibGUuZmlsdGVyR2xvYmFsKChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUsICdjb250YWlucycpO1xuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxuICBvbldpbmRvd1Jlc2l6ZSgpIHtcbiAgICB0aGlzLmFkanVzdFRhYmxlU2l6ZSgpO1xuICAgIHRoaXMudGFtYW5ob1RlbGEgPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgfVxuICBhZGp1c3RUYWJsZVNpemUoKSB7XG4gICAgaWYgKHRoaXMudGFibGVTaXplIDwgODAwKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU2l6ZSA9ICdwLWRhdGF0YWJsZS1zbSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTaXplID0gJyc7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBwYWdpbmF0ZSgkZXZlbnQ6IGFueSkge1xuICAgIGlmICgkZXZlbnQpIHtcbiAgICAgIGxldCBwYWdpbmFJbmljaWFsID1cbiAgICAgICAgKCRldmVudD8uZmlyc3QgPiAwID8gJGV2ZW50LmZpcnN0IC8gJGV2ZW50LnJvd3MgOiAkZXZlbnQuZmlyc3QpICsgMTtcbiAgICAgIGxldCB0ZXJtb1Blc3F1aXNhID0gJyc7XG4gICAgICBsZXQgb3JkZW5hY2FvID0gJyc7XG5cbiAgICAgIGlmICgkZXZlbnQuZ2xvYmFsRmlsdGVyKSB0ZXJtb1Blc3F1aXNhID0gJGV2ZW50Lmdsb2JhbEZpbHRlcjtcblxuICAgICAgaWYgKCRldmVudC5zb3J0RmllbGQpXG4gICAgICAgIG9yZGVuYWNhbyA9IGAkeyRldmVudC5zb3J0RmllbGR9ICR7XG4gICAgICAgICAgJGV2ZW50LnNvcnRPcmRlciA9PT0gMSA/ICdBU0MnIDogJ0RFU0MnXG4gICAgICAgIH1gO1xuXG4gICAgICBjb25zdCBvYmpldG86IFRhYmxlUGFnaW5hdGUgPSB7XG4gICAgICAgIHBhZ2luYUluaWNpYWw6IHBhZ2luYUluaWNpYWwsXG4gICAgICAgIHRhbWFuaG9QYWdpbmE6ICRldmVudC5yb3dzLFxuICAgICAgICB0ZXJtb1Blc3F1aXNhOiB0ZXJtb1Blc3F1aXNhLFxuICAgICAgICBvcmRlbmFjYW86IG9yZGVuYWNhbyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMub25QYWdpbmF0ZS5lbWl0KG9iamV0byk7XG4gICAgfVxuICB9XG5cbiAgaXNCb29sZWFuRmllbGQocm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbC5maWVsZFR5cGUgPT0gJ2Jvb2xlYW4nO1xuICB9XG5cbiAgaXNDaGlwRmllbGQoY29sOiBUYWJsZUNvbmZpZ0NvbHVtbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2wuZmllbGRUeXBlID09ICdjaGlwJztcbiAgfVxuXG4gIGlzSW1hZ2VGaWVsZChjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgbGV0IHJldG9ybm8gPSBjb2wuZmllbGRUeXBlICYmIGNvbC5maWVsZFR5cGUgPT09ICdpbWFnZScgPyB0cnVlIDogZmFsc2U7XG4gICAgcmV0dXJuIHJldG9ybm87XG4gIH1cbiAgcmV0dXJuUm93Q2xhc3Mocm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKSB7XG4gICAgbGV0IHZhbHVlID0gcm93RGF0YVtjb2wuZmllbGRdO1xuICAgIGxldCByb3dDbGFzczogc3RyaW5nO1xuXG4gICAgdGhpcy50YWJsZVNpemUgPiA4MDAgPyAocm93Q2xhc3MgPSAndGV4dC1iYXNlJykgOiAocm93Q2xhc3MgPSAndGV4dC1zbScpO1xuXG4gICAgaWYgKGNvbC5leHBpcmVkRGF0ZSA9PSB0cnVlKSB7XG4gICAgICBuZXcgRGF0ZSh2YWx1ZSkgPCBuZXcgRGF0ZSgpXG4gICAgICAgID8gKHJvd0NsYXNzID0gcm93Q2xhc3MgKyAnIHRleHQtcmVkLTQwMCBmb250LXNlbWlib2xkJylcbiAgICAgICAgOiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHJvd0NsYXNzO1xuICB9XG4gIHRyYW5zZm9ybVZhbHVlKHJvd0RhdGE6IGFueSwgY29sOiBUYWJsZUNvbmZpZ0NvbHVtbikge1xuICAgIGxldCB2YWx1ZSA9IHJvd0RhdGFbY29sLmZpZWxkXTtcblxuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoIWNvbC5waXBlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChjb2wucGlwZSkge1xuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odmFsdWUsICdkZC9NTS95eXl5Jyk7XG4gICAgICAgIGNhc2UgJ2RlY2ltYWwnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmRlY2ltYWxQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgJzEuMi0yJywgJ3B0LUJSJyk7XG4gICAgICAgIGNhc2UgJ2NwZmNucGonOlxuICAgICAgICAgIHJldHVybiB0aGlzLmNwZkNucGpQaXBlLnRyYW5zZm9ybSh2YWx1ZSk7XG4gICAgICAgIGNhc2UgJ3RlbGVmb25lJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy50ZWxlZm9uZVBpcGUudHJhbnNmb3JtKHZhbHVlKTtcbiAgICAgICAgY2FzZSAnY29kaWdvZmlwZSc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29kaWdvRmlwZVBpcGUudHJhbnNmb3JtKHZhbHVlKTtcbiAgICAgICAgY2FzZSAnbW9uZXknOlxuICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdGFyVmFsb3IodmFsdWUpO1xuICAgICAgICBjYXNlICdwZXJjZW50YWdlJzpcbiAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9ICVgO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGFsaWduQ29sdW5hc0hlYWRlcihjb2w6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKGNvbC5hbGlnbikge1xuICAgICAgaWYgKGNvbC5hbGlnbiA9PSAncmlnaHQnKSByZXR1cm4gJ2p1c3RpZnktY29udGVudDogZW5kJztcbiAgICAgIGVsc2UgcmV0dXJuICcnO1xuICAgIH0gZWxzZSByZXR1cm4gJyc7XG4gIH1cbiAgY2VudHJhbGl6YXJDb2x1bmFzKGNvbDogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoY29sLmNlbnRyYWxpemUpIHtcbiAgICAgIHJldHVybiAndGV4dC1hbGlnbjogY2VudGVyOyAnO1xuICAgIH0gZWxzZSByZXR1cm4gJyc7XG4gIH1cbiAgYWxpZ25Db2x1bmFzKGNvbDogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoY29sLmFsaWduKSB7XG4gICAgICByZXR1cm4gYHRleHQtYWxpZ246ICR7Y29sLmFsaWdufWA7XG4gICAgfSBlbHNlIHJldHVybiAnJztcbiAgfVxuICByZXR1cm5DbGFzc0ljb24ocm93RGF0YTogYW55LCBjb2w6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmV0b3JuYXJSb3cocm93RGF0YSwgY29sLCAnaWNvbnJvdycpO1xuICB9XG5cbiAgcmV0dXJuVG9vbHRpcEljb24ocm93RGF0YTogYW55LCBjb2w6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmV0b3JuYXJSb3cocm93RGF0YSwgY29sLCAndG9vbHRpcGljb25yb3cnKTtcbiAgfVxuICByZXR1cm5DbGFzc0NoaXAocm93RGF0YTogYW55LCBjb2w6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBjaGlwLXN0eWxlIHctYXV0byBib3JkZXItcm91bmQtMnhsIHAtMiB0ZXh0LSR7dGhpcy5yZXRvcm5hclJvdyhcbiAgICAgIHJvd0RhdGEsXG4gICAgICBjb2wsXG4gICAgICAnc3R5bGVjaGlwJ1xuICAgICl9IGJvcmRlci0ke3RoaXMucmV0b3JuYXJSb3cocm93RGF0YSwgY29sLCAnc3R5bGVjaGlwJyl9YDtcbiAgfVxuICByZXRvcm5hclJvdyhyb3dEYXRhOiBhbnksIGNvbDogYW55LCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBfcm93YWN0aW9uID0gdGhpcy5jb25maWcucm93cyA/IHRoaXMuY29uZmlnLnJvd3NbY29sLmZpZWxkXSA6IG51bGw7XG4gICAgY29uc3QgX2ZpZWxkOiBzdHJpbmcgPVxuICAgICAgX3Jvd2FjdGlvbiAmJiBfcm93YWN0aW9uW2ZpZWxkXVxuICAgICAgICA/IF9yb3dhY3Rpb25bZmllbGRdLmNvbnN0cnVjdG9yID09PSBGdW5jdGlvblxuICAgICAgICAgID8gX3Jvd2FjdGlvbltmaWVsZF0uYXBwbHkodGhpcywgW3Jvd0RhdGFdKVxuICAgICAgICAgIDogX3Jvd2FjdGlvbltmaWVsZF1cbiAgICAgICAgOiBudWxsO1xuICAgIHJldHVybiBfZmllbGQ7XG4gIH1cbiAgc2VsZWN0aW9uQ2hhbmdlKHZhbHVlID0gW10pIHtcbiAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG4gIGZvcm1hdGFyVmFsb3IodmFsb3I6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KCdwdC1CUicsIHtcbiAgICAgIHN0eWxlOiAnY3VycmVuY3knLFxuICAgICAgY3VycmVuY3k6ICdCUkwnLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQodmFsb3IpO1xuICB9XG4gIGxvYWRJbWFnZShyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4pOiBzdHJpbmcge1xuICAgIC8qXG4gICAgICBOb3NzYSBjb2x1bmEgZGUgaW1hZ2VtIHRyYWJhbGhhIGNvbSBzdHJpbmdzIGRvIHRpcG86IGJhc2U2NCBvdSB1cmxcbiAgICAqL1xuICAgIGxldCByZXRvcm5vID0gYGRhdGE6aW1hZ2UvanBnO2Jhc2U2NCwgJHt0aGlzLmltZ0RlZmF1bHR9YDtcbiAgICBpZiAocm93RGF0YSAmJiBjb2wgJiYgcm93RGF0YVtjb2wuZmllbGRdICYmIHJvd0RhdGFbY29sLmZpZWxkXSAhPT0gJycpIHtcbiAgICAgIGlmIChyb3dEYXRhW2NvbC5maWVsZF0uaW5jbHVkZXMoJ2h0dHAnKSkgcmV0b3JubyA9IHJvd0RhdGFbY29sLmZpZWxkXTtcbiAgICAgIGVsc2UgcmV0b3JubyA9IGBkYXRhOmltYWdlL2pwZztiYXNlNjQsICR7cm93RGF0YVtjb2wuZmllbGRdfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldG9ybm87XG4gIH1cblxuICBnZXRDdXN0b21UZW1wbGF0ZSh0ZW1wbGF0ZW5hbWU6IHN0cmluZyk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZXNbdGVtcGxhdGVuYW1lXTtcbiAgfVxuICBleGliaXJDYW1wbyhmaWVsZDogYW55LCByb3dEYXRhOiBhbnkpIHtcbiAgICBsZXQgdmlzaWJsZSA9IGZpZWxkLnZpc2libGUgPyBmaWVsZC52aXNpYmxlKHJvd0RhdGEpIDogdHJ1ZTtcbiAgICByZXR1cm4gdmlzaWJsZTtcbiAgfVxuICBwdWJsaWMgYWN0aXZlSXRlbShyb3dEYXRhOiBhbnkpIHtcbiAgICB0aGlzLm9uQWN0aXZlSXRlbS5lbWl0KHsgcm93RGF0YTogcm93RGF0YX0pO1xuICB9XG4gIHB1YmxpYyBhY3RpdmVJdGVtTG90ZShyb3dEYXRhOiBhbnkpIHtcbiAgICB0aGlzLm9uQWN0aXZlSXRlbUxvdGUuZW1pdChyb3dEYXRhKTtcbiAgfVxuXG4gIHJldG9ybmFyQ2FtcG8oYWN0aW9uOiBLdk1lbnVJdGVtLCByb3dEYXRhOiBhbnksIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IF9mdW5jdGlvbiA9IGFjdGlvbi5keW5hbWljZmllbGRzXG4gICAgICA/IChhY3Rpb24uZHluYW1pY2ZpZWxkc1tmaWVsZF0gYXMgRnVuY3Rpb24pXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgX2ZpZWxkOiBzdHJpbmcgPSBfZnVuY3Rpb25cbiAgICAgID8gX2Z1bmN0aW9uLmFwcGx5KGFjdGlvbiwgW3Jvd0RhdGFdKVxuICAgICAgOiBhY3Rpb25bZmllbGRdO1xuICAgIHJldHVybiBfZmllbGQ7XG4gIH1cbiAgY2FsbERpc2FibGVkKGFjdGlvbjogS3ZNZW51SXRlbSwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKGFjdGlvbj8uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBhY3Rpb24uZGlzYWJsZWQoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjcmlhck1lbnVzTW9kYWwoZGF0YTogYW55KSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmFjdGlvbnMgJiYgZGF0YSkge1xuICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmNvbmZpZy5hY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGljb24gPSB0aGlzLnJldG9ybmFyQ2FtcG8oYWN0aW9uLCBkYXRhLCAnaWNvbicpO1xuICAgICAgICBjb25zdCB0b29sdGlwID0gdGhpcy5yZXRvcm5hckNhbXBvKGFjdGlvbiwgZGF0YSwgJ3Rvb2x0aXAnKTtcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLnJldG9ybmFyQ2FtcG8oYWN0aW9uLCBkYXRhLCAnbGFiZWwnKTtcbiAgICAgICAgY29uc3QgY29tbWFuZDogYW55ID0gdGhpcy5yZXRvcm5hckNhbXBvKGFjdGlvbiwgZGF0YSwgJ2NvbW1hbmQnKTtcbiAgICAgICAgY29uc3QgdmlzaWJsZTogYm9vbGVhbiA9IGFjdGlvbi52aXNpYmxlXG4gICAgICAgICAgPyBhY3Rpb24udmlzaWJsZShkYXRhKVxuICAgICAgICAgIDogdHJ1ZTtcbiAgICAgICAgY29uc3QgZGlzYWJsZWQ6IGJvb2xlYW4gPSBhY3Rpb24uZGlzYWJsZWRcbiAgICAgICAgICA/IGFjdGlvbi5kaXNhYmxlZChkYXRhKVxuICAgICAgICAgIDogZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbWVudUluc2VydDogS3ZNZW51SXRlbSA9IHtcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBpY29uLFxuICAgICAgICAgIHRvb2x0aXAsXG4gICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICBkaXNhYmxlZCxcbiAgICAgICAgICB2aXNpYmxlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5tZW51SXRlbXMuZmlsdGVyKFxuICAgICAgICAgICh4KSA9PiB4LmNvbW1hbmQgPT0gbWVudUluc2VydC5jb21tYW5kXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGl0ZW0ubGVuZ3RoID09IDApIHRoaXMubWVudUl0ZW1zLnB1c2gobWVudUluc2VydCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChtZW51SW5zZXJ0LmxhYmVsICE9IGl0ZW1bMF0ubGFiZWwpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMubWVudUl0ZW1zLmluZGV4T2YoaXRlbVswXSk7XG4gICAgICAgICAgICB0aGlzLm1lbnVJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChtZW51SW5zZXJ0LnZpc2libGUgIT0gaXRlbVswXS52aXNpYmxlKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLm1lbnVJdGVtcy5pbmRleE9mKGl0ZW1bMF0pO1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobWVudUluc2VydC5kaXNhYmxlZCAhPSBpdGVtWzBdLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLm1lbnVJdGVtcy5pbmRleE9mKGl0ZW1bMF0pO1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYUxpbmhhQWNhb1ZhemlhKHJvd0RhdGE6IGFueSkge1xuICAgIHZhciBhbGd1bUl0ZW1WaXNpdmVsID0gdGhpcy5jb25maWcuYWN0aW9ucy5zb21lKChhKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGEudmlzaWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gYS52aXNpYmxlKHJvd0RhdGEpID09PSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIFJldG9ybmEgdHJ1ZSBzZSBhLnZpc2libGUocm93RGF0YSkgbsOjbyBleGlzdGlyXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gIWFsZ3VtSXRlbVZpc2l2ZWw7XG4gIH1cblxuXG5cblxuICBkb3VibGVDbGljayhlOiBhbnksIHJvd0RhdGE6IGFueSkge1xuICAgIGxldCBldmVudERvdWJsZUNsaWNrID0geyBldmVudDogZSwgcm93RGF0YTogcm93RGF0YX07XG5cbiAgICBsZXQgYXJyYXk6IHN0cmluZ1tdID0gW107XG4gICAgZS50YXJnZXQuY2xhc3NMaXN0LmZvckVhY2goKHg6IGFueSkgPT4gYXJyYXkucHVzaCh4KSk7XG5cbiAgICAvL2lmIChhcnJheS5maW5kKCh4OiBhbnkpID0+IHggPT0gJ25nLXN0YXItaW5zZXJ0ZWQnKSAhPSB1bmRlZmluZWQpXG4gICAgdGhpcy5kb3VibGVDbGlja0V2ZW50LmVtaXQoZXZlbnREb3VibGVDbGljayk7XG4gIH1cblxuICBpc0Rpc2FibGVkQ2hlY2tib3gocm93RGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRpc2FibGVDb250cm9sQ2hlY2tib3hGdW5jdGlvblxuICAgICAgPyB0aGlzLmNvbmZpZy5kaXNhYmxlQ29udHJvbENoZWNrYm94RnVuY3Rpb24ocm93RGF0YSlcbiAgICAgIDogZmFsc2U7XG4gIH1cblxuXG4gIHJldHVyblRvb2x0aXBSb3cocm93RGF0YTogYW55LCBjb2w6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucmV0b3JuYXJSb3cocm93RGF0YSwgY29sLCAndG9vbHRpcHJvdycpO1xuICB9XG5cbiAgaXNTd2l0Y2hGaWVsZChjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgbGV0IHJldG9ybm8gPSBjb2wuZmllbGRUeXBlICYmIGNvbC5maWVsZFR5cGUgPT09ICdzd2l0Y2gnID8gdHJ1ZSA6IGZhbHNlO1xuICAgIHJldHVybiByZXRvcm5vO1xuICB9XG4gIG9uU3dpdGNoQ2hhbmdlKGVzdGFkbzogYW55LCByb3dEYXRhOiBib29sZWFuLCBjb2w6IGFueSkge1xuICAgIHRoaXMub25Td2l0Y2hUYWJsZUNoYW5nZS5lbWl0KHtcbiAgICAgIGVzdGFkbzogZXN0YWRvLFxuICAgICAgcm93RGF0YTogcm93RGF0YSxcbiAgICAgIGNvbDogY29sXG4gICAgfSlcbiAgfVxuICBpc0J1dHRvbkRpc2FibGUoYWN0aW9uOiBhbnksIHJvd0RhdGE6IGFueSwgY29tbWFuZEV2ZW50OiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLmNhbGxEaXNhYmxlZChhY3Rpb24sIHJvd0RhdGEpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIHJldHVybiB0aGlzLmFjdGl2ZUl0ZW0ocm93RGF0YSksIGFjdGlvbj8uY29tbWFuZChjb21tYW5kRXZlbnQpO1xuICB9XG4gIGlzRGlzYWJsZUVkaXRSb3dGdW5jdGlvbihyb3dEYXRhOiBhbnkpOiBib29sZWFuIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRpc2FibGVFZGl0Um93RnVuY3Rpb24gPyB0aGlzLmNvbmZpZy5kaXNhYmxlRWRpdFJvd0Z1bmN0aW9uKHJvd0RhdGEpIDogZmFsc2U7XG4gIH1cblxufVxuIiwiXG48ZGl2IGNsYXNzPVwiY2FyZFwiID5cbiAgPHAtdG9hc3Q+PC9wLXRvYXN0PlxuXG4gIDxwLXBhbmVsXG4gICAgKm5nSWY9XCJmaWx0cm9zQXZhbmNhZG9zXCJcbiAgICBoZWFkZXI9XCJGaWx0cm9zIGF2YW7Dp2Fkb3NcIlxuICAgIFt0b2dnbGVhYmxlXT1cInRydWVcIlxuICAgIFtjb2xsYXBzZWRdPVwidHJ1ZVwiXG4gICAgKGNvbGxhcHNlZENoYW5nZSk9XCJjb2xsYXBzZWQgPSAhY29sbGFwc2VkXCJcbiAgICBbc3R5bGVdPVwieyAnbWFyZ2luLWJvdHRvbSc6ICcycHgnIH1cIlxuICA+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlcmljb25zXCI+XG4gICAgICA8aVxuICAgICAgICAqbmdJZj1cIiFjb2xsYXBzZWRcIlxuICAgICAgICBjbGFzcz1cInBpIHBpLWZpbHRlclwiXG4gICAgICA+PC9pPlxuICAgICAgPCEtLSDDjWNvbmUgcXVhbmRvIG8gcGFpbmVsIGVzdMOhIGFiZXJ0byAtLT5cbiAgICAgIDxpXG4gICAgICAgICpuZ0lmPVwiY29sbGFwc2VkXCJcbiAgICAgICAgY2xhc3M9XCJwaSBwaS1taW51c1wiXG4gICAgICA+PC9pPlxuICAgICAgPCEtLSDDjWNvbmUgcXVhbmRvIG8gcGFpbmVsIGVzdMOhIGZlY2hhZG8gLS0+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvcC1wYW5lbD5cblxuICA8cC10YWJsZVxuICAjdGVcbiAgKm5nSWY9XCJjb25maWdcIlxuICBbdmFsdWVdPVwiZGF0YVNvdXJjZVwiXG4gIGRhdGFLZXk9XCJpZFwiXG4gIFt0YWJsZVN0eWxlXT1cInsgJ21pbi13aWR0aCc6ICc1MHJlbScgfVwiXG4gIFtjb2x1bW5zXT1cImNvbmZpZy5jb2x1bW5zXCJcbiAgW2VkaXRNb2RlXT1cIidyb3cnXCJcbiAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXG4gIHNjcm9sbEhlaWdodD1cIjQwMHB4XCJcbiAgYXBwZW5kVG89XCJib2R5XCJcbiAgW3N0eWxlQ2xhc3NdPVwiJ3AtZGF0YXRhYmxlLXNtJ1wiXG4gIFsoc2VsZWN0aW9uKV09XCJzZWxlY3RlZEl0ZW1zXCJcbiAgW3Jvd1NlbGVjdGFibGVdPVwiaXNSb3dTZWxlY3RhYmxlXCJcbiAgW2dsb2JhbEZpbHRlckZpZWxkc109XCJnbG9iYWxGaWx0ZXJGaWVsZHNcIlxuICBbcm93c109XCJyb3dzXCJcbiAgW3BhZ2luYXRvcl09XCJwYWdpbmF0b3JcIlxuICBbcm93c1BlclBhZ2VPcHRpb25zXT1cInJvd3NQZXJQYWdlT3B0aW9uc1wiXG4gIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXG4gIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IC0ge2xhc3R9IGRlIHt7IHRvdGFsUmVjb3JkcyB9fVwiXG4gIChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICBbcm93SG92ZXJdPVwidHJ1ZVwiXG4gIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcbiAgW2xhenldPVwiY29uZmlnLmxhenlcIlxuICAob25MYXp5TG9hZCk9XCJwYWdpbmF0ZSgkZXZlbnQpXCJcbiAgW2dyb3VwUm93c0J5XT1cImNvbmZpZy5maWVsZEdyb3VwXCJcbiAgW3Nob3dGaXJzdExhc3RJY29uXT1cInNob3dGaXJzdExhc3RJY29uXCJcbiAgW3BhZ2VMaW5rc109XCJwYWdlTGlua3NPcHRpb25zXCJcbiAgW3Njcm9sbGFibGVdPVwiaXNUYWJsZVNjcm9sbGFibGVcIlxuICBbc2Nyb2xsSGVpZ2h0XT1cInNjcm9sbEhlaWdodFwiXG4gIFtyb3dUcmFja0J5XT1cInJvd1RyYWNrQnkgXCJcbiAgPlxuXG5cblxuICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG5cbiAgICA8bmctdGVtcGxhdGVcbiAgICAgIHBUZW1wbGF0ZT1cImNhcHRpb25cIlxuICAgICAgKm5nSWY9XCJjb25maWcuZW5hYmxlQ2F0aW9uXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBmbGV4LXdyYXAganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGdyaWQgZm9ybWdyaWQgcC1mbHVpZCBjb2wtMTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBmbGV4IGZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJjb25maWcudGl0bGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LW1kIGZvbnQtYm9sZCBteS0zXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBjb25maWcudGl0bGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImNvbmZpZy5zdWJ0aXRsZVwiXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtc20gbWItNCBmb250LW1lZGl1bVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgY29uZmlnLnN1YnRpdGxlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciBtZDpjb2wtNiBsZzpjb2wtNCB7e1xuICAgICAgICAgICAgdGFtYW5ob1RlbGEgPCA3NjggPyAnY29sLTEwJyA6ICdjb2wtMTInXG4gICAgICAgICAgfX0gbXQtMSBtYi0yIFwiPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cImNvbmZpZy5lbmFibGVGaWx0ZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0LWljb24tbGVmdFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1zZWFyY2hcIj48L2k+XG5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgIHBBdXRvRm9jdXNcbiAgICAgICAgICAgICAgW2F1dG9mb2N1c109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25HbG9iYWxGaWx0ZXIodGUsICRldmVudClcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBlc3F1aXNhci4uLlwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaC0ycmVtXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGNvbC0xIGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGNvbmZpZy5hY3Rpb25zTG90ZVwiXG4gICAgICAgICAgICBjbGFzcz1cImJ0bnMtb3B0aW9uc1wiXG4gICAgICAgICAgICBbc3R5bGVdPVwieyAnbWFyZ2luLXJpZ2h0JzogJzdweCcgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBpZD1cImFjdGlvbkxvdGVCdG5zXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgfHwgYWN0aW9uLnNob3dBY29lc0xvdGUpICYmXG4gICAgICAgICAgICAgICAgZXhpYmlyQ2FtcG8oYWN0aW9uLCB0aGlzLmFjdGlvbilcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb25Mb3RlQnRucyBwLWJ1dHRvbi1yYWlzZWQgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICBhY3Rpb24/LmNvbW1hbmQoY29tbWFuZEV2ZW50KTsgYWN0aXZlSXRlbUxvdGUoc2VsZWN0ZWRJdGVtcylcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJldG9ybmFyQ2FtcG8oYWN0aW9uLCBzZWxlY3RlZEl0ZW1zLCAndG9vbHRpcCcpXCJcbiAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCInYm90dG9tJ1wiXG4gICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiXG4gICAgICAgICAgICAgICAgcmV0b3JuYXJDYW1wbyhhY3Rpb24sIHNlbGVjdGVkSXRlbXMsICdidG5Db2xvcicpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZXRvcm5hckNhbXBvKGFjdGlvbiwgc2VsZWN0ZWRJdGVtcywgJ2Rpc2FibGVkJylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBtZC0yMlwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIlxuICAgICAgICAgICAgICAgICAgcmV0b3JuYXJDYW1wbyhhY3Rpb24sIHNlbGVjdGVkSXRlbXMsICdpY29uQnRuQ29sb3InKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyByZXRvcm5hckNhbXBvKGFjdGlvbiwgc2VsZWN0ZWRJdGVtcywgXCJpY29uXCIpIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGVcbiAgICAgIHBUZW1wbGF0ZT1cImhlYWRlclwiXG4gICAgICBsZXQtY29sdW1uc1xuICAgID5cbiAgICAgIDx0cj5cbiAgICAgICAgPHRoXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNHJlbTsgYm9yZGVyLWxlZnQ6IHNvbGlkIDRweCB0cmFuc3BhcmVudFwiXG4gICAgICAgICAgKm5nSWY9XCJjb25maWcuZW5hYmxlU2VsZWN0XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggKGNsaWNrKT1cImFjdGl2ZUl0ZW1Mb3RlKHNlbGVjdGVkSXRlbXMpXCI+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XG4gICAgICAgIDwvdGg+XG5cbiAgICAgICAgPHRoXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcbiAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uXT1cImNvbC5maWVsZFwiXG4gICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbkRpc2FibGVkXT1cImNvbC5zb3J0YWJsZSA9PT0gZmFsc2VcIlxuICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sLndpZHRoXCJcbiAgICAgICAgICBjbGFzcz1cInRleHQtc21cIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2NsYXNzXT1cIlxuICAgICAgICAgICAgICBjZW50cmFsaXphckNvbHVuYXMoY29sKSAmJiBhbGlnbkNvbHVuYXNIZWFkZXIoY29sKSA9PSAnJ1xuICAgICAgICAgICAgICAgID8gJ2ZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWNlbnRlcidcbiAgICAgICAgICAgICAgICA6ICdmbGV4IGZsZXgtcm93J1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJhbGlnbkNvbHVuYXNIZWFkZXIoY29sKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4+e3sgY29sLmhlYWRlciB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxwLXNvcnRJY29uXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29sLnNvcnRhYmxlID09PSB0cnVlXCJcbiAgICAgICAgICAgICAgW2ZpZWxkXT1cImNvbC5maWVsZFwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxMHB4XCJcbiAgICAgICAgICAgID48L3Atc29ydEljb24+XG5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29sLmhlYWRlclRvb2x0aXBcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiY29sLmhlYWRlclRvb2x0aXBcIlxuICAgICAgICAgICAgPmluZm88L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0aCAqbmdJZj1cImNvbmZpZy5hY3Rpb25zICYmIGNvbmZpZy5hY3Rpb25zLmxlbmd0aCA+IDBcIj48L3RoPlxuICAgICAgICA8dGggaWQ9XCJ0aC1lZGl0XCIgc3R5bGU9XCJ3aWR0aDogMjBweFwiPkVkaXRhcjwvdGg+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cblxuICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG5cblxuXG5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dEYXRhIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1yaT1cInJvd0luZGV4XCIgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgIGxldC1yb3dncm91cD1cInJvd2dyb3VwXCIgbGV0LXJvd3NwYW49XCJyb3dzcGFuXCI+XG4gICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJyb3dEYXRhXCIgW3BFZGl0YWJsZVJvd0Rpc2FibGVkXT1cImZhbHNlXCIgPlxuXG5cbiAgICAgICAgPHRkXG4gICAgICAgICAgKm5nSWY9XCJjb25maWcuZW5hYmxlU2VsZWN0XCJcbiAgICAgICAgICBbc3R5bGVdPVwiYXBwbHlTdHlsZShyb3dEYXRhLCB7IGZpZWxkOiAnY2hlY2stYm94JywgaGVhZGVyOiAnJyB9KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8IS0tPHAtdGFibGVDaGVja2JveCAqbmdJZj1cImlzVmlzaWJsZUNoZWNrYm94KHJvd0RhdGEpXCItLT5cbiAgICAgICAgICA8cC10YWJsZUNoZWNrYm94XG4gICAgICAgICAgICBbdmFsdWVdPVwicm93RGF0YVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZENoZWNrYm94KHJvd0RhdGEpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVJdGVtTG90ZShzZWxlY3RlZEl0ZW1zKVwiXG4gICAgICAgICAgPjwvcC10YWJsZUNoZWNrYm94PlxuICAgICAgICA8L3RkPlxuXG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7IGxldCBpID0gaW5kZXhcIj5cblxuXG5cblxuXG5cbiAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG4gICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cblxuICAgICAgICAgIDwhLS0gQ2VsdWxhIHF1ZSBhcm1hemVuYSBvcyBjb250cm9sZXMgZGUgZWRpw6fDo28gcGFyYSBvcyBjYW1wb3MgLS0+XG4gICAgICAgICAgPHRkICpuZ0lmPVwiY29sLmZpZWxkQ29udHJvbFR5cGVcIlxuICAgICAgICAgIGNsYXNzPVwicm93VGFibGVcIiBbc3R5bGVdPVwiXG4gICAgICAgICAgYXBwbHlTdHlsZShyb3dEYXRhLCBjb2wpICtcbiAgICAgICAgICBjZW50cmFsaXphckNvbHVuYXMoY29sKSArXG4gICAgICAgICAgYWxpZ25Db2x1bmFzKGNvbCkgXCIgW3BUb29sdGlwXT1cInJldHVyblRvb2x0aXBSb3cocm93RGF0YSwgY29sKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHAtY2VsbEVkaXRvciBbbmdDbGFzc109XCJ7J3N3aXRjaCc6IGNvbC5maWVsZENvbnRyb2xUeXBlID09ICdzd2l0Y2gnfVwiPlxuICAgICAgICAgICAgICA8IS0tIENvbnRyb2xlIGRlIGVkacOnw6NvIGRvIGNhbXBvIC0tPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2wuZmllbGRDb250cm9sVHlwZVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHQnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxrdi1pbnB1dC10ZXh0IFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuZmllbGRdXCIgW3JlcXVpcmVkXT1cImNvbC5yZXF1aXJlZCA/PyB0cnVlXCI+PC9rdi1pbnB1dC10ZXh0PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XG4gICAgICAgICAgICAgICAgICAgIDxrdi1pbnB1dC1udW1iZXIgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5maWVsZF1cIiBbcmVxdWlyZWRdPVwiY29sLnJlcXVpcmVkID8/IHRydWVcIj48L2t2LWlucHV0LW51bWJlcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbWFzaydcIj5cbiAgICAgICAgICAgICAgICAgICAgPGt2LWlucHV0LW1hc2sgW21hc2tdPVwiY29sLm1hc2tcIiBbcmVxdWlyZWRdPVwiY29sLnJlcXVpcmVkID8/IHRydWVcIiBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmZpZWxkXVwiPjwva3YtaW5wdXQtbWFzaz5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3dpdGNoJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8a3Ytc3dpdGNoIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuZmllbGRdXCIgPjwva3Ytc3dpdGNoPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjYWxlbmRhcidcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiAzMDBweFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxrdi1pbnB1dC1jYWxlbmRhciBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmZpZWxkXVwiPjwva3YtaW5wdXQtY2FsZW5kYXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd24nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMzAwcHhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJjb2wuZmllbGREcm9wRG93bkNvbnRyb2wuZGVzY3JpY2Fvb2JqZXRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJjb2wuZmllbGREcm9wRG93bkNvbnRyb2wuaWRvYmpldG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiY29sLmZpZWxkRHJvcERvd25Db250cm9sLmZpZWxkQ29udHJvbERyb3Bkb3duU291cmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuZmllbGRdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgPCEtLSBWYWxvciBhdHVhbCBkbyBjYW1wbyAtLT5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbC5maWVsZENvbnRyb2xUeXBlXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd24nXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgIHJldG9ybmFEZXNjcmljYW9Ecm9wKFxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhLFxuICAgICAgICAgICAgICAgICAgICBjb2xcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA8IS0tIHt7cm93RGF0YVtjb2wuZmllbGRdfX0gLS0+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N3aXRjaCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGt2LXN3aXRjaCBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmZpZWxkXVwiIFtkaXNhYmxlZF09XCJ0cnVlXCI+PC9rdi1zd2l0Y2g+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NhbGVuZGFyJ1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyByb3dEYXRhW2NvbC5maWVsZF0gfCBkYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgICAgICAgICB7eyByb3dEYXRhW2NvbC5maWVsZF0gfX1cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgPC90ZD5cblxuXG4gICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgIDx0ZCAqbmdJZj1cInJvd2dyb3VwICYmICFjb2wudGVtcGxhdGUgJiYgIWNvbC5maWVsZENvbnRyb2xUeXBlXCIgW2F0dHIucm93c3Bhbl09XCJyb3dncm91cCAmJiBjb2wuZ3JvdXBlZCA/IHJvd3NwYW4gOiBudWxsXCJcbiAgICAgICAgICAgIGNsYXNzPVwicm93VGFibGVcIiBbc3R5bGVdPVwiXG4gICAgICAgICAgICAgIGFwcGx5U3R5bGUocm93RGF0YSwgY29sKSArXG4gICAgICAgICAgICAgIGNlbnRyYWxpemFyQ29sdW5hcyhjb2wpICtcbiAgICAgICAgICAgICAgYWxpZ25Db2x1bmFzKGNvbClcbiAgICAgICAgICAgIFwiIFtwVG9vbHRpcF09XCJyZXR1cm5Ub29sdGlwUm93KHJvd0RhdGEsIGNvbClcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wuaGVhZGVyIH19Ojwvc3Bhbj5cblxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNCb29sZWFuRmllbGQocm93RGF0YSwgY29sKTsgZWxzZSBib29sZWFuRmllbGRcIiBbY2xhc3NdPVwicmV0dXJuUm93Q2xhc3Mocm93RGF0YSwgY29sKVwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgIWlzQ2hpcEZpZWxkKGNvbCkgJiYgIWNvbC5pY29uRmllbGQgJiYgIWlzSW1hZ2VGaWVsZChjb2wpXG4gICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjb2wuaWNvblwiIFtjbGFzc109XCJjb2wuaWNvbiArICcgbXItMidcIj48L2k+XG4gICAgICAgICAgICAgICAge3sgdHJhbnNmb3JtVmFsdWUocm93RGF0YSwgY29sKSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ2hpcEZpZWxkKGNvbCkgJiYgIWNvbC5pY29uRmllbGRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwicmV0dXJuQ2xhc3NDaGlwKHJvd0RhdGEsIGNvbClcIiBbcFRvb2x0aXBdPVwicmV0dXJuVG9vbHRpcEljb24ocm93RGF0YSwgY29sKVwiPnt7XG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhLCBjb2wpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0ltYWdlRmllbGQoY29sKVwiPlxuICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1hZ2VcIiBbc3JjXT1cImxvYWRJbWFnZShyb3dEYXRhLCBjb2wpXCIgLz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICA8aSAqbmdJZj1cImNvbC5pY29uRmllbGRcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ21hdGVyaWFsLWljb25zJzogY29sLmluZEljb25NYXRlcmlhbCxcbiAgICAgICAgICAgICAgICAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBtci0yJzogIWNvbC5pbmRJY29uTWF0ZXJpYWxcbiAgICAgICAgICAgICAgfVwiIFtwVG9vbHRpcF09XCJyZXR1cm5Ub29sdGlwSWNvbihyb3dEYXRhLCBjb2wpXCI+XG4gICAgICAgICAgICAgIHt7IHJldHVybkNsYXNzSWNvbihyb3dEYXRhLCBjb2wpIH19XG4gICAgICAgICAgICA8L2k+XG5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYm9vbGVhbkZpZWxkPlxuICAgICAgICAgICAgICA8aSAqbmdJZj1cIiFjb2wuaWNvbkZpZWxkICYmICFpc1N3aXRjaEZpZWxkKGNvbClcIiBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgICAgIHJvd0RhdGFbY29sLmZpZWxkXSA/ICd0ZXh0LWdyZWVuLTUwMCcgOiAndGV4dC1yZWQtNTAwJ1xuICAgICAgICAgICAgICAgIFwiPjxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPlxuICAgICAgICAgICAgICAgICAge3sgcm93RGF0YVtjb2wuZmllbGRdID8gXCJjaGVja1wiIDogXCJjbG9zZVwiIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2k+XG5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1N3aXRjaEZpZWxkKGNvbClcIiBbY2xhc3NdPVwicmV0dXJuUm93Q2xhc3Mocm93RGF0YSwgY29sKVwiPlxuICAgICAgICAgICAgICAgIDxrdi1zd2l0Y2ggKG9uU3dpdGNoQ2hhbmdlKT1cIm9uU3dpdGNoQ2hhbmdlKCRldmVudCwgcm93RGF0YSwgY29sKVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sPy5vbmx5UmVhZEZpZWxkID8/IHRydWVcIiBbc3dpdGNoVmFsdWVdPVwidHJhbnNmb3JtVmFsdWUocm93RGF0YSwgY29sKVwiPlxuICAgICAgICAgICAgICAgIDwva3Ytc3dpdGNoPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgICA8dGQgKm5nSWY9XCIhcm93Z3JvdXAgJiYgIWNvbC5ncm91cGVkICYmICFjb2wudGVtcGxhdGUgJiYgIWNvbC5maWVsZENvbnRyb2xUeXBlXCIgW3N0eWxlXT1cIlxuICAgICAgICAgICAgICBhcHBseVN0eWxlKHJvd0RhdGEsIGNvbCkgK1xuICAgICAgICAgICAgICBjZW50cmFsaXphckNvbHVuYXMoY29sKSArXG4gICAgICAgICAgICAgIGFsaWduQ29sdW5hcyhjb2wpXG4gICAgICAgICAgICBcIiBjbGFzcz1cInJvd1RhYmxlXCIgW3BUb29sdGlwXT1cInJldHVyblRvb2x0aXBSb3cocm93RGF0YSwgY29sKVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5oZWFkZXIgfX06PC9zcGFuPlxuXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0Jvb2xlYW5GaWVsZChyb3dEYXRhLCBjb2wpOyBlbHNlIGJvb2xlYW5GaWVsZFwiIFtjbGFzc109XCJyZXR1cm5Sb3dDbGFzcyhyb3dEYXRhLCBjb2wpXCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAhaXNDaGlwRmllbGQoY29sKSAmJiAhY29sLmljb25GaWVsZCAmJiAhaXNJbWFnZUZpZWxkKGNvbClcbiAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICA8aSAqbmdJZj1cImNvbC5pY29uXCIgW2NsYXNzXT1cImNvbC5pY29uICsgJyBtci0yJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICB7eyB0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhLCBjb2wpIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDaGlwRmllbGQoY29sKSAmJiAhY29sLmljb25GaWVsZFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJyZXR1cm5DbGFzc0NoaXAocm93RGF0YSwgY29sKVwiIFtwVG9vbHRpcF09XCJyZXR1cm5Ub29sdGlwSWNvbihyb3dEYXRhLCBjb2wpXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhLCBjb2wpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0ltYWdlRmllbGQoY29sKVwiPlxuICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1hZ2VcIiBbc3JjXT1cImxvYWRJbWFnZShyb3dEYXRhLCBjb2wpXCIgLz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICA8aSAqbmdJZj1cImNvbC5pY29uRmllbGRcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ21hdGVyaWFsLWljb25zJzogY29sLmluZEljb25NYXRlcmlhbCxcbiAgICAgICAgICAgICAgICAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBtci0yJzogIWNvbC5pbmRJY29uTWF0ZXJpYWxcbiAgICAgICAgICAgICAgfVwiIFtwVG9vbHRpcF09XCJyZXR1cm5Ub29sdGlwSWNvbihyb3dEYXRhLCBjb2wpXCI+XG4gICAgICAgICAgICAgIHt7IHJldHVybkNsYXNzSWNvbihyb3dEYXRhLCBjb2wpIH19XG4gICAgICAgICAgICA8L2k+XG5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYm9vbGVhbkZpZWxkPlxuICAgICAgICAgICAgICA8aSAqbmdJZj1cIiFjb2wuaWNvbkZpZWxkICYmICFpc1N3aXRjaEZpZWxkKGNvbClcIiBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgICAgIHJvd0RhdGFbY29sLmZpZWxkXSA/ICd0ZXh0LWdyZWVuLTUwMCcgOiAndGV4dC1yZWQtNTAwJ1xuICAgICAgICAgICAgICAgIFwiPjxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPlxuICAgICAgICAgICAgICAgICAge3sgcm93RGF0YVtjb2wuZmllbGRdID8gXCJjaGVja1wiIDogXCJjbG9zZVwiIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2k+XG5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1N3aXRjaEZpZWxkKGNvbClcIiBbY2xhc3NdPVwicmV0dXJuUm93Q2xhc3Mocm93RGF0YSwgY29sKVwiPlxuICAgICAgICAgICAgICAgIDxrdi1zd2l0Y2ggKG9uU3dpdGNoQ2hhbmdlKT1cIm9uU3dpdGNoQ2hhbmdlKCRldmVudCwgcm93RGF0YSwgY29sKVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sPy5vbmx5UmVhZEZpZWxkID8/IHRydWVcIiBbc3dpdGNoVmFsdWVdPVwidHJhbnNmb3JtVmFsdWUocm93RGF0YSwgY29sKVwiPlxuICAgICAgICAgICAgICAgIDwva3Ytc3dpdGNoPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgICA8dGQgKm5nSWY9XCJjb2wudGVtcGxhdGUgJiYgIWNvbC5maWVsZENvbnRyb2xUeXBlXCIgW3N0eWxlXT1cIlxuICAgICAgICAgICAgICBhcHBseVN0eWxlKHJvd0RhdGEsIGNvbCkgK1xuICAgICAgICAgICAgICBjZW50cmFsaXphckNvbHVuYXMoY29sKSArXG4gICAgICAgICAgICAgIGFsaWduQ29sdW5hcyhjb2wpXG4gICAgICAgICAgICBcIiBjbGFzcz1cInJvd1RhYmxlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmhlYWRlciB9fTo8L3NwYW4+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q3VzdG9tVGVtcGxhdGUoY29sLnRlbXBsYXRlLm5hbWUpXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0Q3VzdG9tVGVtcGxhdGUoY29sLnRlbXBsYXRlLm5hbWUpXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3dEYXRhIH1cIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuXG5cblxuXG5cblxuICAgICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgPCEtLSBDb250cm9sZSBkZSBhw6fDo28gIC0tPlxuICAgICAgPHRkIGNsYXNzPVwidGQtdG9vbHNcIlxuICAgICAgICAqbmdJZj1cImNvbmZpZy5hY3Rpb25zICYmIGNvbmZpZy5hY3Rpb25zLmxlbmd0aCA+IDAgJiYgIWVkaXRpbmdcIlxuICAgICAgICBbc3R5bGVdPVwiYXBwbHlTdHlsZShyb3dEYXRhLCB7IGZpZWxkOiAnYnRucy1vcHRpb25zJywgaGVhZGVyOiAnJyB9KVwiXG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWVuZCB3LWZ1bGwgZ2FwLTFcIlxuICAgICAgICAgICpuZ0lmPVwiYWNvZXNMaW5oYVRhYmVsYVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGNvbmZpZy5hY3Rpb25zXCJcbiAgICAgICAgICAgIGNsYXNzPVwibXItMVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPCEtLSA8YnV0dG9uXG4gICAgICAgICAgICAgIGlkPVwiYWN0aW9uQnRuc1wiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJleGliaXJDYW1wbyhhY3Rpb24sIHJvd0RhdGEpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb25CdG5zIHAtYnV0dG9uLXRleHQgcC1idXR0b24tcmFpc2VkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2ZUl0ZW0ocm93RGF0YSk7IGFjdGlvbj8uY29tbWFuZChjb21tYW5kRXZlbnQpXCJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJldG9ybmFyQ2FtcG8oYWN0aW9uLCByb3dEYXRhLCAndG9vbHRpcCcpXCJcbiAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJcbiAgICAgICAgICAgICAgICBhY3Rpb24udG9vbHRpcFBvc2l0aW9uID8gYWN0aW9uLnRvb2x0aXBQb3NpdGlvbiA6ICdib3R0b20nXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjYWxsRGlzYWJsZWQoYWN0aW9uLCByb3dEYXRhKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBtZC0xOVwiPlxuICAgICAgICAgICAgICAgIHt7IHJldG9ybmFyQ2FtcG8oYWN0aW9uLCByb3dEYXRhLCBcImljb25cIikgfX08L3NwYW5cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9idXR0b24+IC0tPlxuXG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQge3tcbiAgICAgICAgICAgICAgICBjYWxsRGlzYWJsZWQoYWN0aW9uLCByb3dEYXRhKVxuICAgICAgICAgICAgICAgICAgPyAndGV4dC1ncmF5LTQwMCBjdXJzb3ItYXV0bydcbiAgICAgICAgICAgICAgICAgIDogJ2N1cnNvci1wb2ludGVyJ1xuICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImlzQnV0dG9uRGlzYWJsZShhY3Rpb24sIHJvd0RhdGEsIGNvbW1hbmRFdmVudClcIlxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicmV0b3JuYXJDYW1wbyhhY3Rpb24sIHJvd0RhdGEsICd0b29sdGlwJylcIlxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cIlxuICAgICAgICAgICAgICAgIGFjdGlvbi50b29sdGlwUG9zaXRpb24gPyBhY3Rpb24udG9vbHRpcFBvc2l0aW9uIDogJ2JvdHRvbSdcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgcmV0b3JuYXJDYW1wbyhhY3Rpb24sIHJvd0RhdGEsIFwiaWNvblwiKSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtZW5kIHctZnVsbFwiXG4gICAgICAgICAgKm5nSWY9XCIhYWNvZXNMaW5oYVRhYmVsYVwiXG4gICAgICAgID5cbiAgICAgICAgICA8IS0tIDxidXR0b25cbiAgICAgICAgICAgIGlkPVwibW9yZVZlcnRCdG5cIlxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb25CdG5zIHAtYnV0dG9uLXRleHQgcC1idXR0b24tcmFpc2VkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJtZW51LnRvZ2dsZSgkZXZlbnQpOyBhY3RpdmVJdGVtKHJvd0RhdGEpXCJcbiAgICAgICAgICA+IC0tPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgY3Vyc29yLXBvaW50ZXIgaWNvbi1tb3JlLWhvcml6XCJcbiAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4XCJcbiAgICAgICAgICAgIChjbGljayk9XCJtZW51LnRvZ2dsZSgkZXZlbnQpOyBhY3RpdmVJdGVtKHJvd0RhdGEpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBtb3JlX2hvcml6XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwhLS0gPC9idXR0b24+IC0tPlxuXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGNvbmZpZy5hY3Rpb25zXCI+XG4gICAgICAgICAgICB7eyBjcmlhck1lbnVzTW9kYWwocm93RGF0YSkgfX1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gPGRpdiAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGNvbmZpZy5hY3Rpb25zXCI+XG4gICAgICAgICAgICB7eyBjcmlhck1lbnVzTW9kYWwocm93RGF0YSkgfX1cbiAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICA8cC1tZW51XG4gICAgICAgICAgICAjbWVudVxuICAgICAgICAgICAgW3BvcHVwXT1cInRydWVcIlxuICAgICAgICAgICAgW21vZGVsXT1cIm1lbnVJdGVtc1wiXG4gICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgID48L3AtbWVudT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RkPlxuXG4gICAgICA8dGRcbiAgICAgIGNsYXNzPVwidGQtdG9vbHNcIlxuICAgICAgKm5nSWY9XCJjb25maWcuYWN0aW9ucyAmJiBjb25maWcuYWN0aW9ucy5sZW5ndGggPiAwICYmIGVkaXRpbmdcIlxuICAgICAgW3N0eWxlXT1cImFwcGx5U3R5bGUocm93RGF0YSwgeyBmaWVsZDogJ2J0bnMtb3B0aW9ucycsIGhlYWRlcjogJycgfSlcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1lbmQgdy1mdWxsIGdhcC0xXCJcbiAgICAgICAgKm5nSWY9XCJhY29lc0xpbmhhVGFiZWxhXCJcbiAgICAgID5cblxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtZW5kIHctZnVsbFwiXG4gICAgICAgICpuZ0lmPVwiIWFjb2VzTGluaGFUYWJlbGFcIlxuICAgICAgPlxuICAgICAgPC9kaXY+XG4gICAgICA8L3RkPlxuXG5cblxuICAgICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgPCEtLSBDb250cm9sZSBkZSBlZGnDp8OjbyAtLT5cbiAgICAgICAgPHRkIGNsYXNzPVwidGQtZWRpdFwiID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBbc3R5bGUuaGVpZ2h0XT1cIiczNXB4J1wiIFtzdHlsZS53aWR0aF09XCInMzVweCdcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlRWRpdFJvd0Z1bmN0aW9uKHJvd0RhdGEpXCIgKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcEluaXRFZGl0YWJsZVJvdyBpY29uPVwicGkgcGktcGVuY2lsXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUm93RWRpdEluaXQocm93RGF0YSlcIiBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBbc3R5bGUuaGVpZ2h0XT1cIiczNXB4J1wiIFtzdHlsZS53aWR0aF09XCInMzVweCdcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlRWRpdFJvd0Z1bmN0aW9uKHJvd0RhdGEpXCIgKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwU2F2ZUVkaXRhYmxlUm93IGljb249XCJwaSBwaS1jaGVja1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblJvd0VkaXRTYXZlKHJvd0RhdGEsIHJpKVwiIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXN1Y2Nlc3MgbXItMlwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBbc3R5bGUuaGVpZ2h0XT1cIiczNXB4J1wiIFtzdHlsZS53aWR0aF09XCInMzVweCdcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlRWRpdFJvd0Z1bmN0aW9uKHJvd0RhdGEpXCIgKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwQ2FuY2VsRWRpdGFibGVSb3cgaWNvbj1cInBpIHBpLXRpbWVzXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUm93RWRpdENhbmNlbChyb3dEYXRhLCByaSlcIiBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXJcIj48L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cblxuXG5cblxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L3AtdGFibGU+XG48L2Rpdj5cbiJdfQ==
|