@huntsman-cancer-institute/dictionary-editor 16.0.1 → 17.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.
Files changed (34) hide show
  1. package/components/detail.component.d.ts +90 -90
  2. package/components/home.component.d.ts +13 -13
  3. package/components/new-row.component.d.ts +20 -20
  4. package/dictionary-editor.component.d.ts +43 -43
  5. package/dictionary-editor.module.d.ts +24 -24
  6. package/dictionary-editor.routes.d.ts +4 -4
  7. package/esm2022/components/detail.component.mjs +606 -606
  8. package/esm2022/components/home.component.mjs +28 -28
  9. package/esm2022/components/new-row.component.mjs +81 -81
  10. package/esm2022/dictionary-editor.component.mjs +169 -169
  11. package/esm2022/dictionary-editor.module.mjs +76 -76
  12. package/esm2022/dictionary-editor.routes.mjs +14 -14
  13. package/esm2022/grid-editors/ag-grid-date-cell-editor.component.mjs +30 -30
  14. package/esm2022/grid-editors/ag-grid-editor.module.mjs +55 -55
  15. package/esm2022/grid-editors/datepicker.component.mjs +93 -93
  16. package/esm2022/grid-editors/select.editor.mjs +142 -142
  17. package/esm2022/grid-renderers/ag-grid-renderer.module.mjs +36 -36
  18. package/esm2022/grid-renderers/cell-renderer-validation.mjs +345 -345
  19. package/esm2022/grid-renderers/date.renderer.mjs +68 -68
  20. package/esm2022/grid-renderers/select.renderer.mjs +95 -95
  21. package/esm2022/huntsman-cancer-institute-dictionary-editor.mjs +4 -4
  22. package/esm2022/index.mjs +4 -4
  23. package/fesm2022/huntsman-cancer-institute-dictionary-editor.mjs +1718 -1718
  24. package/fesm2022/huntsman-cancer-institute-dictionary-editor.mjs.map +1 -1
  25. package/grid-editors/ag-grid-date-cell-editor.component.d.ts +11 -11
  26. package/grid-editors/ag-grid-editor.module.d.ts +15 -15
  27. package/grid-editors/datepicker.component.d.ts +16 -16
  28. package/grid-editors/select.editor.d.ts +30 -30
  29. package/grid-renderers/ag-grid-renderer.module.d.ts +10 -10
  30. package/grid-renderers/cell-renderer-validation.d.ts +69 -69
  31. package/grid-renderers/date.renderer.d.ts +15 -15
  32. package/grid-renderers/select.renderer.d.ts +17 -17
  33. package/index.d.ts +4 -4
  34. package/package.json +9 -12
@@ -1,583 +1,583 @@
1
- import { Component, Inject, isDevMode, HostBinding } from "@angular/core";
2
- import { ActivatedRoute } from "@angular/router";
3
- import { BehaviorSubject } from "rxjs";
4
- import { finalize, map } from "rxjs/operators";
5
- import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
6
- import { DictionaryService, DICTIONARY_ENDPOINT } from "@huntsman-cancer-institute/dictionary-service";
7
- import { SelectRenderer } from "../grid-renderers/select.renderer";
8
- import { SelectEditor } from "../grid-editors/select.editor";
9
- import { NewRowComponent } from "./new-row.component";
10
- import { isNullOrUndefined } from "util";
11
- import { DateRenderer } from "../grid-renderers/date.renderer";
12
- import { AgGridDateCellEditorComponent } from "../grid-editors/ag-grid-date-cell-editor.component";
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@angular/router";
15
- import * as i2 from "@ng-bootstrap/ng-bootstrap";
16
- import * as i3 from "@huntsman-cancer-institute/dictionary-service";
17
- import * as i4 from "@huntsman-cancer-institute/misc";
18
- import * as i5 from "ag-grid-angular";
19
- /**
20
- * When a dictionary is selected this component is shown. There is a top grid which for its data shows all the columns
21
- * for the dictionary. Currently, keep this for reference only and have non-editable.
22
- * The bottom grid will show those columns as actual columns and its data are all the dictionary values. Rows can be
23
- * added. For deleting, need to make sure the id is not used anywhere. For editing, need to make sure the code or anything
24
- * else isn't being referenced.
25
- *
26
- * @since 1.0.0
27
- */
28
- export class DictionaryEditorDetailComponent {
29
- constructor(route, modalService, dictionaryService, dictionaryEndpoint) {
30
- this.route = route;
31
- this.modalService = modalService;
32
- this.dictionaryService = dictionaryService;
33
- this.dictionaryEndpoint = dictionaryEndpoint;
34
- this.classList = "outlet-column y-auto";
35
- this.dictionaryEntries = [];
36
- this.selectedRows = [];
37
- this.loadingSubjects = [];
38
- this.metaGridOptions = {
39
- rowStyle: {
40
- "font-family": "Prompt, sans-serif"
41
- },
42
- enableCellTextSelection: true,
43
- ensureDomOrder: true
44
- };
45
- this.gridOptions = {
46
- context: {
47
- componentParent: this
48
- },
49
- onGridReady: DictionaryEditorDetailComponent.onSamplesGridReady,
50
- onGridSizeChanged: DictionaryEditorDetailComponent.onGridSizeChanged,
51
- suppressHorizontalScroll: false,
52
- selectionMode: "multiple",
53
- stopEditingWhenGridLosesFocus: true,
54
- enableSorting: true,
55
- enableFilter: true
56
- };
57
- }
58
- /**
59
- * Based on the route class name, make the call to fetch the dictionary data. Since this component is route based,
60
- * when the dictionary class in the route changes, this component is reloaded.
61
- */
62
- ngOnInit() {
63
- this.boundNewRowPostCall = this.newRowPost.bind(this);
64
- this.loadingSubjects.push(new BehaviorSubject(false));
65
- this.loadingSubjects.push(new BehaviorSubject(false));
66
- this.route.params.subscribe(params => {
67
- let className = params["className"];
68
- this.getDictionary(className);
69
- });
70
- }
71
- openModal(modal) {
72
- this.modalService.open(modal, { windowClass: "modal-xl" }).result.then((result) => {
73
- }, (reason) => {
74
- });
75
- }
76
- ngAfterViewInit() {
77
- this.gridOptions.api.sizeColumnsToFit();
78
- }
79
- columnDefMeta() {
80
- return [
81
- { field: "name", headerName: "Name", width: 175, sortable: true, resizable: true, editable: false },
82
- { field: "description", headerName: "Description", width: 250, sortable: true, resizable: true, editable: false },
83
- { field: "id", headerName: "Id", width: 60, sortable: true, resizable: true, editable: false },
84
- { field: "type", headerName: "Type", sortable: true, resizable: true, editable: false },
85
- { field: "protectionType", headerName: "ProtectionType", sortable: true, resizable: true, editable: false },
86
- { field: "filterDictionaryClass", headerName: "FilterDictionaryClass", width: 180, sortable: true, resizable: true, editable: false },
87
- { field: "notNull", headerName: "NotNull", sortable: true, resizable: true, editable: false },
88
- { field: "integer", headerName: "Integer", width: 75, sortable: true, resizable: true, editable: false },
89
- { field: "min", headerName: "Min", width: 60, sortable: true, resizable: true, editable: false },
90
- { field: "max", headerName: "Max", width: 60, sortable: true, resizable: true, editable: false },
91
- { field: "fraction", headerName: "Fraction", sortable: true, resizable: true, editable: false },
92
- { field: "dictionaryTooltip", headerName: "DictionaryTooltip", width: 200, sortable: true, resizable: true, editable: false },
93
- { field: "dictionaryDisplay", headerName: "DictionaryDisplay", width: 175, sortable: true, resizable: true, editable: false },
94
- { field: "filterable", headerName: "Filterable", sortable: true, resizable: true, editable: false },
95
- { field: "displayName", headerName: "DisplayName", width: 175, sortable: true, resizable: true, editable: false },
96
- { field: "displayOrder", headerName: "DisplayOrder", width: 60, sortable: true, resizable: true, editable: false },
97
- { field: "cellStyle", headerName: "CellStyle", sortable: true, resizable: true, editable: false },
98
- ]; // the widths for the last 2 could be wrong.
99
- }
100
- onMetaGridReady(params) {
101
- this.gridApiMeta = params.api;
102
- this.gridApiMeta.setColumnDefs(this.columnDefMeta());
103
- this.gridApiMeta.setRowData(this.dictionary?.fields);
104
- // this.gridApiMeta.sizeColumnsToFit();
105
- }
106
- openAreYouSureModal(modal) {
107
- this.modalService.open(modal).result.then((result) => {
108
- if (result === "Delete") {
109
- this.deleteDictionaryEntries();
110
- }
111
- }, (reason) => {
112
- });
113
- }
114
- /**
115
- * Fetch the dictionary metadata and dictionary entries based upon the dictionary class name.
116
- *
117
- * @param {string} className
118
- */
119
- getDictionary(className) {
120
- // When Selecting A New Dictionary, Navigate To First Page
121
- if (this.gridOptions && this.gridOptions.api) {
122
- this.gridOptions.api.paginationGoToFirstPage();
123
- }
124
- this.className = className;
125
- this.dataColumns = undefined;
126
- this.loadingSubjects[0].next(true);
127
- this.dictionaryService.getDictionary(className)
128
- .pipe(finalize(() => {
129
- this.loadingSubjects[0].next(false);
130
- })).subscribe((dictionary) => {
131
- this.setUpDictionaryGrid(dictionary);
132
- this.loadingSubjects[0].next(false);
133
- });
134
- this.getDictionaryEntries();
135
- }
136
- getDictionaryEntries() {
137
- this.loadingSubjects[1].next(true);
138
- this.dictionaryService.getDictionaryEntries(this.className)
139
- .pipe(finalize(() => {
140
- this.loadingSubjects[1].next(false);
141
- })).subscribe((dictionaryEntries) => {
142
- this.dictionaryEntries = dictionaryEntries;
143
- this.gridOptions.api.setRowData(dictionaryEntries);
144
- this.gridOptions.api.sizeColumnsToFit();
145
- this.loadingSubjects[1].next(false);
146
- });
147
- }
148
- /**
149
- * Set the dictionary metadata. This is used to build the columns for the dictionary entries. The names, validation,
150
- * and filter classes build the column definition.
151
- *
152
- * @param dictionary
153
- */
154
- setUpDictionaryGrid(dictionary) {
155
- if (isDevMode()) {
156
- console.debug("DictionaryEditorDetailComponent.setDictionary");
157
- console.debug(dictionary);
158
- }
159
- this.dictionary = dictionary;
160
- this.secondaryDictionaryEntries = [];
161
- let dictionaryClassNames = [];
162
- for (let field of dictionary.fields) {
163
- if (field.filterDictionaryClass) {
164
- dictionaryClassNames.push(field.filterDictionaryClass);
165
- }
166
- }
167
- this.getSecondaryDictionaries(dictionaryClassNames);
168
- }
169
- getSecondaryDictionaries(dictionaryNames) {
170
- if (dictionaryNames.length == 0) {
171
- this.finishColumnSetup();
172
- }
173
- else {
174
- let dictionaryName = dictionaryNames.pop();
175
- this.dictionaryService.getDictionaryDropdownEntries(dictionaryName).subscribe((response) => {
176
- this.secondaryDictionaryEntries.push({ dictionaryName: dictionaryName, entries: response });
177
- this.getSecondaryDictionaries(dictionaryNames);
178
- });
179
- }
180
- }
181
- finishColumnSetup() {
182
- this.displayName = this.dictionary.displayName;
183
- // This establishes the readOnly functionality
184
- let cols = [];
185
- // Process Columns And Create Column Definition
186
- for (let field of this.dictionary.fields) {
187
- if (field.id && (isNullOrUndefined(field.code) || field.code == false)) {
188
- continue;
189
- }
190
- let col;
191
- if (field.filterDictionaryClass) {
192
- // this is a dropdown of another dictionary
193
- let options = this.secondaryDictionaryEntries.find((a) => {
194
- return a.dictionaryName === field.filterDictionaryClass;
195
- });
196
- col = {
197
- field: field.name,
198
- headerName: field.displayName,
199
- editable: this.isEditable.bind(this),
200
- cellRendererFramework: SelectRenderer,
201
- cellEditorFramework: SelectEditor,
202
- selectOptionsDisplayField: "display",
203
- selectOptionsValueField: "id",
204
- sortable: true,
205
- resizable: true,
206
- filter: true,
207
- filterValueGetter: this.comboFilterValueGetter,
208
- selectOptions: [],
209
- comparator: (valueA, valueB, nodeA, nodeB, isInverted) => {
210
- return 0;
211
- }
212
- };
213
- if (options && options.entries) {
214
- col.selectOptions = options.entries.sort((optionA, optionB) => {
215
- if (optionA && !optionB) {
216
- return 1;
217
- }
218
- if (optionB && !optionA) {
219
- return -1;
220
- }
221
- if (!optionA && !optionB) {
222
- return 0;
223
- }
224
- if (optionA.display.toLowerCase() > optionB.display.toLowerCase()) {
225
- return 1;
226
- }
227
- else if ((optionB.display.toLowerCase() > optionA.display.toLowerCase())) {
228
- return -1;
229
- }
230
- else {
231
- return 0;
232
- }
233
- });
234
- col.comparator = (valueA, valueB, nodeA, nodeB, isInverted) => {
235
- if (!options.entries) {
236
- return 0;
237
- }
238
- if (valueA && !valueB) {
239
- return 1;
240
- }
241
- if (valueB && !valueA) {
242
- return -1;
243
- }
244
- if (!valueA && !valueB) {
245
- return 0;
246
- }
247
- let optionA = options.entries.find((entry) => ("" + entry.id === "" + valueA));
248
- let optionB = options.entries.find((entry) => ("" + entry.id === "" + valueB));
249
- if (optionA && !optionB) {
250
- return 1;
251
- }
252
- if (optionB && !optionA) {
253
- return -1;
254
- }
255
- if (!optionA && !optionB) {
256
- return 0;
257
- }
258
- if (optionA.display.toLowerCase() > optionB.display.toLowerCase()) {
259
- return 1;
260
- }
261
- else if ((optionB.display.toLowerCase() > optionA.display.toLowerCase())) {
262
- return -1;
263
- }
264
- else {
265
- return 0;
266
- }
267
- };
268
- }
269
- col.cellStyle = params => {
270
- let column = {};
271
- for (let field of params.context.componentParent.dictionary.fields) {
272
- if (params.colDef.field == field.name) {
273
- column = field;
274
- }
275
- }
276
- if (params.data.editOrNew && params.data.editOrNew == "new") {
277
- if (params.context.readOnly || column.readOnly ||
278
- column.protectionType == "Read Only") {
279
- return { color: "#8a9499" };
280
- }
281
- }
282
- else {
283
- if (params.context.readOnly || column.readOnly ||
284
- column.protectionType == "Read Only" || column.createOnly ||
285
- column.protectionType == "Create Only" || column.code) {
286
- return { color: "#8a9499" };
287
- }
288
- }
289
- };
290
- col.displayOrder = field.displayOrder;
291
- col.dictionaryDisplay = field.dictionaryDisplay;
292
- col.dictionaryTooltip = field.dictionaryTooltip;
293
- // Set default filter as compare by text/number
294
- // col.filterRenderer = CompareFilterRenderer;
295
- }
296
- else if (field.type && field.type == "Date") {
297
- //date value
298
- col = {
299
- field: field.name,
300
- headerName: field.displayName,
301
- cellRendererFramework: DateRenderer,
302
- cellEditorFramework: AgGridDateCellEditorComponent,
303
- editable: this.isEditable.bind(this),
304
- sortable: true,
305
- resizable: true,
306
- filter: true,
307
- dictionaryDisplay: field.dictionaryDisplay
308
- };
309
- col.comparator = (valueA, valueB, nodeA, nodeB, isInverted) => {
310
- let num = this.dateComparator(valueA, valueB);
311
- return isInverted ? -1 * num : num; //don't have to do anything with inverted?
312
- };
313
- col.cellStyle = params => {
314
- var column = {};
315
- for (let field of params.context.componentParent.dictionary.fields) {
316
- if (params.colDef.field == field.name) {
317
- column = field;
318
- }
319
- }
320
- if (params.data.editOrNew && params.data.editOrNew == "new") {
321
- if (params.context.readOnly || column.readOnly ||
322
- column.protectionType == "Read Only") {
323
- return { color: "#8a9499" };
324
- }
325
- }
326
- else {
327
- if (params.context.readOnly || column.readOnly ||
328
- column.protectionType == "Read Only" || column.createOnly ||
329
- column.protectionType == "Create Only" || column.code) {
330
- return { color: "#8a9499" };
331
- }
332
- }
333
- };
334
- col.displayOrder = field.displayOrder;
335
- }
336
- else {
337
- // this is a string value
338
- col = {
339
- field: field.name,
340
- headerName: field.displayName,
341
- editable: this.isEditable.bind(this),
342
- sortable: true,
343
- resizable: true,
344
- filter: true,
345
- dictionaryDisplay: field.dictionaryDisplay
346
- };
347
- col.comparator = (valueA, valueB, nodeA, nodeB, isInverted) => {
348
- if (valueA && !valueB) {
349
- return 1;
350
- }
351
- if (valueB && !valueA) {
352
- return -1;
353
- }
354
- if (!valueA && !valueB) {
355
- return 0;
356
- }
357
- if (valueA.toLowerCase() > valueB.toLowerCase()) {
358
- return 1;
359
- }
360
- else if ((valueB.toLowerCase() > valueA.toLowerCase())) {
361
- return -1;
362
- }
363
- else {
364
- return 0;
365
- }
366
- };
367
- col.cellStyle = params => {
368
- var column = {};
369
- for (let field of params.context.componentParent.dictionary.fields) {
370
- if (params.colDef.field == field.name) {
371
- column = field;
372
- }
373
- }
374
- if (params.data.editOrNew && params.data.editOrNew == "new") {
375
- if (params.context.readOnly || column.readOnly ||
376
- column.protectionType == "Read Only") {
377
- return { color: "#8a9499" };
378
- }
379
- }
380
- else {
381
- if (params.context.readOnly || column.readOnly ||
382
- column.protectionType == "Read Only" || column.createOnly ||
383
- column.protectionType == "Create Only" || column.code) {
384
- return { color: "#8a9499" };
385
- }
386
- }
387
- };
388
- col.displayOrder = field.displayOrder;
389
- // Set default filter as compare by text/number
390
- // col.filterRenderer = CompareFilterRenderer;
391
- }
392
- cols.push(col);
393
- }
394
- // Now we need to sort the columns
395
- if (!this.dictionary.fields[0].hasOwnProperty("displayOrder")) {
396
- // default case, no displayOrder
397
- cols = cols.sort((a, b) => {
398
- if (!a.headerName && b.headerName) {
399
- return 1;
400
- }
401
- else if (!b.headerName && a.headerName) {
402
- return -1;
403
- }
404
- else if (a.dictionaryDisplay === true && b.dictionaryDisplay === false) {
405
- return -1;
406
- }
407
- else if (b.dictionaryDisplay === true && a.dictionaryDisplay === false) {
408
- return 1;
409
- }
410
- else if (a.dictionaryTooltip === true && b.dictionaryTooltip === false) {
411
- return -1;
412
- }
413
- else if (b.dictionaryTooltip === true && a.dictionaryTooltip === false) {
414
- return 1;
415
- }
416
- else {
417
- return 0;
418
- }
419
- });
420
- }
421
- else {
422
- // DisplayOrder case
423
- // I think this works? Check later
424
- cols = cols.sort((a, b) => {
425
- if (!a.headerName && b.headerName) {
426
- return 1;
427
- }
428
- else if (!b.headerName && a.headerName) {
429
- return -1;
430
- }
431
- else {
432
- return a.displayOrder - b.displayOrder;
433
- }
434
- });
435
- }
436
- // After Columns Have Been Sorted
437
- // Dictionary Grid Will Sort The Grid Ascending Order By First Column
438
- if (cols && cols.length != 0) {
439
- cols[0].sort = "asc";
440
- }
441
- this.dataColumns = cols;
442
- if (Array.isArray(this.dataColumns) && this.gridOptions && this.gridOptions.api) {
443
- this.gridOptions.api.setColumnDefs(this.dataColumns);
444
- this.gridOptions.api.sizeColumnsToFit();
445
- }
446
- }
447
- isEditable(params) {
448
- let isEditable;
449
- let column = {};
450
- for (let field of this.dictionary.fields) {
451
- if (params.colDef.field == field.name) {
452
- column = field;
453
- }
454
- }
455
- if (params.data.editOrNew && params.data.editOrNew == "new") {
456
- // console.log("new editable?");
457
- isEditable = !(this.dictionary.readOnly || column.readOnly ||
458
- column.protectionType == "Read Only");
459
- }
460
- else {
461
- // console.log("edit editable?");
462
- isEditable = !(this.dictionary.readOnly || column.readOnly ||
463
- column.protectionType == "Read Only" || column.createOnly ||
464
- column.protectionType == "Create Only" || column.code);
465
- }
466
- return isEditable;
467
- }
468
- deleteDictionaryEntries() {
469
- let deleteRows = this.gridOptions.api.getSelectedRows();
470
- for (let deleteId of this.selectedRows) {
471
- for (let entry of this.dictionaryEntries) {
472
- if (entry[this.idColumn] === deleteId) {
473
- deleteRows.push(entry);
474
- break;
475
- }
476
- }
477
- }
478
- this.dictionaryService.deleteDictionaryEntries(this.className, deleteRows).subscribe((response) => {
479
- this.getDictionaryEntries();
480
- });
481
- }
482
- updateDictionary(event) {
483
- // Important to note this will not update cells to the demo but will when imported to CORE or other applications.
484
- this.dictionaryService.updateDictionaryEntries(this.className, [event.data]).subscribe((data) => {
485
- this.getDictionaryEntries();
486
- });
487
- }
488
- setSelectedEntries() {
489
- this.selectedRows = this.gridOptions.api.getSelectedRows();
490
- }
491
- newRowPost(data) {
492
- return this.dictionaryService.addDictionaryEntries(this.className, [data])
493
- .pipe(map((data) => {
494
- if (data && data.length === 1) {
495
- return data[0];
496
- }
497
- else {
498
- return data;
499
- }
500
- }));
501
- }
502
- static onSamplesGridReady(event) {
503
- event.api.sizeColumnsToFit();
504
- }
505
- static onGridSizeChanged(event) {
506
- if (event && event.api) {
507
- event.api.sizeColumnsToFit();
508
- }
509
- }
510
- get disableAddRow() {
511
- if (!this.dictionary) {
512
- return true;
513
- }
514
- return this.dictionary.readOnly && this.dictionary.readOnly === true;
515
- }
516
- get disableDelete() {
517
- if (!this.dictionary) {
518
- return true;
519
- }
520
- if (this.dictionary.readOnly && this.dictionary.readOnly === true) {
521
- return true;
522
- }
523
- if (this.gridOptions && this.gridOptions.api && this.gridOptions.api.getSelectedRows()) {
524
- return this.gridOptions.api.getSelectedRows().length === 0;
525
- }
526
- else {
527
- return true;
528
- }
529
- }
530
- comboFilterValueGetter(params) {
531
- let value = params.data[params.colDef.field];
532
- if (value) {
533
- let option = params.colDef.selectOptions.find((entry) => (entry[params.colDef.selectOptionsValueField] === value));
534
- return option ? option[params.colDef.selectOptionsDisplayField] : "";
535
- }
536
- return "";
537
- }
538
- onClickAddRow() {
539
- const modalRef = this.modalService.open(NewRowComponent, {
540
- size: "lg",
541
- keyboard: false,
542
- backdrop: "static",
543
- centered: true,
544
- });
545
- modalRef.componentInstance.colDefs = this.dataColumns;
546
- modalRef.componentInstance.dictionary = this.dictionary;
547
- if (!this.newRowSubscription) {
548
- // tell other ag-grid to add row to it
549
- this.newRowSubscription = modalRef.componentInstance.newRowSubject.subscribe((theNewRow) => {
550
- this.dictionaryEntries = theNewRow.concat(this.dictionaryEntries);
551
- this.gridOptions.api.setRowData(this.dictionaryEntries);
552
- this.newRowSubscription = null;
553
- // Important to note this will not add rows to the demo but will when imported to CORE or other applications.
554
- this.newRowPost(theNewRow[0]).subscribe(() => {
555
- this.getDictionaryEntries();
556
- });
557
- });
558
- }
559
- }
560
- /**
561
- * Comparater To Compare 2 Dates
562
- * @param date1 Date 1
563
- * @param date2 Date 2
564
- */
565
- dateComparator(date1, date2) {
566
- let date1Number = monthToComparableNumber(date1);
567
- let date2Number = monthToComparableNumber(date2);
568
- if (date1Number === null && date2Number === null) {
569
- return 0;
570
- }
571
- if (date1Number === null) {
572
- return -1;
573
- }
574
- if (date2Number === null) {
575
- return 1;
576
- }
577
- return date1Number - date2Number;
578
- }
579
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DictionaryEditorDetailComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.NgbModal }, { token: i3.DictionaryService }, { token: DICTIONARY_ENDPOINT }], target: i0.ɵɵFactoryTarget.Component }); }
580
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DictionaryEditorDetailComponent, selector: "hci-dictionary-editor-detail", host: { properties: { "class": "this.classList" } }, ngImport: i0, template: `
1
+ import { Component, Inject, isDevMode, HostBinding } from "@angular/core";
2
+ import { ActivatedRoute } from "@angular/router";
3
+ import { BehaviorSubject } from "rxjs";
4
+ import { finalize, map } from "rxjs/operators";
5
+ import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
6
+ import { DictionaryService, DICTIONARY_ENDPOINT } from "@huntsman-cancer-institute/dictionary-service";
7
+ import { SelectRenderer } from "../grid-renderers/select.renderer";
8
+ import { SelectEditor } from "../grid-editors/select.editor";
9
+ import { NewRowComponent } from "./new-row.component";
10
+ import { isNullOrUndefined } from "util";
11
+ import { DateRenderer } from "../grid-renderers/date.renderer";
12
+ import { AgGridDateCellEditorComponent } from "../grid-editors/ag-grid-date-cell-editor.component";
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/router";
15
+ import * as i2 from "@ng-bootstrap/ng-bootstrap";
16
+ import * as i3 from "@huntsman-cancer-institute/dictionary-service";
17
+ import * as i4 from "@huntsman-cancer-institute/misc";
18
+ import * as i5 from "ag-grid-angular";
19
+ /**
20
+ * When a dictionary is selected this component is shown. There is a top grid which for its data shows all the columns
21
+ * for the dictionary. Currently, keep this for reference only and have non-editable.
22
+ * The bottom grid will show those columns as actual columns and its data are all the dictionary values. Rows can be
23
+ * added. For deleting, need to make sure the id is not used anywhere. For editing, need to make sure the code or anything
24
+ * else isn't being referenced.
25
+ *
26
+ * @since 1.0.0
27
+ */
28
+ export class DictionaryEditorDetailComponent {
29
+ constructor(route, modalService, dictionaryService, dictionaryEndpoint) {
30
+ this.route = route;
31
+ this.modalService = modalService;
32
+ this.dictionaryService = dictionaryService;
33
+ this.dictionaryEndpoint = dictionaryEndpoint;
34
+ this.classList = "outlet-column y-auto";
35
+ this.dictionaryEntries = [];
36
+ this.selectedRows = [];
37
+ this.loadingSubjects = [];
38
+ this.metaGridOptions = {
39
+ rowStyle: {
40
+ "font-family": "Prompt, sans-serif"
41
+ },
42
+ enableCellTextSelection: true,
43
+ ensureDomOrder: true
44
+ };
45
+ this.gridOptions = {
46
+ context: {
47
+ componentParent: this
48
+ },
49
+ onGridReady: DictionaryEditorDetailComponent.onSamplesGridReady,
50
+ onGridSizeChanged: DictionaryEditorDetailComponent.onGridSizeChanged,
51
+ suppressHorizontalScroll: false,
52
+ selectionMode: "multiple",
53
+ stopEditingWhenGridLosesFocus: true,
54
+ enableSorting: true,
55
+ enableFilter: true
56
+ };
57
+ }
58
+ /**
59
+ * Based on the route class name, make the call to fetch the dictionary data. Since this component is route based,
60
+ * when the dictionary class in the route changes, this component is reloaded.
61
+ */
62
+ ngOnInit() {
63
+ this.boundNewRowPostCall = this.newRowPost.bind(this);
64
+ this.loadingSubjects.push(new BehaviorSubject(false));
65
+ this.loadingSubjects.push(new BehaviorSubject(false));
66
+ this.route.params.subscribe(params => {
67
+ let className = params["className"];
68
+ this.getDictionary(className);
69
+ });
70
+ }
71
+ openModal(modal) {
72
+ this.modalService.open(modal, { windowClass: "modal-xl" }).result.then((result) => {
73
+ }, (reason) => {
74
+ });
75
+ }
76
+ ngAfterViewInit() {
77
+ this.gridOptions.api.sizeColumnsToFit();
78
+ }
79
+ columnDefMeta() {
80
+ return [
81
+ { field: "name", headerName: "Name", width: 175, sortable: true, resizable: true, editable: false },
82
+ { field: "description", headerName: "Description", width: 250, sortable: true, resizable: true, editable: false },
83
+ { field: "id", headerName: "Id", width: 60, sortable: true, resizable: true, editable: false },
84
+ { field: "type", headerName: "Type", sortable: true, resizable: true, editable: false },
85
+ { field: "protectionType", headerName: "ProtectionType", sortable: true, resizable: true, editable: false },
86
+ { field: "filterDictionaryClass", headerName: "FilterDictionaryClass", width: 180, sortable: true, resizable: true, editable: false },
87
+ { field: "notNull", headerName: "NotNull", sortable: true, resizable: true, editable: false },
88
+ { field: "integer", headerName: "Integer", width: 75, sortable: true, resizable: true, editable: false },
89
+ { field: "min", headerName: "Min", width: 60, sortable: true, resizable: true, editable: false },
90
+ { field: "max", headerName: "Max", width: 60, sortable: true, resizable: true, editable: false },
91
+ { field: "fraction", headerName: "Fraction", sortable: true, resizable: true, editable: false },
92
+ { field: "dictionaryTooltip", headerName: "DictionaryTooltip", width: 200, sortable: true, resizable: true, editable: false },
93
+ { field: "dictionaryDisplay", headerName: "DictionaryDisplay", width: 175, sortable: true, resizable: true, editable: false },
94
+ { field: "filterable", headerName: "Filterable", sortable: true, resizable: true, editable: false },
95
+ { field: "displayName", headerName: "DisplayName", width: 175, sortable: true, resizable: true, editable: false },
96
+ { field: "displayOrder", headerName: "DisplayOrder", width: 60, sortable: true, resizable: true, editable: false },
97
+ { field: "cellStyle", headerName: "CellStyle", sortable: true, resizable: true, editable: false },
98
+ ]; // the widths for the last 2 could be wrong.
99
+ }
100
+ onMetaGridReady(params) {
101
+ this.gridApiMeta = params.api;
102
+ this.gridApiMeta.setColumnDefs(this.columnDefMeta());
103
+ this.gridApiMeta.setRowData(this.dictionary?.fields);
104
+ // this.gridApiMeta.sizeColumnsToFit();
105
+ }
106
+ openAreYouSureModal(modal) {
107
+ this.modalService.open(modal).result.then((result) => {
108
+ if (result === "Delete") {
109
+ this.deleteDictionaryEntries();
110
+ }
111
+ }, (reason) => {
112
+ });
113
+ }
114
+ /**
115
+ * Fetch the dictionary metadata and dictionary entries based upon the dictionary class name.
116
+ *
117
+ * @param {string} className
118
+ */
119
+ getDictionary(className) {
120
+ // When Selecting A New Dictionary, Navigate To First Page
121
+ if (this.gridOptions && this.gridOptions.api) {
122
+ this.gridOptions.api.paginationGoToFirstPage();
123
+ }
124
+ this.className = className;
125
+ this.dataColumns = undefined;
126
+ this.loadingSubjects[0].next(true);
127
+ this.dictionaryService.getDictionary(className)
128
+ .pipe(finalize(() => {
129
+ this.loadingSubjects[0].next(false);
130
+ })).subscribe((dictionary) => {
131
+ this.setUpDictionaryGrid(dictionary);
132
+ this.loadingSubjects[0].next(false);
133
+ });
134
+ this.getDictionaryEntries();
135
+ }
136
+ getDictionaryEntries() {
137
+ this.loadingSubjects[1].next(true);
138
+ this.dictionaryService.getDictionaryEntries(this.className)
139
+ .pipe(finalize(() => {
140
+ this.loadingSubjects[1].next(false);
141
+ })).subscribe((dictionaryEntries) => {
142
+ this.dictionaryEntries = dictionaryEntries;
143
+ this.gridOptions.api.setRowData(dictionaryEntries);
144
+ this.gridOptions.api.sizeColumnsToFit();
145
+ this.loadingSubjects[1].next(false);
146
+ });
147
+ }
148
+ /**
149
+ * Set the dictionary metadata. This is used to build the columns for the dictionary entries. The names, validation,
150
+ * and filter classes build the column definition.
151
+ *
152
+ * @param dictionary
153
+ */
154
+ setUpDictionaryGrid(dictionary) {
155
+ if (isDevMode()) {
156
+ console.debug("DictionaryEditorDetailComponent.setDictionary");
157
+ console.debug(dictionary);
158
+ }
159
+ this.dictionary = dictionary;
160
+ this.secondaryDictionaryEntries = [];
161
+ let dictionaryClassNames = [];
162
+ for (let field of dictionary.fields) {
163
+ if (field.filterDictionaryClass) {
164
+ dictionaryClassNames.push(field.filterDictionaryClass);
165
+ }
166
+ }
167
+ this.getSecondaryDictionaries(dictionaryClassNames);
168
+ }
169
+ getSecondaryDictionaries(dictionaryNames) {
170
+ if (dictionaryNames.length == 0) {
171
+ this.finishColumnSetup();
172
+ }
173
+ else {
174
+ let dictionaryName = dictionaryNames.pop();
175
+ this.dictionaryService.getDictionaryDropdownEntries(dictionaryName).subscribe((response) => {
176
+ this.secondaryDictionaryEntries.push({ dictionaryName: dictionaryName, entries: response });
177
+ this.getSecondaryDictionaries(dictionaryNames);
178
+ });
179
+ }
180
+ }
181
+ finishColumnSetup() {
182
+ this.displayName = this.dictionary.displayName;
183
+ // This establishes the readOnly functionality
184
+ let cols = [];
185
+ // Process Columns And Create Column Definition
186
+ for (let field of this.dictionary.fields) {
187
+ if (field.id && (isNullOrUndefined(field.code) || field.code == false)) {
188
+ continue;
189
+ }
190
+ let col;
191
+ if (field.filterDictionaryClass) {
192
+ // this is a dropdown of another dictionary
193
+ let options = this.secondaryDictionaryEntries.find((a) => {
194
+ return a.dictionaryName === field.filterDictionaryClass;
195
+ });
196
+ col = {
197
+ field: field.name,
198
+ headerName: field.displayName,
199
+ editable: this.isEditable.bind(this),
200
+ cellRendererFramework: SelectRenderer,
201
+ cellEditorFramework: SelectEditor,
202
+ selectOptionsDisplayField: "display",
203
+ selectOptionsValueField: "id",
204
+ sortable: true,
205
+ resizable: true,
206
+ filter: true,
207
+ filterValueGetter: this.comboFilterValueGetter,
208
+ selectOptions: [],
209
+ comparator: (valueA, valueB, nodeA, nodeB, isInverted) => {
210
+ return 0;
211
+ }
212
+ };
213
+ if (options && options.entries) {
214
+ col.selectOptions = options.entries.sort((optionA, optionB) => {
215
+ if (optionA && !optionB) {
216
+ return 1;
217
+ }
218
+ if (optionB && !optionA) {
219
+ return -1;
220
+ }
221
+ if (!optionA && !optionB) {
222
+ return 0;
223
+ }
224
+ if (optionA.display.toLowerCase() > optionB.display.toLowerCase()) {
225
+ return 1;
226
+ }
227
+ else if ((optionB.display.toLowerCase() > optionA.display.toLowerCase())) {
228
+ return -1;
229
+ }
230
+ else {
231
+ return 0;
232
+ }
233
+ });
234
+ col.comparator = (valueA, valueB, nodeA, nodeB, isInverted) => {
235
+ if (!options.entries) {
236
+ return 0;
237
+ }
238
+ if (valueA && !valueB) {
239
+ return 1;
240
+ }
241
+ if (valueB && !valueA) {
242
+ return -1;
243
+ }
244
+ if (!valueA && !valueB) {
245
+ return 0;
246
+ }
247
+ let optionA = options.entries.find((entry) => ("" + entry.id === "" + valueA));
248
+ let optionB = options.entries.find((entry) => ("" + entry.id === "" + valueB));
249
+ if (optionA && !optionB) {
250
+ return 1;
251
+ }
252
+ if (optionB && !optionA) {
253
+ return -1;
254
+ }
255
+ if (!optionA && !optionB) {
256
+ return 0;
257
+ }
258
+ if (optionA.display.toLowerCase() > optionB.display.toLowerCase()) {
259
+ return 1;
260
+ }
261
+ else if ((optionB.display.toLowerCase() > optionA.display.toLowerCase())) {
262
+ return -1;
263
+ }
264
+ else {
265
+ return 0;
266
+ }
267
+ };
268
+ }
269
+ col.cellStyle = params => {
270
+ let column = {};
271
+ for (let field of params.context.componentParent.dictionary.fields) {
272
+ if (params.colDef.field == field.name) {
273
+ column = field;
274
+ }
275
+ }
276
+ if (params.data.editOrNew && params.data.editOrNew == "new") {
277
+ if (params.context.readOnly || column.readOnly ||
278
+ column.protectionType == "Read Only") {
279
+ return { color: "#8a9499" };
280
+ }
281
+ }
282
+ else {
283
+ if (params.context.readOnly || column.readOnly ||
284
+ column.protectionType == "Read Only" || column.createOnly ||
285
+ column.protectionType == "Create Only" || column.code) {
286
+ return { color: "#8a9499" };
287
+ }
288
+ }
289
+ };
290
+ col.displayOrder = field.displayOrder;
291
+ col.dictionaryDisplay = field.dictionaryDisplay;
292
+ col.dictionaryTooltip = field.dictionaryTooltip;
293
+ // Set default filter as compare by text/number
294
+ // col.filterRenderer = CompareFilterRenderer;
295
+ }
296
+ else if (field.type && field.type == "Date") {
297
+ //date value
298
+ col = {
299
+ field: field.name,
300
+ headerName: field.displayName,
301
+ cellRendererFramework: DateRenderer,
302
+ cellEditorFramework: AgGridDateCellEditorComponent,
303
+ editable: this.isEditable.bind(this),
304
+ sortable: true,
305
+ resizable: true,
306
+ filter: true,
307
+ dictionaryDisplay: field.dictionaryDisplay
308
+ };
309
+ col.comparator = (valueA, valueB, nodeA, nodeB, isInverted) => {
310
+ let num = this.dateComparator(valueA, valueB);
311
+ return isInverted ? -1 * num : num; //don't have to do anything with inverted?
312
+ };
313
+ col.cellStyle = params => {
314
+ var column = {};
315
+ for (let field of params.context.componentParent.dictionary.fields) {
316
+ if (params.colDef.field == field.name) {
317
+ column = field;
318
+ }
319
+ }
320
+ if (params.data.editOrNew && params.data.editOrNew == "new") {
321
+ if (params.context.readOnly || column.readOnly ||
322
+ column.protectionType == "Read Only") {
323
+ return { color: "#8a9499" };
324
+ }
325
+ }
326
+ else {
327
+ if (params.context.readOnly || column.readOnly ||
328
+ column.protectionType == "Read Only" || column.createOnly ||
329
+ column.protectionType == "Create Only" || column.code) {
330
+ return { color: "#8a9499" };
331
+ }
332
+ }
333
+ };
334
+ col.displayOrder = field.displayOrder;
335
+ }
336
+ else {
337
+ // this is a string value
338
+ col = {
339
+ field: field.name,
340
+ headerName: field.displayName,
341
+ editable: this.isEditable.bind(this),
342
+ sortable: true,
343
+ resizable: true,
344
+ filter: true,
345
+ dictionaryDisplay: field.dictionaryDisplay
346
+ };
347
+ col.comparator = (valueA, valueB, nodeA, nodeB, isInverted) => {
348
+ if (valueA && !valueB) {
349
+ return 1;
350
+ }
351
+ if (valueB && !valueA) {
352
+ return -1;
353
+ }
354
+ if (!valueA && !valueB) {
355
+ return 0;
356
+ }
357
+ if (valueA.toLowerCase() > valueB.toLowerCase()) {
358
+ return 1;
359
+ }
360
+ else if ((valueB.toLowerCase() > valueA.toLowerCase())) {
361
+ return -1;
362
+ }
363
+ else {
364
+ return 0;
365
+ }
366
+ };
367
+ col.cellStyle = params => {
368
+ var column = {};
369
+ for (let field of params.context.componentParent.dictionary.fields) {
370
+ if (params.colDef.field == field.name) {
371
+ column = field;
372
+ }
373
+ }
374
+ if (params.data.editOrNew && params.data.editOrNew == "new") {
375
+ if (params.context.readOnly || column.readOnly ||
376
+ column.protectionType == "Read Only") {
377
+ return { color: "#8a9499" };
378
+ }
379
+ }
380
+ else {
381
+ if (params.context.readOnly || column.readOnly ||
382
+ column.protectionType == "Read Only" || column.createOnly ||
383
+ column.protectionType == "Create Only" || column.code) {
384
+ return { color: "#8a9499" };
385
+ }
386
+ }
387
+ };
388
+ col.displayOrder = field.displayOrder;
389
+ // Set default filter as compare by text/number
390
+ // col.filterRenderer = CompareFilterRenderer;
391
+ }
392
+ cols.push(col);
393
+ }
394
+ // Now we need to sort the columns
395
+ if (!this.dictionary.fields[0].hasOwnProperty("displayOrder")) {
396
+ // default case, no displayOrder
397
+ cols = cols.sort((a, b) => {
398
+ if (!a.headerName && b.headerName) {
399
+ return 1;
400
+ }
401
+ else if (!b.headerName && a.headerName) {
402
+ return -1;
403
+ }
404
+ else if (a.dictionaryDisplay === true && b.dictionaryDisplay === false) {
405
+ return -1;
406
+ }
407
+ else if (b.dictionaryDisplay === true && a.dictionaryDisplay === false) {
408
+ return 1;
409
+ }
410
+ else if (a.dictionaryTooltip === true && b.dictionaryTooltip === false) {
411
+ return -1;
412
+ }
413
+ else if (b.dictionaryTooltip === true && a.dictionaryTooltip === false) {
414
+ return 1;
415
+ }
416
+ else {
417
+ return 0;
418
+ }
419
+ });
420
+ }
421
+ else {
422
+ // DisplayOrder case
423
+ // I think this works? Check later
424
+ cols = cols.sort((a, b) => {
425
+ if (!a.headerName && b.headerName) {
426
+ return 1;
427
+ }
428
+ else if (!b.headerName && a.headerName) {
429
+ return -1;
430
+ }
431
+ else {
432
+ return a.displayOrder - b.displayOrder;
433
+ }
434
+ });
435
+ }
436
+ // After Columns Have Been Sorted
437
+ // Dictionary Grid Will Sort The Grid Ascending Order By First Column
438
+ if (cols && cols.length != 0) {
439
+ cols[0].sort = "asc";
440
+ }
441
+ this.dataColumns = cols;
442
+ if (Array.isArray(this.dataColumns) && this.gridOptions && this.gridOptions.api) {
443
+ this.gridOptions.api.setColumnDefs(this.dataColumns);
444
+ this.gridOptions.api.sizeColumnsToFit();
445
+ }
446
+ }
447
+ isEditable(params) {
448
+ let isEditable;
449
+ let column = {};
450
+ for (let field of this.dictionary.fields) {
451
+ if (params.colDef.field == field.name) {
452
+ column = field;
453
+ }
454
+ }
455
+ if (params.data.editOrNew && params.data.editOrNew == "new") {
456
+ // console.log("new editable?");
457
+ isEditable = !(this.dictionary.readOnly || column.readOnly ||
458
+ column.protectionType == "Read Only");
459
+ }
460
+ else {
461
+ // console.log("edit editable?");
462
+ isEditable = !(this.dictionary.readOnly || column.readOnly ||
463
+ column.protectionType == "Read Only" || column.createOnly ||
464
+ column.protectionType == "Create Only" || column.code);
465
+ }
466
+ return isEditable;
467
+ }
468
+ deleteDictionaryEntries() {
469
+ let deleteRows = this.gridOptions.api.getSelectedRows();
470
+ for (let deleteId of this.selectedRows) {
471
+ for (let entry of this.dictionaryEntries) {
472
+ if (entry[this.idColumn] === deleteId) {
473
+ deleteRows.push(entry);
474
+ break;
475
+ }
476
+ }
477
+ }
478
+ this.dictionaryService.deleteDictionaryEntries(this.className, deleteRows).subscribe((response) => {
479
+ this.getDictionaryEntries();
480
+ });
481
+ }
482
+ updateDictionary(event) {
483
+ // Important to note this will not update cells to the demo but will when imported to CORE or other applications.
484
+ this.dictionaryService.updateDictionaryEntries(this.className, [event.data]).subscribe((data) => {
485
+ this.getDictionaryEntries();
486
+ });
487
+ }
488
+ setSelectedEntries() {
489
+ this.selectedRows = this.gridOptions.api.getSelectedRows();
490
+ }
491
+ newRowPost(data) {
492
+ return this.dictionaryService.addDictionaryEntries(this.className, [data])
493
+ .pipe(map((data) => {
494
+ if (data && data.length === 1) {
495
+ return data[0];
496
+ }
497
+ else {
498
+ return data;
499
+ }
500
+ }));
501
+ }
502
+ static onSamplesGridReady(event) {
503
+ event.api.sizeColumnsToFit();
504
+ }
505
+ static onGridSizeChanged(event) {
506
+ if (event && event.api) {
507
+ event.api.sizeColumnsToFit();
508
+ }
509
+ }
510
+ get disableAddRow() {
511
+ if (!this.dictionary) {
512
+ return true;
513
+ }
514
+ return this.dictionary.readOnly && this.dictionary.readOnly === true;
515
+ }
516
+ get disableDelete() {
517
+ if (!this.dictionary) {
518
+ return true;
519
+ }
520
+ if (this.dictionary.readOnly && this.dictionary.readOnly === true) {
521
+ return true;
522
+ }
523
+ if (this.gridOptions && this.gridOptions.api && this.gridOptions.api.getSelectedRows()) {
524
+ return this.gridOptions.api.getSelectedRows().length === 0;
525
+ }
526
+ else {
527
+ return true;
528
+ }
529
+ }
530
+ comboFilterValueGetter(params) {
531
+ let value = params.data[params.colDef.field];
532
+ if (value) {
533
+ let option = params.colDef.selectOptions.find((entry) => (entry[params.colDef.selectOptionsValueField] === value));
534
+ return option ? option[params.colDef.selectOptionsDisplayField] : "";
535
+ }
536
+ return "";
537
+ }
538
+ onClickAddRow() {
539
+ const modalRef = this.modalService.open(NewRowComponent, {
540
+ size: "lg",
541
+ keyboard: false,
542
+ backdrop: "static",
543
+ centered: true,
544
+ });
545
+ modalRef.componentInstance.colDefs = this.dataColumns;
546
+ modalRef.componentInstance.dictionary = this.dictionary;
547
+ if (!this.newRowSubscription) {
548
+ // tell other ag-grid to add row to it
549
+ this.newRowSubscription = modalRef.componentInstance.newRowSubject.subscribe((theNewRow) => {
550
+ this.dictionaryEntries = theNewRow.concat(this.dictionaryEntries);
551
+ this.gridOptions.api.setRowData(this.dictionaryEntries);
552
+ this.newRowSubscription = null;
553
+ // Important to note this will not add rows to the demo but will when imported to CORE or other applications.
554
+ this.newRowPost(theNewRow[0]).subscribe(() => {
555
+ this.getDictionaryEntries();
556
+ });
557
+ });
558
+ }
559
+ }
560
+ /**
561
+ * Comparater To Compare 2 Dates
562
+ * @param date1 Date 1
563
+ * @param date2 Date 2
564
+ */
565
+ dateComparator(date1, date2) {
566
+ let date1Number = monthToComparableNumber(date1);
567
+ let date2Number = monthToComparableNumber(date2);
568
+ if (date1Number === null && date2Number === null) {
569
+ return 0;
570
+ }
571
+ if (date1Number === null) {
572
+ return -1;
573
+ }
574
+ if (date2Number === null) {
575
+ return 1;
576
+ }
577
+ return date1Number - date2Number;
578
+ }
579
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: DictionaryEditorDetailComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.NgbModal }, { token: i3.DictionaryService }, { token: DICTIONARY_ENDPOINT }], target: i0.ɵɵFactoryTarget.Component }); }
580
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: DictionaryEditorDetailComponent, selector: "hci-dictionary-editor-detail", host: { properties: { "class": "this.classList" } }, ngImport: i0, template: `
581
581
  <div class="d-flex flex-column hci-dictionary-detail-body"
582
582
  >
583
583
  <hci-busy [busySubjects]="loadingSubjects"></hci-busy>
@@ -661,10 +661,10 @@ export class DictionaryEditorDetailComponent {
661
661
  </div>
662
662
  </ng-template>
663
663
  </div>
664
- `, isInline: true, styles: [".full-height{height:100%}.full-width{width:100%}.ag-theme-balham{font-family:Prompt;font-weight:500}.active-color{float:right;font-size:15px;color:var(--bluewarm-dark)}.deactivated-color{float:right;font-size:15px;color:var(--greywarm-medlight)}.dictionary-info-section{padding-top:10px}.dictionary-title{float:left;font-size:16px;padding-left:10px;padding-right:10px;padding-top:5px}.metadata-button{color:var(--white-lightest);float:left;font-size:15px}:host::ng-deep .ag-header-cell{background-color:var(--bluewarmvividfade-lightest);border:lightgray solid thin}:host::ng-deep .ag-cell{border-right:lightgray solid thin;border-left:lightgray solid thin}:host::ng-deep .ag-row{border-bottom:0;border-top:0}:host::ng-deep .ag-row-even{background-color:var(--white-medium)}.hci-dictionary-detail-body{height:100%;width:100%;background:linear-gradient(0deg,var(--white-lightest) 30%,var(--bluewarmvividfade-lighter) 100%)!important}.hci-dictoinary-display-grid{padding-right:5px;padding-left:5px;box-shadow:#00000059 0 5px 15px}:host::ng-deep .ag-row-hover{color:#666!important;background-color:var(--bluewarmvividfade-lighter)!important}:host::ng-deep .ag-row-selected .ag-cell{color:var(--white-lightest)!important}:host::ng-deep .ag-row-selected{color:var(--white-darker)!important;background-color:var(--bluewarmvivid-lighter)!important}\n"], dependencies: [{ kind: "component", type: i4.BusyComponent, selector: "hci-busy", inputs: ["busy", "busySubjects", "getBusySubjects", "parentSelector", "rootClass", "icon", "iconSize", "showIcon", "mxAuto", "myAuto", "text", "template", "config"] }, { kind: "component", type: i5.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }] }); }
665
- }
666
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DictionaryEditorDetailComponent, decorators: [{
667
- type: Component,
664
+ `, isInline: true, styles: [".full-height{height:100%}.full-width{width:100%}.ag-theme-balham{font-family:Prompt;font-weight:500}.active-color{float:right;font-size:15px;color:var(--bluewarm-dark)}.deactivated-color{float:right;font-size:15px;color:var(--greywarm-medlight)}.dictionary-info-section{padding-top:10px}.dictionary-title{float:left;font-size:16px;padding-left:10px;padding-right:10px;padding-top:5px}.metadata-button{color:var(--white-lightest);float:left;font-size:15px}:host::ng-deep .ag-header-cell{background-color:var(--bluewarmvividfade-lightest);border:lightgray solid thin}:host::ng-deep .ag-cell{border-right:lightgray solid thin;border-left:lightgray solid thin}:host::ng-deep .ag-row{border-bottom:0;border-top:0}:host::ng-deep .ag-row-even{background-color:var(--white-medium)}.hci-dictionary-detail-body{height:100%;width:100%;background:linear-gradient(0deg,var(--white-lightest) 30%,var(--bluewarmvividfade-lighter) 100%)!important}.hci-dictoinary-display-grid{padding-right:5px;padding-left:5px;box-shadow:#00000059 0 5px 15px}:host::ng-deep .ag-row-hover{color:#666!important;background-color:var(--bluewarmvividfade-lighter)!important}:host::ng-deep .ag-row-selected .ag-cell{color:var(--white-lightest)!important}:host::ng-deep .ag-row-selected{color:var(--white-darker)!important;background-color:var(--bluewarmvivid-lighter)!important}\n"], dependencies: [{ kind: "component", type: i4.BusyComponent, selector: "hci-busy", inputs: ["busy", "busySubjects", "getBusySubjects", "parentSelector", "rootClass", "icon", "iconSize", "showIcon", "mxAuto", "myAuto", "text", "template", "config"] }, { kind: "component", type: i5.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }] }); }
665
+ }
666
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: DictionaryEditorDetailComponent, decorators: [{
667
+ type: Component,
668
668
  args: [{ selector: "hci-dictionary-editor-detail", template: `
669
669
  <div class="d-flex flex-column hci-dictionary-detail-body"
670
670
  >
@@ -749,25 +749,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
749
749
  </div>
750
750
  </ng-template>
751
751
  </div>
752
- `, styles: [".full-height{height:100%}.full-width{width:100%}.ag-theme-balham{font-family:Prompt;font-weight:500}.active-color{float:right;font-size:15px;color:var(--bluewarm-dark)}.deactivated-color{float:right;font-size:15px;color:var(--greywarm-medlight)}.dictionary-info-section{padding-top:10px}.dictionary-title{float:left;font-size:16px;padding-left:10px;padding-right:10px;padding-top:5px}.metadata-button{color:var(--white-lightest);float:left;font-size:15px}:host::ng-deep .ag-header-cell{background-color:var(--bluewarmvividfade-lightest);border:lightgray solid thin}:host::ng-deep .ag-cell{border-right:lightgray solid thin;border-left:lightgray solid thin}:host::ng-deep .ag-row{border-bottom:0;border-top:0}:host::ng-deep .ag-row-even{background-color:var(--white-medium)}.hci-dictionary-detail-body{height:100%;width:100%;background:linear-gradient(0deg,var(--white-lightest) 30%,var(--bluewarmvividfade-lighter) 100%)!important}.hci-dictoinary-display-grid{padding-right:5px;padding-left:5px;box-shadow:#00000059 0 5px 15px}:host::ng-deep .ag-row-hover{color:#666!important;background-color:var(--bluewarmvividfade-lighter)!important}:host::ng-deep .ag-row-selected .ag-cell{color:var(--white-lightest)!important}:host::ng-deep .ag-row-selected{color:var(--white-darker)!important;background-color:var(--bluewarmvivid-lighter)!important}\n"] }]
753
- }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.NgbModal }, { type: i3.DictionaryService }, { type: undefined, decorators: [{
754
- type: Inject,
755
- args: [DICTIONARY_ENDPOINT]
756
- }] }]; }, propDecorators: { classList: [{
757
- type: HostBinding,
758
- args: ["class"]
759
- }] } });
760
- /**
761
- * Extracts Date And Turn To A Numerical Value For Comparing Purposes
762
- * @param date The date to comparable number
763
- */
764
- function monthToComparableNumber(date) {
765
- if (date === undefined || date === null || date.length !== 10) {
766
- return null;
767
- }
768
- let yearNumber = date.substring(0, 4);
769
- let monthNumber = date.substring(5, 7);
770
- let dayNumber = date.substring(8, 10);
771
- return yearNumber * 10000 + monthNumber * 100 + dayNumber;
772
- }
773
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RpY3Rpb25hcnktZWRpdG9yL3NyYy9jb21wb25lbnRzL2RldGFpbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFhLFdBQVcsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFDLGVBQWUsRUFBYSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUMsUUFBUSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxRQUFRLEVBQWMsTUFBTSw0QkFBNEIsQ0FBQztBQUVqRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQVFyRyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDakUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDOzs7Ozs7O0FBRWpHOzs7Ozs7OztHQVFHO0FBZ01ILE1BQU0sT0FBTywrQkFBK0I7SUE4QjFDLFlBQ1UsS0FBcUIsRUFDckIsWUFBc0IsRUFDdEIsaUJBQW9DLEVBQ1Asa0JBQTBCO1FBSHZELFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGlCQUFZLEdBQVosWUFBWSxDQUFVO1FBQ3RCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDUCx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQVE7UUFoQzNDLGNBQVMsR0FBVyxzQkFBc0IsQ0FBQztRQU1qRSxzQkFBaUIsR0FBVSxFQUFFLENBQUM7UUFJOUIsaUJBQVksR0FBVSxFQUFFLENBQUM7UUFDekIsb0JBQWUsR0FBK0IsRUFBRSxDQUFDO1FBTWpELG9CQUFlLEdBQUc7WUFDaEIsUUFBUSxFQUFFO2dCQUNSLGFBQWEsRUFBRSxvQkFBb0I7YUFDcEM7WUFDRCx1QkFBdUIsRUFBRSxJQUFJO1lBQzdCLGNBQWMsRUFBRSxJQUFJO1NBQ3JCLENBQUM7UUFZQSxJQUFJLENBQUMsV0FBVyxHQUFnQjtZQUM5QixPQUFPLEVBQUU7Z0JBQ1AsZUFBZSxFQUFFLElBQUk7YUFDdEI7WUFDRCxXQUFXLEVBQUUsK0JBQStCLENBQUMsa0JBQWtCO1lBQy9ELGlCQUFpQixFQUFFLCtCQUErQixDQUFDLGlCQUFpQjtZQUNwRSx3QkFBd0IsRUFBRSxLQUFLO1lBQy9CLGFBQWEsRUFBRSxVQUFVO1lBQ3pCLDZCQUE2QixFQUFFLElBQUk7WUFDbkMsYUFBYSxFQUFFLElBQUk7WUFDbkIsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRO1FBRU4sSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQ3pCLE1BQU0sQ0FBQyxFQUFFO1lBQ1AsSUFBSSxTQUFTLEdBQVcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTVDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQXVCO1FBRS9CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2xFLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDWCxDQUFDLEVBQ0QsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNYLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWU7UUFFYixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFTSxhQUFhO1FBRWxCLE9BQU87WUFDTCxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFDO1lBQ2pHLEVBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDL0csRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBQztZQUM1RixFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBQztZQUNyRixFQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDekcsRUFBQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDbkksRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDM0YsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBQztZQUN0RyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFDO1lBQzlGLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDOUYsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDN0YsRUFBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFB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LENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRTtRQUM3RCxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFdEMsT0FBTyxVQUFVLEdBQUcsS0FBSyxHQUFHLFdBQVcsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDO0FBQzVELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0LCBpc0Rldk1vZGUsIFZpZXdDaGlsZCwgSG9zdEJpbmRpbmcsIFRlbXBsYXRlUmVmfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtmaW5hbGl6ZSwgbWFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtOZ2JNb2RhbCwgTmdiTW9kYWxSZWZ9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xyXG5cclxuaW1wb3J0IHtEaWN0aW9uYXJ5U2VydmljZSwgRElDVElPTkFSWV9FTkRQT0lOVH0gZnJvbSBcIkBodW50c21hbi1jYW5jZXItaW5zdGl0dXRlL2RpY3Rpb25hcnktc2VydmljZVwiO1xyXG5cclxuaW1wb3J0IHtcclxuICBDb2x1bW5BcGksXHJcbiAgR3JpZE9wdGlvbnMsXHJcbiAgR3JpZFJlYWR5RXZlbnQsXHJcbiAgR3JpZEFwaVxyXG59IGZyb20gXCJhZy1ncmlkLWNvbW11bml0eVwiO1xyXG5pbXBvcnQge1NlbGVjdFJlbmRlcmVyfSBmcm9tIFwiLi4vZ3JpZC1yZW5kZXJlcnMvc2VsZWN0LnJlbmRlcmVyXCI7XHJcbmltcG9ydCB7U2VsZWN0RWRpdG9yfSBmcm9tIFwiLi4vZ3JpZC1lZGl0b3JzL3NlbGVjdC5lZGl0b3JcIjtcclxuaW1wb3J0IHtOZXdSb3dDb21wb25lbnR9IGZyb20gXCIuL25ldy1yb3cuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7aXNOdWxsT3JVbmRlZmluZWR9IGZyb20gXCJ1dGlsXCI7XHJcbmltcG9ydCB7RGF0ZVJlbmRlcmVyfSBmcm9tIFwiLi4vZ3JpZC1yZW5kZXJlcnMvZGF0ZS5yZW5kZXJlclwiO1xyXG5pbXBvcnQge0FnR3JpZERhdGVDZWxsRWRpdG9yQ29tcG9uZW50fSBmcm9tIFwiLi4vZ3JpZC1lZGl0b3JzL2FnLWdyaWQtZGF0ZS1jZWxsLWVkaXRvci5jb21wb25lbnRcIjtcclxuXHJcbi8qKlxyXG4gKiBXaGVuIGEgZGljdGlvbmFyeSBpcyBzZWxlY3RlZCB0aGlzIGNvbXBvbmVudCBpcyBzaG93bi4gIFRoZXJlIGlzIGEgdG9wIGdyaWQgd2hpY2ggZm9yIGl0cyBkYXRhIHNob3dzIGFsbCB0aGUgY29sdW1uc1xyXG4gKiBmb3IgdGhlIGRpY3Rpb25hcnkuIEN1cnJlbnRseSwga2VlcCB0aGlzIGZvciByZWZlcmVuY2Ugb25seSBhbmQgaGF2ZSBub24tZWRpdGFibGUuXHJcbiAqIFRoZSBib3R0b20gZ3JpZCB3aWxsIHNob3cgdGhvc2UgY29sdW1ucyBhcyBhY3R1YWwgY29sdW1ucyBhbmQgaXRzIGRhdGEgYXJlIGFsbCB0aGUgZGljdGlvbmFyeSB2YWx1ZXMuICBSb3dzIGNhbiBiZVxyXG4gKiBhZGRlZC4gIEZvciBkZWxldGluZywgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGlkIGlzIG5vdCB1c2VkIGFueXdoZXJlLiAgRm9yIGVkaXRpbmcsIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBjb2RlIG9yIGFueXRoaW5nXHJcbiAqIGVsc2UgaXNuJ3QgYmVpbmcgcmVmZXJlbmNlZC5cclxuICpcclxuICogQHNpbmNlIDEuMC4wXHJcbiAqL1xyXG5AQ29tcG9uZW50KFxyXG4gIHtcclxuICAgIHNlbGVjdG9yOiBcImhjaS1kaWN0aW9uYXJ5LWVkaXRvci1kZXRhaWxcIixcclxuICAgIHRlbXBsYXRlOlxyXG4gICAgICBgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBoY2ktZGljdGlvbmFyeS1kZXRhaWwtYm9keVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGhjaS1idXN5IFtidXN5U3ViamVjdHNdPVwibG9hZGluZ1N1YmplY3RzXCI+PC9oY2ktYnVzeT5cclxuXHJcbiAgICAgICAgICA8IS0tIERpY3Rpb25hcnkgVGl0bGUgQW5kIE1ldGFkYXRhIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRpY3Rpb25hcnktaW5mby1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGljdGlvbmFyeS10aXRsZVwiPlxyXG4gICAgICAgICAgICAgIHt7ZGlzcGxheU5hbWV9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbWV0YWRhdGEtYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3Blbk1vZGFsKG1ldGFEYXRhTW9kYWwpXCI+XHJcbiAgICAgICAgICAgICAgVmlldyBNZXRhIERhdGFcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIERpY3Rpb25hcnkgRWRpdCBCdXR0b25zIC0tPlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBbY2xhc3NdPVwiZGlzYWJsZURlbGV0ZT8gJ2RlYWN0aXZhdGVkLWNvbG9yJzogJ2FjdGl2ZS1jb2xvcidcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlRGVsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkFyZVlvdVN1cmVNb2RhbChhcmVZb3VTdXJlTW9kYWwpXCI+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtbWludXNcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPVwiY29sb3I6IHZhcigtLWJsdWV3YXJtLWRhcmspOyBmbG9hdDogcmlnaHQ7IGZvbnQtc2l6ZTogMTVweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlQWRkUm93XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja0FkZFJvdygpXCI+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGx1c1wiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIERpY3Rpb25hcnkgRGlzcGxheSBHcmlkIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICA8YWctZ3JpZC1hbmd1bGFyIGlkPVwiZGljdGlvbmFyeS1ncmlkLWRpc3BsYXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkYXRhR3JpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWctdGhlbWUtYmFsaGFtIGZ1bGwtaGVpZ2h0IGZ1bGwtd2lkdGggaGNpLWRpY3RvaW5hcnktZGlzcGxheS1ncmlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93RGF0YV09XCJkaWN0aW9uYXJ5RW50cmllc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbl09XCInbXVsdGlwbGUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2luZ2xlQ2xpY2tFZGl0XT1cIid0cnVlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRpb25dPVwiJ3RydWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdGlvbkF1dG9QYWdlU2l6ZV09XCIndHJ1ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncmlkT3B0aW9uc109XCJncmlkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGxWYWx1ZUNoYW5nZWQpPVwidXBkYXRlRGljdGlvbmFyeSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2FnLWdyaWQtYW5ndWxhcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gRGljdGlvbmFyeSBNZXRhZGF0YSBQb3B1cCAtLT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbWV0YURhdGFNb2RhbCBsZXQtY2xvc2U9XCJjbG9zZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6MTAwMHB4XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgTWV0YSBEYXRhIGZvciB7e2NsYXNzTmFtZX19XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBtb2RhbC1ib2R5XCJcclxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgI2NlZDRkYTsgd2lkdGg6IDEwMCU7XCI+XHJcbiAgICAgICAgICAgICAgICA8YWctZ3JpZC1hbmd1bGFyICNtZXRhR3JpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFnLXRoZW1lLWJhbGhhbSBmdWxsLXdpZHRoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDI1MHB4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmlkUmVhZHkpPVwidGhpcy5vbk1ldGFHcmlkUmVhZHkoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncmlkT3B0aW9uc109XCJ0aGlzLm1ldGFHcmlkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25dPVwiJ3NpbmdsZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZnJhbWV3b3JrQ29tcG9uZW50c109XCJmcmFtZXdvcmtDb21wb25lbnRzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0RhdGFdPVwiZGljdGlvbmFyeT8uZmllbGRzXCI+XHJcbiAgICAgICAgICAgICAgICA8L2FnLWdyaWQtYW5ndWxhcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImNsb3NlKCdDbG9zZScpXCI+Q2xvc2U8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgIDwhLS0gRGljdGlvbmFyeSBEZWxldGUgQ29tZmlybWF0aW9uIFBvcHVwIC0tPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNhcmVZb3VTdXJlTW9kYWwgbGV0LWNsb3NlPVwiY2xvc2VcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIENvbmZpcm1hdGlvblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgQXJlIHlvdSBzdXJlP1xyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiY2xvc2UoJ0NhbmNlbCcpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tcmVkXCIgKGNsaWNrKT1cImNsb3NlKCdEZWxldGUnKVwiPkRlbGV0ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIGAsXHJcbiAgICBzdHlsZXM6IFtcclxuICAgICAgYFxyXG4gICAgICAgIC5mdWxsLWhlaWdodCB7XHJcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAuZnVsbC13aWR0aCB7XHJcbiAgICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5hZy10aGVtZS1iYWxoYW0ge1xyXG4gICAgICAgICAgZm9udC1mYW1pbHk6IFwiUHJvbXB0XCI7XHJcbiAgICAgICAgICBmb250LXdlaWdodDogNTAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmFjdGl2ZS1jb2xvciB7XHJcbiAgICAgICAgICBmbG9hdDogcmlnaHQ7XHJcbiAgICAgICAgICBmb250LXNpemU6IDE1cHg7XHJcbiAgICAgICAgICBjb2xvcjogdmFyKC0tYmx1ZXdhcm0tZGFyayk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAuZGVhY3RpdmF0ZWQtY29sb3Ige1xyXG4gICAgICAgICAgZmxvYXQ6IHJpZ2h0O1xyXG4gICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xyXG4gICAgICAgICAgY29sb3I6IHZhcigtLWdyZXl3YXJtLW1lZGxpZ2h0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5kaWN0aW9uYXJ5LWluZm8tc2VjdGlvbiB7XHJcbiAgICAgICAgICBwYWRkaW5nLXRvcDogMTBweDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5kaWN0aW9uYXJ5LXRpdGxlIHtcclxuICAgICAgICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgICAgICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xyXG4gICAgICAgICAgcGFkZGluZy1yaWdodDogMTBweDtcclxuICAgICAgICAgIHBhZGRpbmctdG9wOiA1cHg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAubWV0YWRhdGEtYnV0dG9uIHtcclxuICAgICAgICAgIGNvbG9yOiB2YXIoLS13aGl0ZS1saWdodGVzdCk7XHJcbiAgICAgICAgICBmbG9hdDogbGVmdDtcclxuICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0OjpuZy1kZWVwIC5hZy1oZWFkZXItY2VsbCB7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ibHVld2FybXZpdmlkZmFkZS1saWdodGVzdCk7XHJcbiAgICAgICAgICBib3JkZXI6IGxpZ2h0Z3JheSBzb2xpZCB0aGluO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgOmhvc3Q6Om5nLWRlZXAgLmFnLWNlbGwge1xyXG4gICAgICAgICAgYm9yZGVyLXJpZ2h0OiBsaWdodGdyYXkgc29saWQgdGhpbjtcclxuICAgICAgICAgIGJvcmRlci1sZWZ0OiBsaWdodGdyYXkgc29saWQgdGhpbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0OjpuZy1kZWVwIC5hZy1yb3cge1xyXG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogMDtcclxuICAgICAgICAgIGJvcmRlci10b3A6IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA6aG9zdDo6bmctZGVlcCAuYWctcm93LWV2ZW4ge1xyXG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0td2hpdGUtbWVkaXVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5oY2ktZGljdGlvbmFyeS1kZXRhaWwtYm9keSB7XHJcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgwZGVnLCB2YXIoLS13aGl0ZS1saWdodGVzdCkgMzAlLCB2YXIoLS1ibHVld2FybXZpdmlkZmFkZS1saWdodGVyKSAxMDAlKSAhaW1wb3J0YW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmhjaS1kaWN0b2luYXJ5LWRpc3BsYXktZ3JpZCB7XHJcbiAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7XHJcbiAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDVweDtcclxuICAgICAgICAgIGJveC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4zNSkgMHB4IDVweCAxNXB4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgICAgKiBEaWN0aW9uYXJ5IFJvdyBIb3ZlciBDU1NcclxuICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgICAgICA6aG9zdDo6bmctZGVlcCAuYWctcm93LWhvdmVyIHtcclxuICAgICAgICAgIGNvbG9yOiAjNjY2ICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ibHVld2FybXZpdmlkZmFkZS1saWdodGVyKSAhaW1wb3J0YW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgICAgKiBEaWN0aW9uYXJ5IENlbGwgU2VsZWN0ZWQgQ1NTXHJcbiAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgICAgICAgOmhvc3Q6Om5nLWRlZXAgLmFnLXJvdy1zZWxlY3RlZCAuYWctY2VsbCB7XHJcbiAgICAgICAgICBjb2xvcjogdmFyKC0td2hpdGUtbGlnaHRlc3QpICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAgICAqIERpY3Rpb25hcnkgUm93IFNlbGVjdGVkIENTU1xyXG4gICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG4gICAgICAgIDpob3N0OjpuZy1kZWVwIC5hZy1yb3ctc2VsZWN0ZWQge1xyXG4gICAgICAgICAgY29sb3I6IHZhcigtLXdoaXRlLWRhcmtlcikgIWltcG9ydGFudDtcclxuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJsdWV3YXJtdml2aWQtbGlnaHRlcikgIWltcG9ydGFudDtcclxuICAgICAgICB9XHJcbiAgICAgIGBcclxuICAgIF1cclxuICB9XHJcbilcclxuZXhwb3J0IGNsYXNzIERpY3Rpb25hcnlFZGl0b3JEZXRhaWxDb21wb25lbnQge1xyXG5cclxuICBASG9zdEJpbmRpbmcoXCJjbGFzc1wiKSBjbGFzc0xpc3Q6IHN0cmluZyA9IFwib3V0bGV0LWNvbHVtbiB5LWF1dG9cIjtcclxuXHJcbiAgcHJpdmF0ZSBzZWNvbmRhcnlEaWN0aW9uYXJ5RW50cmllczogYW55O1xyXG4gIGNsYXNzTmFtZTogc3RyaW5nO1xyXG4gIGRpc3BsYXlOYW1lOiBhbnk7XHJcbiAgZGljdGlvbmFyeTogYW55O1xyXG4gIGRpY3Rpb25hcnlFbnRyaWVzOiBhbnlbXSA9IFtdO1xyXG4gIGRhdGFDb2x1bW5zOiBhbnlbXTtcclxuXHJcbiAgaWRDb2x1bW46IHN0cmluZztcclxuICBzZWxlY3RlZFJvd3M6IGFueVtdID0gW107XHJcbiAgbG9hZGluZ1N1YmplY3RzOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5bXSA9IFtdO1xyXG5cclxuICBib3VuZE5ld1Jvd1Bvc3RDYWxsOiAoZGF0YTogYW55KSA9PiBPYnNlcnZhYmxlPGFueT47XHJcbiAgZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zO1xyXG4gIG5ld1Jvd1N1YnNjcmlwdGlvbjogYW55O1xyXG5cclxuICBtZXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICByb3dTdHlsZToge1xyXG4gICAgICBcImZvbnQtZmFtaWx5XCI6IFwiUHJvbXB0LCBzYW5zLXNlcmlmXCJcclxuICAgIH0sXHJcbiAgICBlbmFibGVDZWxsVGV4dFNlbGVjdGlvbjogdHJ1ZSxcclxuICAgIGVuc3VyZURvbU9yZGVyOiB0cnVlXHJcbiAgfTtcclxuICBmcmFtZXdvcmtDb21wb25lbnRzOiBhbnk7XHJcbiAgcHVibGljIGdyaWRBcGlNZXRhOiBHcmlkQXBpO1xyXG5cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgZGljdGlvbmFyeVNlcnZpY2U6IERpY3Rpb25hcnlTZXJ2aWNlLFxyXG4gICAgQEluamVjdChESUNUSU9OQVJZX0VORFBPSU5UKSBwcml2YXRlIGRpY3Rpb25hcnlFbmRwb2ludDogc3RyaW5nXHJcbiAgKSB7XHJcblxyXG4gICAgdGhpcy5ncmlkT3B0aW9ucyA9IDxHcmlkT3B0aW9ucz57XHJcbiAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICBjb21wb25lbnRQYXJlbnQ6IHRoaXNcclxuICAgICAgfSxcclxuICAgICAgb25HcmlkUmVhZHk6IERpY3Rpb25hcnlFZGl0b3JEZXRhaWxDb21wb25lbnQub25TYW1wbGVzR3JpZFJlYWR5LFxyXG4gICAgICBvbkdyaWRTaXplQ2hhbmdlZDogRGljdGlvbmFyeUVkaXRvckRldGFpbENvbXBvbmVudC5vbkdyaWRTaXplQ2hhbmdlZCxcclxuICAgICAgc3VwcHJlc3NIb3Jpem9udGFsU2Nyb2xsOiBmYWxzZSxcclxuICAgICAgc2VsZWN0aW9uTW9kZTogXCJtdWx0aXBsZVwiLFxyXG4gICAgICBzdG9wRWRpdGluZ1doZW5HcmlkTG9zZXNGb2N1czogdHJ1ZSxcclxuICAgICAgZW5hYmxlU29ydGluZzogdHJ1ZSxcclxuICAgICAgZW5hYmxlRmlsdGVyOiB0cnVlXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmFzZWQgb24gdGhlIHJvdXRlIGNsYXNzIG5hbWUsIG1ha2UgdGhlIGNhbGwgdG8gZmV0Y2ggdGhlIGRpY3Rpb25hcnkgZGF0YS4gIFNpbmNlIHRoaXMgY29tcG9uZW50IGlzIHJvdXRlIGJhc2VkLFxyXG4gICAqIHdoZW4gdGhlIGRpY3Rpb25hcnkgY2xhc3MgaW4gdGhlIHJvdXRlIGNoYW5nZXMsIHRoaXMgY29tcG9uZW50IGlzIHJlbG9hZGVkLlxyXG4gICAqL1xyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIHRoaXMuYm91bmROZXdSb3dQb3N0Q2FsbCA9IHRoaXMubmV3Um93UG9zdC5iaW5kKHRoaXMpO1xyXG5cclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3RzLnB1c2gobmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSkpO1xyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdHMucHVzaChuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSk7XHJcblxyXG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKFxyXG4gICAgICBwYXJhbXMgPT4ge1xyXG4gICAgICAgIGxldCBjbGFzc05hbWU6IHN0cmluZyA9IHBhcmFtc1tcImNsYXNzTmFtZVwiXTtcclxuXHJcbiAgICAgICAgdGhpcy5nZXREaWN0aW9uYXJ5KGNsYXNzTmFtZSk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvcGVuTW9kYWwobW9kYWw6IFRlbXBsYXRlUmVmPGFueT4pOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKG1vZGFsLCB7d2luZG93Q2xhc3M6IFwibW9kYWwteGxcIn0pLnJlc3VsdC50aGVuKFxyXG4gICAgICAocmVzdWx0KSA9PiB7XHJcbiAgICAgIH0sXHJcbiAgICAgIChyZWFzb24pID0+IHtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHJcbiAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29sdW1uRGVmTWV0YSgpIDogYW55W10ge1xyXG5cclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtmaWVsZDogXCJuYW1lXCIsIGhlYWRlck5hbWU6IFwiTmFtZVwiLCB3aWR0aDogMTc1LCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiZGVzY3JpcHRpb25cIiwgaGVhZGVyTmFtZTogXCJEZXNjcmlwdGlvblwiLCB3aWR0aDogMjUwLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiaWRcIiwgaGVhZGVyTmFtZTogXCJJZFwiLCB3aWR0aDogNjAsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJ0eXBlXCIsIGhlYWRlck5hbWU6IFwiVHlwZVwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwicHJvdGVjdGlvblR5cGVcIiwgaGVhZGVyTmFtZTogXCJQcm90ZWN0aW9uVHlwZVwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiZmlsdGVyRGljdGlvbmFyeUNsYXNzXCIsIGhlYWRlck5hbWU6IFwiRmlsdGVyRGljdGlvbmFyeUNsYXNzXCIsIHdpZHRoOiAxODAsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJub3ROdWxsXCIsIGhlYWRlck5hbWU6IFwiTm90TnVsbFwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiaW50ZWdlclwiLCBoZWFkZXJOYW1lOiBcIkludGVnZXJcIiwgd2lkdGg6IDc1LCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwibWluXCIsIGhlYWRlck5hbWU6IFwiTWluXCIsIHdpZHRoOiA2MCwgc29ydGFibGU6IHRydWUsIHJlc2l6YWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlfSxcclxuICAgICAge2ZpZWxkOiBcIm1heFwiLCBoZWFkZXJOYW1lOiBcIk1heFwiLCB3aWR0aDogNjAsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJmcmFjdGlvblwiLCBoZWFkZXJOYW1lOiBcIkZyYWN0aW9uXCIsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJkaWN0aW9uYXJ5VG9vbHRpcFwiLCBoZWFkZXJOYW1lOiBcIkRpY3Rpb25hcnlUb29sdGlwXCIsIHdpZHRoOiAyMDAsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJkaWN0aW9uYXJ5RGlzcGxheVwiLCBoZWFkZXJOYW1lOiBcIkRpY3Rpb25hcnlEaXNwbGF5XCIsIHdpZHRoOiAxNzUsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJmaWx0ZXJhYmxlXCIsIGhlYWRlck5hbWU6IFwiRmlsdGVyYWJsZVwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiZGlzcGxheU5hbWVcIiwgaGVhZGVyTmFtZTogXCJEaXNwbGF5TmFtZVwiLCB3aWR0aDogMTc1LCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiZGlzcGxheU9yZGVyXCIsIGhlYWRlck5hbWU6IFwiRGlzcGxheU9yZGVyXCIsIHdpZHRoOiA2MCwgc29ydGFibGU6IHRydWUsIHJlc2l6YWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlfSxcclxuICAgICAge2ZpZWxkOiBcImNlbGxTdHlsZVwiLCBoZWFkZXJOYW1lOiBcIkNlbGxTdHlsZVwiLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgXTsgLy8gdGhlIHdpZHRocyBmb3IgdGhlIGxhc3QgMiBjb3VsZCBiZSB3cm9uZy5cclxuXHJcbiAgfVxyXG5cclxuICBvbk1ldGFHcmlkUmVhZHkocGFyYW1zIDogYW55KSB7XHJcblxyXG4gICAgdGhpcy5ncmlkQXBpTWV0YSA9IHBhcmFtcy5hcGk7XHJcbiAgICB0aGlzLmdyaWRBcGlNZXRhLnNldENvbHVtbkRlZnModGhpcy5jb2x1bW5EZWZNZXRhKCkpO1xyXG4gICAgdGhpcy5ncmlkQXBpTWV0YS5zZXRSb3dEYXRhKHRoaXMuZGljdGlvbmFyeT8uZmllbGRzKTtcclxuICAgIC8vIHRoaXMuZ3JpZEFwaU1ldGEuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xyXG5cclxuICB9XHJcblxyXG4gIG9wZW5BcmVZb3VTdXJlTW9kYWwobW9kYWw6IFRlbXBsYXRlUmVmPGFueT4pOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKG1vZGFsKS5yZXN1bHQudGhlbihcclxuICAgICAgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQgPT09IFwiRGVsZXRlXCIpIHtcclxuICAgICAgICAgIHRoaXMuZGVsZXRlRGljdGlvbmFyeUVudHJpZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChyZWFzb24pID0+IHtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoIHRoZSBkaWN0aW9uYXJ5IG1ldGFkYXRhIGFuZCBkaWN0aW9uYXJ5IGVudHJpZXMgYmFzZWQgdXBvbiB0aGUgZGljdGlvbmFyeSBjbGFzcyBuYW1lLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxyXG4gICAqL1xyXG4gIGdldERpY3Rpb25hcnkoY2xhc3NOYW1lOiBzdHJpbmcpIHtcclxuXHJcbiAgICAvLyBXaGVuIFNlbGVjdGluZyBBIE5ldyBEaWN0aW9uYXJ5LCBOYXZpZ2F0ZSBUbyBGaXJzdCBQYWdlXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmFwaSkge1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5wYWdpbmF0aW9uR29Ub0ZpcnN0UGFnZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xyXG4gICAgdGhpcy5kYXRhQ29sdW1ucyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3RzWzBdLm5leHQodHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5KGNsYXNzTmFtZSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmluYWxpemUoXHJcbiAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3RzWzBdLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIClcclxuICAgICAgKS5zdWJzY3JpYmUoXHJcbiAgICAgIChkaWN0aW9uYXJ5OiBPYmplY3QpID0+IHtcclxuICAgICAgICB0aGlzLnNldFVwRGljdGlvbmFyeUdyaWQoZGljdGlvbmFyeSk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdHNbMF0ubmV4dChmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5nZXREaWN0aW9uYXJ5RW50cmllcygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGljdGlvbmFyeUVudHJpZXMoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdHNbMV0ubmV4dCh0cnVlKTtcclxuXHJcbiAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKHRoaXMuY2xhc3NOYW1lKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaW5hbGl6ZShcclxuICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdHNbMV0ubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICApLnN1YnNjcmliZShcclxuICAgICAgKGRpY3Rpb25hcnlFbnRyaWVzOiBPYmplY3RbXSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGljdGlvbmFyeUVudHJpZXMgPSBkaWN0aW9uYXJ5RW50cmllcztcclxuICAgICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zZXRSb3dEYXRhKGRpY3Rpb25hcnlFbnRyaWVzKTtcclxuICAgICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdHNbMV0ubmV4dChmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGRpY3Rpb25hcnkgbWV0YWRhdGEuICBUaGlzIGlzIHVzZWQgdG8gYnVpbGQgdGhlIGNvbHVtbnMgZm9yIHRoZSBkaWN0aW9uYXJ5IGVudHJpZXMuICBUaGUgbmFtZXMsIHZhbGlkYXRpb24sXHJcbiAgICogYW5kIGZpbHRlciBjbGFzc2VzIGJ1aWxkIHRoZSBjb2x1bW4gZGVmaW5pdGlvbi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBkaWN0aW9uYXJ5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRVcERpY3Rpb25hcnlHcmlkKGRpY3Rpb25hcnk6IGFueSk6IHZvaWQge1xyXG5cclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwiRGljdGlvbmFyeUVkaXRvckRldGFpbENvbXBvbmVudC5zZXREaWN0aW9uYXJ5XCIpO1xyXG4gICAgICBjb25zb2xlLmRlYnVnKGRpY3Rpb25hcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGljdGlvbmFyeSA9IGRpY3Rpb25hcnk7XHJcbiAgICB0aGlzLnNlY29uZGFyeURpY3Rpb25hcnlFbnRyaWVzID0gW107XHJcbiAgICBsZXQgZGljdGlvbmFyeUNsYXNzTmFtZXMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBkaWN0aW9uYXJ5LmZpZWxkcykge1xyXG4gICAgICBpZiAoZmllbGQuZmlsdGVyRGljdGlvbmFyeUNsYXNzKSB7XHJcbiAgICAgICAgZGljdGlvbmFyeUNsYXNzTmFtZXMucHVzaChmaWVsZC5maWx0ZXJEaWN0aW9uYXJ5Q2xhc3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRTZWNvbmRhcnlEaWN0aW9uYXJpZXMoZGljdGlvbmFyeUNsYXNzTmFtZXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZWNvbmRhcnlEaWN0aW9uYXJpZXMoZGljdGlvbmFyeU5hbWVzOiBzdHJpbmdbXSkge1xyXG5cclxuICAgIGlmIChkaWN0aW9uYXJ5TmFtZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5maW5pc2hDb2x1bW5TZXR1cCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGRpY3Rpb25hcnlOYW1lID0gZGljdGlvbmFyeU5hbWVzLnBvcCgpO1xyXG5cclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RHJvcGRvd25FbnRyaWVzKGRpY3Rpb25hcnlOYW1lKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2Vjb25kYXJ5RGljdGlvbmFyeUVudHJpZXMucHVzaCh7ZGljdGlvbmFyeU5hbWU6IGRpY3Rpb25hcnlOYW1lLCBlbnRyaWVzOiByZXNwb25zZX0pO1xyXG4gICAgICAgICAgdGhpcy5nZXRTZWNvbmRhcnlEaWN0aW9uYXJpZXMoZGljdGlvbmFyeU5hbWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmlzaENvbHVtblNldHVwKCkge1xyXG5cclxuICAgIHRoaXMuZGlzcGxheU5hbWUgPSB0aGlzLmRpY3Rpb25hcnkuZGlzcGxheU5hbWU7XHJcblxyXG4gICAgLy8gVGhpcyBlc3RhYmxpc2hlcyB0aGUgcmVhZE9ubHkgZnVuY3Rpb25hbGl0eVxyXG4gICAgbGV0IGNvbHM6IGFueVtdID0gW107XHJcblxyXG4gICAgLy8gUHJvY2VzcyBDb2x1bW5zIEFuZCBDcmVhdGUgQ29sdW1uIERlZmluaXRpb25cclxuICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZGljdGlvbmFyeS5maWVsZHMpIHtcclxuICAgICAgaWYgKGZpZWxkLmlkICYmIChpc051bGxPclVuZGVmaW5lZChmaWVsZC5jb2RlKSB8fCBmaWVsZC5jb2RlID09IGZhbHNlKSkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgY29sOiBhbnk7XHJcblxyXG4gICAgICBpZiAoZmllbGQuZmlsdGVyRGljdGlvbmFyeUNsYXNzKSB7XHJcbiAgICAgICAgLy8gdGhpcyBpcyBhIGRyb3Bkb3duIG9mIGFub3RoZXIgZGljdGlvbmFyeVxyXG4gICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5zZWNvbmRhcnlEaWN0aW9uYXJ5RW50cmllcy5maW5kKFxyXG4gICAgICAgICAgKGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYS5kaWN0aW9uYXJ5TmFtZSA9PT0gZmllbGQuZmlsdGVyRGljdGlvbmFyeUNsYXNzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbCA9IHtcclxuICAgICAgICAgIGZpZWxkOiBmaWVsZC5uYW1lLFxyXG4gICAgICAgICAgaGVhZGVyTmFtZTogZmllbGQuZGlzcGxheU5hbWUsXHJcbiAgICAgICAgICBlZGl0YWJsZTogdGhpcy5pc0VkaXRhYmxlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICBjZWxsUmVuZGVyZXJGcmFtZXdvcms6IFNlbGVjdFJlbmRlcmVyLFxyXG4gICAgICAgICAgY2VsbEVkaXRvckZyYW1ld29yazogU2VsZWN0RWRpdG9yLFxyXG4gICAgICAgICAgc2VsZWN0T3B0aW9uc0Rpc3BsYXlGaWVsZDogXCJkaXNwbGF5XCIsXHJcbiAgICAgICAgICBzZWxlY3RPcHRpb25zVmFsdWVGaWVsZDogXCJpZFwiLFxyXG4gICAgICAgICAgc29ydGFibGU6IHRydWUsXHJcbiAgICAgICAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICAgICAgICBmaWx0ZXI6IHRydWUsXHJcbiAgICAgICAgICBmaWx0ZXJWYWx1ZUdldHRlcjogdGhpcy5jb21ib0ZpbHRlclZhbHVlR2V0dGVyLFxyXG4gICAgICAgICAgc2VsZWN0T3B0aW9uczogW10sXHJcbiAgICAgICAgICBjb21wYXJhdG9yOiAodmFsdWVBLCB2YWx1ZUIsIG5vZGVBLCBub2RlQiwgaXNJbnZlcnRlZCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVudHJpZXMpIHtcclxuICAgICAgICAgIGNvbC5zZWxlY3RPcHRpb25zID0gb3B0aW9ucy5lbnRyaWVzLnNvcnQoXHJcbiAgICAgICAgICAgIChvcHRpb25BLCBvcHRpb25CKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbkEgJiYgIW9wdGlvbkIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbkIgJiYgIW9wdGlvbkEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmICghb3B0aW9uQSAmJiAhb3B0aW9uQikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAob3B0aW9uQS5kaXNwbGF5LnRvTG93ZXJDYXNlKCkgPiBvcHRpb25CLmRpc3BsYXkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICgob3B0aW9uQi5kaXNwbGF5LnRvTG93ZXJDYXNlKCkgPiBvcHRpb25BLmRpc3BsYXkudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGNvbC5jb21wYXJhdG9yID0gKHZhbHVlQSwgdmFsdWVCLCBub2RlQSwgbm9kZUIsIGlzSW52ZXJ0ZWQpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmVudHJpZXMpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHZhbHVlQSAmJiAhdmFsdWVCKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh2YWx1ZUIgJiYgIXZhbHVlQSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF2YWx1ZUEgJiYgIXZhbHVlQikge1xyXG4gICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgb3B0aW9uQSA9IG9wdGlvbnMuZW50cmllcy5maW5kKChlbnRyeSkgPT4gKFwiXCIgKyBlbnRyeS5pZCA9PT0gXCJcIiArIHZhbHVlQSkpO1xyXG4gICAgICAgICAgICBsZXQgb3B0aW9uQiA9IG9wdGlvbnMuZW50cmllcy5maW5kKChlbnRyeSkgPT4gKFwiXCIgKyBlbnRyeS5pZCA9PT0gXCJcIiArIHZhbHVlQikpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbkEgJiYgIW9wdGlvbkIpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbkIgJiYgIW9wdGlvbkEpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghb3B0aW9uQSAmJiAhb3B0aW9uQikge1xyXG4gICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9uQS5kaXNwbGF5LnRvTG93ZXJDYXNlKCkgPiBvcHRpb25CLmRpc3BsYXkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChvcHRpb25CLmRpc3BsYXkudG9Mb3dlckNhc2UoKSA+IG9wdGlvbkEuZGlzcGxheS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbC5jZWxsU3R5bGUgPSBwYXJhbXMgPT4ge1xyXG4gICAgICAgICAgbGV0IGNvbHVtbjogYW55ID0ge307XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgZmllbGQgb2YgcGFyYW1zLmNvbnRleHQuY29tcG9uZW50UGFyZW50LmRpY3Rpb25hcnkuZmllbGRzKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY29sRGVmLmZpZWxkID09IGZpZWxkLm5hbWUpIHtcclxuICAgICAgICAgICAgICBjb2x1bW4gPSBmaWVsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChwYXJhbXMuZGF0YS5lZGl0T3JOZXcgJiYgcGFyYW1zLmRhdGEuZWRpdE9yTmV3ID09IFwibmV3XCIpIHtcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5jb250ZXh0LnJlYWRPbmx5IHx8IGNvbHVtbi5yZWFkT25seSB8fFxyXG4gICAgICAgICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIlJlYWQgT25seVwiKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtjb2xvcjogXCIjOGE5NDk5XCJ9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbnRleHQucmVhZE9ubHkgfHwgY29sdW1uLnJlYWRPbmx5IHx8XHJcbiAgICAgICAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiUmVhZCBPbmx5XCIgfHwgY29sdW1uLmNyZWF0ZU9ubHkgfHxcclxuICAgICAgICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJDcmVhdGUgT25seVwiIHx8IGNvbHVtbi5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtjb2xvcjogXCIjOGE5NDk5XCJ9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29sLmRpc3BsYXlPcmRlciA9IGZpZWxkLmRpc3BsYXlPcmRlcjtcclxuICAgICAgICBjb2wuZGljdGlvbmFyeURpc3BsYXkgPSBmaWVsZC5kaWN0aW9uYXJ5RGlzcGxheTtcclxuICAgICAgICBjb2wuZGljdGlvbmFyeVRvb2x0aXAgPSBmaWVsZC5kaWN0aW9uYXJ5VG9vbHRpcDtcclxuXHJcbiAgICAgICAgLy8gU2V0IGRlZmF1bHQgZmlsdGVyIGFzIGNvbXBhcmUgYnkgdGV4dC9udW1iZXJcclxuICAgICAgICAvLyBjb2wuZmlsdGVyUmVuZGVyZXIgPSBDb21wYXJlRmlsdGVyUmVuZGVyZXI7XHJcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSAmJiBmaWVsZC50eXBlID09IFwiRGF0ZVwiKSB7XHJcbiAgICAgICAgLy9kYXRlIHZhbHVlXHJcbiAgICAgICAgY29sID0ge1xyXG4gICAgICAgICAgZmllbGQ6IGZpZWxkLm5hbWUsXHJcbiAgICAgICAgICBoZWFkZXJOYW1lOiBmaWVsZC5kaXNwbGF5TmFtZSxcclxuICAgICAgICAgIGNlbGxSZW5kZXJlckZyYW1ld29yazogRGF0ZVJlbmRlcmVyLFxyXG4gICAgICAgICAgY2VsbEVkaXRvckZyYW1ld29yazogQWdHcmlkRGF0ZUNlbGxFZGl0b3JDb21wb25lbnQsXHJcbiAgICAgICAgICBlZGl0YWJsZTogdGhpcy5pc0VkaXRhYmxlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIGZpbHRlcjogdHJ1ZSxcclxuICAgICAgICAgIGRpY3Rpb25hcnlEaXNwbGF5OiBmaWVsZC5kaWN0aW9uYXJ5RGlzcGxheVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbC5jb21wYXJhdG9yID0gKHZhbHVlQSwgdmFsdWVCLCBub2RlQSwgbm9kZUIsIGlzSW52ZXJ0ZWQpID0+IHtcclxuICAgICAgICAgIGxldCBudW0gPSB0aGlzLmRhdGVDb21wYXJhdG9yKHZhbHVlQSwgdmFsdWVCKTtcclxuICAgICAgICAgIHJldHVybiBpc0ludmVydGVkID8gLTEgKiBudW0gOiBudW07IC8vZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyB3aXRoIGludmVydGVkP1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbC5jZWxsU3R5bGUgPSBwYXJhbXMgPT4ge1xyXG4gICAgICAgICAgdmFyIGNvbHVtbjogYW55ID0ge307XHJcbiAgICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBwYXJhbXMuY29udGV4dC5jb21wb25lbnRQYXJlbnQuZGljdGlvbmFyeS5maWVsZHMpIHtcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5jb2xEZWYuZmllbGQgPT0gZmllbGQubmFtZSkge1xyXG4gICAgICAgICAgICAgIGNvbHVtbiA9IGZpZWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHBhcmFtcy5kYXRhLmVkaXRPck5ldyAmJiBwYXJhbXMuZGF0YS5lZGl0T3JOZXcgPT0gXCJuZXdcIikge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbnRleHQucmVhZE9ubHkgfHwgY29sdW1uLnJlYWRPbmx5IHx8XHJcbiAgICAgICAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiUmVhZCBPbmx5XCIpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge2NvbG9yOiBcIiM4YTk0OTlcIn07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY29udGV4dC5yZWFkT25seSB8fCBjb2x1bW4ucmVhZE9ubHkgfHxcclxuICAgICAgICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJSZWFkIE9ubHlcIiB8fCBjb2x1bW4uY3JlYXRlT25seSB8fFxyXG4gICAgICAgICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIkNyZWF0ZSBPbmx5XCIgfHwgY29sdW1uLmNvZGUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge2NvbG9yOiBcIiM4YTk0OTlcIn07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb2wuZGlzcGxheU9yZGVyID0gZmllbGQuZGlzcGxheU9yZGVyO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIHRoaXMgaXMgYSBzdHJpbmcgdmFsdWVcclxuICAgICAgICBjb2wgPSB7XHJcbiAgICAgICAgICBmaWVsZDogZmllbGQubmFtZSxcclxuICAgICAgICAgIGhlYWRlck5hbWU6IGZpZWxkLmRpc3BsYXlOYW1lLFxyXG4gICAgICAgICAgZWRpdGFibGU6IHRoaXMuaXNFZGl0YWJsZS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgc29ydGFibGU6IHRydWUsXHJcbiAgICAgICAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICAgICAgICBmaWx0ZXI6IHRydWUsXHJcbiAgICAgICAgICBkaWN0aW9uYXJ5RGlzcGxheTogZmllbGQuZGljdGlvbmFyeURpc3BsYXlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb2wuY29tcGFyYXRvciA9ICh2YWx1ZUEsIHZhbHVlQiwgbm9kZUEsIG5vZGVCLCBpc0ludmVydGVkKSA9PiB7XHJcbiAgICAgICAgICBpZiAodmFsdWVBICYmICF2YWx1ZUIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHZhbHVlQiAmJiAhdmFsdWVBKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIXZhbHVlQSAmJiAhdmFsdWVCKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh2YWx1ZUEudG9Mb3dlckNhc2UoKSA+IHZhbHVlQi50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICgodmFsdWVCLnRvTG93ZXJDYXNlKCkgPiB2YWx1ZUEudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29sLmNlbGxTdHlsZSA9IHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICB2YXIgY29sdW1uOiBhbnkgPSB7fTtcclxuICAgICAgICAgIGZvciAobGV0IGZpZWxkIG9mIHBhcmFtcy5jb250ZXh0LmNvbXBvbmVudFBhcmVudC5kaWN0aW9uYXJ5LmZpZWxkcykge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbERlZi5maWVsZCA9PSBmaWVsZC5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgY29sdW1uID0gZmllbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChwYXJhbXMuZGF0YS5lZGl0T3JOZXcgJiYgcGFyYW1zLmRhdGEuZWRpdE9yTmV3ID09IFwibmV3XCIpIHtcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5jb250ZXh0LnJlYWRPbmx5IHx8IGNvbHVtbi5yZWFkT25seSB8fFxyXG4gICAgICAgICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIlJlYWQgT25seVwiKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtjb2xvcjogXCIjOGE5NDk5XCJ9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbnRleHQucmVhZE9ubHkgfHwgY29sdW1uLnJlYWRPbmx5IHx8XHJcbiAgICAgICAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiUmVhZCBPbmx5XCIgfHwgY29sdW1uLmNyZWF0ZU9ubHkgfHxcclxuICAgICAgICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJDcmVhdGUgT25seVwiIHx8IGNvbHVtbi5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtjb2xvcjogXCIjOGE5NDk5XCJ9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29sLmRpc3BsYXlPcmRlciA9IGZpZWxkLmRpc3BsYXlPcmRlcjtcclxuICAgICAgICAvLyBTZXQgZGVmYXVsdCBmaWx0ZXIgYXMgY29tcGFyZSBieSB0ZXh0L251bWJlclxyXG4gICAgICAgIC8vIGNvbC5maWx0ZXJSZW5kZXJlciA9IENvbXBhcmVGaWx0ZXJSZW5kZXJlcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29scy5wdXNoKGNvbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTm93IHdlIG5lZWQgdG8gc29ydCB0aGUgY29sdW1uc1xyXG4gICAgaWYgKCF0aGlzLmRpY3Rpb25hcnkuZmllbGRzWzBdLmhhc093blByb3BlcnR5KFwiZGlzcGxheU9yZGVyXCIpKSB7XHJcbiAgICAgIC8vIGRlZmF1bHQgY2FzZSwgbm8gZGlzcGxheU9yZGVyXHJcbiAgICAgIGNvbHMgPSBjb2xzLnNvcnQoXHJcbiAgICAgICAgKGEsIGIpID0+IHtcclxuICAgICAgICAgIGlmICghYS5oZWFkZXJOYW1lICYmIGIuaGVhZGVyTmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoIWIuaGVhZGVyTmFtZSAmJiBhLmhlYWRlck5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhLmRpY3Rpb25hcnlEaXNwbGF5ID09PSB0cnVlICYmIGIuZGljdGlvbmFyeURpc3BsYXkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYi5kaWN0aW9uYXJ5RGlzcGxheSA9PT0gdHJ1ZSAmJiBhLmRpY3Rpb25hcnlEaXNwbGF5ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYS5kaWN0aW9uYXJ5VG9vbHRpcCA9PT0gdHJ1ZSAmJiBiLmRpY3Rpb25hcnlUb29sdGlwID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGIuZGljdGlvbmFyeVRvb2x0aXAgPT09IHRydWUgJiYgYS5kaWN0aW9uYXJ5VG9vbHRpcCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRGlzcGxheU9yZGVyIGNhc2VcclxuICAgICAgLy8gSSB0aGluayB0aGlzIHdvcmtzPyBDaGVjayBsYXRlclxyXG4gICAgICBjb2xzID0gY29scy5zb3J0KFxyXG4gICAgICAgIChhLCBiKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWEuaGVhZGVyTmFtZSAmJiBiLmhlYWRlck5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKCFiLmhlYWRlck5hbWUgJiYgYS5oZWFkZXJOYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhLmRpc3BsYXlPcmRlciAtIGIuZGlzcGxheU9yZGVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZnRlciBDb2x1bW5zIEhhdmUgQmVlbiBTb3J0ZWRcclxuICAgIC8vIERpY3Rpb25hcnkgR3JpZCBXaWxsIFNvcnQgVGhlIEdyaWQgQXNjZW5kaW5nIE9yZGVyIEJ5IEZpcnN0IENvbHVtblxyXG4gICAgaWYoY29scyAgJiYgY29scy5sZW5ndGggIT0gMCkge1xyXG4gICAgICBjb2xzWzBdLnNvcnQgPSBcImFzY1wiO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGF0YUNvbHVtbnMgPSBjb2xzO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhQ29sdW1ucykgJiYgdGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmFwaSkge1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zZXRDb2x1bW5EZWZzKHRoaXMuZGF0YUNvbHVtbnMpO1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0VkaXRhYmxlKHBhcmFtcyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCBpc0VkaXRhYmxlOiBib29sZWFuO1xyXG5cclxuICAgIGxldCBjb2x1bW46IGFueSA9IHt9O1xyXG4gICAgZm9yIChsZXQgZmllbGQgb2YgdGhpcy5kaWN0aW9uYXJ5LmZpZWxkcykge1xyXG4gICAgICBpZiAocGFyYW1zLmNvbERlZi5maWVsZCA9PSBmaWVsZC5uYW1lKSB7XHJcbiAgICAgICAgY29sdW1uID0gZmllbGQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocGFyYW1zLmRhdGEuZWRpdE9yTmV3ICYmIHBhcmFtcy5kYXRhLmVkaXRPck5ldyA9PSBcIm5ld1wiKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwibmV3IGVkaXRhYmxlP1wiKTtcclxuICAgICAgaXNFZGl0YWJsZSA9ICEodGhpcy5kaWN0aW9uYXJ5LnJlYWRPbmx5IHx8IGNvbHVtbi5yZWFkT25seSB8fFxyXG4gICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIlJlYWQgT25seVwiKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiZWRpdCBlZGl0YWJsZT9cIik7XHJcbiAgICAgIGlzRWRpdGFibGUgPSAhKHRoaXMuZGljdGlvbmFyeS5yZWFkT25seSB8fCBjb2x1bW4ucmVhZE9ubHkgfHxcclxuICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJSZWFkIE9ubHlcIiB8fCBjb2x1bW4uY3JlYXRlT25seSB8fFxyXG4gICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIkNyZWF0ZSBPbmx5XCIgfHwgY29sdW1uLmNvZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpc0VkaXRhYmxlO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlRGljdGlvbmFyeUVudHJpZXMoKTogdm9pZCB7XHJcblxyXG4gICAgbGV0IGRlbGV0ZVJvd3M6IGFueVtdID0gdGhpcy5ncmlkT3B0aW9ucy5hcGkuZ2V0U2VsZWN0ZWRSb3dzKCk7XHJcblxyXG4gICAgZm9yIChsZXQgZGVsZXRlSWQgb2YgdGhpcy5zZWxlY3RlZFJvd3MpIHtcclxuICAgICAgZm9yIChsZXQgZW50cnkgb2YgdGhpcy5kaWN0aW9uYXJ5RW50cmllcykge1xyXG4gICAgICAgIGlmIChlbnRyeVt0aGlzLmlkQ29sdW1uXSA9PT0gZGVsZXRlSWQpIHtcclxuICAgICAgICAgIGRlbGV0ZVJvd3MucHVzaChlbnRyeSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmRlbGV0ZURpY3Rpb25hcnlFbnRyaWVzKHRoaXMuY2xhc3NOYW1lLCBkZWxldGVSb3dzKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZXREaWN0aW9uYXJ5RW50cmllcygpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRGljdGlvbmFyeShldmVudDogYW55KTogdm9pZCB7XHJcblxyXG4gICAgLy8gSW1wb3J0YW50IHRvIG5vdGUgdGhpcyB3aWxsIG5vdCB1cGRhdGUgY2VsbHMgdG8gdGhlIGRlbW8gYnV0IHdpbGwgd2hlbiBpbXBvcnRlZCB0byBDT1JFIG9yIG90aGVyIGFwcGxpY2F0aW9ucy5cclxuICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UudXBkYXRlRGljdGlvbmFyeUVudHJpZXModGhpcy5jbGFzc05hbWUsIFtldmVudC5kYXRhXSkuc3Vic2NyaWJlKFxyXG4gICAgICAoZGF0YTogYW55W10pID0+IHtcclxuICAgICAgICB0aGlzLmdldERpY3Rpb25hcnlFbnRyaWVzKCk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzZXRTZWxlY3RlZEVudHJpZXMoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZFJvd3MgPSB0aGlzLmdyaWRPcHRpb25zLmFwaS5nZXRTZWxlY3RlZFJvd3MoKTtcclxuICB9XHJcblxyXG4gIG5ld1Jvd1Bvc3QoZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5hZGREaWN0aW9uYXJ5RW50cmllcyh0aGlzLmNsYXNzTmFtZSwgW2RhdGFdKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoXHJcbiAgICAgICAgICAoZGF0YTogT2JqZWN0W10pID0+IHtcclxuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gPGFueT5kYXRhWzBdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBvblNhbXBsZXNHcmlkUmVhZHkoZXZlbnQ6IEdyaWRSZWFkeUV2ZW50KTogdm9pZCB7XHJcblxyXG4gICAgZXZlbnQuYXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgb25HcmlkU2l6ZUNoYW5nZWQoZXZlbnQ6IGFueSkge1xyXG5cclxuICAgIGlmIChldmVudCAmJiBldmVudC5hcGkpIHtcclxuICAgICAgZXZlbnQuYXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGlzYWJsZUFkZFJvdygpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGljdGlvbmFyeSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5LnJlYWRPbmx5ICYmIHRoaXMuZGljdGlvbmFyeS5yZWFkT25seSA9PT0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGlzYWJsZURlbGV0ZSgpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGljdGlvbmFyeSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kaWN0aW9uYXJ5LnJlYWRPbmx5ICYmIHRoaXMuZGljdGlvbmFyeS5yZWFkT25seSA9PT0gdHJ1ZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmFwaSAmJiB0aGlzLmdyaWRPcHRpb25zLmFwaS5nZXRTZWxlY3RlZFJvd3MoKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5hcGkuZ2V0U2VsZWN0ZWRSb3dzKCkubGVuZ3RoID09PSAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbWJvRmlsdGVyVmFsdWVHZXR0ZXIocGFyYW1zKTogYW55IHtcclxuXHJcbiAgICBsZXQgdmFsdWUgPSBwYXJhbXMuZGF0YVtwYXJhbXMuY29sRGVmLmZpZWxkXTtcclxuXHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgbGV0IG9wdGlvbiA9ICgocGFyYW1zLmNvbERlZiBhcyBhbnkpLnNlbGVjdE9wdGlvbnMgYXMgYW55W10pLmZpbmQoKGVudHJ5KSA9PiAoZW50cnlbcGFyYW1zLmNvbERlZi5zZWxlY3RPcHRpb25zVmFsdWVGaWVsZF0gPT09IHZhbHVlKSk7XHJcbiAgICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bcGFyYW1zLmNvbERlZi5zZWxlY3RPcHRpb25zRGlzcGxheUZpZWxkXSA6IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrQWRkUm93KCkge1xyXG5cclxuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihOZXdSb3dDb21wb25lbnQsXHJcbiAgICAgIHtcclxuICAgICAgICBzaXplOiBcImxnXCIsXHJcbiAgICAgICAga2V5Ym9hcmQ6IGZhbHNlLFxyXG4gICAgICAgIGJhY2tkcm9wOiBcInN0YXRpY1wiLFxyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNvbERlZnMgPSB0aGlzLmRhdGFDb2x1bW5zO1xyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGljdGlvbmFyeSA9IHRoaXMuZGljdGlvbmFyeTtcclxuXHJcbiAgICBpZiAoIXRoaXMubmV3Um93U3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIC8vIHRlbGwgb3RoZXIgYWctZ3JpZCB0byBhZGQgcm93IHRvIGl0XHJcbiAgICAgIHRoaXMubmV3Um93U3Vic2NyaXB0aW9uID0gbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UubmV3Um93U3ViamVjdC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHRoZU5ld1JvdzogYW55W10pID0+IHtcclxuICAgICAgICAgIHRoaXMuZGljdGlvbmFyeUVudHJpZXMgPSB0aGVOZXdSb3cuY29uY2F0KHRoaXMuZGljdGlvbmFyeUVudHJpZXMpO1xyXG4gICAgICAgICAgdGhpcy5ncmlkT3B0aW9ucy5hcGkuc2V0Um93RGF0YSh0aGlzLmRpY3Rpb25hcnlFbnRyaWVzKTtcclxuICAgICAgICAgIHRoaXMubmV3Um93U3Vic2NyaXB0aW9uID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAvLyBJbXBvcnRhbnQgdG8gbm90ZSB0aGlzIHdpbGwgbm90IGFkZCByb3dzIHRvIHRoZSBkZW1vIGJ1dCB3aWxsIHdoZW4gaW1wb3J0ZWQgdG8gQ09SRSBvciBvdGhlciBhcHBsaWNhdGlvbnMuXHJcbiAgICAgICAgICB0aGlzLm5ld1Jvd1Bvc3QodGhlTmV3Um93WzBdKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmdldERpY3Rpb25hcnlFbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcGFyYXRlciBUbyBDb21wYXJlIDIgRGF0ZXNcclxuICAgKiBAcGFyYW0gZGF0ZTEgRGF0ZSAxXHJcbiAgICogQHBhcmFtIGRhdGUyIERhdGUgMlxyXG4gICAqL1xyXG4gIGRhdGVDb21wYXJhdG9yKGRhdGUxLCBkYXRlMikge1xyXG5cclxuICAgIGxldCBkYXRlMU51bWJlciA9IG1vbnRoVG9Db21wYXJhYmxlTnVtYmVyKGRhdGUxKTtcclxuICAgIGxldCBkYXRlMk51bWJlciA9IG1vbnRoVG9Db21wYXJhYmxlTnVtYmVyKGRhdGUyKTtcclxuXHJcbiAgICBpZiAoZGF0ZTFOdW1iZXIgPT09IG51bGwgJiYgZGF0ZTJOdW1iZXIgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGUxTnVtYmVyID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0ZTJOdW1iZXIgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRhdGUxTnVtYmVyIC0gZGF0ZTJOdW1iZXI7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogRXh0cmFjdHMgRGF0ZSBBbmQgVHVybiBUbyBBIE51bWVyaWNhbCBWYWx1ZSBGb3IgQ29tcGFyaW5nIFB1cnBvc2VzXHJcbiAqIEBwYXJhbSBkYXRlIFRoZSBkYXRlIHRvIGNvbXBhcmFibGUgbnVtYmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBtb250aFRvQ29tcGFyYWJsZU51bWJlcihkYXRlKSB7XHJcblxyXG4gIGlmIChkYXRlID09PSB1bmRlZmluZWQgfHwgZGF0ZSA9PT0gbnVsbCB8fCBkYXRlLmxlbmd0aCAhPT0gMTApIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgbGV0IHllYXJOdW1iZXIgPSBkYXRlLnN1YnN0cmluZygwLCA0KTtcclxuICBsZXQgbW9udGhOdW1iZXIgPSBkYXRlLnN1YnN0cmluZyg1LCA3KTtcclxuICBsZXQgZGF5TnVtYmVyID0gZGF0ZS5zdWJzdHJpbmcoOCwgMTApO1xyXG5cclxuICByZXR1cm4geWVhck51bWJlciAqIDEwMDAwICsgbW9udGhOdW1iZXIgKiAxMDAgKyBkYXlOdW1iZXI7XHJcbn1cclxuIl19
752
+ `, styles: [".full-height{height:100%}.full-width{width:100%}.ag-theme-balham{font-family:Prompt;font-weight:500}.active-color{float:right;font-size:15px;color:var(--bluewarm-dark)}.deactivated-color{float:right;font-size:15px;color:var(--greywarm-medlight)}.dictionary-info-section{padding-top:10px}.dictionary-title{float:left;font-size:16px;padding-left:10px;padding-right:10px;padding-top:5px}.metadata-button{color:var(--white-lightest);float:left;font-size:15px}:host::ng-deep .ag-header-cell{background-color:var(--bluewarmvividfade-lightest);border:lightgray solid thin}:host::ng-deep .ag-cell{border-right:lightgray solid thin;border-left:lightgray solid thin}:host::ng-deep .ag-row{border-bottom:0;border-top:0}:host::ng-deep .ag-row-even{background-color:var(--white-medium)}.hci-dictionary-detail-body{height:100%;width:100%;background:linear-gradient(0deg,var(--white-lightest) 30%,var(--bluewarmvividfade-lighter) 100%)!important}.hci-dictoinary-display-grid{padding-right:5px;padding-left:5px;box-shadow:#00000059 0 5px 15px}:host::ng-deep .ag-row-hover{color:#666!important;background-color:var(--bluewarmvividfade-lighter)!important}:host::ng-deep .ag-row-selected .ag-cell{color:var(--white-lightest)!important}:host::ng-deep .ag-row-selected{color:var(--white-darker)!important;background-color:var(--bluewarmvivid-lighter)!important}\n"] }]
753
+ }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.NgbModal }, { type: i3.DictionaryService }, { type: undefined, decorators: [{
754
+ type: Inject,
755
+ args: [DICTIONARY_ENDPOINT]
756
+ }] }], propDecorators: { classList: [{
757
+ type: HostBinding,
758
+ args: ["class"]
759
+ }] } });
760
+ /**
761
+ * Extracts Date And Turn To A Numerical Value For Comparing Purposes
762
+ * @param date The date to comparable number
763
+ */
764
+ function monthToComparableNumber(date) {
765
+ if (date === undefined || date === null || date.length !== 10) {
766
+ return null;
767
+ }
768
+ let yearNumber = date.substring(0, 4);
769
+ let monthNumber = date.substring(5, 7);
770
+ let dayNumber = date.substring(8, 10);
771
+ return yearNumber * 10000 + monthNumber * 100 + dayNumber;
772
+ }
773
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RpY3Rpb25hcnktZWRpdG9yL3NyYy9jb21wb25lbnRzL2RldGFpbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFhLFdBQVcsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFDLGVBQWUsRUFBYSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUMsUUFBUSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxRQUFRLEVBQWMsTUFBTSw0QkFBNEIsQ0FBQztBQUVqRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQVFyRyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDakUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDOzs7Ozs7O0FBRWpHOzs7Ozs7OztHQVFHO0FBZ01ILE1BQU0sT0FBTywrQkFBK0I7SUE4QjFDLFlBQ1UsS0FBcUIsRUFDckIsWUFBc0IsRUFDdEIsaUJBQW9DLEVBQ1Asa0JBQTBCO1FBSHZELFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGlCQUFZLEdBQVosWUFBWSxDQUFVO1FBQ3RCLHNC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RUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDekcsRUFBQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDbkksRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDM0YsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBQztZQUN0RyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFDO1lBQzlGLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDOUYsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7WUFDN0YsRUFBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFB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QztRQUM5RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0QyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUV0QyxPQUFPLFVBQVUsR0FBRyxLQUFLLEdBQUcsV0FBVyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUM7QUFDNUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbmplY3QsIGlzRGV2TW9kZSwgVmlld0NoaWxkLCBIb3N0QmluZGluZywgVGVtcGxhdGVSZWZ9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7QWN0aXZhdGVkUm91dGV9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuXHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge2ZpbmFsaXplLCBtYXB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQge05nYk1vZGFsLCBOZ2JNb2RhbFJlZn0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcblxyXG5pbXBvcnQge0RpY3Rpb25hcnlTZXJ2aWNlLCBESUNUSU9OQVJZX0VORFBPSU5UfSBmcm9tIFwiQGh1bnRzbWFuLWNhbmNlci1pbnN0aXR1dGUvZGljdGlvbmFyeS1zZXJ2aWNlXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gIENvbHVtbkFwaSxcclxuICBHcmlkT3B0aW9ucyxcclxuICBHcmlkUmVhZHlFdmVudCxcclxuICBHcmlkQXBpXHJcbn0gZnJvbSBcImFnLWdyaWQtY29tbXVuaXR5XCI7XHJcbmltcG9ydCB7U2VsZWN0UmVuZGVyZXJ9IGZyb20gXCIuLi9ncmlkLXJlbmRlcmVycy9zZWxlY3QucmVuZGVyZXJcIjtcclxuaW1wb3J0IHtTZWxlY3RFZGl0b3J9IGZyb20gXCIuLi9ncmlkLWVkaXRvcnMvc2VsZWN0LmVkaXRvclwiO1xyXG5pbXBvcnQge05ld1Jvd0NvbXBvbmVudH0gZnJvbSBcIi4vbmV3LXJvdy5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtpc051bGxPclVuZGVmaW5lZH0gZnJvbSBcInV0aWxcIjtcclxuaW1wb3J0IHtEYXRlUmVuZGVyZXJ9IGZyb20gXCIuLi9ncmlkLXJlbmRlcmVycy9kYXRlLnJlbmRlcmVyXCI7XHJcbmltcG9ydCB7QWdHcmlkRGF0ZUNlbGxFZGl0b3JDb21wb25lbnR9IGZyb20gXCIuLi9ncmlkLWVkaXRvcnMvYWctZ3JpZC1kYXRlLWNlbGwtZWRpdG9yLmNvbXBvbmVudFwiO1xyXG5cclxuLyoqXHJcbiAqIFdoZW4gYSBkaWN0aW9uYXJ5IGlzIHNlbGVjdGVkIHRoaXMgY29tcG9uZW50IGlzIHNob3duLiAgVGhlcmUgaXMgYSB0b3AgZ3JpZCB3aGljaCBmb3IgaXRzIGRhdGEgc2hvd3MgYWxsIHRoZSBjb2x1bW5zXHJcbiAqIGZvciB0aGUgZGljdGlvbmFyeS4gQ3VycmVudGx5LCBrZWVwIHRoaXMgZm9yIHJlZmVyZW5jZSBvbmx5IGFuZCBoYXZlIG5vbi1lZGl0YWJsZS5cclxuICogVGhlIGJvdHRvbSBncmlkIHdpbGwgc2hvdyB0aG9zZSBjb2x1bW5zIGFzIGFjdHVhbCBjb2x1bW5zIGFuZCBpdHMgZGF0YSBhcmUgYWxsIHRoZSBkaWN0aW9uYXJ5IHZhbHVlcy4gIFJvd3MgY2FuIGJlXHJcbiAqIGFkZGVkLiAgRm9yIGRlbGV0aW5nLCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgaWQgaXMgbm90IHVzZWQgYW55d2hlcmUuICBGb3IgZWRpdGluZywgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGNvZGUgb3IgYW55dGhpbmdcclxuICogZWxzZSBpc24ndCBiZWluZyByZWZlcmVuY2VkLlxyXG4gKlxyXG4gKiBAc2luY2UgMS4wLjBcclxuICovXHJcbkBDb21wb25lbnQoXHJcbiAge1xyXG4gICAgc2VsZWN0b3I6IFwiaGNpLWRpY3Rpb25hcnktZWRpdG9yLWRldGFpbFwiLFxyXG4gICAgdGVtcGxhdGU6XHJcbiAgICAgIGBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGhjaS1kaWN0aW9uYXJ5LWRldGFpbC1ib2R5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aGNpLWJ1c3kgW2J1c3lTdWJqZWN0c109XCJsb2FkaW5nU3ViamVjdHNcIj48L2hjaS1idXN5PlxyXG5cclxuICAgICAgICAgIDwhLS0gRGljdGlvbmFyeSBUaXRsZSBBbmQgTWV0YWRhdGEgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGljdGlvbmFyeS1pbmZvLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkaWN0aW9uYXJ5LXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAge3tkaXNwbGF5TmFtZX19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtZXRhZGF0YS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuTW9kYWwobWV0YURhdGFNb2RhbClcIj5cclxuICAgICAgICAgICAgICBWaWV3IE1ldGEgRGF0YVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gRGljdGlvbmFyeSBFZGl0IEJ1dHRvbnMgLS0+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIFtjbGFzc109XCJkaXNhYmxlRGVsZXRlPyAnZGVhY3RpdmF0ZWQtY29sb3InOiAnYWN0aXZlLWNvbG9yJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVEZWxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQXJlWW91U3VyZU1vZGFsKGFyZVlvdVN1cmVNb2RhbClcIj5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1taW51c1wiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9XCJjb2xvcjogdmFyKC0tYmx1ZXdhcm0tZGFyayk7IGZsb2F0OiByaWdodDsgZm9udC1zaXplOiAxNXB4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVBZGRSb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrQWRkUm93KClcIj5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gRGljdGlvbmFyeSBEaXNwbGF5IEdyaWQgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgIDxhZy1ncmlkLWFuZ3VsYXIgaWQ9XCJkaWN0aW9uYXJ5LWdyaWQtZGlzcGxheVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2RhdGFHcmlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZy10aGVtZS1iYWxoYW0gZnVsbC1oZWlnaHQgZnVsbC13aWR0aCBoY2ktZGljdG9pbmFyeS1kaXNwbGF5LWdyaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dEYXRhXT1cImRpY3Rpb25hcnlFbnRyaWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uXT1cIidtdWx0aXBsZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaW5nbGVDbGlja0VkaXRdPVwiJ3RydWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdGlvbl09XCIndHJ1ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0aW9uQXV0b1BhZ2VTaXplXT1cIid0cnVlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2VsbFZhbHVlQ2hhbmdlZCk9XCJ1cGRhdGVEaWN0aW9uYXJ5KCRldmVudClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvYWctZ3JpZC1hbmd1bGFyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBEaWN0aW9uYXJ5IE1ldGFkYXRhIFBvcHVwIC0tPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNtZXRhRGF0YU1vZGFsIGxldC1jbG9zZT1cImNsb3NlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDoxMDAwcHhcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICBNZXRhIERhdGEgZm9yIHt7Y2xhc3NOYW1lfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIG1vZGFsLWJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjY2VkNGRhOyB3aWR0aDogMTAwJTtcIj5cclxuICAgICAgICAgICAgICAgIDxhZy1ncmlkLWFuZ3VsYXIgI21ldGFHcmlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWctdGhlbWUtYmFsaGFtIGZ1bGwtd2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImhlaWdodDogMjUwcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyaWRSZWFkeSk9XCJ0aGlzLm9uTWV0YUdyaWRSZWFkeSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyaWRPcHRpb25zXT1cInRoaXMubWV0YUdyaWRPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbl09XCInc2luZ2xlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmcmFtZXdvcmtDb21wb25lbnRzXT1cImZyYW1ld29ya0NvbXBvbmVudHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93RGF0YV09XCJkaWN0aW9uYXJ5Py5maWVsZHNcIj5cclxuICAgICAgICAgICAgICAgIDwvYWctZ3JpZC1hbmd1bGFyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiY2xvc2UoJ0Nsb3NlJylcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgPCEtLSBEaWN0aW9uYXJ5IERlbGV0ZSBDb21maXJtYXRpb24gUG9wdXAgLS0+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2FyZVlvdVN1cmVNb2RhbCBsZXQtY2xvc2U9XCJjbG9zZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgQ29uZmlybWF0aW9uXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBkLWZsZXhcIj5cclxuICAgICAgICAgICAgICBBcmUgeW91IHN1cmU/XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJjbG9zZSgnQ2FuY2VsJylcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1yZWRcIiAoY2xpY2spPVwiY2xvc2UoJ0RlbGV0ZScpXCI+RGVsZXRlPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgYCxcclxuICAgIHN0eWxlczogW1xyXG4gICAgICBgXHJcbiAgICAgICAgLmZ1bGwtaGVpZ2h0IHtcclxuICAgICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5mdWxsLXdpZHRoIHtcclxuICAgICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmFnLXRoZW1lLWJhbGhhbSB7XHJcbiAgICAgICAgICBmb250LWZhbWlseTogXCJQcm9tcHRcIjtcclxuICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAuYWN0aXZlLWNvbG9yIHtcclxuICAgICAgICAgIGZsb2F0OiByaWdodDtcclxuICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDtcclxuICAgICAgICAgIGNvbG9yOiB2YXIoLS1ibHVld2FybS1kYXJrKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5kZWFjdGl2YXRlZC1jb2xvciB7XHJcbiAgICAgICAgICBmbG9hdDogcmlnaHQ7XHJcbiAgICAgICAgICBmb250LXNpemU6IDE1cHg7XHJcbiAgICAgICAgICBjb2xvcjogdmFyKC0tZ3JleXdhcm0tbWVkbGlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmRpY3Rpb25hcnktaW5mby1zZWN0aW9uIHtcclxuICAgICAgICAgIHBhZGRpbmctdG9wOiAxMHB4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmRpY3Rpb25hcnktdGl0bGUge1xyXG4gICAgICAgICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICAgICAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XHJcbiAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xyXG4gICAgICAgICAgcGFkZGluZy10b3A6IDVweDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5tZXRhZGF0YS1idXR0b24ge1xyXG4gICAgICAgICAgY29sb3I6IHZhcigtLXdoaXRlLWxpZ2h0ZXN0KTtcclxuICAgICAgICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgOmhvc3Q6Om5nLWRlZXAgLmFnLWhlYWRlci1jZWxsIHtcclxuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJsdWV3YXJtdml2aWRmYWRlLWxpZ2h0ZXN0KTtcclxuICAgICAgICAgIGJvcmRlcjogbGlnaHRncmF5IHNvbGlkIHRoaW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA6aG9zdDo6bmctZGVlcCAuYWctY2VsbCB7XHJcbiAgICAgICAgICBib3JkZXItcmlnaHQ6IGxpZ2h0Z3JheSBzb2xpZCB0aGluO1xyXG4gICAgICAgICAgYm9yZGVyLWxlZnQ6IGxpZ2h0Z3JheSBzb2xpZCB0aGluO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgOmhvc3Q6Om5nLWRlZXAgLmFnLXJvdyB7XHJcbiAgICAgICAgICBib3JkZXItYm90dG9tOiAwO1xyXG4gICAgICAgICAgYm9yZGVyLXRvcDogMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDpob3N0OjpuZy1kZWVwIC5hZy1yb3ctZXZlbiB7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS13aGl0ZS1tZWRpdW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmhjaS1kaWN0aW9uYXJ5LWRldGFpbC1ib2R5IHtcclxuICAgICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDBkZWcsIHZhcigtLXdoaXRlLWxpZ2h0ZXN0KSAzMCUsIHZhcigtLWJsdWV3YXJtdml2aWRmYWRlLWxpZ2h0ZXIpIDEwMCUpICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAuaGNpLWRpY3RvaW5hcnktZGlzcGxheS1ncmlkIHtcclxuICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcclxuICAgICAgICAgIHBhZGRpbmctbGVmdDogNXB4O1xyXG4gICAgICAgICAgYm94LXNoYWRvdzogcmdiYSgwLCAwLCAwLCAwLjM1KSAwcHggNXB4IDE1cHg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAgICAqIERpY3Rpb25hcnkgUm93IEhvdmVyIENTU1xyXG4gICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG4gICAgICAgIDpob3N0OjpuZy1kZWVwIC5hZy1yb3ctaG92ZXIge1xyXG4gICAgICAgICAgY29sb3I6ICM2NjYgIWltcG9ydGFudDtcclxuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJsdWV3YXJtdml2aWRmYWRlLWxpZ2h0ZXIpICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAgICAqIERpY3Rpb25hcnkgQ2VsbCBTZWxlY3RlZCBDU1NcclxuICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgICAgICA6aG9zdDo6bmctZGVlcCAuYWctcm93LXNlbGVjdGVkIC5hZy1jZWxsIHtcclxuICAgICAgICAgIGNvbG9yOiB2YXIoLS13aGl0ZS1saWdodGVzdCkgIWltcG9ydGFudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgICAgICogRGljdGlvbmFyeSBSb3cgU2VsZWN0ZWQgQ1NTXHJcbiAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgICAgICAgOmhvc3Q6Om5nLWRlZXAgLmFnLXJvdy1zZWxlY3RlZCB7XHJcbiAgICAgICAgICBjb2xvcjogdmFyKC0td2hpdGUtZGFya2VyKSAhaW1wb3J0YW50O1xyXG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmx1ZXdhcm12aXZpZC1saWdodGVyKSAhaW1wb3J0YW50O1xyXG4gICAgICAgIH1cclxuICAgICAgYFxyXG4gICAgXVxyXG4gIH1cclxuKVxyXG5leHBvcnQgY2xhc3MgRGljdGlvbmFyeUVkaXRvckRldGFpbENvbXBvbmVudCB7XHJcblxyXG4gIEBIb3N0QmluZGluZyhcImNsYXNzXCIpIGNsYXNzTGlzdDogc3RyaW5nID0gXCJvdXRsZXQtY29sdW1uIHktYXV0b1wiO1xyXG5cclxuICBwcml2YXRlIHNlY29uZGFyeURpY3Rpb25hcnlFbnRyaWVzOiBhbnk7XHJcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XHJcbiAgZGlzcGxheU5hbWU6IGFueTtcclxuICBkaWN0aW9uYXJ5OiBhbnk7XHJcbiAgZGljdGlvbmFyeUVudHJpZXM6IGFueVtdID0gW107XHJcbiAgZGF0YUNvbHVtbnM6IGFueVtdO1xyXG5cclxuICBpZENvbHVtbjogc3RyaW5nO1xyXG4gIHNlbGVjdGVkUm93czogYW55W10gPSBbXTtcclxuICBsb2FkaW5nU3ViamVjdHM6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPltdID0gW107XHJcblxyXG4gIGJvdW5kTmV3Um93UG9zdENhbGw6IChkYXRhOiBhbnkpID0+IE9ic2VydmFibGU8YW55PjtcclxuICBncmlkT3B0aW9uczogR3JpZE9wdGlvbnM7XHJcbiAgbmV3Um93U3Vic2NyaXB0aW9uOiBhbnk7XHJcblxyXG4gIG1ldGFHcmlkT3B0aW9ucyA9IHtcclxuICAgIHJvd1N0eWxlOiB7XHJcbiAgICAgIFwiZm9udC1mYW1pbHlcIjogXCJQcm9tcHQsIHNhbnMtc2VyaWZcIlxyXG4gICAgfSxcclxuICAgIGVuYWJsZUNlbGxUZXh0U2VsZWN0aW9uOiB0cnVlLFxyXG4gICAgZW5zdXJlRG9tT3JkZXI6IHRydWVcclxuICB9O1xyXG4gIGZyYW1ld29ya0NvbXBvbmVudHM6IGFueTtcclxuICBwdWJsaWMgZ3JpZEFwaU1ldGE6IEdyaWRBcGk7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSBkaWN0aW9uYXJ5U2VydmljZTogRGljdGlvbmFyeVNlcnZpY2UsXHJcbiAgICBASW5qZWN0KERJQ1RJT05BUllfRU5EUE9JTlQpIHByaXZhdGUgZGljdGlvbmFyeUVuZHBvaW50OiBzdHJpbmdcclxuICApIHtcclxuXHJcbiAgICB0aGlzLmdyaWRPcHRpb25zID0gPEdyaWRPcHRpb25zPntcclxuICAgICAgY29udGV4dDoge1xyXG4gICAgICAgIGNvbXBvbmVudFBhcmVudDogdGhpc1xyXG4gICAgICB9LFxyXG4gICAgICBvbkdyaWRSZWFkeTogRGljdGlvbmFyeUVkaXRvckRldGFpbENvbXBvbmVudC5vblNhbXBsZXNHcmlkUmVhZHksXHJcbiAgICAgIG9uR3JpZFNpemVDaGFuZ2VkOiBEaWN0aW9uYXJ5RWRpdG9yRGV0YWlsQ29tcG9uZW50Lm9uR3JpZFNpemVDaGFuZ2VkLFxyXG4gICAgICBzdXBwcmVzc0hvcml6b250YWxTY3JvbGw6IGZhbHNlLFxyXG4gICAgICBzZWxlY3Rpb25Nb2RlOiBcIm11bHRpcGxlXCIsXHJcbiAgICAgIHN0b3BFZGl0aW5nV2hlbkdyaWRMb3Nlc0ZvY3VzOiB0cnVlLFxyXG4gICAgICBlbmFibGVTb3J0aW5nOiB0cnVlLFxyXG4gICAgICBlbmFibGVGaWx0ZXI6IHRydWVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCYXNlZCBvbiB0aGUgcm91dGUgY2xhc3MgbmFtZSwgbWFrZSB0aGUgY2FsbCB0byBmZXRjaCB0aGUgZGljdGlvbmFyeSBkYXRhLiAgU2luY2UgdGhpcyBjb21wb25lbnQgaXMgcm91dGUgYmFzZWQsXHJcbiAgICogd2hlbiB0aGUgZGljdGlvbmFyeSBjbGFzcyBpbiB0aGUgcm91dGUgY2hhbmdlcywgdGhpcyBjb21wb25lbnQgaXMgcmVsb2FkZWQuXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgdGhpcy5ib3VuZE5ld1Jvd1Bvc3RDYWxsID0gdGhpcy5uZXdSb3dQb3N0LmJpbmQodGhpcyk7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdHMucHVzaChuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSk7XHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0cy5wdXNoKG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpKTtcclxuXHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUoXHJcbiAgICAgIHBhcmFtcyA9PiB7XHJcbiAgICAgICAgbGV0IGNsYXNzTmFtZTogc3RyaW5nID0gcGFyYW1zW1wiY2xhc3NOYW1lXCJdO1xyXG5cclxuICAgICAgICB0aGlzLmdldERpY3Rpb25hcnkoY2xhc3NOYW1lKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG9wZW5Nb2RhbChtb2RhbDogVGVtcGxhdGVSZWY8YW55Pik6IHZvaWQge1xyXG5cclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4obW9kYWwsIHt3aW5kb3dDbGFzczogXCJtb2RhbC14bFwifSkucmVzdWx0LnRoZW4oXHJcbiAgICAgIChyZXN1bHQpID0+IHtcclxuICAgICAgfSxcclxuICAgICAgKHJlYXNvbikgPT4ge1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG5cclxuICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb2x1bW5EZWZNZXRhKCkgOiBhbnlbXSB7XHJcblxyXG4gICAgcmV0dXJuIFtcclxuICAgICAge2ZpZWxkOiBcIm5hbWVcIiwgaGVhZGVyTmFtZTogXCJOYW1lXCIsIHdpZHRoOiAxNzUsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJkZXNjcmlwdGlvblwiLCBoZWFkZXJOYW1lOiBcIkRlc2NyaXB0aW9uXCIsIHdpZHRoOiAyNTAsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJpZFwiLCBoZWFkZXJOYW1lOiBcIklkXCIsIHdpZHRoOiA2MCwgc29ydGFibGU6IHRydWUsIHJlc2l6YWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlfSxcclxuICAgICAge2ZpZWxkOiBcInR5cGVcIiwgaGVhZGVyTmFtZTogXCJUeXBlXCIsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJwcm90ZWN0aW9uVHlwZVwiLCBoZWFkZXJOYW1lOiBcIlByb3RlY3Rpb25UeXBlXCIsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJmaWx0ZXJEaWN0aW9uYXJ5Q2xhc3NcIiwgaGVhZGVyTmFtZTogXCJGaWx0ZXJEaWN0aW9uYXJ5Q2xhc3NcIiwgd2lkdGg6IDE4MCwgc29ydGFibGU6IHRydWUsIHJlc2l6YWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlfSxcclxuICAgICAge2ZpZWxkOiBcIm5vdE51bGxcIiwgaGVhZGVyTmFtZTogXCJOb3ROdWxsXCIsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJpbnRlZ2VyXCIsIGhlYWRlck5hbWU6IFwiSW50ZWdlclwiLCB3aWR0aDogNzUsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJtaW5cIiwgaGVhZGVyTmFtZTogXCJNaW5cIiwgd2lkdGg6IDYwLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwibWF4XCIsIGhlYWRlck5hbWU6IFwiTWF4XCIsIHdpZHRoOiA2MCwgc29ydGFibGU6IHRydWUsIHJlc2l6YWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlfSxcclxuICAgICAge2ZpZWxkOiBcImZyYWN0aW9uXCIsIGhlYWRlck5hbWU6IFwiRnJhY3Rpb25cIiwgc29ydGFibGU6IHRydWUsIHJlc2l6YWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlfSxcclxuICAgICAge2ZpZWxkOiBcImRpY3Rpb25hcnlUb29sdGlwXCIsIGhlYWRlck5hbWU6IFwiRGljdGlvbmFyeVRvb2x0aXBcIiwgd2lkdGg6IDIwMCwgc29ydGFibGU6IHRydWUsIHJlc2l6YWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlfSxcclxuICAgICAge2ZpZWxkOiBcImRpY3Rpb25hcnlEaXNwbGF5XCIsIGhlYWRlck5hbWU6IFwiRGljdGlvbmFyeURpc3BsYXlcIiwgd2lkdGg6IDE3NSwgc29ydGFibGU6IHRydWUsIHJlc2l6YWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlfSxcclxuICAgICAge2ZpZWxkOiBcImZpbHRlcmFibGVcIiwgaGVhZGVyTmFtZTogXCJGaWx0ZXJhYmxlXCIsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJkaXNwbGF5TmFtZVwiLCBoZWFkZXJOYW1lOiBcIkRpc3BsYXlOYW1lXCIsIHdpZHRoOiAxNzUsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICAgIHtmaWVsZDogXCJkaXNwbGF5T3JkZXJcIiwgaGVhZGVyTmFtZTogXCJEaXNwbGF5T3JkZXJcIiwgd2lkdGg6IDYwLCBzb3J0YWJsZTogdHJ1ZSwgcmVzaXphYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICB7ZmllbGQ6IFwiY2VsbFN0eWxlXCIsIGhlYWRlck5hbWU6IFwiQ2VsbFN0eWxlXCIsIHNvcnRhYmxlOiB0cnVlLCByZXNpemFibGU6IHRydWUsIGVkaXRhYmxlOiBmYWxzZX0sXHJcbiAgICBdOyAvLyB0aGUgd2lkdGhzIGZvciB0aGUgbGFzdCAyIGNvdWxkIGJlIHdyb25nLlxyXG5cclxuICB9XHJcblxyXG4gIG9uTWV0YUdyaWRSZWFkeShwYXJhbXMgOiBhbnkpIHtcclxuXHJcbiAgICB0aGlzLmdyaWRBcGlNZXRhID0gcGFyYW1zLmFwaTtcclxuICAgIHRoaXMuZ3JpZEFwaU1ldGEuc2V0Q29sdW1uRGVmcyh0aGlzLmNvbHVtbkRlZk1ldGEoKSk7XHJcbiAgICB0aGlzLmdyaWRBcGlNZXRhLnNldFJvd0RhdGEodGhpcy5kaWN0aW9uYXJ5Py5maWVsZHMpO1xyXG4gICAgLy8gdGhpcy5ncmlkQXBpTWV0YS5zaXplQ29sdW1uc1RvRml0KCk7XHJcblxyXG4gIH1cclxuXHJcbiAgb3BlbkFyZVlvdVN1cmVNb2RhbChtb2RhbDogVGVtcGxhdGVSZWY8YW55Pik6IHZvaWQge1xyXG5cclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4obW9kYWwpLnJlc3VsdC50aGVuKFxyXG4gICAgICAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gXCJEZWxldGVcIikge1xyXG4gICAgICAgICAgdGhpcy5kZWxldGVEaWN0aW9uYXJ5RW50cmllcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgKHJlYXNvbikgPT4ge1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2ggdGhlIGRpY3Rpb25hcnkgbWV0YWRhdGEgYW5kIGRpY3Rpb25hcnkgZW50cmllcyBiYXNlZCB1cG9uIHRoZSBkaWN0aW9uYXJ5IGNsYXNzIG5hbWUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lXHJcbiAgICovXHJcbiAgZ2V0RGljdGlvbmFyeShjbGFzc05hbWU6IHN0cmluZykge1xyXG5cclxuICAgIC8vIFdoZW4gU2VsZWN0aW5nIEEgTmV3IERpY3Rpb25hcnksIE5hdmlnYXRlIFRvIEZpcnN0IFBhZ2VcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXBpKSB7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnBhZ2luYXRpb25Hb1RvRmlyc3RQYWdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7XHJcbiAgICB0aGlzLmRhdGFDb2x1bW5zID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdHNbMF0ubmV4dCh0cnVlKTtcclxuXHJcbiAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnkoY2xhc3NOYW1lKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaW5hbGl6ZShcclxuICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdHNbMF0ubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICApLnN1YnNjcmliZShcclxuICAgICAgKGRpY3Rpb25hcnk6IE9iamVjdCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0VXBEaWN0aW9uYXJ5R3JpZChkaWN0aW9uYXJ5KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0c1swXS5uZXh0KGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmdldERpY3Rpb25hcnlFbnRyaWVzKCk7XHJcbiAgfVxyXG5cclxuICBnZXREaWN0aW9uYXJ5RW50cmllcygpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0c1sxXS5uZXh0KHRydWUpO1xyXG5cclxuICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXModGhpcy5jbGFzc05hbWUpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbmFsaXplKFxyXG4gICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0c1sxXS5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICAgICkuc3Vic2NyaWJlKFxyXG4gICAgICAoZGljdGlvbmFyeUVudHJpZXM6IE9iamVjdFtdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5RW50cmllcyA9IGRpY3Rpb25hcnlFbnRyaWVzO1xyXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnNldFJvd0RhdGEoZGljdGlvbmFyeUVudHJpZXMpO1xyXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0c1sxXS5uZXh0KGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZGljdGlvbmFyeSBtZXRhZGF0YS4gIFRoaXMgaXMgdXNlZCB0byBidWlsZCB0aGUgY29sdW1ucyBmb3IgdGhlIGRpY3Rpb25hcnkgZW50cmllcy4gIFRoZSBuYW1lcywgdmFsaWRhdGlvbixcclxuICAgKiBhbmQgZmlsdGVyIGNsYXNzZXMgYnVpbGQgdGhlIGNvbHVtbiBkZWZpbml0aW9uLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGRpY3Rpb25hcnlcclxuICAgKi9cclxuICBwcml2YXRlIHNldFVwRGljdGlvbmFyeUdyaWQoZGljdGlvbmFyeTogYW55KTogdm9pZCB7XHJcblxyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJEaWN0aW9uYXJ5RWRpdG9yRGV0YWlsQ29tcG9uZW50LnNldERpY3Rpb25hcnlcIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoZGljdGlvbmFyeSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kaWN0aW9uYXJ5ID0gZGljdGlvbmFyeTtcclxuICAgIHRoaXMuc2Vjb25kYXJ5RGljdGlvbmFyeUVudHJpZXMgPSBbXTtcclxuICAgIGxldCBkaWN0aW9uYXJ5Q2xhc3NOYW1lcyA9IFtdO1xyXG5cclxuICAgIGZvciAobGV0IGZpZWxkIG9mIGRpY3Rpb25hcnkuZmllbGRzKSB7XHJcbiAgICAgIGlmIChmaWVsZC5maWx0ZXJEaWN0aW9uYXJ5Q2xhc3MpIHtcclxuICAgICAgICBkaWN0aW9uYXJ5Q2xhc3NOYW1lcy5wdXNoKGZpZWxkLmZpbHRlckRpY3Rpb25hcnlDbGFzcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdldFNlY29uZGFyeURpY3Rpb25hcmllcyhkaWN0aW9uYXJ5Q2xhc3NOYW1lcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlY29uZGFyeURpY3Rpb25hcmllcyhkaWN0aW9uYXJ5TmFtZXM6IHN0cmluZ1tdKSB7XHJcblxyXG4gICAgaWYgKGRpY3Rpb25hcnlOYW1lcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICB0aGlzLmZpbmlzaENvbHVtblNldHVwKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZGljdGlvbmFyeU5hbWUgPSBkaWN0aW9uYXJ5TmFtZXMucG9wKCk7XHJcblxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlEcm9wZG93bkVudHJpZXMoZGljdGlvbmFyeU5hbWUpLnN1YnNjcmliZShcclxuICAgICAgICAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZWNvbmRhcnlEaWN0aW9uYXJ5RW50cmllcy5wdXNoKHtkaWN0aW9uYXJ5TmFtZTogZGljdGlvbmFyeU5hbWUsIGVudHJpZXM6IHJlc3BvbnNlfSk7XHJcbiAgICAgICAgICB0aGlzLmdldFNlY29uZGFyeURpY3Rpb25hcmllcyhkaWN0aW9uYXJ5TmFtZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluaXNoQ29sdW1uU2V0dXAoKSB7XHJcblxyXG4gICAgdGhpcy5kaXNwbGF5TmFtZSA9IHRoaXMuZGljdGlvbmFyeS5kaXNwbGF5TmFtZTtcclxuXHJcbiAgICAvLyBUaGlzIGVzdGFibGlzaGVzIHRoZSByZWFkT25seSBmdW5jdGlvbmFsaXR5XHJcbiAgICBsZXQgY29sczogYW55W10gPSBbXTtcclxuXHJcbiAgICAvLyBQcm9jZXNzIENvbHVtbnMgQW5kIENyZWF0ZSBDb2x1bW4gRGVmaW5pdGlvblxyXG4gICAgZm9yIChsZXQgZmllbGQgb2YgdGhpcy5kaWN0aW9uYXJ5LmZpZWxkcykge1xyXG4gICAgICBpZiAoZmllbGQuaWQgJiYgKGlzTnVsbE9yVW5kZWZpbmVkKGZpZWxkLmNvZGUpIHx8IGZpZWxkLmNvZGUgPT0gZmFsc2UpKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjb2w6IGFueTtcclxuXHJcbiAgICAgIGlmIChmaWVsZC5maWx0ZXJEaWN0aW9uYXJ5Q2xhc3MpIHtcclxuICAgICAgICAvLyB0aGlzIGlzIGEgZHJvcGRvd24gb2YgYW5vdGhlciBkaWN0aW9uYXJ5XHJcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLnNlY29uZGFyeURpY3Rpb25hcnlFbnRyaWVzLmZpbmQoXHJcbiAgICAgICAgICAoYTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBhLmRpY3Rpb25hcnlOYW1lID09PSBmaWVsZC5maWx0ZXJEaWN0aW9uYXJ5Q2xhc3M7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29sID0ge1xyXG4gICAgICAgICAgZmllbGQ6IGZpZWxkLm5hbWUsXHJcbiAgICAgICAgICBoZWFkZXJOYW1lOiBmaWVsZC5kaXNwbGF5TmFtZSxcclxuICAgICAgICAgIGVkaXRhYmxlOiB0aGlzLmlzRWRpdGFibGUuYmluZCh0aGlzKSxcclxuICAgICAgICAgIGNlbGxSZW5kZXJlckZyYW1ld29yazogU2VsZWN0UmVuZGVyZXIsXHJcbiAgICAgICAgICBjZWxsRWRpdG9yRnJhbWV3b3JrOiBTZWxlY3RFZGl0b3IsXHJcbiAgICAgICAgICBzZWxlY3RPcHRpb25zRGlzcGxheUZpZWxkOiBcImRpc3BsYXlcIixcclxuICAgICAgICAgIHNlbGVjdE9wdGlvbnNWYWx1ZUZpZWxkOiBcImlkXCIsXHJcbiAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIGZpbHRlcjogdHJ1ZSxcclxuICAgICAgICAgIGZpbHRlclZhbHVlR2V0dGVyOiB0aGlzLmNvbWJvRmlsdGVyVmFsdWVHZXR0ZXIsXHJcbiAgICAgICAgICBzZWxlY3RPcHRpb25zOiBbXSxcclxuICAgICAgICAgIGNvbXBhcmF0b3I6ICh2YWx1ZUEsIHZhbHVlQiwgbm9kZUEsIG5vZGVCLCBpc0ludmVydGVkKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZW50cmllcykge1xyXG4gICAgICAgICAgY29sLnNlbGVjdE9wdGlvbnMgPSBvcHRpb25zLmVudHJpZXMuc29ydChcclxuICAgICAgICAgICAgKG9wdGlvbkEsIG9wdGlvbkIpID0+IHtcclxuICAgICAgICAgICAgICBpZiAob3B0aW9uQSAmJiAhb3B0aW9uQikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAob3B0aW9uQiAmJiAhb3B0aW9uQSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKCFvcHRpb25BICYmICFvcHRpb25CKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmIChvcHRpb25BLmRpc3BsYXkudG9Mb3dlckNhc2UoKSA+IG9wdGlvbkIuZGlzcGxheS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKChvcHRpb25CLmRpc3BsYXkudG9Mb3dlckNhc2UoKSA+IG9wdGlvbkEuZGlzcGxheS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgY29sLmNvbXBhcmF0b3IgPSAodmFsdWVBLCB2YWx1ZUIsIG5vZGVBLCBub2RlQiwgaXNJbnZlcnRlZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuZW50cmllcykge1xyXG4gICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodmFsdWVBICYmICF2YWx1ZUIpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHZhbHVlQiAmJiAhdmFsdWVBKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXZhbHVlQSAmJiAhdmFsdWVCKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBvcHRpb25BID0gb3B0aW9ucy5lbnRyaWVzLmZpbmQoKGVudHJ5KSA9PiAoXCJcIiArIGVudHJ5LmlkID09PSBcIlwiICsgdmFsdWVBKSk7XHJcbiAgICAgICAgICAgIGxldCBvcHRpb25CID0gb3B0aW9ucy5lbnRyaWVzLmZpbmQoKGVudHJ5KSA9PiAoXCJcIiArIGVudHJ5LmlkID09PSBcIlwiICsgdmFsdWVCKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9uQSAmJiAhb3B0aW9uQikge1xyXG4gICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9uQiAmJiAhb3B0aW9uQSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFvcHRpb25BICYmICFvcHRpb25CKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25BLmRpc3BsYXkudG9Mb3dlckNhc2UoKSA+IG9wdGlvbkIuZGlzcGxheS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKG9wdGlvbkIuZGlzcGxheS50b0xvd2VyQ2FzZSgpID4gb3B0aW9uQS5kaXNwbGF5LnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29sLmNlbGxTdHlsZSA9IHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICBsZXQgY29sdW1uOiBhbnkgPSB7fTtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBwYXJhbXMuY29udGV4dC5jb21wb25lbnRQYXJlbnQuZGljdGlvbmFyeS5maWVsZHMpIHtcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5jb2xEZWYuZmllbGQgPT0gZmllbGQubmFtZSkge1xyXG4gICAgICAgICAgICAgIGNvbHVtbiA9IGZpZWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHBhcmFtcy5kYXRhLmVkaXRPck5ldyAmJiBwYXJhbXMuZGF0YS5lZGl0T3JOZXcgPT0gXCJuZXdcIikge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbnRleHQucmVhZE9ubHkgfHwgY29sdW1uLnJlYWRPbmx5IHx8XHJcbiAgICAgICAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiUmVhZCBPbmx5XCIpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge2NvbG9yOiBcIiM4YTk0OTlcIn07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY29udGV4dC5yZWFkT25seSB8fCBjb2x1bW4ucmVhZE9ubHkgfHxcclxuICAgICAgICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJSZWFkIE9ubHlcIiB8fCBjb2x1bW4uY3JlYXRlT25seSB8fFxyXG4gICAgICAgICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIkNyZWF0ZSBPbmx5XCIgfHwgY29sdW1uLmNvZGUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge2NvbG9yOiBcIiM4YTk0OTlcIn07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb2wuZGlzcGxheU9yZGVyID0gZmllbGQuZGlzcGxheU9yZGVyO1xyXG4gICAgICAgIGNvbC5kaWN0aW9uYXJ5RGlzcGxheSA9IGZpZWxkLmRpY3Rpb25hcnlEaXNwbGF5O1xyXG4gICAgICAgIGNvbC5kaWN0aW9uYXJ5VG9vbHRpcCA9IGZpZWxkLmRpY3Rpb25hcnlUb29sdGlwO1xyXG5cclxuICAgICAgICAvLyBTZXQgZGVmYXVsdCBmaWx0ZXIgYXMgY29tcGFyZSBieSB0ZXh0L251bWJlclxyXG4gICAgICAgIC8vIGNvbC5maWx0ZXJSZW5kZXJlciA9IENvbXBhcmVGaWx0ZXJSZW5kZXJlcjtcclxuICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlICYmIGZpZWxkLnR5cGUgPT0gXCJEYXRlXCIpIHtcclxuICAgICAgICAvL2RhdGUgdmFsdWVcclxuICAgICAgICBjb2wgPSB7XHJcbiAgICAgICAgICBmaWVsZDogZmllbGQubmFtZSxcclxuICAgICAgICAgIGhlYWRlck5hbWU6IGZpZWxkLmRpc3BsYXlOYW1lLFxyXG4gICAgICAgICAgY2VsbFJlbmRlcmVyRnJhbWV3b3JrOiBEYXRlUmVuZGVyZXIsXHJcbiAgICAgICAgICBjZWxsRWRpdG9yRnJhbWV3b3JrOiBBZ0dyaWREYXRlQ2VsbEVkaXRvckNvbXBvbmVudCxcclxuICAgICAgICAgIGVkaXRhYmxlOiB0aGlzLmlzRWRpdGFibGUuYmluZCh0aGlzKSxcclxuICAgICAgICAgIHNvcnRhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgcmVzaXphYmxlOiB0cnVlLFxyXG4gICAgICAgICAgZmlsdGVyOiB0cnVlLFxyXG4gICAgICAgICAgZGljdGlvbmFyeURpc3BsYXk6IGZpZWxkLmRpY3Rpb25hcnlEaXNwbGF5XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29sLmNvbXBhcmF0b3IgPSAodmFsdWVBLCB2YWx1ZUIsIG5vZGVBLCBub2RlQiwgaXNJbnZlcnRlZCkgPT4ge1xyXG4gICAgICAgICAgbGV0IG51bSA9IHRoaXMuZGF0ZUNvbXBhcmF0b3IodmFsdWVBLCB2YWx1ZUIpO1xyXG4gICAgICAgICAgcmV0dXJuIGlzSW52ZXJ0ZWQgPyAtMSAqIG51bSA6IG51bTsgLy9kb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIHdpdGggaW52ZXJ0ZWQ/XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29sLmNlbGxTdHlsZSA9IHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICB2YXIgY29sdW1uOiBhbnkgPSB7fTtcclxuICAgICAgICAgIGZvciAobGV0IGZpZWxkIG9mIHBhcmFtcy5jb250ZXh0LmNvbXBvbmVudFBhcmVudC5kaWN0aW9uYXJ5LmZpZWxkcykge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbERlZi5maWVsZCA9PSBmaWVsZC5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgY29sdW1uID0gZmllbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocGFyYW1zLmRhdGEuZWRpdE9yTmV3ICYmIHBhcmFtcy5kYXRhLmVkaXRPck5ldyA9PSBcIm5ld1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY29udGV4dC5yZWFkT25seSB8fCBjb2x1bW4ucmVhZE9ubHkgfHxcclxuICAgICAgICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJSZWFkIE9ubHlcIikge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7Y29sb3I6IFwiIzhhOTQ5OVwifTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5jb250ZXh0LnJlYWRPbmx5IHx8IGNvbHVtbi5yZWFkT25seSB8fFxyXG4gICAgICAgICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIlJlYWQgT25seVwiIHx8IGNvbHVtbi5jcmVhdGVPbmx5IHx8XHJcbiAgICAgICAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiQ3JlYXRlIE9ubHlcIiB8fCBjb2x1bW4uY29kZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7Y29sb3I6IFwiIzhhOTQ5OVwifTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbC5kaXNwbGF5T3JkZXIgPSBmaWVsZC5kaXNwbGF5T3JkZXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gdGhpcyBpcyBhIHN0cmluZyB2YWx1ZVxyXG4gICAgICAgIGNvbCA9IHtcclxuICAgICAgICAgIGZpZWxkOiBmaWVsZC5uYW1lLFxyXG4gICAgICAgICAgaGVhZGVyTmFtZTogZmllbGQuZGlzcGxheU5hbWUsXHJcbiAgICAgICAgICBlZGl0YWJsZTogdGhpcy5pc0VkaXRhYmxlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIGZpbHRlcjogdHJ1ZSxcclxuICAgICAgICAgIGRpY3Rpb25hcnlEaXNwbGF5OiBmaWVsZC5kaWN0aW9uYXJ5RGlzcGxheVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbC5jb21wYXJhdG9yID0gKHZhbHVlQSwgdmFsdWVCLCBub2RlQSwgbm9kZUIsIGlzSW52ZXJ0ZWQpID0+IHtcclxuICAgICAgICAgIGlmICh2YWx1ZUEgJiYgIXZhbHVlQikge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodmFsdWVCICYmICF2YWx1ZUEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICghdmFsdWVBICYmICF2YWx1ZUIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHZhbHVlQS50b0xvd2VyQ2FzZSgpID4gdmFsdWVCLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKCh2YWx1ZUIudG9Mb3dlckNhc2UoKSA+IHZhbHVlQS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb2wuY2VsbFN0eWxlID0gcGFyYW1zID0+IHtcclxuICAgICAgICAgIHZhciBjb2x1bW46IGFueSA9IHt9O1xyXG4gICAgICAgICAgZm9yIChsZXQgZmllbGQgb2YgcGFyYW1zLmNvbnRleHQuY29tcG9uZW50UGFyZW50LmRpY3Rpb25hcnkuZmllbGRzKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY29sRGVmLmZpZWxkID09IGZpZWxkLm5hbWUpIHtcclxuICAgICAgICAgICAgICBjb2x1bW4gPSBmaWVsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHBhcmFtcy5kYXRhLmVkaXRPck5ldyAmJiBwYXJhbXMuZGF0YS5lZGl0T3JOZXcgPT0gXCJuZXdcIikge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbnRleHQucmVhZE9ubHkgfHwgY29sdW1uLnJlYWRPbmx5IHx8XHJcbiAgICAgICAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiUmVhZCBPbmx5XCIpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge2NvbG9yOiBcIiM4YTk0OTlcIn07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY29udGV4dC5yZWFkT25seSB8fCBjb2x1bW4ucmVhZE9ubHkgfHxcclxuICAgICAgICAgICAgICBjb2x1bW4ucHJvdGVjdGlvblR5cGUgPT0gXCJSZWFkIE9ubHlcIiB8fCBjb2x1bW4uY3JlYXRlT25seSB8fFxyXG4gICAgICAgICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIkNyZWF0ZSBPbmx5XCIgfHwgY29sdW1uLmNvZGUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge2NvbG9yOiBcIiM4YTk0OTlcIn07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb2wuZGlzcGxheU9yZGVyID0gZmllbGQuZGlzcGxheU9yZGVyO1xyXG4gICAgICAgIC8vIFNldCBkZWZhdWx0IGZpbHRlciBhcyBjb21wYXJlIGJ5IHRleHQvbnVtYmVyXHJcbiAgICAgICAgLy8gY29sLmZpbHRlclJlbmRlcmVyID0gQ29tcGFyZUZpbHRlclJlbmRlcmVyO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb2xzLnB1c2goY29sKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBOb3cgd2UgbmVlZCB0byBzb3J0IHRoZSBjb2x1bW5zXHJcbiAgICBpZiAoIXRoaXMuZGljdGlvbmFyeS5maWVsZHNbMF0uaGFzT3duUHJvcGVydHkoXCJkaXNwbGF5T3JkZXJcIikpIHtcclxuICAgICAgLy8gZGVmYXVsdCBjYXNlLCBubyBkaXNwbGF5T3JkZXJcclxuICAgICAgY29scyA9IGNvbHMuc29ydChcclxuICAgICAgICAoYSwgYikgPT4ge1xyXG4gICAgICAgICAgaWYgKCFhLmhlYWRlck5hbWUgJiYgYi5oZWFkZXJOYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICghYi5oZWFkZXJOYW1lICYmIGEuaGVhZGVyTmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGEuZGljdGlvbmFyeURpc3BsYXkgPT09IHRydWUgJiYgYi5kaWN0aW9uYXJ5RGlzcGxheSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChiLmRpY3Rpb25hcnlEaXNwbGF5ID09PSB0cnVlICYmIGEuZGljdGlvbmFyeURpc3BsYXkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhLmRpY3Rpb25hcnlUb29sdGlwID09PSB0cnVlICYmIGIuZGljdGlvbmFyeVRvb2x0aXAgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYi5kaWN0aW9uYXJ5VG9vbHRpcCA9PT0gdHJ1ZSAmJiBhLmRpY3Rpb25hcnlUb29sdGlwID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBEaXNwbGF5T3JkZXIgY2FzZVxyXG4gICAgICAvLyBJIHRoaW5rIHRoaXMgd29ya3M/IENoZWNrIGxhdGVyXHJcbiAgICAgIGNvbHMgPSBjb2xzLnNvcnQoXHJcbiAgICAgICAgKGEsIGIpID0+IHtcclxuICAgICAgICAgIGlmICghYS5oZWFkZXJOYW1lICYmIGIuaGVhZGVyTmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoIWIuaGVhZGVyTmFtZSAmJiBhLmhlYWRlck5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGEuZGlzcGxheU9yZGVyIC0gYi5kaXNwbGF5T3JkZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFmdGVyIENvbHVtbnMgSGF2ZSBCZWVuIFNvcnRlZFxyXG4gICAgLy8gRGljdGlvbmFyeSBHcmlkIFdpbGwgU29ydCBUaGUgR3JpZCBBc2NlbmRpbmcgT3JkZXIgQnkgRmlyc3QgQ29sdW1uXHJcbiAgICBpZihjb2xzICAmJiBjb2xzLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgIGNvbHNbMF0uc29ydCA9IFwiYXNjXCI7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRhQ29sdW1ucyA9IGNvbHM7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFDb2x1bW5zKSAmJiB0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXBpKSB7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnNldENvbHVtbkRlZnModGhpcy5kYXRhQ29sdW1ucyk7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzRWRpdGFibGUocGFyYW1zKTogYm9vbGVhbiB7XHJcblxyXG4gICAgbGV0IGlzRWRpdGFibGU6IGJvb2xlYW47XHJcblxyXG4gICAgbGV0IGNvbHVtbjogYW55ID0ge307XHJcbiAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmRpY3Rpb25hcnkuZmllbGRzKSB7XHJcbiAgICAgIGlmIChwYXJhbXMuY29sRGVmLmZpZWxkID09IGZpZWxkLm5hbWUpIHtcclxuICAgICAgICBjb2x1bW4gPSBmaWVsZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChwYXJhbXMuZGF0YS5lZGl0T3JOZXcgJiYgcGFyYW1zLmRhdGEuZWRpdE9yTmV3ID09IFwibmV3XCIpIHtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCJuZXcgZWRpdGFibGU/XCIpO1xyXG4gICAgICBpc0VkaXRhYmxlID0gISh0aGlzLmRpY3Rpb25hcnkucmVhZE9ubHkgfHwgY29sdW1uLnJlYWRPbmx5IHx8XHJcbiAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiUmVhZCBPbmx5XCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCJlZGl0IGVkaXRhYmxlP1wiKTtcclxuICAgICAgaXNFZGl0YWJsZSA9ICEodGhpcy5kaWN0aW9uYXJ5LnJlYWRPbmx5IHx8IGNvbHVtbi5yZWFkT25seSB8fFxyXG4gICAgICAgIGNvbHVtbi5wcm90ZWN0aW9uVHlwZSA9PSBcIlJlYWQgT25seVwiIHx8IGNvbHVtbi5jcmVhdGVPbmx5IHx8XHJcbiAgICAgICAgY29sdW1uLnByb3RlY3Rpb25UeXBlID09IFwiQ3JlYXRlIE9ubHlcIiB8fCBjb2x1bW4uY29kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzRWRpdGFibGU7XHJcbiAgfVxyXG5cclxuICBkZWxldGVEaWN0aW9uYXJ5RW50cmllcygpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgZGVsZXRlUm93czogYW55W10gPSB0aGlzLmdyaWRPcHRpb25zLmFwaS5nZXRTZWxlY3RlZFJvd3MoKTtcclxuXHJcbiAgICBmb3IgKGxldCBkZWxldGVJZCBvZiB0aGlzLnNlbGVjdGVkUm93cykge1xyXG4gICAgICBmb3IgKGxldCBlbnRyeSBvZiB0aGlzLmRpY3Rpb25hcnlFbnRyaWVzKSB7XHJcbiAgICAgICAgaWYgKGVudHJ5W3RoaXMuaWRDb2x1bW5dID09PSBkZWxldGVJZCkge1xyXG4gICAgICAgICAgZGVsZXRlUm93cy5wdXNoKGVudHJ5KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZGVsZXRlRGljdGlvbmFyeUVudHJpZXModGhpcy5jbGFzc05hbWUsIGRlbGV0ZVJvd3MpLnN1YnNjcmliZShcclxuICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmdldERpY3Rpb25hcnlFbnRyaWVzKCk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVEaWN0aW9uYXJ5KGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBJbXBvcnRhbnQgdG8gbm90ZSB0aGlzIHdpbGwgbm90IHVwZGF0ZSBjZWxscyB0byB0aGUgZGVtbyBidXQgd2lsbCB3aGVuIGltcG9ydGVkIHRvIENPUkUgb3Igb3RoZXIgYXBwbGljYXRpb25zLlxyXG4gICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS51cGRhdGVEaWN0aW9uYXJ5RW50cmllcyh0aGlzLmNsYXNzTmFtZSwgW2V2ZW50LmRhdGFdKS5zdWJzY3JpYmUoXHJcbiAgICAgIChkYXRhOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2V0RGljdGlvbmFyeUVudHJpZXMoKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHNldFNlbGVjdGVkRW50cmllcygpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmdldFNlbGVjdGVkUm93cygpO1xyXG4gIH1cclxuXHJcbiAgbmV3Um93UG9zdChkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmFkZERpY3Rpb25hcnlFbnRyaWVzKHRoaXMuY2xhc3NOYW1lLCBbZGF0YV0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcChcclxuICAgICAgICAgIChkYXRhOiBPYmplY3RbXSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiA8YW55PmRhdGFbMF07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIG9uU2FtcGxlc0dyaWRSZWFkeShldmVudDogR3JpZFJlYWR5RXZlbnQpOiB2b2lkIHtcclxuXHJcbiAgICBldmVudC5hcGkuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBvbkdyaWRTaXplQ2hhbmdlZChldmVudDogYW55KSB7XHJcblxyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LmFwaSkge1xyXG4gICAgICBldmVudC5hcGkuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkaXNhYmxlQWRkUm93KCk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICghdGhpcy5kaWN0aW9uYXJ5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnkucmVhZE9ubHkgJiYgdGhpcy5kaWN0aW9uYXJ5LnJlYWRPbmx5ID09PSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkaXNhYmxlRGVsZXRlKCk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICghdGhpcy5kaWN0aW9uYXJ5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRpY3Rpb25hcnkucmVhZE9ubHkgJiYgdGhpcy5kaWN0aW9uYXJ5LnJlYWRPbmx5ID09PSB0cnVlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXBpICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmdldFNlbGVjdGVkUm93cygpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmFwaS5nZXRTZWxlY3RlZFJvd3MoKS5sZW5ndGggPT09IDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tYm9GaWx0ZXJWYWx1ZUdldHRlcihwYXJhbXMpOiBhbnkge1xyXG5cclxuICAgIGxldCB2YWx1ZSA9IHBhcmFtcy5kYXRhW3BhcmFtcy5jb2xEZWYuZmllbGRdO1xyXG5cclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBsZXQgb3B0aW9uID0gKChwYXJhbXMuY29sRGVmIGFzIGFueSkuc2VsZWN0T3B0aW9ucyBhcyBhbnlbXSkuZmluZCgoZW50cnkpID0+IChlbnRyeVtwYXJhbXMuY29sRGVmLnNlbGVjdE9wdGlvbnNWYWx1ZUZpZWxkXSA9PT0gdmFsdWUpKTtcclxuICAgICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvbltwYXJhbXMuY29sRGVmLnNlbGVjdE9wdGlvbnNEaXNwbGF5RmllbGRdIDogXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gXCJcIjtcclxuICB9XHJcblxyXG4gIG9uQ2xpY2tBZGRSb3coKSB7XHJcblxyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKE5ld1Jvd0NvbXBvbmVudCxcclxuICAgICAge1xyXG4gICAgICAgIHNpemU6IFwibGdcIixcclxuICAgICAgICBrZXlib2FyZDogZmFsc2UsXHJcbiAgICAgICAgYmFja2Ryb3A6IFwic3RhdGljXCIsXHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY29sRGVmcyA9IHRoaXMuZGF0YUNvbHVtbnM7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kaWN0aW9uYXJ5ID0gdGhpcy5kaWN0aW9uYXJ5O1xyXG5cclxuICAgIGlmICghdGhpcy5uZXdSb3dTdWJzY3JpcHRpb24pIHtcclxuICAgICAgLy8gdGVsbCBvdGhlciBhZy1ncmlkIHRvIGFkZCByb3cgdG8gaXRcclxuICAgICAgdGhpcy5uZXdSb3dTdWJzY3JpcHRpb24gPSBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5uZXdSb3dTdWJqZWN0LnN1YnNjcmliZShcclxuICAgICAgICAodGhlTmV3Um93OiBhbnlbXSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5RW50cmllcyA9IHRoZU5ld1Jvdy5jb25jYXQodGhpcy5kaWN0aW9uYXJ5RW50cmllcyk7XHJcbiAgICAgICAgICB0aGlzLmdyaWRPcHRpb25zLmFwaS5zZXRSb3dEYXRhKHRoaXMuZGljdGlvbmFyeUVudHJpZXMpO1xyXG4gICAgICAgICAgdGhpcy5uZXdSb3dTdWJzY3JpcHRpb24gPSBudWxsO1xyXG5cclxuICAgICAgICAgIC8vIEltcG9ydGFudCB0byBub3RlIHRoaXMgd2lsbCBub3QgYWRkIHJvd3MgdG8gdGhlIGRlbW8gYnV0IHdpbGwgd2hlbiBpbXBvcnRlZCB0byBDT1JFIG9yIG90aGVyIGFwcGxpY2F0aW9ucy5cclxuICAgICAgICAgIHRoaXMubmV3Um93UG9zdCh0aGVOZXdSb3dbMF0pLnN1YnNjcmliZShcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0RGljdGlvbmFyeUVudHJpZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wYXJhdGVyIFRvIENvbXBhcmUgMiBEYXRlc1xyXG4gICAqIEBwYXJhbSBkYXRlMSBEYXRlIDFcclxuICAgKiBAcGFyYW0gZGF0ZTIgRGF0ZSAyXHJcbiAgICovXHJcbiAgZGF0ZUNvbXBhcmF0b3IoZGF0ZTEsIGRhdGUyKSB7XHJcblxyXG4gICAgbGV0IGRhdGUxTnVtYmVyID0gbW9udGhUb0NvbXBhcmFibGVOdW1iZXIoZGF0ZTEpO1xyXG4gICAgbGV0IGRhdGUyTnVtYmVyID0gbW9udGhUb0NvbXBhcmFibGVOdW1iZXIoZGF0ZTIpO1xyXG5cclxuICAgIGlmIChkYXRlMU51bWJlciA9PT0gbnVsbCAmJiBkYXRlMk51bWJlciA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0ZTFOdW1iZXIgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRlMk51bWJlciA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGF0ZTFOdW1iZXIgLSBkYXRlMk51bWJlcjtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeHRyYWN0cyBEYXRlIEFuZCBUdXJuIFRvIEEgTnVtZXJpY2FsIFZhbHVlIEZvciBDb21wYXJpbmcgUHVycG9zZXNcclxuICogQHBhcmFtIGRhdGUgVGhlIGRhdGUgdG8gY29tcGFyYWJsZSBudW1iZXJcclxuICovXHJcbmZ1bmN0aW9uIG1vbnRoVG9Db21wYXJhYmxlTnVtYmVyKGRhdGUpIHtcclxuXHJcbiAgaWYgKGRhdGUgPT09IHVuZGVmaW5lZCB8fCBkYXRlID09PSBudWxsIHx8IGRhdGUubGVuZ3RoICE9PSAxMCkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBsZXQgeWVhck51bWJlciA9IGRhdGUuc3Vic3RyaW5nKDAsIDQpO1xyXG4gIGxldCBtb250aE51bWJlciA9IGRhdGUuc3Vic3RyaW5nKDUsIDcpO1xyXG4gIGxldCBkYXlOdW1iZXIgPSBkYXRlLnN1YnN0cmluZyg4LCAxMCk7XHJcblxyXG4gIHJldHVybiB5ZWFyTnVtYmVyICogMTAwMDAgKyBtb250aE51bWJlciAqIDEwMCArIGRheU51bWJlcjtcclxufVxyXG4iXX0=