bways-report 0.1.2 → 0.1.3

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 (100) hide show
  1. package/README.md +150 -51
  2. package/esm2022/lib/core/errors/reporting-errors.mjs +2 -2
  3. package/esm2022/lib/core/index.mjs +3 -1
  4. package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
  5. package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
  6. package/esm2022/lib/core/models/report-grid.model.mjs +1 -1
  7. package/esm2022/lib/core/services/report-session-context.service.mjs +50 -5
  8. package/esm2022/lib/core/utils/data-normalization.util.mjs +56 -0
  9. package/esm2022/lib/core/utils/report-parameter.util.mjs +180 -0
  10. package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +82 -0
  11. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +34 -9
  12. package/esm2022/lib/data-access/adapters/http-masterdata.adapter.mjs +38 -0
  13. package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +217 -0
  14. package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +3 -1
  15. package/esm2022/lib/data-access/adapters/index.mjs +8 -3
  16. package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +167 -0
  17. package/esm2022/lib/data-access/adapters/mock-datasource.adapter.mjs +60 -0
  18. package/esm2022/lib/data-access/contracts/api-dtos.mjs +6 -0
  19. package/esm2022/lib/data-access/contracts/index.mjs +2 -1
  20. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +555 -92
  21. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +593 -0
  22. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +164 -23
  23. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +410 -12
  24. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +149 -2
  25. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +109 -6
  26. package/esm2022/lib/features/designer/designer.component.mjs +101 -12
  27. package/esm2022/lib/features/designer/index.mjs +4 -1
  28. package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +102 -0
  29. package/esm2022/lib/features/designer/services/designer-state.service.mjs +10 -9
  30. package/esm2022/lib/features/designer/services/report-template.service.mjs +318 -0
  31. package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +41 -9
  32. package/esm2022/lib/features/export/index.mjs +2 -2
  33. package/esm2022/lib/features/export/models/export.models.mjs +1 -1
  34. package/esm2022/lib/features/export/services/report-export.service.mjs +420 -5
  35. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +2 -2
  36. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +231 -33
  37. package/esm2022/lib/features/runtime/index.mjs +2 -1
  38. package/esm2022/lib/features/runtime/report-execution.service.mjs +64 -0
  39. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +224 -26
  40. package/esm2022/lib/features/runtime/report-runtime.component.mjs +341 -7
  41. package/esm2022/lib/features/runtime/rpt-report.component.mjs +537 -0
  42. package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +19 -8
  43. package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +18 -7
  44. package/esm2022/lib/primitives/components/date-range/rpt-date-range.component.mjs +346 -0
  45. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +727 -73
  46. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
  47. package/esm2022/lib/primitives/components/index.mjs +2 -1
  48. package/esm2022/lib/primitives/register-builtins.mjs +51 -2
  49. package/esm2022/lib/provide-reporting.mjs +145 -24
  50. package/fesm2022/bways-report.mjs +6871 -753
  51. package/fesm2022/bways-report.mjs.map +1 -1
  52. package/lib/core/index.d.ts +2 -0
  53. package/lib/core/models/report-datasource.model.d.ts +9 -0
  54. package/lib/core/models/report-definition.model.d.ts +2 -0
  55. package/lib/core/models/report-grid.model.d.ts +44 -0
  56. package/lib/core/services/report-session-context.service.d.ts +6 -1
  57. package/lib/core/utils/data-normalization.util.d.ts +15 -0
  58. package/lib/core/utils/report-parameter.util.d.ts +35 -0
  59. package/lib/data-access/adapters/http-datasource.adapter.d.ts +20 -0
  60. package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -0
  61. package/lib/data-access/adapters/http-masterdata.adapter.d.ts +13 -0
  62. package/lib/data-access/adapters/http-persistence.adapter.d.ts +27 -0
  63. package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +2 -0
  64. package/lib/data-access/adapters/index.d.ts +7 -2
  65. package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +19 -0
  66. package/lib/data-access/adapters/mock-datasource.adapter.d.ts +9 -0
  67. package/lib/data-access/contracts/api-dtos.d.ts +67 -0
  68. package/lib/data-access/contracts/index.d.ts +1 -0
  69. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +22 -0
  70. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -1
  71. package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +33 -0
  72. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +4 -0
  73. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +16 -2
  74. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +5 -0
  75. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +7 -0
  76. package/lib/features/designer/designer.component.d.ts +5 -0
  77. package/lib/features/designer/index.d.ts +4 -0
  78. package/lib/features/designer/rpt-report-designer.component.d.ts +38 -0
  79. package/lib/features/designer/services/designer-state.service.d.ts +1 -1
  80. package/lib/features/designer/services/report-template.service.d.ts +32 -0
  81. package/lib/features/designer/utilities/canvas-layout.util.d.ts +4 -0
  82. package/lib/features/export/index.d.ts +2 -2
  83. package/lib/features/export/models/export.models.d.ts +23 -0
  84. package/lib/features/export/services/report-export.service.d.ts +31 -2
  85. package/lib/features/runtime/dynamic-renderer.component.d.ts +39 -2
  86. package/lib/features/runtime/index.d.ts +2 -0
  87. package/lib/features/runtime/report-execution.service.d.ts +16 -0
  88. package/lib/features/runtime/report-grid-bridge.component.d.ts +129 -6
  89. package/lib/features/runtime/report-runtime.component.d.ts +83 -1
  90. package/lib/features/runtime/rpt-report.component.d.ts +66 -0
  91. package/lib/primitives/components/button/rpt-button.component.d.ts +5 -2
  92. package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +1 -0
  93. package/lib/primitives/components/date-range/rpt-date-range.component.d.ts +43 -0
  94. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +55 -7
  95. package/lib/primitives/components/index.d.ts +2 -0
  96. package/lib/provide-reporting.d.ts +79 -26
  97. package/package.json +2 -1
  98. package/schematics/collection.json +10 -0
  99. package/schematics/ng-add/index.js +45 -0
  100. package/schematics/ng-add/schema.json +17 -0
@@ -0,0 +1,537 @@
1
+ import { ChangeDetectionStrategy, Component, computed, inject, input, output, signal, viewChild, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { ReportExportService } from '../export/services/report-export.service';
5
+ import { ReportRuntimeComponent } from './report-runtime.component';
6
+ import { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';
7
+ import { ReportPersistenceAdapter } from '../../data-access/contracts/report-persistence.contract';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/forms";
10
+ export class RptReportComponent {
11
+ exportService = inject(ReportExportService);
12
+ persistence = inject(ReportPersistenceAdapter, { optional: true });
13
+ id = input(undefined);
14
+ report = input(null);
15
+ parameters = input({});
16
+ showExport = input(true);
17
+ enablePresets = input(true);
18
+ autoExecute = input(true);
19
+ rowClick = output();
20
+ dataLoaded = output();
21
+ gridStateChange = output();
22
+ presetSaved = output();
23
+ presetChange = output();
24
+ exportRequested = output();
25
+ printRequested = output();
26
+ runtimeComponent = viewChild(ReportRuntimeComponent);
27
+ // Preset states
28
+ activePresetId = signal('default');
29
+ isSavePresetModalOpen = signal(false);
30
+ newPresetName = signal('');
31
+ latestGridState = signal(null);
32
+ customPresets = signal([]);
33
+ currentDefinition = computed(() => {
34
+ return this.report();
35
+ });
36
+ activeDefinition = computed(() => {
37
+ return this.report() ?? this.runtimeComponent()?.currentDefinition() ?? null;
38
+ });
39
+ recordCount = computed(() => {
40
+ return this.runtimeComponent()?.resultData()?.length ?? 0;
41
+ });
42
+ showToolbar = computed(() => {
43
+ return this.showExport() || this.enablePresets();
44
+ });
45
+ savedPresets = computed(() => {
46
+ const def = this.activeDefinition();
47
+ const initialPresets = def?.grid?.options?.presets ?? [];
48
+ const map = new Map();
49
+ for (const p of initialPresets) {
50
+ if (p && p.id)
51
+ map.set(p.id, p);
52
+ }
53
+ for (const p of this.customPresets()) {
54
+ if (p && p.id)
55
+ map.set(p.id, p);
56
+ }
57
+ return Array.from(map.values());
58
+ });
59
+ onRowActionTriggered(event) {
60
+ this.rowClick.emit({
61
+ row: event.row,
62
+ parameters: event.parameters,
63
+ action: event.action,
64
+ });
65
+ }
66
+ onGridStateChanged(state) {
67
+ this.latestGridState.set(state);
68
+ this.gridStateChange.emit(state);
69
+ }
70
+ onSelectPreset(presetId) {
71
+ this.activePresetId.set(presetId);
72
+ if (presetId === 'default') {
73
+ this.presetChange.emit(null);
74
+ return;
75
+ }
76
+ const preset = this.savedPresets().find((p) => p.id === presetId);
77
+ if (preset) {
78
+ if (preset.gridState) {
79
+ this.latestGridState.set(preset.gridState);
80
+ this.gridStateChange.emit(preset.gridState);
81
+ }
82
+ this.presetChange.emit(preset);
83
+ }
84
+ }
85
+ confirmSavePreset() {
86
+ this.saveCurrentPreset();
87
+ }
88
+ exportExcel() {
89
+ this.onExportExcel();
90
+ }
91
+ exportCsv() {
92
+ this.onExportCsv();
93
+ }
94
+ print() {
95
+ this.onPrintReport();
96
+ }
97
+ openSavePresetModal() {
98
+ this.newPresetName.set('');
99
+ this.isSavePresetModalOpen.set(true);
100
+ }
101
+ closeSavePresetModal() {
102
+ this.isSavePresetModalOpen.set(false);
103
+ }
104
+ saveCurrentPreset() {
105
+ const name = this.newPresetName().trim();
106
+ if (!name)
107
+ return;
108
+ const presetId = `preset_${Date.now()}`;
109
+ const newPreset = {
110
+ id: presetId,
111
+ name,
112
+ gridState: this.latestGridState() ?? {},
113
+ createdAt: new Date().toISOString(),
114
+ };
115
+ const def = this.activeDefinition();
116
+ if (def && def.grid) {
117
+ if (!def.grid.options)
118
+ def.grid.options = {};
119
+ const currentPresets = def.grid.options.presets ?? [];
120
+ def.grid.options.presets = [...currentPresets, newPreset];
121
+ if (this.persistence && def.id) {
122
+ this.persistence.save(def).subscribe({
123
+ next: () => { },
124
+ error: () => { },
125
+ });
126
+ }
127
+ }
128
+ this.customPresets.update((prev) => [...prev, newPreset]);
129
+ this.activePresetId.set(presetId);
130
+ this.presetSaved.emit({ name, preset: newPreset });
131
+ this.closeSavePresetModal();
132
+ }
133
+ deletePreset(presetId) {
134
+ if (presetId === 'default')
135
+ return;
136
+ this.customPresets.update((prev) => prev.filter((p) => p.id !== presetId));
137
+ const def = this.activeDefinition();
138
+ if (def && def.grid && def.grid.options) {
139
+ const current = def.grid.options.presets ?? [];
140
+ def.grid.options.presets = current.filter((p) => p.id !== presetId);
141
+ if (this.persistence && def.id) {
142
+ this.persistence.save(def).subscribe({
143
+ next: () => { },
144
+ error: () => { },
145
+ });
146
+ }
147
+ }
148
+ if (this.activePresetId() === presetId) {
149
+ this.onSelectPreset('default');
150
+ }
151
+ }
152
+ onExportExcel() {
153
+ const data = this.runtimeComponent()?.resultData();
154
+ if (!data || !Array.isArray(data) || data.length === 0)
155
+ return;
156
+ const def = this.activeDefinition();
157
+ const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));
158
+ this.exportService.exportExcel(data, {
159
+ fileName: def?.name ? `${def.name}.xls` : 'report.xls',
160
+ columns: cols,
161
+ brandedHeader: { reportTitle: def?.name },
162
+ });
163
+ }
164
+ onExportCsv() {
165
+ const data = this.runtimeComponent()?.resultData();
166
+ if (!data || !Array.isArray(data) || data.length === 0)
167
+ return;
168
+ const def = this.activeDefinition();
169
+ const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));
170
+ this.exportService.exportCsv(data, {
171
+ fileName: def?.name ? `${def.name}.csv` : 'report.csv',
172
+ columns: cols,
173
+ brandedHeader: { reportTitle: def?.name },
174
+ });
175
+ }
176
+ onPrintReport() {
177
+ const data = this.runtimeComponent()?.resultData();
178
+ if (!data || !Array.isArray(data) || data.length === 0)
179
+ return;
180
+ const def = this.activeDefinition();
181
+ const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));
182
+ this.exportService.printReport(data, {
183
+ title: def?.name || 'Report Print Preview',
184
+ columns: cols,
185
+ brandedHeader: { reportTitle: def?.name },
186
+ });
187
+ }
188
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptReportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
189
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RptReportComponent, isStandalone: true, selector: "rpt-report, rpt-view", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, report: { classPropertyName: "report", publicName: "report", isSignal: true, isRequired: false, transformFunction: null }, parameters: { classPropertyName: "parameters", publicName: "parameters", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null }, enablePresets: { classPropertyName: "enablePresets", publicName: "enablePresets", isSignal: true, isRequired: false, transformFunction: null }, autoExecute: { classPropertyName: "autoExecute", publicName: "autoExecute", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowClick: "rowClick", dataLoaded: "dataLoaded", gridStateChange: "gridStateChange", presetSaved: "presetSaved", presetChange: "presetChange", exportRequested: "exportRequested", printRequested: "printRequested" }, viewQueries: [{ propertyName: "runtimeComponent", first: true, predicate: ReportRuntimeComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
190
+ <div class="rpt-facade-container">
191
+ <!-- Top Action & Preset Bar -->
192
+ @if (showToolbar()) {
193
+ <div class="rpt-facade-toolbar">
194
+ <div class="rpt-toolbar-left">
195
+ @if (activeDefinition()?.name) {
196
+ <div class="rpt-report-title-badge">
197
+ <span class="rpt-title-dot"></span>
198
+ <span class="rpt-title-text">{{ activeDefinition()?.name }}</span>
199
+ </div>
200
+ }
201
+
202
+ @if (recordCount() > 0) {
203
+ <span class="rpt-record-count-chip" title="Current dataset size">
204
+ <span class="rpt-chip-dot"></span>
205
+ <span class="rpt-tabular-nums">{{ recordCount() }} rows</span>
206
+ </span>
207
+ }
208
+
209
+ <!-- Saved Views / Preset Switcher -->
210
+ @if (enablePresets()) {
211
+ <div class="rpt-preset-control">
212
+ <label class="rpt-preset-label">
213
+ <rpt-icon name="bookmark" [size]="12" />
214
+ <span>View:</span>
215
+ </label>
216
+ <select
217
+ class="rpt-preset-select"
218
+ [ngModel]="activePresetId()"
219
+ (ngModelChange)="onSelectPreset($event)"
220
+ aria-label="Select report view preset"
221
+ >
222
+ <option value="default">Default View</option>
223
+ @for (preset of savedPresets(); track preset.id) {
224
+ <option [value]="preset.id">{{ preset.name }}</option>
225
+ }
226
+ </select>
227
+ <button
228
+ type="button"
229
+ class="rpt-btn-save-view"
230
+ (click)="openSavePresetModal()"
231
+ title="Save current grid view or manage presets"
232
+ >
233
+ <rpt-icon name="plus" [size]="11" />
234
+ <span>Save View</span>
235
+ </button>
236
+ </div>
237
+ }
238
+ </div>
239
+
240
+ <!-- Export Actions -->
241
+ @if (showExport()) {
242
+ <div class="rpt-toolbar-right">
243
+ <button
244
+ type="button"
245
+ class="rpt-export-btn rpt-export-excel"
246
+ (click)="onExportExcel()"
247
+ [disabled]="!recordCount()"
248
+ title="Export result table to Excel spreadsheet (.xls)"
249
+ >
250
+ <rpt-icon name="file-text" [size]="13" />
251
+ <span>Excel</span>
252
+ </button>
253
+ <button
254
+ type="button"
255
+ class="rpt-export-btn rpt-export-csv"
256
+ (click)="onExportCsv()"
257
+ [disabled]="!recordCount()"
258
+ title="Export result table to CSV file"
259
+ >
260
+ <rpt-icon name="download" [size]="13" />
261
+ <span>CSV</span>
262
+ </button>
263
+ <button
264
+ type="button"
265
+ class="rpt-export-btn rpt-export-print"
266
+ (click)="onPrintReport()"
267
+ [disabled]="!recordCount()"
268
+ title="Print report with branded layout"
269
+ >
270
+ <rpt-icon name="printer" [size]="13" />
271
+ <span>Print</span>
272
+ </button>
273
+ </div>
274
+ }
275
+ </div>
276
+ }
277
+
278
+ <!-- Core Runtime Engine -->
279
+ <rpt-report-runtime
280
+ #runtimeRef
281
+ [reportId]="id()"
282
+ [report]="currentDefinition()"
283
+ (rowActionTriggered)="onRowActionTriggered($event)"
284
+ (gridStateChange)="onGridStateChanged($event)"
285
+ (exportRequested)="exportRequested.emit($event)"
286
+ (printRequested)="printRequested.emit($event)"
287
+ />
288
+
289
+ <!-- Save View Preset Modal -->
290
+ @if (isSavePresetModalOpen()) {
291
+ <div class="rpt-modal-backdrop" (click)="closeSavePresetModal()" aria-hidden="true"></div>
292
+ <div class="rpt-modal-dialog" role="dialog" aria-modal="true" aria-label="Save View Preset">
293
+ <div class="rpt-modal-header">
294
+ <div class="rpt-modal-header-title">
295
+ <rpt-icon name="bookmark" [size]="16" />
296
+ <h4 class="rpt-modal-title">Custom View Presets</h4>
297
+ </div>
298
+ <button type="button" class="rpt-modal-close" (click)="closeSavePresetModal()" aria-label="Close modal">✕</button>
299
+ </div>
300
+ <div class="rpt-modal-body">
301
+ <p class="rpt-modal-hint">
302
+ Save your active column ordering, widths, sortings, and filters into a reusable view preset.
303
+ </p>
304
+
305
+ <div class="rpt-input-group">
306
+ <label class="rpt-field-label">New View Name</label>
307
+ <input
308
+ type="text"
309
+ class="rpt-modal-input"
310
+ placeholder="e.g. High Value Transactions - Q3"
311
+ [ngModel]="newPresetName()"
312
+ (ngModelChange)="newPresetName.set($event)"
313
+ (keydown.enter)="saveCurrentPreset()"
314
+ autofocus
315
+ />
316
+ </div>
317
+
318
+ <!-- Existing Presets Management List -->
319
+ @if (savedPresets().length > 0) {
320
+ <div class="rpt-existing-presets">
321
+ <span class="rpt-existing-label">Saved Views in this report:</span>
322
+ <div class="rpt-presets-list">
323
+ @for (preset of savedPresets(); track preset.id) {
324
+ <div class="rpt-preset-row">
325
+ <div class="rpt-preset-info">
326
+ <span class="rpt-preset-row-name">{{ preset.name }}</span>
327
+ @if (preset.id === activePresetId()) {
328
+ <span class="rpt-preset-active-tag">Active</span>
329
+ }
330
+ </div>
331
+ <button
332
+ type="button"
333
+ class="rpt-btn-del-preset"
334
+ (click)="deletePreset(preset.id)"
335
+ title="Delete view preset"
336
+ aria-label="Delete view preset"
337
+ >
338
+ <rpt-icon name="trash" [size]="12" />
339
+ </button>
340
+ </div>
341
+ }
342
+ </div>
343
+ </div>
344
+ }
345
+ </div>
346
+ <div class="rpt-modal-footer">
347
+ <button type="button" class="rpt-btn-cancel" (click)="closeSavePresetModal()">Cancel</button>
348
+ <button
349
+ type="button"
350
+ class="rpt-btn-confirm"
351
+ [disabled]="!newPresetName().trim()"
352
+ (click)="saveCurrentPreset()"
353
+ >
354
+ Save View
355
+ </button>
356
+ </div>
357
+ </div>
358
+ }
359
+ </div>
360
+ `, isInline: true, styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-facade-container{width:100%;position:relative}.rpt-facade-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 16px;background:#fff;border:1px solid var(--rpt-color-border-subtle, #e2e8f0);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04));margin-bottom:14px;flex-wrap:wrap}.rpt-toolbar-left,.rpt-toolbar-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rpt-report-title-badge{display:inline-flex;align-items:center;gap:6px;font-size:.875rem;font-weight:700;color:#0f172a;padding-right:4px}.rpt-title-dot{width:8px;height:8px;border-radius:50%;background:var(--rpt-color-primary, #2563eb)}.rpt-record-count-chip{display:inline-flex;align-items:center;gap:5px;background:#f1f5f9;color:#475569;font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-full, 9999px);border:1px solid #e2e8f0}.rpt-chip-dot{width:6px;height:6px;border-radius:50%;background:#10b981}.rpt-preset-control{display:flex;align-items:center;gap:6px;background:#f8fafc;padding:3px 6px;border-radius:var(--rpt-border-radius, 6px);border:1px solid #e2e8f0}.rpt-preset-label{display:inline-flex;align-items:center;gap:4px;font-size:.725rem;font-weight:600;color:#64748b}.rpt-preset-select{border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-sm, 4px);padding:3px 8px;font-size:.75rem;font-weight:500;color:#0f172a;background:#fff;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease}.rpt-preset-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-btn-save-view{display:inline-flex;align-items:center;gap:4px;background:var(--rpt-color-primary-light, #eff6ff);border:1px solid #bfdbfe;color:var(--rpt-color-primary, #2563eb);font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-sm, 4px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-btn-save-view:hover{background:#dbeafe;border-color:#93c5fd}.rpt-export-btn{display:inline-flex;align-items:center;gap:5px;border-radius:var(--rpt-border-radius, 6px);padding:5px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-export-btn:disabled{opacity:.45;cursor:not-allowed}.rpt-export-excel{background:#f0fdf4;border:1px solid #bbf7d0;color:#15803d}.rpt-export-excel:hover:not(:disabled){background:#dcfce7;border-color:#86efac}.rpt-export-csv{background:#f8fafc;border:1px solid #cbd5e1;color:#334155}.rpt-export-csv:hover:not(:disabled){background:#f1f5f9;border-color:#94a3b8;color:#0f172a}.rpt-export-print{background:#eef2ff;border:1px solid #c7d2fe;color:#4338ca}.rpt-export-print:hover:not(:disabled){background:#e0e7ff;border-color:#a5b4fc}.rpt-modal-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(6px);z-index:1100}.rpt-modal-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(460px,92vw);background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:0 20px 25px -5px #00000026,0 8px 10px -6px #0000001a;z-index:1101;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-pop .16s cubic-bezier(.16,1,.3,1)}@keyframes rpt-modal-pop{0%{opacity:0;transform:translate(-50%,-46%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.rpt-modal-header{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.rpt-modal-header-title{display:inline-flex;align-items:center;gap:8px;color:var(--rpt-color-primary, #2563eb)}.rpt-modal-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0}.rpt-modal-close{background:transparent;border:none;color:#64748b;font-size:1.1rem;cursor:pointer;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .12s ease}.rpt-modal-close:hover{background:#e2e8f0;color:#0f172a}.rpt-modal-body{padding:18px}.rpt-modal-hint{font-size:.8rem;color:#64748b;margin:0 0 16px;line-height:1.45}.rpt-input-group{margin-bottom:16px}.rpt-field-label{display:block;font-size:.75rem;font-weight:600;color:#334155;margin-bottom:6px}.rpt-modal-input{width:100%;box-sizing:border-box;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:8px 12px;font-size:.85rem;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-modal-input:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 3px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-existing-presets{border-top:1px solid #e2e8f0;padding-top:12px;margin-top:8px}.rpt-existing-label{display:block;font-size:.725rem;font-weight:600;color:#64748b;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}.rpt-presets-list{max-height:140px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.rpt-preset-row{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:4px}.rpt-preset-info{display:inline-flex;align-items:center;gap:8px}.rpt-preset-row-name{font-size:.775rem;font-weight:600;color:#1e293b}.rpt-preset-active-tag{font-size:.65rem;font-weight:600;background:#dbeafe;color:#1d4ed8;padding:1px 6px;border-radius:9999px}.rpt-btn-del-preset{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-btn-del-preset:hover{background:#fee2e2;color:#dc2626}.rpt-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:12px 18px;border-top:1px solid #e2e8f0;background:#f8fafc}.rpt-btn-cancel{background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:6px 14px;font-size:.775rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s ease}.rpt-btn-cancel:hover{background:#f1f5f9;color:#0f172a}.rpt-btn-confirm{background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 16px;font-size:.775rem;font-weight:600;cursor:pointer;transition:all .12s ease}.rpt-btn-confirm:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-btn-confirm:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ReportRuntimeComponent, selector: "rpt-report-runtime, rpt-runtime", inputs: ["reportId", "report"], outputs: ["resetRequested", "exportRequested", "printRequested", "customActionTriggered", "gridStateChange", "columnDefsChange", "rowActionTriggered", "drilldownRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
361
+ }
362
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptReportComponent, decorators: [{
363
+ type: Component,
364
+ args: [{ selector: 'rpt-report, rpt-view', standalone: true, imports: [CommonModule, FormsModule, ReportRuntimeComponent, RptIconComponent], template: `
365
+ <div class="rpt-facade-container">
366
+ <!-- Top Action & Preset Bar -->
367
+ @if (showToolbar()) {
368
+ <div class="rpt-facade-toolbar">
369
+ <div class="rpt-toolbar-left">
370
+ @if (activeDefinition()?.name) {
371
+ <div class="rpt-report-title-badge">
372
+ <span class="rpt-title-dot"></span>
373
+ <span class="rpt-title-text">{{ activeDefinition()?.name }}</span>
374
+ </div>
375
+ }
376
+
377
+ @if (recordCount() > 0) {
378
+ <span class="rpt-record-count-chip" title="Current dataset size">
379
+ <span class="rpt-chip-dot"></span>
380
+ <span class="rpt-tabular-nums">{{ recordCount() }} rows</span>
381
+ </span>
382
+ }
383
+
384
+ <!-- Saved Views / Preset Switcher -->
385
+ @if (enablePresets()) {
386
+ <div class="rpt-preset-control">
387
+ <label class="rpt-preset-label">
388
+ <rpt-icon name="bookmark" [size]="12" />
389
+ <span>View:</span>
390
+ </label>
391
+ <select
392
+ class="rpt-preset-select"
393
+ [ngModel]="activePresetId()"
394
+ (ngModelChange)="onSelectPreset($event)"
395
+ aria-label="Select report view preset"
396
+ >
397
+ <option value="default">Default View</option>
398
+ @for (preset of savedPresets(); track preset.id) {
399
+ <option [value]="preset.id">{{ preset.name }}</option>
400
+ }
401
+ </select>
402
+ <button
403
+ type="button"
404
+ class="rpt-btn-save-view"
405
+ (click)="openSavePresetModal()"
406
+ title="Save current grid view or manage presets"
407
+ >
408
+ <rpt-icon name="plus" [size]="11" />
409
+ <span>Save View</span>
410
+ </button>
411
+ </div>
412
+ }
413
+ </div>
414
+
415
+ <!-- Export Actions -->
416
+ @if (showExport()) {
417
+ <div class="rpt-toolbar-right">
418
+ <button
419
+ type="button"
420
+ class="rpt-export-btn rpt-export-excel"
421
+ (click)="onExportExcel()"
422
+ [disabled]="!recordCount()"
423
+ title="Export result table to Excel spreadsheet (.xls)"
424
+ >
425
+ <rpt-icon name="file-text" [size]="13" />
426
+ <span>Excel</span>
427
+ </button>
428
+ <button
429
+ type="button"
430
+ class="rpt-export-btn rpt-export-csv"
431
+ (click)="onExportCsv()"
432
+ [disabled]="!recordCount()"
433
+ title="Export result table to CSV file"
434
+ >
435
+ <rpt-icon name="download" [size]="13" />
436
+ <span>CSV</span>
437
+ </button>
438
+ <button
439
+ type="button"
440
+ class="rpt-export-btn rpt-export-print"
441
+ (click)="onPrintReport()"
442
+ [disabled]="!recordCount()"
443
+ title="Print report with branded layout"
444
+ >
445
+ <rpt-icon name="printer" [size]="13" />
446
+ <span>Print</span>
447
+ </button>
448
+ </div>
449
+ }
450
+ </div>
451
+ }
452
+
453
+ <!-- Core Runtime Engine -->
454
+ <rpt-report-runtime
455
+ #runtimeRef
456
+ [reportId]="id()"
457
+ [report]="currentDefinition()"
458
+ (rowActionTriggered)="onRowActionTriggered($event)"
459
+ (gridStateChange)="onGridStateChanged($event)"
460
+ (exportRequested)="exportRequested.emit($event)"
461
+ (printRequested)="printRequested.emit($event)"
462
+ />
463
+
464
+ <!-- Save View Preset Modal -->
465
+ @if (isSavePresetModalOpen()) {
466
+ <div class="rpt-modal-backdrop" (click)="closeSavePresetModal()" aria-hidden="true"></div>
467
+ <div class="rpt-modal-dialog" role="dialog" aria-modal="true" aria-label="Save View Preset">
468
+ <div class="rpt-modal-header">
469
+ <div class="rpt-modal-header-title">
470
+ <rpt-icon name="bookmark" [size]="16" />
471
+ <h4 class="rpt-modal-title">Custom View Presets</h4>
472
+ </div>
473
+ <button type="button" class="rpt-modal-close" (click)="closeSavePresetModal()" aria-label="Close modal">✕</button>
474
+ </div>
475
+ <div class="rpt-modal-body">
476
+ <p class="rpt-modal-hint">
477
+ Save your active column ordering, widths, sortings, and filters into a reusable view preset.
478
+ </p>
479
+
480
+ <div class="rpt-input-group">
481
+ <label class="rpt-field-label">New View Name</label>
482
+ <input
483
+ type="text"
484
+ class="rpt-modal-input"
485
+ placeholder="e.g. High Value Transactions - Q3"
486
+ [ngModel]="newPresetName()"
487
+ (ngModelChange)="newPresetName.set($event)"
488
+ (keydown.enter)="saveCurrentPreset()"
489
+ autofocus
490
+ />
491
+ </div>
492
+
493
+ <!-- Existing Presets Management List -->
494
+ @if (savedPresets().length > 0) {
495
+ <div class="rpt-existing-presets">
496
+ <span class="rpt-existing-label">Saved Views in this report:</span>
497
+ <div class="rpt-presets-list">
498
+ @for (preset of savedPresets(); track preset.id) {
499
+ <div class="rpt-preset-row">
500
+ <div class="rpt-preset-info">
501
+ <span class="rpt-preset-row-name">{{ preset.name }}</span>
502
+ @if (preset.id === activePresetId()) {
503
+ <span class="rpt-preset-active-tag">Active</span>
504
+ }
505
+ </div>
506
+ <button
507
+ type="button"
508
+ class="rpt-btn-del-preset"
509
+ (click)="deletePreset(preset.id)"
510
+ title="Delete view preset"
511
+ aria-label="Delete view preset"
512
+ >
513
+ <rpt-icon name="trash" [size]="12" />
514
+ </button>
515
+ </div>
516
+ }
517
+ </div>
518
+ </div>
519
+ }
520
+ </div>
521
+ <div class="rpt-modal-footer">
522
+ <button type="button" class="rpt-btn-cancel" (click)="closeSavePresetModal()">Cancel</button>
523
+ <button
524
+ type="button"
525
+ class="rpt-btn-confirm"
526
+ [disabled]="!newPresetName().trim()"
527
+ (click)="saveCurrentPreset()"
528
+ >
529
+ Save View
530
+ </button>
531
+ </div>
532
+ </div>
533
+ }
534
+ </div>
535
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-facade-container{width:100%;position:relative}.rpt-facade-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 16px;background:#fff;border:1px solid var(--rpt-color-border-subtle, #e2e8f0);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04));margin-bottom:14px;flex-wrap:wrap}.rpt-toolbar-left,.rpt-toolbar-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rpt-report-title-badge{display:inline-flex;align-items:center;gap:6px;font-size:.875rem;font-weight:700;color:#0f172a;padding-right:4px}.rpt-title-dot{width:8px;height:8px;border-radius:50%;background:var(--rpt-color-primary, #2563eb)}.rpt-record-count-chip{display:inline-flex;align-items:center;gap:5px;background:#f1f5f9;color:#475569;font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-full, 9999px);border:1px solid #e2e8f0}.rpt-chip-dot{width:6px;height:6px;border-radius:50%;background:#10b981}.rpt-preset-control{display:flex;align-items:center;gap:6px;background:#f8fafc;padding:3px 6px;border-radius:var(--rpt-border-radius, 6px);border:1px solid #e2e8f0}.rpt-preset-label{display:inline-flex;align-items:center;gap:4px;font-size:.725rem;font-weight:600;color:#64748b}.rpt-preset-select{border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-sm, 4px);padding:3px 8px;font-size:.75rem;font-weight:500;color:#0f172a;background:#fff;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease}.rpt-preset-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-btn-save-view{display:inline-flex;align-items:center;gap:4px;background:var(--rpt-color-primary-light, #eff6ff);border:1px solid #bfdbfe;color:var(--rpt-color-primary, #2563eb);font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-sm, 4px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-btn-save-view:hover{background:#dbeafe;border-color:#93c5fd}.rpt-export-btn{display:inline-flex;align-items:center;gap:5px;border-radius:var(--rpt-border-radius, 6px);padding:5px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-export-btn:disabled{opacity:.45;cursor:not-allowed}.rpt-export-excel{background:#f0fdf4;border:1px solid #bbf7d0;color:#15803d}.rpt-export-excel:hover:not(:disabled){background:#dcfce7;border-color:#86efac}.rpt-export-csv{background:#f8fafc;border:1px solid #cbd5e1;color:#334155}.rpt-export-csv:hover:not(:disabled){background:#f1f5f9;border-color:#94a3b8;color:#0f172a}.rpt-export-print{background:#eef2ff;border:1px solid #c7d2fe;color:#4338ca}.rpt-export-print:hover:not(:disabled){background:#e0e7ff;border-color:#a5b4fc}.rpt-modal-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(6px);z-index:1100}.rpt-modal-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(460px,92vw);background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:0 20px 25px -5px #00000026,0 8px 10px -6px #0000001a;z-index:1101;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-pop .16s cubic-bezier(.16,1,.3,1)}@keyframes rpt-modal-pop{0%{opacity:0;transform:translate(-50%,-46%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.rpt-modal-header{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.rpt-modal-header-title{display:inline-flex;align-items:center;gap:8px;color:var(--rpt-color-primary, #2563eb)}.rpt-modal-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0}.rpt-modal-close{background:transparent;border:none;color:#64748b;font-size:1.1rem;cursor:pointer;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .12s ease}.rpt-modal-close:hover{background:#e2e8f0;color:#0f172a}.rpt-modal-body{padding:18px}.rpt-modal-hint{font-size:.8rem;color:#64748b;margin:0 0 16px;line-height:1.45}.rpt-input-group{margin-bottom:16px}.rpt-field-label{display:block;font-size:.75rem;font-weight:600;color:#334155;margin-bottom:6px}.rpt-modal-input{width:100%;box-sizing:border-box;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:8px 12px;font-size:.85rem;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-modal-input:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 3px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-existing-presets{border-top:1px solid #e2e8f0;padding-top:12px;margin-top:8px}.rpt-existing-label{display:block;font-size:.725rem;font-weight:600;color:#64748b;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}.rpt-presets-list{max-height:140px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.rpt-preset-row{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:4px}.rpt-preset-info{display:inline-flex;align-items:center;gap:8px}.rpt-preset-row-name{font-size:.775rem;font-weight:600;color:#1e293b}.rpt-preset-active-tag{font-size:.65rem;font-weight:600;background:#dbeafe;color:#1d4ed8;padding:1px 6px;border-radius:9999px}.rpt-btn-del-preset{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-btn-del-preset:hover{background:#fee2e2;color:#dc2626}.rpt-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:12px 18px;border-top:1px solid #e2e8f0;background:#f8fafc}.rpt-btn-cancel{background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:6px 14px;font-size:.775rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s ease}.rpt-btn-cancel:hover{background:#f1f5f9;color:#0f172a}.rpt-btn-confirm{background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 16px;font-size:.775rem;font-weight:600;cursor:pointer;transition:all .12s ease}.rpt-btn-confirm:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-btn-confirm:disabled{opacity:.5;cursor:not-allowed}\n"] }]
536
+ }] });
537
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LXJlcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9ydW50aW1lL3JwdC1yZXBvcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDdkYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seURBQXlELENBQUM7OztBQXVpQm5HLE1BQU0sT0FBTyxrQkFBa0I7SUFDWixhQUFhLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDNUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRTNFLEVBQUUsR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sR0FBRyxLQUFLLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBQzlDLFVBQVUsR0FBRyxLQUFLLENBQTBCLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELFVBQVUsR0FBRyxLQUFLLENBQVUsSUFBSSxDQUFDLENBQUM7SUFDbEMsYUFBYSxHQUFHLEtBQUssQ0FB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJLVCxtQkE0V2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSZXBvcnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRlZmluaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgR3JpZFJvd0NsaWNrQWN0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWdyaWQubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0U2VydmljZSB9IGZyb20gJy4uL2V4cG9ydC9zZXJ2aWNlcy9yZXBvcnQtZXhwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0UnVudGltZUNvbXBvbmVudCB9IGZyb20gJy4vcmVwb3J0LXJ1bnRpbWUuY29tcG9uZW50JztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyIH0gZnJvbSAnLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3JlcG9ydC1wZXJzaXN0ZW5jZS5jb250cmFjdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0Vmlld1ByZXNldCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZ3JpZFN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZm9ybVZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjcmVhdGVkQXQ/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1yZXBvcnQsIHJwdC12aWV3JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIFJlcG9ydFJ1bnRpbWVDb21wb25lbnQsIFJwdEljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJycHQtZmFjYWRlLWNvbnRhaW5lclwiPlxuICAgICAgPCEtLSBUb3AgQWN0aW9uICYgUHJlc2V0IEJhciAtLT5cbiAgICAgIEBpZiAoc2hvd1Rvb2xiYXIoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZhY2FkZS10b29sYmFyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC10b29sYmFyLWxlZnRcIj5cbiAgICAgICAgICAgIEBpZiAoYWN0aXZlRGVmaW5pdGlvbigpPy5uYW1lKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcmVwb3J0LXRpdGxlLWJhZGdlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtdGl0bGUtZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXRpdGxlLXRleHRcIj57eyBhY3RpdmVEZWZpbml0aW9uKCk/Lm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKHJlY29yZENvdW50KCkgPiAwKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXJlY29yZC1jb3VudC1jaGlwXCIgdGl0bGU9XCJDdXJyZW50IGRhdGFzZXQgc2l6ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWNoaXAtZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXRhYnVsYXItbnVtc1wiPnt7IHJlY29yZENvdW50KCkgfX0gcm93czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8IS0tIFNhdmVkIFZpZXdzIC8gUHJlc2V0IFN3aXRjaGVyIC0tPlxuICAgICAgICAgICAgQGlmIChlbmFibGVQcmVzZXRzKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1wcmVzZXQtY29udHJvbFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwdC1wcmVzZXQtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiYm9va21hcmtcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5WaWV3Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LXByZXNldC1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYWN0aXZlUHJlc2V0SWQoKVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlbGVjdFByZXNldCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTZWxlY3QgcmVwb3J0IHZpZXcgcHJlc2V0XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZGVmYXVsdFwiPkRlZmF1bHQgVmlldzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgQGZvciAocHJlc2V0IG9mIHNhdmVkUHJlc2V0cygpOyB0cmFjayBwcmVzZXQuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwicHJlc2V0LmlkXCI+e3sgcHJlc2V0Lm5hbWUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWJ0bi1zYXZlLXZpZXdcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5TYXZlUHJlc2V0TW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIlNhdmUgY3VycmVudCBncmlkIHZpZXcgb3IgbWFuYWdlIHByZXNldHNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwicGx1c1wiIFtzaXplXT1cIjExXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPlNhdmUgVmlldzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEV4cG9ydCBBY3Rpb25zIC0tPlxuICAgICAgICAgIEBpZiAoc2hvd0V4cG9ydCgpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXRvb2xiYXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWV4cG9ydC1idG4gcnB0LWV4cG9ydC1leGNlbFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRXhwb3J0RXhjZWwoKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFyZWNvcmRDb3VudCgpXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkV4cG9ydCByZXN1bHQgdGFibGUgdG8gRXhjZWwgc3ByZWFkc2hlZXQgKC54bHMpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZmlsZS10ZXh0XCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPkV4Y2VsPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWV4cG9ydC1idG4gcnB0LWV4cG9ydC1jc3ZcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkV4cG9ydENzdigpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXJlY29yZENvdW50KClcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiRXhwb3J0IHJlc3VsdCB0YWJsZSB0byBDU1YgZmlsZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImRvd25sb2FkXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPkNTVjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJwdC1leHBvcnQtYnRuIHJwdC1leHBvcnQtcHJpbnRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblByaW50UmVwb3J0KClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhcmVjb3JkQ291bnQoKVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJQcmludCByZXBvcnQgd2l0aCBicmFuZGVkIGxheW91dFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInByaW50ZXJcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+UHJpbnQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPCEtLSBDb3JlIFJ1bnRpbWUgRW5naW5lIC0tPlxuICAgICAgPHJwdC1yZXBvcnQtcnVudGltZVxuICAgICAgICAjcnVudGltZVJlZlxuICAgICAgICBbcmVwb3J0SWRdPVwiaWQoKVwiXG4gICAgICAgIFtyZXBvcnRdPVwiY3VycmVudERlZmluaXRpb24oKVwiXG4gICAgICAgIChyb3dBY3Rpb25UcmlnZ2VyZWQpPVwib25Sb3dBY3Rpb25UcmlnZ2VyZWQoJGV2ZW50KVwiXG4gICAgICAgIChncmlkU3RhdGVDaGFuZ2UpPVwib25HcmlkU3RhdGVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAoZXhwb3J0UmVxdWVzdGVkKT1cImV4cG9ydFJlcXVlc3RlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAocHJpbnRSZXF1ZXN0ZWQpPVwicHJpbnRSZXF1ZXN0ZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAgIC8+XG5cbiAgICAgIDwhLS0gU2F2ZSBWaWV3IFByZXNldCBNb2RhbCAtLT5cbiAgICAgIEBpZiAoaXNTYXZlUHJlc2V0TW9kYWxPcGVuKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1tb2RhbC1iYWNrZHJvcFwiIChjbGljayk9XCJjbG9zZVNhdmVQcmVzZXRNb2RhbCgpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbW9kYWwtZGlhbG9nXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbD1cIlNhdmUgVmlldyBQcmVzZXRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1tb2RhbC1oZWFkZXItdGl0bGVcIj5cbiAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJib29rbWFya1wiIFtzaXplXT1cIjE2XCIgLz5cbiAgICAgICAgICAgICAgPGg0IGNsYXNzPVwicnB0LW1vZGFsLXRpdGxlXCI+Q3VzdG9tIFZpZXcgUHJlc2V0czwvaDQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicnB0LW1vZGFsLWNsb3NlXCIgKGNsaWNrKT1cImNsb3NlU2F2ZVByZXNldE1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgbW9kYWxcIj7inJU8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwicnB0LW1vZGFsLWhpbnRcIj5cbiAgICAgICAgICAgICAgU2F2ZSB5b3VyIGFjdGl2ZSBjb2x1bW4gb3JkZXJpbmcsIHdpZHRocywgc29ydGluZ3MsIGFuZCBmaWx0ZXJzIGludG8gYSByZXVzYWJsZSB2aWV3IHByZXNldC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1pbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJycHQtZmllbGQtbGFiZWxcIj5OZXcgVmlldyBOYW1lPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LW1vZGFsLWlucHV0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gSGlnaCBWYWx1ZSBUcmFuc2FjdGlvbnMgLSBRM1wiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibmV3UHJlc2V0TmFtZSgpXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJuZXdQcmVzZXROYW1lLnNldCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzYXZlQ3VycmVudFByZXNldCgpXCJcbiAgICAgICAgICAgICAgICBhdXRvZm9jdXNcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEV4aXN0aW5nIFByZXNldHMgTWFuYWdlbWVudCBMaXN0IC0tPlxuICAgICAgICAgICAgQGlmIChzYXZlZFByZXNldHMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZXhpc3RpbmctcHJlc2V0c1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWV4aXN0aW5nLWxhYmVsXCI+U2F2ZWQgVmlld3MgaW4gdGhpcyByZXBvcnQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHJlc2V0cy1saXN0XCI+XG4gICAgICAgICAgICAgICAgICBAZm9yIChwcmVzZXQgb2Ygc2F2ZWRQcmVzZXRzKCk7IHRyYWNrIHByZXNldC5pZCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXByZXNldC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXByZXNldC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1wcmVzZXQtcm93LW5hbWVcIj57eyBwcmVzZXQubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocHJlc2V0LmlkID09PSBhY3RpdmVQcmVzZXRJZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXByZXNldC1hY3RpdmUtdGFnXCI+QWN0aXZlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtYnRuLWRlbC1wcmVzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVByZXNldChwcmVzZXQuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRGVsZXRlIHZpZXcgcHJlc2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgdmlldyBwcmVzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidHJhc2hcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycHQtYnRuLWNhbmNlbFwiIChjbGljayk9XCJjbG9zZVNhdmVQcmVzZXRNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInJwdC1idG4tY29uZmlybVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhbmV3UHJlc2V0TmFtZSgpLnRyaW0oKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzYXZlQ3VycmVudFByZXNldCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgU2F2ZSBWaWV3XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1ycHQtZm9udC1mYW1pbHksIGluaGVyaXQpO1xuICAgIH1cbiAgICAucnB0LWZhY2FkZS1jb250YWluZXIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuICAgIC5ycHQtZmFjYWRlLXRvb2xiYXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBnYXA6IDEycHg7XG4gICAgICBwYWRkaW5nOiAxMHB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlci1zdWJ0bGUsICNlMmU4ZjApO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMtbGcsIDhweCk7XG4gICAgICBib3gtc2hhZG93OiB2YXIoLS1ycHQtYm94LXNoYWRvdy14cywgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4wNCkpO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTRweDtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICB9XG4gICAgLnJwdC10b29sYmFyLWxlZnQsIC5ycHQtdG9vbGJhci1yaWdodCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogMTBweDtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICB9XG4gICAgLnJwdC1yZXBvcnQtdGl0bGUtYmFkZ2Uge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgcGFkZGluZy1yaWdodDogNHB4O1xuICAgIH1cbiAgICAucnB0LXRpdGxlLWRvdCB7XG4gICAgICB3aWR0aDogOHB4O1xuICAgICAgaGVpZ2h0OiA4cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgfVxuICAgIC5ycHQtcmVjb3JkLWNvdW50LWNoaXAge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgY29sb3I6ICM0NzU1Njk7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIHBhZGRpbmc6IDNweCA4cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cy1mdWxsLCA5OTk5cHgpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDtcbiAgICB9XG4gICAgLnJwdC1jaGlwLWRvdCB7XG4gICAgICB3aWR0aDogNnB4O1xuICAgICAgaGVpZ2h0OiA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBiYWNrZ3JvdW5kOiAjMTBiOTgxO1xuICAgIH1cbiAgICAucnB0LXByZXNldC1jb250cm9sIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgcGFkZGluZzogM3B4IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLCA2cHgpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDtcbiAgICB9XG4gICAgLnJwdC1wcmVzZXQtbGFiZWwge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA0cHg7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgIH1cbiAgICAucnB0LXByZXNldC1zZWxlY3Qge1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLXNtLCA0cHgpO1xuICAgICAgcGFkZGluZzogM3B4IDhweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBjb2xvcjogIzBmMTcyYTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIHZhcigtLXJwdC10cmFuc2l0aW9uLXNwZWVkLCAxNTBtcykgZWFzZTtcbiAgICB9XG4gICAgLnJwdC1wcmVzZXQtc2VsZWN0OmZvY3VzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LWZvY3VzLCByZ2JhKDM3LCA5OSwgMjM1LCAwLjI1KSk7XG4gICAgfVxuICAgIC5ycHQtYnRuLXNhdmUtdmlldyB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDRweDtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LWxpZ2h0LCAjZWZmNmZmKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiZmRiZmU7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgZm9udC1zaXplOiAwLjcyNXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBwYWRkaW5nOiAzcHggOHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMtc20sIDRweCk7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tcnB0LXRyYW5zaXRpb24tc3BlZWQsIDE1MG1zKSBlYXNlO1xuICAgIH1cbiAgICAucnB0LWJ0bi1zYXZlLXZpZXc6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2RiZWFmZTtcbiAgICAgIGJvcmRlci1jb2xvcjogIzkzYzVmZDtcbiAgICB9XG4gICAgLnJwdC1leHBvcnQtYnRuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMsIDZweCk7XG4gICAgICBwYWRkaW5nOiA1cHggMTJweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tcnB0LXRyYW5zaXRpb24tc3BlZWQsIDE1MG1zKSBlYXNlO1xuICAgIH1cbiAgICAucnB0LWV4cG9ydC1idG46ZGlzYWJsZWQge1xuICAgICAgb3BhY2l0eTogMC40NTtcbiAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gICAgfVxuICAgIC5ycHQtZXhwb3J0LWV4Y2VsIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmMGZkZjQ7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYmJmN2QwO1xuICAgICAgY29sb3I6ICMxNTgwM2Q7XG4gICAgfVxuICAgIC5ycHQtZXhwb3J0LWV4Y2VsOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6ICNkY2ZjZTc7XG4gICAgICBib3JkZXItY29sb3I6ICM4NmVmYWM7XG4gICAgfVxuICAgIC5ycHQtZXhwb3J0LWNzdiB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIGNvbG9yOiAjMzM0MTU1O1xuICAgIH1cbiAgICAucnB0LWV4cG9ydC1jc3Y6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZDogI2YxZjVmOTtcbiAgICAgIGJvcmRlci1jb2xvcjogIzk0YTNiODtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cbiAgICAucnB0LWV4cG9ydC1wcmludCB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWVmMmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2M3ZDJmZTtcbiAgICAgIGNvbG9yOiAjNDMzOGNhO1xuICAgIH1cbiAgICAucnB0LWV4cG9ydC1wcmludDpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZTBlN2ZmO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjYTViNGZjO1xuICAgIH1cbiAgICAvKiBNb2RhbCAqL1xuICAgIC5ycHQtbW9kYWwtYmFja2Ryb3Age1xuICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgaW5zZXQ6IDA7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE1LCAyMywgNDIsIDAuNDUpO1xuICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7XG4gICAgICB6LWluZGV4OiAxMTAwO1xuICAgIH1cbiAgICAucnB0LW1vZGFsLWRpYWxvZyB7XG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICB0b3A6IDUwJTtcbiAgICAgIGxlZnQ6IDUwJTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgd2lkdGg6IG1pbig0NjBweCwgOTJ2dyk7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLWxnLCA4cHgpO1xuICAgICAgYm94LXNoYWRvdzogMCAyMHB4IDI1cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMTUpLCAwIDhweCAxMHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuICAgICAgei1pbmRleDogMTEwMTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIGFuaW1hdGlvbjogcnB0LW1vZGFsLXBvcCAxNjBtcyBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKTtcbiAgICB9XG4gICAgQGtleWZyYW1lcyBycHQtbW9kYWwtcG9wIHtcbiAgICAgIGZyb20geyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNDYlKSBzY2FsZSgwLjk3KTsgfVxuICAgICAgdG8geyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSBzY2FsZSgxKTsgfVxuICAgIH1cbiAgICAucnB0LW1vZGFsLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHBhZGRpbmc6IDE0cHggMThweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICB9XG4gICAgLnJwdC1tb2RhbC1oZWFkZXItdGl0bGUge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgIH1cbiAgICAucnB0LW1vZGFsLXRpdGxlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC45NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICBjb2xvcjogIzBmMTcyYTtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gICAgLnJwdC1tb2RhbC1jbG9zZSB7XG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgZm9udC1zaXplOiAxLjFyZW07XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB3aWR0aDogMjhweDtcbiAgICAgIGhlaWdodDogMjhweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTIwbXMgZWFzZTtcbiAgICB9XG4gICAgLnJwdC1tb2RhbC1jbG9zZTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZTJlOGYwO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgfVxuICAgIC5ycHQtbW9kYWwtYm9keSB7XG4gICAgICBwYWRkaW5nOiAxOHB4O1xuICAgIH1cbiAgICAucnB0LW1vZGFsLWhpbnQge1xuICAgICAgZm9udC1zaXplOiAwLjhyZW07XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIG1hcmdpbjogMCAwIDE2cHggMDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ1O1xuICAgIH1cbiAgICAucnB0LWlucHV0LWdyb3VwIHtcbiAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgfVxuICAgIC5ycHQtZmllbGQtbGFiZWwge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgICBtYXJnaW4tYm90dG9tOiA2cHg7XG4gICAgfVxuICAgIC5ycHQtbW9kYWwtaW5wdXQge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLCA2cHgpO1xuICAgICAgcGFkZGluZzogOHB4IDEycHg7XG4gICAgICBmb250LXNpemU6IDAuODVyZW07XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLXJwdC10cmFuc2l0aW9uLXNwZWVkLCAxNTBtcykgZWFzZTtcbiAgICB9XG4gICAgLnJwdC1tb2RhbC1pbnB1dDpmb2N1cyB7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeS1mb2N1cywgcmdiYSgzNywgOTksIDIzNSwgMC4yNSkpO1xuICAgIH1cbiAgICAucnB0LWV4aXN0aW5nLXByZXNldHMge1xuICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBwYWRkaW5nLXRvcDogMTJweDtcbiAgICAgIG1hcmdpbi10b3A6IDhweDtcbiAgICB9XG4gICAgLnJwdC1leGlzdGluZy1sYWJlbCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1xuICAgIH1cbiAgICAucnB0LXByZXNldHMtbGlzdCB7XG4gICAgICBtYXgtaGVpZ2h0OiAxNDBweDtcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogNnB4O1xuICAgIH1cbiAgICAucnB0LXByZXNldC1yb3cge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBwYWRkaW5nOiA2cHggMTBweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIH1cbiAgICAucnB0LXByZXNldC1pbmZvIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogOHB4O1xuICAgIH1cbiAgICAucnB0LXByZXNldC1yb3ctbmFtZSB7XG4gICAgICBmb250LXNpemU6IDAuNzc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAjMWUyOTNiO1xuICAgIH1cbiAgICAucnB0LXByZXNldC1hY3RpdmUtdGFnIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGJlYWZlO1xuICAgICAgY29sb3I6ICMxZDRlZDg7XG4gICAgICBwYWRkaW5nOiAxcHggNnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgIH1cbiAgICAucnB0LWJ0bi1kZWwtcHJlc2V0IHtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6ICM5NGEzYjg7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBwYWRkaW5nOiA0cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gICAgfVxuICAgIC5ycHQtYnRuLWRlbC1wcmVzZXQ6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2ZlZTJlMjtcbiAgICAgIGNvbG9yOiAjZGMyNjI2O1xuICAgIH1cbiAgICAucnB0LW1vZGFsLWZvb3RlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgICBnYXA6IDEwcHg7XG4gICAgICBwYWRkaW5nOiAxMnB4IDE4cHg7XG4gICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgfVxuICAgIC5ycHQtYnRuLWNhbmNlbCB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLCA2cHgpO1xuICAgICAgcGFkZGluZzogNnB4IDE0cHg7XG4gICAgICBmb250LXNpemU6IDAuNzc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiAjNDc1NTY5O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gICAgfVxuICAgIC5ycHQtYnRuLWNhbmNlbDpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgfVxuICAgIC5ycHQtYnRuLWNvbmZpcm0ge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cywgNnB4KTtcbiAgICAgIHBhZGRpbmc6IDZweCAxNnB4O1xuICAgICAgZm9udC1zaXplOiAwLjc3NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTIwbXMgZWFzZTtcbiAgICB9XG4gICAgLnJwdC1idG4tY29uZmlybTpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeS1ob3ZlciwgIzFkNGVkOCk7XG4gICAgfVxuICAgIC5ycHQtYnRuLWNvbmZpcm06ZGlzYWJsZWQge1xuICAgICAgb3BhY2l0eTogMC41O1xuICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICB9XG4gIGBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUnB0UmVwb3J0Q29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBleHBvcnRTZXJ2aWNlID0gaW5qZWN0KFJlcG9ydEV4cG9ydFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlcnNpc3RlbmNlID0gaW5qZWN0KFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICByZWFkb25seSBpZCA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgcmVwb3J0ID0gaW5wdXQ8UmVwb3J0RGVmaW5pdGlvbiB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBwYXJhbWV0ZXJzID0gaW5wdXQ8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHt9KTtcbiAgcmVhZG9ubHkgc2hvd0V4cG9ydCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBlbmFibGVQcmVzZXRzID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGF1dG9FeGVjdXRlID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgcmVhZG9ubHkgcm93Q2xpY2sgPSBvdXRwdXQ8e1xuICAgIHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgYWN0aW9uPzogR3JpZFJvd0NsaWNrQWN0aW9uO1xuICB9PigpO1xuICByZWFkb25seSBkYXRhTG9hZGVkID0gb3V0cHV0PHVua25vd25bXT4oKTtcbiAgcmVhZG9ubHkgZ3JpZFN0YXRlQ2hhbmdlID0gb3V0cHV0PGFueT4oKTtcbiAgcmVhZG9ubHkgcHJlc2V0U2F2ZWQgPSBvdXRwdXQ8eyBuYW1lOiBzdHJpbmc7IHByZXNldDogUmVwb3J0Vmlld1ByZXNldCB9PigpO1xuICByZWFkb25seSBwcmVzZXRDaGFuZ2UgPSBvdXRwdXQ8UmVwb3J0Vmlld1ByZXNldCB8IG51bGw+KCk7XG4gIHJlYWRvbmx5IGV4cG9ydFJlcXVlc3RlZCA9IG91dHB1dDxhbnk+KCk7XG4gIHJlYWRvbmx5IHByaW50UmVxdWVzdGVkID0gb3V0cHV0PGFueT4oKTtcblxuICByZWFkb25seSBydW50aW1lQ29tcG9uZW50ID0gdmlld0NoaWxkKFJlcG9ydFJ1bnRpbWVDb21wb25lbnQpO1xuXG4gIC8vIFByZXNldCBzdGF0ZXNcbiAgcmVhZG9ubHkgYWN0aXZlUHJlc2V0SWQgPSBzaWduYWw8c3RyaW5nPignZGVmYXVsdCcpO1xuICByZWFkb25seSBpc1NhdmVQcmVzZXRNb2RhbE9wZW4gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBuZXdQcmVzZXROYW1lID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICByZWFkb25seSBsYXRlc3RHcmlkU3RhdGUgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgY3VzdG9tUHJlc2V0cyA9IHNpZ25hbDxSZXBvcnRWaWV3UHJlc2V0W10+KFtdKTtcblxuICByZWFkb25seSBjdXJyZW50RGVmaW5pdGlvbiA9IGNvbXB1dGVkPFJlcG9ydERlZmluaXRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3J0KCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFjdGl2ZURlZmluaXRpb24gPSBjb21wdXRlZDxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydCgpID8/IHRoaXMucnVudGltZUNvbXBvbmVudCgpPy5jdXJyZW50RGVmaW5pdGlvbigpID8/IG51bGw7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHJlY29yZENvdW50ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMucnVudGltZUNvbXBvbmVudCgpPy5yZXN1bHREYXRhKCk/Lmxlbmd0aCA/PyAwO1xuICB9KTtcblxuICByZWFkb25seSBzaG93VG9vbGJhciA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zaG93RXhwb3J0KCkgfHwgdGhpcy5lbmFibGVQcmVzZXRzKCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHNhdmVkUHJlc2V0cyA9IGNvbXB1dGVkPFJlcG9ydFZpZXdQcmVzZXRbXT4oKCkgPT4ge1xuICAgIGNvbnN0IGRlZiA9IHRoaXMuYWN0aXZlRGVmaW5pdGlvbigpO1xuICAgIGNvbnN0IGluaXRpYWxQcmVzZXRzID0gKChkZWY/LmdyaWQ/Lm9wdGlvbnMgYXMgYW55KT8ucHJlc2V0cyBhcyBSZXBvcnRWaWV3UHJlc2V0W10pID8/IFtdO1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZXBvcnRWaWV3UHJlc2V0PigpO1xuICAgIGZvciAoY29uc3QgcCBvZiBpbml0aWFsUHJlc2V0cykge1xuICAgICAgaWYgKHAgJiYgcC5pZCkgbWFwLnNldChwLmlkLCBwKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMuY3VzdG9tUHJlc2V0cygpKSB7XG4gICAgICBpZiAocCAmJiBwLmlkKSBtYXAuc2V0KHAuaWQsIHApO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbShtYXAudmFsdWVzKCkpO1xuICB9KTtcblxuICBvblJvd0FjdGlvblRyaWdnZXJlZChldmVudDoge1xuICAgIGFjdGlvbjogR3JpZFJvd0NsaWNrQWN0aW9uO1xuICAgIHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0pOiB2b2lkIHtcbiAgICB0aGlzLnJvd0NsaWNrLmVtaXQoe1xuICAgICAgcm93OiBldmVudC5yb3csXG4gICAgICBwYXJhbWV0ZXJzOiBldmVudC5wYXJhbWV0ZXJzLFxuICAgICAgYWN0aW9uOiBldmVudC5hY3Rpb24sXG4gICAgfSk7XG4gIH1cblxuICBvbkdyaWRTdGF0ZUNoYW5nZWQoc3RhdGU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubGF0ZXN0R3JpZFN0YXRlLnNldChzdGF0ZSk7XG4gICAgdGhpcy5ncmlkU3RhdGVDaGFuZ2UuZW1pdChzdGF0ZSk7XG4gIH1cblxuICBvblNlbGVjdFByZXNldChwcmVzZXRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVQcmVzZXRJZC5zZXQocHJlc2V0SWQpO1xuICAgIGlmIChwcmVzZXRJZCA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICB0aGlzLnByZXNldENoYW5nZS5lbWl0KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXNldCA9IHRoaXMuc2F2ZWRQcmVzZXRzKCkuZmluZCgocCkgPT4gcC5pZCA9PT0gcHJlc2V0SWQpO1xuICAgIGlmIChwcmVzZXQpIHtcbiAgICAgIGlmIChwcmVzZXQuZ3JpZFN0YXRlKSB7XG4gICAgICAgIHRoaXMubGF0ZXN0R3JpZFN0YXRlLnNldChwcmVzZXQuZ3JpZFN0YXRlKTtcbiAgICAgICAgdGhpcy5ncmlkU3RhdGVDaGFuZ2UuZW1pdChwcmVzZXQuZ3JpZFN0YXRlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJlc2V0Q2hhbmdlLmVtaXQocHJlc2V0KTtcbiAgICB9XG4gIH1cblxuICBjb25maXJtU2F2ZVByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnNhdmVDdXJyZW50UHJlc2V0KCk7XG4gIH1cblxuICBleHBvcnRFeGNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRXhwb3J0RXhjZWwoKTtcbiAgfVxuXG4gIGV4cG9ydENzdigpOiB2b2lkIHtcbiAgICB0aGlzLm9uRXhwb3J0Q3N2KCk7XG4gIH1cblxuICBwcmludCgpOiB2b2lkIHtcbiAgICB0aGlzLm9uUHJpbnRSZXBvcnQoKTtcbiAgfVxuXG4gIG9wZW5TYXZlUHJlc2V0TW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5uZXdQcmVzZXROYW1lLnNldCgnJyk7XG4gICAgdGhpcy5pc1NhdmVQcmVzZXRNb2RhbE9wZW4uc2V0KHRydWUpO1xuICB9XG5cbiAgY2xvc2VTYXZlUHJlc2V0TW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc1NhdmVQcmVzZXRNb2RhbE9wZW4uc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHNhdmVDdXJyZW50UHJlc2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5ld1ByZXNldE5hbWUoKS50cmltKCk7XG4gICAgaWYgKCFuYW1lKSByZXR1cm47XG5cbiAgICBjb25zdCBwcmVzZXRJZCA9IGBwcmVzZXRfJHtEYXRlLm5vdygpfWA7XG4gICAgY29uc3QgbmV3UHJlc2V0OiBSZXBvcnRWaWV3UHJlc2V0ID0ge1xuICAgICAgaWQ6IHByZXNldElkLFxuICAgICAgbmFtZSxcbiAgICAgIGdyaWRTdGF0ZTogdGhpcy5sYXRlc3RHcmlkU3RhdGUoKSA/PyB7fSxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG5cbiAgICBjb25zdCBkZWYgPSB0aGlzLmFjdGl2ZURlZmluaXRpb24oKTtcbiAgICBpZiAoZGVmICYmIGRlZi5ncmlkKSB7XG4gICAgICBpZiAoIWRlZi5ncmlkLm9wdGlvbnMpIGRlZi5ncmlkLm9wdGlvbnMgPSB7fTtcbiAgICAgIGNvbnN0IGN1cnJlbnRQcmVzZXRzOiBSZXBvcnRWaWV3UHJlc2V0W10gPSAoZGVmLmdyaWQub3B0aW9ucyBhcyBhbnkpLnByZXNldHMgPz8gW107XG4gICAgICAoZGVmLmdyaWQub3B0aW9ucyBhcyBhbnkpLnByZXNldHMgPSBbLi4uY3VycmVudFByZXNldHMsIG5ld1ByZXNldF07XG5cbiAgICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlICYmIGRlZi5pZCkge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlLnNhdmUoZGVmKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6ICgpID0+IHt9LFxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7fSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jdXN0b21QcmVzZXRzLnVwZGF0ZSgocHJldikgPT4gWy4uLnByZXYsIG5ld1ByZXNldF0pO1xuICAgIHRoaXMuYWN0aXZlUHJlc2V0SWQuc2V0KHByZXNldElkKTtcbiAgICB0aGlzLnByZXNldFNhdmVkLmVtaXQoeyBuYW1lLCBwcmVzZXQ6IG5ld1ByZXNldCB9KTtcbiAgICB0aGlzLmNsb3NlU2F2ZVByZXNldE1vZGFsKCk7XG4gIH1cblxuICBkZWxldGVQcmVzZXQocHJlc2V0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChwcmVzZXRJZCA9PT0gJ2RlZmF1bHQnKSByZXR1cm47XG5cbiAgICB0aGlzLmN1c3RvbVByZXNldHMudXBkYXRlKChwcmV2KSA9PiBwcmV2LmZpbHRlcigocCkgPT4gcC5pZCAhPT0gcHJlc2V0SWQpKTtcblxuICAgIGNvbnN0IGRlZiA9IHRoaXMuYWN0aXZlRGVmaW5pdGlvbigpO1xuICAgIGlmIChkZWYgJiYgZGVmLmdyaWQgJiYgZGVmLmdyaWQub3B0aW9ucykge1xuICAgICAgY29uc3QgY3VycmVudCA9ICgoZGVmLmdyaWQub3B0aW9ucyBhcyBhbnkpLnByZXNldHMgYXMgUmVwb3J0Vmlld1ByZXNldFtdKSA/PyBbXTtcbiAgICAgIChkZWYuZ3JpZC5vcHRpb25zIGFzIGFueSkucHJlc2V0cyA9IGN1cnJlbnQuZmlsdGVyKChwKSA9PiBwLmlkICE9PSBwcmVzZXRJZCk7XG5cbiAgICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlICYmIGRlZi5pZCkge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlLnNhdmUoZGVmKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6ICgpID0+IHt9LFxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7fSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlUHJlc2V0SWQoKSA9PT0gcHJlc2V0SWQpIHtcbiAgICAgIHRoaXMub25TZWxlY3RQcmVzZXQoJ2RlZmF1bHQnKTtcbiAgICB9XG4gIH1cblxuICBvbkV4cG9ydEV4Y2VsKCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJ1bnRpbWVDb21wb25lbnQoKT8ucmVzdWx0RGF0YSgpO1xuICAgIGlmICghZGF0YSB8fCAhQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGRlZiA9IHRoaXMuYWN0aXZlRGVmaW5pdGlvbigpO1xuICAgIGNvbnN0IGNvbHMgPSBkZWY/LmdyaWQ/LmNvbHVtbnMubWFwKChjKSA9PiAoeyBmaWVsZDogYy5maWVsZCwgaGVhZGVyOiBjLmxhYmVsIH0pKTtcbiAgICB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0RXhjZWwoZGF0YSBhcyBhbnksIHtcbiAgICAgIGZpbGVOYW1lOiBkZWY/Lm5hbWUgPyBgJHtkZWYubmFtZX0ueGxzYCA6ICdyZXBvcnQueGxzJyxcbiAgICAgIGNvbHVtbnM6IGNvbHMsXG4gICAgICBicmFuZGVkSGVhZGVyOiB7IHJlcG9ydFRpdGxlOiBkZWY/Lm5hbWUgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uRXhwb3J0Q3N2KCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJ1bnRpbWVDb21wb25lbnQoKT8ucmVzdWx0RGF0YSgpO1xuICAgIGlmICghZGF0YSB8fCAhQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGRlZiA9IHRoaXMuYWN0aXZlRGVmaW5pdGlvbigpO1xuICAgIGNvbnN0IGNvbHMgPSBkZWY/LmdyaWQ/LmNvbHVtbnMubWFwKChjKSA9PiAoeyBmaWVsZDogYy5maWVsZCwgaGVhZGVyOiBjLmxhYmVsIH0pKTtcbiAgICB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0Q3N2KGRhdGEgYXMgYW55LCB7XG4gICAgICBmaWxlTmFtZTogZGVmPy5uYW1lID8gYCR7ZGVmLm5hbWV9LmNzdmAgOiAncmVwb3J0LmNzdicsXG4gICAgICBjb2x1bW5zOiBjb2xzLFxuICAgICAgYnJhbmRlZEhlYWRlcjogeyByZXBvcnRUaXRsZTogZGVmPy5uYW1lIH0sXG4gICAgfSk7XG4gIH1cblxuICBvblByaW50UmVwb3J0KCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJ1bnRpbWVDb21wb25lbnQoKT8ucmVzdWx0RGF0YSgpO1xuICAgIGlmICghZGF0YSB8fCAhQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGRlZiA9IHRoaXMuYWN0aXZlRGVmaW5pdGlvbigpO1xuICAgIGNvbnN0IGNvbHMgPSBkZWY/LmdyaWQ/LmNvbHVtbnMubWFwKChjKSA9PiAoeyBmaWVsZDogYy5maWVsZCwgaGVhZGVyOiBjLmxhYmVsIH0pKTtcbiAgICB0aGlzLmV4cG9ydFNlcnZpY2UucHJpbnRSZXBvcnQoZGF0YSBhcyBhbnksIHtcbiAgICAgIHRpdGxlOiBkZWY/Lm5hbWUgfHwgJ1JlcG9ydCBQcmludCBQcmV2aWV3JyxcbiAgICAgIGNvbHVtbnM6IGNvbHMsXG4gICAgICBicmFuZGVkSGVhZGVyOiB7IHJlcG9ydFRpdGxlOiBkZWY/Lm5hbWUgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19