bways-report 0.1.8 → 0.2.0

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 (124) hide show
  1. package/README.md +463 -316
  2. package/esm2022/lib/core/config/bways-report-config.mjs +31 -32
  3. package/esm2022/lib/core/models/index.mjs +1 -1
  4. package/esm2022/lib/core/models/report-api-endpoint.model.mjs +8 -0
  5. package/esm2022/lib/core/models/report-component.model.mjs +1 -1
  6. package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
  7. package/esm2022/lib/core/services/index.mjs +2 -1
  8. package/esm2022/lib/core/services/report-api-execution.service.mjs +210 -0
  9. package/esm2022/lib/core/services/report-data-discovery.service.mjs +76 -4
  10. package/esm2022/lib/core/services/report-session-context.service.mjs +72 -3
  11. package/esm2022/lib/core/tokens/designer-config.token.mjs +4 -0
  12. package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
  13. package/esm2022/lib/core/utils/report-endpoint.util.mjs +22 -0
  14. package/esm2022/lib/core/utils/report-request-scope.mjs +48 -0
  15. package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +31 -1
  16. package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +27 -2
  17. package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +5 -2
  18. package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +30 -14
  19. package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +32 -28
  20. package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +1 -1
  21. package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +4 -37
  22. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +28 -51
  23. package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +43 -194
  24. package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +17 -65
  25. package/esm2022/lib/data-access/adapters/index.mjs +1 -1
  26. package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +13 -4
  27. package/esm2022/lib/data-access/adapters/report-id-availability.mjs +20 -0
  28. package/esm2022/lib/data-access/adapters/session-headers.mjs +11 -0
  29. package/esm2022/lib/data-access/contracts/index.mjs +1 -1
  30. package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
  31. package/esm2022/lib/data-access/contracts/report-persistence.contract.mjs +13 -1
  32. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +536 -6
  33. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +55 -17
  34. package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +546 -119
  35. package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +3 -3
  36. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +3 -3
  37. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +142 -8
  38. package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
  39. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +129 -28
  40. package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +3 -3
  41. package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
  42. package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +3 -3
  43. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +27 -13
  44. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +54 -32
  45. package/esm2022/lib/features/designer/designer.component.mjs +109 -75
  46. package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +10 -4
  47. package/esm2022/lib/features/designer/services/designer-config.service.mjs +56 -0
  48. package/esm2022/lib/features/designer/services/designer-endpoints.service.mjs +155 -0
  49. package/esm2022/lib/features/designer/services/designer-state.service.mjs +3 -2
  50. package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +2 -1
  51. package/esm2022/lib/features/embed/bways-report-builder.component.mjs +3 -3
  52. package/esm2022/lib/features/export/services/report-export.service.mjs +11 -6
  53. package/esm2022/lib/features/persistence/services/report-store.service.mjs +78 -23
  54. package/esm2022/lib/features/persistence/services/schema-validator.service.mjs +59 -3
  55. package/esm2022/lib/features/routing/components/routed-report-designer.component.mjs +12 -17
  56. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +6 -4
  57. package/esm2022/lib/features/routing/report-routes.mjs +6 -6
  58. package/esm2022/lib/features/routing/resolvers/report-route-identifier.mjs +5 -0
  59. package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +3 -2
  60. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +23 -4
  61. package/esm2022/lib/features/runtime/report-execution.service.mjs +36 -6
  62. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +54 -11
  63. package/esm2022/lib/features/runtime/report-runtime.component.mjs +105 -68
  64. package/esm2022/lib/features/runtime/rpt-report.component.mjs +50 -42
  65. package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +7 -2
  66. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +16 -7
  67. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +53 -1
  68. package/esm2022/lib/primitives/components/index.mjs +2 -1
  69. package/esm2022/lib/primitives/components/radio/rpt-radio.component.mjs +428 -0
  70. package/esm2022/lib/primitives/register-builtins.mjs +51 -2
  71. package/esm2022/lib/provide-reporting.mjs +11 -29
  72. package/fesm2022/bways-report.mjs +3745 -1281
  73. package/fesm2022/bways-report.mjs.map +1 -1
  74. package/lib/core/config/bways-report-config.d.ts +27 -5
  75. package/lib/core/models/index.d.ts +2 -1
  76. package/lib/core/models/report-api-endpoint.model.d.ts +30 -0
  77. package/lib/core/models/report-component.model.d.ts +16 -4
  78. package/lib/core/models/report-datasource.model.d.ts +21 -2
  79. package/lib/core/services/index.d.ts +1 -0
  80. package/lib/core/services/report-api-execution.service.d.ts +41 -0
  81. package/lib/core/services/report-data-discovery.service.d.ts +23 -1
  82. package/lib/core/services/report-session-context.service.d.ts +9 -0
  83. package/lib/core/tokens/designer-config.token.d.ts +4 -0
  84. package/lib/core/tokens/reporting-config.token.d.ts +4 -0
  85. package/lib/core/utils/report-endpoint.util.d.ts +12 -0
  86. package/lib/core/utils/report-request-scope.d.ts +14 -0
  87. package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +2 -0
  88. package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +1 -0
  89. package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +6 -2
  90. package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +4 -2
  91. package/lib/data-access/adapters/endpoint-tokens.d.ts +7 -0
  92. package/lib/data-access/adapters/http-datasource.adapter.d.ts +1 -3
  93. package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -4
  94. package/lib/data-access/adapters/http-persistence.adapter.d.ts +11 -16
  95. package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +3 -5
  96. package/lib/data-access/adapters/index.d.ts +1 -1
  97. package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +2 -2
  98. package/lib/data-access/adapters/report-id-availability.d.ts +6 -0
  99. package/lib/data-access/adapters/session-headers.d.ts +3 -0
  100. package/lib/data-access/contracts/index.d.ts +1 -0
  101. package/lib/data-access/contracts/lookup.contract.d.ts +3 -0
  102. package/lib/data-access/contracts/report-persistence.contract.d.ts +16 -1
  103. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +16 -0
  104. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +2 -0
  105. package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +37 -5
  106. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +21 -3
  107. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +20 -7
  108. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +2 -1
  109. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +7 -1
  110. package/lib/features/designer/designer.component.d.ts +16 -2
  111. package/lib/features/designer/rpt-report-designer.component.d.ts +5 -1
  112. package/lib/features/designer/services/designer-config.service.d.ts +13 -0
  113. package/lib/features/designer/services/designer-endpoints.service.d.ts +25 -0
  114. package/lib/features/persistence/services/report-store.service.d.ts +15 -1
  115. package/lib/features/persistence/services/schema-validator.service.d.ts +2 -0
  116. package/lib/features/routing/resolvers/report-route-identifier.d.ts +2 -0
  117. package/lib/features/runtime/report-execution.service.d.ts +4 -0
  118. package/lib/features/runtime/report-grid-bridge.component.d.ts +4 -1
  119. package/lib/features/runtime/report-runtime.component.d.ts +14 -1
  120. package/lib/features/runtime/rpt-report.component.d.ts +5 -0
  121. package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +3 -1
  122. package/lib/primitives/components/index.d.ts +2 -0
  123. package/lib/primitives/components/radio/rpt-radio.component.d.ts +77 -0
  124. package/package.json +2 -1
@@ -7,14 +7,17 @@ import { DesignerStateService } from '../../services/designer-state.service';
7
7
  import { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';
8
8
  import { REPORTING_CONFIG } from '../../../../core/tokens/reporting-config.token';
9
9
  import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/forms";
11
- import * as i2 from "@angular/cdk/drag-drop";
10
+ import * as i1 from "@angular/common";
11
+ import * as i2 from "@angular/forms";
12
+ import * as i3 from "@angular/cdk/drag-drop";
12
13
  export class ComponentPaletteComponent {
13
14
  registry = inject(ComponentRegistry);
14
15
  designerState = inject(DesignerStateService);
15
16
  reportingConfig = inject(REPORTING_CONFIG, { optional: true });
16
17
  collapseRequested = output();
17
18
  searchQuery = signal('');
19
+ /** Selected category filter tab: 'all' or specific category name */
20
+ selectedCategory = signal('all');
18
21
  /** Layout view mode: 'grid' (2-column side-by-side grid) or 'list' (compact row list). Defaults to 'grid'. */
19
22
  layoutMode = signal('grid');
20
23
  /** Set of expanded category IDs */
@@ -27,13 +30,39 @@ export class ComponentPaletteComponent {
27
30
  data: { label: 'Data & Lookups', icon: 'grid' },
28
31
  layout: { label: 'Layout & Containers', icon: 'layout' },
29
32
  };
33
+ /** Computed list of category tabs for quick one-click filtering */
34
+ availableCategories = computed(() => {
35
+ const all = this.registry.getAll();
36
+ const map = new Map();
37
+ for (const item of all) {
38
+ const cat = item.category || 'input';
39
+ map.set(cat, (map.get(cat) || 0) + 1);
40
+ }
41
+ const pills = [
42
+ { id: 'all', label: 'All', count: all.length },
43
+ ];
44
+ for (const [cat, count] of map.entries()) {
45
+ const meta = this.categoryMeta[cat];
46
+ const cleanLabel = (meta?.label ?? cat)
47
+ .replace(/^Form\s+/, '')
48
+ .replace(/^Action\s+/, '')
49
+ .replace(/\s*&\s*Labels$/, '');
50
+ pills.push({ id: cat, label: cleanLabel, count });
51
+ }
52
+ return pills;
53
+ });
30
54
  filteredCategories = computed(() => {
31
55
  const all = this.registry.getAll();
32
56
  const query = this.searchQuery();
57
+ const categoryFilter = this.selectedCategory();
33
58
  const allowedCats = this.reportingConfig?.allowedCategories;
34
59
  let filtered = query
35
60
  ? all.filter((c) => matchesSearchQuery(c, query))
36
61
  : all;
62
+ // Apply quick category tab filter if not set to 'all' and no active search query
63
+ if (categoryFilter !== 'all' && !query.trim()) {
64
+ filtered = filtered.filter((c) => (c.category || 'input') === categoryFilter);
65
+ }
37
66
  // Filter by allowed categories if configured
38
67
  if (allowedCats && allowedCats.length > 0) {
39
68
  filtered = filtered.filter((c) => {
@@ -66,6 +95,9 @@ export class ComponentPaletteComponent {
66
95
  const expanded = this.expandedCategories();
67
96
  return cats.every((c) => expanded.has(c.name));
68
97
  });
98
+ selectCategory(category) {
99
+ this.selectedCategory.set(category);
100
+ }
69
101
  isCategoryExpanded(categoryName) {
70
102
  // When searching, auto-expand categories that contain matching results
71
103
  if (this.searchQuery().trim()) {
@@ -100,12 +132,16 @@ export class ComponentPaletteComponent {
100
132
  return 'dropdown';
101
133
  case 'date':
102
134
  return 'calendar';
135
+ case 'date-range':
136
+ return 'calendar-today';
103
137
  case 'number':
104
138
  return 'number';
105
139
  case 'checkbox':
106
140
  return 'checkbox';
141
+ case 'radio':
142
+ return 'radio';
107
143
  case 'button':
108
- return 'button';
144
+ return 'lightning';
109
145
  case 'kpi-card':
110
146
  return 'kpi';
111
147
  case 'chart':
@@ -114,6 +150,27 @@ export class ComponentPaletteComponent {
114
150
  return 'box';
115
151
  }
116
152
  }
153
+ getComponentDescription(item) {
154
+ return COMPONENT_DESCRIPTIONS[item.type] || `${item.displayName} component`;
155
+ }
156
+ getGridLabel(item) {
157
+ return COMPONENT_SHORT_LABELS[item.type] || item.displayName;
158
+ }
159
+ getCategoryTheme(item) {
160
+ const cat = item.category || 'input';
161
+ switch (cat) {
162
+ case 'action':
163
+ return 'theme-action';
164
+ case 'display':
165
+ return 'theme-display';
166
+ case 'data':
167
+ return 'theme-data';
168
+ case 'layout':
169
+ return 'theme-layout';
170
+ default:
171
+ return 'theme-input';
172
+ }
173
+ }
117
174
  onItemDoubleClick(type) {
118
175
  this.designerState.addComponent(type);
119
176
  }
@@ -122,12 +179,484 @@ export class ComponentPaletteComponent {
122
179
  this.designerState.addComponent(type);
123
180
  }
124
181
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentPaletteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
125
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentPaletteComponent, isStandalone: true, selector: "rpt-component-palette", outputs: { collapseRequested: "collapseRequested" }, ngImport: i0, template: " <div class=\"palette-container\">\n <div class=\"palette-header\">\n <div class=\"palette-title-area\">\n <h3 class=\"palette-title\">Components</h3>\n <span class=\"palette-count\" [title]=\"totalComponentCount() + ' components available'\">\n {{ totalComponentCount() }}\n </span>\n </div>\n\n <div class=\"palette-actions\">\n <!-- View Mode Toggle: 2-Column Grid vs 1-Column List -->\n <div class=\"view-mode-toggle\" role=\"group\" aria-label=\"Palette layout view\">\n <button\n type=\"button\"\n class=\"toggle-btn\"\n [class.active]=\"layoutMode() === 'grid'\"\n [attr.aria-pressed]=\"layoutMode() === 'grid'\"\n (click)=\"layoutMode.set('grid')\"\n title=\"2-Column Grid View\"\n aria-label=\"2-Column Grid View\"\n >\n <rpt-icon name=\"grid\" [size]=\"12\" />\n </button>\n <button\n type=\"button\"\n class=\"toggle-btn\"\n [class.active]=\"layoutMode() === 'list'\"\n [attr.aria-pressed]=\"layoutMode() === 'list'\"\n (click)=\"layoutMode.set('list')\"\n title=\"Compact List View\"\n aria-label=\"Compact List View\"\n >\n <rpt-icon name=\"list\" [size]=\"12\" />\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"palette-action-btn icon-only\"\n (click)=\"toggleAllCategories()\"\n [title]=\"allExpanded() ? 'Collapse All Sections' : 'Expand All Sections'\"\n [attr.aria-label]=\"allExpanded() ? 'Collapse All Sections' : 'Expand All Sections'\"\n >\n <rpt-icon [name]=\"allExpanded() ? 'chevron-up' : 'chevron-down'\" [size]=\"13\" />\n </button>\n\n <button\n type=\"button\"\n class=\"palette-action-btn icon-only\"\n (click)=\"collapseRequested.emit()\"\n title=\"Collapse Component Palette\"\n aria-label=\"Collapse Component Palette\"\n >\n <rpt-icon name=\"chevron-left\" [size]=\"13\" />\n </button>\n </div>\n </div>\n\n <!-- Search Filter -->\n <div class=\"palette-search-wrapper\">\n <div class=\"search-input-box\">\n <rpt-icon name=\"search\" [size]=\"13\" class=\"search-prefix-icon\" />\n <input\n type=\"text\"\n class=\"palette-search-input\"\n placeholder=\"Search controls...\"\n [ngModel]=\"searchQuery()\"\n (ngModelChange)=\"searchQuery.set($event)\"\n aria-label=\"Search components\"\n />\n @if (searchQuery()) {\n <button\n type=\"button\"\n class=\"clear-search-btn\"\n (click)=\"searchQuery.set('')\"\n title=\"Clear search\"\n aria-label=\"Clear search\"\n >\n <rpt-icon name=\"close\" [size]=\"12\" />\n </button>\n }\n </div>\n </div>\n\n <!-- Palette Categories Drop List with Accordion -->\n <div\n class=\"palette-scroll-area\"\n cdkDropList\n id=\"designer-palette-drop-list\"\n [cdkDropListSortingDisabled]=\"true\"\n >\n @for (category of filteredCategories(); track category.name) {\n <div class=\"accordion-item\" [class.is-expanded]=\"isCategoryExpanded(category.name)\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleCategory(category.name)\"\n [attr.aria-expanded]=\"isCategoryExpanded(category.name)\"\n [attr.aria-controls]=\"'palette-section-' + category.name\"\n [id]=\"'palette-header-' + category.name\"\n >\n <div class=\"accordion-header-left\">\n <span class=\"accordion-chevron\" [class.rotated]=\"!isCategoryExpanded(category.name)\">\n <rpt-icon name=\"chevron-down\" [size]=\"12\" />\n </span>\n <div class=\"category-icon-indicator\">\n <rpt-icon [name]=\"category.icon\" [size]=\"13\" />\n </div>\n <span class=\"category-name\">{{ category.label }}</span>\n </div>\n <span class=\"category-badge\">{{ category.items.length }}</span>\n </button>\n\n <div\n class=\"accordion-collapse-wrapper\"\n [class.expanded]=\"isCategoryExpanded(category.name)\"\n [attr.aria-hidden]=\"!isCategoryExpanded(category.name)\"\n [id]=\"'palette-section-' + category.name\"\n role=\"region\"\n [attr.aria-labelledby]=\"'palette-header-' + category.name\"\n >\n <div class=\"accordion-content\">\n <div\n class=\"category-items\"\n [class.grid-view]=\"layoutMode() === 'grid'\"\n [class.list-view]=\"layoutMode() === 'list'\"\n >\n @for (item of category.items; track item.type) {\n <div\n class=\"palette-item\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"'Add ' + item.displayName + ' to canvas'\"\n cdkDrag\n [cdkDragData]=\"item.type\"\n (dblclick)=\"onItemDoubleClick(item.type)\"\n (keydown.enter)=\"onItemDoubleClick(item.type)\"\n (keydown.space)=\"onItemDoubleClick(item.type)\"\n [title]=\"'Drag onto canvas or double-click to add ' + item.displayName\"\n >\n <div class=\"item-icon-box\">\n <rpt-icon [name]=\"getIconName(item)\" [size]=\"layoutMode() === 'grid' ? 16 : 15\" />\n </div>\n <div class=\"item-info\">\n <span class=\"item-title\" [title]=\"item.displayName\">{{ item.displayName }}</span>\n <span class=\"item-type-code\">{{ item.type }}</span>\n </div>\n <button\n type=\"button\"\n class=\"item-add-btn\"\n (click)=\"onAddClick($event, item.type)\"\n tabindex=\"0\"\n title=\"Add to canvas\"\n aria-label=\"Add to canvas\"\n >\n <rpt-icon name=\"plus\" [size]=\"layoutMode() === 'grid' ? 12 : 13\" />\n </button>\n\n <!-- CDK Drag Placeholder / Preview -->\n <div *cdkDragPlaceholder class=\"drag-placeholder\"></div>\n <div *cdkDragPreview class=\"drag-preview\">\n <rpt-icon [name]=\"getIconName(item)\" [size]=\"16\" />\n <span>{{ item.displayName }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n @if (filteredCategories().length === 0) {\n <div class=\"no-results\">\n <rpt-icon name=\"search\" [size]=\"20\" class=\"no-results-icon\" />\n <span class=\"no-results-text\">No components matching \"{{ searchQuery() }}\"</span>\n <button type=\"button\" class=\"no-results-clear-btn\" (click)=\"searchQuery.set('')\">\n Clear Search\n </button>\n </div>\n }\n </div>\n </div>", styles: [":host{display:block;height:100%;background:var(--rpt-color-bg, #ffffff);border-right:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.palette-container{display:flex;flex-direction:column;height:100%}.palette-header{display:flex;align-items:center;justify-content:space-between;padding:12px 14px 10px;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);gap:6px}.palette-title-area{display:flex;align-items:center;gap:6px}.palette-title{font-size:var(--rpt-font-size-base, .8125rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0;text-transform:uppercase;letter-spacing:.04em}.palette-count{font-size:var(--rpt-font-size-sm, .6875rem);background:var(--rpt-color-surface, #f1f5f9);color:var(--rpt-color-text-muted, #475569);padding:1px 6px;border-radius:10px;font-weight:600}.palette-actions{display:flex;align-items:center;gap:5px}.view-mode-toggle{display:inline-flex;align-items:center;background:var(--rpt-color-surface, #f1f5f9);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:4px;padding:1px}.toggle-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:20px;border:none;background:transparent;color:var(--rpt-color-text-muted, #64748b);border-radius:3px;cursor:pointer;transition:all .12s ease;padding:0}.toggle-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.toggle-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);box-shadow:0 1px 2px #00000014}.toggle-btn:hover:not(.active){color:var(--rpt-color-text, #0f172a)}.palette-action-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:22px;padding:0;color:var(--rpt-color-primary, #2563eb);background:#2563eb0f;border:1px solid rgba(37,99,235,.18);border-radius:4px;cursor:pointer;transition:all .15s ease;font-family:inherit;flex-shrink:0}.palette-action-btn:hover{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.palette-action-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.palette-search-wrapper{padding:10px 14px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.search-input-box{position:relative;display:flex;align-items:center;width:100%}.search-prefix-icon{position:absolute;left:9px;color:var(--rpt-color-text-muted, #64748b);pointer-events:none}.palette-search-input{width:100%;box-sizing:border-box;height:32px;padding:4px 28px;font-size:var(--rpt-font-size-sm, .75rem);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);background:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text, #0f172a);outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.palette-search-input:focus{background:#fff;border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .22))}.clear-search-btn{position:absolute;right:8px;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:2px;border-radius:3px;transition:all .15s ease}.clear-search-btn:hover{color:var(--rpt-color-text, #0f172a)}.clear-search-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.palette-scroll-area{flex:1;overflow-y:auto;padding:8px 10px 16px}.accordion-item{border-bottom:1px solid var(--rpt-color-border, #f1f5f9);margin-bottom:4px}.accordion-item:last-child{border-bottom:none}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:7px 8px;background:transparent;border:none;border-radius:var(--rpt-border-radius, 5px);cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background-color var(--rpt-transition-speed, .15s) ease;font-family:inherit}.accordion-header:hover{background:var(--rpt-color-surface, #f1f5f9)}.accordion-header:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.accordion-header-left{display:flex;align-items:center;gap:7px;min-width:0}.accordion-chevron{display:inline-flex;align-items:center;justify-content:center;transition:transform .2s cubic-bezier(.4,0,.2,1);color:var(--rpt-color-text-muted, #64748b)}.accordion-chevron.rotated{transform:rotate(-90deg)}.category-icon-indicator{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:4px;background:#2563eb14;color:var(--rpt-color-primary, #2563eb);flex-shrink:0}.category-name{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #1e293b);text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-badge{font-size:.65rem;font-weight:700;color:var(--rpt-color-text, #334155);background:var(--rpt-color-surface, #e2e8f0);padding:1px 6px;border-radius:10px;flex-shrink:0}.accordion-collapse-wrapper{display:grid;grid-template-rows:0fr;transition:grid-template-rows .2s cubic-bezier(.4,0,.2,1),visibility .2s ease;visibility:hidden}.accordion-collapse-wrapper.expanded{grid-template-rows:1fr;visibility:visible}.accordion-content{overflow:hidden;min-height:0}.category-items{padding:4px 2px 8px}.category-items.grid-view{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}.category-items.grid-view .palette-item{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:10px 4px 8px;gap:5px;background:var(--rpt-color-surface, #f8fafc);border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:var(--rpt-border-radius, 6px);cursor:grab;-webkit-user-select:none;user-select:none;position:relative;transition:all var(--rpt-transition-speed, .15s) ease;min-width:0;outline:none}.category-items.grid-view .palette-item:hover{background:#fff;border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1f,0 2px 4px -2px #2563eb14;transform:translateY(-2px)}.category-items.grid-view .palette-item:focus-visible{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px var(--rpt-color-primary, #2563eb);background:#fff}.category-items.grid-view .palette-item:active{cursor:grabbing}.category-items.grid-view .item-icon-box{width:32px;height:32px;border-radius:6px;background:#fff;border:1px solid var(--rpt-color-border, #e2e8f0);display:flex;align-items:center;justify-content:center;color:var(--rpt-color-primary, #2563eb);transition:transform .15s ease,background-color .15s ease;flex-shrink:0}.category-items.grid-view .palette-item:hover .item-icon-box,.category-items.grid-view .palette-item:focus-visible .item-icon-box{background:#2563eb14;transform:scale(1.08)}.category-items.grid-view .item-info{display:flex;flex-direction:column;align-items:center;width:100%;min-width:0;padding:0 2px}.category-items.grid-view .item-title{font-size:.6875rem;font-weight:600;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%;text-align:center}.category-items.grid-view .item-type-code{font-size:.58rem;color:var(--rpt-color-text-muted, #475569);font-family:monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%;text-align:center}.category-items.grid-view .item-add-btn{position:absolute;top:3px;right:3px;width:18px;height:18px;border-radius:3px;border:1px solid var(--rpt-color-border, #cbd5e1);background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:700;font-size:.75rem;display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:all var(--rpt-transition-speed, .15s) ease}.category-items.grid-view .palette-item:hover .item-add-btn,.category-items.grid-view .palette-item:focus-visible .item-add-btn,.category-items.grid-view .item-add-btn:focus-visible{opacity:1}.category-items.grid-view .item-add-btn:hover,.category-items.grid-view .item-add-btn:focus-visible{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb);outline:none}.grid-view .drag-placeholder{border:2px dashed var(--rpt-color-primary, #2563eb);background:#2563eb0d;border-radius:var(--rpt-border-radius, 6px);min-height:72px;box-sizing:border-box;opacity:.6}.category-items.list-view{display:flex;flex-direction:column;gap:6px}.category-items.list-view .palette-item{display:flex;align-items:center;gap:10px;padding:7px 9px;background:var(--rpt-color-surface, #f8fafc);border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:var(--rpt-border-radius, 6px);cursor:grab;-webkit-user-select:none;user-select:none;transition:all var(--rpt-transition-speed, .15s) ease;outline:none}.category-items.list-view .palette-item:hover{background:#fff;border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 2px 4px #2563eb14;transform:translateY(-1px)}.category-items.list-view .palette-item:focus-visible{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px var(--rpt-color-primary, #2563eb);background:#fff}.category-items.list-view .palette-item:active{cursor:grabbing}.category-items.list-view .item-icon-box{width:26px;height:26px;border-radius:4px;background:#fff;border:1px solid var(--rpt-color-border, #e2e8f0);display:flex;align-items:center;justify-content:center;color:var(--rpt-color-primary, #2563eb);flex-shrink:0}.category-items.list-view .item-info{flex:1;display:flex;flex-direction:column;min-width:0}.category-items.list-view .item-title{font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-items.list-view .item-type-code{font-size:.65rem;color:var(--rpt-color-text-muted, #475569);font-family:monospace}.category-items.list-view .item-add-btn{width:24px;height:24px;border-radius:4px;border:1px solid var(--rpt-color-border, #cbd5e1);background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:700;font-size:.85rem;display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:all var(--rpt-transition-speed, .15s) ease}.category-items.list-view .palette-item:hover .item-add-btn,.category-items.list-view .palette-item:focus-visible .item-add-btn,.category-items.list-view .item-add-btn:focus-visible{opacity:1}.category-items.list-view .item-add-btn:hover,.category-items.list-view .item-add-btn:focus-visible{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb);outline:none}.list-view .drag-placeholder{border:2px dashed var(--rpt-color-primary, #2563eb);background:#2563eb0d;border-radius:var(--rpt-border-radius, 6px);min-height:40px;box-sizing:border-box;opacity:.6}.drag-preview,::ng-deep .drag-preview{background:#fff;border:2px solid var(--rpt-color-primary, #2563eb);border-radius:6px;padding:8px 14px;display:flex;align-items:center;gap:8px;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif)!important;font-size:.8rem;font-weight:600;color:var(--rpt-color-text, #0f172a);box-shadow:0 10px 15px -3px #0003;z-index:10000}.drag-preview *,::ng-deep .drag-preview *{font-family:inherit!important}.no-results{display:flex;flex-direction:column;align-items:center;gap:8px;padding:32px 12px;text-align:center}.no-results-icon{color:var(--rpt-color-text-muted, #64748b);opacity:.7}.no-results-text{font-size:.75rem;color:var(--rpt-color-text-muted, #475569);word-break:break-word}.no-results-clear-btn{margin-top:4px;padding:4px 10px;font-size:.7rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#2563eb14;border:1px solid rgba(37,99,235,.2);border-radius:4px;cursor:pointer;transition:all .15s ease}.no-results-clear-btn:hover{background:var(--rpt-color-primary, #2563eb);color:#fff}.no-results-clear-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}@media (prefers-reduced-motion: reduce){.accordion-collapse-wrapper,.accordion-chevron,.palette-item,.item-icon-box,.item-add-btn,.toggle-btn,.palette-action-btn{transition:none!important;transform:none!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "directive", type: i2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
182
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentPaletteComponent, isStandalone: true, selector: "rpt-component-palette", outputs: { collapseRequested: "collapseRequested" }, ngImport: i0, template: `
183
+ <div class="palette-container">
184
+ <div class="palette-header">
185
+ <div class="palette-title-area">
186
+ <h3 class="palette-title">Components</h3>
187
+ <span
188
+ class="palette-count"
189
+ role="status"
190
+ aria-atomic="true"
191
+ [attr.aria-label]="totalComponentCount() + ' components available'"
192
+ [title]="totalComponentCount() + ' components available'"
193
+ >
194
+ {{ totalComponentCount() }}
195
+ </span>
196
+ </div>
197
+
198
+ <div class="palette-actions">
199
+ <!-- View Mode Toggle: 2-Column Grid vs 1-Column List -->
200
+ <div class="view-mode-toggle" role="group" aria-label="Palette layout view">
201
+ <button
202
+ type="button"
203
+ class="toggle-btn"
204
+ [class.active]="layoutMode() === 'grid'"
205
+ [attr.aria-pressed]="layoutMode() === 'grid'"
206
+ (click)="layoutMode.set('grid')"
207
+ title="Compact 2-Column Grid"
208
+ aria-label="2-Column Grid View"
209
+ >
210
+ <rpt-icon name="grid" [size]="12" />
211
+ </button>
212
+ <button
213
+ type="button"
214
+ class="toggle-btn"
215
+ [class.active]="layoutMode() === 'list'"
216
+ [attr.aria-pressed]="layoutMode() === 'list'"
217
+ (click)="layoutMode.set('list')"
218
+ title="Detailed List View"
219
+ aria-label="Compact List View"
220
+ >
221
+ <rpt-icon name="list" [size]="12" />
222
+ </button>
223
+ </div>
224
+
225
+ <button
226
+ type="button"
227
+ class="palette-action-btn icon-only"
228
+ (click)="toggleAllCategories()"
229
+ [title]="allExpanded() ? 'Collapse All Sections' : 'Expand All Sections'"
230
+ [attr.aria-label]="allExpanded() ? 'Collapse All Sections' : 'Expand All Sections'"
231
+ >
232
+ <rpt-icon [name]="allExpanded() ? 'chevron-up' : 'chevron-down'" [size]="13" />
233
+ </button>
234
+
235
+ <button
236
+ type="button"
237
+ class="palette-action-btn icon-only"
238
+ (click)="collapseRequested.emit()"
239
+ title="Collapse Component Palette"
240
+ aria-label="Collapse Component Palette"
241
+ >
242
+ <rpt-icon name="chevron-left" [size]="13" />
243
+ </button>
244
+ </div>
245
+ </div>
246
+
247
+ <!-- Search Filter & Quick Category Filter Pills -->
248
+ <div class="palette-search-wrapper">
249
+ <div class="search-input-box">
250
+ <rpt-icon name="search" [size]="13" class="search-prefix-icon" />
251
+ <input
252
+ type="text"
253
+ class="palette-search-input"
254
+ placeholder="Search components..."
255
+ [ngModel]="searchQuery()"
256
+ (ngModelChange)="searchQuery.set($event)"
257
+ aria-label="Search components"
258
+ />
259
+ @if (searchQuery()) {
260
+ <button
261
+ type="button"
262
+ class="clear-search-btn"
263
+ (click)="searchQuery.set('')"
264
+ title="Clear search"
265
+ aria-label="Clear search"
266
+ >
267
+ <rpt-icon name="close" [size]="12" />
268
+ </button>
269
+ }
270
+ </div>
271
+
272
+ <div class="category-filter-chips" role="tablist" aria-label="Filter components by category">
273
+ @for (tab of availableCategories(); track tab.id) {
274
+ <button
275
+ type="button"
276
+ class="category-chip"
277
+ [class.active]="selectedCategory() === tab.id"
278
+ (click)="selectCategory(tab.id)"
279
+ role="tab"
280
+ [attr.aria-selected]="selectedCategory() === tab.id"
281
+ [title]="'Show ' + tab.label + ' (' + tab.count + ')'"
282
+ >
283
+ <span class="chip-label">{{ tab.label }}</span>
284
+ <span class="chip-count">{{ tab.count }}</span>
285
+ </button>
286
+ }
287
+ </div>
288
+ </div>
289
+
290
+ <!-- Palette Categories Drop List with Accordion -->
291
+ <div
292
+ class="palette-scroll-area"
293
+ cdkDropList
294
+ id="designer-palette-drop-list"
295
+ [cdkDropListSortingDisabled]="true"
296
+ >
297
+ @for (category of filteredCategories(); track category.name) {
298
+ <div class="accordion-item" [class.is-expanded]="isCategoryExpanded(category.name)">
299
+ <button
300
+ type="button"
301
+ class="accordion-header"
302
+ (click)="toggleCategory(category.name)"
303
+ [attr.aria-expanded]="isCategoryExpanded(category.name)"
304
+ [attr.aria-controls]="'palette-section-' + category.name"
305
+ [id]="'palette-header-' + category.name"
306
+ >
307
+ <div class="accordion-header-left">
308
+ <span class="accordion-chevron" [class.rotated]="!isCategoryExpanded(category.name)">
309
+ <rpt-icon name="chevron-down" [size]="12" />
310
+ </span>
311
+ <div class="category-icon-indicator" [ngClass]="'theme-' + category.name">
312
+ <rpt-icon [name]="category.icon" [size]="12" />
313
+ </div>
314
+ <span class="category-name">{{ category.label }}</span>
315
+ </div>
316
+ <span class="category-badge">{{ category.items.length }}</span>
317
+ </button>
318
+
319
+ <div
320
+ class="accordion-collapse-wrapper"
321
+ [class.expanded]="isCategoryExpanded(category.name)"
322
+ [attr.aria-hidden]="!isCategoryExpanded(category.name)"
323
+ [id]="'palette-section-' + category.name"
324
+ role="region"
325
+ [attr.aria-labelledby]="'palette-header-' + category.name"
326
+ >
327
+ <div class="accordion-content">
328
+ <div
329
+ class="category-items"
330
+ [class.grid-view]="layoutMode() === 'grid'"
331
+ [class.list-view]="layoutMode() === 'list'"
332
+ >
333
+ @for (item of category.items; track item.type) {
334
+ <div
335
+ class="palette-item"
336
+ [ngClass]="getCategoryTheme(item)"
337
+ tabindex="0"
338
+ role="button"
339
+ [attr.aria-label]="'Add ' + item.displayName + ' (' + getComponentDescription(item) + ') to canvas'"
340
+ cdkDrag
341
+ [cdkDragData]="item.type"
342
+ (dblclick)="onItemDoubleClick(item.type)"
343
+ (keydown.enter)="onItemDoubleClick(item.type)"
344
+ (keydown.space)="onItemDoubleClick(item.type)"
345
+ [title]="item.displayName + ' — ' + getComponentDescription(item) + ' (Drag or double-click to add)'"
346
+ >
347
+ <span class="item-drag-handle" aria-hidden="true">
348
+ <rpt-icon name="grip-vertical" [size]="12" />
349
+ </span>
350
+
351
+ <div class="item-icon-box" [ngClass]="getCategoryTheme(item)">
352
+ <rpt-icon [name]="getIconName(item)" [size]="14" />
353
+ </div>
354
+
355
+ <div class="item-info">
356
+ <span class="item-title">
357
+ {{ layoutMode() === 'grid' ? getGridLabel(item) : item.displayName }}
358
+ </span>
359
+ @if (layoutMode() === 'list') {
360
+ <span class="item-desc">{{ getComponentDescription(item) }}</span>
361
+ }
362
+ </div>
363
+
364
+ <button
365
+ type="button"
366
+ class="item-add-btn"
367
+ (click)="onAddClick($event, item.type)"
368
+ tabindex="0"
369
+ [title]="'Add ' + item.displayName + ' to canvas'"
370
+ [attr.aria-label]="'Add ' + item.displayName + ' to canvas'"
371
+ >
372
+ <rpt-icon name="plus" [size]="12" />
373
+ </button>
374
+
375
+ <!-- CDK Drag Placeholder / Preview -->
376
+ <div *cdkDragPlaceholder class="drag-placeholder"></div>
377
+ <div *cdkDragPreview class="drag-preview">
378
+ <div class="drag-preview-icon" [ngClass]="getCategoryTheme(item)">
379
+ <rpt-icon [name]="getIconName(item)" [size]="14" />
380
+ </div>
381
+ <div class="drag-preview-info">
382
+ <span class="drag-preview-title">{{ item.displayName }}</span>
383
+ <span class="drag-preview-desc">{{ getComponentDescription(item) }}</span>
384
+ </div>
385
+ </div>
386
+ </div>
387
+ }
388
+ </div>
389
+ </div>
390
+ </div>
391
+ </div>
392
+ }
393
+
394
+ @if (filteredCategories().length === 0) {
395
+ <div class="no-results">
396
+ <rpt-icon name="search" [size]="20" class="no-results-icon" />
397
+ <span class="no-results-text">No components matching "{{ searchQuery() }}"</span>
398
+ <button type="button" class="no-results-clear-btn" (click)="searchQuery.set('')">
399
+ Clear Search
400
+ </button>
401
+ </div>
402
+ }
403
+ </div>
404
+ </div>
405
+ `, isInline: true, styles: [":host{display:block;height:100%;background:var(--rpt-color-bg, #ffffff);border-right:1px solid var(--rpt-color-border, #e2e8f0);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.palette-container{display:flex;flex-direction:column;height:100%;background:#fff}.palette-header{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);gap:6px;flex-shrink:0}.palette-title-area{display:flex;align-items:center;gap:6px}.palette-title{font-size:.75rem;font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0;text-transform:uppercase;letter-spacing:.05em}.palette-count{font-size:.65rem;background:var(--rpt-color-surface, #f1f5f9);color:var(--rpt-color-text-muted, #475569);padding:1px 6px;border-radius:10px;font-weight:700;border:1px solid var(--rpt-color-border, #e2e8f0);line-height:1.3}.palette-actions{display:flex;align-items:center;gap:4px}.view-mode-toggle{display:inline-flex;align-items:center;background:var(--rpt-color-surface, #f1f5f9);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:5px;padding:1px}.toggle-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:20px;border:none;background:transparent;color:var(--rpt-color-text-muted, #64748b);border-radius:4px;cursor:pointer;transition:background-color .12s ease,color .12s ease,box-shadow .12s ease;padding:0}.toggle-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.toggle-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);box-shadow:0 1px 2px #0f172a14}.toggle-btn:hover:not(.active){color:var(--rpt-color-text, #0f172a)}.palette-action-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;color:var(--rpt-color-text-muted, #475569);background:#f8fafc;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:5px;cursor:pointer;transition:background-color .12s ease,color .12s ease,border-color .12s ease;font-family:inherit;flex-shrink:0}.palette-action-btn:hover{background:#eff6ff;color:var(--rpt-color-primary, #2563eb);border-color:#93c5fd}.palette-action-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.palette-search-wrapper{padding:8px 10px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);display:flex;flex-direction:column;gap:6px;flex-shrink:0;background:#fff}.search-input-box{position:relative;display:flex;align-items:center;width:100%}.search-prefix-icon{position:absolute;left:9px;color:var(--rpt-color-text-muted, #64748b);pointer-events:none}.palette-search-input{width:100%;box-sizing:border-box;height:30px;padding:4px 26px 4px 28px;font-size:.75rem;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:6px;background:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text, #0f172a);outline:none;transition:border-color .12s ease,background-color .12s ease,box-shadow .12s ease}.palette-search-input:focus{background:#fff;border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb29}.clear-search-btn{position:absolute;right:6px;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:2px;border-radius:3px;transition:color .12s ease}.clear-search-btn:hover{color:var(--rpt-color-text, #0f172a)}.clear-search-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.category-filter-chips{display:flex;align-items:center;gap:4px;overflow-x:auto;scrollbar-width:none}.category-filter-chips::-webkit-scrollbar{display:none}.category-chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 7px;border-radius:11px;font-size:.675rem;font-weight:600;color:var(--rpt-color-text-muted, #475569);background:#f8fafc;border:1px solid var(--rpt-color-border, #e2e8f0);cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .12s ease,color .12s ease,border-color .12s ease;-webkit-user-select:none;user-select:none;font-family:inherit}.category-chip:hover:not(.active){background:#f1f5f9;color:var(--rpt-color-text, #0f172a);border-color:#cbd5e1}.category-chip:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.category-chip.active{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.chip-count{font-size:.6rem;font-weight:700;background:#0f172a12;color:inherit;padding:0 4px;border-radius:6px;line-height:1.3}.category-chip.active .chip-count{background:#ffffff3d;color:#fff}.palette-scroll-area{flex:1;overflow-y:auto;padding:6px 8px 16px}.accordion-item{border-bottom:1px solid #f1f5f9;margin-bottom:4px}.accordion-item:last-child{border-bottom:none;margin-bottom:0}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:6px;background:transparent;border:none;border-radius:5px;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background-color .12s ease;font-family:inherit}.accordion-header:hover{background:#f8fafc}.accordion-header:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.accordion-header-left{display:flex;align-items:center;gap:6px;min-width:0}.accordion-chevron{display:inline-flex;align-items:center;justify-content:center;transition:transform .18s cubic-bezier(.4,0,.2,1);color:var(--rpt-color-text-muted, #64748b)}.accordion-chevron.rotated{transform:rotate(-90deg)}.category-icon-indicator{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:4px;background:#eff6ff;color:#2563eb;flex-shrink:0}.category-icon-indicator.theme-action{background:#fffbeb;color:#d97706}.category-icon-indicator.theme-display{background:#ecfdf5;color:#059669}.category-icon-indicator.theme-data{background:#f5f3ff;color:#7c3aed}.category-icon-indicator.theme-layout{background:#f1f5f9;color:#475569}.category-name{font-size:.6875rem;font-weight:700;color:var(--rpt-color-text, #334155);text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-badge{font-size:.625rem;font-weight:700;color:var(--rpt-color-text-muted, #475569);background:#f1f5f9;padding:1px 6px;border-radius:10px;flex-shrink:0}.accordion-collapse-wrapper{display:grid;grid-template-rows:0fr;transition:grid-template-rows .18s cubic-bezier(.4,0,.2,1),visibility .18s ease;visibility:hidden}.accordion-collapse-wrapper.expanded{grid-template-rows:1fr;visibility:visible}.accordion-content{overflow:hidden;min-height:0}.category-items{padding:4px 2px 8px}.item-icon-box,.item-icon-box.theme-input,.theme-input .item-icon-box{background:#eff6ff;color:#2563eb;border:1px solid #dbeafe}.item-icon-box.theme-action,.theme-action .item-icon-box{background:#fffbeb;color:#d97706;border:1px solid #fde68a}.item-icon-box.theme-display,.theme-display .item-icon-box{background:#ecfdf5;color:#059669;border:1px solid #a7f3d0}.item-icon-box.theme-data,.theme-data .item-icon-box{background:#f5f3ff;color:#7c3aed;border:1px solid #ddd6fe}.item-icon-box.theme-layout,.theme-layout .item-icon-box{background:#f1f5f9;color:#475569;border:1px solid #cbd5e1}.item-type-code{display:none!important}.category-items.grid-view{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}.category-items.grid-view .palette-item{display:flex;flex-direction:row;align-items:center;height:36px;min-height:36px;max-height:36px;padding:0 7px;gap:6px;background:#fff;border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;cursor:grab;-webkit-user-select:none;user-select:none;position:relative;transition:background-color .12s ease,border-color .12s ease,box-shadow .12s ease;min-width:0;outline:none;box-sizing:border-box}.category-items.grid-view .palette-item:hover{background:#f8fafc;border-color:#93c5fd;box-shadow:0 1px 3px #0f172a0f}.category-items.grid-view .palette-item.theme-action:hover{border-color:#fcd34d}.category-items.grid-view .palette-item.theme-display:hover{border-color:#6ee7b7}.category-items.grid-view .palette-item:focus-visible{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb38;background:#fff}.category-items.grid-view .palette-item:active{cursor:grabbing}.category-items.grid-view .item-drag-handle{display:none}.category-items.grid-view .item-icon-box{width:22px;height:22px;min-width:22px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.category-items.grid-view .item-info{display:flex;align-items:center;min-width:0;flex:1}.category-items.grid-view .item-title{font-size:.74rem;font-weight:500;color:var(--rpt-color-text, #1e293b);letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.2;width:100%}.category-items.grid-view .palette-item:hover .item-title{color:#0f172a;font-weight:600}.category-items.grid-view .item-desc{display:none}.category-items.grid-view .item-add-btn{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:20px;height:20px;border-radius:4px;border:1px solid #bfdbfe;background:#fff;color:var(--rpt-color-primary, #2563eb);display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:opacity .12s ease,background-color .12s ease,color .12s ease;padding:0;z-index:2;box-shadow:0 1px 2px #0f172a14}.category-items.grid-view .palette-item:hover .item-add-btn,.category-items.grid-view .palette-item:focus-visible .item-add-btn,.category-items.grid-view .item-add-btn:focus-visible{opacity:1}.category-items.grid-view .item-add-btn:hover,.category-items.grid-view .item-add-btn:focus-visible{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb);outline:none}.grid-view .drag-placeholder{border:1.5px dashed var(--rpt-color-primary, #2563eb);background:#2563eb0a;border-radius:6px;height:36px;min-height:36px;box-sizing:border-box}.category-items.list-view{display:flex;flex-direction:column;gap:5px}.category-items.list-view .palette-item{display:flex;flex-direction:row;align-items:center;min-height:42px;padding:5px 8px;gap:8px;background:#fff;border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;cursor:grab;-webkit-user-select:none;user-select:none;transition:background-color .12s ease,border-color .12s ease,box-shadow .12s ease;outline:none;box-sizing:border-box}.category-items.list-view .palette-item:hover{background:#f8fafc;border-color:#93c5fd;box-shadow:0 1px 3px #0f172a0f}.category-items.list-view .palette-item:focus-visible{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb38;background:#fff}.category-items.list-view .palette-item:active{cursor:grabbing}.category-items.list-view .item-drag-handle{display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #94a3b8);opacity:.5;transition:opacity .12s ease;flex-shrink:0}.category-items.list-view .palette-item:hover .item-drag-handle{opacity:.9}.category-items.list-view .item-icon-box{width:26px;height:26px;min-width:26px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.category-items.list-view .item-info{flex:1;display:flex;flex-direction:column;min-width:0;gap:1px}.category-items.list-view .item-title{font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.25}.category-items.list-view .item-desc{font-size:.65rem;color:var(--rpt-color-text-muted, #64748b);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.2}.category-items.list-view .item-add-btn{width:22px;height:22px;border-radius:5px;border:1px solid var(--rpt-color-border, #cbd5e1);background:#fff;color:var(--rpt-color-primary, #2563eb);display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:opacity .12s ease,background-color .12s ease,color .12s ease;flex-shrink:0;padding:0}.category-items.list-view .palette-item:hover .item-add-btn,.category-items.list-view .palette-item:focus-visible .item-add-btn,.category-items.list-view .item-add-btn:focus-visible{opacity:1}.category-items.list-view .item-add-btn:hover,.category-items.list-view .item-add-btn:focus-visible{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb);outline:none}.list-view .drag-placeholder{border:1.5px dashed var(--rpt-color-primary, #2563eb);background:#2563eb0a;border-radius:6px;min-height:42px;box-sizing:border-box}.drag-preview,::ng-deep .drag-preview{background:#fff;border:1.5px solid var(--rpt-color-primary, #2563eb);border-radius:6px;padding:6px 10px;display:flex;align-items:center;gap:8px;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif)!important;box-shadow:0 10px 18px -3px #0f172a33,0 4px 6px -2px #0f172a14;z-index:10000;pointer-events:none}.drag-preview-icon{width:24px;height:24px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0;background:#eff6ff;color:#2563eb;border:1px solid #dbeafe}.drag-preview-icon.theme-action{background:#fffbeb;color:#d97706;border-color:#fde68a}.drag-preview-icon.theme-display{background:#ecfdf5;color:#059669;border-color:#a7f3d0}.drag-preview-info{display:flex;flex-direction:column}.drag-preview-title{font-size:.78rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.drag-preview-desc{font-size:.65rem;color:var(--rpt-color-text-muted, #64748b)}.no-results{display:flex;flex-direction:column;align-items:center;gap:6px;padding:28px 12px;text-align:center}.no-results-icon{color:var(--rpt-color-text-muted, #94a3b8)}.no-results-text{font-size:.75rem;color:var(--rpt-color-text-muted, #475569);word-break:break-word}.no-results-clear-btn{margin-top:4px;padding:4px 10px;font-size:.7rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;cursor:pointer;transition:background-color .12s ease,color .12s ease}.no-results-clear-btn:hover{background:var(--rpt-color-primary, #2563eb);color:#fff}.no-results-clear-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}@media (prefers-reduced-motion: reduce){.accordion-collapse-wrapper,.accordion-chevron,.palette-item,.item-icon-box,.item-add-btn,.toggle-btn,.palette-action-btn,.category-chip{transition:none!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i3.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "directive", type: i3.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
126
406
  }
127
407
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentPaletteComponent, decorators: [{
128
408
  type: Component,
129
- args: [{ selector: 'rpt-component-palette', standalone: true, imports: [CommonModule, FormsModule, DragDropModule, RptIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: " <div class=\"palette-container\">\n <div class=\"palette-header\">\n <div class=\"palette-title-area\">\n <h3 class=\"palette-title\">Components</h3>\n <span class=\"palette-count\" [title]=\"totalComponentCount() + ' components available'\">\n {{ totalComponentCount() }}\n </span>\n </div>\n\n <div class=\"palette-actions\">\n <!-- View Mode Toggle: 2-Column Grid vs 1-Column List -->\n <div class=\"view-mode-toggle\" role=\"group\" aria-label=\"Palette layout view\">\n <button\n type=\"button\"\n class=\"toggle-btn\"\n [class.active]=\"layoutMode() === 'grid'\"\n [attr.aria-pressed]=\"layoutMode() === 'grid'\"\n (click)=\"layoutMode.set('grid')\"\n title=\"2-Column Grid View\"\n aria-label=\"2-Column Grid View\"\n >\n <rpt-icon name=\"grid\" [size]=\"12\" />\n </button>\n <button\n type=\"button\"\n class=\"toggle-btn\"\n [class.active]=\"layoutMode() === 'list'\"\n [attr.aria-pressed]=\"layoutMode() === 'list'\"\n (click)=\"layoutMode.set('list')\"\n title=\"Compact List View\"\n aria-label=\"Compact List View\"\n >\n <rpt-icon name=\"list\" [size]=\"12\" />\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"palette-action-btn icon-only\"\n (click)=\"toggleAllCategories()\"\n [title]=\"allExpanded() ? 'Collapse All Sections' : 'Expand All Sections'\"\n [attr.aria-label]=\"allExpanded() ? 'Collapse All Sections' : 'Expand All Sections'\"\n >\n <rpt-icon [name]=\"allExpanded() ? 'chevron-up' : 'chevron-down'\" [size]=\"13\" />\n </button>\n\n <button\n type=\"button\"\n class=\"palette-action-btn icon-only\"\n (click)=\"collapseRequested.emit()\"\n title=\"Collapse Component Palette\"\n aria-label=\"Collapse Component Palette\"\n >\n <rpt-icon name=\"chevron-left\" [size]=\"13\" />\n </button>\n </div>\n </div>\n\n <!-- Search Filter -->\n <div class=\"palette-search-wrapper\">\n <div class=\"search-input-box\">\n <rpt-icon name=\"search\" [size]=\"13\" class=\"search-prefix-icon\" />\n <input\n type=\"text\"\n class=\"palette-search-input\"\n placeholder=\"Search controls...\"\n [ngModel]=\"searchQuery()\"\n (ngModelChange)=\"searchQuery.set($event)\"\n aria-label=\"Search components\"\n />\n @if (searchQuery()) {\n <button\n type=\"button\"\n class=\"clear-search-btn\"\n (click)=\"searchQuery.set('')\"\n title=\"Clear search\"\n aria-label=\"Clear search\"\n >\n <rpt-icon name=\"close\" [size]=\"12\" />\n </button>\n }\n </div>\n </div>\n\n <!-- Palette Categories Drop List with Accordion -->\n <div\n class=\"palette-scroll-area\"\n cdkDropList\n id=\"designer-palette-drop-list\"\n [cdkDropListSortingDisabled]=\"true\"\n >\n @for (category of filteredCategories(); track category.name) {\n <div class=\"accordion-item\" [class.is-expanded]=\"isCategoryExpanded(category.name)\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleCategory(category.name)\"\n [attr.aria-expanded]=\"isCategoryExpanded(category.name)\"\n [attr.aria-controls]=\"'palette-section-' + category.name\"\n [id]=\"'palette-header-' + category.name\"\n >\n <div class=\"accordion-header-left\">\n <span class=\"accordion-chevron\" [class.rotated]=\"!isCategoryExpanded(category.name)\">\n <rpt-icon name=\"chevron-down\" [size]=\"12\" />\n </span>\n <div class=\"category-icon-indicator\">\n <rpt-icon [name]=\"category.icon\" [size]=\"13\" />\n </div>\n <span class=\"category-name\">{{ category.label }}</span>\n </div>\n <span class=\"category-badge\">{{ category.items.length }}</span>\n </button>\n\n <div\n class=\"accordion-collapse-wrapper\"\n [class.expanded]=\"isCategoryExpanded(category.name)\"\n [attr.aria-hidden]=\"!isCategoryExpanded(category.name)\"\n [id]=\"'palette-section-' + category.name\"\n role=\"region\"\n [attr.aria-labelledby]=\"'palette-header-' + category.name\"\n >\n <div class=\"accordion-content\">\n <div\n class=\"category-items\"\n [class.grid-view]=\"layoutMode() === 'grid'\"\n [class.list-view]=\"layoutMode() === 'list'\"\n >\n @for (item of category.items; track item.type) {\n <div\n class=\"palette-item\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"'Add ' + item.displayName + ' to canvas'\"\n cdkDrag\n [cdkDragData]=\"item.type\"\n (dblclick)=\"onItemDoubleClick(item.type)\"\n (keydown.enter)=\"onItemDoubleClick(item.type)\"\n (keydown.space)=\"onItemDoubleClick(item.type)\"\n [title]=\"'Drag onto canvas or double-click to add ' + item.displayName\"\n >\n <div class=\"item-icon-box\">\n <rpt-icon [name]=\"getIconName(item)\" [size]=\"layoutMode() === 'grid' ? 16 : 15\" />\n </div>\n <div class=\"item-info\">\n <span class=\"item-title\" [title]=\"item.displayName\">{{ item.displayName }}</span>\n <span class=\"item-type-code\">{{ item.type }}</span>\n </div>\n <button\n type=\"button\"\n class=\"item-add-btn\"\n (click)=\"onAddClick($event, item.type)\"\n tabindex=\"0\"\n title=\"Add to canvas\"\n aria-label=\"Add to canvas\"\n >\n <rpt-icon name=\"plus\" [size]=\"layoutMode() === 'grid' ? 12 : 13\" />\n </button>\n\n <!-- CDK Drag Placeholder / Preview -->\n <div *cdkDragPlaceholder class=\"drag-placeholder\"></div>\n <div *cdkDragPreview class=\"drag-preview\">\n <rpt-icon [name]=\"getIconName(item)\" [size]=\"16\" />\n <span>{{ item.displayName }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n @if (filteredCategories().length === 0) {\n <div class=\"no-results\">\n <rpt-icon name=\"search\" [size]=\"20\" class=\"no-results-icon\" />\n <span class=\"no-results-text\">No components matching \"{{ searchQuery() }}\"</span>\n <button type=\"button\" class=\"no-results-clear-btn\" (click)=\"searchQuery.set('')\">\n Clear Search\n </button>\n </div>\n }\n </div>\n </div>", styles: [":host{display:block;height:100%;background:var(--rpt-color-bg, #ffffff);border-right:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.palette-container{display:flex;flex-direction:column;height:100%}.palette-header{display:flex;align-items:center;justify-content:space-between;padding:12px 14px 10px;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);gap:6px}.palette-title-area{display:flex;align-items:center;gap:6px}.palette-title{font-size:var(--rpt-font-size-base, .8125rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0;text-transform:uppercase;letter-spacing:.04em}.palette-count{font-size:var(--rpt-font-size-sm, .6875rem);background:var(--rpt-color-surface, #f1f5f9);color:var(--rpt-color-text-muted, #475569);padding:1px 6px;border-radius:10px;font-weight:600}.palette-actions{display:flex;align-items:center;gap:5px}.view-mode-toggle{display:inline-flex;align-items:center;background:var(--rpt-color-surface, #f1f5f9);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:4px;padding:1px}.toggle-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:20px;border:none;background:transparent;color:var(--rpt-color-text-muted, #64748b);border-radius:3px;cursor:pointer;transition:all .12s ease;padding:0}.toggle-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.toggle-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);box-shadow:0 1px 2px #00000014}.toggle-btn:hover:not(.active){color:var(--rpt-color-text, #0f172a)}.palette-action-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:22px;padding:0;color:var(--rpt-color-primary, #2563eb);background:#2563eb0f;border:1px solid rgba(37,99,235,.18);border-radius:4px;cursor:pointer;transition:all .15s ease;font-family:inherit;flex-shrink:0}.palette-action-btn:hover{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.palette-action-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.palette-search-wrapper{padding:10px 14px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.search-input-box{position:relative;display:flex;align-items:center;width:100%}.search-prefix-icon{position:absolute;left:9px;color:var(--rpt-color-text-muted, #64748b);pointer-events:none}.palette-search-input{width:100%;box-sizing:border-box;height:32px;padding:4px 28px;font-size:var(--rpt-font-size-sm, .75rem);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);background:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text, #0f172a);outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.palette-search-input:focus{background:#fff;border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .22))}.clear-search-btn{position:absolute;right:8px;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:2px;border-radius:3px;transition:all .15s ease}.clear-search-btn:hover{color:var(--rpt-color-text, #0f172a)}.clear-search-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.palette-scroll-area{flex:1;overflow-y:auto;padding:8px 10px 16px}.accordion-item{border-bottom:1px solid var(--rpt-color-border, #f1f5f9);margin-bottom:4px}.accordion-item:last-child{border-bottom:none}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:7px 8px;background:transparent;border:none;border-radius:var(--rpt-border-radius, 5px);cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background-color var(--rpt-transition-speed, .15s) ease;font-family:inherit}.accordion-header:hover{background:var(--rpt-color-surface, #f1f5f9)}.accordion-header:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.accordion-header-left{display:flex;align-items:center;gap:7px;min-width:0}.accordion-chevron{display:inline-flex;align-items:center;justify-content:center;transition:transform .2s cubic-bezier(.4,0,.2,1);color:var(--rpt-color-text-muted, #64748b)}.accordion-chevron.rotated{transform:rotate(-90deg)}.category-icon-indicator{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:4px;background:#2563eb14;color:var(--rpt-color-primary, #2563eb);flex-shrink:0}.category-name{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #1e293b);text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-badge{font-size:.65rem;font-weight:700;color:var(--rpt-color-text, #334155);background:var(--rpt-color-surface, #e2e8f0);padding:1px 6px;border-radius:10px;flex-shrink:0}.accordion-collapse-wrapper{display:grid;grid-template-rows:0fr;transition:grid-template-rows .2s cubic-bezier(.4,0,.2,1),visibility .2s ease;visibility:hidden}.accordion-collapse-wrapper.expanded{grid-template-rows:1fr;visibility:visible}.accordion-content{overflow:hidden;min-height:0}.category-items{padding:4px 2px 8px}.category-items.grid-view{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}.category-items.grid-view .palette-item{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:10px 4px 8px;gap:5px;background:var(--rpt-color-surface, #f8fafc);border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:var(--rpt-border-radius, 6px);cursor:grab;-webkit-user-select:none;user-select:none;position:relative;transition:all var(--rpt-transition-speed, .15s) ease;min-width:0;outline:none}.category-items.grid-view .palette-item:hover{background:#fff;border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1f,0 2px 4px -2px #2563eb14;transform:translateY(-2px)}.category-items.grid-view .palette-item:focus-visible{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px var(--rpt-color-primary, #2563eb);background:#fff}.category-items.grid-view .palette-item:active{cursor:grabbing}.category-items.grid-view .item-icon-box{width:32px;height:32px;border-radius:6px;background:#fff;border:1px solid var(--rpt-color-border, #e2e8f0);display:flex;align-items:center;justify-content:center;color:var(--rpt-color-primary, #2563eb);transition:transform .15s ease,background-color .15s ease;flex-shrink:0}.category-items.grid-view .palette-item:hover .item-icon-box,.category-items.grid-view .palette-item:focus-visible .item-icon-box{background:#2563eb14;transform:scale(1.08)}.category-items.grid-view .item-info{display:flex;flex-direction:column;align-items:center;width:100%;min-width:0;padding:0 2px}.category-items.grid-view .item-title{font-size:.6875rem;font-weight:600;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%;text-align:center}.category-items.grid-view .item-type-code{font-size:.58rem;color:var(--rpt-color-text-muted, #475569);font-family:monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%;text-align:center}.category-items.grid-view .item-add-btn{position:absolute;top:3px;right:3px;width:18px;height:18px;border-radius:3px;border:1px solid var(--rpt-color-border, #cbd5e1);background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:700;font-size:.75rem;display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:all var(--rpt-transition-speed, .15s) ease}.category-items.grid-view .palette-item:hover .item-add-btn,.category-items.grid-view .palette-item:focus-visible .item-add-btn,.category-items.grid-view .item-add-btn:focus-visible{opacity:1}.category-items.grid-view .item-add-btn:hover,.category-items.grid-view .item-add-btn:focus-visible{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb);outline:none}.grid-view .drag-placeholder{border:2px dashed var(--rpt-color-primary, #2563eb);background:#2563eb0d;border-radius:var(--rpt-border-radius, 6px);min-height:72px;box-sizing:border-box;opacity:.6}.category-items.list-view{display:flex;flex-direction:column;gap:6px}.category-items.list-view .palette-item{display:flex;align-items:center;gap:10px;padding:7px 9px;background:var(--rpt-color-surface, #f8fafc);border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:var(--rpt-border-radius, 6px);cursor:grab;-webkit-user-select:none;user-select:none;transition:all var(--rpt-transition-speed, .15s) ease;outline:none}.category-items.list-view .palette-item:hover{background:#fff;border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 2px 4px #2563eb14;transform:translateY(-1px)}.category-items.list-view .palette-item:focus-visible{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px var(--rpt-color-primary, #2563eb);background:#fff}.category-items.list-view .palette-item:active{cursor:grabbing}.category-items.list-view .item-icon-box{width:26px;height:26px;border-radius:4px;background:#fff;border:1px solid var(--rpt-color-border, #e2e8f0);display:flex;align-items:center;justify-content:center;color:var(--rpt-color-primary, #2563eb);flex-shrink:0}.category-items.list-view .item-info{flex:1;display:flex;flex-direction:column;min-width:0}.category-items.list-view .item-title{font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-items.list-view .item-type-code{font-size:.65rem;color:var(--rpt-color-text-muted, #475569);font-family:monospace}.category-items.list-view .item-add-btn{width:24px;height:24px;border-radius:4px;border:1px solid var(--rpt-color-border, #cbd5e1);background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:700;font-size:.85rem;display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:all var(--rpt-transition-speed, .15s) ease}.category-items.list-view .palette-item:hover .item-add-btn,.category-items.list-view .palette-item:focus-visible .item-add-btn,.category-items.list-view .item-add-btn:focus-visible{opacity:1}.category-items.list-view .item-add-btn:hover,.category-items.list-view .item-add-btn:focus-visible{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb);outline:none}.list-view .drag-placeholder{border:2px dashed var(--rpt-color-primary, #2563eb);background:#2563eb0d;border-radius:var(--rpt-border-radius, 6px);min-height:40px;box-sizing:border-box;opacity:.6}.drag-preview,::ng-deep .drag-preview{background:#fff;border:2px solid var(--rpt-color-primary, #2563eb);border-radius:6px;padding:8px 14px;display:flex;align-items:center;gap:8px;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif)!important;font-size:.8rem;font-weight:600;color:var(--rpt-color-text, #0f172a);box-shadow:0 10px 15px -3px #0003;z-index:10000}.drag-preview *,::ng-deep .drag-preview *{font-family:inherit!important}.no-results{display:flex;flex-direction:column;align-items:center;gap:8px;padding:32px 12px;text-align:center}.no-results-icon{color:var(--rpt-color-text-muted, #64748b);opacity:.7}.no-results-text{font-size:.75rem;color:var(--rpt-color-text-muted, #475569);word-break:break-word}.no-results-clear-btn{margin-top:4px;padding:4px 10px;font-size:.7rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#2563eb14;border:1px solid rgba(37,99,235,.2);border-radius:4px;cursor:pointer;transition:all .15s ease}.no-results-clear-btn:hover{background:var(--rpt-color-primary, #2563eb);color:#fff}.no-results-clear-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}@media (prefers-reduced-motion: reduce){.accordion-collapse-wrapper,.accordion-chevron,.palette-item,.item-icon-box,.item-add-btn,.toggle-btn,.palette-action-btn{transition:none!important;transform:none!important}}\n"] }]
409
+ args: [{ selector: 'rpt-component-palette', standalone: true, imports: [CommonModule, FormsModule, DragDropModule, RptIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
410
+ <div class="palette-container">
411
+ <div class="palette-header">
412
+ <div class="palette-title-area">
413
+ <h3 class="palette-title">Components</h3>
414
+ <span
415
+ class="palette-count"
416
+ role="status"
417
+ aria-atomic="true"
418
+ [attr.aria-label]="totalComponentCount() + ' components available'"
419
+ [title]="totalComponentCount() + ' components available'"
420
+ >
421
+ {{ totalComponentCount() }}
422
+ </span>
423
+ </div>
424
+
425
+ <div class="palette-actions">
426
+ <!-- View Mode Toggle: 2-Column Grid vs 1-Column List -->
427
+ <div class="view-mode-toggle" role="group" aria-label="Palette layout view">
428
+ <button
429
+ type="button"
430
+ class="toggle-btn"
431
+ [class.active]="layoutMode() === 'grid'"
432
+ [attr.aria-pressed]="layoutMode() === 'grid'"
433
+ (click)="layoutMode.set('grid')"
434
+ title="Compact 2-Column Grid"
435
+ aria-label="2-Column Grid View"
436
+ >
437
+ <rpt-icon name="grid" [size]="12" />
438
+ </button>
439
+ <button
440
+ type="button"
441
+ class="toggle-btn"
442
+ [class.active]="layoutMode() === 'list'"
443
+ [attr.aria-pressed]="layoutMode() === 'list'"
444
+ (click)="layoutMode.set('list')"
445
+ title="Detailed List View"
446
+ aria-label="Compact List View"
447
+ >
448
+ <rpt-icon name="list" [size]="12" />
449
+ </button>
450
+ </div>
451
+
452
+ <button
453
+ type="button"
454
+ class="palette-action-btn icon-only"
455
+ (click)="toggleAllCategories()"
456
+ [title]="allExpanded() ? 'Collapse All Sections' : 'Expand All Sections'"
457
+ [attr.aria-label]="allExpanded() ? 'Collapse All Sections' : 'Expand All Sections'"
458
+ >
459
+ <rpt-icon [name]="allExpanded() ? 'chevron-up' : 'chevron-down'" [size]="13" />
460
+ </button>
461
+
462
+ <button
463
+ type="button"
464
+ class="palette-action-btn icon-only"
465
+ (click)="collapseRequested.emit()"
466
+ title="Collapse Component Palette"
467
+ aria-label="Collapse Component Palette"
468
+ >
469
+ <rpt-icon name="chevron-left" [size]="13" />
470
+ </button>
471
+ </div>
472
+ </div>
473
+
474
+ <!-- Search Filter & Quick Category Filter Pills -->
475
+ <div class="palette-search-wrapper">
476
+ <div class="search-input-box">
477
+ <rpt-icon name="search" [size]="13" class="search-prefix-icon" />
478
+ <input
479
+ type="text"
480
+ class="palette-search-input"
481
+ placeholder="Search components..."
482
+ [ngModel]="searchQuery()"
483
+ (ngModelChange)="searchQuery.set($event)"
484
+ aria-label="Search components"
485
+ />
486
+ @if (searchQuery()) {
487
+ <button
488
+ type="button"
489
+ class="clear-search-btn"
490
+ (click)="searchQuery.set('')"
491
+ title="Clear search"
492
+ aria-label="Clear search"
493
+ >
494
+ <rpt-icon name="close" [size]="12" />
495
+ </button>
496
+ }
497
+ </div>
498
+
499
+ <div class="category-filter-chips" role="tablist" aria-label="Filter components by category">
500
+ @for (tab of availableCategories(); track tab.id) {
501
+ <button
502
+ type="button"
503
+ class="category-chip"
504
+ [class.active]="selectedCategory() === tab.id"
505
+ (click)="selectCategory(tab.id)"
506
+ role="tab"
507
+ [attr.aria-selected]="selectedCategory() === tab.id"
508
+ [title]="'Show ' + tab.label + ' (' + tab.count + ')'"
509
+ >
510
+ <span class="chip-label">{{ tab.label }}</span>
511
+ <span class="chip-count">{{ tab.count }}</span>
512
+ </button>
513
+ }
514
+ </div>
515
+ </div>
516
+
517
+ <!-- Palette Categories Drop List with Accordion -->
518
+ <div
519
+ class="palette-scroll-area"
520
+ cdkDropList
521
+ id="designer-palette-drop-list"
522
+ [cdkDropListSortingDisabled]="true"
523
+ >
524
+ @for (category of filteredCategories(); track category.name) {
525
+ <div class="accordion-item" [class.is-expanded]="isCategoryExpanded(category.name)">
526
+ <button
527
+ type="button"
528
+ class="accordion-header"
529
+ (click)="toggleCategory(category.name)"
530
+ [attr.aria-expanded]="isCategoryExpanded(category.name)"
531
+ [attr.aria-controls]="'palette-section-' + category.name"
532
+ [id]="'palette-header-' + category.name"
533
+ >
534
+ <div class="accordion-header-left">
535
+ <span class="accordion-chevron" [class.rotated]="!isCategoryExpanded(category.name)">
536
+ <rpt-icon name="chevron-down" [size]="12" />
537
+ </span>
538
+ <div class="category-icon-indicator" [ngClass]="'theme-' + category.name">
539
+ <rpt-icon [name]="category.icon" [size]="12" />
540
+ </div>
541
+ <span class="category-name">{{ category.label }}</span>
542
+ </div>
543
+ <span class="category-badge">{{ category.items.length }}</span>
544
+ </button>
545
+
546
+ <div
547
+ class="accordion-collapse-wrapper"
548
+ [class.expanded]="isCategoryExpanded(category.name)"
549
+ [attr.aria-hidden]="!isCategoryExpanded(category.name)"
550
+ [id]="'palette-section-' + category.name"
551
+ role="region"
552
+ [attr.aria-labelledby]="'palette-header-' + category.name"
553
+ >
554
+ <div class="accordion-content">
555
+ <div
556
+ class="category-items"
557
+ [class.grid-view]="layoutMode() === 'grid'"
558
+ [class.list-view]="layoutMode() === 'list'"
559
+ >
560
+ @for (item of category.items; track item.type) {
561
+ <div
562
+ class="palette-item"
563
+ [ngClass]="getCategoryTheme(item)"
564
+ tabindex="0"
565
+ role="button"
566
+ [attr.aria-label]="'Add ' + item.displayName + ' (' + getComponentDescription(item) + ') to canvas'"
567
+ cdkDrag
568
+ [cdkDragData]="item.type"
569
+ (dblclick)="onItemDoubleClick(item.type)"
570
+ (keydown.enter)="onItemDoubleClick(item.type)"
571
+ (keydown.space)="onItemDoubleClick(item.type)"
572
+ [title]="item.displayName + ' — ' + getComponentDescription(item) + ' (Drag or double-click to add)'"
573
+ >
574
+ <span class="item-drag-handle" aria-hidden="true">
575
+ <rpt-icon name="grip-vertical" [size]="12" />
576
+ </span>
577
+
578
+ <div class="item-icon-box" [ngClass]="getCategoryTheme(item)">
579
+ <rpt-icon [name]="getIconName(item)" [size]="14" />
580
+ </div>
581
+
582
+ <div class="item-info">
583
+ <span class="item-title">
584
+ {{ layoutMode() === 'grid' ? getGridLabel(item) : item.displayName }}
585
+ </span>
586
+ @if (layoutMode() === 'list') {
587
+ <span class="item-desc">{{ getComponentDescription(item) }}</span>
588
+ }
589
+ </div>
590
+
591
+ <button
592
+ type="button"
593
+ class="item-add-btn"
594
+ (click)="onAddClick($event, item.type)"
595
+ tabindex="0"
596
+ [title]="'Add ' + item.displayName + ' to canvas'"
597
+ [attr.aria-label]="'Add ' + item.displayName + ' to canvas'"
598
+ >
599
+ <rpt-icon name="plus" [size]="12" />
600
+ </button>
601
+
602
+ <!-- CDK Drag Placeholder / Preview -->
603
+ <div *cdkDragPlaceholder class="drag-placeholder"></div>
604
+ <div *cdkDragPreview class="drag-preview">
605
+ <div class="drag-preview-icon" [ngClass]="getCategoryTheme(item)">
606
+ <rpt-icon [name]="getIconName(item)" [size]="14" />
607
+ </div>
608
+ <div class="drag-preview-info">
609
+ <span class="drag-preview-title">{{ item.displayName }}</span>
610
+ <span class="drag-preview-desc">{{ getComponentDescription(item) }}</span>
611
+ </div>
612
+ </div>
613
+ </div>
614
+ }
615
+ </div>
616
+ </div>
617
+ </div>
618
+ </div>
619
+ }
620
+
621
+ @if (filteredCategories().length === 0) {
622
+ <div class="no-results">
623
+ <rpt-icon name="search" [size]="20" class="no-results-icon" />
624
+ <span class="no-results-text">No components matching "{{ searchQuery() }}"</span>
625
+ <button type="button" class="no-results-clear-btn" (click)="searchQuery.set('')">
626
+ Clear Search
627
+ </button>
628
+ </div>
629
+ }
630
+ </div>
631
+ </div>
632
+ `, styles: [":host{display:block;height:100%;background:var(--rpt-color-bg, #ffffff);border-right:1px solid var(--rpt-color-border, #e2e8f0);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.palette-container{display:flex;flex-direction:column;height:100%;background:#fff}.palette-header{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);gap:6px;flex-shrink:0}.palette-title-area{display:flex;align-items:center;gap:6px}.palette-title{font-size:.75rem;font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0;text-transform:uppercase;letter-spacing:.05em}.palette-count{font-size:.65rem;background:var(--rpt-color-surface, #f1f5f9);color:var(--rpt-color-text-muted, #475569);padding:1px 6px;border-radius:10px;font-weight:700;border:1px solid var(--rpt-color-border, #e2e8f0);line-height:1.3}.palette-actions{display:flex;align-items:center;gap:4px}.view-mode-toggle{display:inline-flex;align-items:center;background:var(--rpt-color-surface, #f1f5f9);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:5px;padding:1px}.toggle-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:20px;border:none;background:transparent;color:var(--rpt-color-text-muted, #64748b);border-radius:4px;cursor:pointer;transition:background-color .12s ease,color .12s ease,box-shadow .12s ease;padding:0}.toggle-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.toggle-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);box-shadow:0 1px 2px #0f172a14}.toggle-btn:hover:not(.active){color:var(--rpt-color-text, #0f172a)}.palette-action-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;color:var(--rpt-color-text-muted, #475569);background:#f8fafc;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:5px;cursor:pointer;transition:background-color .12s ease,color .12s ease,border-color .12s ease;font-family:inherit;flex-shrink:0}.palette-action-btn:hover{background:#eff6ff;color:var(--rpt-color-primary, #2563eb);border-color:#93c5fd}.palette-action-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.palette-search-wrapper{padding:8px 10px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);display:flex;flex-direction:column;gap:6px;flex-shrink:0;background:#fff}.search-input-box{position:relative;display:flex;align-items:center;width:100%}.search-prefix-icon{position:absolute;left:9px;color:var(--rpt-color-text-muted, #64748b);pointer-events:none}.palette-search-input{width:100%;box-sizing:border-box;height:30px;padding:4px 26px 4px 28px;font-size:.75rem;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:6px;background:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text, #0f172a);outline:none;transition:border-color .12s ease,background-color .12s ease,box-shadow .12s ease}.palette-search-input:focus{background:#fff;border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb29}.clear-search-btn{position:absolute;right:6px;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:2px;border-radius:3px;transition:color .12s ease}.clear-search-btn:hover{color:var(--rpt-color-text, #0f172a)}.clear-search-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.category-filter-chips{display:flex;align-items:center;gap:4px;overflow-x:auto;scrollbar-width:none}.category-filter-chips::-webkit-scrollbar{display:none}.category-chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 7px;border-radius:11px;font-size:.675rem;font-weight:600;color:var(--rpt-color-text-muted, #475569);background:#f8fafc;border:1px solid var(--rpt-color-border, #e2e8f0);cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .12s ease,color .12s ease,border-color .12s ease;-webkit-user-select:none;user-select:none;font-family:inherit}.category-chip:hover:not(.active){background:#f1f5f9;color:var(--rpt-color-text, #0f172a);border-color:#cbd5e1}.category-chip:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.category-chip.active{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.chip-count{font-size:.6rem;font-weight:700;background:#0f172a12;color:inherit;padding:0 4px;border-radius:6px;line-height:1.3}.category-chip.active .chip-count{background:#ffffff3d;color:#fff}.palette-scroll-area{flex:1;overflow-y:auto;padding:6px 8px 16px}.accordion-item{border-bottom:1px solid #f1f5f9;margin-bottom:4px}.accordion-item:last-child{border-bottom:none;margin-bottom:0}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:6px;background:transparent;border:none;border-radius:5px;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background-color .12s ease;font-family:inherit}.accordion-header:hover{background:#f8fafc}.accordion-header:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.accordion-header-left{display:flex;align-items:center;gap:6px;min-width:0}.accordion-chevron{display:inline-flex;align-items:center;justify-content:center;transition:transform .18s cubic-bezier(.4,0,.2,1);color:var(--rpt-color-text-muted, #64748b)}.accordion-chevron.rotated{transform:rotate(-90deg)}.category-icon-indicator{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:4px;background:#eff6ff;color:#2563eb;flex-shrink:0}.category-icon-indicator.theme-action{background:#fffbeb;color:#d97706}.category-icon-indicator.theme-display{background:#ecfdf5;color:#059669}.category-icon-indicator.theme-data{background:#f5f3ff;color:#7c3aed}.category-icon-indicator.theme-layout{background:#f1f5f9;color:#475569}.category-name{font-size:.6875rem;font-weight:700;color:var(--rpt-color-text, #334155);text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-badge{font-size:.625rem;font-weight:700;color:var(--rpt-color-text-muted, #475569);background:#f1f5f9;padding:1px 6px;border-radius:10px;flex-shrink:0}.accordion-collapse-wrapper{display:grid;grid-template-rows:0fr;transition:grid-template-rows .18s cubic-bezier(.4,0,.2,1),visibility .18s ease;visibility:hidden}.accordion-collapse-wrapper.expanded{grid-template-rows:1fr;visibility:visible}.accordion-content{overflow:hidden;min-height:0}.category-items{padding:4px 2px 8px}.item-icon-box,.item-icon-box.theme-input,.theme-input .item-icon-box{background:#eff6ff;color:#2563eb;border:1px solid #dbeafe}.item-icon-box.theme-action,.theme-action .item-icon-box{background:#fffbeb;color:#d97706;border:1px solid #fde68a}.item-icon-box.theme-display,.theme-display .item-icon-box{background:#ecfdf5;color:#059669;border:1px solid #a7f3d0}.item-icon-box.theme-data,.theme-data .item-icon-box{background:#f5f3ff;color:#7c3aed;border:1px solid #ddd6fe}.item-icon-box.theme-layout,.theme-layout .item-icon-box{background:#f1f5f9;color:#475569;border:1px solid #cbd5e1}.item-type-code{display:none!important}.category-items.grid-view{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}.category-items.grid-view .palette-item{display:flex;flex-direction:row;align-items:center;height:36px;min-height:36px;max-height:36px;padding:0 7px;gap:6px;background:#fff;border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;cursor:grab;-webkit-user-select:none;user-select:none;position:relative;transition:background-color .12s ease,border-color .12s ease,box-shadow .12s ease;min-width:0;outline:none;box-sizing:border-box}.category-items.grid-view .palette-item:hover{background:#f8fafc;border-color:#93c5fd;box-shadow:0 1px 3px #0f172a0f}.category-items.grid-view .palette-item.theme-action:hover{border-color:#fcd34d}.category-items.grid-view .palette-item.theme-display:hover{border-color:#6ee7b7}.category-items.grid-view .palette-item:focus-visible{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb38;background:#fff}.category-items.grid-view .palette-item:active{cursor:grabbing}.category-items.grid-view .item-drag-handle{display:none}.category-items.grid-view .item-icon-box{width:22px;height:22px;min-width:22px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.category-items.grid-view .item-info{display:flex;align-items:center;min-width:0;flex:1}.category-items.grid-view .item-title{font-size:.74rem;font-weight:500;color:var(--rpt-color-text, #1e293b);letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.2;width:100%}.category-items.grid-view .palette-item:hover .item-title{color:#0f172a;font-weight:600}.category-items.grid-view .item-desc{display:none}.category-items.grid-view .item-add-btn{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:20px;height:20px;border-radius:4px;border:1px solid #bfdbfe;background:#fff;color:var(--rpt-color-primary, #2563eb);display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:opacity .12s ease,background-color .12s ease,color .12s ease;padding:0;z-index:2;box-shadow:0 1px 2px #0f172a14}.category-items.grid-view .palette-item:hover .item-add-btn,.category-items.grid-view .palette-item:focus-visible .item-add-btn,.category-items.grid-view .item-add-btn:focus-visible{opacity:1}.category-items.grid-view .item-add-btn:hover,.category-items.grid-view .item-add-btn:focus-visible{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb);outline:none}.grid-view .drag-placeholder{border:1.5px dashed var(--rpt-color-primary, #2563eb);background:#2563eb0a;border-radius:6px;height:36px;min-height:36px;box-sizing:border-box}.category-items.list-view{display:flex;flex-direction:column;gap:5px}.category-items.list-view .palette-item{display:flex;flex-direction:row;align-items:center;min-height:42px;padding:5px 8px;gap:8px;background:#fff;border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;cursor:grab;-webkit-user-select:none;user-select:none;transition:background-color .12s ease,border-color .12s ease,box-shadow .12s ease;outline:none;box-sizing:border-box}.category-items.list-view .palette-item:hover{background:#f8fafc;border-color:#93c5fd;box-shadow:0 1px 3px #0f172a0f}.category-items.list-view .palette-item:focus-visible{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb38;background:#fff}.category-items.list-view .palette-item:active{cursor:grabbing}.category-items.list-view .item-drag-handle{display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #94a3b8);opacity:.5;transition:opacity .12s ease;flex-shrink:0}.category-items.list-view .palette-item:hover .item-drag-handle{opacity:.9}.category-items.list-view .item-icon-box{width:26px;height:26px;min-width:26px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.category-items.list-view .item-info{flex:1;display:flex;flex-direction:column;min-width:0;gap:1px}.category-items.list-view .item-title{font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.25}.category-items.list-view .item-desc{font-size:.65rem;color:var(--rpt-color-text-muted, #64748b);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.2}.category-items.list-view .item-add-btn{width:22px;height:22px;border-radius:5px;border:1px solid var(--rpt-color-border, #cbd5e1);background:#fff;color:var(--rpt-color-primary, #2563eb);display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:opacity .12s ease,background-color .12s ease,color .12s ease;flex-shrink:0;padding:0}.category-items.list-view .palette-item:hover .item-add-btn,.category-items.list-view .palette-item:focus-visible .item-add-btn,.category-items.list-view .item-add-btn:focus-visible{opacity:1}.category-items.list-view .item-add-btn:hover,.category-items.list-view .item-add-btn:focus-visible{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb);outline:none}.list-view .drag-placeholder{border:1.5px dashed var(--rpt-color-primary, #2563eb);background:#2563eb0a;border-radius:6px;min-height:42px;box-sizing:border-box}.drag-preview,::ng-deep .drag-preview{background:#fff;border:1.5px solid var(--rpt-color-primary, #2563eb);border-radius:6px;padding:6px 10px;display:flex;align-items:center;gap:8px;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif)!important;box-shadow:0 10px 18px -3px #0f172a33,0 4px 6px -2px #0f172a14;z-index:10000;pointer-events:none}.drag-preview-icon{width:24px;height:24px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0;background:#eff6ff;color:#2563eb;border:1px solid #dbeafe}.drag-preview-icon.theme-action{background:#fffbeb;color:#d97706;border-color:#fde68a}.drag-preview-icon.theme-display{background:#ecfdf5;color:#059669;border-color:#a7f3d0}.drag-preview-info{display:flex;flex-direction:column}.drag-preview-title{font-size:.78rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.drag-preview-desc{font-size:.65rem;color:var(--rpt-color-text-muted, #64748b)}.no-results{display:flex;flex-direction:column;align-items:center;gap:6px;padding:28px 12px;text-align:center}.no-results-icon{color:var(--rpt-color-text-muted, #94a3b8)}.no-results-text{font-size:.75rem;color:var(--rpt-color-text-muted, #475569);word-break:break-word}.no-results-clear-btn{margin-top:4px;padding:4px 10px;font-size:.7rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;cursor:pointer;transition:background-color .12s ease,color .12s ease}.no-results-clear-btn:hover{background:var(--rpt-color-primary, #2563eb);color:#fff}.no-results-clear-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}@media (prefers-reduced-motion: reduce){.accordion-collapse-wrapper,.accordion-chevron,.palette-item,.item-icon-box,.item-add-btn,.toggle-btn,.palette-action-btn,.category-chip{transition:none!important}}\n"] }]
130
633
  }] });
634
+ /** Concise labels optimized for 2-column compact grid tiles (zero truncation) */
635
+ export const COMPONENT_SHORT_LABELS = {
636
+ input: 'Text Input',
637
+ dropdown: 'Dropdown',
638
+ date: 'Date Picker',
639
+ 'date-range': 'Date Range',
640
+ number: 'Number',
641
+ checkbox: 'Checkbox',
642
+ radio: 'Radio Group',
643
+ button: 'Button',
644
+ 'kpi-card': 'KPI Card',
645
+ chart: 'Chart',
646
+ };
647
+ /** Dictionary of user-friendly micro-copy descriptions explaining each component's purpose */
648
+ export const COMPONENT_DESCRIPTIONS = {
649
+ input: 'Single-line text entry field',
650
+ dropdown: 'Select option or API lookup',
651
+ date: 'Calendar date picker',
652
+ 'date-range': 'Date range selector',
653
+ number: 'Numeric value & counter',
654
+ checkbox: 'Toggle boolean checkbox',
655
+ radio: 'Single choice selector',
656
+ button: 'Trigger action or procedure',
657
+ 'kpi-card': 'Metric KPI summary card',
658
+ chart: 'Interactive data visualization',
659
+ };
131
660
  /** Dictionary of synonyms for component types and UI concepts */
132
661
  export const COMPONENT_SYNONYMS = {
133
662
  input: ['textbox', 'text', 'field', 'string', 'entry', 'prompt'],
@@ -135,6 +664,7 @@ export const COMPONENT_SYNONYMS = {
135
664
  date: ['calendar', 'time', 'datetime', 'day', 'month', 'year', 'schedule', 'picker'],
136
665
  number: ['numeric', 'integer', 'float', 'amount', 'currency', 'price', 'quantity', 'counter', 'digits', 'sum'],
137
666
  checkbox: ['toggle', 'switch', 'boolean', 'check', 'tick', 'flag', 'yes/no'],
667
+ radio: ['radiobutton', 'radiogroup', 'option', 'choice', 'single-select', 'selector', 'picker'],
138
668
  button: ['action', 'submit', 'trigger', 'click', 'cta', 'press', 'execute'],
139
669
  'kpi-card': ['kpi', 'metric', 'stat', 'card', 'indicator', 'summary', 'figure', 'analytics', 'measure', 'total'],
140
670
  chart: ['graph', 'bar', 'donut', 'line', 'visual', 'analytics', 'plot', 'pie', 'diagram'],
@@ -202,4 +732,4 @@ export function matchesSearchQuery(item, rawQuery) {
202
732
  ];
203
733
  return tokens.every((token) => targetWords.some((word) => fuzzyMatchWord(word, token)));
204
734
  }
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXBhbGV0dGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9jb21wb25lbnQtcGFsZXR0ZS9jb21wb25lbnQtcGFsZXR0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL2NvbXBvbmVudC1wYWxldHRlL2NvbXBvbmVudC1wYWxldHRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBd0IsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGlCQUFpQixFQUEwQixNQUFNLDhDQUE4QyxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7O0FBVWxGLE1BQU0sT0FBTyx5QkFBeUI7SUFDbkIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JDLGFBQWEsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM3QyxlQUFl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QyxXQUFXLEVBQUU7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUU7UUFDM0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDOUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDekMsR0FBRyxRQUFRO0tBQ1osQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENka0RyYWcsIENka0RyYWdEcm9wLCBEcmFnRHJvcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVnaXN0cnksIFJlcG9ydGluZ0NvbXBvbmVudE1ldGEgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3JlZ2lzdHJ5L2NvbXBvbmVudC1yZWdpc3RyeSc7XG5pbXBvcnQgeyBEZXNpZ25lclN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Rlc2lnbmVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSRVBPUlRJTkdfQ09ORklHIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS90b2tlbnMvcmVwb3J0aW5nLWNvbmZpZy50b2tlbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1jb21wb25lbnQtcGFsZXR0ZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBEcmFnRHJvcE1vZHVsZSwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtcGFsZXR0ZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jb21wb25lbnQtcGFsZXR0ZS5jb21wb25lbnQuY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudFBhbGV0dGVDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5ID0gaW5qZWN0KENvbXBvbmVudFJlZ2lzdHJ5KTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXNpZ25lclN0YXRlID0gaW5qZWN0KERlc2lnbmVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRpbmdDb25maWcgPSBpbmplY3QoUkVQT1JUSU5HX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICByZWFkb25seSBjb2xsYXBzZVJlcXVlc3RlZCA9IG91dHB1dDx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IHNlYXJjaFF1ZXJ5ID0gc2lnbmFsPHN0cmluZz4oJycpO1xuXG4gIC8qKiBMYXlvdXQgdmlldyBtb2RlOiAnZ3JpZCcgKDItY29sdW1uIHNpZGUtYnktc2lkZSBncmlkKSBvciAnbGlzdCcgKGNvbXBhY3Qgcm93IGxpc3QpLiBEZWZhdWx0cyB0byAnZ3JpZCcuICovXG4gIHJlYWRvbmx5IGxheW91dE1vZGUgPSBzaWduYWw8J2dyaWQnIHwgJ2xpc3QnPignZ3JpZCcpO1xuXG4gIC8qKiBTZXQgb2YgZXhwYW5kZWQgY2F0ZWdvcnkgSURzICovXG4gIHJlYWRvbmx5IGV4cGFuZGVkQ2F0ZWdvcmllcyA9IHNpZ25hbDxTZXQ8c3RyaW5nPj4oXG4gICAgbmV3IFNldChbJ2lucHV0JywgJ2FjdGlvbicsICdkaXNwbGF5JywgJ2RhdGEnLCAnbGF5b3V0J10pXG4gICk7XG5cbiAgcmVhZG9ubHkgdG90YWxDb21wb25lbnRDb3VudCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucmVnaXN0cnkuZ2V0QWxsKCkubGVuZ3RoKTtcblxuICByZWFkb25seSBjYXRlZ29yeU1ldGE6IFJlY29yZDxzdHJpbmcsIHsgbGFiZWw6IHN0cmluZzsgaWNvbjogc3RyaW5nIH0+ID0ge1xuICAgIGlucHV0OiB7IGxhYmVsOiAnRm9ybSBJbnB1dHMnLCBpY29uOiAndGV4dC1maWVsZHMnIH0sXG4gICAgYWN0aW9uOiB7IGxhYmVsOiAnQWN0aW9uIEJ1dHRvbnMnLCBpY29uOiAnbGlnaHRuaW5nJyB9LFxuICAgIGRpc3BsYXk6IHsgbGFiZWw6ICdEaXNwbGF5ICYgTGFiZWxzJywgaWNvbjogJ2NoYXJ0LWJhcicgfSxcbiAgICBkYXRhOiB7IGxhYmVsOiAnRGF0YSAmIExvb2t1cHMnLCBpY29uOiAnZ3JpZCcgfSxcbiAgICBsYXlvdXQ6IHsgbGFiZWw6ICdMYXlvdXQgJiBDb250YWluZXJzJywgaWNvbjogJ2xheW91dCcgfSxcbiAgfTtcblxuICByZWFkb25seSBmaWx0ZXJlZENhdGVnb3JpZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5yZWdpc3RyeS5nZXRBbGwoKTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2VhcmNoUXVlcnkoKTtcbiAgICBjb25zdCBhbGxvd2VkQ2F0cyA9IHRoaXMucmVwb3J0aW5nQ29uZmlnPy5hbGxvd2VkQ2F0ZWdvcmllcztcblxuICAgIGxldCBmaWx0ZXJlZCA9IHF1ZXJ5XG4gICAgICA/IGFsbC5maWx0ZXIoKGMpID0+IG1hdGNoZXNTZWFyY2hRdWVyeShjLCBxdWVyeSkpXG4gICAgICA6IGFsbDtcblxuICAgIC8vIEZpbHRlciBieSBhbGxvd2VkIGNhdGVnb3JpZXMgaWYgY29uZmlndXJlZFxuICAgIGlmIChhbGxvd2VkQ2F0cyAmJiBhbGxvd2VkQ2F0cy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigoYykgPT4ge1xuICAgICAgICBjb25zdCBjYXQgPSBjLmNhdGVnb3J5IHx8ICdpbnB1dCc7XG4gICAgICAgIHJldHVybiBhbGxvd2VkQ2F0cy5pbmNsdWRlcyhjYXQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIFJlcG9ydGluZ0NvbXBvbmVudE1ldGFbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZmlsdGVyZWQpIHtcbiAgICAgIGNvbnN0IGNhdCA9IGl0ZW0uY2F0ZWdvcnkgfHwgJ2lucHV0JztcbiAgICAgIGlmICghZ3JvdXBzLmhhcyhjYXQpKSB7XG4gICAgICAgIGdyb3Vwcy5zZXQoY2F0LCBbXSk7XG4gICAgICB9XG4gICAgICBncm91cHMuZ2V0KGNhdCkhLnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oZ3JvdXBzLmVudHJpZXMoKSkubWFwKChbY2F0LCBpdGVtc10pID0+IHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNhdGVnb3J5TWV0YVtjYXRdO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogY2F0LFxuICAgICAgICBsYWJlbDogbWV0YT8ubGFiZWwgPz8gY2F0LFxuICAgICAgICBpY29uOiBtZXRhPy5pY29uID8/ICdib3gnLFxuICAgICAgICBpdGVtcyxcbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFsbEV4cGFuZGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNhdHMgPSB0aGlzLmZpbHRlcmVkQ2F0ZWdvcmllcygpO1xuICAgIGlmIChjYXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGV4cGFuZGVkID0gdGhpcy5leHBhbmRlZENhdGVnb3JpZXMoKTtcbiAgICByZXR1cm4gY2F0cy5ldmVyeSgoYykgPT4gZXhwYW5kZWQuaGFzKGMubmFtZSkpO1xuICB9KTtcblxuICBpc0NhdGVnb3J5RXhwYW5kZWQoY2F0ZWdvcnlOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBXaGVuIHNlYXJjaGluZywgYXV0by1leHBhbmQgY2F0ZWdvcmllcyB0aGF0IGNvbnRhaW4gbWF0Y2hpbmcgcmVzdWx0c1xuICAgIGlmICh0aGlzLnNlYXJjaFF1ZXJ5KCkudHJpbSgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRDYXRlZ29yaWVzKCkuaGFzKGNhdGVnb3J5TmFtZSk7XG4gIH1cblxuICB0b2dnbGVDYXRlZ29yeShjYXRlZ29yeU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBuZXcgU2V0KHRoaXMuZXhwYW5kZWRDYXRlZ29yaWVzKCkpO1xuICAgIGlmIChjdXJyZW50LmhhcyhjYXRlZ29yeU5hbWUpKSB7XG4gICAgICBjdXJyZW50LmRlbGV0ZShjYXRlZ29yeU5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50LmFkZChjYXRlZ29yeU5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmV4cGFuZGVkQ2F0ZWdvcmllcy5zZXQoY3VycmVudCk7XG4gIH1cblxuICB0b2dnbGVBbGxDYXRlZ29yaWVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGNhdHMgPSB0aGlzLmZpbHRlcmVkQ2F0ZWdvcmllcygpO1xuICAgIGlmICh0aGlzLmFsbEV4cGFuZGVkKCkpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRDYXRlZ29yaWVzLnNldChuZXcgU2V0KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV4cGFuZGVkQ2F0ZWdvcmllcy5zZXQobmV3IFNldChjYXRzLm1hcCgoYykgPT4gYy5uYW1lKSkpO1xuICAgIH1cbiAgfVxuXG4gIGdldEljb25OYW1lKGl0ZW06IFJlcG9ydGluZ0NvbXBvbmVudE1ldGEpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICBjYXNlICdpbnB1dCc6XG4gICAgICAgIHJldHVybiAndGV4dC1maWVsZHMnO1xuICAgICAgY2FzZSAnZHJvcGRvd24nOlxuICAgICAgICByZXR1cm4gJ2Ryb3Bkb3duJztcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICByZXR1cm4gJ2NhbGVuZGFyJztcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgcmV0dXJuICdjaGVja2JveCc7XG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gJ2J1dHRvbic7XG4gICAgICBjYXNlICdrcGktY2FyZCc6XG4gICAgICAgIHJldHVybiAna3BpJztcbiAgICAgIGNhc2UgJ2NoYXJ0JzpcbiAgICAgICAgcmV0dXJuICdjaGFydC1iYXInO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdib3gnO1xuICAgIH1cbiAgfVxuXG5cbiAgb25JdGVtRG91YmxlQ2xpY2sodHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLmFkZENvbXBvbmVudCh0eXBlKTtcbiAgfVxuXG4gIG9uQWRkQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5hZGRDb21wb25lbnQodHlwZSk7XG4gIH1cbn1cblxuLyoqIERpY3Rpb25hcnkgb2Ygc3lub255bXMgZm9yIGNvbXBvbmVudCB0eXBlcyBhbmQgVUkgY29uY2VwdHMgKi9cbmV4cG9ydCBjb25zdCBDT01QT05FTlRfU1lOT05ZTVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHtcbiAgaW5wdXQ6IFsndGV4dGJveCcsICd0ZXh0JywgJ2ZpZWxkJywgJ3N0cmluZycsICdlbnRyeScsICdwcm9tcHQnXSxcbiAgZHJvcGRvd246IFsnc2VsZWN0JywgJ2NvbWJvYm94JywgJ3BpY2tlcicsICdvcHRpb25zJywgJ2Nob2ljZScsICdtZW51JywgJ2xpc3QnXSxcbiAgZGF0ZTogWydjYWxlbmRhcicsICd0aW1lJywgJ2RhdGV0aW1lJywgJ2RheScsICdtb250aCcsICd5ZWFyJywgJ3NjaGVkdWxlJywgJ3BpY2tlciddLFxuICBudW1iZXI6IFsnbnVtZXJpYycsICdpbnRlZ2VyJywgJ2Zsb2F0JywgJ2Ftb3VudCcsICdjdXJyZW5jeScsICdwcmljZScsICdxdWFudGl0eScsICdjb3VudGVyJywgJ2RpZ2l0cycsICdzdW0nXSxcbiAgY2hlY2tib3g6IFsndG9nZ2xlJywgJ3N3aXRjaCcsICdib29sZWFuJywgJ2NoZWNrJywgJ3RpY2snLCAnZmxhZycsICd5ZXMvbm8nXSxcbiAgYnV0dG9uOiBbJ2FjdGlvbicsICdzdWJtaXQnLCAndHJpZ2dlcicsICdjbGljaycsICdjdGEnLCAncHJlc3MnLCAnZXhlY3V0ZSddLFxuICAna3BpLWNhcmQnOiBbJ2twaScsICdtZXRyaWMnLCAnc3RhdCcsICdjYXJkJywgJ2luZGljYXRvcicsICdzdW1tYXJ5JywgJ2ZpZ3VyZScsICdhbmFseXRpY3MnLCAnbWVhc3VyZScsICd0b3RhbCddLFxuICBjaGFydDogWydncmFwaCcsICdiYXInLCAnZG9udXQnLCAnbGluZScsICd2aXN1YWwnLCAnYW5hbHl0aWNzJywgJ3Bsb3QnLCAncGllJywgJ2RpYWdyYW0nXSxcbn07XG5cbi8qKiBDb21wdXRlIExldmVuc2h0ZWluIGRpc3RhbmNlIGJldHdlZW4gdHdvIHN0cmluZ3MgZm9yIHR5cG8gdG9sZXJhbmNlICovXG5leHBvcnQgZnVuY3Rpb24gbGV2ZW5zaHRlaW5EaXN0YW5jZShhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gMDtcbiAgaWYgKCFhLmxlbmd0aCkgcmV0dXJuIGIubGVuZ3RoO1xuICBpZiAoIWIubGVuZ3RoKSByZXR1cm4gYS5sZW5ndGg7XG5cbiAgY29uc3Qgcm93ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogYi5sZW5ndGggKyAxIH0sIChfLCBpKSA9PiBpKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gYS5sZW5ndGg7IGkrKykge1xuICAgIGxldCBwcmV2ID0gaTtcbiAgICBmb3IgKGxldCBqID0gMTsgaiA8PSBiLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCB2YWwgPSBhW2kgLSAxXSA9PT0gYltqIC0gMV0gPyByb3dbaiAtIDFdIDogTWF0aC5taW4ocm93W2ogLSAxXSwgcm93W2pdLCBwcmV2KSArIDE7XG4gICAgICByb3dbaiAtIDFdID0gcHJldjtcbiAgICAgIHByZXYgPSB2YWw7XG4gICAgfVxuICAgIHJvd1tiLmxlbmd0aF0gPSBwcmV2O1xuICB9XG4gIHJldHVybiByb3dbYi5sZW5ndGhdO1xufVxuXG4vKiogQ2hlY2sgaWYgYSBzZWFyY2ggdGVybSBtYXRjaGVzIGEgdGFyZ2V0IHdvcmQgKHN1YnN0cmluZyBvciBtaXNzcGVsbGluZykgKi9cbmV4cG9ydCBmdW5jdGlvbiBmdXp6eU1hdGNoV29yZCh0YXJnZXQ6IHN0cmluZywgdGVybTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh0YXJnZXQuaW5jbHVkZXModGVybSkgfHwgdGVybS5pbmNsdWRlcyh0YXJnZXQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHRlcm0ubGVuZ3RoID49IDQgJiYgdGFyZ2V0Lmxlbmd0aCA+PSA0KSB7XG4gICAgY29uc3QgbWF4RGlzdCA9IHRlcm0ubGVuZ3RoID49IDcgPyAyIDogMTtcbiAgICBpZiAobGV2ZW5zaHRlaW5EaXN0YW5jZSh0YXJnZXQsIHRlcm0pIDw9IG1heERpc3QpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKiBQdXJlIHByZWRpY2F0ZSB0byBjaGVjayBpZiBhIGNvbXBvbmVudCBtZXRhZGF0YSBpdGVtIG1hdGNoZXMgYSBzZWFyY2ggcXVlcnkgKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzU2VhcmNoUXVlcnkoaXRlbTogUmVwb3J0aW5nQ29tcG9uZW50TWV0YSwgcmF3UXVlcnk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIXJhd1F1ZXJ5KSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgY2xlYW4gPSByYXdRdWVyeS50cmltKCk7XG4gIGlmICghY2xlYW4pIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IGxvd2VyID0gY2xlYW4udG9Mb3dlckNhc2UoKTtcblxuICAvLyBUb2tlbml6ZSBieSBwdW5jdHVhdGlvbiBhbmQgd2hpdGVzcGFjZVxuICBjb25zdCB0b2tlbnMgPSBsb3dlclxuICAgIC5yZXBsYWNlKC9bXlxcd1xccy1dL2csICcgJylcbiAgICAuc3BsaXQoL1tcXHMtXSsvKVxuICAgIC5maWx0ZXIoKHQpID0+IHQubGVuZ3RoID4gMCk7XG5cbiAgLy8gSWYgcXVlcnkgY29uc2lzdHMgb25seSBvZiBzcGVjaWFsIGNoYXJhY3RlcnMgKGUuZy4sIFwiJCQkXCIgb3IgXCIqKipcIilcbiAgaWYgKHRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKFxuICAgICAgaXRlbS5kaXNwbGF5TmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyKSB8fFxuICAgICAgaXRlbS50eXBlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXIpIHx8XG4gICAgICBpdGVtLmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXIpXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHN5bm9ueW1zID0gQ09NUE9ORU5UX1NZTk9OWU1TW2l0ZW0udHlwZV0gfHwgW107XG4gIGNvbnN0IHRhcmdldFdvcmRzID0gW1xuICAgIGl0ZW0uZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKSxcbiAgICBpdGVtLnR5cGUudG9Mb3dlckNhc2UoKSxcbiAgICBpdGVtLmNhdGVnb3J5LnRvTG93ZXJDYXNlKCksXG4gICAgLi4uaXRlbS5kaXNwbGF5TmFtZS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyksXG4gICAgLi4uaXRlbS50eXBlLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1stX10rLyksXG4gICAgLi4uc3lub255bXMsXG4gIF07XG5cbiAgcmV0dXJuIHRva2Vucy5ldmVyeSgodG9rZW4pID0+IHRhcmdldFdvcmRzLnNvbWUoKHdvcmQpID0+IGZ1enp5TWF0Y2hXb3JkKHdvcmQsIHRva2VuKSkpO1xufVxuXG4iLCIgICAgPGRpdiBjbGFzcz1cInBhbGV0dGUtY29udGFpbmVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFsZXR0ZS1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbGV0dGUtdGl0bGUtYXJlYVwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cInBhbGV0dGUtdGl0bGVcIj5Db21wb25lbnRzPC9oMz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbGV0dGUtY291bnRcIiBbdGl0bGVdPVwidG90YWxDb21wb25lbnRDb3VudCgpICsgJyBjb21wb25lbnRzIGF2YWlsYWJsZSdcIj5cbiAgICAgICAgICAgIHt7IHRvdGFsQ29tcG9uZW50Q291bnQoKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbGV0dGUtYWN0aW9uc1wiPlxuICAgICAgICAgIDwhLS0gVmlldyBNb2RlIFRvZ2dsZTogMi1Db2x1bW4gR3JpZCB2cyAxLUNvbHVtbiBMaXN0IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWV3LW1vZGUtdG9nZ2xlXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlBhbGV0dGUgbGF5b3V0IHZpZXdcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidG9nZ2xlLWJ0blwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwibGF5b3V0TW9kZSgpID09PSAnZ3JpZCdcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwibGF5b3V0TW9kZSgpID09PSAnZ3JpZCdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibGF5b3V0TW9kZS5zZXQoJ2dyaWQnKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiMi1Db2x1bW4gR3JpZCBWaWV3XCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIjItQ29sdW1uIEdyaWQgVmlld1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZ3JpZFwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtYnRuXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJsYXlvdXRNb2RlKCkgPT09ICdsaXN0J1wiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJsYXlvdXRNb2RlKCkgPT09ICdsaXN0J1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJsYXlvdXRNb2RlLnNldCgnbGlzdCcpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJDb21wYWN0IExpc3QgVmlld1wiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb21wYWN0IExpc3QgVmlld1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwibGlzdFwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInBhbGV0dGUtYWN0aW9uLWJ0biBpY29uLW9ubHlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFsbENhdGVnb3JpZXMoKVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiYWxsRXhwYW5kZWQoKSA/ICdDb2xsYXBzZSBBbGwgU2VjdGlvbnMnIDogJ0V4cGFuZCBBbGwgU2VjdGlvbnMnXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYWxsRXhwYW5kZWQoKSA/ICdDb2xsYXBzZSBBbGwgU2VjdGlvbnMnIDogJ0V4cGFuZCBBbGwgU2VjdGlvbnMnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gW25hbWVdPVwiYWxsRXhwYW5kZWQoKSA/ICdjaGV2cm9uLXVwJyA6ICdjaGV2cm9uLWRvd24nXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInBhbGV0dGUtYWN0aW9uLWJ0biBpY29uLW9ubHlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNvbGxhcHNlUmVxdWVzdGVkLmVtaXQoKVwiXG4gICAgICAgICAgICB0aXRsZT1cIkNvbGxhcHNlIENvbXBvbmVudCBQYWxldHRlXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb2xsYXBzZSBDb21wb25lbnQgUGFsZXR0ZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGV2cm9uLWxlZnRcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2VhcmNoIEZpbHRlciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYWxldHRlLXNlYXJjaC13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtaW5wdXQtYm94XCI+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJzZWFyY2hcIiBbc2l6ZV09XCIxM1wiIGNsYXNzPVwic2VhcmNoLXByZWZpeC1pY29uXCIgLz5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGNsYXNzPVwicGFsZXR0ZS1zZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggY29udHJvbHMuLi5cIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwic2VhcmNoUXVlcnkoKVwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWFyY2hRdWVyeS5zZXQoJGV2ZW50KVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VhcmNoIGNvbXBvbmVudHNcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgQGlmIChzZWFyY2hRdWVyeSgpKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNsZWFyLXNlYXJjaC1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VhcmNoUXVlcnkuc2V0KCcnKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQ2xlYXIgc2VhcmNoXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNsZWFyIHNlYXJjaFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2xvc2VcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUGFsZXR0ZSBDYXRlZ29yaWVzIERyb3AgTGlzdCB3aXRoIEFjY29yZGlvbiAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwYWxldHRlLXNjcm9sbC1hcmVhXCJcbiAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgaWQ9XCJkZXNpZ25lci1wYWxldHRlLWRyb3AtbGlzdFwiXG4gICAgICAgIFtjZGtEcm9wTGlzdFNvcnRpbmdEaXNhYmxlZF09XCJ0cnVlXCJcbiAgICAgID5cbiAgICAgICAgQGZvciAoY2F0ZWdvcnkgb2YgZmlsdGVyZWRDYXRlZ29yaWVzKCk7IHRyYWNrIGNhdGVnb3J5Lm5hbWUpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBbY2xhc3MuaXMtZXhwYW5kZWRdPVwiaXNDYXRlZ29yeUV4cGFuZGVkKGNhdGVnb3J5Lm5hbWUpXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2F0ZWdvcnkoY2F0ZWdvcnkubmFtZSlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzQ2F0ZWdvcnlFeHBhbmRlZChjYXRlZ29yeS5uYW1lKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ3BhbGV0dGUtc2VjdGlvbi0nICsgY2F0ZWdvcnkubmFtZVwiXG4gICAgICAgICAgICAgIFtpZF09XCIncGFsZXR0ZS1oZWFkZXItJyArIGNhdGVnb3J5Lm5hbWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIFtjbGFzcy5yb3RhdGVkXT1cIiFpc0NhdGVnb3J5RXhwYW5kZWQoY2F0ZWdvcnkubmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hldnJvbi1kb3duXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaWNvbi1pbmRpY2F0b3JcIj5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBbbmFtZV09XCJjYXRlZ29yeS5pY29uXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnktbmFtZVwiPnt7IGNhdGVnb3J5LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeS1iYWRnZVwiPnt7IGNhdGVnb3J5Lml0ZW1zLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uLWNvbGxhcHNlLXdyYXBwZXJcIlxuICAgICAgICAgICAgICBbY2xhc3MuZXhwYW5kZWRdPVwiaXNDYXRlZ29yeUV4cGFuZGVkKGNhdGVnb3J5Lm5hbWUpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIWlzQ2F0ZWdvcnlFeHBhbmRlZChjYXRlZ29yeS5uYW1lKVwiXG4gICAgICAgICAgICAgIFtpZF09XCIncGFsZXR0ZS1zZWN0aW9uLScgKyBjYXRlZ29yeS5uYW1lXCJcbiAgICAgICAgICAgICAgcm9sZT1cInJlZ2lvblwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCIncGFsZXR0ZS1oZWFkZXItJyArIGNhdGVnb3J5Lm5hbWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNhdGVnb3J5LWl0ZW1zXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5ncmlkLXZpZXddPVwibGF5b3V0TW9kZSgpID09PSAnZ3JpZCdcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmxpc3Qtdmlld109XCJsYXlvdXRNb2RlKCkgPT09ICdsaXN0J1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBjYXRlZ29yeS5pdGVtczsgdHJhY2sgaXRlbS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBhbGV0dGUtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidBZGQgJyArIGl0ZW0uZGlzcGxheU5hbWUgKyAnIHRvIGNhbnZhcydcIlxuICAgICAgICAgICAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgICAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwiaXRlbS50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoZGJsY2xpY2spPVwib25JdGVtRG91YmxlQ2xpY2soaXRlbS50eXBlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25JdGVtRG91YmxlQ2xpY2soaXRlbS50eXBlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwib25JdGVtRG91YmxlQ2xpY2soaXRlbS50eXBlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidEcmFnIG9udG8gY2FudmFzIG9yIGRvdWJsZS1jbGljayB0byBhZGQgJyArIGl0ZW0uZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0taWNvbi1ib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBbbmFtZV09XCJnZXRJY29uTmFtZShpdGVtKVwiIFtzaXplXT1cImxheW91dE1vZGUoKSA9PT0gJ2dyaWQnID8gMTYgOiAxNVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0taW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpdGVtLXRpdGxlXCIgW3RpdGxlXT1cIml0ZW0uZGlzcGxheU5hbWVcIj57eyBpdGVtLmRpc3BsYXlOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpdGVtLXR5cGUtY29kZVwiPnt7IGl0ZW0udHlwZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS1hZGQtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkFkZENsaWNrKCRldmVudCwgaXRlbS50eXBlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJBZGQgdG8gY2FudmFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBZGQgdG8gY2FudmFzXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInBsdXNcIiBbc2l6ZV09XCJsYXlvdXRNb2RlKCkgPT09ICdncmlkJyA/IDEyIDogMTNcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBDREsgRHJhZyBQbGFjZWhvbGRlciAvIFByZXZpZXcgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqY2RrRHJhZ1BsYWNlaG9sZGVyIGNsYXNzPVwiZHJhZy1wbGFjZWhvbGRlclwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKmNka0RyYWdQcmV2aWV3IGNsYXNzPVwiZHJhZy1wcmV2aWV3XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gW25hbWVdPVwiZ2V0SWNvbk5hbWUoaXRlbSlcIiBbc2l6ZV09XCIxNlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtLmRpc3BsYXlOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoZmlsdGVyZWRDYXRlZ29yaWVzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLXJlc3VsdHNcIj5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwic2VhcmNoXCIgW3NpemVdPVwiMjBcIiBjbGFzcz1cIm5vLXJlc3VsdHMtaWNvblwiIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vLXJlc3VsdHMtdGV4dFwiPk5vIGNvbXBvbmVudHMgbWF0Y2hpbmcgXCJ7eyBzZWFyY2hRdWVyeSgpIH19XCI8L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5vLXJlc3VsdHMtY2xlYXItYnRuXCIgKGNsaWNrKT1cInNlYXJjaFF1ZXJ5LnNldCgnJylcIj5cbiAgICAgICAgICAgICAgQ2xlYXIgU2VhcmNoXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+Il19
735
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXBhbGV0dGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9jb21wb25lbnQtcGFsZXR0ZS9jb21wb25lbnQtcGFsZXR0ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUF3QixjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsaUJBQWlCLEVBQTBCLE1BQU0sOENBQThDLENBQUM7QUFDekcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFDN0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7Ozs7O0FBODZCbEYsTUFBTSxPQUFPLHlCQUF5QjtJQUNuQixRQUFRLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDckMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQzdDLGVBQWUsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUV2RSxpQkFBaUIsR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUVuQyxXQUFXLEdBQUcsTUFBTSxDQUFTLEVBQUUsQ0FBQyxD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LENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyRCxNQUFNLFdBQVcsR0FBRztRQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRTtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtRQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRTtRQUMzQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUM5QyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUN6QyxHQUFHLFFBQVE7S0FDWixDQUFDO0lBRUYsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ2RrRHJhZywgQ2RrRHJhZ0Ryb3AsIERyYWdEcm9wTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBDb21wb25lbnRSZWdpc3RyeSwgUmVwb3J0aW5nQ29tcG9uZW50TWV0YSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvcmVnaXN0cnkvY29tcG9uZW50LXJlZ2lzdHJ5JztcbmltcG9ydCB7IERlc2lnbmVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGVzaWduZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBScHRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vcHJpbWl0aXZlcy9jb21wb25lbnRzL2ljb24vcnB0LWljb24uY29tcG9uZW50JztcbmltcG9ydCB7IFJFUE9SVElOR19DT05GSUcgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3Rva2Vucy9yZXBvcnRpbmctY29uZmlnLnRva2VuJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LWNvbXBvbmVudC1wYWxldHRlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIERyYWdEcm9wTW9kdWxlLCBScHRJY29uQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInBhbGV0dGUtY29udGFpbmVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFsZXR0ZS1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbGV0dGUtdGl0bGUtYXJlYVwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cInBhbGV0dGUtdGl0bGVcIj5Db21wb25lbnRzPC9oMz5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJwYWxldHRlLWNvdW50XCJcbiAgICAgICAgICAgIHJvbGU9XCJzdGF0dXNcIlxuICAgICAgICAgICAgYXJpYS1hdG9taWM9XCJ0cnVlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidG90YWxDb21wb25lbnRDb3VudCgpICsgJyBjb21wb25lbnRzIGF2YWlsYWJsZSdcIlxuICAgICAgICAgICAgW3RpdGxlXT1cInRvdGFsQ29tcG9uZW50Q291bnQoKSArICcgY29tcG9uZW50cyBhdmFpbGFibGUnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0b3RhbENvbXBvbmVudENvdW50KCkgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYWxldHRlLWFjdGlvbnNcIj5cbiAgICAgICAgICA8IS0tIFZpZXcgTW9kZSBUb2dnbGU6IDItQ29sdW1uIEdyaWQgdnMgMS1Db2x1bW4gTGlzdCAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlldy1tb2RlLXRvZ2dsZVwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJQYWxldHRlIGxheW91dCB2aWV3XCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1idG5cIlxuICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImxheW91dE1vZGUoKSA9PT0gJ2dyaWQnXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImxheW91dE1vZGUoKSA9PT0gJ2dyaWQnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImxheW91dE1vZGUuc2V0KCdncmlkJylcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkNvbXBhY3QgMi1Db2x1bW4gR3JpZFwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCIyLUNvbHVtbiBHcmlkIFZpZXdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImdyaWRcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidG9nZ2xlLWJ0blwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwibGF5b3V0TW9kZSgpID09PSAnbGlzdCdcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwibGF5b3V0TW9kZSgpID09PSAnbGlzdCdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibGF5b3V0TW9kZS5zZXQoJ2xpc3QnKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiRGV0YWlsZWQgTGlzdCBWaWV3XCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNvbXBhY3QgTGlzdCBWaWV3XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJsaXN0XCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicGFsZXR0ZS1hY3Rpb24tYnRuIGljb24tb25seVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQWxsQ2F0ZWdvcmllcygpXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJhbGxFeHBhbmRlZCgpID8gJ0NvbGxhcHNlIEFsbCBTZWN0aW9ucycgOiAnRXhwYW5kIEFsbCBTZWN0aW9ucydcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhbGxFeHBhbmRlZCgpID8gJ0NvbGxhcHNlIEFsbCBTZWN0aW9ucycgOiAnRXhwYW5kIEFsbCBTZWN0aW9ucydcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBbbmFtZV09XCJhbGxFeHBhbmRlZCgpID8gJ2NoZXZyb24tdXAnIDogJ2NoZXZyb24tZG93bidcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicGFsZXR0ZS1hY3Rpb24tYnRuIGljb24tb25seVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY29sbGFwc2VSZXF1ZXN0ZWQuZW1pdCgpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiQ29sbGFwc2UgQ29tcG9uZW50IFBhbGV0dGVcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNvbGxhcHNlIENvbXBvbmVudCBQYWxldHRlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tbGVmdFwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZWFyY2ggRmlsdGVyICYgUXVpY2sgQ2F0ZWdvcnkgRmlsdGVyIFBpbGxzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInBhbGV0dGUtc2VhcmNoLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1pbnB1dC1ib3hcIj5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInNlYXJjaFwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJzZWFyY2gtcHJlZml4LWljb25cIiAvPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgY2xhc3M9XCJwYWxldHRlLXNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBjb21wb25lbnRzLi4uXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlYXJjaFF1ZXJ5KClcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoUXVlcnkuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNlYXJjaCBjb21wb25lbnRzXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIEBpZiAoc2VhcmNoUXVlcnkoKSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjbGVhci1zZWFyY2gtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlYXJjaFF1ZXJ5LnNldCgnJylcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkNsZWFyIHNlYXJjaFwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbGVhciBzZWFyY2hcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNsb3NlXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktZmlsdGVyLWNoaXBzXCIgcm9sZT1cInRhYmxpc3RcIiBhcmlhLWxhYmVsPVwiRmlsdGVyIGNvbXBvbmVudHMgYnkgY2F0ZWdvcnlcIj5cbiAgICAgICAgICBAZm9yICh0YWIgb2YgYXZhaWxhYmxlQ2F0ZWdvcmllcygpOyB0cmFjayB0YWIuaWQpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY2F0ZWdvcnktY2hpcFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRDYXRlZ29yeSgpID09PSB0YWIuaWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2F0ZWdvcnkodGFiLmlkKVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJ0YWJcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cInNlbGVjdGVkQ2F0ZWdvcnkoKSA9PT0gdGFiLmlkXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidTaG93ICcgKyB0YWIubGFiZWwgKyAnICgnICsgdGFiLmNvdW50ICsgJyknXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwLWxhYmVsXCI+e3sgdGFiLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoaXAtY291bnRcIj57eyB0YWIuY291bnQgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUGFsZXR0ZSBDYXRlZ29yaWVzIERyb3AgTGlzdCB3aXRoIEFjY29yZGlvbiAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwYWxldHRlLXNjcm9sbC1hcmVhXCJcbiAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgaWQ9XCJkZXNpZ25lci1wYWxldHRlLWRyb3AtbGlzdFwiXG4gICAgICAgIFtjZGtEcm9wTGlzdFNvcnRpbmdEaXNhYmxlZF09XCJ0cnVlXCJcbiAgICAgID5cbiAgICAgICAgQGZvciAoY2F0ZWdvcnkgb2YgZmlsdGVyZWRDYXRlZ29yaWVzKCk7IHRyYWNrIGNhdGVnb3J5Lm5hbWUpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBbY2xhc3MuaXMtZXhwYW5kZWRdPVwiaXNDYXRlZ29yeUV4cGFuZGVkKGNhdGVnb3J5Lm5hbWUpXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2F0ZWdvcnkoY2F0ZWdvcnkubmFtZSlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzQ2F0ZWdvcnlFeHBhbmRlZChjYXRlZ29yeS5uYW1lKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ3BhbGV0dGUtc2VjdGlvbi0nICsgY2F0ZWdvcnkubmFtZVwiXG4gICAgICAgICAgICAgIFtpZF09XCIncGFsZXR0ZS1oZWFkZXItJyArIGNhdGVnb3J5Lm5hbWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIFtjbGFzcy5yb3RhdGVkXT1cIiFpc0NhdGVnb3J5RXhwYW5kZWQoY2F0ZWdvcnkubmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hldnJvbi1kb3duXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaWNvbi1pbmRpY2F0b3JcIiBbbmdDbGFzc109XCIndGhlbWUtJyArIGNhdGVnb3J5Lm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBbbmFtZV09XCJjYXRlZ29yeS5pY29uXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnktbmFtZVwiPnt7IGNhdGVnb3J5LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeS1iYWRnZVwiPnt7IGNhdGVnb3J5Lml0ZW1zLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uLWNvbGxhcHNlLXdyYXBwZXJcIlxuICAgICAgICAgICAgICBbY2xhc3MuZXhwYW5kZWRdPVwiaXNDYXRlZ29yeUV4cGFuZGVkKGNhdGVnb3J5Lm5hbWUpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIWlzQ2F0ZWdvcnlFeHBhbmRlZChjYXRlZ29yeS5uYW1lKVwiXG4gICAgICAgICAgICAgIFtpZF09XCIncGFsZXR0ZS1zZWN0aW9uLScgKyBjYXRlZ29yeS5uYW1lXCJcbiAgICAgICAgICAgICAgcm9sZT1cInJlZ2lvblwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCIncGFsZXR0ZS1oZWFkZXItJyArIGNhdGVnb3J5Lm5hbWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNhdGVnb3J5LWl0ZW1zXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5ncmlkLXZpZXddPVwibGF5b3V0TW9kZSgpID09PSAnZ3JpZCdcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmxpc3Qtdmlld109XCJsYXlvdXRNb2RlKCkgPT09ICdsaXN0J1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBjYXRlZ29yeS5pdGVtczsgdHJhY2sgaXRlbS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBhbGV0dGUtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0Q2F0ZWdvcnlUaGVtZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidBZGQgJyArIGl0ZW0uZGlzcGxheU5hbWUgKyAnICgnICsgZ2V0Q29tcG9uZW50RGVzY3JpcHRpb24oaXRlbSkgKyAnKSB0byBjYW52YXMnXCJcbiAgICAgICAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgICAgICAgICAgW2Nka0RyYWdEYXRhXT1cIml0ZW0udHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGRibGNsaWNrKT1cIm9uSXRlbURvdWJsZUNsaWNrKGl0ZW0udHlwZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uSXRlbURvdWJsZUNsaWNrKGl0ZW0udHlwZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIm9uSXRlbURvdWJsZUNsaWNrKGl0ZW0udHlwZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpdGVtLmRpc3BsYXlOYW1lICsgJyDigJQgJyArIGdldENvbXBvbmVudERlc2NyaXB0aW9uKGl0ZW0pICsgJyAoRHJhZyBvciBkb3VibGUtY2xpY2sgdG8gYWRkKSdcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpdGVtLWRyYWctaGFuZGxlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImdyaXAtdmVydGljYWxcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0taWNvbi1ib3hcIiBbbmdDbGFzc109XCJnZXRDYXRlZ29yeVRoZW1lKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gW25hbWVdPVwiZ2V0SWNvbk5hbWUoaXRlbSlcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIml0ZW0tdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGF5b3V0TW9kZSgpID09PSAnZ3JpZCcgPyBnZXRHcmlkTGFiZWwoaXRlbSkgOiBpdGVtLmRpc3BsYXlOYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGxheW91dE1vZGUoKSA9PT0gJ2xpc3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXRlbS1kZXNjXCI+e3sgZ2V0Q29tcG9uZW50RGVzY3JpcHRpb24oaXRlbSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS1hZGQtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkFkZENsaWNrKCRldmVudCwgaXRlbS50eXBlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidBZGQgJyArIGl0ZW0uZGlzcGxheU5hbWUgKyAnIHRvIGNhbnZhcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQWRkICcgKyBpdGVtLmRpc3BsYXlOYW1lICsgJyB0byBjYW52YXMnXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInBsdXNcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIENESyBEcmFnIFBsYWNlaG9sZGVyIC8gUHJldmlldyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpjZGtEcmFnUGxhY2Vob2xkZXIgY2xhc3M9XCJkcmFnLXBsYWNlaG9sZGVyXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqY2RrRHJhZ1ByZXZpZXcgY2xhc3M9XCJkcmFnLXByZXZpZXdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmFnLXByZXZpZXctaWNvblwiIFtuZ0NsYXNzXT1cImdldENhdGVnb3J5VGhlbWUoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIFtuYW1lXT1cImdldEljb25OYW1lKGl0ZW0pXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhZy1wcmV2aWV3LWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkcmFnLXByZXZpZXctdGl0bGVcIj57eyBpdGVtLmRpc3BsYXlOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRyYWctcHJldmlldy1kZXNjXCI+e3sgZ2V0Q29tcG9uZW50RGVzY3JpcHRpb24oaXRlbSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGZpbHRlcmVkQ2F0ZWdvcmllcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1yZXN1bHRzXCI+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInNlYXJjaFwiIFtzaXplXT1cIjIwXCIgY2xhc3M9XCJuby1yZXN1bHRzLWljb25cIiAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuby1yZXN1bHRzLXRleHRcIj5ObyBjb21wb25lbnRzIG1hdGNoaW5nIFwie3sgc2VhcmNoUXVlcnkoKSB9fVwiPC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuby1yZXN1bHRzLWNsZWFyLWJ0blwiIChjbGljayk9XCJzZWFyY2hRdWVyeS5zZXQoJycpXCI+XG4gICAgICAgICAgICAgIENsZWFyIFNlYXJjaFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItYmcsICNmZmZmZmYpO1xuICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2UyZThmMCk7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgaW5oZXJpdCk7XG4gICAgfVxuICAgIC5wYWxldHRlLWNvbnRhaW5lciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgfVxuICAgIC5wYWxldHRlLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTJweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjZTJlOGYwKTtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuICAgIC5wYWxldHRlLXRpdGxlLWFyZWEge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICB9XG4gICAgLnBhbGV0dGUtdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dCwgIzBmMTcyYSk7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcbiAgICB9XG4gICAgLnBhbGV0dGUtY291bnQge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXN1cmZhY2UsICNmMWY1ZjkpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNDc1NTY5KTtcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNlMmU4ZjApO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMztcbiAgICB9XG4gICAgLnBhbGV0dGUtYWN0aW9ucyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNHB4O1xuICAgIH1cbiAgICAudmlldy1tb2RlLXRvZ2dsZSB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3Itc3VyZmFjZSwgI2YxZjVmOSk7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIHBhZGRpbmc6IDFweDtcbiAgICB9XG4gICAgLnRvZ2dsZS1idG4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB3aWR0aDogMjJweDtcbiAgICAgIGhlaWdodDogMjBweDtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwgY29sb3IgMTIwbXMgZWFzZSwgYm94LXNoYWRvdyAxMjBtcyBlYXNlO1xuICAgICAgcGFkZGluZzogMDtcbiAgICB9XG4gICAgLnRvZ2dsZS1idG46Zm9jdXMtdmlzaWJsZSB7XG4gICAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbiAgICB9XG4gICAgLnRvZ2dsZS1idG4uYWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMTUsIDIzLCA0MiwgMC4wOCk7XG4gICAgfVxuICAgIC50b2dnbGUtYnRuOmhvdmVyOm5vdCguYWN0aXZlKSB7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQsICMwZjE3MmEpO1xuICAgIH1cbiAgICAucGFsZXR0ZS1hY3Rpb24tYnRuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDIycHg7XG4gICAgICBoZWlnaHQ6IDIycHg7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNDc1NTY5KTtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwgY29sb3IgMTIwbXMgZWFzZSwgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2U7XG4gICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAucGFsZXR0ZS1hY3Rpb24tYnRuOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjOTNjNWZkO1xuICAgIH1cbiAgICAucGFsZXR0ZS1hY3Rpb24tYnRuOmZvY3VzLXZpc2libGUge1xuICAgICAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIG91dGxpbmUtb2Zmc2V0OiAxcHg7XG4gICAgfVxuICAgIC5wYWxldHRlLXNlYXJjaC13cmFwcGVyIHtcbiAgICAgIHBhZGRpbmc6IDhweCAxMHB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNlMmU4ZjApO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDZweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICB9XG4gICAgLnNlYXJjaC1pbnB1dC1ib3gge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gICAgLnNlYXJjaC1wcmVmaXgtaWNvbiB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBsZWZ0OiA5cHg7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQtbXV0ZWQsICM2NDc0OGIpO1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgfVxuICAgIC5wYWxldHRlLXNlYXJjaC1pbnB1dCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBoZWlnaHQ6IDMwcHg7XG4gICAgICBwYWRkaW5nOiA0cHggMjZweCA0cHggMjhweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNjYmQ1ZTEpO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXN1cmZhY2UsICNmOGZhZmMpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLCBib3gtc2hhZG93IDEyMG1zIGVhc2U7XG4gICAgfVxuICAgIC5wYWxldHRlLXNlYXJjaC1pbnB1dDpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgzNywgOTksIDIzNSwgMC4xNik7XG4gICAgfVxuICAgIC5jbGVhci1zZWFyY2gtYnRuIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHJpZ2h0OiA2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiAycHg7XG4gICAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgICB0cmFuc2l0aW9uOiBjb2xvciAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAuY2xlYXItc2VhcmNoLWJ0bjpob3ZlciB7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQsICMwZjE3MmEpO1xuICAgIH1cbiAgICAuY2xlYXItc2VhcmNoLWJ0bjpmb2N1cy12aXNpYmxlIHtcbiAgICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBvdXRsaW5lLW9mZnNldDogMXB4O1xuICAgIH1cbiAgICAuY2F0ZWdvcnktZmlsdGVyLWNoaXBzIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA0cHg7XG4gICAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lO1xuICAgIH1cbiAgICAuY2F0ZWdvcnktZmlsdGVyLWNoaXBzOjotd2Via2l0LXNjcm9sbGJhciB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgICAuY2F0ZWdvcnktY2hpcCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDRweDtcbiAgICAgIGhlaWdodDogMjJweDtcbiAgICAgIHBhZGRpbmc6IDAgN3B4O1xuICAgICAgYm9yZGVyLXJhZGl1czogMTFweDtcbiAgICAgIGZvbnQtc2l6ZTogMC42NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNDc1NTY5KTtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjZTJlOGYwKTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwgY29sb3IgMTIwbXMgZWFzZSwgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2U7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgIH1cbiAgICAuY2F0ZWdvcnktY2hpcDpob3Zlcjpub3QoLmFjdGl2ZSkge1xuICAgICAgYmFja2dyb3VuZDogI2YxZjVmOTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dCwgIzBmMTcyYSk7XG4gICAgICBib3JkZXItY29sb3I6ICNjYmQ1ZTE7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1jaGlwOmZvY3VzLXZpc2libGUge1xuICAgICAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIG91dGxpbmUtb2Zmc2V0OiAxcHg7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1jaGlwLmFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgIH1cbiAgICAuY2hpcC1jb3VudCB7XG4gICAgICBmb250LXNpemU6IDAuNnJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE1LCAyMywgNDIsIDAuMDcpO1xuICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgICBwYWRkaW5nOiAwIDRweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjM7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1jaGlwLmFjdGl2ZSAuY2hpcC1jb3VudCB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjQpO1xuICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgfVxuICAgIC5wYWxldHRlLXNjcm9sbC1hcmVhIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgcGFkZGluZzogNnB4IDhweCAxNnB4IDhweDtcbiAgICB9XG4gICAgLmFjY29yZGlvbi1pdGVtIHtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjFmNWY5O1xuICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgIH1cbiAgICAuYWNjb3JkaW9uLWl0ZW06bGFzdC1jaGlsZCB7XG4gICAgICBib3JkZXItYm90dG9tOiBub25lO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB9XG4gICAgLmFjY29yZGlvbi1oZWFkZXIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHBhZGRpbmc6IDZweCA2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZTtcbiAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgIH1cbiAgICAuYWNjb3JkaW9uLWhlYWRlcjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgIH1cbiAgICAuYWNjb3JkaW9uLWhlYWRlcjpmb2N1cy12aXNpYmxlIHtcbiAgICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBvdXRsaW5lLW9mZnNldDogMXB4O1xuICAgIH1cbiAgICAuYWNjb3JkaW9uLWhlYWRlci1sZWZ0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgfVxuICAgIC5hY2NvcmRpb24tY2hldnJvbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICB9XG4gICAgLmFjY29yZGlvbi1jaGV2cm9uLnJvdGF0ZWQge1xuICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTkwZGVnKTtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWljb24taW5kaWNhdG9yIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDE4cHg7XG4gICAgICBoZWlnaHQ6IDE4cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgY29sb3I6ICMyNTYzZWI7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWljb24taW5kaWNhdG9yLnRoZW1lLWFjdGlvbiB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmYmViO1xuICAgICAgY29sb3I6ICNkOTc3MDY7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1pY29uLWluZGljYXRvci50aGVtZS1kaXNwbGF5IHtcbiAgICAgIGJhY2tncm91bmQ6ICNlY2ZkZjU7XG4gICAgICBjb2xvcjogIzA1OTY2OTtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWljb24taW5kaWNhdG9yLnRoZW1lLWRhdGEge1xuICAgICAgYmFja2dyb3VuZDogI2Y1ZjNmZjtcbiAgICAgIGNvbG9yOiAjN2MzYWVkO1xuICAgIH1cbiAgICAuY2F0ZWdvcnktaWNvbi1pbmRpY2F0b3IudGhlbWUtbGF5b3V0IHtcbiAgICAgIGJhY2tncm91bmQ6ICNmMWY1Zjk7XG4gICAgICBjb2xvcjogIzQ3NTU2OTtcbiAgICB9XG4gICAgLmNhdGVnb3J5LW5hbWUge1xuICAgICAgZm9udC1zaXplOiAwLjY4NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMzM0MTU1KTtcbiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB9XG4gICAgLmNhdGVnb3J5LWJhZGdlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNDc1NTY5KTtcbiAgICAgIGJhY2tncm91bmQ6ICNmMWY1Zjk7XG4gICAgICBwYWRkaW5nOiAxcHggNnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAuYWNjb3JkaW9uLWNvbGxhcHNlLXdyYXBwZXIge1xuICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogMGZyO1xuICAgICAgdHJhbnNpdGlvbjogZ3JpZC10ZW1wbGF0ZS1yb3dzIDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIHZpc2liaWxpdHkgMTgwbXMgZWFzZTtcbiAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICB9XG4gICAgLmFjY29yZGlvbi1jb2xsYXBzZS13cmFwcGVyLmV4cGFuZGVkIHtcbiAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogMWZyO1xuICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB9XG4gICAgLmFjY29yZGlvbi1jb250ZW50IHtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBtaW4taGVpZ2h0OiAwO1xuICAgIH1cbiAgICAuY2F0ZWdvcnktaXRlbXMge1xuICAgICAgcGFkZGluZzogNHB4IDJweCA4cHggMnB4O1xuICAgIH1cbiAgICAuaXRlbS1pY29uLWJveCxcbiAgICAuaXRlbS1pY29uLWJveC50aGVtZS1pbnB1dCxcbiAgICAudGhlbWUtaW5wdXQgLml0ZW0taWNvbi1ib3gge1xuICAgICAgYmFja2dyb3VuZDogI2VmZjZmZjtcbiAgICAgIGNvbG9yOiAjMjU2M2ViO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RiZWFmZTtcbiAgICB9XG4gICAgLml0ZW0taWNvbi1ib3gudGhlbWUtYWN0aW9uLFxuICAgIC50aGVtZS1hY3Rpb24gLml0ZW0taWNvbi1ib3gge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmJlYjtcbiAgICAgIGNvbG9yOiAjZDk3NzA2O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZkZTY4YTtcbiAgICB9XG4gICAgLml0ZW0taWNvbi1ib3gudGhlbWUtZGlzcGxheSxcbiAgICAudGhlbWUtZGlzcGxheSAuaXRlbS1pY29uLWJveCB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWNmZGY1O1xuICAgICAgY29sb3I6ICMwNTk2Njk7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYTdmM2QwO1xuICAgIH1cbiAgICAuaXRlbS1pY29uLWJveC50aGVtZS1kYXRhLFxuICAgIC50aGVtZS1kYXRhIC5pdGVtLWljb24tYm94IHtcbiAgICAgIGJhY2tncm91bmQ6ICNmNWYzZmY7XG4gICAgICBjb2xvcjogIzdjM2FlZDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ2ZmU7XG4gICAgfVxuICAgIC5pdGVtLWljb24tYm94LnRoZW1lLWxheW91dCxcbiAgICAudGhlbWUtbGF5b3V0IC5pdGVtLWljb24tYm94IHtcbiAgICAgIGJhY2tncm91bmQ6ICNmMWY1Zjk7XG4gICAgICBjb2xvcjogIzQ3NTU2OTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjYmQ1ZTE7XG4gICAgfVxuICAgIC5pdGVtLXR5cGUtY29kZSB7XG4gICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1pdGVtcy5ncmlkLXZpZXcge1xuICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTtcbiAgICAgIGdhcDogNnB4O1xuICAgIH1cbiAgICAuY2F0ZWdvcnktaXRlbXMuZ3JpZC12aWV3IC5wYWxldHRlLWl0ZW0ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgaGVpZ2h0OiAzNnB4O1xuICAgICAgbWluLWhlaWdodDogMzZweDtcbiAgICAgIG1heC1oZWlnaHQ6IDM2cHg7XG4gICAgICBwYWRkaW5nOiAwIDdweDtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNlMmU4ZjApO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgY3Vyc29yOiBncmFiO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLCBib3gtc2hhZG93IDEyMG1zIGVhc2U7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWl0ZW1zLmdyaWQtdmlldyAucGFsZXR0ZS1pdGVtOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBib3JkZXItY29sb3I6ICM5M2M1ZmQ7XG4gICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgxNSwgMjMsIDQyLCAwLjA2KTtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWl0ZW1zLmdyaWQtdmlldyAucGFsZXR0ZS1pdGVtLnRoZW1lLWFjdGlvbjpob3ZlciB7XG4gICAgICBib3JkZXItY29sb3I6ICNmY2QzNGQ7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1pdGVtcy5ncmlkLXZpZXcgLnBhbGV0dGUtaXRlbS50aGVtZS1kaXNwbGF5OmhvdmVyIHtcbiAgICAgIGJvcmRlci1jb2xvcjogIzZlZTdiNztcbiAgICB9XG4gICAgLmNhdGVnb3J5LWl0ZW1zLmdyaWQtdmlldyAucGFsZXR0ZS1pdGVtOmZvY3VzLXZpc2libGUge1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgzNywgOTksIDIzNSwgMC4yMik7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgIH1cbiAgICAuY2F0ZWdvcnktaXRlbXMuZ3JpZC12aWV3IC5wYWxldHRlLWl0ZW06YWN0aXZlIHtcbiAgICAgIGN1cnNvcjogZ3JhYmJpbmc7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1pdGVtcy5ncmlkLXZpZXcgLml0ZW0tZHJhZy1oYW5kbGUge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWl0ZW1zLmdyaWQtdmlldyAuaXRlbS1pY29uLWJveCB7XG4gICAgICB3aWR0aDogMjJweDtcbiAgICAgIGhlaWdodDogMjJweDtcbiAgICAgIG1pbi13aWR0aDogMjJweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWl0ZW1zLmdyaWQtdmlldyAuaXRlbS1pbmZvIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgZmxleDogMTtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWl0ZW1zLmdyaWQtdmlldyAuaXRlbS10aXRsZSB7XG4gICAgICBmb250LXNpemU6IDAuNzRyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMWUyOTNiKTtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjI7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWl0ZW1zLmdyaWQtdmlldyAucGFsZXR0ZS1pdGVtOmhvdmVyIC5pdGVtLXRpdGxlIHtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWl0ZW1zLmdyaWQtdmlldyAuaXRlbS1kZXNjIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1pdGVtcy5ncmlkLXZpZXcgLml0ZW0tYWRkLWJ0biB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICByaWdodDogNHB4O1xuICAgICAgdG9wOiA1MCU7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICB3aWR0aDogMjBweDtcbiAgICAgIGhlaWdodDogMjBweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiZmRiZmU7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBvcGFjaXR5OiAwO1xuICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlLCBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsIGNvbG9yIDEyMG1zIGVhc2U7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgei1pbmRleDogMjtcbiAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDE1LCAyMywgNDIsIDAuMDgpO1xuICAgIH1cbiAgICAuY2F0ZWdvcnktaXRlbXMuZ3JpZC12aWV3IC5wYWxldHRlLWl0ZW06aG92ZXIgLml0ZW0tYWRkLWJ0bixcbiAgICAuY2F0ZWdvcnktaXRlbXMuZ3JpZC12aWV3IC5wYWxldHRlLWl0ZW06Zm9jdXMtdmlzaWJsZSAuaXRlbS1hZGQtYnRuLFxuICAgIC5jYXRlZ29yeS1pdGVtcy5ncmlkLXZpZXcgLml0ZW0tYWRkLWJ0bjpmb2N1cy12aXNpYmxlIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1pdGVtcy5ncmlkLXZpZXcgLml0ZW0tYWRkLWJ0bjpob3ZlcixcbiAgICAuY2F0ZWdvcnktaXRlbXMuZ3JpZC12aWV3IC5pdGVtLWFkZC1idG46Zm9jdXMtdmlzaWJsZSB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgb3V0bGluZTogbm9uZTtcbiAgICB9XG4gICAgLmdyaWQtdmlldyAuZHJhZy1wbGFjZWhvbGRlciB7XG4gICAgICBib3JkZXI6IDEuNXB4IGRhc2hlZCB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDM3LCA5OSwgMjM1LCAwLjA0KTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGhlaWdodDogMzZweDtcbiAgICAgIG1pbi1oZWlnaHQ6IDM2cHg7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAuY2F0ZWdvcnktaXRlbXMubGlzdC12aWV3IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1pdGVtcy5saXN0LXZpZXcgLnBhbGV0dGUtaXRlbSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBtaW4taGVpZ2h0OiA0MnB4O1xuICAgICAgcGFkZGluZzogNXB4IDhweDtcbiAgICAgIGdhcDogOHB4O1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNlMmU4ZjApO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgY3Vyc29yOiBncmFiO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLCBib3gtc2hhZG93IDEyMG1zIGVhc2U7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWl0ZW1zLmxpc3QtdmlldyAucGFsZXR0ZS1pdGVtOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBib3JkZXItY29sb3I6ICM5M2M1ZmQ7XG4gICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgxNSwgMjMsIDQyLCAwLjA2KTtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWl0ZW1zLmxpc3QtdmlldyAucGFsZXR0ZS1pdGVtOmZvY3VzLXZpc2libGUge1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgzNywgOTksIDIzNSwgMC4yMik7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgIH1cbiAgICAuY2F0ZWdvcnktaXRlbXMubGlzdC12aWV3IC5wYWxldHRlLWl0ZW06YWN0aXZlIHtcbiAgICAgIGN1cnNvcjogZ3JhYmJpbmc7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1pdGVtcy5saXN0LXZpZXcgLml0ZW0tZHJhZy1oYW5kbGUge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQtbXV0ZWQsICM5NGEzYjgpO1xuICAgICAgb3BhY2l0eTogMC41O1xuICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1pdGVtcy5saXN0LXZpZXcgLnBhbGV0dGUtaXRlbTpob3ZlciAuaXRlbS1kcmFnLWhhbmRsZSB7XG4gICAgICBvcGFjaXR5OiAwLjk7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1pdGVtcy5saXN0LXZpZXcgLml0ZW0taWNvbi1ib3gge1xuICAgICAgd2lkdGg6IDI2cHg7XG4gICAgICBoZWlnaHQ6IDI2cHg7XG4gICAgICBtaW4td2lkdGg6IDI2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1pdGVtcy5saXN0LXZpZXcgLml0ZW0taW5mbyB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBnYXA6IDFweDtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWl0ZW1zLmxpc3QtdmlldyAuaXRlbS10aXRsZSB7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICBsaW5lLWhlaWdodDogMS4yNTtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWl0ZW1zLmxpc3QtdmlldyAuaXRlbS1kZXNjIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMjtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWl0ZW1zLmxpc3QtdmlldyAuaXRlbS1hZGQtYnRuIHtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBvcGFjaXR5OiAwO1xuICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlLCBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsIGNvbG9yIDEyMG1zIGVhc2U7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuICAgIC5jYXRlZ29yeS1pdGVtcy5saXN0LXZpZXcgLnBhbGV0dGUtaXRlbTpob3ZlciAuaXRlbS1hZGQtYnRuLFxuICAgIC5jYXRlZ29yeS1pdGVtcy5saXN0LXZpZXcgLnBhbGV0dGUtaXRlbTpmb2N1cy12aXNpYmxlIC5pdGVtLWFkZC1idG4sXG4gICAgLmNhdGVnb3J5LWl0ZW1zLmxpc3QtdmlldyAuaXRlbS1hZGQtYnRuOmZvY3VzLXZpc2libGUge1xuICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG4gICAgLmNhdGVnb3J5LWl0ZW1zLmxpc3QtdmlldyAuaXRlbS1hZGQtYnRuOmhvdmVyLFxuICAgIC5jYXRlZ29yeS1pdGVtcy5saXN0LXZpZXcgLml0ZW0tYWRkLWJ0bjpmb2N1cy12aXNpYmxlIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgIH1cbiAgICAubGlzdC12aWV3IC5kcmFnLXBsYWNlaG9sZGVyIHtcbiAgICAgIGJvcmRlcjogMS41cHggZGFzaGVkIHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzcsIDk5LCAyMzUsIDAuMDQpO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgbWluLWhlaWdodDogNDJweDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAgIC5kcmFnLXByZXZpZXcsXG4gICAgOjpuZy1kZWVwIC5kcmFnLXByZXZpZXcge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMS41cHggc29saWQgdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgcGFkZGluZzogNnB4IDEwcHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogOHB4O1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZikgIWltcG9ydGFudDtcbiAgICAgIGJveC1zaGFkb3c6IDAgMTBweCAxOHB4IC0zcHggcmdiYSgxNSwgMjMsIDQyLCAwLjIpLCAwIDRweCA2cHggLTJweCByZ2JhKDE1LCAyMywgNDIsIDAuMDgpO1xuICAgICAgei1pbmRleDogMTAwMDA7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB9XG4gICAgLmRyYWctcHJldmlldy1pY29uIHtcbiAgICAgIHdpZHRoOiAyNHB4O1xuICAgICAgaGVpZ2h0OiAyNHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgYmFja2dyb3VuZDogI2VmZjZmZjtcbiAgICAgIGNvbG9yOiAjMjU2M2ViO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RiZWFmZTtcbiAgICB9XG4gICAgLmRyYWctcHJldmlldy1pY29uLnRoZW1lLWFjdGlvbiB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmYmViO1xuICAgICAgY29sb3I6ICNkOTc3MDY7XG4gICAgICBib3JkZXItY29sb3I6ICNmZGU2OGE7XG4gICAgfVxuICAgIC5kcmFnLXByZXZpZXctaWNvbi50aGVtZS1kaXNwbGF5IHtcbiAgICAgIGJhY2tncm91bmQ6ICNlY2ZkZjU7XG4gICAgICBjb2xvcjogIzA1OTY2OTtcbiAgICAgIGJvcmRlci1jb2xvcjogI2E3ZjNkMDtcbiAgICB9XG4gICAgLmRyYWctcHJldmlldy1pbmZvIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIH1cbiAgICAuZHJhZy1wcmV2aWV3LXRpdGxlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43OHJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQsICMwZjE3MmEpO1xuICAgIH1cbiAgICAuZHJhZy1wcmV2aWV3LWRlc2Mge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICB9XG4gICAgLm5vLXJlc3VsdHMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBwYWRkaW5nOiAyOHB4IDEycHg7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgfVxuICAgIC5uby1yZXN1bHRzLWljb24ge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjOTRhM2I4KTtcbiAgICB9XG4gICAgLm5vLXJlc3VsdHMtdGV4dCB7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQtbXV0ZWQsICM0NzU1NjkpO1xuICAgICAgd29yZC1icmVhazogYnJlYWstd29yZDtcbiAgICB9XG4gICAgLm5vLXJlc3VsdHMtY2xlYXItYnRuIHtcbiAgICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICAgIHBhZGRpbmc6IDRweCAxMHB4O1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYmZkYmZlO1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLCBjb2xvciAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAubm8tcmVzdWx0cy1jbGVhci1idG46aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgfVxuICAgIC5uby1yZXN1bHRzLWNsZWFyLWJ0bjpmb2N1cy12aXNpYmxlIHtcbiAgICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBvdXRsaW5lLW9mZnNldDogMXB4O1xuICAgIH1cbiAgICBAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkge1xuICAgICAgLmFjY29yZGlvbi1jb2xsYXBzZS13cmFwcGVyLFxuICAgICAgLmFjY29yZGlvbi1jaGV2cm9uLFxuICAgICAgLnBhbGV0dGUtaXRlbSxcbiAgICAgIC5pdGVtLWljb24tYm94LFxuICAgICAgLml0ZW0tYWRkLWJ0bixcbiAgICAgIC50b2dnbGUtYnRuLFxuICAgICAgLnBhbGV0dGUtYWN0aW9uLWJ0bixcbiAgICAgIC5jYXRlZ29yeS1jaGlwIHtcbiAgICAgICAgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgIH1cbiAgYF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudFBhbGV0dGVDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5ID0gaW5qZWN0KENvbXBvbmVudFJlZ2lzdHJ5KTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXNpZ25lclN0YXRlID0gaW5qZWN0KERlc2lnbmVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRpbmdDb25maWcgPSBpbmplY3QoUkVQT1JUSU5HX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICByZWFkb25seSBjb2xsYXBzZVJlcXVlc3RlZCA9IG91dHB1dDx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IHNlYXJjaFF1ZXJ5ID0gc2lnbmFsPHN0cmluZz4oJycpO1xuXG4gIC8qKiBTZWxlY3RlZCBjYXRlZ29yeSBmaWx0ZXIgdGFiOiAnYWxsJyBvciBzcGVjaWZpYyBjYXRlZ29yeSBuYW1lICovXG4gIHJlYWRvbmx5IHNlbGVjdGVkQ2F0ZWdvcnkgPSBzaWduYWw8c3RyaW5nPignYWxsJyk7XG5cbiAgLyoqIExheW91dCB2aWV3IG1vZGU6ICdncmlkJyAoMi1jb2x1bW4gc2lkZS1ieS1zaWRlIGdyaWQpIG9yICdsaXN0JyAoY29tcGFjdCByb3cgbGlzdCkuIERlZmF1bHRzIHRvICdncmlkJy4gKi9cbiAgcmVhZG9ubHkgbGF5b3V0TW9kZSA9IHNpZ25hbDwnZ3JpZCcgfCAnbGlzdCc+KCdncmlkJyk7XG5cbiAgLyoqIFNldCBvZiBleHBhbmRlZCBjYXRlZ29yeSBJRHMgKi9cbiAgcmVhZG9ubHkgZXhwYW5kZWRDYXRlZ29yaWVzID0gc2lnbmFsPFNldDxzdHJpbmc+PihcbiAgICBuZXcgU2V0KFsnaW5wdXQnLCAnYWN0aW9uJywgJ2Rpc3BsYXknLCAnZGF0YScsICdsYXlvdXQnXSlcbiAgKTtcblxuICByZWFkb25seSB0b3RhbENvbXBvbmVudENvdW50ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yZWdpc3RyeS5nZXRBbGwoKS5sZW5ndGgpO1xuXG4gIHJlYWRvbmx5IGNhdGVnb3J5TWV0YTogUmVjb3JkPHN0cmluZywgeyBsYWJlbDogc3RyaW5nOyBpY29uOiBzdHJpbmcgfT4gPSB7XG4gICAgaW5wdXQ6IHsgbGFiZWw6ICdGb3JtIElucHV0cycsIGljb246ICd0ZXh0LWZpZWxkcycgfSxcbiAgICBhY3Rpb246IHsgbGFiZWw6ICdBY3Rpb24gQnV0dG9ucycsIGljb246ICdsaWdodG5pbmcnIH0sXG4gICAgZGlzcGxheTogeyBsYWJlbDogJ0Rpc3BsYXkgJiBMYWJlbHMnLCBpY29uOiAnY2hhcnQtYmFyJyB9LFxuICAgIGRhdGE6IHsgbGFiZWw6ICdEYXRhICYgTG9va3VwcycsIGljb246ICdncmlkJyB9LFxuICAgIGxheW91dDogeyBsYWJlbDogJ0xheW91dCAmIENvbnRhaW5lcnMnLCBpY29uOiAnbGF5b3V0JyB9LFxuICB9O1xuXG4gIC8qKiBDb21wdXRlZCBsaXN0IG9mIGNhdGVnb3J5IHRhYnMgZm9yIHF1aWNrIG9uZS1jbGljayBmaWx0ZXJpbmcgKi9cbiAgcmVhZG9ubHkgYXZhaWxhYmxlQ2F0ZWdvcmllcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLnJlZ2lzdHJ5LmdldEFsbCgpO1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGFsbCkge1xuICAgICAgY29uc3QgY2F0ID0gaXRlbS5jYXRlZ29yeSB8fCAnaW5wdXQnO1xuICAgICAgbWFwLnNldChjYXQsIChtYXAuZ2V0KGNhdCkgfHwgMCkgKyAxKTtcbiAgICB9XG4gICAgY29uc3QgcGlsbHM6IEFycmF5PHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgY291bnQ6IG51bWJlciB9PiA9IFtcbiAgICAgIHsgaWQ6ICdhbGwnLCBsYWJlbDogJ0FsbCcsIGNvdW50OiBhbGwubGVuZ3RoIH0sXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IFtjYXQsIGNvdW50XSBvZiBtYXAuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBtZXRhID0gdGhpcy5jYXRlZ29yeU1ldGFbY2F0XTtcbiAgICAgIGNvbnN0IGNsZWFuTGFiZWwgPSAobWV0YT8ubGFiZWwgPz8gY2F0KVxuICAgICAgICAucmVwbGFjZSgvXkZvcm1cXHMrLywgJycpXG4gICAgICAgIC5yZXBsYWNlKC9eQWN0aW9uXFxzKy8sICcnKVxuICAgICAgICAucmVwbGFjZSgvXFxzKiZcXHMqTGFiZWxzJC8sICcnKTtcbiAgICAgIHBpbGxzLnB1c2goeyBpZDogY2F0LCBsYWJlbDogY2xlYW5MYWJlbCwgY291bnQgfSk7XG4gICAgfVxuICAgIHJldHVybiBwaWxscztcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZmlsdGVyZWRDYXRlZ29yaWVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGFsbCA9IHRoaXMucmVnaXN0cnkuZ2V0QWxsKCk7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNlYXJjaFF1ZXJ5KCk7XG4gICAgY29uc3QgY2F0ZWdvcnlGaWx0ZXIgPSB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkoKTtcbiAgICBjb25zdCBhbGxvd2VkQ2F0cyA9IHRoaXMucmVwb3J0aW5nQ29uZmlnPy5hbGxvd2VkQ2F0ZWdvcmllcztcblxuICAgIGxldCBmaWx0ZXJlZCA9IHF1ZXJ5XG4gICAgICA/IGFsbC5maWx0ZXIoKGMpID0+IG1hdGNoZXNTZWFyY2hRdWVyeShjLCBxdWVyeSkpXG4gICAgICA6IGFsbDtcblxuICAgIC8vIEFwcGx5IHF1aWNrIGNhdGVnb3J5IHRhYiBmaWx0ZXIgaWYgbm90IHNldCB0byAnYWxsJyBhbmQgbm8gYWN0aXZlIHNlYXJjaCBxdWVyeVxuICAgIGlmIChjYXRlZ29yeUZpbHRlciAhPT0gJ2FsbCcgJiYgIXF1ZXJ5LnRyaW0oKSkge1xuICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoKGMpID0+IChjLmNhdGVnb3J5IHx8ICdpbnB1dCcpID09PSBjYXRlZ29yeUZpbHRlcik7XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIGJ5IGFsbG93ZWQgY2F0ZWdvcmllcyBpZiBjb25maWd1cmVkXG4gICAgaWYgKGFsbG93ZWRDYXRzICYmIGFsbG93ZWRDYXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChjKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhdCA9IGMuY2F0ZWdvcnkgfHwgJ2lucHV0JztcbiAgICAgICAgcmV0dXJuIGFsbG93ZWRDYXRzLmluY2x1ZGVzKGNhdCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgUmVwb3J0aW5nQ29tcG9uZW50TWV0YVtdPigpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBmaWx0ZXJlZCkge1xuICAgICAgY29uc3QgY2F0ID0gaXRlbS5jYXRlZ29yeSB8fCAnaW5wdXQnO1xuICAgICAgaWYgKCFncm91cHMuaGFzKGNhdCkpIHtcbiAgICAgICAgZ3JvdXBzLnNldChjYXQsIFtdKTtcbiAgICAgIH1cbiAgICAgIGdyb3Vwcy5nZXQoY2F0KSEucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShncm91cHMuZW50cmllcygpKS5tYXAoKFtjYXQsIGl0ZW1zXSkgPT4ge1xuICAgICAgY29uc3QgbWV0YSA9IHRoaXMuY2F0ZWdvcnlNZXRhW2NhdF07XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBjYXQsXG4gICAgICAgIGxhYmVsOiBtZXRhPy5sYWJlbCA/PyBjYXQsXG4gICAgICAgIGljb246IG1ldGE/Lmljb24gPz8gJ2JveCcsXG4gICAgICAgIGl0ZW1zLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYWxsRXhwYW5kZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY2F0cyA9IHRoaXMuZmlsdGVyZWRDYXRlZ29yaWVzKCk7XG4gICAgaWYgKGNhdHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkQ2F0ZWdvcmllcygpO1xuICAgIHJldHVybiBjYXRzLmV2ZXJ5KChjKSA9PiBleHBhbmRlZC5oYXMoYy5uYW1lKSk7XG4gIH0pO1xuXG4gIHNlbGVjdENhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkuc2V0KGNhdGVnb3J5KTtcbiAgfVxuXG4gIGlzQ2F0ZWdvcnlFeHBhbmRlZChjYXRlZ29yeU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIFdoZW4gc2VhcmNoaW5nLCBhdXRvLWV4cGFuZCBjYXRlZ29yaWVzIHRoYXQgY29udGFpbiBtYXRjaGluZyByZXN1bHRzXG4gICAgaWYgKHRoaXMuc2VhcmNoUXVlcnkoKS50cmltKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZENhdGVnb3JpZXMoKS5oYXMoY2F0ZWdvcnlOYW1lKTtcbiAgfVxuXG4gIHRvZ2dsZUNhdGVnb3J5KGNhdGVnb3J5TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IG5ldyBTZXQodGhpcy5leHBhbmRlZENhdGVnb3JpZXMoKSk7XG4gICAgaWYgKGN1cnJlbnQuaGFzKGNhdGVnb3J5TmFtZSkpIHtcbiAgICAgIGN1cnJlbnQuZGVsZXRlKGNhdGVnb3J5TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnQuYWRkKGNhdGVnb3J5TmFtZSk7XG4gICAgfVxuICAgIHRoaXMuZXhwYW5kZWRDYXRlZ29yaWVzLnNldChjdXJyZW50KTtcbiAgfVxuXG4gIHRvZ2dsZUFsbENhdGVnb3JpZXMoKTogdm9pZCB7XG4gICAgY29uc3QgY2F0cyA9IHRoaXMuZmlsdGVyZWRDYXRlZ29yaWVzKCk7XG4gICAgaWYgKHRoaXMuYWxsRXhwYW5kZWQoKSkge1xuICAgICAgdGhpcy5leHBhbmRlZENhdGVnb3JpZXMuc2V0KG5ldyBTZXQoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRDYXRlZ29yaWVzLnNldChuZXcgU2V0KGNhdHMubWFwKChjKSA9PiBjLm5hbWUpKSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0SWNvbk5hbWUoaXRlbTogUmVwb3J0aW5nQ29tcG9uZW50TWV0YSk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgICAgcmV0dXJuICd0ZXh0LWZpZWxkcyc7XG4gICAgICBjYXNlICdkcm9wZG93bic6XG4gICAgICAgIHJldHVybiAnZHJvcGRvd24nO1xuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIHJldHVybiAnY2FsZW5kYXInO1xuICAgICAgY2FzZSAnZGF0ZS1yYW5nZSc6XG4gICAgICAgIHJldHVybiAnY2FsZW5kYXItdG9kYXknO1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICByZXR1cm4gJ2NoZWNrYm94JztcbiAgICAgIGNhc2UgJ3JhZGlvJzpcbiAgICAgICAgcmV0dXJuICdyYWRpbyc7XG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gJ2xpZ2h0bmluZyc7XG4gICAgICBjYXNlICdrcGktY2FyZCc6XG4gICAgICAgIHJldHVybiAna3BpJztcbiAgICAgIGNhc2UgJ2NoYXJ0JzpcbiAgICAgICAgcmV0dXJuICdjaGFydC1iYXInO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdib3gnO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBvbmVudERlc2NyaXB0aW9uKGl0ZW06IFJlcG9ydGluZ0NvbXBvbmVudE1ldGEpOiBzdHJpbmcge1xuICAgIHJldHVybiBDT01QT05FTlRfREVTQ1JJUFRJT05TW2l0ZW0udHlwZV0gfHwgYCR7aXRlbS5kaXNwbGF5TmFtZX0gY29tcG9uZW50YDtcbiAgfVxuXG4gIGdldEdyaWRMYWJlbChpdGVtOiBSZXBvcnRpbmdDb21wb25lbnRNZXRhKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQ09NUE9ORU5UX1NIT1JUX0xBQkVMU1tpdGVtLnR5cGVdIHx8IGl0ZW0uZGlzcGxheU5hbWU7XG4gIH1cblxuICBnZXRDYXRlZ29yeVRoZW1lKGl0ZW06IFJlcG9ydGluZ0NvbXBvbmVudE1ldGEpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNhdCA9IGl0ZW0uY2F0ZWdvcnkgfHwgJ2lucHV0JztcbiAgICBzd2l0Y2ggKGNhdCkge1xuICAgICAgY2FzZSAnYWN0aW9uJzpcbiAgICAgICAgcmV0dXJuICd0aGVtZS1hY3Rpb24nO1xuICAgICAgY2FzZSAnZGlzcGxheSc6XG4gICAgICAgIHJldHVybiAndGhlbWUtZGlzcGxheSc7XG4gICAgICBjYXNlICdkYXRhJzpcbiAgICAgICAgcmV0dXJuICd0aGVtZS1kYXRhJztcbiAgICAgIGNhc2UgJ2xheW91dCc6XG4gICAgICAgIHJldHVybiAndGhlbWUtbGF5b3V0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAndGhlbWUtaW5wdXQnO1xuICAgIH1cbiAgfVxuXG5cbiAgb25JdGVtRG91YmxlQ2xpY2sodHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLmFkZENvbXBvbmVudCh0eXBlKTtcbiAgfVxuXG4gIG9uQWRkQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5hZGRDb21wb25lbnQodHlwZSk7XG4gIH1cbn1cblxuLyoqIENvbmNpc2UgbGFiZWxzIG9wdGltaXplZCBmb3IgMi1jb2x1bW4gY29tcGFjdCBncmlkIHRpbGVzICh6ZXJvIHRydW5jYXRpb24pICovXG5leHBvcnQgY29uc3QgQ09NUE9ORU5UX1NIT1JUX0xBQkVMUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgaW5wdXQ6ICdUZXh0IElucHV0JyxcbiAgZHJvcGRvd246ICdEcm9wZG93bicsXG4gIGRhdGU6ICdEYXRlIFBpY2tlcicsXG4gICdkYXRlLXJhbmdlJzogJ0RhdGUgUmFuZ2UnLFxuICBudW1iZXI6ICdOdW1iZXInLFxuICBjaGVja2JveDogJ0NoZWNrYm94JyxcbiAgcmFkaW86ICdSYWRpbyBHcm91cCcsXG4gIGJ1dHRvbjogJ0J1dHRvbicsXG4gICdrcGktY2FyZCc6ICdLUEkgQ2FyZCcsXG4gIGNoYXJ0OiAnQ2hhcnQnLFxufTtcblxuLyoqIERpY3Rpb25hcnkgb2YgdXNlci1mcmllbmRseSBtaWNyby1jb3B5IGRlc2NyaXB0aW9ucyBleHBsYWluaW5nIGVhY2ggY29tcG9uZW50J3MgcHVycG9zZSAqL1xuZXhwb3J0IGNvbnN0IENPTVBPTkVOVF9ERVNDUklQVElPTlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIGlucHV0OiAnU2luZ2xlLWxpbmUgdGV4dCBlbnRyeSBmaWVsZCcsXG4gIGRyb3Bkb3duOiAnU2VsZWN0IG9wdGlvbiBvciBBUEkgbG9va3VwJyxcbiAgZGF0ZTogJ0NhbGVuZGFyIGRhdGUgcGlja2VyJyxcbiAgJ2RhdGUtcmFuZ2UnOiAnRGF0ZSByYW5nZSBzZWxlY3RvcicsXG4gIG51bWJlcjogJ051bWVyaWMgdmFsdWUgJiBjb3VudGVyJyxcbiAgY2hlY2tib3g6ICdUb2dnbGUgYm9vbGVhbiBjaGVja2JveCcsXG4gIHJhZGlvOiAnU2luZ2xlIGNob2ljZSBzZWxlY3RvcicsXG4gIGJ1dHRvbjogJ1RyaWdnZXIgYWN0aW9uIG9yIHByb2NlZHVyZScsXG4gICdrcGktY2FyZCc6ICdNZXRyaWMgS1BJIHN1bW1hcnkgY2FyZCcsXG4gIGNoYXJ0OiAnSW50ZXJhY3RpdmUgZGF0YSB2aXN1YWxpemF0aW9uJyxcbn07XG5cbi8qKiBEaWN0aW9uYXJ5IG9mIHN5bm9ueW1zIGZvciBjb21wb25lbnQgdHlwZXMgYW5kIFVJIGNvbmNlcHRzICovXG5leHBvcnQgY29uc3QgQ09NUE9ORU5UX1NZTk9OWU1TOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7XG4gIGlucHV0OiBbJ3RleHRib3gnLCAndGV4dCcsICdmaWVsZCcsICdzdHJpbmcnLCAnZW50cnknLCAncHJvbXB0J10sXG4gIGRyb3Bkb3duOiBbJ3NlbGVjdCcsICdjb21ib2JveCcsICdwaWNrZXInLCAnb3B0aW9ucycsICdjaG9pY2UnLCAnbWVudScsICdsaXN0J10sXG4gIGRhdGU6IFsnY2FsZW5kYXInLCAndGltZScsICdkYXRldGltZScsICdkYXknLCAnbW9udGgnLCAneWVhcicsICdzY2hlZHVsZScsICdwaWNrZXInXSxcbiAgbnVtYmVyOiBbJ251bWVyaWMnLCAnaW50ZWdlcicsICdmbG9hdCcsICdhbW91bnQnLCAnY3VycmVuY3knLCAncHJpY2UnLCAncXVhbnRpdHknLCAnY291bnRlcicsICdkaWdpdHMnLCAnc3VtJ10sXG4gIGNoZWNrYm94OiBbJ3RvZ2dsZScsICdzd2l0Y2gnLCAnYm9vbGVhbicsICdjaGVjaycsICd0aWNrJywgJ2ZsYWcnLCAneWVzL25vJ10sXG4gIHJhZGlvOiBbJ3JhZGlvYnV0dG9uJywgJ3JhZGlvZ3JvdXAnLCAnb3B0aW9uJywgJ2Nob2ljZScsICdzaW5nbGUtc2VsZWN0JywgJ3NlbGVjdG9yJywgJ3BpY2tlciddLFxuICBidXR0b246IFsnYWN0aW9uJywgJ3N1Ym1pdCcsICd0cmlnZ2VyJywgJ2NsaWNrJywgJ2N0YScsICdwcmVzcycsICdleGVjdXRlJ10sXG4gICdrcGktY2FyZCc6IFsna3BpJywgJ21ldHJpYycsICdzdGF0JywgJ2NhcmQnLCAnaW5kaWNhdG9yJywgJ3N1bW1hcnknLCAnZmlndXJlJywgJ2FuYWx5dGljcycsICdtZWFzdXJlJywgJ3RvdGFsJ10sXG4gIGNoYXJ0OiBbJ2dyYXBoJywgJ2JhcicsICdkb251dCcsICdsaW5lJywgJ3Zpc3VhbCcsICdhbmFseXRpY3MnLCAncGxvdCcsICdwaWUnLCAnZGlhZ3JhbSddLFxufTtcblxuLyoqIENvbXB1dGUgTGV2ZW5zaHRlaW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gc3RyaW5ncyBmb3IgdHlwbyB0b2xlcmFuY2UgKi9cbmV4cG9ydCBmdW5jdGlvbiBsZXZlbnNodGVpbkRpc3RhbmNlKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiAwO1xuICBpZiAoIWEubGVuZ3RoKSByZXR1cm4gYi5sZW5ndGg7XG4gIGlmICghYi5sZW5ndGgpIHJldHVybiBhLmxlbmd0aDtcblxuICBjb25zdCByb3cgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBiLmxlbmd0aCArIDEgfSwgKF8sIGkpID0+IGkpO1xuICBmb3IgKGxldCBpID0gMTsgaSA8PSBhLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IHByZXYgPSBpO1xuICAgIGZvciAobGV0IGogPSAxOyBqIDw9IGIubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IHZhbCA9IGFbaSAtIDFdID09PSBiW2ogLSAxXSA/IHJvd1tqIC0gMV0gOiBNYXRoLm1pbihyb3dbaiAtIDFdLCByb3dbal0sIHByZXYpICsgMTtcbiAgICAgIHJvd1tqIC0gMV0gPSBwcmV2O1xuICAgICAgcHJldiA9IHZhbDtcbiAgICB9XG4gICAgcm93W2IubGVuZ3RoXSA9IHByZXY7XG4gIH1cbiAgcmV0dXJuIHJvd1tiLmxlbmd0aF07XG59XG5cbi8qKiBDaGVjayBpZiBhIHNlYXJjaCB0ZXJtIG1hdGNoZXMgYSB0YXJnZXQgd29yZCAoc3Vic3RyaW5nIG9yIG1pc3NwZWxsaW5nKSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZ1enp5TWF0Y2hXb3JkKHRhcmdldDogc3RyaW5nLCB0ZXJtOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHRhcmdldC5pbmNsdWRlcyh0ZXJtKSB8fCB0ZXJtLmluY2x1ZGVzKHRhcmdldCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodGVybS5sZW5ndGggPj0gNCAmJiB0YXJnZXQubGVuZ3RoID49IDQpIHtcbiAgICBjb25zdCBtYXhEaXN0ID0gdGVybS5sZW5ndGggPj0gNyA/IDIgOiAxO1xuICAgIGlmIChsZXZlbnNodGVpbkRpc3RhbmNlKHRhcmdldCwgdGVybSkgPD0gbWF4RGlzdCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIFB1cmUgcHJlZGljYXRlIHRvIGNoZWNrIGlmIGEgY29tcG9uZW50IG1ldGFkYXRhIGl0ZW0gbWF0Y2hlcyBhIHNlYXJjaCBxdWVyeSAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNTZWFyY2hRdWVyeShpdGVtOiBSZXBvcnRpbmdDb21wb25lbnRNZXRhLCByYXdRdWVyeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghcmF3UXVlcnkpIHJldHVybiB0cnVlO1xuICBjb25zdCBjbGVhbiA9IHJhd1F1ZXJ5LnRyaW0oKTtcbiAgaWYgKCFjbGVhbikgcmV0dXJuIHRydWU7XG5cbiAgY29uc3QgbG93ZXIgPSBjbGVhbi50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIFRva2VuaXplIGJ5IHB1bmN0dWF0aW9uIGFuZCB3aGl0ZXNwYWNlXG4gIGNvbnN0IHRva2VucyA9IGxvd2VyXG4gICAgLnJlcGxhY2UoL1teXFx3XFxzLV0vZywgJyAnKVxuICAgIC5zcGxpdCgvW1xccy1dKy8pXG4gICAgLmZpbHRlcigodCkgPT4gdC5sZW5ndGggPiAwKTtcblxuICAvLyBJZiBxdWVyeSBjb25zaXN0cyBvbmx5IG9mIHNwZWNpYWwgY2hhcmFjdGVycyAoZS5nLiwgXCIkJCRcIiBvciBcIioqKlwiKVxuICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICBpdGVtLmRpc3BsYXlOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXIpIHx8XG4gICAgICBpdGVtLnR5cGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlcikgfHxcbiAgICAgIGl0ZW0uY2F0ZWdvcnkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlcilcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgc3lub255bXMgPSBDT01QT05FTlRfU1lOT05ZTVNbaXRlbS50eXBlXSB8fCBbXTtcbiAgY29uc3QgdGFyZ2V0V29yZHMgPSBbXG4gICAgaXRlbS5kaXNwbGF5TmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgIGl0ZW0udHlwZS50b0xvd2VyQ2FzZSgpLFxuICAgIGl0ZW0uY2F0ZWdvcnkudG9Mb3dlckNhc2UoKSxcbiAgICAuLi5pdGVtLmRpc3BsYXlOYW1lLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xccysvKSxcbiAgICAuLi5pdGVtLnR5cGUudG9Mb3dlckNhc2UoKS5zcGxpdCgvWy1fXSsvKSxcbiAgICAuLi5zeW5vbnltcyxcbiAgXTtcblxuICByZXR1cm4gdG9rZW5zLmV2ZXJ5KCh0b2tlbikgPT4gdGFyZ2V0V29yZHMuc29tZSgod29yZCkgPT4gZnV6enlNYXRjaFdvcmQod29yZCwgdG9rZW4pKSk7XG59XG5cbiJdfQ==