bways-report 0.1.2 → 0.1.4

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 (107) 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/component-palette/component-palette.component.mjs +24 -3
  21. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +572 -102
  22. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +593 -0
  23. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +225 -25
  24. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +568 -12
  25. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +238 -11
  26. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +191 -25
  27. package/esm2022/lib/features/designer/designer.component.mjs +245 -27
  28. package/esm2022/lib/features/designer/index.mjs +4 -1
  29. package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +102 -0
  30. package/esm2022/lib/features/designer/services/designer-state.service.mjs +18 -10
  31. package/esm2022/lib/features/designer/services/report-template.service.mjs +318 -0
  32. package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +41 -9
  33. package/esm2022/lib/features/export/index.mjs +2 -2
  34. package/esm2022/lib/features/export/models/export.models.mjs +1 -1
  35. package/esm2022/lib/features/export/services/report-export.service.mjs +420 -5
  36. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +2 -2
  37. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +239 -33
  38. package/esm2022/lib/features/runtime/index.mjs +2 -1
  39. package/esm2022/lib/features/runtime/report-execution.service.mjs +56 -0
  40. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +423 -30
  41. package/esm2022/lib/features/runtime/report-runtime.component.mjs +349 -7
  42. package/esm2022/lib/features/runtime/rpt-report.component.mjs +545 -0
  43. package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +19 -8
  44. package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +18 -7
  45. package/esm2022/lib/primitives/components/checkbox/rpt-checkbox.component.mjs +3 -3
  46. package/esm2022/lib/primitives/components/date/rpt-date.component.mjs +3 -3
  47. package/esm2022/lib/primitives/components/date-range/rpt-date-range.component.mjs +346 -0
  48. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +728 -74
  49. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +30 -1
  50. package/esm2022/lib/primitives/components/index.mjs +2 -1
  51. package/esm2022/lib/primitives/components/input/rpt-input.component.mjs +3 -3
  52. package/esm2022/lib/primitives/components/kpi-card/rpt-kpi-card.component.mjs +3 -3
  53. package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +3 -3
  54. package/esm2022/lib/primitives/register-builtins.mjs +51 -2
  55. package/esm2022/lib/provide-reporting.mjs +145 -24
  56. package/fesm2022/bways-report.mjs +7797 -921
  57. package/fesm2022/bways-report.mjs.map +1 -1
  58. package/lib/core/index.d.ts +2 -0
  59. package/lib/core/models/report-datasource.model.d.ts +9 -0
  60. package/lib/core/models/report-definition.model.d.ts +2 -0
  61. package/lib/core/models/report-grid.model.d.ts +67 -1
  62. package/lib/core/services/report-session-context.service.d.ts +6 -1
  63. package/lib/core/utils/data-normalization.util.d.ts +15 -0
  64. package/lib/core/utils/report-parameter.util.d.ts +35 -0
  65. package/lib/data-access/adapters/http-datasource.adapter.d.ts +20 -0
  66. package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -0
  67. package/lib/data-access/adapters/http-masterdata.adapter.d.ts +13 -0
  68. package/lib/data-access/adapters/http-persistence.adapter.d.ts +27 -0
  69. package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +2 -0
  70. package/lib/data-access/adapters/index.d.ts +7 -2
  71. package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +19 -0
  72. package/lib/data-access/adapters/mock-datasource.adapter.d.ts +9 -0
  73. package/lib/data-access/contracts/api-dtos.d.ts +67 -0
  74. package/lib/data-access/contracts/index.d.ts +1 -0
  75. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +2 -1
  76. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +22 -0
  77. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -1
  78. package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +33 -0
  79. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +13 -0
  80. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +16 -2
  81. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +9 -1
  82. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +12 -1
  83. package/lib/features/designer/designer.component.d.ts +11 -0
  84. package/lib/features/designer/index.d.ts +4 -0
  85. package/lib/features/designer/rpt-report-designer.component.d.ts +38 -0
  86. package/lib/features/designer/services/designer-state.service.d.ts +1 -1
  87. package/lib/features/designer/services/report-template.service.d.ts +32 -0
  88. package/lib/features/designer/utilities/canvas-layout.util.d.ts +4 -0
  89. package/lib/features/export/index.d.ts +2 -2
  90. package/lib/features/export/models/export.models.d.ts +23 -0
  91. package/lib/features/export/services/report-export.service.d.ts +31 -2
  92. package/lib/features/runtime/dynamic-renderer.component.d.ts +42 -2
  93. package/lib/features/runtime/index.d.ts +2 -0
  94. package/lib/features/runtime/report-execution.service.d.ts +16 -0
  95. package/lib/features/runtime/report-grid-bridge.component.d.ts +171 -6
  96. package/lib/features/runtime/report-runtime.component.d.ts +86 -1
  97. package/lib/features/runtime/rpt-report.component.d.ts +69 -0
  98. package/lib/primitives/components/button/rpt-button.component.d.ts +5 -2
  99. package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +1 -0
  100. package/lib/primitives/components/date-range/rpt-date-range.component.d.ts +43 -0
  101. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +55 -7
  102. package/lib/primitives/components/index.d.ts +2 -0
  103. package/lib/provide-reporting.d.ts +79 -26
  104. package/package.json +2 -1
  105. package/schematics/collection.json +10 -0
  106. package/schematics/ng-add/index.js +45 -0
  107. package/schematics/ng-add/schema.json +17 -0
@@ -9,17 +9,99 @@ export class PropertyEditorGridComponent {
9
9
  addGrid = output();
10
10
  removeGrid = output();
11
11
  addColumn = output();
12
+ autoDetectColumns = output();
12
13
  removeColumn = output();
13
14
  updateColumn = output();
14
15
  updateOption = output();
16
+ updateRowClickAction = output();
15
17
  columns = computed(() => {
16
18
  return this.grid()?.columns ?? [];
17
19
  });
20
+ rowClickAction = computed(() => {
21
+ return this.grid()?.rowClickAction ?? this.grid()?.options?.rowClickAction;
22
+ });
23
+ hasRowClickAction = computed(() => {
24
+ return !!this.rowClickAction();
25
+ });
26
+ parameterMappings = computed(() => {
27
+ const mapping = this.rowClickAction()?.parameterMapping;
28
+ if (!mapping)
29
+ return [];
30
+ return Object.entries(mapping).map(([key, value]) => ({ key, value }));
31
+ });
18
32
  onUpdateCol(index, field, value) {
19
33
  this.updateColumn.emit({ index, field, value });
20
34
  }
35
+ toggleRowClickAction(enabled) {
36
+ if (enabled) {
37
+ this.updateRowClickAction.emit({
38
+ type: 'open-drawer',
39
+ drawerTitle: 'Details',
40
+ drawerWidth: '760px',
41
+ });
42
+ }
43
+ else {
44
+ this.updateRowClickAction.emit(undefined);
45
+ }
46
+ }
47
+ updateRowActionField(field, value) {
48
+ const current = this.rowClickAction() ?? { type: 'open-drawer' };
49
+ const next = { ...current, [field]: value };
50
+ this.updateRowClickAction.emit(next);
51
+ }
52
+ addParameterMapping() {
53
+ const current = this.rowClickAction() ?? { type: 'open-drawer' };
54
+ const mapping = { ...(current.parameterMapping ?? {}) };
55
+ let idx = Object.keys(mapping).length + 1;
56
+ let key = `param${idx}`;
57
+ while (key in mapping) {
58
+ idx++;
59
+ key = `param${idx}`;
60
+ }
61
+ mapping[key] = 'row.id';
62
+ this.updateRowClickAction.emit({ ...current, parameterMapping: mapping });
63
+ }
64
+ updateMappingKey(index, newKey) {
65
+ const pairs = this.parameterMappings();
66
+ if (!pairs[index])
67
+ return;
68
+ const nextMapping = {};
69
+ pairs.forEach((p, i) => {
70
+ const k = i === index ? newKey : p.key;
71
+ if (k.trim()) {
72
+ nextMapping[k.trim()] = p.value;
73
+ }
74
+ });
75
+ const current = this.rowClickAction() ?? { type: 'open-drawer' };
76
+ this.updateRowClickAction.emit({ ...current, parameterMapping: nextMapping });
77
+ }
78
+ updateMappingValue(index, newValue) {
79
+ const pairs = this.parameterMappings();
80
+ if (!pairs[index])
81
+ return;
82
+ const nextMapping = {};
83
+ pairs.forEach((p, i) => {
84
+ const v = i === index ? newValue : p.value;
85
+ if (p.key.trim()) {
86
+ nextMapping[p.key.trim()] = v;
87
+ }
88
+ });
89
+ const current = this.rowClickAction() ?? { type: 'open-drawer' };
90
+ this.updateRowClickAction.emit({ ...current, parameterMapping: nextMapping });
91
+ }
92
+ removeMapping(index) {
93
+ const pairs = this.parameterMappings();
94
+ const nextMapping = {};
95
+ pairs.forEach((p, i) => {
96
+ if (i !== index && p.key.trim()) {
97
+ nextMapping[p.key.trim()] = p.value;
98
+ }
99
+ });
100
+ const current = this.rowClickAction() ?? { type: 'open-drawer' };
101
+ this.updateRowClickAction.emit({ ...current, parameterMapping: nextMapping });
102
+ }
21
103
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
22
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorGridComponent, isStandalone: true, selector: "rpt-property-editor-grid", inputs: { grid: { classPropertyName: "grid", publicName: "grid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { addGrid: "addGrid", removeGrid: "removeGrid", addColumn: "addColumn", removeColumn: "removeColumn", updateColumn: "updateColumn", updateOption: "updateOption" }, ngImport: i0, template: `
104
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorGridComponent, isStandalone: true, selector: "rpt-property-editor-grid", inputs: { grid: { classPropertyName: "grid", publicName: "grid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { addGrid: "addGrid", removeGrid: "removeGrid", addColumn: "addColumn", autoDetectColumns: "autoDetectColumns", removeColumn: "removeColumn", updateColumn: "updateColumn", updateOption: "updateOption", updateRowClickAction: "updateRowClickAction" }, ngImport: i0, template: `
23
105
  @if (!grid()) {
24
106
  <div class="empty-grid-card">
25
107
  <div class="empty-grid-icon">
@@ -37,10 +119,22 @@ export class PropertyEditorGridComponent {
37
119
  <div class="property-group">
38
120
  <div class="group-header-with-btn">
39
121
  <span class="group-title">Columns ({{ columns().length }})</span>
40
- <button type="button" class="btn-add-col" (click)="addColumn.emit()">
41
- <rpt-icon name="plus" [size]="12" />
42
- <span>Add Column</span>
43
- </button>
122
+ <div style="display: flex; gap: 4px;">
123
+ <button
124
+ type="button"
125
+ class="btn-add-col"
126
+ style="background: #eff6ff; color: #2563eb; border-color: #bfdbfe;"
127
+ (click)="autoDetectColumns.emit()"
128
+ title="Auto-detect all columns from procedure or data table"
129
+ >
130
+ <rpt-icon name="refresh" [size]="11" />
131
+ <span>Auto-Detect</span>
132
+ </button>
133
+ <button type="button" class="btn-add-col" (click)="addColumn.emit()">
134
+ <rpt-icon name="plus" [size]="12" />
135
+ <span>Add Column</span>
136
+ </button>
137
+ </div>
44
138
  </div>
45
139
 
46
140
  <div class="columns-editor-list">
@@ -155,6 +249,14 @@ export class PropertyEditorGridComponent {
155
249
  />
156
250
  <span>Visible</span>
157
251
  </label>
252
+ <label class="col-checkbox-toggle">
253
+ <input
254
+ type="checkbox"
255
+ [ngModel]="col.checkboxSelection ?? false"
256
+ (ngModelChange)="onUpdateCol(idx, 'checkboxSelection', $event)"
257
+ />
258
+ <span>Checkbox</span>
259
+ </label>
158
260
  </div>
159
261
  </div>
160
262
  </div>
@@ -166,6 +268,39 @@ export class PropertyEditorGridComponent {
166
268
  <div class="property-group">
167
269
  <div class="group-title">Table Options</div>
168
270
 
271
+ <div class="field-row">
272
+ <label class="checkbox-toggle">
273
+ <input
274
+ type="checkbox"
275
+ [ngModel]="grid()?.options?.sideBar !== false"
276
+ (ngModelChange)="updateOption.emit({ field: 'sideBar', value: $event })"
277
+ />
278
+ <span>Enable Side Panel (Tool Panels)</span>
279
+ </label>
280
+ </div>
281
+
282
+ <div class="field-row">
283
+ <label class="checkbox-toggle">
284
+ <input
285
+ type="checkbox"
286
+ [ngModel]="grid()?.options?.globalSearch !== false"
287
+ (ngModelChange)="updateOption.emit({ field: 'globalSearch', value: $event })"
288
+ />
289
+ <span>Global Search Box</span>
290
+ </label>
291
+ </div>
292
+
293
+ <div class="field-row">
294
+ <label class="checkbox-toggle">
295
+ <input
296
+ type="checkbox"
297
+ [ngModel]="grid()?.options?.statusBar !== false"
298
+ (ngModelChange)="updateOption.emit({ field: 'statusBar', value: $event })"
299
+ />
300
+ <span>Status Bar</span>
301
+ </label>
302
+ </div>
303
+
169
304
  <div class="field-row">
170
305
  <label class="checkbox-toggle">
171
306
  <input
@@ -188,6 +323,44 @@ export class PropertyEditorGridComponent {
188
323
  </label>
189
324
  </div>
190
325
 
326
+ @if (grid()?.options?.selectable) {
327
+ <div class="field-row">
328
+ <label class="field-label">Selection Mode</label>
329
+ <select
330
+ class="field-input"
331
+ [ngModel]="grid()?.options?.selectionMode ?? 'multiple'"
332
+ (ngModelChange)="updateOption.emit({ field: 'selectionMode', value: $event })"
333
+ >
334
+ <option value="multiple">Multiple Rows</option>
335
+ <option value="single">Single Row</option>
336
+ </select>
337
+ </div>
338
+
339
+ <div class="field-row">
340
+ <label class="checkbox-toggle">
341
+ <input
342
+ type="checkbox"
343
+ [ngModel]="grid()?.options?.checkboxSelection ?? true"
344
+ (ngModelChange)="updateOption.emit({ field: 'checkboxSelection', value: $event })"
345
+ />
346
+ <span>Checkbox Selection</span>
347
+ </label>
348
+ </div>
349
+
350
+ @if ((grid()?.options?.selectionMode ?? 'multiple') === 'multiple') {
351
+ <div class="field-row">
352
+ <label class="checkbox-toggle">
353
+ <input
354
+ type="checkbox"
355
+ [ngModel]="grid()?.options?.headerCheckboxSelection ?? true"
356
+ (ngModelChange)="updateOption.emit({ field: 'headerCheckboxSelection', value: $event })"
357
+ />
358
+ <span>Header Select All Checkbox</span>
359
+ </label>
360
+ </div>
361
+ }
362
+ }
363
+
191
364
  <div class="field-row">
192
365
  <label class="checkbox-toggle">
193
366
  <input
@@ -245,6 +418,152 @@ export class PropertyEditorGridComponent {
245
418
  </div>
246
419
  </div>
247
420
 
421
+ <!-- Row Click & Drill-Down Action Group -->
422
+ <div class="property-group">
423
+ <div class="group-title">Row Click & Drill-Down</div>
424
+
425
+ <div class="field-row">
426
+ <label class="checkbox-toggle">
427
+ <input
428
+ type="checkbox"
429
+ [ngModel]="hasRowClickAction()"
430
+ (ngModelChange)="toggleRowClickAction($event)"
431
+ />
432
+ <span>Enable Row Click Action</span>
433
+ </label>
434
+ </div>
435
+
436
+ @if (hasRowClickAction()) {
437
+ <div class="field-row">
438
+ <label class="field-label">Action Type</label>
439
+ <select
440
+ class="field-input field-select"
441
+ [ngModel]="rowClickAction()?.type || 'open-drawer'"
442
+ (ngModelChange)="updateRowActionField('type', $event)"
443
+ >
444
+ <option value="open-drawer">Slide-Over Detail Drawer</option>
445
+ <option value="drilldown-report">Drill-Down Report (Host Event)</option>
446
+ <option value="navigate">Navigate to URL</option>
447
+ <option value="emit-custom">Emit Custom Action</option>
448
+ </select>
449
+ </div>
450
+
451
+ @if (rowClickAction()?.type === 'open-drawer' || rowClickAction()?.type === 'drilldown-report') {
452
+ <div class="field-row">
453
+ <label class="field-label">Target Report ID</label>
454
+ <input
455
+ type="text"
456
+ class="field-input"
457
+ placeholder="e.g. order-details"
458
+ [ngModel]="rowClickAction()?.targetReportId || ''"
459
+ (ngModelChange)="updateRowActionField('targetReportId', $event)"
460
+ />
461
+ </div>
462
+
463
+ <div class="field-row">
464
+ <label class="field-label">Drawer Title</label>
465
+ <input
466
+ type="text"
467
+ class="field-input"
468
+ placeholder="e.g. Order Details"
469
+ [ngModel]="rowClickAction()?.drawerTitle || ''"
470
+ (ngModelChange)="updateRowActionField('drawerTitle', $event)"
471
+ />
472
+ </div>
473
+
474
+ <div class="field-row">
475
+ <label class="field-label">Drawer Width</label>
476
+ <input
477
+ type="text"
478
+ class="field-input"
479
+ placeholder="e.g. 760px, 80%, 900px"
480
+ [ngModel]="rowClickAction()?.drawerWidth || '760px'"
481
+ (ngModelChange)="updateRowActionField('drawerWidth', $event)"
482
+ />
483
+ </div>
484
+ }
485
+
486
+ @if (rowClickAction()?.type === 'navigate') {
487
+ <div class="field-row">
488
+ <label class="field-label">Target URL</label>
489
+ <input
490
+ type="text"
491
+ class="field-input"
492
+ [placeholder]="'/orders/{{row.orderId}} or https://...'"
493
+ [ngModel]="rowClickAction()?.targetUrl || ''"
494
+ (ngModelChange)="updateRowActionField('targetUrl', $event)"
495
+ />
496
+ </div>
497
+ <div class="field-row">
498
+ <label class="checkbox-toggle">
499
+ <input
500
+ type="checkbox"
501
+ [ngModel]="rowClickAction()?.openNewTab ?? false"
502
+ (ngModelChange)="updateRowActionField('openNewTab', $event)"
503
+ />
504
+ <span>Open in New Tab</span>
505
+ </label>
506
+ </div>
507
+ }
508
+
509
+ @if (rowClickAction()?.type === 'emit-custom') {
510
+ <div class="field-row">
511
+ <label class="field-label">Custom Action Name</label>
512
+ <input
513
+ type="text"
514
+ class="field-input"
515
+ placeholder="e.g. view-audit-trail"
516
+ [ngModel]="rowClickAction()?.customActionName || ''"
517
+ (ngModelChange)="updateRowActionField('customActionName', $event)"
518
+ />
519
+ </div>
520
+ }
521
+
522
+ <div class="field-row">
523
+ <div class="field-label-row">
524
+ <label class="field-label">Parameter Mapping</label>
525
+ <button
526
+ type="button"
527
+ class="btn-add-mapping"
528
+ (click)="addParameterMapping()"
529
+ >
530
+ + Add Mapping
531
+ </button>
532
+ </div>
533
+
534
+ @for (mapping of parameterMappings(); track mapping.key; let mIdx = $index) {
535
+ <div class="mapping-pair-row">
536
+ <input
537
+ type="text"
538
+ class="col-mini-input"
539
+ style="flex: 1;"
540
+ placeholder="Target (e.g. customerId)"
541
+ [ngModel]="mapping.key"
542
+ (ngModelChange)="updateMappingKey(mIdx, $event)"
543
+ />
544
+ <span style="font-size: 0.75rem; color: #94a3b8;">←</span>
545
+ <input
546
+ type="text"
547
+ class="col-mini-input"
548
+ style="flex: 1;"
549
+ placeholder="Source (e.g. row.id)"
550
+ [ngModel]="mapping.value"
551
+ (ngModelChange)="updateMappingValue(mIdx, $event)"
552
+ />
553
+ <button
554
+ type="button"
555
+ class="col-action-btn btn-delete"
556
+ (click)="removeMapping(mIdx)"
557
+ title="Remove mapping"
558
+ >
559
+ <rpt-icon name="trash" [size]="11" />
560
+ </button>
561
+ </div>
562
+ }
563
+ </div>
564
+ }
565
+ </div>
566
+
248
567
  <!-- Remove Grid Action -->
249
568
  <div class="grid-danger-zone">
250
569
  <button type="button" class="btn-remove-grid-action" (click)="removeGrid.emit()">
@@ -254,7 +573,7 @@ export class PropertyEditorGridComponent {
254
573
  </div>
255
574
  </div>
256
575
  }
257
- `, isInline: true, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".empty-grid-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 16px;text-align:center;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;margin:10px 0}.empty-grid-icon{width:48px;height:48px;border-radius:10px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;margin-bottom:12px}.empty-grid-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0 0 6px}.empty-grid-desc{font-size:.775rem;color:#64748b;margin:0 0 18px;line-height:1.4;max-width:280px}.btn-create-grid-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;background:#2563eb;color:#fff;font-size:.775rem;font-weight:600;border:none;border-radius:6px;cursor:pointer;box-shadow:0 2px 4px #2563eb33;transition:all .15s ease}.btn-create-grid-action:hover{background:#1d4ed8;box-shadow:0 4px 8px #2563eb40}.grid-danger-zone{margin-top:10px;padding-top:16px;border-top:1px dashed #e2e8f0;display:flex;justify-content:center}.btn-remove-grid-action{display:inline-flex;align-items:center;gap:6px;background:#fee2e2;border:1px solid #fecaca;color:#dc2626;font-size:.75rem;font-weight:600;padding:6px 12px;border-radius:6px;cursor:pointer;transition:all .15s ease}.btn-remove-grid-action:hover{background:#fecaca;border-color:#f87171;color:#b91c1c}.props-form{display:flex;flex-direction:column;gap:20px}.group-header-with-btn{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:8px;margin-bottom:4px}.btn-add-col{display:inline-flex;align-items:center;gap:5px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;padding:4px 10px;font-size:.725rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .15s ease}.btn-add-col:hover{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.columns-editor-list{display:flex;flex-direction:column;gap:10px}.col-edit-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;position:relative;overflow:hidden;display:flex;flex-direction:column}.col-edit-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a}.col-card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);min-height:32px;box-sizing:border-box}.col-header-title-group{display:flex;align-items:center;gap:5px;min-width:0;flex:1}.col-drag-dots{color:#94a3b8;font-size:.8rem;cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;padding-left:2px}.col-idx-badge{font-size:.65rem;font-weight:700;color:#64748b;background:#e2e8f0;padding:1px 5px;border-radius:3px;letter-spacing:.02em}.col-title-input{flex:1;border:1px solid transparent;background:transparent;font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:2px 6px;border-radius:4px;outline:none;transition:all .15s ease}.col-title-input:hover{border-color:#cbd5e1;background:#fff}.col-title-input:focus{border-color:var(--rpt-color-primary, #2563eb);background:#fff;box-shadow:0 0 0 2px #2563eb26}.col-card-actions{display:flex;align-items:center;gap:4px}.col-type-pill{font-size:.625rem;font-weight:700;color:#1e40af;background:#dbeafe;border:1px solid #bfdbfe;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}.col-action-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.col-action-btn.btn-delete:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.col-card-body{padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:#fff}.col-edit-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px}.col-field-item{display:flex;flex-direction:column;gap:2px;min-width:0}.mini-label{font-size:.625rem;font-weight:600;color:#64748b;letter-spacing:.02em}.col-mini-input,.col-mini-select{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:3px;padding:3px 5px;font-size:.7rem;color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all .12s ease}.col-mini-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 4px center;background-size:10px 10px;padding-right:16px;cursor:pointer}.col-mini-input:focus,.col-mini-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb26}.col-card-footer{display:flex;align-items:center;justify-content:flex-end;padding-top:4px;border-top:1px dashed #e2e8f0;margin-top:2px}.col-checkbox-toggle{display:inline-flex;align-items:center;gap:5px;font-size:.675rem;font-weight:500;color:#475569;cursor:pointer;-webkit-user-select:none;user-select:none}\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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { 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.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
576
+ `, isInline: true, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".empty-grid-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 16px;text-align:center;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;margin:10px 0}.empty-grid-icon{width:48px;height:48px;border-radius:10px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;margin-bottom:12px}.empty-grid-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0 0 6px}.empty-grid-desc{font-size:.775rem;color:#64748b;margin:0 0 18px;line-height:1.4;max-width:280px}.btn-create-grid-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;background:#2563eb;color:#fff;font-size:.775rem;font-weight:600;border:none;border-radius:6px;cursor:pointer;box-shadow:0 2px 4px #2563eb33;transition:all .15s ease}.btn-create-grid-action:hover{background:#1d4ed8;box-shadow:0 4px 8px #2563eb40}.grid-danger-zone{margin-top:10px;padding-top:16px;border-top:1px dashed #e2e8f0;display:flex;justify-content:center}.btn-remove-grid-action{display:inline-flex;align-items:center;gap:6px;background:#fee2e2;border:1px solid #fecaca;color:#dc2626;font-size:.75rem;font-weight:600;padding:6px 12px;border-radius:6px;cursor:pointer;transition:all .15s ease}.btn-remove-grid-action:hover{background:#fecaca;border-color:#f87171;color:#b91c1c}.props-form{display:flex;flex-direction:column;gap:20px}.group-header-with-btn{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:8px;margin-bottom:4px}.btn-add-col{display:inline-flex;align-items:center;gap:5px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;padding:4px 10px;font-size:.725rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .15s ease}.btn-add-col:hover{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.columns-editor-list{display:flex;flex-direction:column;gap:10px}.col-edit-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;position:relative;overflow:hidden;display:flex;flex-direction:column}.col-edit-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a}.col-card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);min-height:32px;box-sizing:border-box}.col-header-title-group{display:flex;align-items:center;gap:5px;min-width:0;flex:1}.col-drag-dots{color:#94a3b8;font-size:.8rem;cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;padding-left:2px}.col-idx-badge{font-size:.65rem;font-weight:700;color:#64748b;background:#e2e8f0;padding:1px 5px;border-radius:3px;letter-spacing:.02em}.col-title-input{flex:1;border:1px solid transparent;background:transparent;font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:2px 6px;border-radius:4px;outline:none;transition:all .15s ease}.col-title-input:hover{border-color:#cbd5e1;background:#fff}.col-title-input:focus{border-color:var(--rpt-color-primary, #2563eb);background:#fff;box-shadow:0 0 0 2px #2563eb26}.col-card-actions{display:flex;align-items:center;gap:4px}.col-type-pill{font-size:.625rem;font-weight:700;color:#1e40af;background:#dbeafe;border:1px solid #bfdbfe;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}.col-action-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.col-action-btn.btn-delete:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.col-card-body{padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:#fff}.col-edit-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px}.col-field-item{display:flex;flex-direction:column;gap:2px;min-width:0}.mini-label{font-size:.625rem;font-weight:600;color:#64748b;letter-spacing:.02em}.col-mini-input,.col-mini-select{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:3px;padding:3px 5px;font-size:.7rem;color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all .12s ease}.col-mini-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 4px center;background-size:10px 10px;padding-right:16px;cursor:pointer}.col-mini-input:focus,.col-mini-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb26}.col-card-footer{display:flex;align-items:center;justify-content:flex-end;gap:12px;padding-top:4px;border-top:1px dashed #e2e8f0;margin-top:2px}.col-checkbox-toggle{display:inline-flex;align-items:center;gap:5px;font-size:.675rem;font-weight:500;color:#475569;cursor:pointer;-webkit-user-select:none;user-select:none}.btn-add-mapping{display:inline-flex;align-items:center;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-add-mapping:hover{background:#dbeafe}.mapping-pair-row{display:flex;align-items:center;gap:6px;margin-top:4px}\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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { 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.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
258
577
  }
259
578
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorGridComponent, decorators: [{
260
579
  type: Component,
@@ -276,10 +595,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
276
595
  <div class="property-group">
277
596
  <div class="group-header-with-btn">
278
597
  <span class="group-title">Columns ({{ columns().length }})</span>
279
- <button type="button" class="btn-add-col" (click)="addColumn.emit()">
280
- <rpt-icon name="plus" [size]="12" />
281
- <span>Add Column</span>
282
- </button>
598
+ <div style="display: flex; gap: 4px;">
599
+ <button
600
+ type="button"
601
+ class="btn-add-col"
602
+ style="background: #eff6ff; color: #2563eb; border-color: #bfdbfe;"
603
+ (click)="autoDetectColumns.emit()"
604
+ title="Auto-detect all columns from procedure or data table"
605
+ >
606
+ <rpt-icon name="refresh" [size]="11" />
607
+ <span>Auto-Detect</span>
608
+ </button>
609
+ <button type="button" class="btn-add-col" (click)="addColumn.emit()">
610
+ <rpt-icon name="plus" [size]="12" />
611
+ <span>Add Column</span>
612
+ </button>
613
+ </div>
283
614
  </div>
284
615
 
285
616
  <div class="columns-editor-list">
@@ -394,6 +725,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
394
725
  />
395
726
  <span>Visible</span>
396
727
  </label>
728
+ <label class="col-checkbox-toggle">
729
+ <input
730
+ type="checkbox"
731
+ [ngModel]="col.checkboxSelection ?? false"
732
+ (ngModelChange)="onUpdateCol(idx, 'checkboxSelection', $event)"
733
+ />
734
+ <span>Checkbox</span>
735
+ </label>
397
736
  </div>
398
737
  </div>
399
738
  </div>
@@ -405,6 +744,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
405
744
  <div class="property-group">
406
745
  <div class="group-title">Table Options</div>
407
746
 
747
+ <div class="field-row">
748
+ <label class="checkbox-toggle">
749
+ <input
750
+ type="checkbox"
751
+ [ngModel]="grid()?.options?.sideBar !== false"
752
+ (ngModelChange)="updateOption.emit({ field: 'sideBar', value: $event })"
753
+ />
754
+ <span>Enable Side Panel (Tool Panels)</span>
755
+ </label>
756
+ </div>
757
+
758
+ <div class="field-row">
759
+ <label class="checkbox-toggle">
760
+ <input
761
+ type="checkbox"
762
+ [ngModel]="grid()?.options?.globalSearch !== false"
763
+ (ngModelChange)="updateOption.emit({ field: 'globalSearch', value: $event })"
764
+ />
765
+ <span>Global Search Box</span>
766
+ </label>
767
+ </div>
768
+
769
+ <div class="field-row">
770
+ <label class="checkbox-toggle">
771
+ <input
772
+ type="checkbox"
773
+ [ngModel]="grid()?.options?.statusBar !== false"
774
+ (ngModelChange)="updateOption.emit({ field: 'statusBar', value: $event })"
775
+ />
776
+ <span>Status Bar</span>
777
+ </label>
778
+ </div>
779
+
408
780
  <div class="field-row">
409
781
  <label class="checkbox-toggle">
410
782
  <input
@@ -427,6 +799,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
427
799
  </label>
428
800
  </div>
429
801
 
802
+ @if (grid()?.options?.selectable) {
803
+ <div class="field-row">
804
+ <label class="field-label">Selection Mode</label>
805
+ <select
806
+ class="field-input"
807
+ [ngModel]="grid()?.options?.selectionMode ?? 'multiple'"
808
+ (ngModelChange)="updateOption.emit({ field: 'selectionMode', value: $event })"
809
+ >
810
+ <option value="multiple">Multiple Rows</option>
811
+ <option value="single">Single Row</option>
812
+ </select>
813
+ </div>
814
+
815
+ <div class="field-row">
816
+ <label class="checkbox-toggle">
817
+ <input
818
+ type="checkbox"
819
+ [ngModel]="grid()?.options?.checkboxSelection ?? true"
820
+ (ngModelChange)="updateOption.emit({ field: 'checkboxSelection', value: $event })"
821
+ />
822
+ <span>Checkbox Selection</span>
823
+ </label>
824
+ </div>
825
+
826
+ @if ((grid()?.options?.selectionMode ?? 'multiple') === 'multiple') {
827
+ <div class="field-row">
828
+ <label class="checkbox-toggle">
829
+ <input
830
+ type="checkbox"
831
+ [ngModel]="grid()?.options?.headerCheckboxSelection ?? true"
832
+ (ngModelChange)="updateOption.emit({ field: 'headerCheckboxSelection', value: $event })"
833
+ />
834
+ <span>Header Select All Checkbox</span>
835
+ </label>
836
+ </div>
837
+ }
838
+ }
839
+
430
840
  <div class="field-row">
431
841
  <label class="checkbox-toggle">
432
842
  <input
@@ -484,6 +894,152 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
484
894
  </div>
485
895
  </div>
486
896
 
897
+ <!-- Row Click & Drill-Down Action Group -->
898
+ <div class="property-group">
899
+ <div class="group-title">Row Click & Drill-Down</div>
900
+
901
+ <div class="field-row">
902
+ <label class="checkbox-toggle">
903
+ <input
904
+ type="checkbox"
905
+ [ngModel]="hasRowClickAction()"
906
+ (ngModelChange)="toggleRowClickAction($event)"
907
+ />
908
+ <span>Enable Row Click Action</span>
909
+ </label>
910
+ </div>
911
+
912
+ @if (hasRowClickAction()) {
913
+ <div class="field-row">
914
+ <label class="field-label">Action Type</label>
915
+ <select
916
+ class="field-input field-select"
917
+ [ngModel]="rowClickAction()?.type || 'open-drawer'"
918
+ (ngModelChange)="updateRowActionField('type', $event)"
919
+ >
920
+ <option value="open-drawer">Slide-Over Detail Drawer</option>
921
+ <option value="drilldown-report">Drill-Down Report (Host Event)</option>
922
+ <option value="navigate">Navigate to URL</option>
923
+ <option value="emit-custom">Emit Custom Action</option>
924
+ </select>
925
+ </div>
926
+
927
+ @if (rowClickAction()?.type === 'open-drawer' || rowClickAction()?.type === 'drilldown-report') {
928
+ <div class="field-row">
929
+ <label class="field-label">Target Report ID</label>
930
+ <input
931
+ type="text"
932
+ class="field-input"
933
+ placeholder="e.g. order-details"
934
+ [ngModel]="rowClickAction()?.targetReportId || ''"
935
+ (ngModelChange)="updateRowActionField('targetReportId', $event)"
936
+ />
937
+ </div>
938
+
939
+ <div class="field-row">
940
+ <label class="field-label">Drawer Title</label>
941
+ <input
942
+ type="text"
943
+ class="field-input"
944
+ placeholder="e.g. Order Details"
945
+ [ngModel]="rowClickAction()?.drawerTitle || ''"
946
+ (ngModelChange)="updateRowActionField('drawerTitle', $event)"
947
+ />
948
+ </div>
949
+
950
+ <div class="field-row">
951
+ <label class="field-label">Drawer Width</label>
952
+ <input
953
+ type="text"
954
+ class="field-input"
955
+ placeholder="e.g. 760px, 80%, 900px"
956
+ [ngModel]="rowClickAction()?.drawerWidth || '760px'"
957
+ (ngModelChange)="updateRowActionField('drawerWidth', $event)"
958
+ />
959
+ </div>
960
+ }
961
+
962
+ @if (rowClickAction()?.type === 'navigate') {
963
+ <div class="field-row">
964
+ <label class="field-label">Target URL</label>
965
+ <input
966
+ type="text"
967
+ class="field-input"
968
+ [placeholder]="'/orders/{{row.orderId}} or https://...'"
969
+ [ngModel]="rowClickAction()?.targetUrl || ''"
970
+ (ngModelChange)="updateRowActionField('targetUrl', $event)"
971
+ />
972
+ </div>
973
+ <div class="field-row">
974
+ <label class="checkbox-toggle">
975
+ <input
976
+ type="checkbox"
977
+ [ngModel]="rowClickAction()?.openNewTab ?? false"
978
+ (ngModelChange)="updateRowActionField('openNewTab', $event)"
979
+ />
980
+ <span>Open in New Tab</span>
981
+ </label>
982
+ </div>
983
+ }
984
+
985
+ @if (rowClickAction()?.type === 'emit-custom') {
986
+ <div class="field-row">
987
+ <label class="field-label">Custom Action Name</label>
988
+ <input
989
+ type="text"
990
+ class="field-input"
991
+ placeholder="e.g. view-audit-trail"
992
+ [ngModel]="rowClickAction()?.customActionName || ''"
993
+ (ngModelChange)="updateRowActionField('customActionName', $event)"
994
+ />
995
+ </div>
996
+ }
997
+
998
+ <div class="field-row">
999
+ <div class="field-label-row">
1000
+ <label class="field-label">Parameter Mapping</label>
1001
+ <button
1002
+ type="button"
1003
+ class="btn-add-mapping"
1004
+ (click)="addParameterMapping()"
1005
+ >
1006
+ + Add Mapping
1007
+ </button>
1008
+ </div>
1009
+
1010
+ @for (mapping of parameterMappings(); track mapping.key; let mIdx = $index) {
1011
+ <div class="mapping-pair-row">
1012
+ <input
1013
+ type="text"
1014
+ class="col-mini-input"
1015
+ style="flex: 1;"
1016
+ placeholder="Target (e.g. customerId)"
1017
+ [ngModel]="mapping.key"
1018
+ (ngModelChange)="updateMappingKey(mIdx, $event)"
1019
+ />
1020
+ <span style="font-size: 0.75rem; color: #94a3b8;">←</span>
1021
+ <input
1022
+ type="text"
1023
+ class="col-mini-input"
1024
+ style="flex: 1;"
1025
+ placeholder="Source (e.g. row.id)"
1026
+ [ngModel]="mapping.value"
1027
+ (ngModelChange)="updateMappingValue(mIdx, $event)"
1028
+ />
1029
+ <button
1030
+ type="button"
1031
+ class="col-action-btn btn-delete"
1032
+ (click)="removeMapping(mIdx)"
1033
+ title="Remove mapping"
1034
+ >
1035
+ <rpt-icon name="trash" [size]="11" />
1036
+ </button>
1037
+ </div>
1038
+ }
1039
+ </div>
1040
+ }
1041
+ </div>
1042
+
487
1043
  <!-- Remove Grid Action -->
488
1044
  <div class="grid-danger-zone">
489
1045
  <button type="button" class="btn-remove-grid-action" (click)="removeGrid.emit()">
@@ -493,6 +1049,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
493
1049
  </div>
494
1050
  </div>
495
1051
  }
496
- `, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".empty-grid-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 16px;text-align:center;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;margin:10px 0}.empty-grid-icon{width:48px;height:48px;border-radius:10px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;margin-bottom:12px}.empty-grid-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0 0 6px}.empty-grid-desc{font-size:.775rem;color:#64748b;margin:0 0 18px;line-height:1.4;max-width:280px}.btn-create-grid-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;background:#2563eb;color:#fff;font-size:.775rem;font-weight:600;border:none;border-radius:6px;cursor:pointer;box-shadow:0 2px 4px #2563eb33;transition:all .15s ease}.btn-create-grid-action:hover{background:#1d4ed8;box-shadow:0 4px 8px #2563eb40}.grid-danger-zone{margin-top:10px;padding-top:16px;border-top:1px dashed #e2e8f0;display:flex;justify-content:center}.btn-remove-grid-action{display:inline-flex;align-items:center;gap:6px;background:#fee2e2;border:1px solid #fecaca;color:#dc2626;font-size:.75rem;font-weight:600;padding:6px 12px;border-radius:6px;cursor:pointer;transition:all .15s ease}.btn-remove-grid-action:hover{background:#fecaca;border-color:#f87171;color:#b91c1c}.props-form{display:flex;flex-direction:column;gap:20px}.group-header-with-btn{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:8px;margin-bottom:4px}.btn-add-col{display:inline-flex;align-items:center;gap:5px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;padding:4px 10px;font-size:.725rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .15s ease}.btn-add-col:hover{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.columns-editor-list{display:flex;flex-direction:column;gap:10px}.col-edit-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;position:relative;overflow:hidden;display:flex;flex-direction:column}.col-edit-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a}.col-card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);min-height:32px;box-sizing:border-box}.col-header-title-group{display:flex;align-items:center;gap:5px;min-width:0;flex:1}.col-drag-dots{color:#94a3b8;font-size:.8rem;cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;padding-left:2px}.col-idx-badge{font-size:.65rem;font-weight:700;color:#64748b;background:#e2e8f0;padding:1px 5px;border-radius:3px;letter-spacing:.02em}.col-title-input{flex:1;border:1px solid transparent;background:transparent;font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:2px 6px;border-radius:4px;outline:none;transition:all .15s ease}.col-title-input:hover{border-color:#cbd5e1;background:#fff}.col-title-input:focus{border-color:var(--rpt-color-primary, #2563eb);background:#fff;box-shadow:0 0 0 2px #2563eb26}.col-card-actions{display:flex;align-items:center;gap:4px}.col-type-pill{font-size:.625rem;font-weight:700;color:#1e40af;background:#dbeafe;border:1px solid #bfdbfe;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}.col-action-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.col-action-btn.btn-delete:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.col-card-body{padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:#fff}.col-edit-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px}.col-field-item{display:flex;flex-direction:column;gap:2px;min-width:0}.mini-label{font-size:.625rem;font-weight:600;color:#64748b;letter-spacing:.02em}.col-mini-input,.col-mini-select{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:3px;padding:3px 5px;font-size:.7rem;color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all .12s ease}.col-mini-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 4px center;background-size:10px 10px;padding-right:16px;cursor:pointer}.col-mini-input:focus,.col-mini-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb26}.col-card-footer{display:flex;align-items:center;justify-content:flex-end;padding-top:4px;border-top:1px dashed #e2e8f0;margin-top:2px}.col-checkbox-toggle{display:inline-flex;align-items:center;gap:5px;font-size:.675rem;font-weight:500;color:#475569;cursor:pointer;-webkit-user-select:none;user-select:none}\n"] }]
1052
+ `, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".empty-grid-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 16px;text-align:center;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;margin:10px 0}.empty-grid-icon{width:48px;height:48px;border-radius:10px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;margin-bottom:12px}.empty-grid-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0 0 6px}.empty-grid-desc{font-size:.775rem;color:#64748b;margin:0 0 18px;line-height:1.4;max-width:280px}.btn-create-grid-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;background:#2563eb;color:#fff;font-size:.775rem;font-weight:600;border:none;border-radius:6px;cursor:pointer;box-shadow:0 2px 4px #2563eb33;transition:all .15s ease}.btn-create-grid-action:hover{background:#1d4ed8;box-shadow:0 4px 8px #2563eb40}.grid-danger-zone{margin-top:10px;padding-top:16px;border-top:1px dashed #e2e8f0;display:flex;justify-content:center}.btn-remove-grid-action{display:inline-flex;align-items:center;gap:6px;background:#fee2e2;border:1px solid #fecaca;color:#dc2626;font-size:.75rem;font-weight:600;padding:6px 12px;border-radius:6px;cursor:pointer;transition:all .15s ease}.btn-remove-grid-action:hover{background:#fecaca;border-color:#f87171;color:#b91c1c}.props-form{display:flex;flex-direction:column;gap:20px}.group-header-with-btn{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:8px;margin-bottom:4px}.btn-add-col{display:inline-flex;align-items:center;gap:5px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;padding:4px 10px;font-size:.725rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .15s ease}.btn-add-col:hover{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.columns-editor-list{display:flex;flex-direction:column;gap:10px}.col-edit-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;position:relative;overflow:hidden;display:flex;flex-direction:column}.col-edit-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a}.col-card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);min-height:32px;box-sizing:border-box}.col-header-title-group{display:flex;align-items:center;gap:5px;min-width:0;flex:1}.col-drag-dots{color:#94a3b8;font-size:.8rem;cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;padding-left:2px}.col-idx-badge{font-size:.65rem;font-weight:700;color:#64748b;background:#e2e8f0;padding:1px 5px;border-radius:3px;letter-spacing:.02em}.col-title-input{flex:1;border:1px solid transparent;background:transparent;font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:2px 6px;border-radius:4px;outline:none;transition:all .15s ease}.col-title-input:hover{border-color:#cbd5e1;background:#fff}.col-title-input:focus{border-color:var(--rpt-color-primary, #2563eb);background:#fff;box-shadow:0 0 0 2px #2563eb26}.col-card-actions{display:flex;align-items:center;gap:4px}.col-type-pill{font-size:.625rem;font-weight:700;color:#1e40af;background:#dbeafe;border:1px solid #bfdbfe;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}.col-action-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.col-action-btn.btn-delete:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.col-card-body{padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:#fff}.col-edit-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px}.col-field-item{display:flex;flex-direction:column;gap:2px;min-width:0}.mini-label{font-size:.625rem;font-weight:600;color:#64748b;letter-spacing:.02em}.col-mini-input,.col-mini-select{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:3px;padding:3px 5px;font-size:.7rem;color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all .12s ease}.col-mini-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 4px center;background-size:10px 10px;padding-right:16px;cursor:pointer}.col-mini-input:focus,.col-mini-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb26}.col-card-footer{display:flex;align-items:center;justify-content:flex-end;gap:12px;padding-top:4px;border-top:1px dashed #e2e8f0;margin-top:2px}.col-checkbox-toggle{display:inline-flex;align-items:center;gap:5px;font-size:.675rem;font-weight:500;color:#475569;cursor:pointer;-webkit-user-select:none;user-select:none}.btn-add-mapping{display:inline-flex;align-items:center;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-add-mapping:hover{background:#dbeafe}.mapping-pair-row{display:flex;align-items:center;gap:6px;margin-top:4px}\n"] }]
497
1053
  }] });
498
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9wcm9wZXJ0eS1lZGl0b3IvcHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQzs7O0FBeWhCN0YsTUFBTSxPQUFPLDJCQUEyQjtJQUM3QixJQUFJLEdBQUcsS0FBSyxFQUFvQyxDQUFDO0lBRWpELE9BQU8sR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUN6QixVQUFVLEdBQUcsTUFBTSxFQUFRLENBQUM7SUFDNUIsU0FBUyxHQUFHLE1BQU0sRUFBUSxDQUFDO0lBQzNCLFlBQVksR0FBRyxNQUFNLEVBQVUsQ0FBQztJQUNoQyxZQUFZLEdBQUcsTUFBTSxFQUFvRCxDQUFDO0lBQzFFLFlBQVksR0FBRyxNQUFNLEVBQXFDLENBQUM7SUFFM0QsT0FBTyxHQUFHLFFBQVEsQ0FBeUIsR0FBRyxFQUFFO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxXQUFXLENBQUMsS0FBYSxFQUFFLEtBQWEsRUFBRSxLQUFjO1FBQ3RELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7d0dBaEJVLDJCQUEyQjs0RkFBM0IsMkJBQTJCLGtZQWpoQjVCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMk9ULDR4UEE5T1MsWUFBWSw4QkFBRSxXQUFXLG10REFBRSxnQkFBZ0I7OzRGQW9oQjFDLDJCQUEyQjtrQkF2aEJ2QyxTQUFTOytCQUNFLDBCQUEwQixjQUN4QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixDQUFDLG1CQUNyQyx1QkFBdUIsQ0FBQyxNQUFNLFlBRXJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMk9UIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEdyaWRDb2x1bW5EZWZpbml0aW9uLCBSZXBvcnRHcmlkRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1ncmlkLm1vZGVsJztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcHJvcGVydHktZWRpdG9yLWdyaWQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdHlsZVVybHM6IFsnLi9wcm9wZXJ0eS1lZGl0b3IuY29tbW9uLmNzcyddLFxuICB0ZW1wbGF0ZTogYFxuICAgIEBpZiAoIWdyaWQoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LWdyaWQtY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktZ3JpZC1pY29uXCI+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0YWJsZVwiIFtzaXplXT1cIjI4XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxoNCBjbGFzcz1cImVtcHR5LWdyaWQtdGl0bGVcIj5ObyBSZXN1bHQgR3JpZCBBdHRhY2hlZDwvaDQ+XG4gICAgICAgIDxwIGNsYXNzPVwiZW1wdHktZ3JpZC1kZXNjXCI+QXR0YWNoIGFuIGludGVyYWN0aXZlIFJlc3VsdCBEYXRhIEdyaWQgKG9yIFVsdHJhR3JpZCkgdG8gdGhpcyByZXBvcnQgZGVmaW5pdGlvbiB0byByZW5kZXIgcXVlcmllcyBhbmQgc3RvcmVkIHByb2NlZHVyZSByZXN1bHRzLjwvcD5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY3JlYXRlLWdyaWQtYWN0aW9uXCIgKGNsaWNrKT1cImFkZEdyaWQuZW1pdCgpXCI+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJwbHVzXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgIDxzcGFuPisgQWRkIFJlc3VsdCBHcmlkPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cInByb3BzLWZvcm1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtaGVhZGVyLXdpdGgtYnRuXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJncm91cC10aXRsZVwiPkNvbHVtbnMgKHt7IGNvbHVtbnMoKS5sZW5ndGggfX0pPC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWFkZC1jb2xcIiAoY2xpY2spPVwiYWRkQ29sdW1uLmVtaXQoKVwiPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJwbHVzXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgPHNwYW4+QWRkIENvbHVtbjwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMtZWRpdG9yLWxpc3RcIj5cbiAgICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1ucygpOyB0cmFjayBjb2wuZmllbGQ7IGxldCBpZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZWRpdC1jYXJkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWhlYWRlci10aXRsZS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2wtZHJhZy1kb3RzXCI+4ouu4ouuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2wtaWR4LWJhZGdlXCI+I3t7IGlkeCArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC10aXRsZS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29sdW1uIExhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnbGFiZWwnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1jYXJkLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sLXR5cGUtcGlsbFwiPnt7IGNvbC5kYXRhVHlwZSB8fCAnc3RyaW5nJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWFjdGlvbi1idG4gYnRuLWRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDb2x1bW4uZW1pdChpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJSZW1vdmUgQ29sdW1uXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0cmFzaFwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWNhcmQtYm9keVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZWRpdC1maWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZmllbGQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbmktbGFiZWxcIj5GaWVsZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnZmllbGQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmRhdGFUeXBlIHx8ICdzdHJpbmcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdkYXRhVHlwZScsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInN0cmluZ1wiPlN0cmluZzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJudW1iZXJcIj5OdW1iZXI8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY3VycmVuY3lcIj5DdXJyZW5jeTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkYXRlXCI+RGF0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJib29sZWFuXCI+Qm9vbGVhbjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPkZvcm1hdDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBkZC9NTS95eXl5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2wuZm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdmb3JtYXQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPkFsaWduPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbWluaS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC5hbGlnbiB8fCAnbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ2FsaWduJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibGVmdFwiPkxlZnQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY2VudGVyXCI+Q2VudGVyPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJpZ2h0XCI+UmlnaHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZmllbGQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbmktbGFiZWxcIj5BZ2dyZWdhdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmFnZ3JlZ2F0ZSB8fCAnbm9uZSdcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ2FnZ3JlZ2F0ZScsICRldmVudCA9PT0gJ25vbmUnID8gdW5kZWZpbmVkIDogJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibm9uZVwiPk5vbmU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic3VtXCI+U3VtPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImF2Z1wiPkF2ZXJhZ2U8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY291bnRcIj5Db3VudDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtaW5cIj5NaW48L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibWF4XCI+TWF4PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWZpZWxkLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW5pLWxhYmVsXCI+V2lkdGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC53aWR0aCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnd2lkdGgnLCAkZXZlbnQgfHwgdW5kZWZpbmVkKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtY2FyZC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1jaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2wudmlzaWJsZSAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ3Zpc2libGUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+VmlzaWJsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEdyaWQgVGFibGUgT3B0aW9ucyBHcm91cCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtdGl0bGVcIj5UYWJsZSBPcHRpb25zPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8ucGFnaW5hdGlvbiA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3BhZ2luYXRpb24nLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5FbmFibGUgUGFnaW5hdGlvbjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zZWxlY3RhYmxlID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3NlbGVjdGFibGUnLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5Sb3cgU2VsZWN0aW9uPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LmFsbG93Q29sdW1uUmVvcmRlciA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ2FsbG93Q29sdW1uUmVvcmRlcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPkFsbG93IENvbHVtbiBSZW9yZGVyPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LmFsbG93RXhwb3J0ID8/IHRydWVcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnYWxsb3dFeHBvcnQnLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5BbGxvdyBFeHBvcnQ8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+UGFnZSBTaXplPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICBtaW49XCI1XCJcbiAgICAgICAgICAgIG1heD1cIjEwMFwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LnBhZ2VTaXplID8/IDEwXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdwYWdlU2l6ZScsIHZhbHVlOiArJGV2ZW50IH0pXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zaG93Um93TnVtYmVycyA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3Nob3dSb3dOdW1iZXJzJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+U2hvdyBSb3cgTnVtYmVyczwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zaG93Rm9vdGVyID8/IHRydWVcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2hvd0Zvb3RlcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPlNob3cgRm9vdGVyIFRvdGFsczwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFJlbW92ZSBHcmlkIEFjdGlvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWRhbmdlci16b25lXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLXJlbW92ZS1ncmlkLWFjdGlvblwiIChjbGljayk9XCJyZW1vdmVHcmlkLmVtaXQoKVwiPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidHJhc2hcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgPHNwYW4+UmVtb3ZlIEdyaWQgZnJvbSBSZXBvcnQ8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgfVxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLmVtcHR5LWdyaWQtY2FyZCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIHBhZGRpbmc6IDQwcHggMTZweDtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIGJvcmRlcjogMnB4IGRhc2hlZCAjY2JkNWUxO1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIG1hcmdpbjogMTBweCAwO1xuICAgIH1cbiAgICAuZW1wdHktZ3JpZC1pY29uIHtcbiAgICAgIHdpZHRoOiA0OHB4O1xuICAgICAgaGVpZ2h0OiA0OHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICBjb2xvcjogIzI1NjNlYjtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICAgIH1cbiAgICAuZW1wdHktZ3JpZC10aXRsZSB7XG4gICAgICBmb250LXNpemU6IDAuOTVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBtYXJnaW46IDAgMCA2cHggMDtcbiAgICB9XG4gICAgLmVtcHR5LWdyaWQtZGVzYyB7XG4gICAgICBmb250LXNpemU6IDAuNzc1cmVtO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBtYXJnaW46IDAgMCAxOHB4IDA7XG4gICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgICAgbWF4LXdpZHRoOiAyODBweDtcbiAgICB9XG4gICAgLmJ0bi1jcmVhdGUtZ3JpZC1hY3Rpb24ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBwYWRkaW5nOiA4cHggMTZweDtcbiAgICAgIGJhY2tncm91bmQ6ICMyNTYzZWI7XG4gICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgIGZvbnQtc2l6ZTogMC43NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMzcsIDk5LCAyMzUsIDAuMik7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgZWFzZTtcbiAgICB9XG4gICAgLmJ0bi1jcmVhdGUtZ3JpZC1hY3Rpb246aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogIzFkNGVkODtcbiAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjI1KTtcbiAgICB9XG4gICAgLmdyaWQtZGFuZ2VyLXpvbmUge1xuICAgICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICAgIHBhZGRpbmctdG9wOiAxNnB4O1xuICAgICAgYm9yZGVyLXRvcDogMXB4IGRhc2hlZCAjZTJlOGYwO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIH1cbiAgICAuYnRuLXJlbW92ZS1ncmlkLWFjdGlvbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZWUyZTI7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmVjYWNhO1xuICAgICAgY29sb3I6ICNkYzI2MjY7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcGFkZGluZzogNnB4IDEycHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgZWFzZTtcbiAgICB9XG4gICAgLmJ0bi1yZW1vdmUtZ3JpZC1hY3Rpb246aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2ZlY2FjYTtcbiAgICAgIGJvcmRlci1jb2xvcjogI2Y4NzE3MTtcbiAgICAgIGNvbG9yOiAjYjkxYzFjO1xuICAgIH1cbiAgICAucHJvcHMtZm9ybSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogMjBweDtcbiAgICB9XG4gICAgLmdyb3VwLWhlYWRlci13aXRoLWJ0biB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjZTJlOGYwKTtcbiAgICAgIHBhZGRpbmctYm90dG9tOiA4cHg7XG4gICAgICBtYXJnaW4tYm90dG9tOiA0cHg7XG4gICAgfVxuICAgIC5idG4tYWRkLWNvbCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDVweDtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYmZkYmZlO1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgcGFkZGluZzogNHB4IDEwcHg7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgZWFzZTtcbiAgICB9XG4gICAgLmJ0bi1hZGQtY29sOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgfVxuICAgIC5jb2x1bW5zLWVkaXRvci1saXN0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiAxMHB4O1xuICAgIH1cbiAgICAuY29sLWVkaXQtY2FyZCB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxLjVweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLCA2cHgpO1xuICAgICAgYm94LXNoYWRvdzogdmFyKC0tcnB0LWJveC1zaGFkb3csIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDUpKTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tcnB0LXRyYW5zaXRpb24tc3BlZWQsIDE1MG1zKSBlYXNlO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIH1cbiAgICAuY29sLWVkaXQtY2FyZDpob3ZlciB7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDZweCAtMXB4IHJnYmEoMzcsIDk5LCAyMzUsIDAuMSk7XG4gICAgfVxuICAgIC5jb2wtY2FyZC1oZWFkZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBnYXA6IDZweDtcbiAgICAgIHBhZGRpbmc6IDVweCA4cHg7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3Itc3VyZmFjZSwgI2Y4ZmFmYyk7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2UyZThmMCk7XG4gICAgICBtaW4taGVpZ2h0OiAzMnB4O1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG4gICAgLmNvbC1oZWFkZXItdGl0bGUtZ3JvdXAge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDVweDtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIGZsZXg6IDE7XG4gICAgfVxuICAgIC5jb2wtZHJhZy1kb3RzIHtcbiAgICAgIGNvbG9yOiAjOTRhM2I4O1xuICAgICAgZm9udC1zaXplOiAwLjhyZW07XG4gICAgICBjdXJzb3I6IGdyYWI7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgICAgcGFkZGluZy1sZWZ0OiAycHg7XG4gICAgfVxuICAgIC5jb2wtaWR4LWJhZGdlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGJhY2tncm91bmQ6ICNlMmU4ZjA7XG4gICAgICBwYWRkaW5nOiAxcHggNXB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTtcbiAgICB9XG4gICAgLmNvbC10aXRsZS1pbnB1dCB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQsICMwZjE3MmEpO1xuICAgICAgcGFkZGluZzogMnB4IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgZWFzZTtcbiAgICB9XG4gICAgLmNvbC10aXRsZS1pbnB1dDpob3ZlciB7XG4gICAgICBib3JkZXItY29sb3I6ICNjYmQ1ZTE7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgIH1cbiAgICAuY29sLXRpdGxlLWlucHV0OmZvY3VzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjE1KTtcbiAgICB9XG4gICAgLmNvbC1jYXJkLWFjdGlvbnMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDRweDtcbiAgICB9XG4gICAgLmNvbC10eXBlLXBpbGwge1xuICAgICAgZm9udC1zaXplOiAwLjYyNXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICBjb2xvcjogIzFlNDBhZjtcbiAgICAgIGJhY2tncm91bmQ6ICNkYmVhZmU7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYmZkYmZlO1xuICAgICAgcGFkZGluZzogMXB4IDVweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtO1xuICAgIH1cbiAgICAuY29sLWFjdGlvbi1idG4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHBhZGRpbmc6IDNweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxNTBtcyBlYXNlO1xuICAgIH1cbiAgICAuY29sLWFjdGlvbi1idG4uYnRuLWRlbGV0ZTpob3ZlciB7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLWRhbmdlciwgI2VmNDQ0NCk7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmVlMmUyO1xuICAgIH1cbiAgICAuY29sLWNhcmQtYm9keSB7XG4gICAgICBwYWRkaW5nOiA4cHggMTBweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgIH1cbiAgICAuY29sLWVkaXQtZmllbGRzIHtcbiAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCBtaW5tYXgoMCwgMWZyKSk7XG4gICAgICBnYXA6IDZweCA4cHg7XG4gICAgfVxuICAgIC5jb2wtZmllbGQtaXRlbSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogMnB4O1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgIH1cbiAgICAubWluaS1sYWJlbCB7XG4gICAgICBmb250LXNpemU6IDAuNjI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTtcbiAgICB9XG4gICAgLmNvbC1taW5pLWlucHV0LCAuY29sLW1pbmktc2VsZWN0IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNjYmQ1ZTEpO1xuICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgICAgcGFkZGluZzogM3B4IDVweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gICAgfVxuICAgIC5jb2wtbWluaS1zZWxlY3Qge1xuICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzNjQ3NDhiJyBzdHJva2Utd2lkdGg9JzIuMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BvbHlsaW5lIHBvaW50cz0nNiA5IDEyIDE1IDE4IDknJTNFJTNDL3BvbHlsaW5lJTNFJTNDL3N2ZyUzRVwiKTtcbiAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCA0cHggY2VudGVyO1xuICAgICAgYmFja2dyb3VuZC1zaXplOiAxMHB4IDEwcHg7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIH1cbiAgICAuY29sLW1pbmktaW5wdXQ6Zm9jdXMsIC5jb2wtbWluaS1zZWxlY3Q6Zm9jdXMge1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgzNywgOTksIDIzNSwgMC4xNSk7XG4gICAgfVxuICAgIC5jb2wtY2FyZC1mb290ZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgcGFkZGluZy10b3A6IDRweDtcbiAgICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQgI2UyZThmMDtcbiAgICAgIG1hcmdpbi10b3A6IDJweDtcbiAgICB9XG4gICAgLmNvbC1jaGVja2JveC10b2dnbGUge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBmb250LXNpemU6IDAuNjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiAjNDc1NTY5O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgXSxcbn0pXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JHcmlkQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgZ3JpZCA9IGlucHV0PFJlcG9ydEdyaWREZWZpbml0aW9uIHwgdW5kZWZpbmVkPigpO1xuXG4gIHJlYWRvbmx5IGFkZEdyaWQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgcmVtb3ZlR3JpZCA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBhZGRDb2x1bW4gPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgcmVtb3ZlQ29sdW1uID0gb3V0cHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlQ29sdW1uID0gb3V0cHV0PHsgaW5kZXg6IG51bWJlcjsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlT3B0aW9uID0gb3V0cHV0PHsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT4oKTtcblxuICByZWFkb25seSBjb2x1bW5zID0gY29tcHV0ZWQ8R3JpZENvbHVtbkRlZmluaXRpb25bXT4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmdyaWQoKT8uY29sdW1ucyA/PyBbXTtcbiAgfSk7XG5cbiAgb25VcGRhdGVDb2woaW5kZXg6IG51bWJlciwgZmllbGQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUNvbHVtbi5lbWl0KHsgaW5kZXgsIGZpZWxkLCB2YWx1ZSB9KTtcbiAgfVxufVxuIl19
1054
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9wcm9wZXJ0eS1lZGl0b3IvcHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQzs7O0FBNnhCN0YsTUFBTSxPQUFPLDJCQUEyQjtJQUM3QixJQUFJLEdBQUcsS0FBSyxFQUFvQyxDQUFDO0lBRWpELE9BQU8sR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUN6QixVQUFVLEdBQUcsTUFBTSxFQUFRLENBQUM7SUFDNUIsU0FBUyxHQUFHLE1BQU0sRUFBUSxDQUFDO0lBQzNCLGlCQUFpQixHQUFHLE1BQU0sRUFBUSxDQUFDO0lBQ25DLFlBQVksR0FBRyxNQUFNLEVBQVUsQ0FBQztJQUNoQyxZQUFZLEdBQUcsTUFBTSxFQUFvRCxDQUFDO0lBQzFFLFlBQVksR0FBRyxNQUFNLEVBQXFDLENBQUM7SUFDM0Qsb0JBQW9CLEdBQUcsTUFBTSxFQUFrQyxDQUFDO0lBRWhFLE9BQU8sR0FBRyxRQUFRLENBQXlCLEdBQUcsRUFBRTtRQUN2RCxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBRU0sY0FBYyxHQUFHLFFB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdkVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbnB1dCwgb3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uRGVmaW5pdGlvbiwgR3JpZFJvd0NsaWNrQWN0aW9uLCBSZXBvcnRHcmlkRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1ncmlkLm1vZGVsJztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcHJvcGVydHktZWRpdG9yLWdyaWQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdHlsZVVybHM6IFsnLi9wcm9wZXJ0eS1lZGl0b3IuY29tbW9uLmNzcyddLFxuICB0ZW1wbGF0ZTogYFxuICAgIEBpZiAoIWdyaWQoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LWdyaWQtY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktZ3JpZC1pY29uXCI+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0YWJsZVwiIFtzaXplXT1cIjI4XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxoNCBjbGFzcz1cImVtcHR5LWdyaWQtdGl0bGVcIj5ObyBSZXN1bHQgR3JpZCBBdHRhY2hlZDwvaDQ+XG4gICAgICAgIDxwIGNsYXNzPVwiZW1wdHktZ3JpZC1kZXNjXCI+QXR0YWNoIGFuIGludGVyYWN0aXZlIFJlc3VsdCBEYXRhIEdyaWQgKG9yIFVsdHJhR3JpZCkgdG8gdGhpcyByZXBvcnQgZGVmaW5pdGlvbiB0byByZW5kZXIgcXVlcmllcyBhbmQgc3RvcmVkIHByb2NlZHVyZSByZXN1bHRzLjwvcD5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY3JlYXRlLWdyaWQtYWN0aW9uXCIgKGNsaWNrKT1cImFkZEdyaWQuZW1pdCgpXCI+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJwbHVzXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgIDxzcGFuPisgQWRkIFJlc3VsdCBHcmlkPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cInByb3BzLWZvcm1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtaGVhZGVyLXdpdGgtYnRuXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJncm91cC10aXRsZVwiPkNvbHVtbnMgKHt7IGNvbHVtbnMoKS5sZW5ndGggfX0pPC9zcGFuPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDRweDtcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFkZC1jb2xcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6ICNlZmY2ZmY7IGNvbG9yOiAjMjU2M2ViOyBib3JkZXItY29sb3I6ICNiZmRiZmU7XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImF1dG9EZXRlY3RDb2x1bW5zLmVtaXQoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQXV0by1kZXRlY3QgYWxsIGNvbHVtbnMgZnJvbSBwcm9jZWR1cmUgb3IgZGF0YSB0YWJsZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwicmVmcmVzaFwiIFtzaXplXT1cIjExXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+QXV0by1EZXRlY3Q8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWFkZC1jb2xcIiAoY2xpY2spPVwiYWRkQ29sdW1uLmVtaXQoKVwiPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInBsdXNcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuPkFkZCBDb2x1bW48L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMtZWRpdG9yLWxpc3RcIj5cbiAgICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1ucygpOyB0cmFjayBjb2wuZmllbGQ7IGxldCBpZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZWRpdC1jYXJkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWhlYWRlci10aXRsZS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2wtZHJhZy1kb3RzXCI+4ouu4ouuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2wtaWR4LWJhZGdlXCI+I3t7IGlkeCArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC10aXRsZS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29sdW1uIExhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnbGFiZWwnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1jYXJkLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sLXR5cGUtcGlsbFwiPnt7IGNvbC5kYXRhVHlwZSB8fCAnc3RyaW5nJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWFjdGlvbi1idG4gYnRuLWRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDb2x1bW4uZW1pdChpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJSZW1vdmUgQ29sdW1uXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0cmFzaFwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWNhcmQtYm9keVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZWRpdC1maWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZmllbGQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbmktbGFiZWxcIj5GaWVsZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnZmllbGQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmRhdGFUeXBlIHx8ICdzdHJpbmcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdkYXRhVHlwZScsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInN0cmluZ1wiPlN0cmluZzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJudW1iZXJcIj5OdW1iZXI8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY3VycmVuY3lcIj5DdXJyZW5jeTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkYXRlXCI+RGF0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJib29sZWFuXCI+Qm9vbGVhbjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPkZvcm1hdDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBkZC9NTS95eXl5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2wuZm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdmb3JtYXQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPkFsaWduPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbWluaS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC5hbGlnbiB8fCAnbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ2FsaWduJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibGVmdFwiPkxlZnQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY2VudGVyXCI+Q2VudGVyPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJpZ2h0XCI+UmlnaHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZmllbGQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbmktbGFiZWxcIj5BZ2dyZWdhdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmFnZ3JlZ2F0ZSB8fCAnbm9uZSdcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ2FnZ3JlZ2F0ZScsICRldmVudCA9PT0gJ25vbmUnID8gdW5kZWZpbmVkIDogJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibm9uZVwiPk5vbmU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic3VtXCI+U3VtPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImF2Z1wiPkF2ZXJhZ2U8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY291bnRcIj5Db3VudDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtaW5cIj5NaW48L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibWF4XCI+TWF4PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWZpZWxkLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW5pLWxhYmVsXCI+V2lkdGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC53aWR0aCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnd2lkdGgnLCAkZXZlbnQgfHwgdW5kZWZpbmVkKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtY2FyZC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1jaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2wudmlzaWJsZSAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ3Zpc2libGUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+VmlzaWJsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmNoZWNrYm94U2VsZWN0aW9uID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdjaGVja2JveFNlbGVjdGlvbicsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5DaGVja2JveDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEdyaWQgVGFibGUgT3B0aW9ucyBHcm91cCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtdGl0bGVcIj5UYWJsZSBPcHRpb25zPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8uc2lkZUJhciAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2lkZUJhcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPkVuYWJsZSBTaWRlIFBhbmVsIChUb29sIFBhbmVscyk8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8uZ2xvYmFsU2VhcmNoICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdnbG9iYWxTZWFyY2gnLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5HbG9iYWwgU2VhcmNoIEJveDwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zdGF0dXNCYXIgIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3N0YXR1c0JhcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPlN0YXR1cyBCYXI8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8ucGFnaW5hdGlvbiA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3BhZ2luYXRpb24nLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5FbmFibGUgUGFnaW5hdGlvbjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zZWxlY3RhYmxlID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3NlbGVjdGFibGUnLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5Sb3cgU2VsZWN0aW9uPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoZ3JpZCgpPy5vcHRpb25zPy5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5TZWxlY3Rpb24gTW9kZTwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXRcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LnNlbGVjdGlvbk1vZGUgPz8gJ211bHRpcGxlJ1wiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdzZWxlY3Rpb25Nb2RlJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtdWx0aXBsZVwiPk11bHRpcGxlIFJvd3M8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNpbmdsZVwiPlNpbmdsZSBSb3c8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5jaGVja2JveFNlbGVjdGlvbiA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnY2hlY2tib3hTZWxlY3Rpb24nLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+Q2hlY2tib3ggU2VsZWN0aW9uPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIEBpZiAoKGdyaWQoKT8ub3B0aW9ucz8uc2VsZWN0aW9uTW9kZSA/PyAnbXVsdGlwbGUnKSA9PT0gJ211bHRpcGxlJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LmhlYWRlckNoZWNrYm94U2VsZWN0aW9uID8/IHRydWVcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ2hlYWRlckNoZWNrYm94U2VsZWN0aW9uJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj5IZWFkZXIgU2VsZWN0IEFsbCBDaGVja2JveDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LmFsbG93Q29sdW1uUmVvcmRlciA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ2FsbG93Q29sdW1uUmVvcmRlcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPkFsbG93IENvbHVtbiBSZW9yZGVyPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LmFsbG93RXhwb3J0ID8/IHRydWVcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnYWxsb3dFeHBvcnQnLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5BbGxvdyBFeHBvcnQ8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+UGFnZSBTaXplPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICBtaW49XCI1XCJcbiAgICAgICAgICAgIG1heD1cIjEwMFwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LnBhZ2VTaXplID8/IDEwXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdwYWdlU2l6ZScsIHZhbHVlOiArJGV2ZW50IH0pXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zaG93Um93TnVtYmVycyA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3Nob3dSb3dOdW1iZXJzJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+U2hvdyBSb3cgTnVtYmVyczwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zaG93Rm9vdGVyID8/IHRydWVcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2hvd0Zvb3RlcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPlNob3cgRm9vdGVyIFRvdGFsczwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFJvdyBDbGljayAmIERyaWxsLURvd24gQWN0aW9uIEdyb3VwIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC10aXRsZVwiPlJvdyBDbGljayAmIERyaWxsLURvd248L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaGFzUm93Q2xpY2tBY3Rpb24oKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRvZ2dsZVJvd0NsaWNrQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPkVuYWJsZSBSb3cgQ2xpY2sgQWN0aW9uPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoaGFzUm93Q2xpY2tBY3Rpb24oKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+QWN0aW9uIFR5cGU8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0IGZpZWxkLXNlbGVjdFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0NsaWNrQWN0aW9uKCk/LnR5cGUgfHwgJ29wZW4tZHJhd2VyJ1wiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVJvd0FjdGlvbkZpZWxkKCd0eXBlJywgJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJvcGVuLWRyYXdlclwiPlNsaWRlLU92ZXIgRGV0YWlsIERyYXdlcjwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZHJpbGxkb3duLXJlcG9ydFwiPkRyaWxsLURvd24gUmVwb3J0IChIb3N0IEV2ZW50KTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibmF2aWdhdGVcIj5OYXZpZ2F0ZSB0byBVUkw8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVtaXQtY3VzdG9tXCI+RW1pdCBDdXN0b20gQWN0aW9uPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIEBpZiAocm93Q2xpY2tBY3Rpb24oKT8udHlwZSA9PT0gJ29wZW4tZHJhd2VyJyB8fCByb3dDbGlja0FjdGlvbigpPy50eXBlID09PSAnZHJpbGxkb3duLXJlcG9ydCcpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5UYXJnZXQgUmVwb3J0IElEPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBvcmRlci1kZXRhaWxzXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3dDbGlja0FjdGlvbigpPy50YXJnZXRSZXBvcnRJZCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ3RhcmdldFJlcG9ydElkJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkRyYXdlciBUaXRsZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gT3JkZXIgRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Q2xpY2tBY3Rpb24oKT8uZHJhd2VyVGl0bGUgfHwgJydcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVJvd0FjdGlvbkZpZWxkKCdkcmF3ZXJUaXRsZScsICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5EcmF3ZXIgV2lkdGg8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIDc2MHB4LCA4MCUsIDkwMHB4XCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3dDbGlja0FjdGlvbigpPy5kcmF3ZXJXaWR0aCB8fCAnNzYwcHgnXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVSb3dBY3Rpb25GaWVsZCgnZHJhd2VyV2lkdGgnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAocm93Q2xpY2tBY3Rpb24oKT8udHlwZSA9PT0gJ25hdmlnYXRlJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlRhcmdldCBVUkw8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIicvb3JkZXJzL3t7cm93Lm9yZGVySWR9fSBvciBodHRwczovLy4uLidcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0NsaWNrQWN0aW9uKCk/LnRhcmdldFVybCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ3RhcmdldFVybCcsICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0NsaWNrQWN0aW9uKCk/Lm9wZW5OZXdUYWIgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ29wZW5OZXdUYWInLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPk9wZW4gaW4gTmV3IFRhYjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAocm93Q2xpY2tBY3Rpb24oKT8udHlwZSA9PT0gJ2VtaXQtY3VzdG9tJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkN1c3RvbSBBY3Rpb24gTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gdmlldy1hdWRpdC10cmFpbFwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Q2xpY2tBY3Rpb24oKT8uY3VzdG9tQWN0aW9uTmFtZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ2N1c3RvbUFjdGlvbk5hbWUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1sYWJlbC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5QYXJhbWV0ZXIgTWFwcGluZzwvbGFiZWw+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1hZGQtbWFwcGluZ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFBhcmFtZXRlck1hcHBpbmcoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICArIEFkZCBNYXBwaW5nXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIEBmb3IgKG1hcHBpbmcgb2YgcGFyYW1ldGVyTWFwcGluZ3MoKTsgdHJhY2sgbWFwcGluZy5rZXk7IGxldCBtSWR4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXBwaW5nLXBhaXItcm93XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTtcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUYXJnZXQgKGUuZy4gY3VzdG9tZXJJZClcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibWFwcGluZy5rZXlcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlTWFwcGluZ0tleShtSWR4LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogIzk0YTNiODtcIj7ihpA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTtcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTb3VyY2UgKGUuZy4gcm93LmlkKVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJtYXBwaW5nLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU1hcHBpbmdWYWx1ZShtSWR4LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtYWN0aW9uLWJ0biBidG4tZGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVNYXBwaW5nKG1JZHgpXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiUmVtb3ZlIG1hcHBpbmdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidHJhc2hcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBSZW1vdmUgR3JpZCBBY3Rpb24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1kYW5nZXItem9uZVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1yZW1vdmUtZ3JpZC1hY3Rpb25cIiAoY2xpY2spPVwicmVtb3ZlR3JpZC5lbWl0KClcIj5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRyYXNoXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgIDxzcGFuPlJlbW92ZSBHcmlkIGZyb20gUmVwb3J0PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIH1cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIC5lbXB0eS1ncmlkLWNhcmQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiA0MHB4IDE2cHg7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBib3JkZXI6IDJweCBkYXNoZWQgI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBtYXJnaW46IDEwcHggMDtcbiAgICB9XG4gICAgLmVtcHR5LWdyaWQtaWNvbiB7XG4gICAgICB3aWR0aDogNDhweDtcbiAgICAgIGhlaWdodDogNDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgY29sb3I6ICMyNTYzZWI7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbiAgICB9XG4gICAgLmVtcHR5LWdyaWQtdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjk1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgbWFyZ2luOiAwIDAgNnB4IDA7XG4gICAgfVxuICAgIC5lbXB0eS1ncmlkLWRlc2Mge1xuICAgICAgZm9udC1zaXplOiAwLjc3NXJlbTtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgbWFyZ2luOiAwIDAgMThweCAwO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICAgIG1heC13aWR0aDogMjgwcHg7XG4gICAgfVxuICAgIC5idG4tY3JlYXRlLWdyaWQtYWN0aW9uIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjMjU2M2ViO1xuICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgICBmb250LXNpemU6IDAuNzc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjIpO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC5idG4tY3JlYXRlLWdyaWQtYWN0aW9uOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICMxZDRlZDg7XG4gICAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgzNywgOTksIDIzNSwgMC4yNSk7XG4gICAgfVxuICAgIC5ncmlkLWRhbmdlci16b25lIHtcbiAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICBwYWRkaW5nLXRvcDogMTZweDtcbiAgICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQgI2UyZThmMDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB9XG4gICAgLmJ0bi1yZW1vdmUtZ3JpZC1hY3Rpb24ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmVlMmUyO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZlY2FjYTtcbiAgICAgIGNvbG9yOiAjZGMyNjI2O1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIHBhZGRpbmc6IDZweCAxMnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC5idG4tcmVtb3ZlLWdyaWQtYWN0aW9uOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZWNhY2E7XG4gICAgICBib3JkZXItY29sb3I6ICNmODcxNzE7XG4gICAgICBjb2xvcjogI2I5MWMxYztcbiAgICB9XG4gICAgLnByb3BzLWZvcm0ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDIwcHg7XG4gICAgfVxuICAgIC5ncm91cC1oZWFkZXItd2l0aC1idG4ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2UyZThmMCk7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogOHB4O1xuICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgIH1cbiAgICAuYnRuLWFkZC1jb2wge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JmZGJmZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIHBhZGRpbmc6IDRweCAxMHB4O1xuICAgICAgZm9udC1zaXplOiAwLjcyNXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC5idG4tYWRkLWNvbDpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgIH1cbiAgICAuY29sdW1ucy1lZGl0b3ItbGlzdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogMTBweDtcbiAgICB9XG4gICAgLmNvbC1lZGl0LWNhcmQge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMS41cHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cywgNnB4KTtcbiAgICAgIGJveC1zaGFkb3c6IHZhcigtLXJwdC1ib3gtc2hhZG93LCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA1KSk7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLXJwdC10cmFuc2l0aW9uLXNwZWVkLCAxNTBtcykgZWFzZTtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB9XG4gICAgLmNvbC1lZGl0LWNhcmQ6aG92ZXIge1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBib3gtc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjEpO1xuICAgIH1cbiAgICAuY29sLWNhcmQtaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBwYWRkaW5nOiA1cHggOHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXN1cmZhY2UsICNmOGZhZmMpO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNlMmU4ZjApO1xuICAgICAgbWluLWhlaWdodDogMzJweDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAgIC5jb2wtaGVhZGVyLXRpdGxlLWdyb3VwIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBmbGV4OiAxO1xuICAgIH1cbiAgICAuY29sLWRyYWctZG90cyB7XG4gICAgICBjb2xvcjogIzk0YTNiODtcbiAgICAgIGZvbnQtc2l6ZTogMC44cmVtO1xuICAgICAgY3Vyc29yOiBncmFiO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBsaW5lLWhlaWdodDogMTtcbiAgICAgIHBhZGRpbmctbGVmdDogMnB4O1xuICAgIH1cbiAgICAuY29sLWlkeC1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBiYWNrZ3JvdW5kOiAjZTJlOGYwO1xuICAgICAgcGFkZGluZzogMXB4IDVweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07XG4gICAgfVxuICAgIC5jb2wtdGl0bGUtaW5wdXQge1xuICAgICAgZmxleDogMTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIHBhZGRpbmc6IDJweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC5jb2wtdGl0bGUtaW5wdXQ6aG92ZXIge1xuICAgICAgYm9yZGVyLWNvbG9yOiAjY2JkNWUxO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICB9XG4gICAgLmNvbC10aXRsZS1pbnB1dDpmb2N1cyB7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgzNywgOTksIDIzNSwgMC4xNSk7XG4gICAgfVxuICAgIC5jb2wtY2FyZC1hY3Rpb25zIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA0cHg7XG4gICAgfVxuICAgIC5jb2wtdHlwZS1waWxsIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6ICMxZTQwYWY7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGJlYWZlO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JmZGJmZTtcbiAgICAgIHBhZGRpbmc6IDFweCA1cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTtcbiAgICB9XG4gICAgLmNvbC1hY3Rpb24tYnRuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBwYWRkaW5nOiAzcHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgZWFzZTtcbiAgICB9XG4gICAgLmNvbC1hY3Rpb24tYnRuLmJ0bi1kZWxldGU6aG92ZXIge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci1kYW5nZXIsICNlZjQ0NDQpO1xuICAgICAgYmFja2dyb3VuZDogI2ZlZTJlMjtcbiAgICB9XG4gICAgLmNvbC1jYXJkLWJvZHkge1xuICAgICAgcGFkZGluZzogOHB4IDEwcHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICB9XG4gICAgLmNvbC1lZGl0LWZpZWxkcyB7XG4gICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgbWlubWF4KDAsIDFmcikpO1xuICAgICAgZ2FwOiA2cHggOHB4O1xuICAgIH1cbiAgICAuY29sLWZpZWxkLWl0ZW0ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDJweDtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICB9XG4gICAgLm1pbmktbGFiZWwge1xuICAgICAgZm9udC1zaXplOiAwLjYyNXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07XG4gICAgfVxuICAgIC5jb2wtbWluaS1pbnB1dCwgLmNvbC1taW5pLXNlbGVjdCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICAgIHBhZGRpbmc6IDNweCA1cHg7XG4gICAgICBmb250LXNpemU6IDAuN3JlbTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dCwgIzBmMTcyYSk7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAuY29sLW1pbmktc2VsZWN0IHtcbiAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzY0NzQ4Yicgc3Ryb2tlLXdpZHRoPScyLjInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0Nwb2x5bGluZSBwb2ludHM9JzYgOSAxMiAxNSAxOCA5JyUzRSUzQy9wb2x5bGluZSUzRSUzQy9zdmclM0VcIik7XG4gICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgNHB4IGNlbnRlcjtcbiAgICAgIGJhY2tncm91bmQtc2l6ZTogMTBweCAxMHB4O1xuICAgICAgcGFkZGluZy1yaWdodDogMTZweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB9XG4gICAgLmNvbC1taW5pLWlucHV0OmZvY3VzLCAuY29sLW1pbmktc2VsZWN0OmZvY3VzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoMzcsIDk5LCAyMzUsIDAuMTUpO1xuICAgIH1cbiAgICAuY29sLWNhcmQtZm9vdGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICAgIGdhcDogMTJweDtcbiAgICAgIHBhZGRpbmctdG9wOiA0cHg7XG4gICAgICBib3JkZXItdG9wOiAxcHggZGFzaGVkICNlMmU4ZjA7XG4gICAgICBtYXJnaW4tdG9wOiAycHg7XG4gICAgfVxuICAgIC5jb2wtY2hlY2tib3gtdG9nZ2xlIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgICAgZm9udC1zaXplOiAwLjY3NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBjb2xvcjogIzQ3NTU2OTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICAuYnRuLWFkZC1tYXBwaW5nIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYmZkYmZlO1xuICAgICAgY29sb3I6ICMyNTYzZWI7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcGFkZGluZzogMnB4IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAuYnRuLWFkZC1tYXBwaW5nOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNkYmVhZmU7XG4gICAgfVxuICAgIC5tYXBwaW5nLXBhaXItcm93IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgfVxuICBgXSxcbn0pXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JHcmlkQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgZ3JpZCA9IGlucHV0PFJlcG9ydEdyaWREZWZpbml0aW9uIHwgdW5kZWZpbmVkPigpO1xuXG4gIHJlYWRvbmx5IGFkZEdyaWQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgcmVtb3ZlR3JpZCA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBhZGRDb2x1bW4gPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgYXV0b0RldGVjdENvbHVtbnMgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgcmVtb3ZlQ29sdW1uID0gb3V0cHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlQ29sdW1uID0gb3V0cHV0PHsgaW5kZXg6IG51bWJlcjsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlT3B0aW9uID0gb3V0cHV0PHsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlUm93Q2xpY2tBY3Rpb24gPSBvdXRwdXQ8R3JpZFJvd0NsaWNrQWN0aW9uIHwgdW5kZWZpbmVkPigpO1xuXG4gIHJlYWRvbmx5IGNvbHVtbnMgPSBjb21wdXRlZDxHcmlkQ29sdW1uRGVmaW5pdGlvbltdPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZCgpPy5jb2x1bW5zID8/IFtdO1xuICB9KTtcblxuICByZWFkb25seSByb3dDbGlja0FjdGlvbiA9IGNvbXB1dGVkPEdyaWRSb3dDbGlja0FjdGlvbiB8IHVuZGVmaW5lZD4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmdyaWQoKT8ucm93Q2xpY2tBY3Rpb24gPz8gdGhpcy5ncmlkKCk/Lm9wdGlvbnM/LnJvd0NsaWNrQWN0aW9uO1xuICB9KTtcblxuICByZWFkb25seSBoYXNSb3dDbGlja0FjdGlvbiA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICByZXR1cm4gISF0aGlzLnJvd0NsaWNrQWN0aW9uKCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHBhcmFtZXRlck1hcHBpbmdzID0gY29tcHV0ZWQ8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10+KCgpID0+IHtcbiAgICBjb25zdCBtYXBwaW5nID0gdGhpcy5yb3dDbGlja0FjdGlvbigpPy5wYXJhbWV0ZXJNYXBwaW5nO1xuICAgIGlmICghbWFwcGluZykgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhtYXBwaW5nKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsga2V5LCB2YWx1ZSB9KSk7XG4gIH0pO1xuXG4gIG9uVXBkYXRlQ29sKGluZGV4OiBudW1iZXIsIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDb2x1bW4uZW1pdCh7IGluZGV4LCBmaWVsZCwgdmFsdWUgfSk7XG4gIH1cblxuICB0b2dnbGVSb3dDbGlja0FjdGlvbihlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdCh7XG4gICAgICAgIHR5cGU6ICdvcGVuLWRyYXdlcicsXG4gICAgICAgIGRyYXdlclRpdGxlOiAnRGV0YWlscycsXG4gICAgICAgIGRyYXdlcldpZHRoOiAnNzYwcHgnLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdCh1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVJvd0FjdGlvbkZpZWxkKGZpZWxkOiBrZXlvZiBHcmlkUm93Q2xpY2tBY3Rpb24sIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICBjb25zdCBuZXh0ID0geyAuLi5jdXJyZW50LCBbZmllbGRdOiB2YWx1ZSB9O1xuICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdChuZXh0KTtcbiAgfVxuXG4gIGFkZFBhcmFtZXRlck1hcHBpbmcoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICBjb25zdCBtYXBwaW5nID0geyAuLi4oY3VycmVudC5wYXJhbWV0ZXJNYXBwaW5nID8/IHt9KSB9O1xuICAgIGxldCBpZHggPSBPYmplY3Qua2V5cyhtYXBwaW5nKS5sZW5ndGggKyAxO1xuICAgIGxldCBrZXkgPSBgcGFyYW0ke2lkeH1gO1xuICAgIHdoaWxlIChrZXkgaW4gbWFwcGluZykge1xuICAgICAgaWR4Kys7XG4gICAgICBrZXkgPSBgcGFyYW0ke2lkeH1gO1xuICAgIH1cbiAgICBtYXBwaW5nW2tleV0gPSAncm93LmlkJztcbiAgICB0aGlzLnVwZGF0ZVJvd0NsaWNrQWN0aW9uLmVtaXQoeyAuLi5jdXJyZW50LCBwYXJhbWV0ZXJNYXBwaW5nOiBtYXBwaW5nIH0pO1xuICB9XG5cbiAgdXBkYXRlTWFwcGluZ0tleShpbmRleDogbnVtYmVyLCBuZXdLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhaXJzID0gdGhpcy5wYXJhbWV0ZXJNYXBwaW5ncygpO1xuICAgIGlmICghcGFpcnNbaW5kZXhdKSByZXR1cm47XG4gICAgY29uc3QgbmV4dE1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBwYWlycy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICBjb25zdCBrID0gaSA9PT0gaW5kZXggPyBuZXdLZXkgOiBwLmtleTtcbiAgICAgIGlmIChrLnRyaW0oKSkge1xuICAgICAgICBuZXh0TWFwcGluZ1trLnRyaW0oKV0gPSBwLnZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvd0NsaWNrQWN0aW9uKCkgPz8geyB0eXBlOiAnb3Blbi1kcmF3ZXInIH07XG4gICAgdGhpcy51cGRhdGVSb3dDbGlja0FjdGlvbi5lbWl0KHsgLi4uY3VycmVudCwgcGFyYW1ldGVyTWFwcGluZzogbmV4dE1hcHBpbmcgfSk7XG4gIH1cblxuICB1cGRhdGVNYXBwaW5nVmFsdWUoaW5kZXg6IG51bWJlciwgbmV3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhaXJzID0gdGhpcy5wYXJhbWV0ZXJNYXBwaW5ncygpO1xuICAgIGlmICghcGFpcnNbaW5kZXhdKSByZXR1cm47XG4gICAgY29uc3QgbmV4dE1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBwYWlycy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICBjb25zdCB2ID0gaSA9PT0gaW5kZXggPyBuZXdWYWx1ZSA6IHAudmFsdWU7XG4gICAgICBpZiAocC5rZXkudHJpbSgpKSB7XG4gICAgICAgIG5leHRNYXBwaW5nW3Aua2V5LnRyaW0oKV0gPSB2O1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvd0NsaWNrQWN0aW9uKCkgPz8geyB0eXBlOiAnb3Blbi1kcmF3ZXInIH07XG4gICAgdGhpcy51cGRhdGVSb3dDbGlja0FjdGlvbi5lbWl0KHsgLi4uY3VycmVudCwgcGFyYW1ldGVyTWFwcGluZzogbmV4dE1hcHBpbmcgfSk7XG4gIH1cblxuICByZW1vdmVNYXBwaW5nKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwYWlycyA9IHRoaXMucGFyYW1ldGVyTWFwcGluZ3MoKTtcbiAgICBjb25zdCBuZXh0TWFwcGluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIHBhaXJzLmZvckVhY2goKHAsIGkpID0+IHtcbiAgICAgIGlmIChpICE9PSBpbmRleCAmJiBwLmtleS50cmltKCkpIHtcbiAgICAgICAgbmV4dE1hcHBpbmdbcC5rZXkudHJpbSgpXSA9IHAudmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICB0aGlzLnVwZGF0ZVJvd0NsaWNrQWN0aW9uLmVtaXQoeyAuLi5jdXJyZW50LCBwYXJhbWV0ZXJNYXBwaW5nOiBuZXh0TWFwcGluZyB9KTtcbiAgfVxufVxuXG4iXX0=