bways-report 0.1.9 → 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 (93) hide show
  1. package/README.md +463 -316
  2. package/esm2022/lib/core/config/bways-report-config.mjs +29 -32
  3. package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
  4. package/esm2022/lib/core/services/report-api-execution.service.mjs +33 -11
  5. package/esm2022/lib/core/services/report-session-context.service.mjs +72 -3
  6. package/esm2022/lib/core/tokens/designer-config.token.mjs +4 -0
  7. package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
  8. package/esm2022/lib/core/utils/report-endpoint.util.mjs +22 -0
  9. package/esm2022/lib/core/utils/report-request-scope.mjs +48 -0
  10. package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +8 -1
  11. package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +5 -2
  12. package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +5 -2
  13. package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +30 -14
  14. package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +32 -28
  15. package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +1 -1
  16. package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +4 -37
  17. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +4 -50
  18. package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +43 -194
  19. package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +17 -65
  20. package/esm2022/lib/data-access/adapters/index.mjs +1 -1
  21. package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +13 -4
  22. package/esm2022/lib/data-access/adapters/report-id-availability.mjs +20 -0
  23. package/esm2022/lib/data-access/adapters/session-headers.mjs +11 -0
  24. package/esm2022/lib/data-access/contracts/index.mjs +1 -1
  25. package/esm2022/lib/data-access/contracts/report-persistence.contract.mjs +13 -1
  26. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +50 -40
  27. package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +546 -119
  28. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +12 -6
  29. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +9 -8
  30. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +9 -4
  31. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +54 -32
  32. package/esm2022/lib/features/designer/designer.component.mjs +100 -67
  33. package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +10 -4
  34. package/esm2022/lib/features/designer/services/designer-config.service.mjs +56 -0
  35. package/esm2022/lib/features/designer/services/designer-endpoints.service.mjs +155 -0
  36. package/esm2022/lib/features/designer/services/designer-state.service.mjs +3 -2
  37. package/esm2022/lib/features/embed/bways-report-builder.component.mjs +3 -3
  38. package/esm2022/lib/features/export/services/report-export.service.mjs +11 -6
  39. package/esm2022/lib/features/persistence/services/report-store.service.mjs +78 -23
  40. package/esm2022/lib/features/persistence/services/schema-validator.service.mjs +59 -3
  41. package/esm2022/lib/features/routing/components/routed-report-designer.component.mjs +12 -17
  42. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +5 -3
  43. package/esm2022/lib/features/routing/report-routes.mjs +6 -6
  44. package/esm2022/lib/features/routing/resolvers/report-route-identifier.mjs +5 -0
  45. package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +3 -2
  46. package/esm2022/lib/features/runtime/report-execution.service.mjs +18 -5
  47. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +4 -2
  48. package/esm2022/lib/features/runtime/report-runtime.component.mjs +94 -71
  49. package/esm2022/lib/features/runtime/rpt-report.component.mjs +49 -41
  50. package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +7 -2
  51. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +13 -1
  52. package/esm2022/lib/provide-reporting.mjs +9 -29
  53. package/fesm2022/bways-report.mjs +1789 -1041
  54. package/fesm2022/bways-report.mjs.map +1 -1
  55. package/lib/core/config/bways-report-config.d.ts +14 -5
  56. package/lib/core/models/report-datasource.model.d.ts +5 -0
  57. package/lib/core/services/report-session-context.service.d.ts +9 -0
  58. package/lib/core/tokens/designer-config.token.d.ts +4 -0
  59. package/lib/core/tokens/reporting-config.token.d.ts +4 -0
  60. package/lib/core/utils/report-endpoint.util.d.ts +12 -0
  61. package/lib/core/utils/report-request-scope.d.ts +14 -0
  62. package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +6 -2
  63. package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +4 -2
  64. package/lib/data-access/adapters/endpoint-tokens.d.ts +4 -0
  65. package/lib/data-access/adapters/http-datasource.adapter.d.ts +1 -3
  66. package/lib/data-access/adapters/http-lookup.adapter.d.ts +1 -3
  67. package/lib/data-access/adapters/http-persistence.adapter.d.ts +11 -16
  68. package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +3 -5
  69. package/lib/data-access/adapters/index.d.ts +1 -1
  70. package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +2 -2
  71. package/lib/data-access/adapters/report-id-availability.d.ts +6 -0
  72. package/lib/data-access/adapters/session-headers.d.ts +3 -0
  73. package/lib/data-access/contracts/index.d.ts +1 -0
  74. package/lib/data-access/contracts/report-persistence.contract.d.ts +16 -1
  75. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +2 -0
  76. package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +37 -5
  77. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +4 -3
  78. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +1 -0
  79. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +1 -0
  80. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +7 -1
  81. package/lib/features/designer/designer.component.d.ts +15 -2
  82. package/lib/features/designer/rpt-report-designer.component.d.ts +5 -1
  83. package/lib/features/designer/services/designer-config.service.d.ts +13 -0
  84. package/lib/features/designer/services/designer-endpoints.service.d.ts +25 -0
  85. package/lib/features/persistence/services/report-store.service.d.ts +15 -1
  86. package/lib/features/persistence/services/schema-validator.service.d.ts +2 -0
  87. package/lib/features/routing/resolvers/report-route-identifier.d.ts +2 -0
  88. package/lib/features/runtime/report-execution.service.d.ts +3 -0
  89. package/lib/features/runtime/report-grid-bridge.component.d.ts +1 -0
  90. package/lib/features/runtime/report-runtime.component.d.ts +1 -0
  91. package/lib/features/runtime/rpt-report.component.d.ts +5 -0
  92. package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +3 -1
  93. package/package.json +2 -1
@@ -1,7 +1,9 @@
1
+ import { BWAYS_REPORT_ENDPOINTS } from '../../../data-access/adapters/endpoint-tokens';
2
+ import { ReportSessionContextService } from '../../../core/services/report-session-context.service';
1
3
  import { computed, inject, Injectable, signal, } from '@angular/core';
2
- import { of, tap, throwError, switchMap, catchError } from 'rxjs';
4
+ import { of, tap, throwError, switchMap, catchError, finalize, map, take } from 'rxjs';
3
5
  import { ReportPersistenceAdapter } from '../../../data-access/contracts/report-persistence.contract';
4
- import { SchemaValidatorService } from './schema-validator.service';
6
+ import { normalizeReportDefinition, SchemaValidatorService } from './schema-validator.service';
5
7
  import * as i0 from "@angular/core";
6
8
  /**
7
9
  * ReportStoreService manages application-wide cached report states,
@@ -10,6 +12,29 @@ import * as i0 from "@angular/core";
10
12
  export class ReportStoreService {
11
13
  adapter = inject(ReportPersistenceAdapter, { optional: true });
12
14
  validator = inject(SchemaValidatorService);
15
+ session = inject(ReportSessionContextService, { optional: true });
16
+ endpoints = inject(BWAYS_REPORT_ENDPOINTS, { optional: true });
17
+ cacheContext = '';
18
+ currentCacheContext() {
19
+ return JSON.stringify([this.session?.getCurrentSessionContext() ?? {}, this.endpoints?.reportsEndpoint]);
20
+ }
21
+ guardCacheContext(context) {
22
+ return tap(() => {
23
+ if (context !== this.currentCacheContext()) {
24
+ throw new Error('Reporting context changed while the request was pending.');
25
+ }
26
+ });
27
+ }
28
+ ensureCacheContext() {
29
+ const context = this.currentCacheContext();
30
+ if (context === this.cacheContext)
31
+ return context;
32
+ this.cacheContext = context;
33
+ this.cache.set(new Map());
34
+ this.summaries.set([]);
35
+ this.activeReportId.set(null);
36
+ return context;
37
+ }
13
38
  /** List of all known report summaries */
14
39
  summaries = signal([]);
15
40
  /** In-memory cache of loaded full report definitions by ID */
@@ -31,6 +56,7 @@ export class ReportStoreService {
31
56
  * Fetches the list of all available reports.
32
57
  */
33
58
  loadSummaries() {
59
+ const context = this.ensureCacheContext();
34
60
  if (!this.adapter) {
35
61
  return of(this.summaries());
36
62
  }
@@ -40,7 +66,7 @@ export class ReportStoreService {
40
66
  }
41
67
  this.isLoading.set(true);
42
68
  this.error.set(null);
43
- return list$.pipe(tap({
69
+ return list$.pipe(this.guardCacheContext(context), tap({
44
70
  next: (list) => {
45
71
  this.summaries.set(list || []);
46
72
  this.isLoading.set(false);
@@ -49,7 +75,7 @@ export class ReportStoreService {
49
75
  this.error.set(err?.message ?? 'Failed to load report list.');
50
76
  this.isLoading.set(false);
51
77
  },
52
- }));
78
+ }), finalize(() => this.isLoading.set(false)));
53
79
  }
54
80
  /**
55
81
  * Loads a report definition by ID, using cached instance if available.
@@ -58,6 +84,7 @@ export class ReportStoreService {
58
84
  * @param forceRefresh - If true, bypasses the in-memory cache.
59
85
  */
60
86
  loadReport(reportId, forceRefresh = false) {
87
+ const context = this.ensureCacheContext();
61
88
  if (!forceRefresh) {
62
89
  const cached = this.cache().get(reportId);
63
90
  if (cached) {
@@ -70,9 +97,15 @@ export class ReportStoreService {
70
97
  }
71
98
  this.isLoading.set(true);
72
99
  this.error.set(null);
73
- return this.adapter.load(reportId).pipe(tap({
100
+ return this.adapter.load(reportId).pipe(map(normalizeReportDefinition), this.guardCacheContext(context), tap({
74
101
  next: (def) => {
75
- this.validator.assertValid(def);
102
+ try {
103
+ this.validator.assertValid(def);
104
+ }
105
+ catch (err) {
106
+ this.error.set(err instanceof Error ? err.message : 'Invalid report definition.');
107
+ throw err;
108
+ }
76
109
  const nextCache = new Map(this.cache());
77
110
  nextCache.set(reportId, def);
78
111
  this.cache.set(nextCache);
@@ -83,13 +116,14 @@ export class ReportStoreService {
83
116
  this.error.set(err?.message ?? `Failed to load report "${reportId}".`);
84
117
  this.isLoading.set(false);
85
118
  },
86
- }));
119
+ }), finalize(() => this.isLoading.set(false)));
87
120
  }
88
121
  /**
89
122
  * Loads a report definition by slug or ID.
90
123
  * Resolves from cache, loaded summaries, or adapter.
91
124
  */
92
125
  loadReportBySlug(slugOrId, forceRefresh = false) {
126
+ this.ensureCacheContext();
93
127
  const slugLower = slugOrId.toLowerCase().trim();
94
128
  // 1. Check in-memory cache if not forcing refresh
95
129
  if (!forceRefresh) {
@@ -117,36 +151,57 @@ export class ReportStoreService {
117
151
  /**
118
152
  * Saves a report definition, validates it, and updates local cache.
119
153
  */
120
- saveReport(report) {
154
+ /** Opaque endpoint/session identity for pending user confirmations. */
155
+ getStorageContextKey() { return this.currentCacheContext(); }
156
+ inspectReportId(id) {
157
+ const context = this.ensureCacheContext();
158
+ if (!this.adapter)
159
+ return throwError(() => new Error('Report storage is not configured.'));
160
+ return this.adapter.inspectId(id).pipe(take(1),
161
+ // Read legacy version metadata without selecting another report or changing the draft/cache.
162
+ switchMap(status => status.exists && status.version === undefined
163
+ ? this.adapter.load(id).pipe(map(report => ({ exists: true, name: report.name, version: report.version })))
164
+ : of(status)), this.guardCacheContext(context));
165
+ }
166
+ checkReportId(id) {
167
+ const context = this.ensureCacheContext();
168
+ if (!this.adapter)
169
+ return throwError(() => new Error('Report storage is not configured.'));
170
+ return this.adapter.checkId(id).pipe(this.guardCacheContext(context));
171
+ }
172
+ /** Saves a validated report definition and updates the local cache. */
173
+ saveReport(report, options) {
174
+ const context = this.ensureCacheContext();
121
175
  this.validator.assertValid(report);
122
176
  if (!this.adapter) {
123
- // In-memory update if no adapter configured
124
- const nextCache = new Map(this.cache());
125
- nextCache.set(report.id, report);
126
- this.cache.set(nextCache);
127
- this.updateSummaryInList(report);
128
- return of(report);
177
+ return throwError(() => new Error('Report storage is not configured. Register provideBwaysReport() to save reports.'));
129
178
  }
130
179
  this.isLoading.set(true);
131
180
  this.error.set(null);
132
- return this.adapter.save(report).pipe(tap({
181
+ return (options ? this.adapter.save(report, options) : this.adapter.save(report)).pipe(this.guardCacheContext(context), tap({
133
182
  next: (saved) => {
134
- const nextCache = new Map(this.cache());
135
- nextCache.set(saved.id, saved);
136
- this.cache.set(nextCache);
137
- this.updateSummaryInList(saved);
183
+ this.cacheSavedReport(saved);
138
184
  this.isLoading.set(false);
139
185
  },
140
186
  error: (err) => {
141
187
  this.error.set(err?.message ?? `Failed to save report "${report.id}".`);
142
188
  this.isLoading.set(false);
143
189
  },
144
- }));
190
+ }), finalize(() => this.isLoading.set(false)));
191
+ }
192
+ /** Accepts an already persisted report without issuing another database write. */
193
+ cacheSavedReport(report) {
194
+ this.ensureCacheContext();
195
+ const nextCache = new Map(this.cache());
196
+ nextCache.set(report.id, report);
197
+ this.cache.set(nextCache);
198
+ this.updateSummaryInList(report);
145
199
  }
146
200
  /**
147
201
  * Deletes a report definition by ID.
148
202
  */
149
203
  deleteReport(reportId) {
204
+ const context = this.ensureCacheContext();
150
205
  if (!this.adapter) {
151
206
  const nextCache = new Map(this.cache());
152
207
  nextCache.delete(reportId);
@@ -158,7 +213,7 @@ export class ReportStoreService {
158
213
  return of(void 0);
159
214
  }
160
215
  this.isLoading.set(true);
161
- return this.adapter.delete(reportId).pipe(tap({
216
+ return this.adapter.delete(reportId).pipe(this.guardCacheContext(context), tap({
162
217
  next: () => {
163
218
  const nextCache = new Map(this.cache());
164
219
  nextCache.delete(reportId);
@@ -173,7 +228,7 @@ export class ReportStoreService {
173
228
  this.error.set(err?.message ?? `Failed to delete report "${reportId}".`);
174
229
  this.isLoading.set(false);
175
230
  },
176
- }));
231
+ }), finalize(() => this.isLoading.set(false)));
177
232
  }
178
233
  /**
179
234
  * Sets the active report ID.
@@ -218,4 +273,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
218
273
  type: Injectable,
219
274
  args: [{ providedIn: 'root' }]
220
275
  }] });
221
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXN0b3JlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9wZXJzaXN0ZW5jZS9zZXJ2aWNlcy9yZXBvcnQtc3RvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSzlFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUVwRTs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ1osT0FBTyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELFNBQVMsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUU1RCx5Q0FBeUM7SUFDaEMsU0FBUyxHQUFHLE1BQU0sQ0FBa0IsRUFBRSxDQUFDLENBQUM7SUFFakQsOERBQThEO0lBQzdDLEtBQUssR0FBRyxNQUFNLENBQWdDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUUxRSxtQ0FBbUM7SUFDMUIsY0FBYyxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFdEQsOEJBQThCO0lBQ3JCLFNBQVMsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFNUMsNEJBQTRCO0lBQ25CLEtBQUssR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRTdDLG1EQUFtRDtJQUMxQyxZ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Y3QsXG4gIEluamVjdGFibGUsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgdGFwLCB0aHJvd0Vycm9yLCBzd2l0Y2hNYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIFJlcG9ydERlZmluaXRpb24sXG4gIFJlcG9ydFN1bW1hcnksXG59IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1kZWZpbml0aW9uLm1vZGVsJztcbmltcG9ydCB7IFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlciB9IGZyb20gJy4uLy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9yZXBvcnQtcGVyc2lzdGVuY2UuY29udHJhY3QnO1xuaW1wb3J0IHsgU2NoZW1hVmFsaWRhdG9yU2VydmljZSB9IGZyb20gJy4vc2NoZW1hLXZhbGlkYXRvci5zZXJ2aWNlJztcblxuLyoqXG4gKiBSZXBvcnRTdG9yZVNlcnZpY2UgbWFuYWdlcyBhcHBsaWNhdGlvbi13aWRlIGNhY2hlZCByZXBvcnQgc3RhdGVzLFxuICogbGlzdGluZywgYW5kIHJlYWN0aXZlIGFjY2VzcyB2aWEgQW5ndWxhciBzaWduYWxzLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFJlcG9ydFN0b3JlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRhcHRlciA9IGluamVjdChSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdG9yID0gaW5qZWN0KFNjaGVtYVZhbGlkYXRvclNlcnZpY2UpO1xuXG4gIC8qKiBMaXN0IG9mIGFsbCBrbm93biByZXBvcnQgc3VtbWFyaWVzICovXG4gIHJlYWRvbmx5IHN1bW1hcmllcyA9IHNpZ25hbDxSZXBvcnRTdW1tYXJ5W10+KFtdKTtcblxuICAvKiogSW4tbWVtb3J5IGNhY2hlIG9mIGxvYWRlZCBmdWxsIHJlcG9ydCBkZWZpbml0aW9ucyBieSBJRCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gc2lnbmFsPE1hcDxzdHJpbmcsIFJlcG9ydERlZmluaXRpb24+PihuZXcgTWFwKCkpO1xuXG4gIC8qKiBDdXJyZW50bHkgc2VsZWN0ZWQgcmVwb3J0IElEICovXG4gIHJlYWRvbmx5IGFjdGl2ZVJlcG9ydElkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8qKiBMb2FkaW5nIHN0YXRlIGluZGljYXRvciAqL1xuICByZWFkb25seSBpc0xvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qKiBDdXJyZW50IGVycm9yIG1lc3NhZ2UgKi9cbiAgcmVhZG9ubHkgZXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIEFjdGl2ZSByZXBvcnQgZGVmaW5pdGlvbiBjb21wdXRlZCBmcm9tIGNhY2hlICovXG4gIHJlYWRvbmx5IGFjdGl2ZVJlcG9ydCA9IGNvbXB1dGVkPFJlcG9ydERlZmluaXRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmFjdGl2ZVJlcG9ydElkKCk7XG4gICAgaWYgKCFpZCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUoKS5nZXQoaWQpID8/IG51bGw7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgcmVwb3J0cy5cbiAgICovXG4gIGxvYWRTdW1tYXJpZXMoKTogT2JzZXJ2YWJsZTxSZXBvcnRTdW1tYXJ5W10+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuc3VtbWFyaWVzKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGxpc3QkID0gdGhpcy5hZGFwdGVyLmxpc3QoKTtcbiAgICBpZiAoIWxpc3QkIHx8IHR5cGVvZiBsaXN0JC5waXBlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5zdW1tYXJpZXMoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuXG4gICAgcmV0dXJuIGxpc3QkLnBpcGUoXG4gICAgICB0YXAoe1xuICAgICAgICBuZXh0OiAobGlzdCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3VtbWFyaWVzLnNldChsaXN0IHx8IFtdKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMuZXJyb3Iuc2V0KGVycj8ubWVzc2FnZSA/PyAnRmFpbGVkIHRvIGxvYWQgcmVwb3J0IGxpc3QuJyk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIHJlcG9ydCBkZWZpbml0aW9uIGJ5IElELCB1c2luZyBjYWNoZWQgaW5zdGFuY2UgaWYgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gcmVwb3J0SWQgLSBJRCBvZiB0aGUgcmVwb3J0IHRvIGxvYWQuXG4gICAqIEBwYXJhbSBmb3JjZVJlZnJlc2ggLSBJZiB0cnVlLCBieXBhc3NlcyB0aGUgaW4tbWVtb3J5IGNhY2hlLlxuICAgKi9cbiAgbG9hZFJlcG9ydChyZXBvcnRJZDogc3RyaW5nLCBmb3JjZVJlZnJlc2ggPSBmYWxzZSk6IE9ic2VydmFibGU8UmVwb3J0RGVmaW5pdGlvbj4ge1xuICAgIGlmICghZm9yY2VSZWZyZXNoKSB7XG4gICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmNhY2hlKCkuZ2V0KHJlcG9ydElkKTtcbiAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVSZXBvcnRJZC5zZXQocmVwb3J0SWQpO1xuICAgICAgICByZXR1cm4gb2YoY2FjaGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIgbm90IGNvbmZpZ3VyZWQuJykpO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcblxuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIubG9hZChyZXBvcnRJZCkucGlwZShcbiAgICAgIHRhcCh7XG4gICAgICAgIG5leHQ6IChkZWYpID0+IHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRvci5hc3NlcnRWYWxpZChkZWYpO1xuICAgICAgICAgIGNvbnN0IG5leHRDYWNoZSA9IG5ldyBNYXAodGhpcy5jYWNoZSgpKTtcbiAgICAgICAgICBuZXh0Q2FjaGUuc2V0KHJlcG9ydElkLCBkZWYpO1xuICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KG5leHRDYWNoZSk7XG4gICAgICAgICAgdGhpcy5hY3RpdmVSZXBvcnRJZC5zZXQocmVwb3J0SWQpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvci5zZXQoZXJyPy5tZXNzYWdlID8/IGBGYWlsZWQgdG8gbG9hZCByZXBvcnQgXCIke3JlcG9ydElkfVwiLmApO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYSByZXBvcnQgZGVmaW5pdGlvbiBieSBzbHVnIG9yIElELlxuICAgKiBSZXNvbHZlcyBmcm9tIGNhY2hlLCBsb2FkZWQgc3VtbWFyaWVzLCBvciBhZGFwdGVyLlxuICAgKi9cbiAgbG9hZFJlcG9ydEJ5U2x1ZyhzbHVnT3JJZDogc3RyaW5nLCBmb3JjZVJlZnJlc2ggPSBmYWxzZSk6IE9ic2VydmFibGU8UmVwb3J0RGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IHNsdWdMb3dlciA9IHNsdWdPcklkLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgLy8gMS4gQ2hlY2sgaW4tbWVtb3J5IGNhY2hlIGlmIG5vdCBmb3JjaW5nIHJlZnJlc2hcbiAgICBpZiAoIWZvcmNlUmVmcmVzaCkge1xuICAgICAgZm9yIChjb25zdCBkZWYgb2YgdGhpcy5jYWNoZSgpLnZhbHVlcygpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkZWYuaWQudG9Mb3dlckNhc2UoKSA9PT0gc2x1Z0xvd2VyIHx8XG4gICAgICAgICAgKGRlZi5zbHVnICYmIGRlZi5zbHVnLnRvTG93ZXJDYXNlKCkgPT09IHNsdWdMb3dlcilcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVSZXBvcnRJZC5zZXQoZGVmLmlkKTtcbiAgICAgICAgICByZXR1cm4gb2YoZGVmKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIENoZWNrIGV4aXN0aW5nIHN1bW1hcmllc1xuICAgIGNvbnN0IG1hdGNoZWRTdW1tYXJ5ID0gdGhpcy5zdW1tYXJpZXMoKS5maW5kKFxuICAgICAgKHMpID0+XG4gICAgICAgIHMuaWQudG9Mb3dlckNhc2UoKSA9PT0gc2x1Z0xvd2VyIHx8XG4gICAgICAgIChzLnNsdWcgJiYgcy5zbHVnLnRvTG93ZXJDYXNlKCkgPT09IHNsdWdMb3dlcilcbiAgICApO1xuXG4gICAgaWYgKG1hdGNoZWRTdW1tYXJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkUmVwb3J0KG1hdGNoZWRTdW1tYXJ5LmlkLCBmb3JjZVJlZnJlc2gpO1xuICAgIH1cblxuICAgIC8vIDMuIElmIG5vdCBmb3VuZCBpbiBzdW1tYXJpZXMsIHJlZnJlc2ggc3VtbWFyaWVzIGZpcnN0IG9yIGZhbGxiYWNrIHRvIGxvYWRSZXBvcnQgZGlyZWN0bHlcbiAgICByZXR1cm4gdGhpcy5sb2FkU3VtbWFyaWVzKCkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgobGlzdCkgPT4ge1xuICAgICAgICBjb25zdCBmb3VuZCA9IGxpc3QuZmluZChcbiAgICAgICAgICAocykgPT5cbiAgICAgICAgICAgIHMuaWQudG9Mb3dlckNhc2UoKSA9PT0gc2x1Z0xvd2VyIHx8XG4gICAgICAgICAgICAocy5zbHVnICYmIHMuc2x1Zy50b0xvd2VyQ2FzZSgpID09PSBzbHVnTG93ZXIpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRSZXBvcnQoZm91bmQgPyBmb3VuZC5pZCA6IHNsdWdPcklkLCBmb3JjZVJlZnJlc2gpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKCgpID0+IHRoaXMubG9hZFJlcG9ydChzbHVnT3JJZCwgZm9yY2VSZWZyZXNoKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGEgcmVwb3J0IGRlZmluaXRpb24sIHZhbGlkYXRlcyBpdCwgYW5kIHVwZGF0ZXMgbG9jYWwgY2FjaGUuXG4gICAqL1xuICBzYXZlUmVwb3J0KHJlcG9ydDogUmVwb3J0RGVmaW5pdGlvbik6IE9ic2VydmFibGU8UmVwb3J0RGVmaW5pdGlvbj4ge1xuICAgIHRoaXMudmFsaWRhdG9yLmFzc2VydFZhbGlkKHJlcG9ydCk7XG5cbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgLy8gSW4tbWVtb3J5IHVwZGF0ZSBpZiBubyBhZGFwdGVyIGNvbmZpZ3VyZWRcbiAgICAgIGNvbnN0IG5leHRDYWNoZSA9IG5ldyBNYXAodGhpcy5jYWNoZSgpKTtcbiAgICAgIG5leHRDYWNoZS5zZXQocmVwb3J0LmlkLCByZXBvcnQpO1xuICAgICAgdGhpcy5jYWNoZS5zZXQobmV4dENhY2hlKTtcbiAgICAgIHRoaXMudXBkYXRlU3VtbWFyeUluTGlzdChyZXBvcnQpO1xuICAgICAgcmV0dXJuIG9mKHJlcG9ydCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuXG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5zYXZlKHJlcG9ydCkucGlwZShcbiAgICAgIHRhcCh7XG4gICAgICAgIG5leHQ6IChzYXZlZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5leHRDYWNoZSA9IG5ldyBNYXAodGhpcy5jYWNoZSgpKTtcbiAgICAgICAgICBuZXh0Q2FjaGUuc2V0KHNhdmVkLmlkLCBzYXZlZCk7XG4gICAgICAgICAgdGhpcy5jYWNoZS5zZXQobmV4dENhY2hlKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnlJbkxpc3Qoc2F2ZWQpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvci5zZXQoZXJyPy5tZXNzYWdlID8/IGBGYWlsZWQgdG8gc2F2ZSByZXBvcnQgXCIke3JlcG9ydC5pZH1cIi5gKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSByZXBvcnQgZGVmaW5pdGlvbiBieSBJRC5cbiAgICovXG4gIGRlbGV0ZVJlcG9ydChyZXBvcnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpIHtcbiAgICAgIGNvbnN0IG5leHRDYWNoZSA9IG5ldyBNYXAodGhpcy5jYWNoZSgpKTtcbiAgICAgIG5leHRDYWNoZS5kZWxldGUocmVwb3J0SWQpO1xuICAgICAgdGhpcy5jYWNoZS5zZXQobmV4dENhY2hlKTtcbiAgICAgIHRoaXMuc3VtbWFyaWVzLnNldCh0aGlzLnN1bW1hcmllcygpLmZpbHRlcigocykgPT4gcy5pZCAhPT0gcmVwb3J0SWQpKTtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZVJlcG9ydElkKCkgPT09IHJlcG9ydElkKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlUmVwb3J0SWQuc2V0KG51bGwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9mKHZvaWQgMCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuZGVsZXRlKHJlcG9ydElkKS5waXBlKFxuICAgICAgdGFwKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5leHRDYWNoZSA9IG5ldyBNYXAodGhpcy5jYWNoZSgpKTtcbiAgICAgICAgICBuZXh0Q2FjaGUuZGVsZXRlKHJlcG9ydElkKTtcbiAgICAgICAgICB0aGlzLmNhY2hlLnNldChuZXh0Q2FjaGUpO1xuICAgICAgICAgIHRoaXMuc3VtbWFyaWVzLnNldCh0aGlzLnN1bW1hcmllcygpLmZpbHRlcigocykgPT4gcy5pZCAhPT0gcmVwb3J0SWQpKTtcbiAgICAgICAgICBpZiAodGhpcy5hY3RpdmVSZXBvcnRJZCgpID09PSByZXBvcnRJZCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVSZXBvcnRJZC5zZXQobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvci5zZXQoZXJyPy5tZXNzYWdlID8/IGBGYWlsZWQgdG8gZGVsZXRlIHJlcG9ydCBcIiR7cmVwb3J0SWR9XCIuYCk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhY3RpdmUgcmVwb3J0IElELlxuICAgKi9cbiAgc2V0QWN0aXZlUmVwb3J0KGlkOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVSZXBvcnRJZC5zZXQoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgaW4tbWVtb3J5IGNhY2hlLlxuICAgKi9cbiAgY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlLnNldChuZXcgTWFwKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdW1tYXJ5SW5MaXN0KGRlZjogUmVwb3J0RGVmaW5pdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGxpc3QgPSBbLi4udGhpcy5zdW1tYXJpZXMoKV07XG4gICAgY29uc3QgaWR4ID0gbGlzdC5maW5kSW5kZXgoKHMpID0+IHMuaWQgPT09IGRlZi5pZCk7XG4gICAgY29uc3Qgc3VtbWFyeTogUmVwb3J0U3VtbWFyeSA9IHtcbiAgICAgIGlkOiBkZWYuaWQsXG4gICAgICBuYW1lOiBkZWYubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBkZWYuZGVzY3JpcHRpb24sXG4gICAgICBjYXRlZ29yeTogZGVmLmNhdGVnb3J5LFxuICAgICAgc2x1ZzogZGVmLnNsdWcgPz8gZGVmLmlkLFxuICAgICAgbWVudUdyb3VwOiBkZWYubWVudUdyb3VwLFxuICAgICAgbWVudU9yZGVyOiBkZWYubWVudU9yZGVyLFxuICAgICAgaWNvbjogZGVmLmljb24sXG4gICAgICB2ZXJzaW9uOiBkZWYudmVyc2lvbixcbiAgICAgIGlzUHVibGlzaGVkOiBkZWYuaXNQdWJsaXNoZWQgPz8gIWRlZi5tZXRhZGF0YT8uWydpc0RyYWZ0J10sXG4gICAgICBsYXN0TW9kaWZpZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuXG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICBsaXN0W2lkeF0gPSBzdW1tYXJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnB1c2goc3VtbWFyeSk7XG4gICAgfVxuICAgIHRoaXMuc3VtbWFyaWVzLnNldChsaXN0KTtcbiAgfVxufVxuIl19
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXN0b3JlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9wZXJzaXN0ZW5jZS9zZXJ2aWNlcy9yZXBvcnQtc3RvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN2RixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUNwRyxPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUs3SCxPQUFPLEVBQUUsd0JBQXdCLEVBQXFDLE1BQU0sNERBQTRELENBQUM7QUFDekksT0FBTyxFQUFFLHlCQUF5QixFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBRS9GOzs7R0FHRztBQUVILE1BQU0sT0FBTyxrQkFBa0I7SUFDWixPQUFPLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0QsU0FBUyxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sR0FBRyxNQUFNLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsRSxTQUFTLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDeEUsWUFBWSxHQUFHLEVBQUUsQ0FB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O1lBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQzt3R0E3VFUsa0JBQWtCOzRHQUFsQixrQkFBa0IsY0FETCxNQUFNOzs0RkFDbkIsa0JBQWtCO2tCQUQ5QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJXQVlTX1JFUE9SVF9FTkRQT0lOVFMgfSBmcm9tICcuLi8uLi8uLi9kYXRhLWFjY2Vzcy9hZGFwdGVycy9lbmRwb2ludC10b2tlbnMnO1xuaW1wb3J0IHsgUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9yZXBvcnQtc2Vzc2lvbi1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCB0YXAsIHRocm93RXJyb3IsIHN3aXRjaE1hcCwgY2F0Y2hFcnJvciwgZmluYWxpemUsIG1hcCwgdGFrZSwgTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBSZXBvcnREZWZpbml0aW9uLFxuICBSZXBvcnRTdW1tYXJ5LFxufSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIsIFJlcG9ydFNhdmVPcHRpb25zLCBSZXBvcnRJZFN0YXR1cyB9IGZyb20gJy4uLy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9yZXBvcnQtcGVyc2lzdGVuY2UuY29udHJhY3QnO1xuaW1wb3J0IHsgbm9ybWFsaXplUmVwb3J0RGVmaW5pdGlvbiwgU2NoZW1hVmFsaWRhdG9yU2VydmljZSB9IGZyb20gJy4vc2NoZW1hLXZhbGlkYXRvci5zZXJ2aWNlJztcblxuLyoqXG4gKiBSZXBvcnRTdG9yZVNlcnZpY2UgbWFuYWdlcyBhcHBsaWNhdGlvbi13aWRlIGNhY2hlZCByZXBvcnQgc3RhdGVzLFxuICogbGlzdGluZywgYW5kIHJlYWN0aXZlIGFjY2VzcyB2aWEgQW5ndWxhciBzaWduYWxzLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFJlcG9ydFN0b3JlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRhcHRlciA9IGluamVjdChSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdG9yID0gaW5qZWN0KFNjaGVtYVZhbGlkYXRvclNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb24gPSBpbmplY3QoUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50cyA9IGluamVjdChCV0FZU19SRVBPUlRfRU5EUE9JTlRTLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIGNhY2hlQ29udGV4dCA9ICcnO1xuXG4gIHByaXZhdGUgY3VycmVudENhY2hlQ29udGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShbdGhpcy5zZXNzaW9uPy5nZXRDdXJyZW50U2Vzc2lvbkNvbnRleHQoKSA/PyB7fSwgdGhpcy5lbmRwb2ludHM/LnJlcG9ydHNFbmRwb2ludF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBndWFyZENhY2hlQ29udGV4dDxUPihjb250ZXh0OiBzdHJpbmcpOiBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb248VD4ge1xuICAgIHJldHVybiB0YXAoKCkgPT4ge1xuICAgICAgaWYgKGNvbnRleHQgIT09IHRoaXMuY3VycmVudENhY2hlQ29udGV4dCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVwb3J0aW5nIGNvbnRleHQgY2hhbmdlZCB3aGlsZSB0aGUgcmVxdWVzdCB3YXMgcGVuZGluZy4nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlQ2FjaGVDb250ZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuY3VycmVudENhY2hlQ29udGV4dCgpO1xuICAgIGlmIChjb250ZXh0ID09PSB0aGlzLmNhY2hlQ29udGV4dCkgcmV0dXJuIGNvbnRleHQ7XG4gICAgdGhpcy5jYWNoZUNvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuY2FjaGUuc2V0KG5ldyBNYXAoKSk7XG4gICAgdGhpcy5zdW1tYXJpZXMuc2V0KFtdKTtcbiAgICB0aGlzLmFjdGl2ZVJlcG9ydElkLnNldChudWxsKTtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIC8qKiBMaXN0IG9mIGFsbCBrbm93biByZXBvcnQgc3VtbWFyaWVzICovXG4gIHJlYWRvbmx5IHN1bW1hcmllcyA9IHNpZ25hbDxSZXBvcnRTdW1tYXJ5W10+KFtdKTtcblxuICAvKiogSW4tbWVtb3J5IGNhY2hlIG9mIGxvYWRlZCBmdWxsIHJlcG9ydCBkZWZpbml0aW9ucyBieSBJRCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gc2lnbmFsPE1hcDxzdHJpbmcsIFJlcG9ydERlZmluaXRpb24+PihuZXcgTWFwKCkpO1xuXG4gIC8qKiBDdXJyZW50bHkgc2VsZWN0ZWQgcmVwb3J0IElEICovXG4gIHJlYWRvbmx5IGFjdGl2ZVJlcG9ydElkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8qKiBMb2FkaW5nIHN0YXRlIGluZGljYXRvciAqL1xuICByZWFkb25seSBpc0xvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qKiBDdXJyZW50IGVycm9yIG1lc3NhZ2UgKi9cbiAgcmVhZG9ubHkgZXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIEFjdGl2ZSByZXBvcnQgZGVmaW5pdGlvbiBjb21wdXRlZCBmcm9tIGNhY2hlICovXG4gIHJlYWRvbmx5IGFjdGl2ZVJlcG9ydCA9IGNvbXB1dGVkPFJlcG9ydERlZmluaXRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmFjdGl2ZVJlcG9ydElkKCk7XG4gICAgaWYgKCFpZCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUoKS5nZXQoaWQpID8/IG51bGw7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgcmVwb3J0cy5cbiAgICovXG4gIGxvYWRTdW1tYXJpZXMoKTogT2JzZXJ2YWJsZTxSZXBvcnRTdW1tYXJ5W10+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5lbnN1cmVDYWNoZUNvbnRleHQoKTtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuc3VtbWFyaWVzKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGxpc3QkID0gdGhpcy5hZGFwdGVyLmxpc3QoKTtcbiAgICBpZiAoIWxpc3QkIHx8IHR5cGVvZiBsaXN0JC5waXBlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5zdW1tYXJpZXMoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuXG4gICAgcmV0dXJuIGxpc3QkLnBpcGUoXG4gICAgICB0aGlzLmd1YXJkQ2FjaGVDb250ZXh0KGNvbnRleHQpLFxuICAgICAgdGFwKHtcbiAgICAgICAgbmV4dDogKGxpc3QpID0+IHtcbiAgICAgICAgICB0aGlzLnN1bW1hcmllcy5zZXQobGlzdCB8fCBbXSk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLmVycm9yLnNldChlcnI/Lm1lc3NhZ2UgPz8gJ0ZhaWxlZCB0byBsb2FkIHJlcG9ydCBsaXN0LicpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIHJlcG9ydCBkZWZpbml0aW9uIGJ5IElELCB1c2luZyBjYWNoZWQgaW5zdGFuY2UgaWYgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gcmVwb3J0SWQgLSBJRCBvZiB0aGUgcmVwb3J0IHRvIGxvYWQuXG4gICAqIEBwYXJhbSBmb3JjZVJlZnJlc2ggLSBJZiB0cnVlLCBieXBhc3NlcyB0aGUgaW4tbWVtb3J5IGNhY2hlLlxuICAgKi9cbiAgbG9hZFJlcG9ydChyZXBvcnRJZDogc3RyaW5nLCBmb3JjZVJlZnJlc2ggPSBmYWxzZSk6IE9ic2VydmFibGU8UmVwb3J0RGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmVuc3VyZUNhY2hlQ29udGV4dCgpO1xuICAgIGlmICghZm9yY2VSZWZyZXNoKSB7XG4gICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmNhY2hlKCkuZ2V0KHJlcG9ydElkKTtcbiAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVSZXBvcnRJZC5zZXQocmVwb3J0SWQpO1xuICAgICAgICByZXR1cm4gb2YoY2FjaGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIgbm90IGNvbmZpZ3VyZWQuJykpO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcblxuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIubG9hZChyZXBvcnRJZCkucGlwZShcbiAgICAgIG1hcChub3JtYWxpemVSZXBvcnREZWZpbml0aW9uKSxcbiAgICAgIHRoaXMuZ3VhcmRDYWNoZUNvbnRleHQoY29udGV4dCksXG4gICAgICB0YXAoe1xuICAgICAgICBuZXh0OiAoZGVmKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmFzc2VydFZhbGlkKGRlZik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yLnNldChlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0ludmFsaWQgcmVwb3J0IGRlZmluaXRpb24uJyk7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG5leHRDYWNoZSA9IG5ldyBNYXAodGhpcy5jYWNoZSgpKTtcbiAgICAgICAgICBuZXh0Q2FjaGUuc2V0KHJlcG9ydElkLCBkZWYpO1xuICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KG5leHRDYWNoZSk7XG4gICAgICAgICAgdGhpcy5hY3RpdmVSZXBvcnRJZC5zZXQocmVwb3J0SWQpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvci5zZXQoZXJyPy5tZXNzYWdlID8/IGBGYWlsZWQgdG8gbG9hZCByZXBvcnQgXCIke3JlcG9ydElkfVwiLmApO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIHJlcG9ydCBkZWZpbml0aW9uIGJ5IHNsdWcgb3IgSUQuXG4gICAqIFJlc29sdmVzIGZyb20gY2FjaGUsIGxvYWRlZCBzdW1tYXJpZXMsIG9yIGFkYXB0ZXIuXG4gICAqL1xuICBsb2FkUmVwb3J0QnlTbHVnKHNsdWdPcklkOiBzdHJpbmcsIGZvcmNlUmVmcmVzaCA9IGZhbHNlKTogT2JzZXJ2YWJsZTxSZXBvcnREZWZpbml0aW9uPiB7XG4gICAgdGhpcy5lbnN1cmVDYWNoZUNvbnRleHQoKTtcbiAgICBjb25zdCBzbHVnTG93ZXIgPSBzbHVnT3JJZC50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICAgIC8vIDEuIENoZWNrIGluLW1lbW9yeSBjYWNoZSBpZiBub3QgZm9yY2luZyByZWZyZXNoXG4gICAgaWYgKCFmb3JjZVJlZnJlc2gpIHtcbiAgICAgIGZvciAoY29uc3QgZGVmIG9mIHRoaXMuY2FjaGUoKS52YWx1ZXMoKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZGVmLmlkLnRvTG93ZXJDYXNlKCkgPT09IHNsdWdMb3dlciB8fFxuICAgICAgICAgIChkZWYuc2x1ZyAmJiBkZWYuc2x1Zy50b0xvd2VyQ2FzZSgpID09PSBzbHVnTG93ZXIpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlUmVwb3J0SWQuc2V0KGRlZi5pZCk7XG4gICAgICAgICAgcmV0dXJuIG9mKGRlZik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBDaGVjayBleGlzdGluZyBzdW1tYXJpZXNcbiAgICBjb25zdCBtYXRjaGVkU3VtbWFyeSA9IHRoaXMuc3VtbWFyaWVzKCkuZmluZChcbiAgICAgIChzKSA9PlxuICAgICAgICBzLmlkLnRvTG93ZXJDYXNlKCkgPT09IHNsdWdMb3dlciB8fFxuICAgICAgICAocy5zbHVnICYmIHMuc2x1Zy50b0xvd2VyQ2FzZSgpID09PSBzbHVnTG93ZXIpXG4gICAgKTtcblxuICAgIGlmIChtYXRjaGVkU3VtbWFyeSkge1xuICAgICAgcmV0dXJuIHRoaXMubG9hZFJlcG9ydChtYXRjaGVkU3VtbWFyeS5pZCwgZm9yY2VSZWZyZXNoKTtcbiAgICB9XG5cbiAgICAvLyAzLiBJZiBub3QgZm91bmQgaW4gc3VtbWFyaWVzLCByZWZyZXNoIHN1bW1hcmllcyBmaXJzdCBvciBmYWxsYmFjayB0byBsb2FkUmVwb3J0IGRpcmVjdGx5XG4gICAgcmV0dXJuIHRoaXMubG9hZFN1bW1hcmllcygpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGxpc3QpID0+IHtcbiAgICAgICAgY29uc3QgZm91bmQgPSBsaXN0LmZpbmQoXG4gICAgICAgICAgKHMpID0+XG4gICAgICAgICAgICBzLmlkLnRvTG93ZXJDYXNlKCkgPT09IHNsdWdMb3dlciB8fFxuICAgICAgICAgICAgKHMuc2x1ZyAmJiBzLnNsdWcudG9Mb3dlckNhc2UoKSA9PT0gc2x1Z0xvd2VyKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkUmVwb3J0KGZvdW5kID8gZm91bmQuaWQgOiBzbHVnT3JJZCwgZm9yY2VSZWZyZXNoKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiB0aGlzLmxvYWRSZXBvcnQoc2x1Z09ySWQsIGZvcmNlUmVmcmVzaCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIHJlcG9ydCBkZWZpbml0aW9uLCB2YWxpZGF0ZXMgaXQsIGFuZCB1cGRhdGVzIGxvY2FsIGNhY2hlLlxuICAgKi9cbiAgLyoqIE9wYXF1ZSBlbmRwb2ludC9zZXNzaW9uIGlkZW50aXR5IGZvciBwZW5kaW5nIHVzZXIgY29uZmlybWF0aW9ucy4gKi9cbiAgZ2V0U3RvcmFnZUNvbnRleHRLZXkoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuY3VycmVudENhY2hlQ29udGV4dCgpOyB9XG5cbiAgaW5zcGVjdFJlcG9ydElkKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFJlcG9ydElkU3RhdHVzPiB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZW5zdXJlQ2FjaGVDb250ZXh0KCk7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignUmVwb3J0IHN0b3JhZ2UgaXMgbm90IGNvbmZpZ3VyZWQuJykpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuaW5zcGVjdElkKGlkKS5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIC8vIFJlYWQgbGVnYWN5IHZlcnNpb24gbWV0YWRhdGEgd2l0aG91dCBzZWxlY3RpbmcgYW5vdGhlciByZXBvcnQgb3IgY2hhbmdpbmcgdGhlIGRyYWZ0L2NhY2hlLlxuICAgICAgc3dpdGNoTWFwKHN0YXR1cyA9PiBzdGF0dXMuZXhpc3RzICYmIHN0YXR1cy52ZXJzaW9uID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLmFkYXB0ZXIhLmxvYWQoaWQpLnBpcGUobWFwKHJlcG9ydCA9PiAoeyBleGlzdHM6IHRydWUsIG5hbWU6IHJlcG9ydC5uYW1lLCB2ZXJzaW9uOiByZXBvcnQudmVyc2lvbiB9KSkpXG4gICAgICAgIDogb2Yoc3RhdHVzKSksXG4gICAgICB0aGlzLmd1YXJkQ2FjaGVDb250ZXh0KGNvbnRleHQpLFxuICAgICk7XG4gIH1cblxuICBjaGVja1JlcG9ydElkKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5lbnN1cmVDYWNoZUNvbnRleHQoKTtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdSZXBvcnQgc3RvcmFnZSBpcyBub3QgY29uZmlndXJlZC4nKSk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5jaGVja0lkKGlkKS5waXBlKHRoaXMuZ3VhcmRDYWNoZUNvbnRleHQoY29udGV4dCkpO1xuICB9XG5cbiAgLyoqIFNhdmVzIGEgdmFsaWRhdGVkIHJlcG9ydCBkZWZpbml0aW9uIGFuZCB1cGRhdGVzIHRoZSBsb2NhbCBjYWNoZS4gKi9cbiAgc2F2ZVJlcG9ydChyZXBvcnQ6IFJlcG9ydERlZmluaXRpb24sIG9wdGlvbnM/OiBSZXBvcnRTYXZlT3B0aW9ucyk6IE9ic2VydmFibGU8UmVwb3J0RGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmVuc3VyZUNhY2hlQ29udGV4dCgpO1xuICAgIHRoaXMudmFsaWRhdG9yLmFzc2VydFZhbGlkKHJlcG9ydCk7XG5cbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdSZXBvcnQgc3RvcmFnZSBpcyBub3QgY29uZmlndXJlZC4gUmVnaXN0ZXIgcHJvdmlkZUJ3YXlzUmVwb3J0KCkgdG8gc2F2ZSByZXBvcnRzLicpKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG5cbiAgICByZXR1cm4gKG9wdGlvbnMgPyB0aGlzLmFkYXB0ZXIuc2F2ZShyZXBvcnQsIG9wdGlvbnMpIDogdGhpcy5hZGFwdGVyLnNhdmUocmVwb3J0KSkucGlwZShcbiAgICAgIHRoaXMuZ3VhcmRDYWNoZUNvbnRleHQoY29udGV4dCksXG4gICAgICB0YXAoe1xuICAgICAgICBuZXh0OiAoc2F2ZWQpID0+IHtcbiAgICAgICAgICB0aGlzLmNhY2hlU2F2ZWRSZXBvcnQoc2F2ZWQpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvci5zZXQoZXJyPy5tZXNzYWdlID8/IGBGYWlsZWQgdG8gc2F2ZSByZXBvcnQgXCIke3JlcG9ydC5pZH1cIi5gKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpKVxuICAgICk7XG4gIH1cblxuICAvKiogQWNjZXB0cyBhbiBhbHJlYWR5IHBlcnNpc3RlZCByZXBvcnQgd2l0aG91dCBpc3N1aW5nIGFub3RoZXIgZGF0YWJhc2Ugd3JpdGUuICovXG4gIGNhY2hlU2F2ZWRSZXBvcnQocmVwb3J0OiBSZXBvcnREZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVDYWNoZUNvbnRleHQoKTtcbiAgICBjb25zdCBuZXh0Q2FjaGUgPSBuZXcgTWFwKHRoaXMuY2FjaGUoKSk7XG4gICAgbmV4dENhY2hlLnNldChyZXBvcnQuaWQsIHJlcG9ydCk7XG4gICAgdGhpcy5jYWNoZS5zZXQobmV4dENhY2hlKTtcbiAgICB0aGlzLnVwZGF0ZVN1bW1hcnlJbkxpc3QocmVwb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGEgcmVwb3J0IGRlZmluaXRpb24gYnkgSUQuXG4gICAqL1xuICBkZWxldGVSZXBvcnQocmVwb3J0SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmVuc3VyZUNhY2hlQ29udGV4dCgpO1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICBjb25zdCBuZXh0Q2FjaGUgPSBuZXcgTWFwKHRoaXMuY2FjaGUoKSk7XG4gICAgICBuZXh0Q2FjaGUuZGVsZXRlKHJlcG9ydElkKTtcbiAgICAgIHRoaXMuY2FjaGUuc2V0KG5leHRDYWNoZSk7XG4gICAgICB0aGlzLnN1bW1hcmllcy5zZXQodGhpcy5zdW1tYXJpZXMoKS5maWx0ZXIoKHMpID0+IHMuaWQgIT09IHJlcG9ydElkKSk7XG4gICAgICBpZiAodGhpcy5hY3RpdmVSZXBvcnRJZCgpID09PSByZXBvcnRJZCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVJlcG9ydElkLnNldChudWxsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvZih2b2lkIDApO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmRlbGV0ZShyZXBvcnRJZCkucGlwZShcbiAgICAgIHRoaXMuZ3VhcmRDYWNoZUNvbnRleHQoY29udGV4dCksXG4gICAgICB0YXAoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV4dENhY2hlID0gbmV3IE1hcCh0aGlzLmNhY2hlKCkpO1xuICAgICAgICAgIG5leHRDYWNoZS5kZWxldGUocmVwb3J0SWQpO1xuICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KG5leHRDYWNoZSk7XG4gICAgICAgICAgdGhpcy5zdW1tYXJpZXMuc2V0KHRoaXMuc3VtbWFyaWVzKCkuZmlsdGVyKChzKSA9PiBzLmlkICE9PSByZXBvcnRJZCkpO1xuICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVJlcG9ydElkKCkgPT09IHJlcG9ydElkKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVJlcG9ydElkLnNldChudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLmVycm9yLnNldChlcnI/Lm1lc3NhZ2UgPz8gYEZhaWxlZCB0byBkZWxldGUgcmVwb3J0IFwiJHtyZXBvcnRJZH1cIi5gKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYWN0aXZlIHJlcG9ydCBJRC5cbiAgICovXG4gIHNldEFjdGl2ZVJlcG9ydChpZDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlUmVwb3J0SWQuc2V0KGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGluLW1lbW9yeSBjYWNoZS5cbiAgICovXG4gIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5zZXQobmV3IE1hcCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3VtbWFyeUluTGlzdChkZWY6IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0ID0gWy4uLnRoaXMuc3VtbWFyaWVzKCldO1xuICAgIGNvbnN0IGlkeCA9IGxpc3QuZmluZEluZGV4KChzKSA9PiBzLmlkID09PSBkZWYuaWQpO1xuICAgIGNvbnN0IHN1bW1hcnk6IFJlcG9ydFN1bW1hcnkgPSB7XG4gICAgICBpZDogZGVmLmlkLFxuICAgICAgbmFtZTogZGVmLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogZGVmLmRlc2NyaXB0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGRlZi5jYXRlZ29yeSxcbiAgICAgIHNsdWc6IGRlZi5zbHVnID8/IGRlZi5pZCxcbiAgICAgIG1lbnVHcm91cDogZGVmLm1lbnVHcm91cCxcbiAgICAgIG1lbnVPcmRlcjogZGVmLm1lbnVPcmRlcixcbiAgICAgIGljb246IGRlZi5pY29uLFxuICAgICAgdmVyc2lvbjogZGVmLnZlcnNpb24sXG4gICAgICBpc1B1Ymxpc2hlZDogZGVmLmlzUHVibGlzaGVkID8/ICFkZWYubWV0YWRhdGE/LlsnaXNEcmFmdCddLFxuICAgICAgbGFzdE1vZGlmaWVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcblxuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgbGlzdFtpZHhdID0gc3VtbWFyeTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdC5wdXNoKHN1bW1hcnkpO1xuICAgIH1cbiAgICB0aGlzLnN1bW1hcmllcy5zZXQobGlzdCk7XG4gIH1cbn1cbiJdfQ==
@@ -14,9 +14,56 @@ import * as i0 from "@angular/core";
14
14
  export function validateReportSchema(definition) {
15
15
  const errors = [];
16
16
  const warnings = [];
17
- if (!definition) {
17
+ if (!definition || typeof definition !== 'object' || Array.isArray(definition)) {
18
18
  return { valid: false, errors: ['Report definition is null or undefined.'], warnings: [] };
19
19
  }
20
+ const record = definition;
21
+ const object = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
22
+ for (const key of ['id', 'name']) {
23
+ if (typeof record[key] !== 'string')
24
+ errors.push(`Report ${key} must be a string.`);
25
+ }
26
+ for (const key of ['components', 'parameters', 'dataSources']) {
27
+ const value = record[key];
28
+ if (value !== undefined && (!Array.isArray(value) || value.some(item => !object(item))))
29
+ errors.push(`${key} must be an array of objects.`);
30
+ }
31
+ if (record['version'] !== undefined && (!Number.isInteger(record['version']) || Number(record['version']) < 0))
32
+ errors.push('Report version must be a non-negative integer.');
33
+ if (record['schemaVersion'] !== undefined && record['schemaVersion'] !== 1)
34
+ errors.push('Unsupported report schemaVersion. Supported version: 1.');
35
+ if (record['layout'] !== undefined && !object(record['layout']))
36
+ errors.push('layout must be an object.');
37
+ if (record['grid'] !== undefined && (!object(record['grid']) || !Array.isArray(record['grid']['columns'])))
38
+ errors.push('grid must contain a columns array.');
39
+ if (errors.length)
40
+ return { valid: false, errors, warnings };
41
+ for (const component of definition.components ?? []) {
42
+ if (typeof component.id !== 'string' || typeof component.type !== 'string' || !component.type.trim())
43
+ errors.push('Components require string id and type fields.');
44
+ if (component.key !== undefined && typeof component.key !== 'string')
45
+ errors.push('Component keys must be strings.');
46
+ if (component.properties !== undefined && !object(component.properties))
47
+ errors.push('Component properties must be an object.');
48
+ if (component.dataSource !== undefined && !object(component.dataSource))
49
+ errors.push('Component dataSource must be an object.');
50
+ if (component.layout !== undefined && !object(component.layout))
51
+ errors.push('Component layout must be an object.');
52
+ }
53
+ const parameterKeys = new Set();
54
+ for (const parameter of definition.parameters ?? []) {
55
+ if (typeof parameter.key !== 'string' || !parameter.key.trim() || parameterKeys.has(parameter.key))
56
+ errors.push('Parameters require unique, non-empty string keys.');
57
+ parameterKeys.add(parameter.key);
58
+ }
59
+ for (const source of definition.dataSources ?? []) {
60
+ if (typeof source.id !== 'string' || typeof source.name !== 'string' || typeof source.endpoint !== 'string')
61
+ errors.push('Data sources require string id, name and endpoint fields.');
62
+ }
63
+ if (definition.grid?.columns.some(column => !object(column) || typeof column['field'] !== 'string'))
64
+ errors.push('Grid columns require string field names.');
65
+ if (errors.length)
66
+ return { valid: false, errors, warnings };
20
67
  if (!definition.id || !definition.id.trim()) {
21
68
  errors.push('Report definition missing required "id".');
22
69
  }
@@ -24,7 +71,7 @@ export function validateReportSchema(definition) {
24
71
  errors.push('Report definition missing required "name".');
25
72
  }
26
73
  const columns = definition.layout?.columns ?? 12;
27
- if (columns < 1 || columns > 36) {
74
+ if (!Number.isInteger(columns) || columns < 1 || columns > 36) {
28
75
  errors.push(`Invalid layout columns count: ${columns}. Must be between 1 and 36.`);
29
76
  }
30
77
  // Verify component IDs and keys
@@ -72,6 +119,15 @@ export function validateReportSchema(definition) {
72
119
  warnings,
73
120
  };
74
121
  }
122
+ /** Normalize legacy optional collections only after verifying unknown input is safe. */
123
+ export function normalizeReportDefinition(value) {
124
+ const result = validateReportSchema(value);
125
+ if (!result.valid)
126
+ throw new ReportDefinitionError(result.errors.join('; '));
127
+ const report = value;
128
+ return { ...report, schemaVersion: report.schemaVersion ?? 1, layout: report.layout ?? { columns: 12 },
129
+ components: report.components ?? [], parameters: report.parameters ?? [], dataSources: report.dataSources ?? [] };
130
+ }
75
131
  /**
76
132
  * SchemaValidatorService provides schema verification methods.
77
133
  */
@@ -99,4 +155,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
99
155
  type: Injectable,
100
156
  args: [{ providedIn: 'root' }]
101
157
  }] });
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLXZhbGlkYXRvci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvcGVyc2lzdGVuY2Uvc2VydmljZXMvc2NoZW1hLXZhbGlkYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7O0FBUTlFOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxVQUE0QjtJQUMvRCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO0lBRTlCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyx5Q0FBeUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUM3RixDQUFDO0lBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUNqRCxJQUFJLE9BQU8sR0FBRyxDQUFD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SUFDakM7O09BRUc7SUFDSCxRQUFRLENBQUMsVUFBNEI7UUFDbkMsT0FBTyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLFVBQTRCO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUkscUJBQXFCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLENBQUM7SUFDSCxDQUFDO3dHQWpCVSxzQkFBc0I7NEdBQXRCLHNCQUFzQixjQURULE1BQU07OzRGQUNuQixzQkFBc0I7a0JBRGxDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVwb3J0RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1kZWZpbml0aW9uLm1vZGVsJztcbmltcG9ydCB7IFJlcG9ydERlZmluaXRpb25FcnJvciB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZXJyb3JzL3JlcG9ydGluZy1lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYVZhbGlkYXRpb25SZXN1bHQge1xuICB2YWxpZDogYm9vbGVhbjtcbiAgZXJyb3JzOiBzdHJpbmdbXTtcbiAgd2FybmluZ3M6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFB1cmUgZnVuY3Rpb24gdGhhdCB2YWxpZGF0ZXMgdGhlIGludGVncml0eSBhbmQgY29uc3RyYWludHMgb2YgYSBSZXBvcnREZWZpbml0aW9uLlxuICpcbiAqIENoZWNrczpcbiAqIC0gSUQgYW5kIE5hbWUgcHJlc2VuY2VcbiAqIC0gVW5pcXVlIGNvbXBvbmVudCBJRHNcbiAqIC0gVW5pcXVlIHBhcmFtZXRlci9pbnB1dCBrZXlzXG4gKiAtIEdyaWQgZGF0YSBzb3VyY2UgcmVmZXJlbmNlc1xuICogLSBDb2x1bW4gc3BhbiBib3VuZGFyeSB2aW9sYXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJlcG9ydFNjaGVtYShkZWZpbml0aW9uOiBSZXBvcnREZWZpbml0aW9uKTogU2NoZW1hVmFsaWRhdGlvblJlc3VsdCB7XG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnM6IFsnUmVwb3J0IGRlZmluaXRpb24gaXMgbnVsbCBvciB1bmRlZmluZWQuJ10sIHdhcm5pbmdzOiBbXSB9O1xuICB9XG5cbiAgaWYgKCFkZWZpbml0aW9uLmlkIHx8ICFkZWZpbml0aW9uLmlkLnRyaW0oKSkge1xuICAgIGVycm9ycy5wdXNoKCdSZXBvcnQgZGVmaW5pdGlvbiBtaXNzaW5nIHJlcXVpcmVkIFwiaWRcIi4nKTtcbiAgfVxuXG4gIGlmICghZGVmaW5pdGlvbi5uYW1lIHx8ICFkZWZpbml0aW9uLm5hbWUudHJpbSgpKSB7XG4gICAgZXJyb3JzLnB1c2goJ1JlcG9ydCBkZWZpbml0aW9uIG1pc3NpbmcgcmVxdWlyZWQgXCJuYW1lXCIuJyk7XG4gIH1cblxuICBjb25zdCBjb2x1bW5zID0gZGVmaW5pdGlvbi5sYXlvdXQ/LmNvbHVtbnMgPz8gMTI7XG4gIGlmIChjb2x1bW5zIDwgMSB8fCBjb2x1bW5zID4gMzYpIHtcbiAgICBlcnJvcnMucHVzaChgSW52YWxpZCBsYXlvdXQgY29sdW1ucyBjb3VudDogJHtjb2x1bW5zfS4gTXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDM2LmApO1xuICB9XG5cbiAgLy8gVmVyaWZ5IGNvbXBvbmVudCBJRHMgYW5kIGtleXNcbiAgY29uc3QgY29tcG9uZW50SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGNvbXBvbmVudEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IGNvbXAgb2YgZGVmaW5pdGlvbi5jb21wb25lbnRzID8/IFtdKSB7XG4gICAgaWYgKCFjb21wLmlkKSB7XG4gICAgICBlcnJvcnMucHVzaCgnRW5jb3VudGVyZWQgY29tcG9uZW50IG1pc3NpbmcgdW5pcXVlIFwiaWRcIi4nKTtcbiAgICB9IGVsc2UgaWYgKGNvbXBvbmVudElkcy5oYXMoY29tcC5pZCkpIHtcbiAgICAgIGVycm9ycy5wdXNoKGBEdXBsaWNhdGUgY29tcG9uZW50IElEIGZvdW5kOiBcIiR7Y29tcC5pZH1cIi5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50SWRzLmFkZChjb21wLmlkKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcC5rZXkpIHtcbiAgICAgIGlmIChjb21wb25lbnRLZXlzLmhhcyhjb21wLmtleSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYER1cGxpY2F0ZSBmb3JtIGZpZWxkIGtleSBmb3VuZDogXCIke2NvbXAua2V5fVwiLmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50S2V5cy5hZGQoY29tcC5rZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29tcC50eXBlICE9PSAnYnV0dG9uJyAmJiBjb21wLnR5cGUgIT09ICdkaXNwbGF5Jykge1xuICAgICAgd2FybmluZ3MucHVzaChgSW5wdXQgY29tcG9uZW50IFwiJHtjb21wLmlkfVwiICgke2NvbXAudHlwZX0pIGhhcyBubyBcImtleVwiIGRlZmluZWQgZm9yIGZvcm0gYmluZGluZy5gKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcC5sYXlvdXQ/LmNvbHVtblNwYW4gJiYgY29tcC5sYXlvdXQuY29sdW1uU3BhbiA+IGNvbHVtbnMpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICAgIGBDb21wb25lbnQgXCIke2NvbXAuaWR9XCIgY29sdW1uU3BhbiAoJHtjb21wLmxheW91dC5jb2x1bW5TcGFufSkgZXhjZWVkcyBwYWdlIHRvdGFsIGNvbHVtbnMgKCR7Y29sdW1uc30pLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gVmVyaWZ5IGdyaWQgJiBkYXRhIHNvdXJjZSBpbnRlZ3JpdHlcbiAgaWYgKGRlZmluaXRpb24uZ3JpZCkge1xuICAgIGNvbnN0IGRzSWQgPSBkZWZpbml0aW9uLmdyaWQuZGF0YVNvdXJjZUlkO1xuICAgIGNvbnN0IGRzRXhpc3RzID0gKGRlZmluaXRpb24uZGF0YVNvdXJjZXMgPz8gW10pLnNvbWUoKGRzKSA9PiBkcy5pZCA9PT0gZHNJZCk7XG5cbiAgICBpZiAoIWRzRXhpc3RzKSB7XG4gICAgICBlcnJvcnMucHVzaChgR3JpZCByZWZlcmVuY2VzIGRhdGFTb3VyY2VJZCBcIiR7ZHNJZH1cIiwgYnV0IG5vIG1hdGNoaW5nIGRhdGEgc291cmNlIHdhcyBmb3VuZC5gKTtcbiAgICB9XG5cbiAgICBpZiAoIWRlZmluaXRpb24uZ3JpZC5jb2x1bW5zIHx8IGRlZmluaXRpb24uZ3JpZC5jb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2FybmluZ3MucHVzaCgnR3JpZCBkZWZpbml0aW9uIGhhcyBubyBjb2x1bW5zIGNvbmZpZ3VyZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2YWxpZDogZXJyb3JzLmxlbmd0aCA9PT0gMCxcbiAgICBlcnJvcnMsXG4gICAgd2FybmluZ3MsXG4gIH07XG59XG5cbi8qKlxuICogU2NoZW1hVmFsaWRhdG9yU2VydmljZSBwcm92aWRlcyBzY2hlbWEgdmVyaWZpY2F0aW9uIG1ldGhvZHMuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgU2NoZW1hVmFsaWRhdG9yU2VydmljZSB7XG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSByZXBvcnQgZGVmaW5pdGlvbiBhbmQgcmV0dXJucyBlcnJvcnMvd2FybmluZ3Mgd2l0aG91dCB0aHJvd2luZy5cbiAgICovXG4gIHZhbGlkYXRlKGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb24pOiBTY2hlbWFWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICByZXR1cm4gdmFsaWRhdGVSZXBvcnRTY2hlbWEoZGVmaW5pdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQXNzZXJ0cyB0aGF0IGEgcmVwb3J0IGRlZmluaXRpb24gaXMgdmFsaWQuXG4gICAqIFRocm93cyBgUmVwb3J0RGVmaW5pdGlvbkVycm9yYCBpZiBhbnkgdmFsaWRhdGlvbiBlcnJvciBpcyBkZXRlY3RlZC5cbiAgICovXG4gIGFzc2VydFZhbGlkKGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnZhbGlkYXRlKGRlZmluaXRpb24pO1xuICAgIGlmICghcmVzdWx0LnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgUmVwb3J0RGVmaW5pdGlvbkVycm9yKHJlc3VsdC5lcnJvcnMuam9pbignOyAnKSwgZGVmaW5pdGlvbj8uaWQpO1xuICAgIH1cbiAgfVxufVxuIl19
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLXZhbGlkYXRvci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvcGVyc2lzdGVuY2Uvc2VydmljZXMvc2NoZW1hLXZhbGlkYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7O0FBUTlFOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxVQUE0QjtJQUMvRCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO0lBRTlCLElBQUksQ0FBQyxVQUFVLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUMvRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyx5Q0FBeUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUM3RixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsVUFBZ0QsQ0FBQztJQUNoRSxNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQWMsRUFBb0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuSSxLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBVSxFQUFFLENBQUM7UUFDMUMsSUFBSSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FB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Q0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVcsQ0FBQyxVQUE0QjtRQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1RSxDQUFDO0lBQ0gsQ0FBQzt3R0FqQlUsc0JBQXNCOzRHQUF0QixzQkFBc0IsY0FEVCxNQUFNOzs0RkFDbkIsc0JBQXNCO2tCQURsQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnREZWZpbml0aW9uRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2Vycm9ycy9yZXBvcnRpbmctZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFWYWxpZGF0aW9uUmVzdWx0IHtcbiAgdmFsaWQ6IGJvb2xlYW47XG4gIGVycm9yczogc3RyaW5nW107XG4gIHdhcm5pbmdzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQdXJlIGZ1bmN0aW9uIHRoYXQgdmFsaWRhdGVzIHRoZSBpbnRlZ3JpdHkgYW5kIGNvbnN0cmFpbnRzIG9mIGEgUmVwb3J0RGVmaW5pdGlvbi5cbiAqXG4gKiBDaGVja3M6XG4gKiAtIElEIGFuZCBOYW1lIHByZXNlbmNlXG4gKiAtIFVuaXF1ZSBjb21wb25lbnQgSURzXG4gKiAtIFVuaXF1ZSBwYXJhbWV0ZXIvaW5wdXQga2V5c1xuICogLSBHcmlkIGRhdGEgc291cmNlIHJlZmVyZW5jZXNcbiAqIC0gQ29sdW1uIHNwYW4gYm91bmRhcnkgdmlvbGF0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSZXBvcnRTY2hlbWEoZGVmaW5pdGlvbjogUmVwb3J0RGVmaW5pdGlvbik6IFNjaGVtYVZhbGlkYXRpb25SZXN1bHQge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmICghZGVmaW5pdGlvbiB8fCB0eXBlb2YgZGVmaW5pdGlvbiAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkZWZpbml0aW9uKSkge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3JzOiBbJ1JlcG9ydCBkZWZpbml0aW9uIGlzIG51bGwgb3IgdW5kZWZpbmVkLiddLCB3YXJuaW5nczogW10gfTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZCA9IGRlZmluaXRpb24gYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3Qgb2JqZWN0ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydpZCcsICduYW1lJ10gYXMgY29uc3QpIHtcbiAgICBpZiAodHlwZW9mIHJlY29yZFtrZXldICE9PSAnc3RyaW5nJykgZXJyb3JzLnB1c2goYFJlcG9ydCAke2tleX0gbXVzdCBiZSBhIHN0cmluZy5gKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2NvbXBvbmVudHMnLCAncGFyYW1ldGVycycsICdkYXRhU291cmNlcyddIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSByZWNvcmRba2V5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLnNvbWUoaXRlbSA9PiAhb2JqZWN0KGl0ZW0pKSkpIGVycm9ycy5wdXNoKGAke2tleX0gbXVzdCBiZSBhbiBhcnJheSBvZiBvYmplY3RzLmApO1xuICB9XG4gIGlmIChyZWNvcmRbJ3ZlcnNpb24nXSAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzSW50ZWdlcihyZWNvcmRbJ3ZlcnNpb24nXSkgfHwgTnVtYmVyKHJlY29yZFsndmVyc2lvbiddKSA8IDApKSBlcnJvcnMucHVzaCgnUmVwb3J0IHZlcnNpb24gbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLicpO1xuICBpZiAocmVjb3JkWydzY2hlbWFWZXJzaW9uJ10gIT09IHVuZGVmaW5lZCAmJiByZWNvcmRbJ3NjaGVtYVZlcnNpb24nXSAhPT0gMSkgZXJyb3JzLnB1c2goJ1Vuc3VwcG9ydGVkIHJlcG9ydCBzY2hlbWFWZXJzaW9uLiBTdXBwb3J0ZWQgdmVyc2lvbjogMS4nKTtcbiAgaWYgKHJlY29yZFsnbGF5b3V0J10gIT09IHVuZGVmaW5lZCAmJiAhb2JqZWN0KHJlY29yZFsnbGF5b3V0J10pKSBlcnJvcnMucHVzaCgnbGF5b3V0IG11c3QgYmUgYW4gb2JqZWN0LicpO1xuICBpZiAocmVjb3JkWydncmlkJ10gIT09IHVuZGVmaW5lZCAmJiAoIW9iamVjdChyZWNvcmRbJ2dyaWQnXSkgfHwgIUFycmF5LmlzQXJyYXkocmVjb3JkWydncmlkJ11bJ2NvbHVtbnMnXSkpKSBlcnJvcnMucHVzaCgnZ3JpZCBtdXN0IGNvbnRhaW4gYSBjb2x1bW5zIGFycmF5LicpO1xuICBpZiAoZXJyb3JzLmxlbmd0aCkgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnMsIHdhcm5pbmdzIH07XG5cbiAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgZGVmaW5pdGlvbi5jb21wb25lbnRzID8/IFtdKSB7XG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnQuaWQgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjb21wb25lbnQudHlwZSAhPT0gJ3N0cmluZycgfHwgIWNvbXBvbmVudC50eXBlLnRyaW0oKSkgZXJyb3JzLnB1c2goJ0NvbXBvbmVudHMgcmVxdWlyZSBzdHJpbmcgaWQgYW5kIHR5cGUgZmllbGRzLicpO1xuICAgIGlmIChjb21wb25lbnQua2V5ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGNvbXBvbmVudC5rZXkgIT09ICdzdHJpbmcnKSBlcnJvcnMucHVzaCgnQ29tcG9uZW50IGtleXMgbXVzdCBiZSBzdHJpbmdzLicpO1xuICAgIGlmIChjb21wb25lbnQucHJvcGVydGllcyAhPT0gdW5kZWZpbmVkICYmICFvYmplY3QoY29tcG9uZW50LnByb3BlcnRpZXMpKSBlcnJvcnMucHVzaCgnQ29tcG9uZW50IHByb3BlcnRpZXMgbXVzdCBiZSBhbiBvYmplY3QuJyk7XG4gICAgaWYgKGNvbXBvbmVudC5kYXRhU291cmNlICE9PSB1bmRlZmluZWQgJiYgIW9iamVjdChjb21wb25lbnQuZGF0YVNvdXJjZSkpIGVycm9ycy5wdXNoKCdDb21wb25lbnQgZGF0YVNvdXJjZSBtdXN0IGJlIGFuIG9iamVjdC4nKTtcbiAgICBpZiAoY29tcG9uZW50LmxheW91dCAhPT0gdW5kZWZpbmVkICYmICFvYmplY3QoY29tcG9uZW50LmxheW91dCkpIGVycm9ycy5wdXNoKCdDb21wb25lbnQgbGF5b3V0IG11c3QgYmUgYW4gb2JqZWN0LicpO1xuICB9XG4gIGNvbnN0IHBhcmFtZXRlcktleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgZGVmaW5pdGlvbi5wYXJhbWV0ZXJzID8/IFtdKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbWV0ZXIua2V5ICE9PSAnc3RyaW5nJyB8fCAhcGFyYW1ldGVyLmtleS50cmltKCkgfHwgcGFyYW1ldGVyS2V5cy5oYXMocGFyYW1ldGVyLmtleSkpIGVycm9ycy5wdXNoKCdQYXJhbWV0ZXJzIHJlcXVpcmUgdW5pcXVlLCBub24tZW1wdHkgc3RyaW5nIGtleXMuJyk7XG4gICAgcGFyYW1ldGVyS2V5cy5hZGQocGFyYW1ldGVyLmtleSk7XG4gIH1cbiAgZm9yIChjb25zdCBzb3VyY2Ugb2YgZGVmaW5pdGlvbi5kYXRhU291cmNlcyA/PyBbXSkge1xuICAgIGlmICh0eXBlb2Ygc291cmNlLmlkICE9PSAnc3RyaW5nJyB8fCB0eXBlb2Ygc291cmNlLm5hbWUgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBzb3VyY2UuZW5kcG9pbnQgIT09ICdzdHJpbmcnKSBlcnJvcnMucHVzaCgnRGF0YSBzb3VyY2VzIHJlcXVpcmUgc3RyaW5nIGlkLCBuYW1lIGFuZCBlbmRwb2ludCBmaWVsZHMuJyk7XG4gIH1cbiAgaWYgKGRlZmluaXRpb24uZ3JpZD8uY29sdW1ucy5zb21lKGNvbHVtbiA9PiAhb2JqZWN0KGNvbHVtbikgfHwgdHlwZW9mIGNvbHVtblsnZmllbGQnXSAhPT0gJ3N0cmluZycpKSBlcnJvcnMucHVzaCgnR3JpZCBjb2x1bW5zIHJlcXVpcmUgc3RyaW5nIGZpZWxkIG5hbWVzLicpO1xuICBpZiAoZXJyb3JzLmxlbmd0aCkgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnMsIHdhcm5pbmdzIH07XG5cbiAgaWYgKCFkZWZpbml0aW9uLmlkIHx8ICFkZWZpbml0aW9uLmlkLnRyaW0oKSkge1xuICAgIGVycm9ycy5wdXNoKCdSZXBvcnQgZGVmaW5pdGlvbiBtaXNzaW5nIHJlcXVpcmVkIFwiaWRcIi4nKTtcbiAgfVxuXG4gIGlmICghZGVmaW5pdGlvbi5uYW1lIHx8ICFkZWZpbml0aW9uLm5hbWUudHJpbSgpKSB7XG4gICAgZXJyb3JzLnB1c2goJ1JlcG9ydCBkZWZpbml0aW9uIG1pc3NpbmcgcmVxdWlyZWQgXCJuYW1lXCIuJyk7XG4gIH1cblxuICBjb25zdCBjb2x1bW5zID0gZGVmaW5pdGlvbi5sYXlvdXQ/LmNvbHVtbnMgPz8gMTI7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihjb2x1bW5zKSB8fCBjb2x1bW5zIDwgMSB8fCBjb2x1bW5zID4gMzYpIHtcbiAgICBlcnJvcnMucHVzaChgSW52YWxpZCBsYXlvdXQgY29sdW1ucyBjb3VudDogJHtjb2x1bW5zfS4gTXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDM2LmApO1xuICB9XG5cbiAgLy8gVmVyaWZ5IGNvbXBvbmVudCBJRHMgYW5kIGtleXNcbiAgY29uc3QgY29tcG9uZW50SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGNvbXBvbmVudEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IGNvbXAgb2YgZGVmaW5pdGlvbi5jb21wb25lbnRzID8/IFtdKSB7XG4gICAgaWYgKCFjb21wLmlkKSB7XG4gICAgICBlcnJvcnMucHVzaCgnRW5jb3VudGVyZWQgY29tcG9uZW50IG1pc3NpbmcgdW5pcXVlIFwiaWRcIi4nKTtcbiAgICB9IGVsc2UgaWYgKGNvbXBvbmVudElkcy5oYXMoY29tcC5pZCkpIHtcbiAgICAgIGVycm9ycy5wdXNoKGBEdXBsaWNhdGUgY29tcG9uZW50IElEIGZvdW5kOiBcIiR7Y29tcC5pZH1cIi5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50SWRzLmFkZChjb21wLmlkKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcC5rZXkpIHtcbiAgICAgIGlmIChjb21wb25lbnRLZXlzLmhhcyhjb21wLmtleSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYER1cGxpY2F0ZSBmb3JtIGZpZWxkIGtleSBmb3VuZDogXCIke2NvbXAua2V5fVwiLmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50S2V5cy5hZGQoY29tcC5rZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29tcC50eXBlICE9PSAnYnV0dG9uJyAmJiBjb21wLnR5cGUgIT09ICdkaXNwbGF5Jykge1xuICAgICAgd2FybmluZ3MucHVzaChgSW5wdXQgY29tcG9uZW50IFwiJHtjb21wLmlkfVwiICgke2NvbXAudHlwZX0pIGhhcyBubyBcImtleVwiIGRlZmluZWQgZm9yIGZvcm0gYmluZGluZy5gKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcC5sYXlvdXQ/LmNvbHVtblNwYW4gJiYgY29tcC5sYXlvdXQuY29sdW1uU3BhbiA+IGNvbHVtbnMpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICAgIGBDb21wb25lbnQgXCIke2NvbXAuaWR9XCIgY29sdW1uU3BhbiAoJHtjb21wLmxheW91dC5jb2x1bW5TcGFufSkgZXhjZWVkcyBwYWdlIHRvdGFsIGNvbHVtbnMgKCR7Y29sdW1uc30pLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gVmVyaWZ5IGdyaWQgJiBkYXRhIHNvdXJjZSBpbnRlZ3JpdHlcbiAgaWYgKGRlZmluaXRpb24uZ3JpZCkge1xuICAgIGNvbnN0IGRzSWQgPSBkZWZpbml0aW9uLmdyaWQuZGF0YVNvdXJjZUlkO1xuICAgIGNvbnN0IGRzRXhpc3RzID0gKGRlZmluaXRpb24uZGF0YVNvdXJjZXMgPz8gW10pLnNvbWUoKGRzKSA9PiBkcy5pZCA9PT0gZHNJZCk7XG5cbiAgICBpZiAoIWRzRXhpc3RzKSB7XG4gICAgICBlcnJvcnMucHVzaChgR3JpZCByZWZlcmVuY2VzIGRhdGFTb3VyY2VJZCBcIiR7ZHNJZH1cIiwgYnV0IG5vIG1hdGNoaW5nIGRhdGEgc291cmNlIHdhcyBmb3VuZC5gKTtcbiAgICB9XG5cbiAgICBpZiAoIWRlZmluaXRpb24uZ3JpZC5jb2x1bW5zIHx8IGRlZmluaXRpb24uZ3JpZC5jb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2FybmluZ3MucHVzaCgnR3JpZCBkZWZpbml0aW9uIGhhcyBubyBjb2x1bW5zIGNvbmZpZ3VyZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2YWxpZDogZXJyb3JzLmxlbmd0aCA9PT0gMCxcbiAgICBlcnJvcnMsXG4gICAgd2FybmluZ3MsXG4gIH07XG59XG5cbi8qKiBOb3JtYWxpemUgbGVnYWN5IG9wdGlvbmFsIGNvbGxlY3Rpb25zIG9ubHkgYWZ0ZXIgdmVyaWZ5aW5nIHVua25vd24gaW5wdXQgaXMgc2FmZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSZXBvcnREZWZpbml0aW9uKHZhbHVlOiB1bmtub3duKTogUmVwb3J0RGVmaW5pdGlvbiB7XG4gIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlUmVwb3J0U2NoZW1hKHZhbHVlIGFzIFJlcG9ydERlZmluaXRpb24pO1xuICBpZiAoIXJlc3VsdC52YWxpZCkgdGhyb3cgbmV3IFJlcG9ydERlZmluaXRpb25FcnJvcihyZXN1bHQuZXJyb3JzLmpvaW4oJzsgJykpO1xuICBjb25zdCByZXBvcnQgPSB2YWx1ZSBhcyBSZXBvcnREZWZpbml0aW9uO1xuICByZXR1cm4geyAuLi5yZXBvcnQsIHNjaGVtYVZlcnNpb246IHJlcG9ydC5zY2hlbWFWZXJzaW9uID8/IDEsIGxheW91dDogcmVwb3J0LmxheW91dCA/PyB7IGNvbHVtbnM6IDEyIH0sXG4gICAgY29tcG9uZW50czogcmVwb3J0LmNvbXBvbmVudHMgPz8gW10sIHBhcmFtZXRlcnM6IHJlcG9ydC5wYXJhbWV0ZXJzID8/IFtdLCBkYXRhU291cmNlczogcmVwb3J0LmRhdGFTb3VyY2VzID8/IFtdIH07XG59XG5cbi8qKlxuICogU2NoZW1hVmFsaWRhdG9yU2VydmljZSBwcm92aWRlcyBzY2hlbWEgdmVyaWZpY2F0aW9uIG1ldGhvZHMuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgU2NoZW1hVmFsaWRhdG9yU2VydmljZSB7XG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSByZXBvcnQgZGVmaW5pdGlvbiBhbmQgcmV0dXJucyBlcnJvcnMvd2FybmluZ3Mgd2l0aG91dCB0aHJvd2luZy5cbiAgICovXG4gIHZhbGlkYXRlKGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb24pOiBTY2hlbWFWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICByZXR1cm4gdmFsaWRhdGVSZXBvcnRTY2hlbWEoZGVmaW5pdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQXNzZXJ0cyB0aGF0IGEgcmVwb3J0IGRlZmluaXRpb24gaXMgdmFsaWQuXG4gICAqIFRocm93cyBgUmVwb3J0RGVmaW5pdGlvbkVycm9yYCBpZiBhbnkgdmFsaWRhdGlvbiBlcnJvciBpcyBkZXRlY3RlZC5cbiAgICovXG4gIGFzc2VydFZhbGlkKGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnZhbGlkYXRlKGRlZmluaXRpb24pO1xuICAgIGlmICghcmVzdWx0LnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgUmVwb3J0RGVmaW5pdGlvbkVycm9yKHJlc3VsdC5lcnJvcnMuam9pbignOyAnKSwgZGVmaW5pdGlvbj8uaWQpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1,4 +1,5 @@
1
1
  import { ChangeDetectionStrategy, Component, DestroyRef, inject, signal } from '@angular/core';
2
+ import { reportRouteIdentifier } from '../resolvers/report-route-identifier';
2
3
  import { CommonModule } from '@angular/common';
3
4
  import { ActivatedRoute, Router } from '@angular/router';
4
5
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
@@ -15,14 +16,14 @@ export class RoutedReportDesignerComponent {
15
16
  loading = signal(true);
16
17
  savedFeedback = signal(false);
17
18
  ngOnInit() {
18
- const reportId = this.route.snapshot.paramMap.get('reportId');
19
+ const reportId = reportRouteIdentifier(this.route.snapshot);
19
20
  if (!reportId || reportId === 'new') {
20
21
  // Create blank report
21
22
  this.report.set(this.createBlankReport());
22
23
  this.loading.set(false);
23
24
  return;
24
25
  }
25
- this.store.loadReport(reportId)
26
+ this.store.loadReportBySlug(reportId)
26
27
  .pipe(takeUntilDestroyed(this.destroyRef))
27
28
  .subscribe({
28
29
  next: (rep) => {
@@ -36,20 +37,14 @@ export class RoutedReportDesignerComponent {
36
37
  });
37
38
  }
38
39
  onSaveReport(updatedReport) {
39
- this.store.saveReport(updatedReport)
40
- .pipe(takeUntilDestroyed(this.destroyRef))
41
- .subscribe({
42
- next: () => {
43
- this.savedFeedback.set(true);
44
- setTimeout(() => this.savedFeedback.set(false), 2500);
45
- },
46
- error: (err) => {
47
- console.error('[bways-report] Save report failed:', err);
48
- }
49
- });
40
+ // The designer emits only after storage confirms the reviewed definition.
41
+ this.store.cacheSavedReport(updatedReport);
42
+ this.report.set(updatedReport);
43
+ this.savedFeedback.set(true);
44
+ setTimeout(() => this.savedFeedback.set(false), 2500);
50
45
  }
51
46
  goBack() {
52
- const reportId = this.route.snapshot.paramMap.get('reportId');
47
+ const reportId = reportRouteIdentifier(this.route.snapshot);
53
48
  if (reportId && reportId !== 'new') {
54
49
  this.router.navigate(['../'], { relativeTo: this.route });
55
50
  }
@@ -116,7 +111,7 @@ export class RoutedReportDesignerComponent {
116
111
  />
117
112
  }
118
113
  </div>
119
- `, isInline: true, styles: [".rpt-routed-designer-host{display:flex;flex-direction:column;height:100%;min-height:calc(100vh - 80px);box-sizing:border-box}.rpt-routed-designer-bar{display:flex;align-items:center;justify-content:space-between;padding:6px 16px;background:var(--rpt-surface-bg, #ffffff);border-bottom:1px solid var(--rpt-border-color, #e2e8f0)}.rpt-saved-pill{display:inline-flex;align-items:center;gap:5px;font-size:.8125rem;color:#166534;background:#dcfce7;padding:3px 10px;border-radius:9999px;font-weight:500;animation:rptFadeInOut 2.5s ease-in-out forwards}@keyframes rptFadeInOut{0%{opacity:0;transform:translateY(-4px)}15%{opacity:1;transform:translateY(0)}85%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-4px)}}.rpt-routed-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:300px;color:var(--rpt-text-muted, #64748b)}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-border-color, #e2e8f0);border-top-color:var(--rpt-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite;margin-bottom:12px}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:6px 12px;font-size:.8125rem;font-weight:500;border-radius:var(--rpt-radius-md, 6px);cursor:pointer;border:1px solid transparent;background:transparent;color:var(--rpt-text-muted, #64748b);transition:all .15s ease}.rpt-btn:hover{color:var(--rpt-text-color, #1e293b);background:var(--rpt-bg-subtle, #f1f5f9)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DesignerComponent, selector: "rpt-designer", inputs: ["reportId", "initialReport"], outputs: ["save", "definitionChange"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
114
+ `, isInline: true, styles: [":host{display:flex;flex:1;flex-direction:column;height:100%;min-height:0;min-width:0}.rpt-routed-designer-host{display:flex;flex-direction:column;height:100%;flex:1;min-height:0;box-sizing:border-box}.rpt-routed-designer-bar{flex-shrink:0;display:flex;align-items:center;justify-content:space-between;padding:6px 16px;background:var(--rpt-surface-bg, #ffffff);border-bottom:1px solid var(--rpt-border-color, #e2e8f0)}.rpt-saved-pill{display:inline-flex;align-items:center;gap:5px;font-size:.8125rem;color:#166534;background:#dcfce7;padding:3px 10px;border-radius:9999px;font-weight:500;animation:rptFadeInOut 2.5s ease-in-out forwards}@keyframes rptFadeInOut{0%{opacity:0;transform:translateY(-4px)}15%{opacity:1;transform:translateY(0)}85%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-4px)}}.rpt-routed-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:300px;color:var(--rpt-text-muted, #64748b)}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-border-color, #e2e8f0);border-top-color:var(--rpt-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite;margin-bottom:12px}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:6px 12px;font-size:.8125rem;font-weight:500;border-radius:var(--rpt-radius-md, 6px);cursor:pointer;border:1px solid transparent;background:transparent;color:var(--rpt-text-muted, #64748b);transition:all .15s ease}.rpt-btn:hover{color:var(--rpt-text-color, #1e293b);background:var(--rpt-bg-subtle, #f1f5f9)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DesignerComponent, selector: "rpt-designer", inputs: ["config", "apiUrl", "reportId", "initialReport"], outputs: ["save", "definitionChange"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
120
115
  }
121
116
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RoutedReportDesignerComponent, decorators: [{
122
117
  type: Component,
@@ -151,6 +146,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
151
146
  />
152
147
  }
153
148
  </div>
154
- `, styles: [".rpt-routed-designer-host{display:flex;flex-direction:column;height:100%;min-height:calc(100vh - 80px);box-sizing:border-box}.rpt-routed-designer-bar{display:flex;align-items:center;justify-content:space-between;padding:6px 16px;background:var(--rpt-surface-bg, #ffffff);border-bottom:1px solid var(--rpt-border-color, #e2e8f0)}.rpt-saved-pill{display:inline-flex;align-items:center;gap:5px;font-size:.8125rem;color:#166534;background:#dcfce7;padding:3px 10px;border-radius:9999px;font-weight:500;animation:rptFadeInOut 2.5s ease-in-out forwards}@keyframes rptFadeInOut{0%{opacity:0;transform:translateY(-4px)}15%{opacity:1;transform:translateY(0)}85%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-4px)}}.rpt-routed-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:300px;color:var(--rpt-text-muted, #64748b)}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-border-color, #e2e8f0);border-top-color:var(--rpt-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite;margin-bottom:12px}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:6px 12px;font-size:.8125rem;font-weight:500;border-radius:var(--rpt-radius-md, 6px);cursor:pointer;border:1px solid transparent;background:transparent;color:var(--rpt-text-muted, #64748b);transition:all .15s ease}.rpt-btn:hover{color:var(--rpt-text-color, #1e293b);background:var(--rpt-bg-subtle, #f1f5f9)}\n"] }]
149
+ `, styles: [":host{display:flex;flex:1;flex-direction:column;height:100%;min-height:0;min-width:0}.rpt-routed-designer-host{display:flex;flex-direction:column;height:100%;flex:1;min-height:0;box-sizing:border-box}.rpt-routed-designer-bar{flex-shrink:0;display:flex;align-items:center;justify-content:space-between;padding:6px 16px;background:var(--rpt-surface-bg, #ffffff);border-bottom:1px solid var(--rpt-border-color, #e2e8f0)}.rpt-saved-pill{display:inline-flex;align-items:center;gap:5px;font-size:.8125rem;color:#166534;background:#dcfce7;padding:3px 10px;border-radius:9999px;font-weight:500;animation:rptFadeInOut 2.5s ease-in-out forwards}@keyframes rptFadeInOut{0%{opacity:0;transform:translateY(-4px)}15%{opacity:1;transform:translateY(0)}85%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-4px)}}.rpt-routed-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:300px;color:var(--rpt-text-muted, #64748b)}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-border-color, #e2e8f0);border-top-color:var(--rpt-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite;margin-bottom:12px}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:6px 12px;font-size:.8125rem;font-weight:500;border-radius:var(--rpt-radius-md, 6px);cursor:pointer;border:1px solid transparent;background:transparent;color:var(--rpt-text-muted, #64748b);transition:all .15s ease}.rpt-btn:hover{color:var(--rpt-text-color, #1e293b);background:var(--rpt-bg-subtle, #f1f5f9)}\n"] }]
155
150
  }] });
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVkLXJlcG9ydC1kZXNpZ25lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9yb3V0aW5nL2NvbXBvbmVudHMvcm91dGVkLXJlcG9ydC1kZXNpZ25lci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUVWLE1BQU0sRUFDTixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDckYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0RBQXdELENBQUM7O0FBMkgxRixNQUFNLE9BQU8sNkJBQTZCO0lBQ3ZCLEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDL0IsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QixLQUFLLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbkMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV4QyxNQUFNLEdBQUcsTUFBTSxDQUEwQixJQUFJLENBQUMsQ0FBQztJQUMvQyxPQUFPLEdBQUcsTUFBTSxDQUFVLElBQUksQ0FBQyxDQUFDO0lBQ2hDLGFBQWEsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7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LEVBQUUsRUFBRTtZQUNkLFdBQVcsRUFBRTtnQkFDWDtvQkFDRSxFQUFFLEVBQUUsWUFBWTtvQkFDaEIsSUFBSSxFQUFFLHFCQUFxQjtvQkFDM0IsUUFBUSxFQUFFLG1CQUFtQjtpQkFDOUI7YUFDRjtZQUNELElBQUksRUFBRTtnQkFDSixZQUFZLEVBQUUsWUFBWTtnQkFDMUIsT0FBTyxFQUFFLEVBQUU7YUFDWjtZQUNELE1BQU0sRUFBRTtnQkFDTixPQUFPLEVBQUUsRUFBRTtnQkFDWCxHQUFHLEVBQUUsRUFBRTthQUNSO1NBQ0YsQ0FBQztJQUNKLENBQUM7d0dBbkZVLDZCQUE2Qjs0RkFBN0IsNkJBQTZCLCtFQW5IOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQlQsOGpEQWpDUyxZQUFZLCtCQUFFLGlCQUFpQix1SUFBRSxnQkFBZ0I7OzRGQXFIaEQsNkJBQTZCO2tCQXhIekMsU0FBUzsrQkFDRSxxQkFBcUIsY0FDbkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixDQUFDLG1CQUMzQyx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgT25Jbml0LFxuICBpbmplY3QsXG4gIHNpZ25hbFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IFJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscyc7XG5pbXBvcnQgeyBSZXBvcnRTdG9yZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9wZXJzaXN0ZW5jZS9zZXJ2aWNlcy9yZXBvcnQtc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBEZXNpZ25lckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Rlc2lnbmVyL2Rlc2lnbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBScHRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vcHJpbWl0aXZlcy9jb21wb25lbnRzL2ljb24vcnB0LWljb24uY29tcG9uZW50JztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcm91dGVkLWRlc2lnbmVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRGVzaWduZXJDb21wb25lbnQsIFJwdEljb25Db21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicnB0LXJvdXRlZC1kZXNpZ25lci1ob3N0XCI+XG4gICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXJvdXRlZC1sb2FkaW5nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zcGlubmVyXCI+PC9kaXY+XG4gICAgICAgICAgPHA+TG9hZGluZyByZXBvcnQgZGVzaWduZXIuLi48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcm91dGVkLWRlc2lnbmVyLWJhclwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJycHQtYnRuIHJwdC1idG4tZ2hvc3QgcnB0LWJ0bi1zbVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZ29CYWNrKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJSZXR1cm4gdG8gcmVwb3J0IHZpZXdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiYXJyb3ctbGVmdFwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgIDxzcGFuPkV4aXQgRGVzaWduZXI8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgQGlmIChzYXZlZEZlZWRiYWNrKCkpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXNhdmVkLXBpbGxcIj5cbiAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGVja1wiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+U2F2ZWQgc3VjY2Vzc2Z1bGx5PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxycHQtZGVzaWduZXJcbiAgICAgICAgICBbaW5pdGlhbFJlcG9ydF09XCJyZXBvcnQoKVwiXG4gICAgICAgICAgKHNhdmUpPVwib25TYXZlUmVwb3J0KCRldmVudClcIlxuICAgICAgICAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLnJwdC1yb3V0ZWQtZGVzaWduZXItaG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSA4MHB4KTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1yb3V0ZWQtZGVzaWduZXItYmFyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogNnB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtc3VyZmFjZS1iZywgI2ZmZmZmZik7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcnB0LWJvcmRlci1jb2xvciwgI2UyZThmMCk7XG4gICAgfVxuXG4gICAgLnJwdC1zYXZlZC1waWxsIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgICBjb2xvcjogIzE2NjUzNDtcbiAgICAgIGJhY2tncm91bmQ6ICNkY2ZjZTc7XG4gICAgICBwYWRkaW5nOiAzcHggMTBweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBhbmltYXRpb246IHJwdEZhZGVJbk91dCAyLjVzIGVhc2UtaW4tb3V0IGZvcndhcmRzO1xuICAgIH1cblxuICAgIEBrZXlmcmFtZXMgcnB0RmFkZUluT3V0IHtcbiAgICAgIDAlIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00cHgpOyB9XG4gICAgICAxNSUgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cbiAgICAgIDg1JSB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxuICAgICAgMTAwJSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNHB4KTsgfVxuICAgIH1cblxuICAgIC5ycHQtcm91dGVkLWxvYWRpbmcge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBoZWlnaHQ6IDMwMHB4O1xuICAgICAgY29sb3I6IHZhcigtLXJwdC10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICB9XG5cbiAgICAucnB0LXNwaW5uZXIge1xuICAgICAgd2lkdGg6IDM2cHg7XG4gICAgICBoZWlnaHQ6IDM2cHg7XG4gICAgICBib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1ycHQtYm9yZGVyLWNvbG9yLCAjZTJlOGYwKTtcbiAgICAgIGJvcmRlci10b3AtY29sb3I6IHZhcigtLXJwdC1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGFuaW1hdGlvbjogcnB0LXNwaW4gMC44cyBsaW5lYXIgaW5maW5pdGU7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICAgIH1cblxuICAgIEBrZXlmcmFtZXMgcnB0LXNwaW4ge1xuICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XG4gICAgfVxuXG4gICAgLnJwdC1idG4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIHBhZGRpbmc6IDZweCAxMnB4O1xuICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LXJhZGl1cy1tZCwgNnB4KTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LXRleHQtbXV0ZWQsICM2NDc0OGIpO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1idG46aG92ZXIge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC10ZXh0LWNvbG9yLCAjMWUyOTNiKTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1iZy1zdWJ0bGUsICNmMWY1ZjkpO1xuICAgIH1cbiAgYF1cbn0pXG5leHBvcnQgY2xhc3MgUm91dGVkUmVwb3J0RGVzaWduZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZSA9IGluamVjdChSZXBvcnRTdG9yZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcmVhZG9ubHkgcmVwb3J0ID0gc2lnbmFsPFJlcG9ydERlZmluaXRpb24gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgc2F2ZWRGZWVkYmFjayA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgncmVwb3J0SWQnKTtcblxuICAgIGlmICghcmVwb3J0SWQgfHwgcmVwb3J0SWQgPT09ICduZXcnKSB7XG4gICAgICAvLyBDcmVhdGUgYmxhbmsgcmVwb3J0XG4gICAgICB0aGlzLnJlcG9ydC5zZXQodGhpcy5jcmVhdGVCbGFua1JlcG9ydCgpKTtcbiAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmUubG9hZFJlcG9ydChyZXBvcnRJZClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXApID0+IHtcbiAgICAgICAgICB0aGlzLnJlcG9ydC5zZXQocmVwID8/IHRoaXMuY3JlYXRlQmxhbmtSZXBvcnQoKSk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXBvcnQuc2V0KHRoaXMuY3JlYXRlQmxhbmtSZXBvcnQoKSk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgb25TYXZlUmVwb3J0KHVwZGF0ZWRSZXBvcnQ6IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNhdmVSZXBvcnQodXBkYXRlZFJlcG9ydClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNhdmVkRmVlZGJhY2suc2V0KHRydWUpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zYXZlZEZlZWRiYWNrLnNldChmYWxzZSksIDI1MDApO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tid2F5cy1yZXBvcnRdIFNhdmUgcmVwb3J0IGZhaWxlZDonLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGdvQmFjaygpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdyZXBvcnRJZCcpO1xuICAgIGlmIChyZXBvcnRJZCAmJiByZXBvcnRJZCAhPT0gJ25ldycpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLi4vJ10sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLi8nXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQmxhbmtSZXBvcnQoKTogUmVwb3J0RGVmaW5pdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgcmVwb3J0LSR7RGF0ZS5ub3coKX1gLFxuICAgICAgbmFtZTogJ1VudGl0bGVkIFJlcG9ydCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ05ld2x5IGNyZWF0ZWQgcmVwb3J0JyxcbiAgICAgIGNhdGVnb3J5OiAnR2VuZXJhbCcsXG4gICAgICBzY2hlbWFWZXJzaW9uOiAxLFxuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIGNvbXBvbmVudHM6IFtdLFxuICAgICAgcGFyYW1ldGVyczogW10sXG4gICAgICBkYXRhU291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdkcy1kZWZhdWx0JyxcbiAgICAgICAgICBuYW1lOiAnRGVmYXVsdCBEYXRhIFNvdXJjZScsXG4gICAgICAgICAgZW5kcG9pbnQ6ICcvYXBpL3JlcG9ydHMvZGF0YSdcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIGdyaWQ6IHtcbiAgICAgICAgZGF0YVNvdXJjZUlkOiAnZHMtZGVmYXVsdCcsXG4gICAgICAgIGNvbHVtbnM6IFtdXG4gICAgICB9LFxuICAgICAgbGF5b3V0OiB7XG4gICAgICAgIGNvbHVtbnM6IDEyLFxuICAgICAgICBnYXA6IDE2XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5cbiJdfQ==
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVkLXJlcG9ydC1kZXNpZ25lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9yb3V0aW5nL2NvbXBvbmVudHMvcm91dGVkLXJlcG9ydC1kZXNpZ25lci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUVWLE1BQU0sRUFDTixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDckYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0RBQXdELENBQUM7O0FBcUkxRixNQUFNLE9BQU8sNkJBQTZCO0lBQ3ZCLEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDL0IsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QixLQUFLLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbkMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV4QyxNQUFNLEdBQUcsTUFBTSxDQUEwQixJQUFJLENBQUMsQ0FBQztJQUMvQyxPQUFPLEdBQUcsTUFBTSxDQUFVLElBQUksQ0FBQyxD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WSxFQUFFLFlBQVk7Z0JBQzFCLE9BQU8sRUFBRSxFQUFFO2FBQ1o7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsR0FBRyxFQUFFLEVBQUU7YUFDUjtTQUNGLENBQUM7SUFDSixDQUFDO3dHQTdFVSw2QkFBNkI7NEZBQTdCLDZCQUE2QiwrRUE3SDlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JULHVwREFqQ1MsWUFBWSwrQkFBRSxpQkFBaUIsMkpBQUUsZ0JBQWdCOzs0RkErSGhELDZCQUE2QjtrQkFsSXpDLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsQ0FBQyxtQkFDM0MsdUJBQXVCLENBQUMsTUFBTSxZQUNyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIE9uSW5pdCxcbiAgaW5qZWN0LFxuICBzaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyByZXBvcnRSb3V0ZUlkZW50aWZpZXIgfSBmcm9tICcuLi9yZXNvbHZlcnMvcmVwb3J0LXJvdXRlLWlkZW50aWZpZXInO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgUmVwb3J0RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzJztcbmltcG9ydCB7IFJlcG9ydFN0b3JlU2VydmljZSB9IGZyb20gJy4uLy4uL3BlcnNpc3RlbmNlL3NlcnZpY2VzL3JlcG9ydC1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IERlc2lnbmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZGVzaWduZXIvZGVzaWduZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1yb3V0ZWQtZGVzaWduZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBEZXNpZ25lckNvbXBvbmVudCwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJycHQtcm91dGVkLWRlc2lnbmVyLWhvc3RcIj5cbiAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcm91dGVkLWxvYWRpbmdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICA8cD5Mb2FkaW5nIHJlcG9ydCBkZXNpZ25lci4uLjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1yb3V0ZWQtZGVzaWduZXItYmFyXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInJwdC1idG4gcnB0LWJ0bi1naG9zdCBycHQtYnRuLXNtXCJcbiAgICAgICAgICAgIChjbGljayk9XCJnb0JhY2soKVwiXG4gICAgICAgICAgICB0aXRsZT1cIlJldHVybiB0byByZXBvcnQgdmlld1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJhcnJvdy1sZWZ0XCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgPHNwYW4+RXhpdCBEZXNpZ25lcjwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICBAaWYgKHNhdmVkRmVlZGJhY2soKSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtc2F2ZWQtcGlsbFwiPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICA8c3Bhbj5TYXZlZCBzdWNjZXNzZnVsbHk8L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHJwdC1kZXNpZ25lclxuICAgICAgICAgIFtpbml0aWFsUmVwb3J0XT1cInJlcG9ydCgpXCJcbiAgICAgICAgICAoc2F2ZSk9XCJvblNhdmVSZXBvcnQoJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleDogMTtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgIH1cbiAgICAucnB0LXJvdXRlZC1kZXNpZ25lci1ob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgZmxleDogMTtcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtcm91dGVkLWRlc2lnbmVyLWJhciB7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogNnB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtc3VyZmFjZS1iZywgI2ZmZmZmZik7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcnB0LWJvcmRlci1jb2xvciwgI2UyZThmMCk7XG4gICAgfVxuXG4gICAgLnJwdC1zYXZlZC1waWxsIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgICBjb2xvcjogIzE2NjUzNDtcbiAgICAgIGJhY2tncm91bmQ6ICNkY2ZjZTc7XG4gICAgICBwYWRkaW5nOiAzcHggMTBweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBhbmltYXRpb246IHJwdEZhZGVJbk91dCAyLjVzIGVhc2UtaW4tb3V0IGZvcndhcmRzO1xuICAgIH1cblxuICAgIEBrZXlmcmFtZXMgcnB0RmFkZUluT3V0IHtcbiAgICAgIDAlIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00cHgpOyB9XG4gICAgICAxNSUgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cbiAgICAgIDg1JSB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxuICAgICAgMTAwJSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNHB4KTsgfVxuICAgIH1cblxuICAgIC5ycHQtcm91dGVkLWxvYWRpbmcge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBoZWlnaHQ6IDMwMHB4O1xuICAgICAgY29sb3I6IHZhcigtLXJwdC10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICB9XG5cbiAgICAucnB0LXNwaW5uZXIge1xuICAgICAgd2lkdGg6IDM2cHg7XG4gICAgICBoZWlnaHQ6IDM2cHg7XG4gICAgICBib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1ycHQtYm9yZGVyLWNvbG9yLCAjZTJlOGYwKTtcbiAgICAgIGJvcmRlci10b3AtY29sb3I6IHZhcigtLXJwdC1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGFuaW1hdGlvbjogcnB0LXNwaW4gMC44cyBsaW5lYXIgaW5maW5pdGU7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICAgIH1cblxuICAgIEBrZXlmcmFtZXMgcnB0LXNwaW4ge1xuICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XG4gICAgfVxuXG4gICAgLnJwdC1idG4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIHBhZGRpbmc6IDZweCAxMnB4O1xuICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LXJhZGl1cy1tZCwgNnB4KTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LXRleHQtbXV0ZWQsICM2NDc0OGIpO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1idG46aG92ZXIge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC10ZXh0LWNvbG9yLCAjMWUyOTNiKTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1iZy1zdWJ0bGUsICNmMWY1ZjkpO1xuICAgIH1cbiAgYF1cbn0pXG5leHBvcnQgY2xhc3MgUm91dGVkUmVwb3J0RGVzaWduZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZSA9IGluamVjdChSZXBvcnRTdG9yZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcmVhZG9ubHkgcmVwb3J0ID0gc2lnbmFsPFJlcG9ydERlZmluaXRpb24gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgc2F2ZWRGZWVkYmFjayA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0SWQgPSByZXBvcnRSb3V0ZUlkZW50aWZpZXIodGhpcy5yb3V0ZS5zbmFwc2hvdCk7XG5cbiAgICBpZiAoIXJlcG9ydElkIHx8IHJlcG9ydElkID09PSAnbmV3Jykge1xuICAgICAgLy8gQ3JlYXRlIGJsYW5rIHJlcG9ydFxuICAgICAgdGhpcy5yZXBvcnQuc2V0KHRoaXMuY3JlYXRlQmxhbmtSZXBvcnQoKSk7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3JlLmxvYWRSZXBvcnRCeVNsdWcocmVwb3J0SWQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVwKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXBvcnQuc2V0KHJlcCA/PyB0aGlzLmNyZWF0ZUJsYW5rUmVwb3J0KCkpO1xuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVwb3J0LnNldCh0aGlzLmNyZWF0ZUJsYW5rUmVwb3J0KCkpO1xuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIG9uU2F2ZVJlcG9ydCh1cGRhdGVkUmVwb3J0OiBSZXBvcnREZWZpbml0aW9uKTogdm9pZCB7XG4gICAgLy8gVGhlIGRlc2lnbmVyIGVtaXRzIG9ubHkgYWZ0ZXIgc3RvcmFnZSBjb25maXJtcyB0aGUgcmV2aWV3ZWQgZGVmaW5pdGlvbi5cbiAgICB0aGlzLnN0b3JlLmNhY2hlU2F2ZWRSZXBvcnQodXBkYXRlZFJlcG9ydCk7XG4gICAgdGhpcy5yZXBvcnQuc2V0KHVwZGF0ZWRSZXBvcnQpO1xuICAgIHRoaXMuc2F2ZWRGZWVkYmFjay5zZXQodHJ1ZSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNhdmVkRmVlZGJhY2suc2V0KGZhbHNlKSwgMjUwMCk7XG4gIH1cblxuICBnb0JhY2soKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0SWQgPSByZXBvcnRSb3V0ZUlkZW50aWZpZXIodGhpcy5yb3V0ZS5zbmFwc2hvdCk7XG4gICAgaWYgKHJlcG9ydElkICYmIHJlcG9ydElkICE9PSAnbmV3Jykge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLi8nXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4uLyddLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCbGFua1JlcG9ydCgpOiBSZXBvcnREZWZpbml0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGByZXBvcnQtJHtEYXRlLm5vdygpfWAsXG4gICAgICBuYW1lOiAnVW50aXRsZWQgUmVwb3J0JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTmV3bHkgY3JlYXRlZCByZXBvcnQnLFxuICAgICAgY2F0ZWdvcnk6ICdHZW5lcmFsJyxcbiAgICAgIHNjaGVtYVZlcnNpb246IDEsXG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgY29tcG9uZW50czogW10sXG4gICAgICBwYXJhbWV0ZXJzOiBbXSxcbiAgICAgIGRhdGFTb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ2RzLWRlZmF1bHQnLFxuICAgICAgICAgIG5hbWU6ICdEZWZhdWx0IERhdGEgU291cmNlJyxcbiAgICAgICAgICBlbmRwb2ludDogJy9hcGkvcmVwb3J0cy9kYXRhJ1xuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgZ3JpZDoge1xuICAgICAgICBkYXRhU291cmNlSWQ6ICdkcy1kZWZhdWx0JyxcbiAgICAgICAgY29sdW1uczogW11cbiAgICAgIH0sXG4gICAgICBsYXlvdXQ6IHtcbiAgICAgICAgY29sdW1uczogMTIsXG4gICAgICAgIGdhcDogMTZcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cblxuIl19