fixa-admin 0.0.1
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/README.md +24 -0
- package/esm2022/lib/class/index.api.mjs +2 -0
- package/esm2022/lib/class/popover.mjs +28 -0
- package/esm2022/lib/components/captcha/captcha.component.mjs +56 -0
- package/esm2022/lib/components/grid/filter/date-filter.component.mjs +122 -0
- package/esm2022/lib/components/grid/filter/index.api.mjs +2 -0
- package/esm2022/lib/components/grid/grid.component.mjs +491 -0
- package/esm2022/lib/components/grid/render/action-button.component.mjs +26 -0
- package/esm2022/lib/components/index.api.mjs +6 -0
- package/esm2022/lib/components/map/map.component.mjs +134 -0
- package/esm2022/lib/components/spinner/spinner.component.mjs +14 -0
- package/esm2022/lib/directive/char-input.directive.mjs +37 -0
- package/esm2022/lib/directive/index.api.mjs +4 -0
- package/esm2022/lib/directive/mask.directive.mjs +58 -0
- package/esm2022/lib/directive/mask.mjs +78 -0
- package/esm2022/lib/directive/numeric-input.directive.mjs +44 -0
- package/esm2022/lib/guard/auth.guard.mjs +25 -0
- package/esm2022/lib/guard/index.api.mjs +2 -0
- package/esm2022/lib/layouts/blank/blank.layout.mjs +14 -0
- package/esm2022/lib/layouts/index.api.mjs +3 -0
- package/esm2022/lib/layouts/master/master.layout.mjs +53 -0
- package/esm2022/lib/models/index.api.mjs +2 -0
- package/esm2022/lib/models/shared.model.mjs +28 -0
- package/esm2022/lib/pipes/date.pipe.mjs +25 -0
- package/esm2022/lib/pipes/index.api.mjs +3 -0
- package/esm2022/lib/pipes/timer.pipe.mjs +30 -0
- package/esm2022/lib/services/confirm.service.mjs +39 -0
- package/esm2022/lib/services/dialog.service.mjs +65 -0
- package/esm2022/lib/services/form.service.mjs +22 -0
- package/esm2022/lib/services/index.api.mjs +6 -0
- package/esm2022/lib/services/shared.service.mjs +15 -0
- package/esm2022/lib/services/toast.service.mjs +21 -0
- package/esm2022/lib/shared.module.mjs +196 -0
- package/esm2022/public-api.mjs +14 -0
- package/esm2022/shared.mjs +5 -0
- package/fesm2022/shared.mjs +1558 -0
- package/fesm2022/shared.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/class/index.api.d.ts +1 -0
- package/lib/class/popover.d.ts +14 -0
- package/lib/components/captcha/captcha.component.d.ts +13 -0
- package/lib/components/grid/filter/date-filter.component.d.ts +24 -0
- package/lib/components/grid/filter/index.api.d.ts +1 -0
- package/lib/components/grid/grid.component.d.ts +64 -0
- package/lib/components/grid/render/action-button.component.d.ts +13 -0
- package/lib/components/index.api.d.ts +5 -0
- package/lib/components/map/map.component.d.ts +26 -0
- package/lib/components/spinner/spinner.component.d.ts +8 -0
- package/lib/directive/char-input.directive.d.ts +12 -0
- package/lib/directive/index.api.d.ts +3 -0
- package/lib/directive/mask.d.ts +19 -0
- package/lib/directive/mask.directive.d.ts +15 -0
- package/lib/directive/numeric-input.directive.d.ts +12 -0
- package/lib/guard/auth.guard.d.ts +10 -0
- package/lib/guard/index.api.d.ts +1 -0
- package/lib/layouts/blank/blank.layout.d.ts +8 -0
- package/lib/layouts/index.api.d.ts +2 -0
- package/lib/layouts/master/master.layout.d.ts +20 -0
- package/lib/models/index.api.d.ts +1 -0
- package/lib/models/shared.model.d.ts +120 -0
- package/lib/pipes/date.pipe.d.ts +7 -0
- package/lib/pipes/index.api.d.ts +2 -0
- package/lib/pipes/timer.pipe.d.ts +7 -0
- package/lib/services/confirm.service.d.ts +9 -0
- package/lib/services/dialog.service.d.ts +11 -0
- package/lib/services/form.service.d.ts +8 -0
- package/lib/services/index.api.d.ts +5 -0
- package/lib/services/shared.service.d.ts +8 -0
- package/lib/services/toast.service.d.ts +9 -0
- package/lib/shared.module.d.ts +41 -0
- package/package.json +43 -0
- package/public-api.d.ts +10 -0
- package/src/style.scss +9 -0
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { FilterOperator } from '../../models/shared.model';
|
|
3
|
+
import { ActionsCellRenderer } from '../index.api';
|
|
4
|
+
import { JDatePipe } from '../../pipes/date.pipe';
|
|
5
|
+
import { DateFilter } from './filter/index.api';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@ngx-translate/core";
|
|
8
|
+
import * as i2 from "@angular/common";
|
|
9
|
+
import * as i3 from "@ag-grid-community/angular";
|
|
10
|
+
import * as i4 from "ng-zorro-antd/icon";
|
|
11
|
+
import * as i5 from "ng-zorro-antd/button";
|
|
12
|
+
import * as i6 from "ng-zorro-antd/core/transition-patch";
|
|
13
|
+
import * as i7 from "ng-zorro-antd/core/wave";
|
|
14
|
+
export class GridComponent {
|
|
15
|
+
_translate;
|
|
16
|
+
constructor(_translate) {
|
|
17
|
+
this._translate = _translate;
|
|
18
|
+
this.datasource = this.createServerSideDatasource();
|
|
19
|
+
}
|
|
20
|
+
gridApi;
|
|
21
|
+
isServerSideGroup;
|
|
22
|
+
getServerSideGroupKey = null;
|
|
23
|
+
groupDefaultExpanded = -1;
|
|
24
|
+
_treeGroupColumn = null;
|
|
25
|
+
datasource;
|
|
26
|
+
themeClass = "ag-theme-quartz";
|
|
27
|
+
columnDefs = [];
|
|
28
|
+
_column = [];
|
|
29
|
+
autoGroupColumnDef = {
|
|
30
|
+
headerName: "",
|
|
31
|
+
minWidth: 250,
|
|
32
|
+
sortable: false,
|
|
33
|
+
cellRendererParams: {
|
|
34
|
+
suppressCount: true,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
defaultColDef = {
|
|
38
|
+
flex: 1,
|
|
39
|
+
minWidth: 150,
|
|
40
|
+
filter: 'agTextColumnFilter',
|
|
41
|
+
suppressHeaderMenuButton: true,
|
|
42
|
+
suppressHeaderContextMenu: true
|
|
43
|
+
};
|
|
44
|
+
onAction = new EventEmitter();
|
|
45
|
+
onToolbar = new EventEmitter();
|
|
46
|
+
onClicked = new EventEmitter();
|
|
47
|
+
label = null;
|
|
48
|
+
rowModelType = 'serverSide';
|
|
49
|
+
isToolbar = true;
|
|
50
|
+
rtl = true;
|
|
51
|
+
paginationPageSize = 15;
|
|
52
|
+
paginationPageSizeSelector = [10, 15, 25];
|
|
53
|
+
enableAdvancedFilter = false;
|
|
54
|
+
treeModel = false;
|
|
55
|
+
isLeaf = false;
|
|
56
|
+
showAdvancedButton = true;
|
|
57
|
+
actionItems = [
|
|
58
|
+
{
|
|
59
|
+
code: 'edit',
|
|
60
|
+
icon: 'fa-light fa-pen',
|
|
61
|
+
alt: 'ویرایش'
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
code: 'delete',
|
|
65
|
+
icon: 'fa-light fa-trash',
|
|
66
|
+
alt: 'حذف'
|
|
67
|
+
}
|
|
68
|
+
];
|
|
69
|
+
toolbarItems = [
|
|
70
|
+
{
|
|
71
|
+
code: 'insert',
|
|
72
|
+
icon: 'plus',
|
|
73
|
+
text: 'ایجاد جدید',
|
|
74
|
+
type: 'primary'
|
|
75
|
+
},
|
|
76
|
+
// {
|
|
77
|
+
// code: 'refresh',
|
|
78
|
+
// icon: 'sync',
|
|
79
|
+
// text: 'بروزرسانی',
|
|
80
|
+
// type: 'default'
|
|
81
|
+
// }
|
|
82
|
+
];
|
|
83
|
+
get treeGroupColumn() {
|
|
84
|
+
return this.treeGroupColumn;
|
|
85
|
+
}
|
|
86
|
+
set treeGroupColumn(v) {
|
|
87
|
+
if (v) {
|
|
88
|
+
this._treeGroupColumn = v;
|
|
89
|
+
this.isServerSideGroup = dataItem => {
|
|
90
|
+
if (this.isLeaf) {
|
|
91
|
+
if (!dataItem.lastNode)
|
|
92
|
+
return dataItem[v];
|
|
93
|
+
else
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
return dataItem[v];
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
this.getServerSideGroupKey = dataItem => {
|
|
101
|
+
return dataItem[v];
|
|
102
|
+
};
|
|
103
|
+
// this.autoGroupColumnDef.headerName = v;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
fetchData;
|
|
107
|
+
get column() {
|
|
108
|
+
return this.column;
|
|
109
|
+
}
|
|
110
|
+
set column(v) {
|
|
111
|
+
if (v != null) {
|
|
112
|
+
this._column = v;
|
|
113
|
+
v.forEach((el) => {
|
|
114
|
+
var filter = 'agTextColumnFilter';
|
|
115
|
+
var sortable = true;
|
|
116
|
+
var filterParams = {
|
|
117
|
+
maxNumConditions: 1
|
|
118
|
+
};
|
|
119
|
+
switch (el.type) {
|
|
120
|
+
case 'boolean':
|
|
121
|
+
filter = 'agNumberColumnFilter';
|
|
122
|
+
filterParams.filterOptions = [
|
|
123
|
+
"empty",
|
|
124
|
+
{
|
|
125
|
+
displayKey: 'true',
|
|
126
|
+
displayName: this._translate.instant('YES'),
|
|
127
|
+
predicate: () => true,
|
|
128
|
+
numberOfInputs: 0
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
displayKey: 'false',
|
|
132
|
+
displayName: this._translate.instant('NO'),
|
|
133
|
+
predicate: () => true,
|
|
134
|
+
numberOfInputs: 0
|
|
135
|
+
}
|
|
136
|
+
];
|
|
137
|
+
break;
|
|
138
|
+
case 'enum':
|
|
139
|
+
filter = 'agNumberColumnFilter';
|
|
140
|
+
const items = [];
|
|
141
|
+
for (const property in el.filterItems) {
|
|
142
|
+
items.push({
|
|
143
|
+
displayKey: el.filterItems[property],
|
|
144
|
+
displayName: this._translate.instant(el.filterItems[property]),
|
|
145
|
+
predicate: true,
|
|
146
|
+
numberOfInputs: 0
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
filterParams.filterOptions = [
|
|
150
|
+
"empty",
|
|
151
|
+
...items
|
|
152
|
+
];
|
|
153
|
+
break;
|
|
154
|
+
case 'number':
|
|
155
|
+
filter = 'agNumberColumnFilter';
|
|
156
|
+
break;
|
|
157
|
+
case 'select':
|
|
158
|
+
filter = 'agSetColumnFilter';
|
|
159
|
+
break;
|
|
160
|
+
case 'string':
|
|
161
|
+
filter = 'agTextColumnFilter';
|
|
162
|
+
break;
|
|
163
|
+
case 'date':
|
|
164
|
+
filter = 'agDateColumnFilter';
|
|
165
|
+
break;
|
|
166
|
+
default:
|
|
167
|
+
filter = 'agTextColumnFilter';
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
if (el.filter != undefined && !el.filter) {
|
|
171
|
+
filter = false;
|
|
172
|
+
}
|
|
173
|
+
if (el.sortable != undefined && !el.sortable) {
|
|
174
|
+
sortable = false;
|
|
175
|
+
}
|
|
176
|
+
if (el.field != this._treeGroupColumn) {
|
|
177
|
+
if (el.type && el.type == 'boolean') {
|
|
178
|
+
this.columnDefs.push({
|
|
179
|
+
field: el.field,
|
|
180
|
+
headerName: el.label,
|
|
181
|
+
filter: filter,
|
|
182
|
+
sortable,
|
|
183
|
+
editable: el.editable,
|
|
184
|
+
minWidth: el.minWidth ? el.minWidth : null,
|
|
185
|
+
filterParams,
|
|
186
|
+
cellClass: 'ag-boolean-cell',
|
|
187
|
+
cellRenderer: params => {
|
|
188
|
+
if (params.value != null) {
|
|
189
|
+
return params.value ? '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" stroke="green" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check"><path d="M20 6L9 17L4 12"/></svg>' : '<svg xmlns="http://www.w3.org/2000/svg" stroke="red" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather feather-x"><line x1="18" y1="6" x2="6" y2="18" /><line x1="6" y1="6" x2="18" y2="18" /></svg>';
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
return '';
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
else if (el.type && el.type == 'enum') {
|
|
198
|
+
this.columnDefs.push({
|
|
199
|
+
field: el.field,
|
|
200
|
+
headerName: el.label,
|
|
201
|
+
filter: filter,
|
|
202
|
+
sortable,
|
|
203
|
+
editable: el.editable,
|
|
204
|
+
minWidth: el.minWidth ? el.minWidth : null,
|
|
205
|
+
filterParams,
|
|
206
|
+
cellRenderer: params => {
|
|
207
|
+
if (params.value) {
|
|
208
|
+
return this._translate.instant(params.value);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
return '';
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
else if (el.type && el.type == 'date') {
|
|
217
|
+
this.columnDefs.push({
|
|
218
|
+
field: el.field,
|
|
219
|
+
headerName: el.label,
|
|
220
|
+
filter: DateFilter,
|
|
221
|
+
sortable,
|
|
222
|
+
editable: el.editable,
|
|
223
|
+
minWidth: el.minWidth ? el.minWidth : null,
|
|
224
|
+
filterParams,
|
|
225
|
+
cellRenderer: params => {
|
|
226
|
+
if (params.value) {
|
|
227
|
+
return new JDatePipe().transform(params.value);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
return '';
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
else if (el.type && el.type == 'price') {
|
|
236
|
+
this.columnDefs.push({
|
|
237
|
+
field: el.field,
|
|
238
|
+
headerName: el.label,
|
|
239
|
+
filter: filter,
|
|
240
|
+
sortable,
|
|
241
|
+
editable: el.editable,
|
|
242
|
+
minWidth: el.minWidth ? el.minWidth : null,
|
|
243
|
+
filterParams,
|
|
244
|
+
cellRenderer: params => {
|
|
245
|
+
if (params.value) {
|
|
246
|
+
return params.value.toLocaleString();
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
return '';
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
else if (el.type && el.type == 'image') {
|
|
255
|
+
this.columnDefs.push({
|
|
256
|
+
field: el.field,
|
|
257
|
+
headerName: el.label,
|
|
258
|
+
minWidth: 80,
|
|
259
|
+
width: 80,
|
|
260
|
+
filter: false,
|
|
261
|
+
sortable: false,
|
|
262
|
+
editable: false,
|
|
263
|
+
filterParams,
|
|
264
|
+
cellRenderer: params => {
|
|
265
|
+
if (params.value) {
|
|
266
|
+
return `<img class="rounded-full mt-1" width="32" height="32" src="${params.value}"/>`;
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
return '';
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
this.columnDefs.push({
|
|
276
|
+
field: el.field,
|
|
277
|
+
headerName: el.label,
|
|
278
|
+
filter,
|
|
279
|
+
sortable,
|
|
280
|
+
editable: el.editable,
|
|
281
|
+
filterParams,
|
|
282
|
+
minWidth: el.minWidth ? el.minWidth : null
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
this.autoGroupColumnDef.field = el.field;
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
if (this.actionItems.length > 0) {
|
|
291
|
+
this.columnDefs.push({
|
|
292
|
+
filter: false,
|
|
293
|
+
headerName: '',
|
|
294
|
+
minWidth: 100,
|
|
295
|
+
resizable: true,
|
|
296
|
+
pinned: true,
|
|
297
|
+
sortable: false,
|
|
298
|
+
field: 'actions',
|
|
299
|
+
cellRenderer: ActionsCellRenderer,
|
|
300
|
+
cellRendererParams: {
|
|
301
|
+
onClick: (params) => {
|
|
302
|
+
this.onAction.emit(params);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
cellDoubleClicked(e) {
|
|
310
|
+
this.onClicked.emit(e.data);
|
|
311
|
+
}
|
|
312
|
+
handleClick(item) {
|
|
313
|
+
this.onToolbar.emit(item);
|
|
314
|
+
}
|
|
315
|
+
refresh() {
|
|
316
|
+
this.gridApi.refreshServerSide({ purge: true });
|
|
317
|
+
}
|
|
318
|
+
onGridReady(params) {
|
|
319
|
+
this.gridApi = params.api;
|
|
320
|
+
}
|
|
321
|
+
advancedFilter() {
|
|
322
|
+
this.enableAdvancedFilter = !this.enableAdvancedFilter;
|
|
323
|
+
setTimeout(() => {
|
|
324
|
+
this.gridApi.showAdvancedFilterBuilder();
|
|
325
|
+
setTimeout(() => {
|
|
326
|
+
document.getElementsByClassName('ag-icon-maximize')[0].click();
|
|
327
|
+
});
|
|
328
|
+
}, 10);
|
|
329
|
+
}
|
|
330
|
+
getRouteToNode(rowNode) {
|
|
331
|
+
if (!rowNode.parent) {
|
|
332
|
+
return [];
|
|
333
|
+
}
|
|
334
|
+
return [
|
|
335
|
+
...this.getRouteToNode(rowNode.parent),
|
|
336
|
+
rowNode.key ? rowNode.key : rowNode.data.employeeName,
|
|
337
|
+
];
|
|
338
|
+
}
|
|
339
|
+
refreshNode(id) {
|
|
340
|
+
const selectedRows = this.gridApi.getRowNode(id);
|
|
341
|
+
const route = this.getRouteToNode(selectedRows);
|
|
342
|
+
this.gridApi.refreshServerSide({
|
|
343
|
+
purge: true,
|
|
344
|
+
route: route
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
refreshParentNode(id) {
|
|
348
|
+
const selectedRows = this.gridApi.getRowNode(id);
|
|
349
|
+
const route = this.getRouteToNode(selectedRows.parent);
|
|
350
|
+
this.gridApi.refreshServerSide({
|
|
351
|
+
purge: true,
|
|
352
|
+
route: route
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
createServerSideDatasource() {
|
|
356
|
+
return {
|
|
357
|
+
getRows: (params) => {
|
|
358
|
+
debugger;
|
|
359
|
+
let filter = null;
|
|
360
|
+
if (Object.keys(params.request.filterModel).length > 0) {
|
|
361
|
+
filter = {
|
|
362
|
+
disable: false,
|
|
363
|
+
field: null,
|
|
364
|
+
logic: 'AND',
|
|
365
|
+
filters: [],
|
|
366
|
+
ignoreCase: null,
|
|
367
|
+
operator: null,
|
|
368
|
+
truncateDate: null,
|
|
369
|
+
value: null,
|
|
370
|
+
};
|
|
371
|
+
for (const key in params.request.filterModel) {
|
|
372
|
+
if (params.request.filterModel[key].filterType == 'custom-date') {
|
|
373
|
+
filter.filters.push({
|
|
374
|
+
disable: false,
|
|
375
|
+
field: key == 'ag-Grid-AutoColumn' ? this._treeGroupColumn : key,
|
|
376
|
+
logic: 'AND',
|
|
377
|
+
filters: null,
|
|
378
|
+
ignoreCase: false,
|
|
379
|
+
operator: FilterOperator.truncGreaterThanEqual,
|
|
380
|
+
truncateDate: true,
|
|
381
|
+
value: new Date(params.request.filterModel[key].dateFrom).toISOString()
|
|
382
|
+
});
|
|
383
|
+
if (params.request.filterModel[key].dateTo != "") {
|
|
384
|
+
filter.filters.push({
|
|
385
|
+
disable: false,
|
|
386
|
+
field: key == 'ag-Grid-AutoColumn' ? this._treeGroupColumn : key,
|
|
387
|
+
logic: 'AND',
|
|
388
|
+
filters: null,
|
|
389
|
+
ignoreCase: false,
|
|
390
|
+
operator: FilterOperator.truncLessThanOrEqual,
|
|
391
|
+
truncateDate: true,
|
|
392
|
+
value: new Date(params.request.filterModel[key].dateTo).toISOString()
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
const operation = FilterOperator[params.request.filterModel[key].type];
|
|
398
|
+
let ignoreCase = true;
|
|
399
|
+
const findEl = this._column.find((el) => el.field == key);
|
|
400
|
+
let field = null;
|
|
401
|
+
if (key == 'ag-Grid-AutoColumn') {
|
|
402
|
+
field = this._treeGroupColumn;
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
field = key;
|
|
406
|
+
if (findEl.searchField != null) {
|
|
407
|
+
field = findEl.searchField;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
if (findEl && findEl.type == 'enum') {
|
|
411
|
+
ignoreCase = false;
|
|
412
|
+
}
|
|
413
|
+
filter.filters.push({
|
|
414
|
+
disable: false,
|
|
415
|
+
field,
|
|
416
|
+
logic: 'AND',
|
|
417
|
+
filters: null,
|
|
418
|
+
ignoreCase,
|
|
419
|
+
operator: operation ? operation : FilterOperator.equals,
|
|
420
|
+
truncateDate: true,
|
|
421
|
+
value: params.request.filterModel[key].filter ? params.request.filterModel[key].filter : params.request.filterModel[key].type
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
const gridFilter = {
|
|
427
|
+
take: params.api.paginationGetPageSize(),
|
|
428
|
+
data: null,
|
|
429
|
+
filter,
|
|
430
|
+
skip: params.api.paginationGetCurrentPage() * params.api.paginationGetPageSize(),
|
|
431
|
+
sorts: params.request.sortModel.length > 0 ? [{ dir: params.request.sortModel[0].sort, field: params.request.sortModel[0].colId }] : []
|
|
432
|
+
};
|
|
433
|
+
const requestParams = {
|
|
434
|
+
parentNode: params.parentNode.data
|
|
435
|
+
};
|
|
436
|
+
this.fetchData(gridFilter, requestParams).then(data => {
|
|
437
|
+
params.success({
|
|
438
|
+
rowData: data.items,
|
|
439
|
+
rowCount: data.totalCount
|
|
440
|
+
});
|
|
441
|
+
}).catch(() => {
|
|
442
|
+
params.fail();
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
ngOnInit() { }
|
|
448
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GridComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
449
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: GridComponent, selector: "app-grid", inputs: { label: "label", rowModelType: "rowModelType", isToolbar: "isToolbar", rtl: "rtl", paginationPageSize: "paginationPageSize", paginationPageSizeSelector: "paginationPageSizeSelector", enableAdvancedFilter: "enableAdvancedFilter", treeModel: "treeModel", isLeaf: "isLeaf", showAdvancedButton: "showAdvancedButton", actionItems: "actionItems", toolbarItems: "toolbarItems", treeGroupColumn: "treeGroupColumn", fetchData: "fetchData", column: "column" }, outputs: { onAction: "onAction", onToolbar: "onToolbar", onClicked: "onClicked" }, ngImport: i0, template: "<!-- <button (click)=\"enableAdvancedFilter=!enableAdvancedFilter\">advanced</button> -->\n<div class=\"flex justify-between items-center mb-4 pb-4 border-b border-b-slate-200\" *ngIf=\"isToolbar\">\n <div>\n <h4 class=\"font-semibold text-2xl\">{{label}}</h4>\n </div>\n <div class=\"flex gap-3\">\n <button nz-button *ngFor=\"let item of toolbarItems\" (click)=\"handleClick(item)\" [nzType]=\"item.type\">\n <span nz-icon [nzType]=\"item.icon\"></span>\n {{item.text}}\n </button>\n <button nz-button (click)=\"refresh()\" nzType=\"default\">\n <span nz-icon nzType=\"sync\"></span>\n \u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC\n </button>\n <!-- <button nz-button (click)=\"advancedFilter()\" *ngIf=\"showAdvancedButton\" nzType=\"default\">\n <span nz-icon nzType=\"filter\"></span>\n \u062C\u0633\u062A\u062C\u0648\u06CC \u067E\u06CC\u0634\u0631\u0641\u062A\u0647\n </button> -->\n </div>\n</div>\n<ag-grid-angular style=\"width: 100%;\" [style]=\"(isToolbar) ? 'height: calc(100% - 1rem - 48px);':'height: 100%;'\" [columnDefs]=\"columnDefs\" [pagination]=\"true\"\n [paginationPageSize]=\"paginationPageSize\" [paginationPageSizeSelector]=\"paginationPageSizeSelector\"\n [class]=\"themeClass\" [defaultColDef]=\"defaultColDef\" [enableAdvancedFilter]=\"enableAdvancedFilter\" [enableRtl]=\"rtl\"\n [treeData]=\"treeModel\" [autoGroupColumnDef]=\"autoGroupColumnDef\" [isServerSideGroup]=\"isServerSideGroup\"\n [getServerSideGroupKey]=\"getServerSideGroupKey\" [rowModelType]=\"rowModelType\" [serverSideDatasource]=\"datasource\"\n (gridReady)=\"onGridReady($event)\" [cacheBlockSize]=\"paginationPageSize\" [maxBlocksInCache]=\"2\"\n [context]=\"{actionItems: actionItems}\" (cellDoubleClicked)=\"cellDoubleClicked($event)\" #grid />", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "columnMenu", "suppressMenuHide", "enableBrowserTooltips", "tooltipTrigger", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "tooltipShowMode", "tooltipInteraction", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "suppressCutToClipboard", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "dataTypeDefinitions", "maintainColumnOrder", "enableStrictPivotColumnOrder", "suppressFieldDotNotation", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressMoveWhenColumnDragging", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "autoSizeStrategy", "components", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterNavigatesVertically", "enterNavigatesVerticallyAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "quickFilterText", "cacheQuickFilter", "includeHiddenColumnsInQuickFilter", "quickFilterParser", "quickFilterMatcher", "applyQuickFilterBeforePivotOrAgg", "excludeChildrenWhenTreeDataFiltering", "enableAdvancedFilter", "advancedFilterModel", "includeHiddenColumnsInAdvancedFilter", "advancedFilterParent", "advancedFilterBuilderParams", "suppressAdvancedFilterEval", "suppressSetFilterByDefault", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "chartToolPanelsDef", "chartMenuItems", "loadingCellRenderer", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "dragAndDropImageComponent", "dragAndDropImageComponentParams", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "loading", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationPageSizeSelector", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotMaxGeneratedColumns", "pivotDefaultExpanded", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "alwaysAggregateAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDuration", "cellFlashDelay", "cellFadeDuration", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererParams", "embedFullWidthRows", "suppressGroupMaintainValueType", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupLockGroupColumns", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupTotalRow", "grandTotalRow", "suppressStickyTotalRow", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "groupAllowUnbalanced", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "suppressGroupRowsSticky", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "suppressServerSideInfiniteScroll", "suppressServerSideFullWidthLoadingRow", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideEnableClientSideSort", "serverSideOnlyRefreshFilteredGroups", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSidePivotResultFieldSeparator", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "cellSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellFocus", "suppressHeaderFocus", "selectionColumnDef", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "gridId", "deltaSort", "treeDataDisplayType", "enableGroupEdit", "initialState", "theme", "loadThemeGoogleFonts", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processUnpinnedColumns", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "focusGridInnerElement", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "getLocaleText", "getDocument", "paginationNumberFormatter", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "getChildCount", "getServerSideGroupLevelParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "columnMenuVisibleChanged", "contextMenuVisibleChanged", "cutStart", "cutEnd", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "columnHeaderMouseOver", "columnHeaderMouseLeave", "columnHeaderClicked", "columnHeaderContextMenu", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "undoStarted", "undoEnded", "redoStarted", "redoEnded", "cellSelectionDeleteStart", "cellSelectionDeleteEnd", "rangeDeleteStart", "rangeDeleteEnd", "fillStart", "fillEnd", "filterOpened", "filterChanged", "filterModified", "advancedFilterBuilderVisibleChanged", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "dragCancelled", "stateUpdated", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "rowDragCancel", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pivotMaxColumnsExceeded", "pinnedRowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "storeRefreshed", "headerFocused", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "cellSelectionChanged", "tooltipShow", "tooltipHide", "sortChanged"] }, { kind: "directive", type: i4.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: i5.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i6.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i7.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }] });
|
|
450
|
+
}
|
|
451
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GridComponent, decorators: [{
|
|
452
|
+
type: Component,
|
|
453
|
+
args: [{ selector: 'app-grid', template: "<!-- <button (click)=\"enableAdvancedFilter=!enableAdvancedFilter\">advanced</button> -->\n<div class=\"flex justify-between items-center mb-4 pb-4 border-b border-b-slate-200\" *ngIf=\"isToolbar\">\n <div>\n <h4 class=\"font-semibold text-2xl\">{{label}}</h4>\n </div>\n <div class=\"flex gap-3\">\n <button nz-button *ngFor=\"let item of toolbarItems\" (click)=\"handleClick(item)\" [nzType]=\"item.type\">\n <span nz-icon [nzType]=\"item.icon\"></span>\n {{item.text}}\n </button>\n <button nz-button (click)=\"refresh()\" nzType=\"default\">\n <span nz-icon nzType=\"sync\"></span>\n \u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC\n </button>\n <!-- <button nz-button (click)=\"advancedFilter()\" *ngIf=\"showAdvancedButton\" nzType=\"default\">\n <span nz-icon nzType=\"filter\"></span>\n \u062C\u0633\u062A\u062C\u0648\u06CC \u067E\u06CC\u0634\u0631\u0641\u062A\u0647\n </button> -->\n </div>\n</div>\n<ag-grid-angular style=\"width: 100%;\" [style]=\"(isToolbar) ? 'height: calc(100% - 1rem - 48px);':'height: 100%;'\" [columnDefs]=\"columnDefs\" [pagination]=\"true\"\n [paginationPageSize]=\"paginationPageSize\" [paginationPageSizeSelector]=\"paginationPageSizeSelector\"\n [class]=\"themeClass\" [defaultColDef]=\"defaultColDef\" [enableAdvancedFilter]=\"enableAdvancedFilter\" [enableRtl]=\"rtl\"\n [treeData]=\"treeModel\" [autoGroupColumnDef]=\"autoGroupColumnDef\" [isServerSideGroup]=\"isServerSideGroup\"\n [getServerSideGroupKey]=\"getServerSideGroupKey\" [rowModelType]=\"rowModelType\" [serverSideDatasource]=\"datasource\"\n (gridReady)=\"onGridReady($event)\" [cacheBlockSize]=\"paginationPageSize\" [maxBlocksInCache]=\"2\"\n [context]=\"{actionItems: actionItems}\" (cellDoubleClicked)=\"cellDoubleClicked($event)\" #grid />" }]
|
|
454
|
+
}], ctorParameters: () => [{ type: i1.TranslateService }], propDecorators: { onAction: [{
|
|
455
|
+
type: Output
|
|
456
|
+
}], onToolbar: [{
|
|
457
|
+
type: Output
|
|
458
|
+
}], onClicked: [{
|
|
459
|
+
type: Output
|
|
460
|
+
}], label: [{
|
|
461
|
+
type: Input
|
|
462
|
+
}], rowModelType: [{
|
|
463
|
+
type: Input
|
|
464
|
+
}], isToolbar: [{
|
|
465
|
+
type: Input
|
|
466
|
+
}], rtl: [{
|
|
467
|
+
type: Input
|
|
468
|
+
}], paginationPageSize: [{
|
|
469
|
+
type: Input
|
|
470
|
+
}], paginationPageSizeSelector: [{
|
|
471
|
+
type: Input
|
|
472
|
+
}], enableAdvancedFilter: [{
|
|
473
|
+
type: Input
|
|
474
|
+
}], treeModel: [{
|
|
475
|
+
type: Input
|
|
476
|
+
}], isLeaf: [{
|
|
477
|
+
type: Input
|
|
478
|
+
}], showAdvancedButton: [{
|
|
479
|
+
type: Input
|
|
480
|
+
}], actionItems: [{
|
|
481
|
+
type: Input
|
|
482
|
+
}], toolbarItems: [{
|
|
483
|
+
type: Input
|
|
484
|
+
}], treeGroupColumn: [{
|
|
485
|
+
type: Input
|
|
486
|
+
}], fetchData: [{
|
|
487
|
+
type: Input
|
|
488
|
+
}], column: [{
|
|
489
|
+
type: Input
|
|
490
|
+
}] } });
|
|
491
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2dyaWQvZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2dyaWQvZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBeUUsY0FBYyxFQUFvRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BNLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7Ozs7QUFpQmhELE1BQU0sT0FBTyxhQUFhO0lBRVY7SUFEWixZQUNZLFVBQTRCO1FBQTVCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBRXBDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUNPLE9BQU8sQ0FBVztJQUNuQixpQkFBaUIsQ0FBQztJQUNsQixxQkFBcUIsR0FBRyxJQUFJLENBQUM7SUFDN0Isb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekIsZ0JBQWdCLEdBQVcsSUFBSSxDQUFDO0lBQ3hDLFVBQVUsQ0FBd0I7SUFDbEMsVUFBVSxHQUFXLGlCQUFpQixDQUFDO0lBQ3ZDLFVBQVUsR0FBYSxFQUFFLENBQUM7SUFDMUIsT0FBTyxHQUFrQixFQUFFLENBQUM7SUFDNUIsa0JBQWtCLEdBQVc7UUFDekIsVUFBVSxFQUFFLEVBQUU7UUFDZCxR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QkFEUixNQUFNO2dCQUlQLFNBQVM7c0JBRFIsTUFBTTtnQkFJUCxLQUFLO3NCQURKLEtBQUs7Z0JBSU4sWUFBWTtzQkFEWCxLQUFLO2dCQUlOLFNBQVM7c0JBRFIsS0FBSztnQkFJTixHQUFHO3NCQURGLEtBQUs7Z0JBSU4sa0JBQWtCO3NCQURqQixLQUFLO2dCQUlOLDBCQUEwQjtzQkFEekIsS0FBSztnQkFJTixvQkFBb0I7c0JBRG5CLEtBQUs7Z0JBSU4sU0FBUztzQkFEUixLQUFLO2dCQUlOLE1BQU07c0JBREwsS0FBSztnQkFJTixrQkFBa0I7c0JBRGpCLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO2dCQWVOLFlBQVk7c0JBRFgsS0FBSztnQkFpQkssZUFBZTtzQkFEekIsS0FBSztnQkF5Qk4sU0FBUztzQkFEUixLQUFLO2dCQUlLLE1BQU07c0JBRGhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZWxsRG91YmxlQ2xpY2tlZEV2ZW50LCBDb2xEZWYsIEdyaWRBcGksIEdyaWRPcHRpb25zLCBJRGF0ZUZpbHRlclBhcmFtcywgSVJvd05vZGUsIElTZXJ2ZXJTaWRlRGF0YXNvdXJjZSwgSVNlcnZlclNpZGVHZXRSb3dzUGFyYW1zLCBSb3dNb2RlbFR5cGUsIFNldEZpbHRlclZhbHVlc0Z1bmNQYXJhbXMgfSBmcm9tICdAYWctZ3JpZC1jb21tdW5pdHkvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBBY3Rpb25JdGVtcywgQ29sdW1uSXRlbXMsIERhdGFzb3VyY2VPdXRwdXRNb2RlbCwgRmlsdGVyR3JpZEl0ZW1zTW9kZWwsIEZpbHRlck9wZXJhdG9yLCBHcmlkQWN0aW9uT3V0cHV0LCBHcmlkSW5wdXRNb2RlbCwgR3JpZFJlcXVlc3RQYXJhbSwgVG9vbGJhckl0ZW1zIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NoYXJlZC5tb2RlbCc7XG5pbXBvcnQgeyBBY3Rpb25zQ2VsbFJlbmRlcmVyIH0gZnJvbSAnLi4vaW5kZXguYXBpJztcbmltcG9ydCB7IEpEYXRlUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL2RhdGUucGlwZSc7XG5pbXBvcnQgeyBEYXRlRmlsdGVyIH0gZnJvbSAnLi9maWx0ZXIvaW5kZXguYXBpJztcbmV4cG9ydCBpbnRlcmZhY2UgSU9seW1waWNEYXRhIHtcbiAgICBhdGhsZXRlOiBzdHJpbmcsXG4gICAgYWdlOiBudW1iZXIsXG4gICAgY291bnRyeTogc3RyaW5nLFxuICAgIHllYXI6IG51bWJlcixcbiAgICBkYXRlOiBzdHJpbmcsXG4gICAgc3BvcnQ6IHN0cmluZyxcbiAgICBnb2xkOiBudW1iZXIsXG4gICAgc2lsdmVyOiBudW1iZXIsXG4gICAgYnJvbnplOiBudW1iZXIsXG4gICAgdG90YWw6IG51bWJlclxufVxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtZ3JpZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dyaWQuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBHcmlkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuZGF0YXNvdXJjZSA9IHRoaXMuY3JlYXRlU2VydmVyU2lkZURhdGFzb3VyY2UoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBncmlkQXBpITogR3JpZEFwaTtcbiAgICBwdWJsaWMgaXNTZXJ2ZXJTaWRlR3JvdXA7XG4gICAgcHVibGljIGdldFNlcnZlclNpZGVHcm91cEtleSA9IG51bGw7XG4gICAgcHVibGljIGdyb3VwRGVmYXVsdEV4cGFuZGVkID0gLTE7XG4gICAgcHJpdmF0ZSBfdHJlZUdyb3VwQ29sdW1uOiBzdHJpbmcgPSBudWxsO1xuICAgIGRhdGFzb3VyY2U6IElTZXJ2ZXJTaWRlRGF0YXNvdXJjZTtcbiAgICB0aGVtZUNsYXNzOiBzdHJpbmcgPSBcImFnLXRoZW1lLXF1YXJ0elwiO1xuICAgIGNvbHVtbkRlZnM6IENvbERlZltdID0gW107XG4gICAgX2NvbHVtbjogQ29sdW1uSXRlbXNbXSA9IFtdO1xuICAgIGF1dG9Hcm91cENvbHVtbkRlZjogQ29sRGVmID0ge1xuICAgICAgICBoZWFkZXJOYW1lOiBcIlwiLFxuICAgICAgICBtaW5XaWR0aDogMjUwLFxuICAgICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICAgIGNlbGxSZW5kZXJlclBhcmFtczoge1xuICAgICAgICAgICAgc3VwcHJlc3NDb3VudDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgZGVmYXVsdENvbERlZjogQ29sRGVmID0ge1xuICAgICAgICBmbGV4OiAxLFxuICAgICAgICBtaW5XaWR0aDogMTUwLFxuICAgICAgICBmaWx0ZXI6ICdhZ1RleHRDb2x1bW5GaWx0ZXInLFxuICAgICAgICBzdXBwcmVzc0hlYWRlck1lbnVCdXR0b246IHRydWUsXG4gICAgICAgIHN1cHByZXNzSGVhZGVyQ29udGV4dE1lbnU6IHRydWVcbiAgICB9O1xuICAgIEBPdXRwdXQoKVxuICAgIG9uQWN0aW9uOiBFdmVudEVtaXR0ZXI8R3JpZEFjdGlvbk91dHB1dD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBvblRvb2xiYXI6IEV2ZW50RW1pdHRlcjxUb29sYmFySXRlbXM+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgb25DbGlja2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBJbnB1dCgpXG4gICAgbGFiZWw6IHN0cmluZyA9IG51bGw7XG5cbiAgICBASW5wdXQoKVxuICAgIHJvd01vZGVsVHlwZTogUm93TW9kZWxUeXBlID0gJ3NlcnZlclNpZGUnO1xuXG4gICAgQElucHV0KClcbiAgICBpc1Rvb2xiYXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBydGw6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwYWdpbmF0aW9uUGFnZVNpemUgPSAxNTtcblxuICAgIEBJbnB1dCgpXG4gICAgcGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3I6IG51bWJlcltdIHwgYm9vbGVhbiA9IFsxMCwgMTUsIDI1XTtcblxuICAgIEBJbnB1dCgpXG4gICAgZW5hYmxlQWR2YW5jZWRGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgdHJlZU1vZGVsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIGlzTGVhZjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBzaG93QWR2YW5jZWRCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBhY3Rpb25JdGVtczogQWN0aW9uSXRlbXNbXSA9IFtcbiAgICAgICAge1xuICAgICAgICAgICAgY29kZTogJ2VkaXQnLFxuICAgICAgICAgICAgaWNvbjogJ2ZhLWxpZ2h0IGZhLXBlbicsXG4gICAgICAgICAgICBhbHQ6ICfZiNuM2LHYp9uM2LQnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvZGU6ICdkZWxldGUnLFxuICAgICAgICAgICAgaWNvbjogJ2ZhLWxpZ2h0IGZhLXRyYXNoJyxcbiAgICAgICAgICAgIGFsdDogJ9it2LDZgSdcbiAgICAgICAgfVxuICAgIF07XG5cbiAgICBASW5wdXQoKVxuICAgIHRvb2xiYXJJdGVtczogVG9vbGJhckl0ZW1zW10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvZGU6ICdpbnNlcnQnLFxuICAgICAgICAgICAgaWNvbjogJ3BsdXMnLFxuICAgICAgICAgICAgdGV4dDogJ9in24zYrNin2K8g2KzYr9uM2K8nLFxuICAgICAgICAgICAgdHlwZTogJ3ByaW1hcnknXG4gICAgICAgIH0sXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICAgIGNvZGU6ICdyZWZyZXNoJyxcbiAgICAgICAgLy8gICAgIGljb246ICdzeW5jJyxcbiAgICAgICAgLy8gICAgIHRleHQ6ICfYqNix2YjYstix2LPYp9mG24wnLFxuICAgICAgICAvLyAgICAgdHlwZTogJ2RlZmF1bHQnXG4gICAgICAgIC8vIH1cbiAgICBdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHRyZWVHcm91cENvbHVtbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZUdyb3VwQ29sdW1uO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHRyZWVHcm91cENvbHVtbih2OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyZWVHcm91cENvbHVtbiA9IHY7XG4gICAgICAgICAgICB0aGlzLmlzU2VydmVyU2lkZUdyb3VwID0gZGF0YUl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTGVhZikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGFJdGVtLmxhc3ROb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFJdGVtW3ZdO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YUl0ZW1bdl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuZ2V0U2VydmVyU2lkZUdyb3VwS2V5ID0gZGF0YUl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhSXRlbVt2XTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyB0aGlzLmF1dG9Hcm91cENvbHVtbkRlZi5oZWFkZXJOYW1lID0gdjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgZmV0Y2hEYXRhOiAoZmlsdGVyR3JpZDogR3JpZElucHV0TW9kZWwsIHJlcXVlc3RQYXJhbXM6IEdyaWRSZXF1ZXN0UGFyYW0pID0+IFByb21pc2U8RGF0YXNvdXJjZU91dHB1dE1vZGVsPjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbjtcbiAgICB9XG4gICAgcHVibGljIHNldCBjb2x1bW4odjogQ29sdW1uSXRlbXNbXSkge1xuICAgICAgICBpZiAodiAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9jb2x1bW4gPSB2O1xuICAgICAgICAgICAgdi5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBmaWx0ZXI6IGFueSA9ICdhZ1RleHRDb2x1bW5GaWx0ZXInO1xuICAgICAgICAgICAgICAgIHZhciBzb3J0YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGZpbHRlclBhcmFtczogSURhdGVGaWx0ZXJQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1heE51bUNvbmRpdGlvbnM6IDFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZWwudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9ICdhZ051bWJlckNvbHVtbkZpbHRlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJQYXJhbXMuZmlsdGVyT3B0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImVtcHR5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5S2V5OiAndHJ1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiB0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnWUVTJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY2F0ZTogKCkgPT4gdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZJbnB1dHM6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUtleTogJ2ZhbHNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCdOTycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWNhdGU6ICgpID0+IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mSW5wdXRzOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdlbnVtJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9ICdhZ051bWJlckNvbHVtbkZpbHRlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBlbC5maWx0ZXJJdGVtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5S2V5OiBlbC5maWx0ZXJJdGVtc1twcm9wZXJ0eV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiB0aGlzLl90cmFuc2xhdGUuaW5zdGFudChlbC5maWx0ZXJJdGVtc1twcm9wZXJ0eV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWNhdGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mSW5wdXRzOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtcy5maWx0ZXJPcHRpb25zID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZW1wdHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gJ2FnTnVtYmVyQ29sdW1uRmlsdGVyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gJ2FnU2V0Q29sdW1uRmlsdGVyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gJ2FnVGV4dENvbHVtbkZpbHRlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSAnYWdEYXRlQ29sdW1uRmlsdGVyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gJ2FnVGV4dENvbHVtbkZpbHRlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsLmZpbHRlciAhPSB1bmRlZmluZWQgJiYgIWVsLmZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsLnNvcnRhYmxlICE9IHVuZGVmaW5lZCAmJiAhZWwuc29ydGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc29ydGFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsLmZpZWxkICE9IHRoaXMuX3RyZWVHcm91cENvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwudHlwZSAmJiBlbC50eXBlID09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5EZWZzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJOYW1lOiBlbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogZWwuZWRpdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IGVsLm1pbldpZHRoID8gZWwubWluV2lkdGggOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsQ2xhc3M6ICdhZy1ib29sZWFuLWNlbGwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlcjogcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zLnZhbHVlID8gJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHN0cm9rZT1cImdyZWVuXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGNsYXNzPVwiZmVhdGhlciBmZWF0aGVyLWNoZWNrXCI+PHBhdGggZD1cIk0yMCA2TDkgMTdMNCAxMlwiLz48L3N2Zz4nIDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHN0cm9rZT1cInJlZFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjFcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBjbGFzcz1cImZlYXRoZXIgZmVhdGhlci14XCI+PGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIiAvPjxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCIgLz48L3N2Zz4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbC50eXBlICYmIGVsLnR5cGUgPT0gJ2VudW0nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkRlZnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGVsLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlck5hbWU6IGVsLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogZmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBlbC5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogZWwubWluV2lkdGggPyBlbC5taW5XaWR0aCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlcjogcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KHBhcmFtcy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsLnR5cGUgJiYgZWwudHlwZSA9PSAnZGF0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uRGVmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZWwuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyTmFtZTogZWwubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBEYXRlRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBlbC5lZGl0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogZWwubWluV2lkdGggPyBlbC5taW5XaWR0aCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlcjogcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKRGF0ZVBpcGUoKS50cmFuc2Zvcm0ocGFyYW1zLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwudHlwZSAmJiBlbC50eXBlID09ICdwcmljZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uRGVmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZWwuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyTmFtZTogZWwubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IGVsLmVkaXRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiBlbC5taW5XaWR0aCA/IGVsLm1pbldpZHRoIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJQYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFJlbmRlcmVyOiBwYXJhbXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zLnZhbHVlLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsLnR5cGUgJiYgZWwudHlwZSA9PSAnaW1hZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkRlZnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGVsLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlck5hbWU6IGVsLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogODAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXI6IHBhcmFtcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgPGltZyBjbGFzcz1cInJvdW5kZWQtZnVsbCBtdC0xXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgc3JjPVwiJHtwYXJhbXMudmFsdWV9XCIvPmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5EZWZzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBlbC5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJOYW1lOiBlbC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IGVsLmVkaXRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogZWwubWluV2lkdGggPyBlbC5taW5XaWR0aCA6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9Hcm91cENvbHVtbkRlZi5maWVsZCA9IGVsLmZpZWxkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aW9uSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uRGVmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyTmFtZTogJycsXG4gICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAxMDAsXG4gICAgICAgICAgICAgICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcGlubmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnYWN0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlcjogQWN0aW9uc0NlbGxSZW5kZXJlcixcbiAgICAgICAgICAgICAgICAgICAgY2VsbFJlbmRlcmVyUGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiAocGFyYW1zOiBHcmlkQWN0aW9uT3V0cHV0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkFjdGlvbi5lbWl0KHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2VsbERvdWJsZUNsaWNrZWQoZTogQ2VsbERvdWJsZUNsaWNrZWRFdmVudCkge1xuICAgICAgICB0aGlzLm9uQ2xpY2tlZC5lbWl0KGUuZGF0YSk7XG4gICAgfVxuXG4gICAgaGFuZGxlQ2xpY2soaXRlbTogVG9vbGJhckl0ZW1zKSB7XG4gICAgICAgIHRoaXMub25Ub29sYmFyLmVtaXQoaXRlbSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZnJlc2goKSB7XG4gICAgICAgIHRoaXMuZ3JpZEFwaS5yZWZyZXNoU2VydmVyU2lkZSh7IHB1cmdlOiB0cnVlIH0pXG4gICAgfVxuXG4gICAgb25HcmlkUmVhZHkocGFyYW1zOiBhbnkpIHtcbiAgICAgICAgdGhpcy5ncmlkQXBpID0gcGFyYW1zLmFwaTtcbiAgICB9XG5cbiAgICBhZHZhbmNlZEZpbHRlcigpIHtcbiAgICAgICAgdGhpcy5lbmFibGVBZHZhbmNlZEZpbHRlciA9ICF0aGlzLmVuYWJsZUFkdmFuY2VkRmlsdGVyO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZEFwaS5zaG93QWR2YW5jZWRGaWx0ZXJCdWlsZGVyKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYWctaWNvbi1tYXhpbWl6ZScpWzBdIGFzIEhUTUxFbGVtZW50KS5jbGljaygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSwgMTApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Um91dGVUb05vZGUocm93Tm9kZTogSVJvd05vZGUpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICghcm93Tm9kZS5wYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4udGhpcy5nZXRSb3V0ZVRvTm9kZShyb3dOb2RlLnBhcmVudCksXG4gICAgICAgICAgICByb3dOb2RlLmtleSA/IHJvd05vZGUua2V5IDogcm93Tm9kZS5kYXRhLmVtcGxveWVlTmFtZSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICByZWZyZXNoTm9kZShpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuZ3JpZEFwaS5nZXRSb3dOb2RlKGlkKTtcbiAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmdldFJvdXRlVG9Ob2RlKHNlbGVjdGVkUm93cyk7XG4gICAgICAgIHRoaXMuZ3JpZEFwaS5yZWZyZXNoU2VydmVyU2lkZSh7XG4gICAgICAgICAgICBwdXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIHJvdXRlOiByb3V0ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWZyZXNoUGFyZW50Tm9kZShpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuZ3JpZEFwaS5nZXRSb3dOb2RlKGlkKTtcbiAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmdldFJvdXRlVG9Ob2RlKHNlbGVjdGVkUm93cy5wYXJlbnQpO1xuICAgICAgICB0aGlzLmdyaWRBcGkucmVmcmVzaFNlcnZlclNpZGUoe1xuICAgICAgICAgICAgcHVyZ2U6IHRydWUsXG4gICAgICAgICAgICByb3V0ZTogcm91dGVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY3JlYXRlU2VydmVyU2lkZURhdGFzb3VyY2UoKTogSVNlcnZlclNpZGVEYXRhc291cmNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdldFJvd3M6IChwYXJhbXM6IElTZXJ2ZXJTaWRlR2V0Um93c1BhcmFtcykgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyXG4gICAgICAgICAgICAgICAgbGV0IGZpbHRlcjogRmlsdGVyR3JpZEl0ZW1zTW9kZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9naWM6ICdBTkQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZURhdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbFtrZXldLmZpbHRlclR5cGUgPT0gJ2N1c3RvbS1kYXRlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5maWx0ZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGtleSA9PSAnYWctR3JpZC1BdXRvQ29sdW1uJyA/IHRoaXMuX3RyZWVHcm91cENvbHVtbiA6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWM6ICdBTkQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLnRydW5jR3JlYXRlclRoYW5FcXVhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVEYXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IERhdGUocGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWxba2V5XS5kYXRlRnJvbSkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbFtrZXldLmRhdGVUbyAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5maWx0ZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDoga2V5ID09ICdhZy1HcmlkLUF1dG9Db2x1bW4nID8gdGhpcy5fdHJlZUdyb3VwQ29sdW1uIDoga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWM6ICdBTkQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLnRydW5jTGVzc1RoYW5PckVxdWFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVEYXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBEYXRlKHBhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0uZGF0ZVRvKS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gRmlsdGVyT3BlcmF0b3JbcGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWxba2V5XS50eXBlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWdub3JlQ2FzZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluZEVsID0gdGhpcy5fY29sdW1uLmZpbmQoKGVsKSA9PiBlbC5maWVsZCA9PSBrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWVsZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PSAnYWctR3JpZC1BdXRvQ29sdW1uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IHRoaXMuX3RyZWVHcm91cENvbHVtbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRFbC5zZWFyY2hGaWVsZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGZpbmRFbC5zZWFyY2hGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZEVsICYmIGZpbmRFbC50eXBlID09ICdlbnVtJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5maWx0ZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljOiAnQU5EJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlQ2FzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IG9wZXJhdGlvbiA/IG9wZXJhdGlvbiA6IEZpbHRlck9wZXJhdG9yLmVxdWFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVEYXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWxba2V5XS5maWx0ZXIgPyBwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbFtrZXldLmZpbHRlciA6IHBhcmFtcy5yZXF1ZXN0LmZpbHRlck1vZGVsW2tleV0udHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JpZEZpbHRlcjogR3JpZElucHV0TW9kZWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRha2U6IHBhcmFtcy5hcGkucGFnaW5hdGlvbkdldFBhZ2VTaXplKCksXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgc2tpcDogcGFyYW1zLmFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSAqIHBhcmFtcy5hcGkucGFnaW5hdGlvbkdldFBhZ2VTaXplKCksXG4gICAgICAgICAgICAgICAgICAgIHNvcnRzOiBwYXJhbXMucmVxdWVzdC5zb3J0TW9kZWwubGVuZ3RoID4gMCA/IFt7IGRpcjogcGFyYW1zLnJlcXVlc3Quc29ydE1vZGVsWzBdLnNvcnQsIGZpZWxkOiBwYXJhbXMucmVxdWVzdC5zb3J0TW9kZWxbMF0uY29sSWQgfV0gOiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdFBhcmFtczogR3JpZFJlcXVlc3RQYXJhbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZTogcGFyYW1zLnBhcmVudE5vZGUuZGF0YVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaERhdGEoZ3JpZEZpbHRlciwgcmVxdWVzdFBhcmFtcykudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnN1Y2Nlc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YTogZGF0YS5pdGVtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0NvdW50OiBkYXRhLnRvdGFsQ291bnRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZmFpbCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQgeyB9XG59IiwiPCEtLSA8YnV0dG9uIChjbGljayk9XCJlbmFibGVBZHZhbmNlZEZpbHRlcj0hZW5hYmxlQWR2YW5jZWRGaWx0ZXJcIj5hZHZhbmNlZDwvYnV0dG9uPiAtLT5cbjxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgbWItNCBwYi00IGJvcmRlci1iIGJvcmRlci1iLXNsYXRlLTIwMFwiICpuZ0lmPVwiaXNUb29sYmFyXCI+XG4gICAgPGRpdj5cbiAgICAgICAgPGg0IGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LTJ4bFwiPnt7bGFiZWx9fTwvaDQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTNcIj5cbiAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgdG9vbGJhckl0ZW1zXCIgKGNsaWNrKT1cImhhbmRsZUNsaWNrKGl0ZW0pXCIgW256VHlwZV09XCJpdGVtLnR5cGVcIj5cbiAgICAgICAgICAgIDxzcGFuIG56LWljb24gW256VHlwZV09XCJpdGVtLmljb25cIj48L3NwYW4+XG4gICAgICAgICAgICB7e2l0ZW0udGV4dH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG56LWJ1dHRvbiAoY2xpY2spPVwicmVmcmVzaCgpXCIgbnpUeXBlPVwiZGVmYXVsdFwiPlxuICAgICAgICAgICAgPHNwYW4gbnotaWNvbiBuelR5cGU9XCJzeW5jXCI+PC9zcGFuPlxuICAgICAgICAgICAg2KjYsdmI2LLYsdiz2KfZhtuMXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8IS0tIDxidXR0b24gbnotYnV0dG9uIChjbGljayk9XCJhZHZhbmNlZEZpbHRlcigpXCIgKm5nSWY9XCJzaG93QWR2YW5jZWRCdXR0b25cIiBuelR5cGU9XCJkZWZhdWx0XCI+XG4gICAgICAgICAgICA8c3BhbiBuei1pY29uIG56VHlwZT1cImZpbHRlclwiPjwvc3Bhbj5cbiAgICAgICAgICAgINis2LPYqtis2YjbjCDZvtuM2LTYsdmB2KrZh1xuICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxhZy1ncmlkLWFuZ3VsYXIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbc3R5bGVdPVwiKGlzVG9vbGJhcikgPyAnaGVpZ2h0OiBjYWxjKDEwMCUgLSAxcmVtIC0gNDhweCk7JzonaGVpZ2h0OiAxMDAlOydcIiBbY29sdW1uRGVmc109XCJjb2x1bW5EZWZzXCIgW3BhZ2luYXRpb25dPVwidHJ1ZVwiXG4gICAgW3BhZ2luYXRpb25QYWdlU2l6ZV09XCJwYWdpbmF0aW9uUGFnZVNpemVcIiBbcGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3JdPVwicGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3JcIlxuICAgIFtjbGFzc109XCJ0aGVtZUNsYXNzXCIgW2RlZmF1bHRDb2xEZWZdPVwiZGVmYXVsdENvbERlZlwiIFtlbmFibGVBZHZhbmNlZEZpbHRlcl09XCJlbmFibGVBZHZhbmNlZEZpbHRlclwiIFtlbmFibGVSdGxdPVwicnRsXCJcbiAgICBbdHJlZURhdGFdPVwidHJlZU1vZGVsXCIgW2F1dG9Hcm91cENvbHVtbkRlZl09XCJhdXRvR3JvdXBDb2x1bW5EZWZcIiBbaXNTZXJ2ZXJTaWRlR3JvdXBdPVwiaXNTZXJ2ZXJTaWRlR3JvdXBcIlxuICAgIFtnZXRTZXJ2ZXJTaWRlR3JvdXBLZXldPVwiZ2V0U2VydmVyU2lkZUdyb3VwS2V5XCIgW3Jvd01vZGVsVHlwZV09XCJyb3dNb2RlbFR5cGVcIiBbc2VydmVyU2lkZURhdGFzb3VyY2VdPVwiZGF0YXNvdXJjZVwiXG4gICAgKGdyaWRSZWFkeSk9XCJvbkdyaWRSZWFkeSgkZXZlbnQpXCIgW2NhY2hlQmxvY2tTaXplXT1cInBhZ2luYXRpb25QYWdlU2l6ZVwiIFttYXhCbG9ja3NJbkNhY2hlXT1cIjJcIlxuICAgIFtjb250ZXh0XT1cInthY3Rpb25JdGVtczogYWN0aW9uSXRlbXN9XCIgKGNlbGxEb3VibGVDbGlja2VkKT1cImNlbGxEb3VibGVDbGlja2VkKCRldmVudClcIiAjZ3JpZCAvPiJdfQ==
|