bways-report 0.1.9 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +506 -313
- package/esm2022/lib/core/config/bways-report-config.mjs +29 -32
- package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
- package/esm2022/lib/core/models/report-grid.model.mjs +1 -1
- package/esm2022/lib/core/services/report-api-execution.service.mjs +33 -11
- package/esm2022/lib/core/services/report-overlay.service.mjs +79 -0
- package/esm2022/lib/core/services/report-session-context.service.mjs +72 -3
- package/esm2022/lib/core/tokens/designer-config.token.mjs +4 -0
- package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
- package/esm2022/lib/core/utils/report-endpoint.util.mjs +22 -0
- package/esm2022/lib/core/utils/report-parameter.util.mjs +68 -15
- package/esm2022/lib/core/utils/report-request-scope.mjs +48 -0
- package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +16 -1
- package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +14 -2
- package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +5 -2
- package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +30 -14
- package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +32 -28
- package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +1 -1
- package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +13 -37
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +13 -50
- package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +43 -194
- package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +17 -65
- package/esm2022/lib/data-access/adapters/index.mjs +1 -1
- package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +13 -4
- package/esm2022/lib/data-access/adapters/report-id-availability.mjs +20 -0
- package/esm2022/lib/data-access/adapters/session-headers.mjs +11 -0
- package/esm2022/lib/data-access/contracts/index.mjs +1 -1
- package/esm2022/lib/data-access/contracts/report-persistence.contract.mjs +13 -1
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +53 -41
- package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +551 -123
- package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +39 -6
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +12 -6
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +11 -10
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +13 -6
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +54 -32
- package/esm2022/lib/features/designer/designer.component.mjs +107 -69
- package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +10 -4
- package/esm2022/lib/features/designer/services/designer-config.service.mjs +56 -0
- package/esm2022/lib/features/designer/services/designer-endpoints.service.mjs +155 -0
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +3 -2
- package/esm2022/lib/features/embed/bways-report-builder.component.mjs +3 -3
- package/esm2022/lib/features/export/services/report-export.service.mjs +11 -6
- package/esm2022/lib/features/persistence/services/report-store.service.mjs +78 -23
- package/esm2022/lib/features/persistence/services/schema-validator.service.mjs +59 -3
- package/esm2022/lib/features/routing/components/routed-report-designer.component.mjs +12 -17
- package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +5 -3
- package/esm2022/lib/features/routing/report-routes.mjs +6 -6
- package/esm2022/lib/features/routing/resolvers/report-route-identifier.mjs +5 -0
- package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +3 -2
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +2 -2
- package/esm2022/lib/features/runtime/report-execution.service.mjs +52 -8
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +18 -21
- package/esm2022/lib/features/runtime/report-runtime.component.mjs +94 -71
- package/esm2022/lib/features/runtime/rpt-report.component.mjs +49 -41
- package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +7 -2
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +21 -10
- package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +13 -1
- package/esm2022/lib/primitives/components/radio/rpt-radio.component.mjs +15 -5
- package/esm2022/lib/primitives/components/searchable-select/rpt-searchable-select.component.mjs +6 -6
- package/esm2022/lib/provide-reporting.mjs +9 -29
- package/fesm2022/bways-report.mjs +2072 -1088
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/config/bways-report-config.d.ts +14 -5
- package/lib/core/models/report-datasource.model.d.ts +5 -0
- package/lib/core/models/report-grid.model.d.ts +1 -1
- package/lib/core/services/report-overlay.service.d.ts +14 -0
- package/lib/core/services/report-session-context.service.d.ts +9 -0
- package/lib/core/tokens/designer-config.token.d.ts +4 -0
- package/lib/core/tokens/reporting-config.token.d.ts +4 -0
- package/lib/core/utils/report-endpoint.util.d.ts +12 -0
- package/lib/core/utils/report-parameter.util.d.ts +13 -1
- package/lib/core/utils/report-request-scope.d.ts +14 -0
- package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +6 -2
- package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +4 -2
- package/lib/data-access/adapters/endpoint-tokens.d.ts +4 -0
- package/lib/data-access/adapters/http-datasource.adapter.d.ts +1 -3
- package/lib/data-access/adapters/http-lookup.adapter.d.ts +1 -3
- package/lib/data-access/adapters/http-persistence.adapter.d.ts +11 -16
- package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +3 -5
- package/lib/data-access/adapters/index.d.ts +1 -1
- package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +2 -2
- package/lib/data-access/adapters/report-id-availability.d.ts +6 -0
- package/lib/data-access/adapters/session-headers.d.ts +3 -0
- package/lib/data-access/contracts/index.d.ts +1 -0
- package/lib/data-access/contracts/report-persistence.contract.d.ts +16 -1
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +2 -0
- package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +37 -5
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +5 -0
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +4 -3
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +1 -0
- package/lib/features/designer/components/property-editor/property-editor.component.d.ts +1 -0
- package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +7 -1
- package/lib/features/designer/designer.component.d.ts +16 -2
- package/lib/features/designer/rpt-report-designer.component.d.ts +5 -1
- package/lib/features/designer/services/designer-config.service.d.ts +13 -0
- package/lib/features/designer/services/designer-endpoints.service.d.ts +25 -0
- package/lib/features/persistence/services/report-store.service.d.ts +15 -1
- package/lib/features/persistence/services/schema-validator.service.d.ts +2 -0
- package/lib/features/routing/resolvers/report-route-identifier.d.ts +2 -0
- package/lib/features/runtime/report-execution.service.d.ts +3 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +3 -2
- package/lib/features/runtime/report-runtime.component.d.ts +1 -0
- package/lib/features/runtime/rpt-report.component.d.ts +5 -0
- package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +3 -1
- package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +1 -2
- package/lib/primitives/components/searchable-select/rpt-searchable-select.component.d.ts +0 -1
- package/package.json +9 -5
- package/styles/theme.css +184 -0
- package/third-party-notices/angular-cdk-LICENSE.txt +21 -0
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CdkScrollable } from '@angular/cdk/scrolling';
|
|
2
|
+
import { A11yModule } from '@angular/cdk/a11y';
|
|
3
|
+
import { generateId } from '../../../../core/utilities/id-generator';
|
|
4
|
+
import { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, signal, } from '@angular/core';
|
|
2
5
|
import { CommonModule } from '@angular/common';
|
|
3
6
|
import { FormsModule } from '@angular/forms';
|
|
4
|
-
import {
|
|
7
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
|
+
import { defer, finalize, of, switchMap, throwError, take } from 'rxjs';
|
|
5
9
|
import { DialogRef, DIALOG_DATA } from '@angular/cdk/dialog';
|
|
6
10
|
import { ReportStoreService } from '../../../persistence/services/report-store.service';
|
|
7
11
|
import { ReportRuntimeComponent } from '../../../runtime/report-runtime.component';
|
|
@@ -9,6 +13,7 @@ import { RptIconComponent } from '../../../../primitives/components/icon/rpt-ico
|
|
|
9
13
|
import { REPORTING_CONFIG } from '../../../../core/tokens/reporting-config.token';
|
|
10
14
|
import * as i0 from "@angular/core";
|
|
11
15
|
import * as i1 from "@angular/forms";
|
|
16
|
+
import * as i2 from "@angular/cdk/a11y";
|
|
12
17
|
function toSlug(val) {
|
|
13
18
|
return val
|
|
14
19
|
.toLowerCase()
|
|
@@ -21,104 +26,302 @@ export class ReportSavedDialogComponent {
|
|
|
21
26
|
dialogRef = inject((DialogRef));
|
|
22
27
|
data = inject(DIALOG_DATA);
|
|
23
28
|
store = inject(ReportStoreService);
|
|
29
|
+
destroyRef = inject(DestroyRef);
|
|
24
30
|
reportingConfig = inject(REPORTING_CONFIG, { optional: true });
|
|
25
|
-
|
|
31
|
+
idCheck;
|
|
32
|
+
customSlug = !!this.data.report.slug;
|
|
26
33
|
report = this.data.report;
|
|
27
34
|
baseRoute = signal(this.data.routeBase || this.reportingConfig?.routeBase || 'reports');
|
|
28
|
-
|
|
35
|
+
reportId = signal(this.report.id);
|
|
36
|
+
isCheckingId = signal(false);
|
|
37
|
+
isPreparingSave = signal(false);
|
|
38
|
+
updateConfirmation = signal(null);
|
|
39
|
+
idAttempted = signal(false);
|
|
40
|
+
idStatus = signal('unchecked');
|
|
41
|
+
idMessage = signal('');
|
|
42
|
+
idChanged = computed(() => this.reportId().trim() !== this.report.id);
|
|
43
|
+
idError = computed(() => {
|
|
44
|
+
if (!this.attempted() && !this.idAttempted())
|
|
45
|
+
return null;
|
|
46
|
+
const id = this.reportId().trim();
|
|
47
|
+
if (!id)
|
|
48
|
+
return 'Enter a report ID.';
|
|
49
|
+
if (id.length > 100)
|
|
50
|
+
return 'Use a report ID of at most 100 characters.';
|
|
51
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(id))
|
|
52
|
+
return 'Use letters, numbers, underscores or hyphens, starting with a letter or number.';
|
|
53
|
+
if (id.toLowerCase() === 'new')
|
|
54
|
+
return 'Choose another ID; "new" is reserved for the report builder.';
|
|
55
|
+
return null;
|
|
56
|
+
});
|
|
57
|
+
name = signal(this.report.name || '');
|
|
58
|
+
description = signal(this.report.description || '');
|
|
59
|
+
category = signal(this.report.category || '');
|
|
29
60
|
slug = signal(this.report.slug || toSlug(this.report.name || 'report'));
|
|
30
|
-
menuGroup = signal(this.report.menuGroup || this.report.category || '
|
|
61
|
+
menuGroup = signal(this.report.menuGroup || this.report.category || '');
|
|
31
62
|
isPublished = signal(this.report.isPublished ?? true);
|
|
32
63
|
copied = signal(false);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
64
|
+
isSaving = signal(false);
|
|
65
|
+
attempted = signal(false);
|
|
66
|
+
saveError = signal(null);
|
|
67
|
+
nameError = computed(() => this.attempted() && !this.name().trim() ? 'Enter a report name.' : null);
|
|
68
|
+
slugError = computed(() => {
|
|
69
|
+
if (!this.attempted())
|
|
70
|
+
return null;
|
|
71
|
+
if (!this.slug().trim())
|
|
72
|
+
return 'Enter a URL slug.';
|
|
73
|
+
if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(this.slug().trim()))
|
|
74
|
+
return 'Use lowercase letters, numbers, and single hyphens.';
|
|
75
|
+
if (this.slug().trim() === 'new')
|
|
76
|
+
return 'Choose a different slug; "new" is reserved for the report builder.';
|
|
77
|
+
return null;
|
|
38
78
|
});
|
|
79
|
+
fullRoute = computed(() => '/' + this.baseRoute().replace(/^\/+|\/+$/g, '') + '/' + this.slug().trim());
|
|
39
80
|
currentPreviewDef = computed(() => ({
|
|
40
|
-
...this.report,
|
|
41
|
-
|
|
42
|
-
slug: this.slug(),
|
|
43
|
-
menuGroup: this.menuGroup(),
|
|
44
|
-
isPublished: this.isPublished(),
|
|
81
|
+
...this.report, id: this.reportId().trim(), name: this.name(), description: this.description(), category: this.category(),
|
|
82
|
+
slug: this.slug(), menuGroup: this.menuGroup(), isPublished: this.isPublished(),
|
|
45
83
|
}));
|
|
46
|
-
|
|
47
|
-
this.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
84
|
+
onIdChange(value) {
|
|
85
|
+
if (this.isSaving())
|
|
86
|
+
return;
|
|
87
|
+
this.idCheck?.unsubscribe();
|
|
88
|
+
this.isPreparingSave.set(false);
|
|
89
|
+
this.updateConfirmation.set(null);
|
|
90
|
+
this.isCheckingId.set(false);
|
|
91
|
+
this.reportId.set(value);
|
|
92
|
+
this.idStatus.set('unchecked');
|
|
93
|
+
this.idMessage.set('');
|
|
94
|
+
this.saveError.set(null);
|
|
95
|
+
}
|
|
96
|
+
randomizeId() {
|
|
97
|
+
const random = typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'
|
|
98
|
+
? 'rpt-' + crypto.randomUUID() : generateId('rpt');
|
|
99
|
+
this.onIdChange(random);
|
|
100
|
+
}
|
|
101
|
+
verifyId() {
|
|
102
|
+
if (this.isSaving() || this.isCheckingId() || this.updateConfirmation())
|
|
103
|
+
return;
|
|
104
|
+
this.idAttempted.set(true);
|
|
105
|
+
if (this.idError())
|
|
106
|
+
return;
|
|
107
|
+
const id = this.reportId().trim();
|
|
108
|
+
this.isCheckingId.set(true);
|
|
109
|
+
this.idStatus.set('checking');
|
|
110
|
+
this.idMessage.set('Checking report ID...');
|
|
111
|
+
this.idCheck = defer(() => this.store.checkReportId(id)).pipe(take(1), takeUntilDestroyed(this.destroyRef), finalize(() => this.isCheckingId.set(false))).subscribe({
|
|
112
|
+
next: exists => {
|
|
113
|
+
if (this.reportId().trim() !== id)
|
|
114
|
+
return;
|
|
115
|
+
const current = exists && !this.idChanged();
|
|
116
|
+
this.idStatus.set(exists ? (current ? 'current' : 'duplicate') : 'available');
|
|
117
|
+
this.idMessage.set(exists ? (current ? 'This ID is already saved. Saving will ask before updating this report.'
|
|
118
|
+
: 'This report ID already exists. Saving will ask whether to update it.') : 'This report ID is available.');
|
|
119
|
+
this.isCheckingId.set(false);
|
|
120
|
+
},
|
|
121
|
+
error: error => {
|
|
122
|
+
if (this.reportId().trim() !== id)
|
|
123
|
+
return;
|
|
124
|
+
this.idStatus.set('error');
|
|
125
|
+
this.idMessage.set(error?.message || 'Could not verify the report ID. Please retry.');
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
onNameChange(value) {
|
|
130
|
+
this.name.set(value);
|
|
131
|
+
if (!this.customSlug)
|
|
132
|
+
this.slug.set(toSlug(value));
|
|
133
|
+
}
|
|
134
|
+
onSlugChange(value) {
|
|
135
|
+
this.customSlug = true;
|
|
136
|
+
this.slug.set(value);
|
|
52
137
|
}
|
|
53
138
|
copyRoute() {
|
|
54
139
|
if (typeof navigator !== 'undefined' && navigator.clipboard) {
|
|
55
140
|
navigator.clipboard.writeText(this.fullRoute()).then(() => {
|
|
56
141
|
this.copied.set(true);
|
|
57
142
|
setTimeout(() => this.copied.set(false), 2000);
|
|
58
|
-
});
|
|
143
|
+
}).catch(() => this.saveError.set('Could not copy the report URL.'));
|
|
59
144
|
}
|
|
60
145
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
146
|
+
save(action = 'back_to_designer') {
|
|
147
|
+
if (this.isSaving() || this.isCheckingId() || this.updateConfirmation())
|
|
148
|
+
return;
|
|
149
|
+
this.attempted.set(true);
|
|
150
|
+
this.saveError.set(null);
|
|
151
|
+
if (this.idError() || this.nameError() || this.slugError())
|
|
152
|
+
return;
|
|
153
|
+
const reviewed = {
|
|
154
|
+
...this.report, id: this.reportId().trim(),
|
|
155
|
+
name: this.name().trim(), slug: this.slug().trim(),
|
|
156
|
+
description: this.description().trim() || undefined,
|
|
157
|
+
category: this.category().trim() || undefined,
|
|
66
158
|
menuGroup: this.menuGroup().trim() || undefined,
|
|
67
159
|
isPublished: this.isPublished(),
|
|
68
|
-
updatedAt: new Date().toISOString(),
|
|
69
160
|
};
|
|
70
|
-
|
|
71
|
-
this.
|
|
72
|
-
|
|
73
|
-
|
|
161
|
+
const contextKey = this.store.getStorageContextKey();
|
|
162
|
+
this.isCheckingId.set(true);
|
|
163
|
+
this.isPreparingSave.set(true);
|
|
164
|
+
this.idStatus.set('checking');
|
|
165
|
+
this.idMessage.set('Checking report ID...');
|
|
166
|
+
this.idCheck = defer(() => this.store.inspectReportId(reviewed.id)).pipe(take(1), switchMap(status => status.exists && (!Number.isInteger(status.version) || status.version < 0)
|
|
167
|
+
? throwError(() => new Error('Could not read the current report version. Please retry.')) : of(status)), takeUntilDestroyed(this.destroyRef), finalize(() => { this.isCheckingId.set(false); this.isPreparingSave.set(false); })).subscribe({
|
|
168
|
+
next: status => {
|
|
169
|
+
this.isCheckingId.set(false);
|
|
170
|
+
this.isPreparingSave.set(false);
|
|
171
|
+
if (this.reportId().trim() !== reviewed.id || this.store.getStorageContextKey() !== contextKey) {
|
|
172
|
+
this.idStatus.set('error');
|
|
173
|
+
this.idMessage.set('Reporting context changed. Review the details and save again.');
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (status.exists) {
|
|
177
|
+
this.idStatus.set(this.idChanged() ? 'duplicate' : 'current');
|
|
178
|
+
this.idMessage.set('This report ID already exists. Confirm the update or cancel.');
|
|
179
|
+
this.updateConfirmation.set({ report: reviewed, action, expectedVersion: status.version,
|
|
180
|
+
existingName: status.name || reviewed.id, contextKey });
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
this.idStatus.set('available');
|
|
184
|
+
this.idMessage.set('This report ID is available.');
|
|
185
|
+
this.persist(reviewed, action, { createOnly: true });
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
error: error => {
|
|
189
|
+
this.idStatus.set('error');
|
|
190
|
+
this.idMessage.set(error?.message || 'Could not verify the report ID. Please retry.');
|
|
191
|
+
},
|
|
74
192
|
});
|
|
75
|
-
return updated;
|
|
76
193
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
194
|
+
cancelUpdate() {
|
|
195
|
+
if (!this.isSaving())
|
|
196
|
+
this.updateConfirmation.set(null);
|
|
80
197
|
}
|
|
81
|
-
|
|
82
|
-
const
|
|
83
|
-
this.
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
window.location.href = route;
|
|
198
|
+
confirmUpdate() {
|
|
199
|
+
const confirmation = this.updateConfirmation();
|
|
200
|
+
if (!confirmation || this.isSaving() || this.isCheckingId())
|
|
201
|
+
return;
|
|
202
|
+
this.updateConfirmation.set(null);
|
|
203
|
+
if (this.reportId().trim() !== confirmation.report.id || this.store.getStorageContextKey() !== confirmation.contextKey) {
|
|
204
|
+
this.saveError.set('Reporting context changed. Review the details and save again.');
|
|
205
|
+
return;
|
|
90
206
|
}
|
|
207
|
+
this.persist(confirmation.report, confirmation.action, { expectedVersion: confirmation.expectedVersion });
|
|
208
|
+
}
|
|
209
|
+
persist(report, action, options) {
|
|
210
|
+
this.isSaving.set(true);
|
|
211
|
+
const previousDisableClose = this.dialogRef.disableClose;
|
|
212
|
+
this.dialogRef.disableClose = true;
|
|
213
|
+
defer(() => this.store.saveReport(report, options)).pipe(take(1), takeUntilDestroyed(this.destroyRef), finalize(() => {
|
|
214
|
+
this.isSaving.set(false);
|
|
215
|
+
this.dialogRef.disableClose = previousDisableClose;
|
|
216
|
+
})).subscribe({
|
|
217
|
+
next: saved => this.dialogRef.close({ action, report: saved }),
|
|
218
|
+
error: error => {
|
|
219
|
+
this.saveError.set(error?.message || 'The report could not be saved. Please try again.');
|
|
220
|
+
if (/already exists/i.test(error?.message || '')) {
|
|
221
|
+
this.idStatus.set('duplicate');
|
|
222
|
+
this.idMessage.set('This ID was just saved by another request. Save again to confirm an update.');
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
close() {
|
|
228
|
+
if (!this.isSaving())
|
|
229
|
+
this.dialogRef.close();
|
|
230
|
+
}
|
|
231
|
+
openLivePage() {
|
|
232
|
+
this.save('open_live_page');
|
|
91
233
|
}
|
|
92
234
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportSavedDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
93
235
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportSavedDialogComponent, isStandalone: true, selector: "rpt-report-saved-dialog", ngImport: i0, template: `
|
|
94
|
-
<div class="rpt-dialog-shell"
|
|
95
|
-
<!--
|
|
96
|
-
<div class="rpt-dialog-header">
|
|
236
|
+
<div class="rpt-dialog-shell" [attr.aria-busy]="isSaving() || isCheckingId()">
|
|
237
|
+
<!-- Review before the only persistence request -->
|
|
238
|
+
<div class="rpt-dialog-header" [attr.inert]="updateConfirmation() ? '' : null">
|
|
97
239
|
<div class="rpt-header-left">
|
|
98
|
-
<div class="rpt-
|
|
99
|
-
<rpt-icon name="
|
|
240
|
+
<div class="rpt-review-icon-badge">
|
|
241
|
+
<rpt-icon name="settings" [size]="14" />
|
|
100
242
|
</div>
|
|
101
243
|
<div>
|
|
102
|
-
<h2 id="dialog-title" class="rpt-dialog-title">
|
|
103
|
-
<p class="rpt-dialog-subtitle">
|
|
244
|
+
<h2 id="dialog-title" class="rpt-dialog-title">Review and Save Report</h2>
|
|
245
|
+
<p class="rpt-dialog-subtitle">Review the report details and preview, then save your changes.</p>
|
|
104
246
|
</div>
|
|
105
247
|
</div>
|
|
106
248
|
<button
|
|
107
249
|
type="button"
|
|
108
250
|
class="rpt-dialog-close"
|
|
109
|
-
(click)="close(
|
|
251
|
+
(click)="close()"
|
|
252
|
+
[disabled]="isSaving()"
|
|
110
253
|
aria-label="Close dialog"
|
|
111
254
|
>
|
|
112
|
-
<rpt-icon name="
|
|
255
|
+
<rpt-icon name="close" [size]="14" />
|
|
113
256
|
</button>
|
|
114
257
|
</div>
|
|
115
258
|
|
|
116
259
|
<!-- Modal Body (Two-Column Split) -->
|
|
117
|
-
<div class="rpt-dialog-body">
|
|
260
|
+
<div class="rpt-dialog-body" cdkScrollable [attr.inert]="updateConfirmation() || isPreparingSave() ? '' : null">
|
|
118
261
|
<!-- Left Column: Settings & Publishing -->
|
|
119
|
-
<div class="rpt-settings-column">
|
|
262
|
+
<div class="rpt-settings-column" cdkScrollable>
|
|
120
263
|
<div class="rpt-section-header">Page Navigation & Settings</div>
|
|
121
264
|
|
|
265
|
+
<div class="rpt-form-group">
|
|
266
|
+
<label class="rpt-label" for="rpt-dlg-id">Report ID</label>
|
|
267
|
+
<input id="rpt-dlg-id" type="text" class="rpt-input" autocomplete="off" spellcheck="false"
|
|
268
|
+
[ngModel]="reportId()" [ngModelOptions]="{standalone: true}" (ngModelChange)="onIdChange($event)"
|
|
269
|
+
[disabled]="isSaving()" [attr.aria-invalid]="idError() ? true : null"
|
|
270
|
+
[attr.aria-describedby]="idError() ? 'rpt-dlg-id-help rpt-dlg-id-error rpt-dlg-id-status' : 'rpt-dlg-id-help rpt-dlg-id-status'" placeholder="e.g. rpt-sales-summary" />
|
|
271
|
+
<div class="rpt-id-actions">
|
|
272
|
+
<button
|
|
273
|
+
type="button"
|
|
274
|
+
class="rpt-id-action-btn"
|
|
275
|
+
[disabled]="isSaving()"
|
|
276
|
+
(click)="randomizeId()"
|
|
277
|
+
title="Generate a random unique report ID"
|
|
278
|
+
>
|
|
279
|
+
<rpt-icon name="sparkles" [size]="12" />
|
|
280
|
+
<span>Random ID</span>
|
|
281
|
+
</button>
|
|
282
|
+
<button
|
|
283
|
+
type="button"
|
|
284
|
+
class="rpt-id-action-btn"
|
|
285
|
+
[class.is-checking]="isCheckingId()"
|
|
286
|
+
[disabled]="isSaving() || isCheckingId()"
|
|
287
|
+
(click)="verifyId()"
|
|
288
|
+
title="Verify ID availability in database"
|
|
289
|
+
>
|
|
290
|
+
@if (isCheckingId()) {
|
|
291
|
+
<rpt-icon name="refresh" [size]="12" class="rpt-spin" />
|
|
292
|
+
<span>Checking...</span>
|
|
293
|
+
} @else {
|
|
294
|
+
<rpt-icon name="search" [size]="12" />
|
|
295
|
+
<span>Verify ID</span>
|
|
296
|
+
}
|
|
297
|
+
</button>
|
|
298
|
+
</div>
|
|
299
|
+
<span id="rpt-dlg-id-help" class="rpt-help-text">An available ID creates a new report. An existing ID requires your confirmation before updating.</span>
|
|
300
|
+
@if (idError()) {
|
|
301
|
+
<p id="rpt-dlg-id-error" class="rpt-field-error" role="alert">{{ idError() }}</p>
|
|
302
|
+
}
|
|
303
|
+
<p id="rpt-dlg-id-status" class="rpt-id-status" role="status" aria-live="polite"
|
|
304
|
+
[class.rpt-id-status-success]="idStatus() === 'available' || idStatus() === 'current'"
|
|
305
|
+
[class.rpt-id-status-warning]="idStatus() === 'duplicate'"
|
|
306
|
+
[class.rpt-id-status-error]="idStatus() === 'error'"
|
|
307
|
+
[class.rpt-id-status-checking]="idStatus() === 'checking'">
|
|
308
|
+
@if (idMessage()) {
|
|
309
|
+
<span class="rpt-status-icon">
|
|
310
|
+
@if (idStatus() === 'available' || idStatus() === 'current') {
|
|
311
|
+
<rpt-icon name="check" [size]="11" />
|
|
312
|
+
} @else if (idStatus() === 'duplicate') {
|
|
313
|
+
<rpt-icon name="alert-triangle" [size]="11" />
|
|
314
|
+
} @else if (idStatus() === 'error') {
|
|
315
|
+
<rpt-icon name="close" [size]="11" />
|
|
316
|
+
} @else if (idStatus() === 'checking') {
|
|
317
|
+
<rpt-icon name="refresh" [size]="11" class="rpt-spin" />
|
|
318
|
+
}
|
|
319
|
+
</span>
|
|
320
|
+
<span>{{ idMessage() }}</span>
|
|
321
|
+
}
|
|
322
|
+
</p>
|
|
323
|
+
</div>
|
|
324
|
+
|
|
122
325
|
<!-- Report Name -->
|
|
123
326
|
<div class="rpt-form-group">
|
|
124
327
|
<label class="rpt-label" for="rpt-dlg-name">Display Name</label>
|
|
@@ -127,11 +330,26 @@ export class ReportSavedDialogComponent {
|
|
|
127
330
|
type="text"
|
|
128
331
|
class="rpt-input"
|
|
129
332
|
[ngModel]="name()"
|
|
333
|
+
[ngModelOptions]="{standalone: true}"
|
|
130
334
|
(ngModelChange)="onNameChange($event)"
|
|
335
|
+
[disabled]="isSaving()"
|
|
336
|
+
[attr.aria-invalid]="nameError() ? true : null"
|
|
337
|
+
[attr.aria-describedby]="nameError() ? 'rpt-dlg-name-error' : null"
|
|
131
338
|
placeholder="e.g. Sales Register"
|
|
132
339
|
/>
|
|
133
340
|
</div>
|
|
134
341
|
|
|
342
|
+
@if (nameError()) {
|
|
343
|
+
<p id="rpt-dlg-name-error" class="rpt-field-error" role="alert">{{ nameError() }}</p>
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
<div class="rpt-form-group">
|
|
347
|
+
<label class="rpt-label" for="rpt-dlg-description">Description</label>
|
|
348
|
+
<textarea id="rpt-dlg-description" class="rpt-input" rows="2"
|
|
349
|
+
[ngModel]="description()" (ngModelChange)="description.set($event)"
|
|
350
|
+
[ngModelOptions]="{standalone: true}" [disabled]="isSaving()"></textarea>
|
|
351
|
+
</div>
|
|
352
|
+
|
|
135
353
|
<!-- URL Slug -->
|
|
136
354
|
<div class="rpt-form-group">
|
|
137
355
|
<label class="rpt-label" for="rpt-dlg-slug">URL Slug</label>
|
|
@@ -142,14 +360,28 @@ export class ReportSavedDialogComponent {
|
|
|
142
360
|
type="text"
|
|
143
361
|
class="rpt-input rpt-slug-field"
|
|
144
362
|
[ngModel]="slug()"
|
|
145
|
-
|
|
363
|
+
[ngModelOptions]="{standalone: true}"
|
|
364
|
+
(ngModelChange)="onSlugChange($event)"
|
|
365
|
+
[disabled]="isSaving()"
|
|
366
|
+
[attr.aria-invalid]="slugError() ? true : null"
|
|
367
|
+
[attr.aria-describedby]="slugError() ? 'rpt-dlg-slug-error' : null"
|
|
146
368
|
placeholder="sale-report"
|
|
147
369
|
/>
|
|
148
370
|
</div>
|
|
371
|
+
@if (slugError()) {
|
|
372
|
+
<p id="rpt-dlg-slug-error" class="rpt-field-error" role="alert">{{ slugError() }}</p>
|
|
373
|
+
}
|
|
149
374
|
<span class="rpt-help-text">Direct URL for users to view this report page.</span>
|
|
150
375
|
</div>
|
|
151
376
|
|
|
152
|
-
|
|
377
|
+
<div class="rpt-form-group">
|
|
378
|
+
<label class="rpt-label" for="rpt-dlg-category">Category</label>
|
|
379
|
+
<input id="rpt-dlg-category" class="rpt-input" type="text"
|
|
380
|
+
[ngModel]="category()" (ngModelChange)="category.set($event)"
|
|
381
|
+
[ngModelOptions]="{standalone: true}" [disabled]="isSaving()" />
|
|
382
|
+
</div>
|
|
383
|
+
|
|
384
|
+
<!-- Menu Group -->
|
|
153
385
|
<div class="rpt-form-group">
|
|
154
386
|
<label class="rpt-label" for="rpt-dlg-group">Menu Group</label>
|
|
155
387
|
<input
|
|
@@ -157,7 +389,9 @@ export class ReportSavedDialogComponent {
|
|
|
157
389
|
type="text"
|
|
158
390
|
class="rpt-input"
|
|
159
391
|
[ngModel]="menuGroup()"
|
|
392
|
+
[ngModelOptions]="{standalone: true}"
|
|
160
393
|
(ngModelChange)="menuGroup.set($event)"
|
|
394
|
+
[disabled]="isSaving()"
|
|
161
395
|
placeholder="e.g. Sales, Finance, Operations"
|
|
162
396
|
/>
|
|
163
397
|
<span class="rpt-help-text">Sidebar folder heading where this page appears.</span>
|
|
@@ -173,6 +407,7 @@ export class ReportSavedDialogComponent {
|
|
|
173
407
|
<input
|
|
174
408
|
type="checkbox"
|
|
175
409
|
[checked]="isPublished()"
|
|
410
|
+
[disabled]="isSaving()"
|
|
176
411
|
(change)="isPublished.set(!isPublished())"
|
|
177
412
|
/>
|
|
178
413
|
<span class="rpt-slider"></span>
|
|
@@ -182,7 +417,7 @@ export class ReportSavedDialogComponent {
|
|
|
182
417
|
<!-- Copy URL Box -->
|
|
183
418
|
<div class="rpt-share-card">
|
|
184
419
|
<div class="rpt-share-url-row">
|
|
185
|
-
<span class="rpt-share-label">
|
|
420
|
+
<span class="rpt-share-label">Report URL:</span>
|
|
186
421
|
<code class="rpt-share-code">{{ fullRoute() }}</code>
|
|
187
422
|
<button
|
|
188
423
|
type="button"
|
|
@@ -207,7 +442,7 @@ export class ReportSavedDialogComponent {
|
|
|
207
442
|
<span class="rpt-preview-hint">Interactive preview matching runtime page</span>
|
|
208
443
|
</div>
|
|
209
444
|
|
|
210
|
-
<div class="rpt-preview-runtime-wrapper">
|
|
445
|
+
<div class="rpt-preview-runtime-wrapper" cdkScrollable>
|
|
211
446
|
<div class="rpt-preview-card-frame">
|
|
212
447
|
<rpt-runtime [report]="currentPreviewDef()" />
|
|
213
448
|
</div>
|
|
@@ -215,68 +450,179 @@ export class ReportSavedDialogComponent {
|
|
|
215
450
|
</div>
|
|
216
451
|
</div>
|
|
217
452
|
|
|
218
|
-
<!--
|
|
219
|
-
<div class="rpt-dialog-footer">
|
|
220
|
-
<div class="rpt-footer-left">
|
|
221
|
-
@if (
|
|
222
|
-
<
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
</span>
|
|
453
|
+
<!-- Confirming here is the only operation that saves a definition. -->
|
|
454
|
+
<div class="rpt-dialog-footer" [attr.inert]="updateConfirmation() ? '' : null">
|
|
455
|
+
<div class="rpt-footer-left" aria-live="polite">
|
|
456
|
+
@if (saveError()) {
|
|
457
|
+
<p class="rpt-field-error" role="alert">{{ saveError() }}</p>
|
|
458
|
+
} @else {
|
|
459
|
+
<span class="rpt-help-text">{{ isSaving() ? 'Saving report...' : 'Changes are saved only after confirmation.' }}</span>
|
|
226
460
|
}
|
|
227
461
|
</div>
|
|
228
462
|
<div class="rpt-footer-actions">
|
|
229
|
-
<button
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
(
|
|
233
|
-
>
|
|
234
|
-
Back to Designer
|
|
235
|
-
</button>
|
|
236
|
-
<button
|
|
237
|
-
type="button"
|
|
238
|
-
class="rpt-btn rpt-btn-primary"
|
|
239
|
-
(click)="openLivePage()"
|
|
240
|
-
>
|
|
241
|
-
<rpt-icon name="external-link" [size]="12" />
|
|
242
|
-
<span>Open Live Page</span>
|
|
463
|
+
<button type="button" class="rpt-btn rpt-btn-secondary" [disabled]="isSaving()" (click)="close()">Cancel</button>
|
|
464
|
+
<button type="button" class="rpt-btn rpt-btn-secondary" [disabled]="isSaving() || isCheckingId()" (click)="save('open_live_page')">Save and Open</button>
|
|
465
|
+
<button type="button" class="rpt-btn rpt-btn-primary" [disabled]="isSaving() || isCheckingId()" (click)="save()">
|
|
466
|
+
{{ isSaving() ? 'Saving...' : 'Save Report' }}
|
|
243
467
|
</button>
|
|
244
468
|
</div>
|
|
245
469
|
</div>
|
|
470
|
+
@if (updateConfirmation(); as confirmation) {
|
|
471
|
+
<div class="rpt-update-overlay" role="alertdialog" aria-modal="true"
|
|
472
|
+
aria-labelledby="rpt-update-title" aria-describedby="rpt-update-description"
|
|
473
|
+
cdkTrapFocus [cdkTrapFocusAutoCapture]="true">
|
|
474
|
+
<div class="rpt-update-card">
|
|
475
|
+
<!-- Modal Header with Warning Icon Badge and Close Button -->
|
|
476
|
+
<div class="rpt-update-card-header">
|
|
477
|
+
<div class="rpt-update-icon-badge">
|
|
478
|
+
<rpt-icon name="alert-triangle" [size]="18" />
|
|
479
|
+
</div>
|
|
480
|
+
<div class="rpt-update-header-info">
|
|
481
|
+
<h3 id="rpt-update-title" class="rpt-update-title">Report ID already exists</h3>
|
|
482
|
+
<span class="rpt-update-subtitle">An existing report definition was found</span>
|
|
483
|
+
</div>
|
|
484
|
+
<button type="button" class="rpt-dialog-close" (click)="cancelUpdate()" aria-label="Cancel update" title="Cancel">
|
|
485
|
+
<rpt-icon name="close" [size]="13" />
|
|
486
|
+
</button>
|
|
487
|
+
</div>
|
|
488
|
+
|
|
489
|
+
<!-- Modal Content with Summary, Details Card, and Impact Notice -->
|
|
490
|
+
<div class="rpt-update-card-body">
|
|
491
|
+
<p id="rpt-update-description" class="rpt-update-prompt">
|
|
492
|
+
Report <strong>{{ confirmation.existingName }}</strong> already uses
|
|
493
|
+
ID <strong>{{ confirmation.report.id }}</strong> (version {{ confirmation.expectedVersion }}).
|
|
494
|
+
Do you want to update it with the reviewed report details?
|
|
495
|
+
</p>
|
|
496
|
+
|
|
497
|
+
<div class="rpt-conflict-card">
|
|
498
|
+
<div class="rpt-conflict-row">
|
|
499
|
+
<span class="rpt-conflict-label">Target ID</span>
|
|
500
|
+
<code class="rpt-conflict-code">{{ confirmation.report.id }}</code>
|
|
501
|
+
</div>
|
|
502
|
+
<div class="rpt-conflict-row">
|
|
503
|
+
<span class="rpt-conflict-label">Existing Report</span>
|
|
504
|
+
<span class="rpt-conflict-name">{{ confirmation.existingName }}</span>
|
|
505
|
+
</div>
|
|
506
|
+
<div class="rpt-conflict-row">
|
|
507
|
+
<span class="rpt-conflict-label">Current Version</span>
|
|
508
|
+
<span class="rpt-conflict-badge">v{{ confirmation.expectedVersion }}</span>
|
|
509
|
+
</div>
|
|
510
|
+
</div>
|
|
511
|
+
|
|
512
|
+
<div class="rpt-overwrite-notice">
|
|
513
|
+
<rpt-icon name="warning" [size]="13" />
|
|
514
|
+
<span>Saving will overwrite the existing definition in the database and increment the version.</span>
|
|
515
|
+
</div>
|
|
516
|
+
</div>
|
|
517
|
+
|
|
518
|
+
<!-- Action Buttons matching Library UI -->
|
|
519
|
+
<div class="rpt-update-actions">
|
|
520
|
+
<button type="button" cdkFocusInitial class="rpt-btn rpt-btn-secondary" (click)="cancelUpdate()">
|
|
521
|
+
Cancel
|
|
522
|
+
</button>
|
|
523
|
+
<button type="button" class="rpt-btn rpt-btn-primary rpt-btn-confirm-save" (click)="confirmUpdate()">
|
|
524
|
+
<rpt-icon name="save" [size]="13" />
|
|
525
|
+
<span>{{ confirmation.action === 'open_live_page' ? 'Update and Open' : 'Update Report' }}</span>
|
|
526
|
+
</button>
|
|
527
|
+
</div>
|
|
528
|
+
</div>
|
|
529
|
+
</div>
|
|
530
|
+
}
|
|
246
531
|
</div>
|
|
247
|
-
`, isInline: true, styles: [":host{display:flex;align-items:center;justify-content:center;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif);color:#0f172a;box-sizing:border-box}.rpt-dialog-shell{display:flex;flex-direction:column;width:min(840px,92vw);max-height:min(540px,84vh);background:#fff;border-radius:10px;box-shadow:0 20px 40px -12px #0f172a47,0 0 0 1px #0f172a14;overflow:hidden;box-sizing:border-box;animation:rptDialogIn .18s cubic-bezier(.16,1,.3,1) forwards}@keyframes rptDialogIn{0%{opacity:0;transform:scale(.97) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}.rpt-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;box-sizing:border-box}.rpt-header-left{display:flex;align-items:center;gap:10px}.rpt-success-icon-badge{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;background:#ecfdf5;border:1px solid #a7f3d0;color:#059669;flex-shrink:0}.rpt-dialog-title{margin:0;font-size:.925rem;font-weight:700;color:#0f172a;line-height:1.25}.rpt-dialog-subtitle{margin:1px 0 0;font-size:.725rem;color:#64748b;line-height:1.2}.rpt-dialog-close{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:5px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-dialog-close:hover{background:#e2e8f0;color:#0f172a}.rpt-dialog-body{display:grid;grid-template-columns:280px 1fr;flex:1;min-height:360px;max-height:calc(84vh - 96px);overflow:hidden;box-sizing:border-box}@media (max-width: 780px){.rpt-dialog-body{grid-template-columns:1fr;overflow-y:auto}}.rpt-settings-column{display:flex;flex-direction:column;gap:9px;padding:12px 14px;background:#f8fafc;border-right:1px solid #e2e8f0;overflow-y:auto;box-sizing:border-box}.rpt-section-header{font-size:.675rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#475569;margin-bottom:1px}.rpt-form-group{display:flex;flex-direction:column;gap:3px}.rpt-label{font-size:.725rem;font-weight:600;color:#334155}.rpt-input{width:100%;box-sizing:border-box;height:28px;padding:4px 8px;font-size:.775rem;border:1px solid #cbd5e1;border-radius:5px;background:#fff;color:#0f172a;outline:none;transition:all .12s ease}.rpt-input:focus{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-input-wrapper{display:flex;align-items:center;background:#fff;border:1px solid #cbd5e1;border-radius:5px;height:28px;overflow:hidden;box-sizing:border-box;transition:all .12s ease}.rpt-slug-input-wrapper:focus-within{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-prefix{padding:0 0 0 8px;font-size:.725rem;color:#64748b;background:transparent;-webkit-user-select:none;user-select:none;line-height:28px}.rpt-slug-field{border:none!important;padding-left:2px!important;box-shadow:none!important;height:100%!important}.rpt-help-text{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-publish-card{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 10px;background:#fff;border:1px solid #e2e8f0;border-radius:6px;box-sizing:border-box}.rpt-publish-text{display:flex;flex-direction:column;gap:1px}.rpt-publish-title{font-size:.75rem;font-weight:600;color:#0f172a}.rpt-publish-desc{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-switch{position:relative;display:inline-block;width:32px;height:18px;flex-shrink:0}.rpt-switch input{opacity:0;width:0;height:0}.rpt-slider{position:absolute;cursor:pointer;inset:0;background-color:#cbd5e1;transition:.18s;border-radius:9999px}.rpt-slider:before{position:absolute;content:\"\";height:14px;width:14px;left:2px;bottom:2px;background-color:#fff;transition:.18s;border-radius:50%}input:checked+.rpt-slider{background-color:#2563eb}input:checked+.rpt-slider:before{transform:translate(14px)}.rpt-share-card{padding:6px 9px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:6px;box-sizing:border-box}.rpt-share-url-row{display:flex;align-items:center;gap:6px;overflow:hidden}.rpt-share-label{font-size:.675rem;font-weight:600;color:#1e40af;flex-shrink:0}.rpt-share-code{flex:1;font-size:.6875rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;color:#1e3a8a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rpt-btn-copy{display:inline-flex;align-items:center;gap:3px;padding:2px 6px;background:#fff;border:1px solid #93c5fd;border-radius:4px;font-size:.65rem;font-weight:600;color:#2563eb;cursor:pointer;flex-shrink:0;transition:all .12s ease;height:20px}.rpt-btn-copy:hover{background:#dbeafe}.rpt-preview-column{display:flex;flex-direction:column;background:#fff;overflow:hidden;min-width:0;box-sizing:border-box}.rpt-preview-header{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-bottom:1px solid #e2e8f0;background:#fff;flex-shrink:0;box-sizing:border-box}.rpt-preview-badge{display:flex;align-items:center;gap:6px;font-size:.725rem;font-weight:600;color:#0f172a}.rpt-live-dot{width:6px;height:6px;border-radius:50%;background:#10b981;box-shadow:0 0 0 2px #10b98133}.rpt-preview-hint{font-size:.675rem;color:#64748b}.rpt-preview-runtime-wrapper{flex:1;overflow-y:auto;overflow-x:hidden;padding:10px 12px;background:#f8fafc;box-sizing:border-box}.rpt-preview-runtime-wrapper::-webkit-scrollbar,.rpt-settings-column::-webkit-scrollbar{width:5px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb,.rpt-settings-column::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:9999px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb:hover,.rpt-settings-column::-webkit-scrollbar-thumb:hover{background:#94a3b8}.rpt-preview-card-frame{background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 1px 3px #0f172a0a;padding:10px;min-height:100%;box-sizing:border-box;overflow-x:hidden}.rpt-dialog-footer{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:#f8fafc;border-top:1px solid #e2e8f0;flex-shrink:0;box-sizing:border-box}.rpt-saved-pill{display:inline-flex;align-items:center;gap:4px;font-size:.7rem;font-weight:600;color:#15803d;background:#dcfce7;padding:2px 7px;border-radius:9999px}.rpt-footer-actions{display:flex;align-items:center;gap:8px;margin-left:auto}.rpt-btn{display:inline-flex;align-items:center;gap:5px;padding:5px 13px;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;transition:all .12s ease;border:1px solid transparent;box-sizing:border-box;line-height:1.4}.rpt-btn-secondary{background:#fff;border-color:#cbd5e1;color:#334155}.rpt-btn-secondary:hover{background:#f1f5f9;color:#0f172a;border-color:#94a3b8}.rpt-btn-primary{background:linear-gradient(135deg,#2563eb,#1d4ed8);color:#fff;box-shadow:0 1px 2px #2563eb33}.rpt-btn-primary:hover{background:linear-gradient(135deg,#1d4ed8,#1e40af);box-shadow:0 2px 4px #2563eb40}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ReportRuntimeComponent, selector: "rpt-report-runtime, rpt-runtime", inputs: ["reportId", "report", "resultData"], outputs: ["resetRequested", "execute", "executed", "exportRequested", "printRequested", "customActionTriggered", "gridStateChange", "columnDefsChange", "selectionChange", "selectionChanged", "rowActionTriggered", "drilldownRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
532
|
+
`, isInline: true, styles: ["@keyframes rptSpin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.rpt-spin{display:inline-block;animation:rptSpin 1s linear infinite}@keyframes rptOverlayIn{0%{opacity:0}to{opacity:1}}@keyframes rptCardIn{0%{opacity:0;transform:scale(.96) translateY(6px)}to{opacity:1;transform:scale(1) translateY(0)}}.rpt-id-actions{display:flex;align-items:center;gap:6px;margin-top:4px}.rpt-id-action-btn{display:inline-flex;align-items:center;gap:5px;height:25px;padding:0 9px;font-size:.7rem;font-weight:500;color:#334155;background:#fff;border:1px solid #cbd5e1;border-radius:5px;cursor:pointer;transition:all .15s ease;box-sizing:border-box;white-space:nowrap;font-family:inherit;line-height:1}.rpt-id-action-btn:hover:not(:disabled){background:#f1f5f9;color:#0f172a;border-color:#94a3b8;box-shadow:0 1px 2px #0f172a0d}.rpt-id-action-btn:active:not(:disabled){background:#e2e8f0}.rpt-id-action-btn:disabled{opacity:.5;cursor:not-allowed}.rpt-id-action-btn.is-checking{color:#2563eb;border-color:#93c5fd;background:#eff6ff}.rpt-id-status{display:inline-flex;align-items:center;gap:5px;font-size:.72rem;line-height:1.3;margin:4px 0 0;padding:3px 8px;border-radius:5px;transition:all .15s ease;width:fit-content;max-width:100%;box-sizing:border-box}.rpt-id-status:empty{display:none}.rpt-status-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.rpt-id-status-success{color:#15803d;background:#f0fdf4;border:1px solid #bbf7d0}.rpt-id-status-warning{color:#b45309;background:#fffbeb;border:1px solid #fef3c7}.rpt-id-status-error{color:#b91c1c;background:#fef2f2;border:1px solid #fecaca}.rpt-id-status-checking{color:#1d4ed8;background:#eff6ff;border:1px solid #dbeafe}.rpt-update-overlay{position:absolute;inset:0;z-index:50;background:#0f172a73;backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box;animation:rptOverlayIn .16s cubic-bezier(.16,1,.3,1) forwards}.rpt-update-card{box-sizing:border-box;width:min(440px,100%);max-height:94%;background:#fff;border-radius:10px;box-shadow:0 20px 45px -8px #0f172a52,0 0 0 1px #0f172a14;border:1px solid #e2e8f0;overflow:hidden;display:flex;flex-direction:column;animation:rptCardIn .18s cubic-bezier(.16,1,.3,1) forwards}.rpt-update-card-header{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#fffbeb;border-bottom:1px solid #fef3c7;flex-shrink:0}.rpt-update-icon-badge{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;background:#fef3c7;border:1px solid #fde68a;color:#b45309;flex-shrink:0}.rpt-update-header-info{flex:1;min-width:0}.rpt-update-title{margin:0;font-size:.925rem;font-weight:700;color:#92400e;line-height:1.25}.rpt-update-subtitle{font-size:.7rem;color:#b45309;margin-top:1px;display:block}.rpt-update-card-body{padding:14px 16px;display:flex;flex-direction:column;gap:11px;overflow-y:auto;box-sizing:border-box}.rpt-update-prompt{margin:0;font-size:.8rem;line-height:1.45;color:#334155}.rpt-conflict-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:7px;padding:9px 12px;display:flex;flex-direction:column;gap:7px}.rpt-conflict-row{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:.735rem}.rpt-conflict-label{color:#64748b;font-weight:500;flex-shrink:0}.rpt-conflict-code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.72rem;background:#e2e8f0;color:#0f172a;padding:2px 6px;border-radius:4px;font-weight:600}.rpt-conflict-name{font-weight:600;color:#0f172a;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rpt-conflict-badge{font-size:.68rem;font-weight:600;padding:1px 7px;border-radius:9999px;background:#e0f2fe;color:#0369a1;border:1px solid #bae6fd}.rpt-overwrite-notice{display:flex;align-items:flex-start;gap:7px;font-size:.715rem;color:#b45309;background:#fffbeb;border:1px solid #fef3c7;padding:7px 10px;border-radius:6px;line-height:1.35}.rpt-overwrite-notice rpt-icon{flex-shrink:0;margin-top:1px}.rpt-update-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:10px 16px;background:#f8fafc;border-top:1px solid #e2e8f0;flex-shrink:0}.rpt-btn-confirm-save{background:linear-gradient(135deg,#2563eb,#1d4ed8);color:#fff;box-shadow:0 1px 2px #2563eb33}.rpt-btn-confirm-save:hover{background:linear-gradient(135deg,#1d4ed8,#1e40af);box-shadow:0 2px 4px #2563eb40}#rpt-dlg-id-error:empty,#rpt-dlg-id-status:empty{display:none}.rpt-dialog-footer,.rpt-footer-actions{flex-wrap:wrap;gap:8px}.rpt-btn,.rpt-dialog-close{min-height:36px}@media (max-width: 640px){.rpt-btn,.rpt-dialog-close{min-height:44px;min-width:44px}.rpt-footer-left{width:100%}}.rpt-field-error{color:#b91c1c;font-size:.8rem;margin:4px 0}button:disabled{opacity:.6;cursor:wait}textarea.rpt-input{resize:vertical;min-height:56px}.rpt-footer-left{min-width:0;padding-right:12px}:host{display:flex;width:100%;min-width:0;min-height:0;max-height:inherit;align-items:center;justify-content:center;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif);color:#0f172a;box-sizing:border-box}.rpt-dialog-shell{position:relative;display:flex;flex-direction:column;width:100%;max-width:100%;min-height:0;max-height:min(540px,calc(100vh - 32px));max-height:min(540px,calc(100dvh - 32px));background:#fff;border-radius:10px;box-shadow:0 20px 40px -12px #0f172a47,0 0 0 1px #0f172a14;overflow:hidden;box-sizing:border-box;animation:rptDialogIn .18s cubic-bezier(.16,1,.3,1) forwards}@keyframes rptDialogIn{0%{opacity:0;transform:scale(.97) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}.rpt-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;box-sizing:border-box}.rpt-header-left{display:flex;align-items:center;gap:10px}.rpt-review-icon-badge{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;background:#dbeafe;border:1px solid #a7f3d0;color:#1d4ed8;flex-shrink:0}.rpt-dialog-title{margin:0;font-size:.925rem;font-weight:700;color:#0f172a;line-height:1.25}.rpt-dialog-subtitle{margin:1px 0 0;font-size:.725rem;color:#64748b;line-height:1.2}.rpt-dialog-close{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:5px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-dialog-close:hover{background:#e2e8f0;color:#0f172a}.rpt-dialog-body{display:grid;grid-template-columns:280px minmax(0,1fr);grid-template-rows:minmax(0,1fr);flex:1;min-height:0;min-width:0;overflow:hidden;box-sizing:border-box}@media (max-width: 780px){.rpt-dialog-body{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto;overflow-y:auto;overscroll-behavior:contain}}.rpt-settings-column{display:flex;flex-direction:column;gap:9px;padding:12px 14px;background:#f8fafc;border-right:1px solid #e2e8f0;overflow-y:auto;min-height:0;overscroll-behavior:contain;box-sizing:border-box}.rpt-section-header{font-size:.675rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#475569;margin-bottom:1px}.rpt-form-group{display:flex;flex-direction:column;gap:3px}.rpt-label{font-size:.725rem;font-weight:600;color:#334155}.rpt-input{width:100%;box-sizing:border-box;height:28px;padding:4px 8px;font-size:.775rem;border:1px solid #cbd5e1;border-radius:5px;background:#fff;color:#0f172a;outline:none;transition:all .12s ease}.rpt-input:focus{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-input-wrapper{display:flex;align-items:center;background:#fff;border:1px solid #cbd5e1;border-radius:5px;height:28px;overflow:hidden;box-sizing:border-box;transition:all .12s ease}.rpt-slug-input-wrapper:focus-within{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-prefix{padding:0 0 0 8px;font-size:.725rem;color:#64748b;background:transparent;-webkit-user-select:none;user-select:none;line-height:28px}.rpt-slug-field{border:none!important;padding-left:2px!important;box-shadow:none!important;height:100%!important}.rpt-help-text{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-publish-card{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 10px;background:#fff;border:1px solid #e2e8f0;border-radius:6px;box-sizing:border-box}.rpt-publish-text{display:flex;flex-direction:column;gap:1px}.rpt-publish-title{font-size:.75rem;font-weight:600;color:#0f172a}.rpt-publish-desc{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-switch{position:relative;display:inline-block;width:32px;height:18px;flex-shrink:0}.rpt-switch input{opacity:0;width:0;height:0}.rpt-slider{position:absolute;cursor:pointer;inset:0;background-color:#cbd5e1;transition:.18s;border-radius:9999px}.rpt-slider:before{position:absolute;content:\"\";height:14px;width:14px;left:2px;bottom:2px;background-color:#fff;transition:.18s;border-radius:50%}input:checked+.rpt-slider{background-color:#2563eb}input:checked+.rpt-slider:before{transform:translate(14px)}.rpt-share-card{padding:6px 9px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:6px;box-sizing:border-box}.rpt-share-url-row{display:flex;align-items:center;gap:6px;overflow:hidden}.rpt-share-label{font-size:.675rem;font-weight:600;color:#1e40af;flex-shrink:0}.rpt-share-code{flex:1;font-size:.6875rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;color:#1e3a8a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rpt-btn-copy{display:inline-flex;align-items:center;gap:3px;padding:2px 6px;background:#fff;border:1px solid #93c5fd;border-radius:4px;font-size:.65rem;font-weight:600;color:#2563eb;cursor:pointer;flex-shrink:0;transition:all .12s ease;height:20px}.rpt-btn-copy:hover{background:#dbeafe}.rpt-preview-column{display:flex;flex-direction:column;background:#fff;overflow:hidden;min-width:0;box-sizing:border-box}.rpt-preview-header{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-bottom:1px solid #e2e8f0;background:#fff;flex-shrink:0;box-sizing:border-box}.rpt-preview-badge{display:flex;align-items:center;gap:6px;font-size:.725rem;font-weight:600;color:#0f172a}.rpt-live-dot{width:6px;height:6px;border-radius:50%;background:#10b981;box-shadow:0 0 0 2px #10b98133}.rpt-preview-hint{font-size:.675rem;color:#64748b}.rpt-preview-runtime-wrapper{flex:1;min-height:0;overscroll-behavior:contain;overflow-y:auto;overflow-x:hidden;padding:10px 12px;background:#f8fafc;box-sizing:border-box}.rpt-preview-runtime-wrapper::-webkit-scrollbar,.rpt-settings-column::-webkit-scrollbar{width:5px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb,.rpt-settings-column::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:9999px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb:hover,.rpt-settings-column::-webkit-scrollbar-thumb:hover{background:#94a3b8}.rpt-preview-card-frame{background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 1px 3px #0f172a0a;padding:10px;min-height:100%;box-sizing:border-box;overflow-x:hidden}@media (max-width: 780px){.rpt-settings-column{overflow-y:visible}.rpt-preview-runtime-wrapper{flex:none;max-height:320px}.rpt-preview-hint{display:none}}.rpt-dialog-footer{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:space-between;padding:8px 16px;background:#f8fafc;border-top:1px solid #e2e8f0;flex-shrink:0;box-sizing:border-box}.rpt-saved-pill{display:inline-flex;align-items:center;gap:4px;font-size:.7rem;font-weight:600;color:#15803d;background:#dcfce7;padding:2px 7px;border-radius:9999px}.rpt-footer-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-left:auto}.rpt-btn{display:inline-flex;align-items:center;gap:5px;padding:5px 13px;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;transition:all .12s ease;border:1px solid transparent;box-sizing:border-box;line-height:1.4}.rpt-btn-secondary{background:#fff;border-color:#cbd5e1;color:#334155}.rpt-btn-secondary:hover{background:#f1f5f9;color:#0f172a;border-color:#94a3b8}.rpt-btn-primary{background:linear-gradient(135deg,#2563eb,#1d4ed8);color:#fff;box-shadow:0 1px 2px #2563eb33}.rpt-btn-primary:hover{background:linear-gradient(135deg,#1d4ed8,#1e40af);box-shadow:0 2px 4px #2563eb40}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "component", type: ReportRuntimeComponent, selector: "rpt-report-runtime, rpt-runtime", inputs: ["reportId", "report", "resultData"], outputs: ["resetRequested", "execute", "executed", "exportRequested", "printRequested", "customActionTriggered", "gridStateChange", "columnDefsChange", "selectionChange", "selectionChanged", "rowActionTriggered", "drilldownRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
248
533
|
}
|
|
249
534
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportSavedDialogComponent, decorators: [{
|
|
250
535
|
type: Component,
|
|
251
|
-
args: [{ selector: 'rpt-report-saved-dialog', standalone: true, imports: [CommonModule, FormsModule, ReportRuntimeComponent, RptIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
252
|
-
<div class="rpt-dialog-shell"
|
|
253
|
-
<!--
|
|
254
|
-
<div class="rpt-dialog-header">
|
|
536
|
+
args: [{ selector: 'rpt-report-saved-dialog', standalone: true, imports: [CommonModule, FormsModule, A11yModule, CdkScrollable, ReportRuntimeComponent, RptIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
537
|
+
<div class="rpt-dialog-shell" [attr.aria-busy]="isSaving() || isCheckingId()">
|
|
538
|
+
<!-- Review before the only persistence request -->
|
|
539
|
+
<div class="rpt-dialog-header" [attr.inert]="updateConfirmation() ? '' : null">
|
|
255
540
|
<div class="rpt-header-left">
|
|
256
|
-
<div class="rpt-
|
|
257
|
-
<rpt-icon name="
|
|
541
|
+
<div class="rpt-review-icon-badge">
|
|
542
|
+
<rpt-icon name="settings" [size]="14" />
|
|
258
543
|
</div>
|
|
259
544
|
<div>
|
|
260
|
-
<h2 id="dialog-title" class="rpt-dialog-title">
|
|
261
|
-
<p class="rpt-dialog-subtitle">
|
|
545
|
+
<h2 id="dialog-title" class="rpt-dialog-title">Review and Save Report</h2>
|
|
546
|
+
<p class="rpt-dialog-subtitle">Review the report details and preview, then save your changes.</p>
|
|
262
547
|
</div>
|
|
263
548
|
</div>
|
|
264
549
|
<button
|
|
265
550
|
type="button"
|
|
266
551
|
class="rpt-dialog-close"
|
|
267
|
-
(click)="close(
|
|
552
|
+
(click)="close()"
|
|
553
|
+
[disabled]="isSaving()"
|
|
268
554
|
aria-label="Close dialog"
|
|
269
555
|
>
|
|
270
|
-
<rpt-icon name="
|
|
556
|
+
<rpt-icon name="close" [size]="14" />
|
|
271
557
|
</button>
|
|
272
558
|
</div>
|
|
273
559
|
|
|
274
560
|
<!-- Modal Body (Two-Column Split) -->
|
|
275
|
-
<div class="rpt-dialog-body">
|
|
561
|
+
<div class="rpt-dialog-body" cdkScrollable [attr.inert]="updateConfirmation() || isPreparingSave() ? '' : null">
|
|
276
562
|
<!-- Left Column: Settings & Publishing -->
|
|
277
|
-
<div class="rpt-settings-column">
|
|
563
|
+
<div class="rpt-settings-column" cdkScrollable>
|
|
278
564
|
<div class="rpt-section-header">Page Navigation & Settings</div>
|
|
279
565
|
|
|
566
|
+
<div class="rpt-form-group">
|
|
567
|
+
<label class="rpt-label" for="rpt-dlg-id">Report ID</label>
|
|
568
|
+
<input id="rpt-dlg-id" type="text" class="rpt-input" autocomplete="off" spellcheck="false"
|
|
569
|
+
[ngModel]="reportId()" [ngModelOptions]="{standalone: true}" (ngModelChange)="onIdChange($event)"
|
|
570
|
+
[disabled]="isSaving()" [attr.aria-invalid]="idError() ? true : null"
|
|
571
|
+
[attr.aria-describedby]="idError() ? 'rpt-dlg-id-help rpt-dlg-id-error rpt-dlg-id-status' : 'rpt-dlg-id-help rpt-dlg-id-status'" placeholder="e.g. rpt-sales-summary" />
|
|
572
|
+
<div class="rpt-id-actions">
|
|
573
|
+
<button
|
|
574
|
+
type="button"
|
|
575
|
+
class="rpt-id-action-btn"
|
|
576
|
+
[disabled]="isSaving()"
|
|
577
|
+
(click)="randomizeId()"
|
|
578
|
+
title="Generate a random unique report ID"
|
|
579
|
+
>
|
|
580
|
+
<rpt-icon name="sparkles" [size]="12" />
|
|
581
|
+
<span>Random ID</span>
|
|
582
|
+
</button>
|
|
583
|
+
<button
|
|
584
|
+
type="button"
|
|
585
|
+
class="rpt-id-action-btn"
|
|
586
|
+
[class.is-checking]="isCheckingId()"
|
|
587
|
+
[disabled]="isSaving() || isCheckingId()"
|
|
588
|
+
(click)="verifyId()"
|
|
589
|
+
title="Verify ID availability in database"
|
|
590
|
+
>
|
|
591
|
+
@if (isCheckingId()) {
|
|
592
|
+
<rpt-icon name="refresh" [size]="12" class="rpt-spin" />
|
|
593
|
+
<span>Checking...</span>
|
|
594
|
+
} @else {
|
|
595
|
+
<rpt-icon name="search" [size]="12" />
|
|
596
|
+
<span>Verify ID</span>
|
|
597
|
+
}
|
|
598
|
+
</button>
|
|
599
|
+
</div>
|
|
600
|
+
<span id="rpt-dlg-id-help" class="rpt-help-text">An available ID creates a new report. An existing ID requires your confirmation before updating.</span>
|
|
601
|
+
@if (idError()) {
|
|
602
|
+
<p id="rpt-dlg-id-error" class="rpt-field-error" role="alert">{{ idError() }}</p>
|
|
603
|
+
}
|
|
604
|
+
<p id="rpt-dlg-id-status" class="rpt-id-status" role="status" aria-live="polite"
|
|
605
|
+
[class.rpt-id-status-success]="idStatus() === 'available' || idStatus() === 'current'"
|
|
606
|
+
[class.rpt-id-status-warning]="idStatus() === 'duplicate'"
|
|
607
|
+
[class.rpt-id-status-error]="idStatus() === 'error'"
|
|
608
|
+
[class.rpt-id-status-checking]="idStatus() === 'checking'">
|
|
609
|
+
@if (idMessage()) {
|
|
610
|
+
<span class="rpt-status-icon">
|
|
611
|
+
@if (idStatus() === 'available' || idStatus() === 'current') {
|
|
612
|
+
<rpt-icon name="check" [size]="11" />
|
|
613
|
+
} @else if (idStatus() === 'duplicate') {
|
|
614
|
+
<rpt-icon name="alert-triangle" [size]="11" />
|
|
615
|
+
} @else if (idStatus() === 'error') {
|
|
616
|
+
<rpt-icon name="close" [size]="11" />
|
|
617
|
+
} @else if (idStatus() === 'checking') {
|
|
618
|
+
<rpt-icon name="refresh" [size]="11" class="rpt-spin" />
|
|
619
|
+
}
|
|
620
|
+
</span>
|
|
621
|
+
<span>{{ idMessage() }}</span>
|
|
622
|
+
}
|
|
623
|
+
</p>
|
|
624
|
+
</div>
|
|
625
|
+
|
|
280
626
|
<!-- Report Name -->
|
|
281
627
|
<div class="rpt-form-group">
|
|
282
628
|
<label class="rpt-label" for="rpt-dlg-name">Display Name</label>
|
|
@@ -285,11 +631,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
285
631
|
type="text"
|
|
286
632
|
class="rpt-input"
|
|
287
633
|
[ngModel]="name()"
|
|
634
|
+
[ngModelOptions]="{standalone: true}"
|
|
288
635
|
(ngModelChange)="onNameChange($event)"
|
|
636
|
+
[disabled]="isSaving()"
|
|
637
|
+
[attr.aria-invalid]="nameError() ? true : null"
|
|
638
|
+
[attr.aria-describedby]="nameError() ? 'rpt-dlg-name-error' : null"
|
|
289
639
|
placeholder="e.g. Sales Register"
|
|
290
640
|
/>
|
|
291
641
|
</div>
|
|
292
642
|
|
|
643
|
+
@if (nameError()) {
|
|
644
|
+
<p id="rpt-dlg-name-error" class="rpt-field-error" role="alert">{{ nameError() }}</p>
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
<div class="rpt-form-group">
|
|
648
|
+
<label class="rpt-label" for="rpt-dlg-description">Description</label>
|
|
649
|
+
<textarea id="rpt-dlg-description" class="rpt-input" rows="2"
|
|
650
|
+
[ngModel]="description()" (ngModelChange)="description.set($event)"
|
|
651
|
+
[ngModelOptions]="{standalone: true}" [disabled]="isSaving()"></textarea>
|
|
652
|
+
</div>
|
|
653
|
+
|
|
293
654
|
<!-- URL Slug -->
|
|
294
655
|
<div class="rpt-form-group">
|
|
295
656
|
<label class="rpt-label" for="rpt-dlg-slug">URL Slug</label>
|
|
@@ -300,14 +661,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
300
661
|
type="text"
|
|
301
662
|
class="rpt-input rpt-slug-field"
|
|
302
663
|
[ngModel]="slug()"
|
|
303
|
-
|
|
664
|
+
[ngModelOptions]="{standalone: true}"
|
|
665
|
+
(ngModelChange)="onSlugChange($event)"
|
|
666
|
+
[disabled]="isSaving()"
|
|
667
|
+
[attr.aria-invalid]="slugError() ? true : null"
|
|
668
|
+
[attr.aria-describedby]="slugError() ? 'rpt-dlg-slug-error' : null"
|
|
304
669
|
placeholder="sale-report"
|
|
305
670
|
/>
|
|
306
671
|
</div>
|
|
672
|
+
@if (slugError()) {
|
|
673
|
+
<p id="rpt-dlg-slug-error" class="rpt-field-error" role="alert">{{ slugError() }}</p>
|
|
674
|
+
}
|
|
307
675
|
<span class="rpt-help-text">Direct URL for users to view this report page.</span>
|
|
308
676
|
</div>
|
|
309
677
|
|
|
310
|
-
|
|
678
|
+
<div class="rpt-form-group">
|
|
679
|
+
<label class="rpt-label" for="rpt-dlg-category">Category</label>
|
|
680
|
+
<input id="rpt-dlg-category" class="rpt-input" type="text"
|
|
681
|
+
[ngModel]="category()" (ngModelChange)="category.set($event)"
|
|
682
|
+
[ngModelOptions]="{standalone: true}" [disabled]="isSaving()" />
|
|
683
|
+
</div>
|
|
684
|
+
|
|
685
|
+
<!-- Menu Group -->
|
|
311
686
|
<div class="rpt-form-group">
|
|
312
687
|
<label class="rpt-label" for="rpt-dlg-group">Menu Group</label>
|
|
313
688
|
<input
|
|
@@ -315,7 +690,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
315
690
|
type="text"
|
|
316
691
|
class="rpt-input"
|
|
317
692
|
[ngModel]="menuGroup()"
|
|
693
|
+
[ngModelOptions]="{standalone: true}"
|
|
318
694
|
(ngModelChange)="menuGroup.set($event)"
|
|
695
|
+
[disabled]="isSaving()"
|
|
319
696
|
placeholder="e.g. Sales, Finance, Operations"
|
|
320
697
|
/>
|
|
321
698
|
<span class="rpt-help-text">Sidebar folder heading where this page appears.</span>
|
|
@@ -331,6 +708,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
331
708
|
<input
|
|
332
709
|
type="checkbox"
|
|
333
710
|
[checked]="isPublished()"
|
|
711
|
+
[disabled]="isSaving()"
|
|
334
712
|
(change)="isPublished.set(!isPublished())"
|
|
335
713
|
/>
|
|
336
714
|
<span class="rpt-slider"></span>
|
|
@@ -340,7 +718,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
340
718
|
<!-- Copy URL Box -->
|
|
341
719
|
<div class="rpt-share-card">
|
|
342
720
|
<div class="rpt-share-url-row">
|
|
343
|
-
<span class="rpt-share-label">
|
|
721
|
+
<span class="rpt-share-label">Report URL:</span>
|
|
344
722
|
<code class="rpt-share-code">{{ fullRoute() }}</code>
|
|
345
723
|
<button
|
|
346
724
|
type="button"
|
|
@@ -365,7 +743,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
365
743
|
<span class="rpt-preview-hint">Interactive preview matching runtime page</span>
|
|
366
744
|
</div>
|
|
367
745
|
|
|
368
|
-
<div class="rpt-preview-runtime-wrapper">
|
|
746
|
+
<div class="rpt-preview-runtime-wrapper" cdkScrollable>
|
|
369
747
|
<div class="rpt-preview-card-frame">
|
|
370
748
|
<rpt-runtime [report]="currentPreviewDef()" />
|
|
371
749
|
</div>
|
|
@@ -373,35 +751,85 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
373
751
|
</div>
|
|
374
752
|
</div>
|
|
375
753
|
|
|
376
|
-
<!--
|
|
377
|
-
<div class="rpt-dialog-footer">
|
|
378
|
-
<div class="rpt-footer-left">
|
|
379
|
-
@if (
|
|
380
|
-
<
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
</span>
|
|
754
|
+
<!-- Confirming here is the only operation that saves a definition. -->
|
|
755
|
+
<div class="rpt-dialog-footer" [attr.inert]="updateConfirmation() ? '' : null">
|
|
756
|
+
<div class="rpt-footer-left" aria-live="polite">
|
|
757
|
+
@if (saveError()) {
|
|
758
|
+
<p class="rpt-field-error" role="alert">{{ saveError() }}</p>
|
|
759
|
+
} @else {
|
|
760
|
+
<span class="rpt-help-text">{{ isSaving() ? 'Saving report...' : 'Changes are saved only after confirmation.' }}</span>
|
|
384
761
|
}
|
|
385
762
|
</div>
|
|
386
763
|
<div class="rpt-footer-actions">
|
|
387
|
-
<button
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
(
|
|
391
|
-
>
|
|
392
|
-
Back to Designer
|
|
393
|
-
</button>
|
|
394
|
-
<button
|
|
395
|
-
type="button"
|
|
396
|
-
class="rpt-btn rpt-btn-primary"
|
|
397
|
-
(click)="openLivePage()"
|
|
398
|
-
>
|
|
399
|
-
<rpt-icon name="external-link" [size]="12" />
|
|
400
|
-
<span>Open Live Page</span>
|
|
764
|
+
<button type="button" class="rpt-btn rpt-btn-secondary" [disabled]="isSaving()" (click)="close()">Cancel</button>
|
|
765
|
+
<button type="button" class="rpt-btn rpt-btn-secondary" [disabled]="isSaving() || isCheckingId()" (click)="save('open_live_page')">Save and Open</button>
|
|
766
|
+
<button type="button" class="rpt-btn rpt-btn-primary" [disabled]="isSaving() || isCheckingId()" (click)="save()">
|
|
767
|
+
{{ isSaving() ? 'Saving...' : 'Save Report' }}
|
|
401
768
|
</button>
|
|
402
769
|
</div>
|
|
403
770
|
</div>
|
|
771
|
+
@if (updateConfirmation(); as confirmation) {
|
|
772
|
+
<div class="rpt-update-overlay" role="alertdialog" aria-modal="true"
|
|
773
|
+
aria-labelledby="rpt-update-title" aria-describedby="rpt-update-description"
|
|
774
|
+
cdkTrapFocus [cdkTrapFocusAutoCapture]="true">
|
|
775
|
+
<div class="rpt-update-card">
|
|
776
|
+
<!-- Modal Header with Warning Icon Badge and Close Button -->
|
|
777
|
+
<div class="rpt-update-card-header">
|
|
778
|
+
<div class="rpt-update-icon-badge">
|
|
779
|
+
<rpt-icon name="alert-triangle" [size]="18" />
|
|
780
|
+
</div>
|
|
781
|
+
<div class="rpt-update-header-info">
|
|
782
|
+
<h3 id="rpt-update-title" class="rpt-update-title">Report ID already exists</h3>
|
|
783
|
+
<span class="rpt-update-subtitle">An existing report definition was found</span>
|
|
784
|
+
</div>
|
|
785
|
+
<button type="button" class="rpt-dialog-close" (click)="cancelUpdate()" aria-label="Cancel update" title="Cancel">
|
|
786
|
+
<rpt-icon name="close" [size]="13" />
|
|
787
|
+
</button>
|
|
788
|
+
</div>
|
|
789
|
+
|
|
790
|
+
<!-- Modal Content with Summary, Details Card, and Impact Notice -->
|
|
791
|
+
<div class="rpt-update-card-body">
|
|
792
|
+
<p id="rpt-update-description" class="rpt-update-prompt">
|
|
793
|
+
Report <strong>{{ confirmation.existingName }}</strong> already uses
|
|
794
|
+
ID <strong>{{ confirmation.report.id }}</strong> (version {{ confirmation.expectedVersion }}).
|
|
795
|
+
Do you want to update it with the reviewed report details?
|
|
796
|
+
</p>
|
|
797
|
+
|
|
798
|
+
<div class="rpt-conflict-card">
|
|
799
|
+
<div class="rpt-conflict-row">
|
|
800
|
+
<span class="rpt-conflict-label">Target ID</span>
|
|
801
|
+
<code class="rpt-conflict-code">{{ confirmation.report.id }}</code>
|
|
802
|
+
</div>
|
|
803
|
+
<div class="rpt-conflict-row">
|
|
804
|
+
<span class="rpt-conflict-label">Existing Report</span>
|
|
805
|
+
<span class="rpt-conflict-name">{{ confirmation.existingName }}</span>
|
|
806
|
+
</div>
|
|
807
|
+
<div class="rpt-conflict-row">
|
|
808
|
+
<span class="rpt-conflict-label">Current Version</span>
|
|
809
|
+
<span class="rpt-conflict-badge">v{{ confirmation.expectedVersion }}</span>
|
|
810
|
+
</div>
|
|
811
|
+
</div>
|
|
812
|
+
|
|
813
|
+
<div class="rpt-overwrite-notice">
|
|
814
|
+
<rpt-icon name="warning" [size]="13" />
|
|
815
|
+
<span>Saving will overwrite the existing definition in the database and increment the version.</span>
|
|
816
|
+
</div>
|
|
817
|
+
</div>
|
|
818
|
+
|
|
819
|
+
<!-- Action Buttons matching Library UI -->
|
|
820
|
+
<div class="rpt-update-actions">
|
|
821
|
+
<button type="button" cdkFocusInitial class="rpt-btn rpt-btn-secondary" (click)="cancelUpdate()">
|
|
822
|
+
Cancel
|
|
823
|
+
</button>
|
|
824
|
+
<button type="button" class="rpt-btn rpt-btn-primary rpt-btn-confirm-save" (click)="confirmUpdate()">
|
|
825
|
+
<rpt-icon name="save" [size]="13" />
|
|
826
|
+
<span>{{ confirmation.action === 'open_live_page' ? 'Update and Open' : 'Update Report' }}</span>
|
|
827
|
+
</button>
|
|
828
|
+
</div>
|
|
829
|
+
</div>
|
|
830
|
+
</div>
|
|
831
|
+
}
|
|
404
832
|
</div>
|
|
405
|
-
`, styles: [":host{display:flex;align-items:center;justify-content:center;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif);color:#0f172a;box-sizing:border-box}.rpt-dialog-shell{display:flex;flex-direction:column;width:min(840px,92vw);max-height:min(540px,84vh);background:#fff;border-radius:10px;box-shadow:0 20px 40px -12px #0f172a47,0 0 0 1px #0f172a14;overflow:hidden;box-sizing:border-box;animation:rptDialogIn .18s cubic-bezier(.16,1,.3,1) forwards}@keyframes rptDialogIn{0%{opacity:0;transform:scale(.97) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}.rpt-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;box-sizing:border-box}.rpt-header-left{display:flex;align-items:center;gap:10px}.rpt-success-icon-badge{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;background:#ecfdf5;border:1px solid #a7f3d0;color:#059669;flex-shrink:0}.rpt-dialog-title{margin:0;font-size:.925rem;font-weight:700;color:#0f172a;line-height:1.25}.rpt-dialog-subtitle{margin:1px 0 0;font-size:.725rem;color:#64748b;line-height:1.2}.rpt-dialog-close{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:5px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-dialog-close:hover{background:#e2e8f0;color:#0f172a}.rpt-dialog-body{display:grid;grid-template-columns:280px 1fr;flex:1;min-height:360px;max-height:calc(84vh - 96px);overflow:hidden;box-sizing:border-box}@media (max-width: 780px){.rpt-dialog-body{grid-template-columns:1fr;overflow-y:auto}}.rpt-settings-column{display:flex;flex-direction:column;gap:9px;padding:12px 14px;background:#f8fafc;border-right:1px solid #e2e8f0;overflow-y:auto;box-sizing:border-box}.rpt-section-header{font-size:.675rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#475569;margin-bottom:1px}.rpt-form-group{display:flex;flex-direction:column;gap:3px}.rpt-label{font-size:.725rem;font-weight:600;color:#334155}.rpt-input{width:100%;box-sizing:border-box;height:28px;padding:4px 8px;font-size:.775rem;border:1px solid #cbd5e1;border-radius:5px;background:#fff;color:#0f172a;outline:none;transition:all .12s ease}.rpt-input:focus{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-input-wrapper{display:flex;align-items:center;background:#fff;border:1px solid #cbd5e1;border-radius:5px;height:28px;overflow:hidden;box-sizing:border-box;transition:all .12s ease}.rpt-slug-input-wrapper:focus-within{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-prefix{padding:0 0 0 8px;font-size:.725rem;color:#64748b;background:transparent;-webkit-user-select:none;user-select:none;line-height:28px}.rpt-slug-field{border:none!important;padding-left:2px!important;box-shadow:none!important;height:100%!important}.rpt-help-text{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-publish-card{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 10px;background:#fff;border:1px solid #e2e8f0;border-radius:6px;box-sizing:border-box}.rpt-publish-text{display:flex;flex-direction:column;gap:1px}.rpt-publish-title{font-size:.75rem;font-weight:600;color:#0f172a}.rpt-publish-desc{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-switch{position:relative;display:inline-block;width:32px;height:18px;flex-shrink:0}.rpt-switch input{opacity:0;width:0;height:0}.rpt-slider{position:absolute;cursor:pointer;inset:0;background-color:#cbd5e1;transition:.18s;border-radius:9999px}.rpt-slider:before{position:absolute;content:\"\";height:14px;width:14px;left:2px;bottom:2px;background-color:#fff;transition:.18s;border-radius:50%}input:checked+.rpt-slider{background-color:#2563eb}input:checked+.rpt-slider:before{transform:translate(14px)}.rpt-share-card{padding:6px 9px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:6px;box-sizing:border-box}.rpt-share-url-row{display:flex;align-items:center;gap:6px;overflow:hidden}.rpt-share-label{font-size:.675rem;font-weight:600;color:#1e40af;flex-shrink:0}.rpt-share-code{flex:1;font-size:.6875rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;color:#1e3a8a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rpt-btn-copy{display:inline-flex;align-items:center;gap:3px;padding:2px 6px;background:#fff;border:1px solid #93c5fd;border-radius:4px;font-size:.65rem;font-weight:600;color:#2563eb;cursor:pointer;flex-shrink:0;transition:all .12s ease;height:20px}.rpt-btn-copy:hover{background:#dbeafe}.rpt-preview-column{display:flex;flex-direction:column;background:#fff;overflow:hidden;min-width:0;box-sizing:border-box}.rpt-preview-header{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-bottom:1px solid #e2e8f0;background:#fff;flex-shrink:0;box-sizing:border-box}.rpt-preview-badge{display:flex;align-items:center;gap:6px;font-size:.725rem;font-weight:600;color:#0f172a}.rpt-live-dot{width:6px;height:6px;border-radius:50%;background:#10b981;box-shadow:0 0 0 2px #10b98133}.rpt-preview-hint{font-size:.675rem;color:#64748b}.rpt-preview-runtime-wrapper{flex:1;overflow-y:auto;overflow-x:hidden;padding:10px 12px;background:#f8fafc;box-sizing:border-box}.rpt-preview-runtime-wrapper::-webkit-scrollbar,.rpt-settings-column::-webkit-scrollbar{width:5px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb,.rpt-settings-column::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:9999px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb:hover,.rpt-settings-column::-webkit-scrollbar-thumb:hover{background:#94a3b8}.rpt-preview-card-frame{background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 1px 3px #0f172a0a;padding:10px;min-height:100%;box-sizing:border-box;overflow-x:hidden}.rpt-dialog-footer{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:#f8fafc;border-top:1px solid #e2e8f0;flex-shrink:0;box-sizing:border-box}.rpt-saved-pill{display:inline-flex;align-items:center;gap:4px;font-size:.7rem;font-weight:600;color:#15803d;background:#dcfce7;padding:2px 7px;border-radius:9999px}.rpt-footer-actions{display:flex;align-items:center;gap:8px;margin-left:auto}.rpt-btn{display:inline-flex;align-items:center;gap:5px;padding:5px 13px;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;transition:all .12s ease;border:1px solid transparent;box-sizing:border-box;line-height:1.4}.rpt-btn-secondary{background:#fff;border-color:#cbd5e1;color:#334155}.rpt-btn-secondary:hover{background:#f1f5f9;color:#0f172a;border-color:#94a3b8}.rpt-btn-primary{background:linear-gradient(135deg,#2563eb,#1d4ed8);color:#fff;box-shadow:0 1px 2px #2563eb33}.rpt-btn-primary:hover{background:linear-gradient(135deg,#1d4ed8,#1e40af);box-shadow:0 2px 4px #2563eb40}\n"] }]
|
|
833
|
+
`, styles: ["@keyframes rptSpin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.rpt-spin{display:inline-block;animation:rptSpin 1s linear infinite}@keyframes rptOverlayIn{0%{opacity:0}to{opacity:1}}@keyframes rptCardIn{0%{opacity:0;transform:scale(.96) translateY(6px)}to{opacity:1;transform:scale(1) translateY(0)}}.rpt-id-actions{display:flex;align-items:center;gap:6px;margin-top:4px}.rpt-id-action-btn{display:inline-flex;align-items:center;gap:5px;height:25px;padding:0 9px;font-size:.7rem;font-weight:500;color:#334155;background:#fff;border:1px solid #cbd5e1;border-radius:5px;cursor:pointer;transition:all .15s ease;box-sizing:border-box;white-space:nowrap;font-family:inherit;line-height:1}.rpt-id-action-btn:hover:not(:disabled){background:#f1f5f9;color:#0f172a;border-color:#94a3b8;box-shadow:0 1px 2px #0f172a0d}.rpt-id-action-btn:active:not(:disabled){background:#e2e8f0}.rpt-id-action-btn:disabled{opacity:.5;cursor:not-allowed}.rpt-id-action-btn.is-checking{color:#2563eb;border-color:#93c5fd;background:#eff6ff}.rpt-id-status{display:inline-flex;align-items:center;gap:5px;font-size:.72rem;line-height:1.3;margin:4px 0 0;padding:3px 8px;border-radius:5px;transition:all .15s ease;width:fit-content;max-width:100%;box-sizing:border-box}.rpt-id-status:empty{display:none}.rpt-status-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.rpt-id-status-success{color:#15803d;background:#f0fdf4;border:1px solid #bbf7d0}.rpt-id-status-warning{color:#b45309;background:#fffbeb;border:1px solid #fef3c7}.rpt-id-status-error{color:#b91c1c;background:#fef2f2;border:1px solid #fecaca}.rpt-id-status-checking{color:#1d4ed8;background:#eff6ff;border:1px solid #dbeafe}.rpt-update-overlay{position:absolute;inset:0;z-index:50;background:#0f172a73;backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box;animation:rptOverlayIn .16s cubic-bezier(.16,1,.3,1) forwards}.rpt-update-card{box-sizing:border-box;width:min(440px,100%);max-height:94%;background:#fff;border-radius:10px;box-shadow:0 20px 45px -8px #0f172a52,0 0 0 1px #0f172a14;border:1px solid #e2e8f0;overflow:hidden;display:flex;flex-direction:column;animation:rptCardIn .18s cubic-bezier(.16,1,.3,1) forwards}.rpt-update-card-header{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#fffbeb;border-bottom:1px solid #fef3c7;flex-shrink:0}.rpt-update-icon-badge{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;background:#fef3c7;border:1px solid #fde68a;color:#b45309;flex-shrink:0}.rpt-update-header-info{flex:1;min-width:0}.rpt-update-title{margin:0;font-size:.925rem;font-weight:700;color:#92400e;line-height:1.25}.rpt-update-subtitle{font-size:.7rem;color:#b45309;margin-top:1px;display:block}.rpt-update-card-body{padding:14px 16px;display:flex;flex-direction:column;gap:11px;overflow-y:auto;box-sizing:border-box}.rpt-update-prompt{margin:0;font-size:.8rem;line-height:1.45;color:#334155}.rpt-conflict-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:7px;padding:9px 12px;display:flex;flex-direction:column;gap:7px}.rpt-conflict-row{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:.735rem}.rpt-conflict-label{color:#64748b;font-weight:500;flex-shrink:0}.rpt-conflict-code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.72rem;background:#e2e8f0;color:#0f172a;padding:2px 6px;border-radius:4px;font-weight:600}.rpt-conflict-name{font-weight:600;color:#0f172a;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rpt-conflict-badge{font-size:.68rem;font-weight:600;padding:1px 7px;border-radius:9999px;background:#e0f2fe;color:#0369a1;border:1px solid #bae6fd}.rpt-overwrite-notice{display:flex;align-items:flex-start;gap:7px;font-size:.715rem;color:#b45309;background:#fffbeb;border:1px solid #fef3c7;padding:7px 10px;border-radius:6px;line-height:1.35}.rpt-overwrite-notice rpt-icon{flex-shrink:0;margin-top:1px}.rpt-update-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:10px 16px;background:#f8fafc;border-top:1px solid #e2e8f0;flex-shrink:0}.rpt-btn-confirm-save{background:linear-gradient(135deg,#2563eb,#1d4ed8);color:#fff;box-shadow:0 1px 2px #2563eb33}.rpt-btn-confirm-save:hover{background:linear-gradient(135deg,#1d4ed8,#1e40af);box-shadow:0 2px 4px #2563eb40}#rpt-dlg-id-error:empty,#rpt-dlg-id-status:empty{display:none}.rpt-dialog-footer,.rpt-footer-actions{flex-wrap:wrap;gap:8px}.rpt-btn,.rpt-dialog-close{min-height:36px}@media (max-width: 640px){.rpt-btn,.rpt-dialog-close{min-height:44px;min-width:44px}.rpt-footer-left{width:100%}}.rpt-field-error{color:#b91c1c;font-size:.8rem;margin:4px 0}button:disabled{opacity:.6;cursor:wait}textarea.rpt-input{resize:vertical;min-height:56px}.rpt-footer-left{min-width:0;padding-right:12px}:host{display:flex;width:100%;min-width:0;min-height:0;max-height:inherit;align-items:center;justify-content:center;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif);color:#0f172a;box-sizing:border-box}.rpt-dialog-shell{position:relative;display:flex;flex-direction:column;width:100%;max-width:100%;min-height:0;max-height:min(540px,calc(100vh - 32px));max-height:min(540px,calc(100dvh - 32px));background:#fff;border-radius:10px;box-shadow:0 20px 40px -12px #0f172a47,0 0 0 1px #0f172a14;overflow:hidden;box-sizing:border-box;animation:rptDialogIn .18s cubic-bezier(.16,1,.3,1) forwards}@keyframes rptDialogIn{0%{opacity:0;transform:scale(.97) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}.rpt-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;box-sizing:border-box}.rpt-header-left{display:flex;align-items:center;gap:10px}.rpt-review-icon-badge{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;background:#dbeafe;border:1px solid #a7f3d0;color:#1d4ed8;flex-shrink:0}.rpt-dialog-title{margin:0;font-size:.925rem;font-weight:700;color:#0f172a;line-height:1.25}.rpt-dialog-subtitle{margin:1px 0 0;font-size:.725rem;color:#64748b;line-height:1.2}.rpt-dialog-close{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:5px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-dialog-close:hover{background:#e2e8f0;color:#0f172a}.rpt-dialog-body{display:grid;grid-template-columns:280px minmax(0,1fr);grid-template-rows:minmax(0,1fr);flex:1;min-height:0;min-width:0;overflow:hidden;box-sizing:border-box}@media (max-width: 780px){.rpt-dialog-body{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto;overflow-y:auto;overscroll-behavior:contain}}.rpt-settings-column{display:flex;flex-direction:column;gap:9px;padding:12px 14px;background:#f8fafc;border-right:1px solid #e2e8f0;overflow-y:auto;min-height:0;overscroll-behavior:contain;box-sizing:border-box}.rpt-section-header{font-size:.675rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#475569;margin-bottom:1px}.rpt-form-group{display:flex;flex-direction:column;gap:3px}.rpt-label{font-size:.725rem;font-weight:600;color:#334155}.rpt-input{width:100%;box-sizing:border-box;height:28px;padding:4px 8px;font-size:.775rem;border:1px solid #cbd5e1;border-radius:5px;background:#fff;color:#0f172a;outline:none;transition:all .12s ease}.rpt-input:focus{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-input-wrapper{display:flex;align-items:center;background:#fff;border:1px solid #cbd5e1;border-radius:5px;height:28px;overflow:hidden;box-sizing:border-box;transition:all .12s ease}.rpt-slug-input-wrapper:focus-within{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-prefix{padding:0 0 0 8px;font-size:.725rem;color:#64748b;background:transparent;-webkit-user-select:none;user-select:none;line-height:28px}.rpt-slug-field{border:none!important;padding-left:2px!important;box-shadow:none!important;height:100%!important}.rpt-help-text{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-publish-card{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 10px;background:#fff;border:1px solid #e2e8f0;border-radius:6px;box-sizing:border-box}.rpt-publish-text{display:flex;flex-direction:column;gap:1px}.rpt-publish-title{font-size:.75rem;font-weight:600;color:#0f172a}.rpt-publish-desc{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-switch{position:relative;display:inline-block;width:32px;height:18px;flex-shrink:0}.rpt-switch input{opacity:0;width:0;height:0}.rpt-slider{position:absolute;cursor:pointer;inset:0;background-color:#cbd5e1;transition:.18s;border-radius:9999px}.rpt-slider:before{position:absolute;content:\"\";height:14px;width:14px;left:2px;bottom:2px;background-color:#fff;transition:.18s;border-radius:50%}input:checked+.rpt-slider{background-color:#2563eb}input:checked+.rpt-slider:before{transform:translate(14px)}.rpt-share-card{padding:6px 9px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:6px;box-sizing:border-box}.rpt-share-url-row{display:flex;align-items:center;gap:6px;overflow:hidden}.rpt-share-label{font-size:.675rem;font-weight:600;color:#1e40af;flex-shrink:0}.rpt-share-code{flex:1;font-size:.6875rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;color:#1e3a8a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rpt-btn-copy{display:inline-flex;align-items:center;gap:3px;padding:2px 6px;background:#fff;border:1px solid #93c5fd;border-radius:4px;font-size:.65rem;font-weight:600;color:#2563eb;cursor:pointer;flex-shrink:0;transition:all .12s ease;height:20px}.rpt-btn-copy:hover{background:#dbeafe}.rpt-preview-column{display:flex;flex-direction:column;background:#fff;overflow:hidden;min-width:0;box-sizing:border-box}.rpt-preview-header{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-bottom:1px solid #e2e8f0;background:#fff;flex-shrink:0;box-sizing:border-box}.rpt-preview-badge{display:flex;align-items:center;gap:6px;font-size:.725rem;font-weight:600;color:#0f172a}.rpt-live-dot{width:6px;height:6px;border-radius:50%;background:#10b981;box-shadow:0 0 0 2px #10b98133}.rpt-preview-hint{font-size:.675rem;color:#64748b}.rpt-preview-runtime-wrapper{flex:1;min-height:0;overscroll-behavior:contain;overflow-y:auto;overflow-x:hidden;padding:10px 12px;background:#f8fafc;box-sizing:border-box}.rpt-preview-runtime-wrapper::-webkit-scrollbar,.rpt-settings-column::-webkit-scrollbar{width:5px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb,.rpt-settings-column::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:9999px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb:hover,.rpt-settings-column::-webkit-scrollbar-thumb:hover{background:#94a3b8}.rpt-preview-card-frame{background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 1px 3px #0f172a0a;padding:10px;min-height:100%;box-sizing:border-box;overflow-x:hidden}@media (max-width: 780px){.rpt-settings-column{overflow-y:visible}.rpt-preview-runtime-wrapper{flex:none;max-height:320px}.rpt-preview-hint{display:none}}.rpt-dialog-footer{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:space-between;padding:8px 16px;background:#f8fafc;border-top:1px solid #e2e8f0;flex-shrink:0;box-sizing:border-box}.rpt-saved-pill{display:inline-flex;align-items:center;gap:4px;font-size:.7rem;font-weight:600;color:#15803d;background:#dcfce7;padding:2px 7px;border-radius:9999px}.rpt-footer-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-left:auto}.rpt-btn{display:inline-flex;align-items:center;gap:5px;padding:5px 13px;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;transition:all .12s ease;border:1px solid transparent;box-sizing:border-box;line-height:1.4}.rpt-btn-secondary{background:#fff;border-color:#cbd5e1;color:#334155}.rpt-btn-secondary:hover{background:#f1f5f9;color:#0f172a;border-color:#94a3b8}.rpt-btn-primary{background:linear-gradient(135deg,#2563eb,#1d4ed8);color:#fff;box-shadow:0 1px 2px #2563eb33}.rpt-btn-primary:hover{background:linear-gradient(135deg,#1d4ed8,#1e40af);box-shadow:0 2px 4px #2563eb40}\n"] }]
|
|
406
834
|
}] });
|
|
407
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXNhdmVkLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL2RpYWxvZ3MvcmVwb3J0LXNhdmVkLWRpYWxvZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUM3RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7O0FBWWxGLFNBQVMsTUFBTSxDQUFDLEdBQVc7SUFDekIsT0FBTyxHQUFHO1NBQ1AsV0FBVyxFQUFFO1NBQ2IsSUFBSSxFQUFFO1NBQ04sT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7U0FDeEIsT0FBTyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUM7U0FDeEIsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBa29CRCxNQUFNLE9BQU8sMEJBQTBCO0lBQ3BCLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQSxTQUFrQyxDQUFBLENBQUMsQ0FBQztJQUN2RCxJQUFJLEdBQUcsTUFBTSxDQUF3QixXQUFXLENBQUMsQ0FBQztJQUNsRCxLQUFLLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbkMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFcEQsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzFCLFNBQVMsR0FBRyxNQUFNLENBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsU0FBUyxJQUFJLFNBQVMsQ0FDcEUsQ0FBQztJQUVPLElBQUksR0FBRyxNQUFNLENBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksaUJBQWlCLENBQUMsQ0FBQztJQUM3RCxJQUFJLEdBQUcsTUFBTSxDQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLFNBQVMsR0FBRyxNQUFNLENBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLENBQUM7SUFDdkYsV0FBVyxHQUFHLE1BQU0sQ0FBVSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUUvRCxNQUFNLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLGlCQUFpQixHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFaEQsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDakMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbEUsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUN6QixDQUFDLENBQUMsQ0FBQztJQUVNLGlCQUFpQixHQUFHLFFBQVEsQ0FBbUIsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM3RCxHQUFHLElBQUksQ0FBQyxNQUFNO1FBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDakIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDakIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDM0IsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7S0FDaEMsQ0FBQyxDQUFDLENBQUM7SUFFSixZQUFZLENBQUMsT0FBZTtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2Qiw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzVELFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDakQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixNQUFNLE9BQU8sR0FBcUI7WUFDaEMsR0FBRyxJQUFJLENBQUMsTUFBTTtZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1lBQzVDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLFNBQVM7WUFDL0MsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDL0IsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1NBQ3BDLENBQUM7UUFFRixxRUFBcUU7UUFDckUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3ZDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDO1lBQy9ELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLENBQUM7U0FDbEYsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFnRCxrQkFBa0I7UUFDdEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUVwRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQzthQUFNLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDekMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO3dHQXJGVSwwQkFBMEI7NEZBQTFCLDBCQUEwQixtRkEzbkIzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBKVCw2ME5BNUpTLFlBQVksOEJBQUUsV0FBVywrbUJBQUUsc0JBQXNCLHNXQUFFLGdCQUFnQjs7NEZBNm5CbEUsMEJBQTBCO2tCQWhvQnRDLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLENBQUMsbUJBQzdELHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwSlQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IERpYWxvZ1JlZiwgRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9jZGsvZGlhbG9nJztcbmltcG9ydCB7IFJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRTdG9yZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9wZXJzaXN0ZW5jZS9zZXJ2aWNlcy9yZXBvcnQtc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRSdW50aW1lQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vcnVudGltZS9yZXBvcnQtcnVudGltZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSRVBPUlRJTkdfQ09ORklHIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS90b2tlbnMvcmVwb3J0aW5nLWNvbmZpZy50b2tlbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0U2F2ZWREaWFsb2dEYXRhIHtcbiAgcmVwb3J0OiBSZXBvcnREZWZpbml0aW9uO1xuICByb3V0ZUJhc2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0U2F2ZWREaWFsb2dSZXN1bHQge1xuICBhY3Rpb246ICdiYWNrX3RvX2Rlc2lnbmVyJyB8ICdvcGVuX2xpdmVfcGFnZSc7XG4gIHJlcG9ydDogUmVwb3J0RGVmaW5pdGlvbjtcbn1cblxuZnVuY3Rpb24gdG9TbHVnKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbFxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKC9bXlxcd1xccy1dL2csICcnKVxuICAgIC5yZXBsYWNlKC9bXFxzXy1dKy9nLCAnLScpXG4gICAgLnJlcGxhY2UoL14tK3wtKyQvZywgJycpO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcmVwb3J0LXNhdmVkLWRpYWxvZycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZXBvcnRSdW50aW1lQ29tcG9uZW50LCBScHRJY29uQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJwdC1kaWFsb2ctc2hlbGxcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJkaWFsb2ctdGl0bGVcIj5cbiAgICAgIDwhLS0gTW9kYWwgSGVhZGVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJwdC1kaWFsb2ctaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXN1Y2Nlc3MtaWNvbi1iYWRnZVwiPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGVja1wiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGgyIGlkPVwiZGlhbG9nLXRpdGxlXCIgY2xhc3M9XCJycHQtZGlhbG9nLXRpdGxlXCI+UmVwb3J0IFNhdmVkIFN1Y2Nlc3NmdWxseTwvaDI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInJwdC1kaWFsb2ctc3VidGl0bGVcIj5Db25maWd1cmUgcGFnZSByb3V0aW5nLCBuYXZpZ2F0aW9uIHBsYWNlbWVudCwgYW5kIHRlc3QgdGhlIGdlbmVyYXRlZCBmb3JtLjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInJwdC1kaWFsb2ctY2xvc2VcIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZSgnYmFja190b19kZXNpZ25lcicpXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2UgZGlhbG9nXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwieFwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBNb2RhbCBCb2R5IChUd28tQ29sdW1uIFNwbGl0KSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJycHQtZGlhbG9nLWJvZHlcIj5cbiAgICAgICAgPCEtLSBMZWZ0IENvbHVtbjogU2V0dGluZ3MgJiBQdWJsaXNoaW5nIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNldHRpbmdzLWNvbHVtblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc2VjdGlvbi1oZWFkZXJcIj5QYWdlIE5hdmlnYXRpb24gJiBTZXR0aW5nczwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBSZXBvcnQgTmFtZSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwdC1sYWJlbFwiIGZvcj1cInJwdC1kbGctbmFtZVwiPkRpc3BsYXkgTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJycHQtZGxnLW5hbWVcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicnB0LWlucHV0XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwibmFtZSgpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25OYW1lQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2FsZXMgUmVnaXN0ZXJcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVVJMIFNsdWcgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1mb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJycHQtbGFiZWxcIiBmb3I9XCJycHQtZGxnLXNsdWdcIj5VUkwgU2x1ZzwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNsdWctaW5wdXQtd3JhcHBlclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1zbHVnLXByZWZpeFwiPi97eyBiYXNlUm91dGUoKSB9fS88L3NwYW4+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIGlkPVwicnB0LWRsZy1zbHVnXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtaW5wdXQgcnB0LXNsdWctZmllbGRcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNsdWcoKVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2x1Zy5zZXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJzYWxlLXJlcG9ydFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWhlbHAtdGV4dFwiPkRpcmVjdCBVUkwgZm9yIHVzZXJzIHRvIHZpZXcgdGhpcyByZXBvcnQgcGFnZS48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIE1lbnUgR3JvdXAgLyBDYXRlZ29yeSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwdC1sYWJlbFwiIGZvcj1cInJwdC1kbGctZ3JvdXBcIj5NZW51IEdyb3VwPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cInJwdC1kbGctZ3JvdXBcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicnB0LWlucHV0XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwibWVudUdyb3VwKClcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJtZW51R3JvdXAuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2FsZXMsIEZpbmFuY2UsIE9wZXJhdGlvbnNcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWhlbHAtdGV4dFwiPlNpZGViYXIgZm9sZGVyIGhlYWRpbmcgd2hlcmUgdGhpcyBwYWdlIGFwcGVhcnMuPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBQdWJsaXNoIHRvIE1lbnUgVG9nZ2xlIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHVibGlzaC1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXB1Ymxpc2gtdGV4dFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1wdWJsaXNoLXRpdGxlXCI+UHVibGlzaCB0byBNZW51PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1wdWJsaXNoLWRlc2NcIj5EaXNwbGF5IGluIHRoZSBzaWRlYmFyIG5hdmlnYXRpb24uPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJycHQtc3dpdGNoXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNQdWJsaXNoZWQoKVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJpc1B1Ymxpc2hlZC5zZXQoIWlzUHVibGlzaGVkKCkpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtc2xpZGVyXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gQ29weSBVUkwgQm94IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc2hhcmUtY2FyZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zaGFyZS11cmwtcm93XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXNoYXJlLWxhYmVsXCI+TGl2ZTo8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwicnB0LXNoYXJlLWNvZGVcIj57eyBmdWxsUm91dGUoKSB9fTwvY29kZT5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWJ0bi1jb3B5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29weVJvdXRlKClcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJjb3BpZWQoKSA/ICdDb3BpZWQhJyA6ICdDb3B5IFJvdXRlJ1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gW25hbWVdPVwiY29waWVkKCkgPyAnY2hlY2snIDogJ2NvcHknXCIgW3NpemVdPVwiMTFcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNvcGllZCgpID8gJ0NvcGllZCcgOiAnQ29weScgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUmlnaHQgQ29sdW1uOiBJbnRlcmFjdGl2ZSBGb3JtIExpdmUgUHJldmlldyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1wcmV2aWV3LWNvbHVtblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHJldmlldy1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHJldmlldy1iYWRnZVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1saXZlLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4+TGl2ZSBHZW5lcmF0ZWQgRm9ybTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtcHJldmlldy1oaW50XCI+SW50ZXJhY3RpdmUgcHJldmlldyBtYXRjaGluZyBydW50aW1lIHBhZ2U8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXByZXZpZXctcnVudGltZS13cmFwcGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXByZXZpZXctY2FyZC1mcmFtZVwiPlxuICAgICAgICAgICAgICA8cnB0LXJ1bnRpbWUgW3JlcG9ydF09XCJjdXJyZW50UHJldmlld0RlZigpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIE1vZGFsIEZvb3RlciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJycHQtZGlhbG9nLWZvb3RlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvb3Rlci1sZWZ0XCI+XG4gICAgICAgICAgQGlmIChzYXZlZFN0YXRlTWVzc2FnZSgpKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1zYXZlZC1waWxsXCI+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hlY2tcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgIHt7IHNhdmVkU3RhdGVNZXNzYWdlKCkgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvb3Rlci1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInJwdC1idG4gcnB0LWJ0bi1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsb3NlKCdiYWNrX3RvX2Rlc2lnbmVyJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEJhY2sgdG8gRGVzaWduZXJcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicnB0LWJ0biBycHQtYnRuLXByaW1hcnlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5MaXZlUGFnZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImV4dGVybmFsLWxpbmtcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICA8c3Bhbj5PcGVuIExpdmUgUGFnZTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBmb250LWZhbWlseTogdmFyKC0tcnB0LWZvbnQtZmFtaWx5LCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXCJTZWdvZSBVSVwiLCBSb2JvdG8sIHNhbnMtc2VyaWYpO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtZGlhbG9nLXNoZWxsIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgd2lkdGg6IG1pbig4NDBweCwgOTJ2dyk7XG4gICAgICBtYXgtaGVpZ2h0OiBtaW4oNTQwcHgsIDg0dmgpO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICBib3gtc2hhZG93OiAwIDIwcHggNDBweCAtMTJweCByZ2JhKDE1LCAyMywgNDIsIDAuMjgpLCAwIDAgMCAxcHggcmdiYSgxNSwgMjMsIDQyLCAwLjA4KTtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgYW5pbWF0aW9uOiBycHREaWFsb2dJbiAxODBtcyBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKSBmb3J3YXJkcztcbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzIHJwdERpYWxvZ0luIHtcbiAgICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTcpIHRyYW5zbGF0ZVkoNHB4KTtcbiAgICAgIH1cbiAgICAgIHRvIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGVZKDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5ycHQtZGlhbG9nLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTZweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LWhlYWRlci1sZWZ0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiAxMHB4O1xuICAgIH1cblxuICAgIC5ycHQtc3VjY2Vzcy1pY29uLWJhZGdlIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB3aWR0aDogMjZweDtcbiAgICAgIGhlaWdodDogMjZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGJhY2tncm91bmQ6ICNlY2ZkZjU7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYTdmM2QwO1xuICAgICAgY29sb3I6ICMwNTk2Njk7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LWRpYWxvZy10aXRsZSB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBmb250LXNpemU6IDAuOTI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMjU7XG4gICAgfVxuXG4gICAgLnJwdC1kaWFsb2ctc3VidGl0bGUge1xuICAgICAgbWFyZ2luOiAxcHggMCAwIDA7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBsaW5lLWhlaWdodDogMS4yO1xuICAgIH1cblxuICAgIC5ycHQtZGlhbG9nLWNsb3NlIHtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6ICM5NGEzYjg7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBwYWRkaW5nOiA0cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTJzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1kaWFsb2ctY2xvc2U6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2UyZThmMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cblxuICAgIC5ycHQtZGlhbG9nLWJvZHkge1xuICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMjgwcHggMWZyO1xuICAgICAgZmxleDogMTtcbiAgICAgIG1pbi1oZWlnaHQ6IDM2MHB4O1xuICAgICAgbWF4LWhlaWdodDogY2FsYyg4NHZoIC0gOTZweCk7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICBAbWVkaWEgKG1heC13aWR0aDogNzgwcHgpIHtcbiAgICAgIC5ycHQtZGlhbG9nLWJvZHkge1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAucnB0LXNldHRpbmdzLWNvbHVtbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogOXB4O1xuICAgICAgcGFkZGluZzogMTJweCAxNHB4O1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LXNlY3Rpb24taGVhZGVyIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XG4gICAgICBjb2xvcjogIzQ3NTU2OTtcbiAgICAgIG1hcmdpbi1ib3R0b206IDFweDtcbiAgICB9XG5cbiAgICAucnB0LWZvcm0tZ3JvdXAge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDNweDtcbiAgICB9XG5cbiAgICAucnB0LWxhYmVsIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgfVxuXG4gICAgLnJwdC1pbnB1dCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBoZWlnaHQ6IDI4cHg7XG4gICAgICBwYWRkaW5nOiA0cHggOHB4O1xuICAgICAgZm9udC1zaXplOiAwLjc3NXJlbTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjYmQ1ZTE7XG4gICAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTJzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1pbnB1dDpmb2N1cyB7XG4gICAgICBib3JkZXItY29sb3I6ICMyNTYzZWI7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgzNywgOTksIDIzNSwgMC4xNCk7XG4gICAgfVxuXG4gICAgLnJwdC1zbHVnLWlucHV0LXdyYXBwZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIGhlaWdodDogMjhweDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTJzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1zbHVnLWlucHV0LXdyYXBwZXI6Zm9jdXMtd2l0aGluIHtcbiAgICAgIGJvcmRlci1jb2xvcjogIzI1NjNlYjtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjE0KTtcbiAgICB9XG5cbiAgICAucnB0LXNsdWctcHJlZml4IHtcbiAgICAgIHBhZGRpbmc6IDAgMCAwIDhweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBsaW5lLWhlaWdodDogMjhweDtcbiAgICB9XG5cbiAgICAucnB0LXNsdWctZmllbGQge1xuICAgICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDJweCAhaW1wb3J0YW50O1xuICAgICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgLnJwdC1oZWxwLXRleHQge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBsaW5lLWhlaWdodDogMS4yO1xuICAgIH1cblxuICAgIC5ycHQtcHVibGlzaC1jYXJkIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgZ2FwOiAxMHB4O1xuICAgICAgcGFkZGluZzogNnB4IDEwcHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1wdWJsaXNoLXRleHQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDFweDtcbiAgICB9XG5cbiAgICAucnB0LXB1Ymxpc2gtdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cblxuICAgIC5ycHQtcHVibGlzaC1kZXNjIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMjtcbiAgICB9XG5cbiAgICAvKiBDb21wYWN0IHRvZ2dsZSBzd2l0Y2ggKi9cbiAgICAucnB0LXN3aXRjaCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICB3aWR0aDogMzJweDtcbiAgICAgIGhlaWdodDogMThweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cblxuICAgIC5ycHQtc3dpdGNoIGlucHV0IHtcbiAgICAgIG9wYWNpdHk6IDA7XG4gICAgICB3aWR0aDogMDtcbiAgICAgIGhlaWdodDogMDtcbiAgICB9XG5cbiAgICAucnB0LXNsaWRlciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBpbnNldDogMDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjYmQ1ZTE7XG4gICAgICB0cmFuc2l0aW9uOiAwLjE4cztcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICB9XG5cbiAgICAucnB0LXNsaWRlcjpiZWZvcmUge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgY29udGVudDogXCJcIjtcbiAgICAgIGhlaWdodDogMTRweDtcbiAgICAgIHdpZHRoOiAxNHB4O1xuICAgICAgbGVmdDogMnB4O1xuICAgICAgYm90dG9tOiAycHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICAgIHRyYW5zaXRpb246IDAuMThzO1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgIH1cblxuICAgIGlucHV0OmNoZWNrZWQgKyAucnB0LXNsaWRlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjU2M2ViO1xuICAgIH1cblxuICAgIGlucHV0OmNoZWNrZWQgKyAucnB0LXNsaWRlcjpiZWZvcmUge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDE0cHgpO1xuICAgIH1cblxuICAgIC5ycHQtc2hhcmUtY2FyZCB7XG4gICAgICBwYWRkaW5nOiA2cHggOXB4O1xuICAgICAgYmFja2dyb3VuZDogI2VmZjZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiZmRiZmU7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtc2hhcmUtdXJsLXJvdyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG5cbiAgICAucnB0LXNoYXJlLWxhYmVsIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMxZTQwYWY7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LXNoYXJlLWNvZGUge1xuICAgICAgZmxleDogMTtcbiAgICAgIGZvbnQtc2l6ZTogMC42ODc1cmVtO1xuICAgICAgZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBtb25vc3BhY2U7XG4gICAgICBjb2xvcjogIzFlM2E4YTtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tY29weSB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDNweDtcbiAgICAgIHBhZGRpbmc6IDJweCA2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzkzYzVmZDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzI1NjNlYjtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTJzIGVhc2U7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tY29weTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGJlYWZlO1xuICAgIH1cblxuICAgIC8qIFByZXZpZXcgQ29sdW1uICovXG4gICAgLnJwdC1wcmV2aWV3LWNvbHVtbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LXByZXZpZXctaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogOHB4IDE0cHg7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1wcmV2aWV3LWJhZGdlIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cblxuICAgIC5ycHQtbGl2ZS1kb3Qge1xuICAgICAgd2lkdGg6IDZweDtcbiAgICAgIGhlaWdodDogNnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgYmFja2dyb3VuZDogIzEwYjk4MTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDE2LCAxODUsIDEyOSwgMC4yKTtcbiAgICB9XG5cbiAgICAucnB0LXByZXZpZXctaGludCB7XG4gICAgICBmb250LXNpemU6IDAuNjc1cmVtO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgfVxuXG4gICAgLnJwdC1wcmV2aWV3LXJ1bnRpbWUtd3JhcHBlciB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTJweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtcHJldmlldy1ydW50aW1lLXdyYXBwZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLFxuICAgIC5ycHQtc2V0dGluZ3MtY29sdW1uOjotd2Via2l0LXNjcm9sbGJhciB7XG4gICAgICB3aWR0aDogNXB4O1xuICAgIH1cblxuICAgIC5ycHQtcHJldmlldy1ydW50aW1lLXdyYXBwZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iLFxuICAgIC5ycHQtc2V0dGluZ3MtY29sdW1uOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG4gICAgICBiYWNrZ3JvdW5kOiAjY2JkNWUxO1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgIH1cblxuICAgIC5ycHQtcHJldmlldy1ydW50aW1lLXdyYXBwZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyLFxuICAgIC5ycHQtc2V0dGluZ3MtY29sdW1uOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjOTRhM2I4O1xuICAgIH1cblxuICAgIC5ycHQtcHJldmlldy1jYXJkLWZyYW1lIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMTUsIDIzLCA0MiwgMC4wNCk7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgbWluLWhlaWdodDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLyogTW9kYWwgRm9vdGVyICovXG4gICAgLnJwdC1kaWFsb2ctZm9vdGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1zYXZlZC1waWxsIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNHB4O1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMxNTgwM2Q7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGNmY2U3O1xuICAgICAgcGFkZGluZzogMnB4IDdweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICB9XG5cbiAgICAucnB0LWZvb3Rlci1hY3Rpb25zIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICB9XG5cbiAgICAucnB0LWJ0biB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDVweDtcbiAgICAgIHBhZGRpbmc6IDVweCAxM3B4O1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjEycyBlYXNlO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICB9XG5cbiAgICAucnB0LWJ0bi1zZWNvbmRhcnkge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1jb2xvcjogI2NiZDVlMTtcbiAgICAgIGNvbG9yOiAjMzM0MTU1O1xuICAgIH1cblxuICAgIC5ycHQtYnRuLXNlY29uZGFyeTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBib3JkZXItY29sb3I6ICM5NGEzYjg7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tcHJpbWFyeSB7XG4gICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMjU2M2ViLCAjMWQ0ZWQ4KTtcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMzcsIDk5LCAyMzUsIDAuMik7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tcHJpbWFyeTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMWQ0ZWQ4LCAjMWU0MGFmKTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjI1KTtcbiAgICB9XG4gIGBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRTYXZlZERpYWxvZ0NvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nUmVmID0gaW5qZWN0KERpYWxvZ1JlZjxSZXBvcnRTYXZlZERpYWxvZ1Jlc3VsdD4pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGEgPSBpbmplY3Q8UmVwb3J0U2F2ZWREaWFsb2dEYXRhPihESUFMT0dfREFUQSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUgPSBpbmplY3QoUmVwb3J0U3RvcmVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRpbmdDb25maWcgPSBpbmplY3QoUkVQT1JUSU5HX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHJlYWRvbmx5IHJlcG9ydCA9IHRoaXMuZGF0YS5yZXBvcnQ7XG4gIHJlYWRvbmx5IGJhc2VSb3V0ZSA9IHNpZ25hbDxzdHJpbmc+KFxuICAgIHRoaXMuZGF0YS5yb3V0ZUJhc2UgfHwgdGhpcy5yZXBvcnRpbmdDb25maWc/LnJvdXRlQmFzZSB8fCAncmVwb3J0cydcbiAgKTtcblxuICByZWFkb25seSBuYW1lID0gc2lnbmFsPHN0cmluZz4odGhpcy5yZXBvcnQubmFtZSB8fCAnVW50aXRsZWQgUmVwb3J0Jyk7XG4gIHJlYWRvbmx5IHNsdWcgPSBzaWduYWw8c3RyaW5nPih0aGlzLnJlcG9ydC5zbHVnIHx8IHRvU2x1Zyh0aGlzLnJlcG9ydC5uYW1lIHx8ICdyZXBvcnQnKSk7XG4gIHJlYWRvbmx5IG1lbnVHcm91cCA9IHNpZ25hbDxzdHJpbmc+KHRoaXMucmVwb3J0Lm1lbnVHcm91cCB8fCB0aGlzLnJlcG9ydC5jYXRlZ29yeSB8fCAnR2VuZXJhbCcpO1xuICByZWFkb25seSBpc1B1Ymxpc2hlZCA9IHNpZ25hbDxib29sZWFuPih0aGlzLnJlcG9ydC5pc1B1Ymxpc2hlZCA/PyB0cnVlKTtcblxuICByZWFkb25seSBjb3BpZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzYXZlZFN0YXRlTWVzc2FnZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBmdWxsUm91dGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMuYmFzZVJvdXRlKCkucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpO1xuICAgIGNvbnN0IHMgPSB0aGlzLnNsdWcoKS5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCAnJykgfHwgdGhpcy5yZXBvcnQuaWQ7XG4gICAgcmV0dXJuIGAvJHtiYXNlfS8ke3N9YDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFByZXZpZXdEZWYgPSBjb21wdXRlZDxSZXBvcnREZWZpbml0aW9uPigoKSA9PiAoe1xuICAgIC4uLnRoaXMucmVwb3J0LFxuICAgIG5hbWU6IHRoaXMubmFtZSgpLFxuICAgIHNsdWc6IHRoaXMuc2x1ZygpLFxuICAgIG1lbnVHcm91cDogdGhpcy5tZW51R3JvdXAoKSxcbiAgICBpc1B1Ymxpc2hlZDogdGhpcy5pc1B1Ymxpc2hlZCgpLFxuICB9KSk7XG5cbiAgb25OYW1lQ2hhbmdlKG5ld05hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubmFtZS5zZXQobmV3TmFtZSk7XG4gICAgLy8gSWYgc2x1ZyB3YXMgYXV0by1kZXJpdmVkLCBrZWVwIGl0IHVwZGF0ZWRcbiAgICBpZiAoIXRoaXMucmVwb3J0LnNsdWcpIHtcbiAgICAgIHRoaXMuc2x1Zy5zZXQodG9TbHVnKG5ld05hbWUpKTtcbiAgICB9XG4gIH1cblxuICBjb3B5Um91dGUoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5jbGlwYm9hcmQpIHtcbiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRoaXMuZnVsbFJvdXRlKCkpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmNvcGllZC5zZXQodHJ1ZSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb3BpZWQuc2V0KGZhbHNlKSwgMjAwMCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzYXZlVXBkYXRlZERlZmluaXRpb24oKTogUmVwb3J0RGVmaW5pdGlvbiB7XG4gICAgY29uc3QgdXBkYXRlZDogUmVwb3J0RGVmaW5pdGlvbiA9IHtcbiAgICAgIC4uLnRoaXMucmVwb3J0LFxuICAgICAgbmFtZTogdGhpcy5uYW1lKCkudHJpbSgpIHx8IHRoaXMucmVwb3J0Lm5hbWUsXG4gICAgICBzbHVnOiB0aGlzLnNsdWcoKS50cmltKCkgfHwgdG9TbHVnKHRoaXMubmFtZSgpKSxcbiAgICAgIG1lbnVHcm91cDogdGhpcy5tZW51R3JvdXAoKS50cmltKCkgfHwgdW5kZWZpbmVkLFxuICAgICAgaXNQdWJsaXNoZWQ6IHRoaXMuaXNQdWJsaXNoZWQoKSxcbiAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG5cbiAgICAvLyBTYXZlIHRvIHBlcnNpc3RlbmNlIHN0b3JlIHNvIG5hdmlnYXRpb24gJiBtZW51IHVwZGF0ZXMgaW1tZWRpYXRlbHlcbiAgICB0aGlzLnN0b3JlLnNhdmVSZXBvcnQodXBkYXRlZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHRoaXMuc2F2ZWRTdGF0ZU1lc3NhZ2Uuc2V0KCdTZXR0aW5ncyBzeW5jaHJvbml6ZWQnKSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLndhcm4oJ1tSZXBvcnRTYXZlZERpYWxvZ10gRmFpbGVkIHRvIHN5bmMgc2V0dGluZ3M6JywgZXJyKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB1cGRhdGVkO1xuICB9XG5cbiAgY2xvc2UoYWN0aW9uOiAnYmFja190b19kZXNpZ25lcicgfCAnb3Blbl9saXZlX3BhZ2UnID0gJ2JhY2tfdG9fZGVzaWduZXInKTogdm9pZCB7XG4gICAgY29uc3QgdXBkYXRlZCA9IHRoaXMuc2F2ZVVwZGF0ZWREZWZpbml0aW9uKCk7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyBhY3Rpb24sIHJlcG9ydDogdXBkYXRlZCB9KTtcbiAgfVxuXG4gIG9wZW5MaXZlUGFnZSgpOiB2b2lkIHtcbiAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5zYXZlVXBkYXRlZERlZmluaXRpb24oKTtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh7IGFjdGlvbjogJ29wZW5fbGl2ZV9wYWdlJywgcmVwb3J0OiB1cGRhdGVkIH0pO1xuXG4gICAgY29uc3Qgcm91dGUgPSB0aGlzLmZ1bGxSb3V0ZSgpO1xuICAgIGlmICh0aGlzLnJvdXRlcikge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChyb3V0ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByb3V0ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
835
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXNhdmVkLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL2RpYWxvZ3MvcmVwb3J0LXNhdmVkLWRpYWxvZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUcvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDckUsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDeEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFDN0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0RB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5U1QsZ3BZQTNTUyxZQUFZLDhCQUFFLFdBQVcsOG1CQUFFLFVBQVUsMExBQUUsYUFBYSw4RUFBRSxzQkFBc0Isc1dBQUUsZ0JBQWdCOzs0RkFvbUM3RiwwQkFBMEI7a0JBdm1DdEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixDQUFDLG1CQUN4Rix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5U1QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtTY3JvbGxhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgeyBBMTF5TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgUmVwb3J0U2F2ZU9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvcmVwb3J0LXBlcnNpc3RlbmNlLmNvbnRyYWN0JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdXRpbGl0aWVzL2lkLWdlbmVyYXRvcic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgZGVmZXIsIGZpbmFsaXplLCBvZiwgc3dpdGNoTWFwLCB0aHJvd0Vycm9yLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEaWFsb2dSZWYsIERJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RpYWxvZyc7XG5pbXBvcnQgeyBSZXBvcnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRlZmluaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0U3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vcGVyc2lzdGVuY2Uvc2VydmljZXMvcmVwb3J0LXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0UnVudGltZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3J1bnRpbWUvcmVwb3J0LXJ1bnRpbWUuY29tcG9uZW50JztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUkVQT1JUSU5HX0NPTkZJRyB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdG9rZW5zL3JlcG9ydGluZy1jb25maWcudG9rZW4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydFNhdmVkRGlhbG9nRGF0YSB7XG4gIHJlcG9ydDogUmVwb3J0RGVmaW5pdGlvbjtcbiAgcm91dGVCYXNlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydFNhdmVkRGlhbG9nUmVzdWx0IHtcbiAgYWN0aW9uOiAnYmFja190b19kZXNpZ25lcicgfCAnb3Blbl9saXZlX3BhZ2UnO1xuICByZXBvcnQ6IFJlcG9ydERlZmluaXRpb247XG59XG5cbmludGVyZmFjZSBVcGRhdGVDb25maXJtYXRpb24ge1xuICByZXBvcnQ6IFJlcG9ydERlZmluaXRpb247XG4gIGFjdGlvbjogUmVwb3J0U2F2ZWREaWFsb2dSZXN1bHRbJ2FjdGlvbiddO1xuICBleHBlY3RlZFZlcnNpb246IG51bWJlcjtcbiAgZXhpc3RpbmdOYW1lOiBzdHJpbmc7XG4gIGNvbnRleHRLZXk6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gdG9TbHVnKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbFxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKC9bXlxcd1xccy1dL2csICcnKVxuICAgIC5yZXBsYWNlKC9bXFxzXy1dKy9nLCAnLScpXG4gICAgLnJlcGxhY2UoL14tK3wtKyQvZywgJycpO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcmVwb3J0LXNhdmVkLWRpYWxvZycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBBMTF5TW9kdWxlLCBDZGtTY3JvbGxhYmxlLCBSZXBvcnRSdW50aW1lQ29tcG9uZW50LCBScHRJY29uQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJwdC1kaWFsb2ctc2hlbGxcIiBbYXR0ci5hcmlhLWJ1c3ldPVwiaXNTYXZpbmcoKSB8fCBpc0NoZWNraW5nSWQoKVwiPlxuICAgICAgPCEtLSBSZXZpZXcgYmVmb3JlIHRoZSBvbmx5IHBlcnNpc3RlbmNlIHJlcXVlc3QgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicnB0LWRpYWxvZy1oZWFkZXJcIiBbYXR0ci5pbmVydF09XCJ1cGRhdGVDb25maXJtYXRpb24oKSA/ICcnIDogbnVsbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1yZXZpZXctaWNvbi1iYWRnZVwiPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJzZXR0aW5nc1wiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGgyIGlkPVwiZGlhbG9nLXRpdGxlXCIgY2xhc3M9XCJycHQtZGlhbG9nLXRpdGxlXCI+UmV2aWV3IGFuZCBTYXZlIFJlcG9ydDwvaDI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInJwdC1kaWFsb2ctc3VidGl0bGVcIj5SZXZpZXcgdGhlIHJlcG9ydCBkZXRhaWxzIGFuZCBwcmV2aWV3LCB0aGVuIHNhdmUgeW91ciBjaGFuZ2VzLjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInJwdC1kaWFsb2ctY2xvc2VcIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZSgpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTYXZpbmcoKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlIGRpYWxvZ1wiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNsb3NlXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIE1vZGFsIEJvZHkgKFR3by1Db2x1bW4gU3BsaXQpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJwdC1kaWFsb2ctYm9keVwiIGNka1Njcm9sbGFibGUgW2F0dHIuaW5lcnRdPVwidXBkYXRlQ29uZmlybWF0aW9uKCkgfHwgaXNQcmVwYXJpbmdTYXZlKCkgPyAnJyA6IG51bGxcIj5cbiAgICAgICAgPCEtLSBMZWZ0IENvbHVtbjogU2V0dGluZ3MgJiBQdWJsaXNoaW5nIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNldHRpbmdzLWNvbHVtblwiIGNka1Njcm9sbGFibGU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zZWN0aW9uLWhlYWRlclwiPlBhZ2UgTmF2aWdhdGlvbiAmIFNldHRpbmdzPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwdC1sYWJlbFwiIGZvcj1cInJwdC1kbGctaWRcIj5SZXBvcnQgSUQ8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IGlkPVwicnB0LWRsZy1pZFwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJycHQtaW5wdXRcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyZXBvcnRJZCgpXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uSWRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmluZygpXCIgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImlkRXJyb3IoKSA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJpZEVycm9yKCkgPyAncnB0LWRsZy1pZC1oZWxwIHJwdC1kbGctaWQtZXJyb3IgcnB0LWRsZy1pZC1zdGF0dXMnIDogJ3JwdC1kbGctaWQtaGVscCBycHQtZGxnLWlkLXN0YXR1cydcIiBwbGFjZWhvbGRlcj1cImUuZy4gcnB0LXNhbGVzLXN1bW1hcnlcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1pZC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJwdC1pZC1hY3Rpb24tYnRuXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTYXZpbmcoKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJhbmRvbWl6ZUlkKClcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiR2VuZXJhdGUgYSByYW5kb20gdW5pcXVlIHJlcG9ydCBJRFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInNwYXJrbGVzXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPlJhbmRvbSBJRDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJwdC1pZC1hY3Rpb24tYnRuXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtY2hlY2tpbmddPVwiaXNDaGVja2luZ0lkKClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmluZygpIHx8IGlzQ2hlY2tpbmdJZCgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidmVyaWZ5SWQoKVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJWZXJpZnkgSUQgYXZhaWxhYmlsaXR5IGluIGRhdGFiYXNlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAoaXNDaGVja2luZ0lkKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwicmVmcmVzaFwiIFtzaXplXT1cIjEyXCIgY2xhc3M9XCJycHQtc3BpblwiIC8+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5DaGVja2luZy4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwic2VhcmNoXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+VmVyaWZ5IElEPC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwicnB0LWRsZy1pZC1oZWxwXCIgY2xhc3M9XCJycHQtaGVscC10ZXh0XCI+QW4gYXZhaWxhYmxlIElEIGNyZWF0ZXMgYSBuZXcgcmVwb3J0LiBBbiBleGlzdGluZyBJRCByZXF1aXJlcyB5b3VyIGNvbmZpcm1hdGlvbiBiZWZvcmUgdXBkYXRpbmcuPC9zcGFuPlxuICAgICAgICAgICAgQGlmIChpZEVycm9yKCkpIHtcbiAgICAgICAgICAgICAgPHAgaWQ9XCJycHQtZGxnLWlkLWVycm9yXCIgY2xhc3M9XCJycHQtZmllbGQtZXJyb3JcIiByb2xlPVwiYWxlcnRcIj57eyBpZEVycm9yKCkgfX08L3A+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8cCBpZD1cInJwdC1kbGctaWQtc3RhdHVzXCIgY2xhc3M9XCJycHQtaWQtc3RhdHVzXCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5ycHQtaWQtc3RhdHVzLXN1Y2Nlc3NdPVwiaWRTdGF0dXMoKSA9PT0gJ2F2YWlsYWJsZScgfHwgaWRTdGF0dXMoKSA9PT0gJ2N1cnJlbnQnXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnJwdC1pZC1zdGF0dXMtd2FybmluZ109XCJpZFN0YXR1cygpID09PSAnZHVwbGljYXRlJ1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5ycHQtaWQtc3RhdHVzLWVycm9yXT1cImlkU3RhdHVzKCkgPT09ICdlcnJvcidcIlxuICAgICAgICAgICAgICBbY2xhc3MucnB0LWlkLXN0YXR1cy1jaGVja2luZ109XCJpZFN0YXR1cygpID09PSAnY2hlY2tpbmcnXCI+XG4gICAgICAgICAgICAgIEBpZiAoaWRNZXNzYWdlKCkpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1zdGF0dXMtaWNvblwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChpZFN0YXR1cygpID09PSAnYXZhaWxhYmxlJyB8fCBpZFN0YXR1cygpID09PSAnY3VycmVudCcpIHtcbiAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGVja1wiIFtzaXplXT1cIjExXCIgLz5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGlkU3RhdHVzKCkgPT09ICdkdXBsaWNhdGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiYWxlcnQtdHJpYW5nbGVcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChpZFN0YXR1cygpID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2xvc2VcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChpZFN0YXR1cygpID09PSAnY2hlY2tpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwicmVmcmVzaFwiIFtzaXplXT1cIjExXCIgY2xhc3M9XCJycHQtc3BpblwiIC8+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGlkTWVzc2FnZSgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFJlcG9ydCBOYW1lIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicnB0LWxhYmVsXCIgZm9yPVwicnB0LWRsZy1uYW1lXCI+RGlzcGxheSBOYW1lPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cInJwdC1kbGctbmFtZVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJycHQtaW5wdXRcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJuYW1lKClcIlxuICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25OYW1lQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTYXZpbmcoKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJuYW1lRXJyb3IoKSA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJuYW1lRXJyb3IoKSA/ICdycHQtZGxnLW5hbWUtZXJyb3InIDogbnVsbFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBTYWxlcyBSZWdpc3RlclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgQGlmIChuYW1lRXJyb3IoKSkge1xuICAgICAgICAgICAgPHAgaWQ9XCJycHQtZGxnLW5hbWUtZXJyb3JcIiBjbGFzcz1cInJwdC1maWVsZC1lcnJvclwiIHJvbGU9XCJhbGVydFwiPnt7IG5hbWVFcnJvcigpIH19PC9wPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicnB0LWxhYmVsXCIgZm9yPVwicnB0LWRsZy1kZXNjcmlwdGlvblwiPkRlc2NyaXB0aW9uPC9sYWJlbD5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cInJwdC1kbGctZGVzY3JpcHRpb25cIiBjbGFzcz1cInJwdC1pbnB1dFwiIHJvd3M9XCIyXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZGVzY3JpcHRpb24oKVwiIChuZ01vZGVsQ2hhbmdlKT1cImRlc2NyaXB0aW9uLnNldCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiIFtkaXNhYmxlZF09XCJpc1NhdmluZygpXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVVJMIFNsdWcgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1mb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJycHQtbGFiZWxcIiBmb3I9XCJycHQtZGxnLXNsdWdcIj5VUkwgU2x1ZzwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNsdWctaW5wdXQtd3JhcHBlclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1zbHVnLXByZWZpeFwiPi97eyBiYXNlUm91dGUoKSB9fS88L3NwYW4+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIGlkPVwicnB0LWRsZy1zbHVnXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtaW5wdXQgcnB0LXNsdWctZmllbGRcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNsdWcoKVwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TbHVnQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmluZygpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwic2x1Z0Vycm9yKCkgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJzbHVnRXJyb3IoKSA/ICdycHQtZGxnLXNsdWctZXJyb3InIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJzYWxlLXJlcG9ydFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIEBpZiAoc2x1Z0Vycm9yKCkpIHtcbiAgICAgICAgICAgICAgPHAgaWQ9XCJycHQtZGxnLXNsdWctZXJyb3JcIiBjbGFzcz1cInJwdC1maWVsZC1lcnJvclwiIHJvbGU9XCJhbGVydFwiPnt7IHNsdWdFcnJvcigpIH19PC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtaGVscC10ZXh0XCI+RGlyZWN0IFVSTCBmb3IgdXNlcnMgdG8gdmlldyB0aGlzIHJlcG9ydCBwYWdlLjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicnB0LWxhYmVsXCIgZm9yPVwicnB0LWRsZy1jYXRlZ29yeVwiPkNhdGVnb3J5PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBpZD1cInJwdC1kbGctY2F0ZWdvcnlcIiBjbGFzcz1cInJwdC1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY2F0ZWdvcnkoKVwiIChuZ01vZGVsQ2hhbmdlKT1cImNhdGVnb3J5LnNldCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiIFtkaXNhYmxlZF09XCJpc1NhdmluZygpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gTWVudSBHcm91cCAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwdC1sYWJlbFwiIGZvcj1cInJwdC1kbGctZ3JvdXBcIj5NZW51IEdyb3VwPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cInJwdC1kbGctZ3JvdXBcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicnB0LWlucHV0XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwibWVudUdyb3VwKClcIlxuICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibWVudUdyb3VwLnNldCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzU2F2aW5nKClcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2FsZXMsIEZpbmFuY2UsIE9wZXJhdGlvbnNcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWhlbHAtdGV4dFwiPlNpZGViYXIgZm9sZGVyIGhlYWRpbmcgd2hlcmUgdGhpcyBwYWdlIGFwcGVhcnMuPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBQdWJsaXNoIHRvIE1lbnUgVG9nZ2xlIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHVibGlzaC1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXB1Ymxpc2gtdGV4dFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1wdWJsaXNoLXRpdGxlXCI+UHVibGlzaCB0byBNZW51PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1wdWJsaXNoLWRlc2NcIj5EaXNwbGF5IGluIHRoZSBzaWRlYmFyIG5hdmlnYXRpb24uPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJycHQtc3dpdGNoXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNQdWJsaXNoZWQoKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzU2F2aW5nKClcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaXNQdWJsaXNoZWQuc2V0KCFpc1B1Ymxpc2hlZCgpKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXNsaWRlclwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIENvcHkgVVJMIEJveCAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNoYXJlLWNhcmRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc2hhcmUtdXJsLXJvd1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1zaGFyZS1sYWJlbFwiPlJlcG9ydCBVUkw6PC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cInJwdC1zaGFyZS1jb2RlXCI+e3sgZnVsbFJvdXRlKCkgfX08L2NvZGU+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJwdC1idG4tY29weVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvcHlSb3V0ZSgpXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiY29waWVkKCkgPyAnQ29waWVkIScgOiAnQ29weSBSb3V0ZSdcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHJwdC1pY29uIFtuYW1lXT1cImNvcGllZCgpID8gJ2NoZWNrJyA6ICdjb3B5J1wiIFtzaXplXT1cIjExXCIgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBjb3BpZWQoKSA/ICdDb3BpZWQnIDogJ0NvcHknIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJpZ2h0IENvbHVtbjogSW50ZXJhY3RpdmUgRm9ybSBMaXZlIFByZXZpZXcgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHJldmlldy1jb2x1bW5cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXByZXZpZXctaGVhZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXByZXZpZXctYmFkZ2VcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtbGl2ZS1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuPkxpdmUgR2VuZXJhdGVkIEZvcm08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXByZXZpZXctaGludFwiPkludGVyYWN0aXZlIHByZXZpZXcgbWF0Y2hpbmcgcnVudGltZSBwYWdlPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1wcmV2aWV3LXJ1bnRpbWUtd3JhcHBlclwiIGNka1Njcm9sbGFibGU+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXByZXZpZXctY2FyZC1mcmFtZVwiPlxuICAgICAgICAgICAgICA8cnB0LXJ1bnRpbWUgW3JlcG9ydF09XCJjdXJyZW50UHJldmlld0RlZigpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENvbmZpcm1pbmcgaGVyZSBpcyB0aGUgb25seSBvcGVyYXRpb24gdGhhdCBzYXZlcyBhIGRlZmluaXRpb24uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJwdC1kaWFsb2ctZm9vdGVyXCIgW2F0dHIuaW5lcnRdPVwidXBkYXRlQ29uZmlybWF0aW9uKCkgPyAnJyA6IG51bGxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1mb290ZXItbGVmdFwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICAgIEBpZiAoc2F2ZUVycm9yKCkpIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwicnB0LWZpZWxkLWVycm9yXCIgcm9sZT1cImFsZXJ0XCI+e3sgc2F2ZUVycm9yKCkgfX08L3A+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1oZWxwLXRleHRcIj57eyBpc1NhdmluZygpID8gJ1NhdmluZyByZXBvcnQuLi4nIDogJ0NoYW5nZXMgYXJlIHNhdmVkIG9ubHkgYWZ0ZXIgY29uZmlybWF0aW9uLicgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1mb290ZXItYWN0aW9uc1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicnB0LWJ0biBycHQtYnRuLXNlY29uZGFyeVwiIFtkaXNhYmxlZF09XCJpc1NhdmluZygpXCIgKGNsaWNrKT1cImNsb3NlKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJwdC1idG4gcnB0LWJ0bi1zZWNvbmRhcnlcIiBbZGlzYWJsZWRdPVwiaXNTYXZpbmcoKSB8fCBpc0NoZWNraW5nSWQoKVwiIChjbGljayk9XCJzYXZlKCdvcGVuX2xpdmVfcGFnZScpXCI+U2F2ZSBhbmQgT3BlbjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicnB0LWJ0biBycHQtYnRuLXByaW1hcnlcIiBbZGlzYWJsZWRdPVwiaXNTYXZpbmcoKSB8fCBpc0NoZWNraW5nSWQoKVwiIChjbGljayk9XCJzYXZlKClcIj5cbiAgICAgICAgICAgIHt7IGlzU2F2aW5nKCkgPyAnU2F2aW5nLi4uJyA6ICdTYXZlIFJlcG9ydCcgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAodXBkYXRlQ29uZmlybWF0aW9uKCk7IGFzIGNvbmZpcm1hdGlvbikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXVwZGF0ZS1vdmVybGF5XCIgcm9sZT1cImFsZXJ0ZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT1cInJwdC11cGRhdGUtdGl0bGVcIiBhcmlhLWRlc2NyaWJlZGJ5PVwicnB0LXVwZGF0ZS1kZXNjcmlwdGlvblwiXG4gICAgICAgICAgY2RrVHJhcEZvY3VzIFtjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZV09XCJ0cnVlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC11cGRhdGUtY2FyZFwiPlxuICAgICAgICAgICAgPCEtLSBNb2RhbCBIZWFkZXIgd2l0aCBXYXJuaW5nIEljb24gQmFkZ2UgYW5kIENsb3NlIEJ1dHRvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtdXBkYXRlLWNhcmQtaGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtdXBkYXRlLWljb24tYmFkZ2VcIj5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImFsZXJ0LXRyaWFuZ2xlXCIgW3NpemVdPVwiMThcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC11cGRhdGUtaGVhZGVyLWluZm9cIj5cbiAgICAgICAgICAgICAgICA8aDMgaWQ9XCJycHQtdXBkYXRlLXRpdGxlXCIgY2xhc3M9XCJycHQtdXBkYXRlLXRpdGxlXCI+UmVwb3J0IElEIGFscmVhZHkgZXhpc3RzPC9oMz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC11cGRhdGUtc3VidGl0bGVcIj5BbiBleGlzdGluZyByZXBvcnQgZGVmaW5pdGlvbiB3YXMgZm91bmQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJwdC1kaWFsb2ctY2xvc2VcIiAoY2xpY2spPVwiY2FuY2VsVXBkYXRlKClcIiBhcmlhLWxhYmVsPVwiQ2FuY2VsIHVwZGF0ZVwiIHRpdGxlPVwiQ2FuY2VsXCI+XG4gICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjbG9zZVwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBNb2RhbCBDb250ZW50IHdpdGggU3VtbWFyeSwgRGV0YWlscyBDYXJkLCBhbmQgSW1wYWN0IE5vdGljZSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtdXBkYXRlLWNhcmQtYm9keVwiPlxuICAgICAgICAgICAgICA8cCBpZD1cInJwdC11cGRhdGUtZGVzY3JpcHRpb25cIiBjbGFzcz1cInJwdC11cGRhdGUtcHJvbXB0XCI+XG4gICAgICAgICAgICAgICAgUmVwb3J0IDxzdHJvbmc+e3sgY29uZmlybWF0aW9uLmV4aXN0aW5nTmFtZSB9fTwvc3Ryb25nPiBhbHJlYWR5IHVzZXNcbiAgICAgICAgICAgICAgICBJRCA8c3Ryb25nPnt7IGNvbmZpcm1hdGlvbi5yZXBvcnQuaWQgfX08L3N0cm9uZz4gKHZlcnNpb24ge3sgY29uZmlybWF0aW9uLmV4cGVjdGVkVmVyc2lvbiB9fSkuXG4gICAgICAgICAgICAgICAgRG8geW91IHdhbnQgdG8gdXBkYXRlIGl0IHdpdGggdGhlIHJldmlld2VkIHJlcG9ydCBkZXRhaWxzP1xuICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1jb25mbGljdC1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1jb25mbGljdC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWNvbmZsaWN0LWxhYmVsXCI+VGFyZ2V0IElEPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJycHQtY29uZmxpY3QtY29kZVwiPnt7IGNvbmZpcm1hdGlvbi5yZXBvcnQuaWQgfX08L2NvZGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1jb25mbGljdC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWNvbmZsaWN0LWxhYmVsXCI+RXhpc3RpbmcgUmVwb3J0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtY29uZmxpY3QtbmFtZVwiPnt7IGNvbmZpcm1hdGlvbi5leGlzdGluZ05hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1jb25mbGljdC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWNvbmZsaWN0LWxhYmVsXCI+Q3VycmVudCBWZXJzaW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtY29uZmxpY3QtYmFkZ2VcIj52e3sgY29uZmlybWF0aW9uLmV4cGVjdGVkVmVyc2lvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1vdmVyd3JpdGUtbm90aWNlXCI+XG4gICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ3YXJuaW5nXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPlNhdmluZyB3aWxsIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbiBpbiB0aGUgZGF0YWJhc2UgYW5kIGluY3JlbWVudCB0aGUgdmVyc2lvbi48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgbWF0Y2hpbmcgTGlicmFyeSBVSSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtdXBkYXRlLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2RrRm9jdXNJbml0aWFsIGNsYXNzPVwicnB0LWJ0biBycHQtYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJjYW5jZWxVcGRhdGUoKVwiPlxuICAgICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycHQtYnRuIHJwdC1idG4tcHJpbWFyeSBycHQtYnRuLWNvbmZpcm0tc2F2ZVwiIChjbGljayk9XCJjb25maXJtVXBkYXRlKClcIj5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInNhdmVcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgY29uZmlybWF0aW9uLmFjdGlvbiA9PT0gJ29wZW5fbGl2ZV9wYWdlJyA/ICdVcGRhdGUgYW5kIE9wZW4nIDogJ1VwZGF0ZSBSZXBvcnQnIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIC8qIEtleWZyYW1lIEFuaW1hdGlvbnMgKi9cbiAgICBAa2V5ZnJhbWVzIHJwdFNwaW4ge1xuICAgICAgZnJvbSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XG4gICAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cbiAgICB9XG5cbiAgICAucnB0LXNwaW4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgYW5pbWF0aW9uOiBycHRTcGluIDFzIGxpbmVhciBpbmZpbml0ZTtcbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzIHJwdE92ZXJsYXlJbiB7XG4gICAgICBmcm9tIHsgb3BhY2l0eTogMDsgfVxuICAgICAgdG8geyBvcGFjaXR5OiAxOyB9XG4gICAgfVxuXG4gICAgQGtleWZyYW1lcyBycHRDYXJkSW4ge1xuICAgICAgZnJvbSB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NikgdHJhbnNsYXRlWSg2cHgpO1xuICAgICAgfVxuICAgICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZVkoMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogSUQgQWN0aW9ucyAmIE1pY3JvIFRvb2xzICovXG4gICAgLnJwdC1pZC1hY3Rpb25zIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgfVxuXG4gICAgLnJwdC1pZC1hY3Rpb24tYnRuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgICAgaGVpZ2h0OiAyNXB4O1xuICAgICAgcGFkZGluZzogMCA5cHg7XG4gICAgICBmb250LXNpemU6IDAuN3JlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBjb2xvcjogIzMzNDE1NTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxO1xuICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgfVxuXG4gICAgLnJwdC1pZC1hY3Rpb24tYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmMWY1Zjk7XG4gICAgICBjb2xvcjogIzBmMTcyYTtcbiAgICAgIGJvcmRlci1jb2xvcjogIzk0YTNiODtcbiAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDE1LCAyMywgNDIsIDAuMDUpO1xuICAgIH1cblxuICAgIC5ycHQtaWQtYWN0aW9uLWJ0bjphY3RpdmU6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZDogI2UyZThmMDtcbiAgICB9XG5cbiAgICAucnB0LWlkLWFjdGlvbi1idG46ZGlzYWJsZWQge1xuICAgICAgb3BhY2l0eTogMC41O1xuICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICB9XG5cbiAgICAucnB0LWlkLWFjdGlvbi1idG4uaXMtY2hlY2tpbmcge1xuICAgICAgY29sb3I6ICMyNTYzZWI7XG4gICAgICBib3JkZXItY29sb3I6ICM5M2M1ZmQ7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgIH1cblxuICAgIC5ycHQtaWQtc3RhdHVzIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgICAgZm9udC1zaXplOiAwLjcycmVtO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMztcbiAgICAgIG1hcmdpbjogNHB4IDAgMCAwO1xuICAgICAgcGFkZGluZzogM3B4IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlO1xuICAgICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LWlkLXN0YXR1czplbXB0eSB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cblxuICAgIC5ycHQtc3RhdHVzLWljb24ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LWlkLXN0YXR1cy1zdWNjZXNzIHtcbiAgICAgIGNvbG9yOiAjMTU4MDNkO1xuICAgICAgYmFja2dyb3VuZDogI2YwZmRmNDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiYmY3ZDA7XG4gICAgfVxuXG4gICAgLnJwdC1pZC1zdGF0dXMtd2FybmluZyB7XG4gICAgICBjb2xvcjogI2I0NTMwOTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZiZWI7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmVmM2M3O1xuICAgIH1cblxuICAgIC5ycHQtaWQtc3RhdHVzLWVycm9yIHtcbiAgICAgIGNvbG9yOiAjYjkxYzFjO1xuICAgICAgYmFja2dyb3VuZDogI2ZlZjJmMjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZWNhY2E7XG4gICAgfVxuXG4gICAgLnJwdC1pZC1zdGF0dXMtY2hlY2tpbmcge1xuICAgICAgY29sb3I6ICMxZDRlZDg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RiZWFmZTtcbiAgICB9XG5cbiAgICAvKiBFeGlzdGluZyBJRCBVcGRhdGUgQ29uZmlybWF0aW9uIE92ZXJsYXkgJiBDYXJkICovXG4gICAgLnJwdC11cGRhdGUtb3ZlcmxheSB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBpbnNldDogMDtcbiAgICAgIHotaW5kZXg6IDUwO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgxNSwgMjMsIDQyLCAwLjQ1KTtcbiAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigzcHgpO1xuICAgICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoM3B4KTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiAxNnB4O1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGFuaW1hdGlvbjogcnB0T3ZlcmxheUluIDE2MG1zIGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpIGZvcndhcmRzO1xuICAgIH1cblxuICAgIC5ycHQtdXBkYXRlLWNhcmQge1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIHdpZHRoOiBtaW4oNDQwcHgsIDEwMCUpO1xuICAgICAgbWF4LWhlaWdodDogOTQlO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICBib3gtc2hhZG93OiAwIDIwcHggNDVweCAtOHB4IHJnYmEoMTUsIDIzLCA0MiwgMC4zMiksIDAgMCAwIDFweCByZ2JhKDE1LCAyMywgNDIsIDAuMDgpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGFuaW1hdGlvbjogcnB0Q2FyZEluIDE4MG1zIGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpIGZvcndhcmRzO1xuICAgIH1cblxuICAgIC5ycHQtdXBkYXRlLWNhcmQtaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiAxMnB4O1xuICAgICAgcGFkZGluZzogMTJweCAxNnB4O1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmJlYjtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZmVmM2M3O1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuXG4gICAgLnJwdC11cGRhdGUtaWNvbi1iYWRnZSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDMycHg7XG4gICAgICBoZWlnaHQ6IDMycHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmVmM2M3O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZkZTY4YTtcbiAgICAgIGNvbG9yOiAjYjQ1MzA5O1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuXG4gICAgLnJwdC11cGRhdGUtaGVhZGVyLWluZm8ge1xuICAgICAgZmxleDogMTtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICB9XG5cbiAgICAucnB0LXVwZGF0ZS10aXRsZSB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBmb250LXNpemU6IDAuOTI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjOTI0MDBlO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMjU7XG4gICAgfVxuXG4gICAgLnJwdC11cGRhdGUtc3VidGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBjb2xvcjogI2I0NTMwOTtcbiAgICAgIG1hcmdpbi10b3A6IDFweDtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cblxuICAgIC5ycHQtdXBkYXRlLWNhcmQtYm9keSB7XG4gICAgICBwYWRkaW5nOiAxNHB4IDE2cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogMTFweDtcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtdXBkYXRlLXByb21wdCB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBmb250LXNpemU6IDAuOHJlbTtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ1O1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgfVxuXG4gICAgLnJwdC1jb25mbGljdC1jYXJkIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYm9yZGVyLXJhZGl1czogN3B4O1xuICAgICAgcGFkZGluZzogOXB4IDEycHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogN3B4O1xuICAgIH1cblxuICAgIC5ycHQtY29uZmxpY3Qtcm93IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgZ2FwOiAxMHB4O1xuICAgICAgZm9udC1zaXplOiAwLjczNXJlbTtcbiAgICB9XG5cbiAgICAucnB0LWNvbmZsaWN0LWxhYmVsIHtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cblxuICAgIC5ycHQtY29uZmxpY3QtY29kZSB7XG4gICAgICBmb250LWZhbWlseTogdWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIG1vbm9zcGFjZTtcbiAgICAgIGZvbnQtc2l6ZTogMC43MnJlbTtcbiAgICAgIGJhY2tncm91bmQ6ICNlMmU4ZjA7XG4gICAgICBjb2xvcjogIzBmMTcyYTtcbiAgICAgIHBhZGRpbmc6IDJweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgIH1cblxuICAgIC5ycHQtY29uZmxpY3QtbmFtZSB7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgfVxuXG4gICAgLnJwdC1jb25mbGljdC1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjhyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcGFkZGluZzogMXB4IDdweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgIGJhY2tncm91bmQ6ICNlMGYyZmU7XG4gICAgICBjb2xvcjogIzAzNjlhMTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiYWU2ZmQ7XG4gICAgfVxuXG4gICAgLnJwdC1vdmVyd3JpdGUtbm90aWNlIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgIGdhcDogN3B4O1xuICAgICAgZm9udC1zaXplOiAwLjcxNXJlbTtcbiAgICAgIGNvbG9yOiAjYjQ1MzA5O1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmJlYjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZWYzYzc7XG4gICAgICBwYWRkaW5nOiA3cHggMTBweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjM1O1xuICAgIH1cblxuICAgIC5ycHQtb3ZlcndyaXRlLW5vdGljZSBycHQtaWNvbiB7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIG1hcmdpbi10b3A6IDFweDtcbiAgICB9XG5cbiAgICAucnB0LXVwZGF0ZS1hY3Rpb25zIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICAgIGdhcDogOHB4O1xuICAgICAgcGFkZGluZzogMTBweCAxNnB4O1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tY29uZmlybS1zYXZlIHtcbiAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICMyNTYzZWIsICMxZDRlZDgpO1xuICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgICBib3gtc2hhZG93OiAwIDFweCAycHggcmdiYSgzNywgOTksIDIzNSwgMC4yKTtcbiAgICB9XG5cbiAgICAucnB0LWJ0bi1jb25maXJtLXNhdmU6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzFkNGVkOCwgIzFlNDBhZik7XG4gICAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgzNywgOTksIDIzNSwgMC4yNSk7XG4gICAgfVxuICAgICNycHQtZGxnLWlkLWVycm9yOmVtcHR5LCAjcnB0LWRsZy1pZC1zdGF0dXM6ZW1wdHkgeyBkaXNwbGF5OiBub25lOyB9XG4gICAgLnJwdC1kaWFsb2ctZm9vdGVyLCAucnB0LWZvb3Rlci1hY3Rpb25zIHsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDhweDsgfVxuICAgIC5ycHQtYnRuLCAucnB0LWRpYWxvZy1jbG9zZSB7IG1pbi1oZWlnaHQ6IDM2cHg7IH1cbiAgICBAbWVkaWEgKG1heC13aWR0aDogNjQwcHgpIHtcbiAgICAgIC5ycHQtYnRuLCAucnB0LWRpYWxvZy1jbG9zZSB7IG1pbi1oZWlnaHQ6IDQ0cHg7IG1pbi13aWR0aDogNDRweDsgfVxuICAgICAgLnJwdC1mb290ZXItbGVmdCB7IHdpZHRoOiAxMDAlOyB9XG4gICAgfVxuICAgIC5ycHQtZmllbGQtZXJyb3IgeyBjb2xvcjogI2I5MWMxYzsgZm9udC1zaXplOiAwLjhyZW07IG1hcmdpbjogNHB4IDA7IH1cbiAgICBidXR0b246ZGlzYWJsZWQgeyBvcGFjaXR5OiAwLjY7IGN1cnNvcjogd2FpdDsgfVxuICAgIHRleHRhcmVhLnJwdC1pbnB1dCB7IHJlc2l6ZTogdmVydGljYWw7IG1pbi1oZWlnaHQ6IDU2cHg7IH1cbiAgICAucnB0LWZvb3Rlci1sZWZ0IHsgbWluLXdpZHRoOiAwOyBwYWRkaW5nLXJpZ2h0OiAxMnB4OyB9XG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgIG1heC1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBmb250LWZhbWlseTogdmFyKC0tcnB0LWZvbnQtZmFtaWx5LCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXCJTZWdvZSBVSVwiLCBSb2JvdG8sIHNhbnMtc2VyaWYpO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtZGlhbG9nLXNoZWxsIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgbWF4LWhlaWdodDogbWluKDU0MHB4LCBjYWxjKDEwMHZoIC0gMzJweCkpO1xuICAgICAgbWF4LWhlaWdodDogbWluKDU0MHB4LCBjYWxjKDEwMGR2aCAtIDMycHgpKTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgICAgYm94LXNoYWRvdzogMCAyMHB4IDQwcHggLTEycHggcmdiYSgxNSwgMjMsIDQyLCAwLjI4KSwgMCAwIDAgMXB4IHJnYmEoMTUsIDIzLCA0MiwgMC4wOCk7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGFuaW1hdGlvbjogcnB0RGlhbG9nSW4gMTgwbXMgY3ViaWMtYmV6aWVyKDAuMTYsIDEsIDAuMywgMSkgZm9yd2FyZHM7XG4gICAgfVxuXG4gICAgQGtleWZyYW1lcyBycHREaWFsb2dJbiB7XG4gICAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk3KSB0cmFuc2xhdGVZKDRweCk7XG4gICAgICB9XG4gICAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlWSgwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAucnB0LWRpYWxvZy1oZWFkZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBwYWRkaW5nOiAxMHB4IDE2cHg7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1oZWFkZXItbGVmdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogMTBweDtcbiAgICB9XG5cbiAgICAucnB0LXJldmlldy1pY29uLWJhZGdlIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB3aWR0aDogMjZweDtcbiAgICAgIGhlaWdodDogMjZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGJhY2tncm91bmQ6ICNkYmVhZmU7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYTdmM2QwO1xuICAgICAgY29sb3I6ICMxZDRlZDg7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LWRpYWxvZy10aXRsZSB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBmb250LXNpemU6IDAuOTI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMjU7XG4gICAgfVxuXG4gICAgLnJwdC1kaWFsb2ctc3VidGl0bGUge1xuICAgICAgbWFyZ2luOiAxcHggMCAwIDA7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBsaW5lLWhlaWdodDogMS4yO1xuICAgIH1cblxuICAgIC5ycHQtZGlhbG9nLWNsb3NlIHtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6ICM5NGEzYjg7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBwYWRkaW5nOiA0cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTJzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1kaWFsb2ctY2xvc2U6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2UyZThmMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cblxuICAgIC5ycHQtZGlhbG9nLWJvZHkge1xuICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMjgwcHggbWlubWF4KDAsIDFmcik7XG4gICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IG1pbm1heCgwLCAxZnIpO1xuICAgICAgZmxleDogMTtcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICBAbWVkaWEgKG1heC13aWR0aDogNzgwcHgpIHtcbiAgICAgIC5ycHQtZGlhbG9nLWJvZHkge1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpO1xuICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gYXV0bztcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAucnB0LXNldHRpbmdzLWNvbHVtbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogOXB4O1xuICAgICAgcGFkZGluZzogMTJweCAxNHB4O1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtc2VjdGlvbi1oZWFkZXIge1xuICAgICAgZm9udC1zaXplOiAwLjY3NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcbiAgICAgIGNvbG9yOiAjNDc1NTY5O1xuICAgICAgbWFyZ2luLWJvdHRvbTogMXB4O1xuICAgIH1cblxuICAgIC5ycHQtZm9ybS1ncm91cCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogM3B4O1xuICAgIH1cblxuICAgIC5ycHQtbGFiZWwge1xuICAgICAgZm9udC1zaXplOiAwLjcyNXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzMzNDE1NTtcbiAgICB9XG5cbiAgICAucnB0LWlucHV0IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGhlaWdodDogMjhweDtcbiAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICBmb250LXNpemU6IDAuNzc1cmVtO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBjb2xvcjogIzBmMTcyYTtcbiAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xMnMgZWFzZTtcbiAgICB9XG5cbiAgICAucnB0LWlucHV0OmZvY3VzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogIzI1NjNlYjtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjE0KTtcbiAgICB9XG5cbiAgICAucnB0LXNsdWctaW5wdXQtd3JhcHBlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxO1xuICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgICAgaGVpZ2h0OiAyOHB4O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xMnMgZWFzZTtcbiAgICB9XG5cbiAgICAucnB0LXNsdWctaW5wdXQtd3JhcHBlcjpmb2N1cy13aXRoaW4ge1xuICAgICAgYm9yZGVyLWNvbG9yOiAjMjU2M2ViO1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoMzcsIDk5LCAyMzUsIDAuMTQpO1xuICAgIH1cblxuICAgIC5ycHQtc2x1Zy1wcmVmaXgge1xuICAgICAgcGFkZGluZzogMCAwIDAgOHB4O1xuICAgICAgZm9udC1zaXplOiAwLjcyNXJlbTtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIGxpbmUtaGVpZ2h0OiAyOHB4O1xuICAgIH1cblxuICAgIC5ycHQtc2x1Zy1maWVsZCB7XG4gICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIHBhZGRpbmctbGVmdDogMnB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAucnB0LWhlbHAtdGV4dCB7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjI7XG4gICAgfVxuXG4gICAgLnJwdC1wdWJsaXNoLWNhcmQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBnYXA6IDEwcHg7XG4gICAgICBwYWRkaW5nOiA2cHggMTBweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LXB1Ymxpc2gtdGV4dCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogMXB4O1xuICAgIH1cblxuICAgIC5ycHQtcHVibGlzaC10aXRsZSB7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgfVxuXG4gICAgLnJwdC1wdWJsaXNoLWRlc2Mge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBsaW5lLWhlaWdodDogMS4yO1xuICAgIH1cblxuICAgIC8qIENvbXBhY3QgdG9nZ2xlIHN3aXRjaCAqL1xuICAgIC5ycHQtc3dpdGNoIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHdpZHRoOiAzMnB4O1xuICAgICAgaGVpZ2h0OiAxOHB4O1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuXG4gICAgLnJwdC1zd2l0Y2ggaW5wdXQge1xuICAgICAgb3BhY2l0eTogMDtcbiAgICAgIHdpZHRoOiAwO1xuICAgICAgaGVpZ2h0OiAwO1xuICAgIH1cblxuICAgIC5ycHQtc2xpZGVyIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGluc2V0OiAwO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2NiZDVlMTtcbiAgICAgIHRyYW5zaXRpb246IDAuMThzO1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgIH1cblxuICAgIC5ycHQtc2xpZGVyOmJlZm9yZSB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBjb250ZW50OiBcIlwiO1xuICAgICAgaGVpZ2h0OiAxNHB4O1xuICAgICAgd2lkdGg6IDE0cHg7XG4gICAgICBsZWZ0OiAycHg7XG4gICAgICBib3R0b206IDJweDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgICAgdHJhbnNpdGlvbjogMC4xOHM7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgfVxuXG4gICAgaW5wdXQ6Y2hlY2tlZCArIC5ycHQtc2xpZGVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyNTYzZWI7XG4gICAgfVxuXG4gICAgaW5wdXQ6Y2hlY2tlZCArIC5ycHQtc2xpZGVyOmJlZm9yZSB7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTRweCk7XG4gICAgfVxuXG4gICAgLnJwdC1zaGFyZS1jYXJkIHtcbiAgICAgIHBhZGRpbmc6IDZweCA5cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JmZGJmZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1zaGFyZS11cmwtcm93IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIH1cblxuICAgIC5ycHQtc2hhcmUtbGFiZWwge1xuICAgICAgZm9udC1zaXplOiAwLjY3NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzFlNDBhZjtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cblxuICAgIC5ycHQtc2hhcmUtY29kZSB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgZm9udC1zaXplOiAwLjY4NzVyZW07XG4gICAgICBmb250LWZhbWlseTogdWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIG1vbm9zcGFjZTtcbiAgICAgIGNvbG9yOiAjMWUzYThhO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB9XG5cbiAgICAucnB0LWJ0bi1jb3B5IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogM3B4O1xuICAgICAgcGFkZGluZzogMnB4IDZweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjOTNjNWZkO1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAjMjU2M2ViO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xMnMgZWFzZTtcbiAgICAgIGhlaWdodDogMjBweDtcbiAgICB9XG5cbiAgICAucnB0LWJ0bi1jb3B5OmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNkYmVhZmU7XG4gICAgfVxuXG4gICAgLyogUHJldmlldyBDb2x1bW4gKi9cbiAgICAucnB0LXByZXZpZXctY29sdW1uIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtcHJldmlldy1oZWFkZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBwYWRkaW5nOiA4cHggMTRweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LXByZXZpZXctYmFkZ2Uge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgfVxuXG4gICAgLnJwdC1saXZlLWRvdCB7XG4gICAgICB3aWR0aDogNnB4O1xuICAgICAgaGVpZ2h0OiA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBiYWNrZ3JvdW5kOiAjMTBiOTgxO1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoMTYsIDE4NSwgMTI5LCAwLjIpO1xuICAgIH1cblxuICAgIC5ycHQtcHJldmlldy1oaW50IHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NzVyZW07XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICB9XG5cbiAgICAucnB0LXByZXZpZXctcnVudGltZS13cmFwcGVyIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjtcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgICBwYWRkaW5nOiAxMHB4IDEycHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LXByZXZpZXctcnVudGltZS13cmFwcGVyOjotd2Via2l0LXNjcm9sbGJhcixcbiAgICAucnB0LXNldHRpbmdzLWNvbHVtbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICAgICAgd2lkdGg6IDVweDtcbiAgICB9XG5cbiAgICAucnB0LXByZXZpZXctcnVudGltZS13cmFwcGVyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYixcbiAgICAucnB0LXNldHRpbmdzLWNvbHVtbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICAgICAgYmFja2dyb3VuZDogI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICB9XG5cbiAgICAucnB0LXByZXZpZXctcnVudGltZS13cmFwcGVyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlcixcbiAgICAucnB0LXNldHRpbmdzLWNvbHVtbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogIzk0YTNiODtcbiAgICB9XG5cbiAgICAucnB0LXByZXZpZXctY2FyZC1mcmFtZSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDE1LCAyMywgNDIsIDAuMDQpO1xuICAgICAgcGFkZGluZzogMTBweDtcbiAgICAgIG1pbi1oZWlnaHQ6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIH1cblxuICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3ODBweCkge1xuICAgICAgLyogT25lIHNjcm9sbGFibGUgYm9keSBvbiBuYXJyb3cgc2NyZWVuczsga2VlcCBwcmV2aWV3IHNjcm9sbGluZyBib3VuZGVkLiAqL1xuICAgICAgLnJwdC1zZXR0aW5ncy1jb2x1bW4geyBvdmVyZmxvdy15OiB2aXNpYmxlOyB9XG4gICAgICAucnB0LXByZXZpZXctcnVudGltZS13cmFwcGVyIHsgZmxleDogbm9uZTsgbWF4LWhlaWdodDogMzIwcHg7IH1cbiAgICAgIC5ycHQtcHJldmlldy1oaW50IHsgZGlzcGxheTogbm9uZTsgfVxuICAgIH1cblxuICAgIC8qIE1vZGFsIEZvb3RlciAqL1xuICAgIC5ycHQtZGlhbG9nLWZvb3RlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1zYXZlZC1waWxsIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNHB4O1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMxNTgwM2Q7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGNmY2U3O1xuICAgICAgcGFkZGluZzogMnB4IDdweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICB9XG5cbiAgICAucnB0LWZvb3Rlci1hY3Rpb25zIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICB9XG5cbiAgICAucnB0LWJ0biB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDVweDtcbiAgICAgIHBhZGRpbmc6IDVweCAxM3B4O1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjEycyBlYXNlO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICB9XG5cbiAgICAucnB0LWJ0bi1zZWNvbmRhcnkge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1jb2xvcjogI2NiZDVlMTtcbiAgICAgIGNvbG9yOiAjMzM0MTU1O1xuICAgIH1cblxuICAgIC5ycHQtYnRuLXNlY29uZGFyeTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBib3JkZXItY29sb3I6ICM5NGEzYjg7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tcHJpbWFyeSB7XG4gICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMjU2M2ViLCAjMWQ0ZWQ4KTtcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMzcsIDk5LCAyMzUsIDAuMik7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tcHJpbWFyeTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMWQ0ZWQ4LCAjMWU0MGFmKTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjI1KTtcbiAgICB9XG4gIGBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRTYXZlZERpYWxvZ0NvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nUmVmID0gaW5qZWN0KERpYWxvZ1JlZjxSZXBvcnRTYXZlZERpYWxvZ1Jlc3VsdD4pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGEgPSBpbmplY3Q8UmVwb3J0U2F2ZWREaWFsb2dEYXRhPihESUFMT0dfREFUQSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUgPSBpbmplY3QoUmVwb3J0U3RvcmVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydGluZ0NvbmZpZyA9IGluamVjdChSRVBPUlRJTkdfQ09ORklHLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIGlkQ2hlY2s/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgY3VzdG9tU2x1ZyA9ICEhdGhpcy5kYXRhLnJlcG9ydC5zbHVnO1xuXG4gIHJlYWRvbmx5IHJlcG9ydCA9IHRoaXMuZGF0YS5yZXBvcnQ7XG4gIHJlYWRvbmx5IGJhc2VSb3V0ZSA9IHNpZ25hbCh0aGlzLmRhdGEucm91dGVCYXNlIHx8IHRoaXMucmVwb3J0aW5nQ29uZmlnPy5yb3V0ZUJhc2UgfHwgJ3JlcG9ydHMnKTtcbiAgcmVhZG9ubHkgcmVwb3J0SWQgPSBzaWduYWwodGhpcy5yZXBvcnQuaWQpO1xuICByZWFkb25seSBpc0NoZWNraW5nSWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBpc1ByZXBhcmluZ1NhdmUgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSB1cGRhdGVDb25maXJtYXRpb24gPSBzaWduYWw8VXBkYXRlQ29uZmlybWF0aW9uIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGlkQXR0ZW1wdGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgaWRTdGF0dXMgPSBzaWduYWw8J3VuY2hlY2tlZCcgfCAnY2hlY2tpbmcnIHwgJ2F2YWlsYWJsZScgfCAnY3VycmVudCcgfCAnZHVwbGljYXRlJyB8ICdlcnJvcic+KCd1bmNoZWNrZWQnKTtcbiAgcmVhZG9ubHkgaWRNZXNzYWdlID0gc2lnbmFsKCcnKTtcbiAgcmVhZG9ubHkgaWRDaGFuZ2VkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yZXBvcnRJZCgpLnRyaW0oKSAhPT0gdGhpcy5yZXBvcnQuaWQpO1xuICByZWFkb25seSBpZEVycm9yID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICghdGhpcy5hdHRlbXB0ZWQoKSAmJiAhdGhpcy5pZEF0dGVtcHRlZCgpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpZCA9IHRoaXMucmVwb3J0SWQoKS50cmltKCk7XG4gICAgaWYgKCFpZCkgcmV0dXJuICdFbnRlciBhIHJlcG9ydCBJRC4nO1xuICAgIGlmIChpZC5sZW5ndGggPiAxMDApIHJldHVybiAnVXNlIGEgcmVwb3J0IElEIG9mIGF0IG1vc3QgMTAwIGNoYXJhY3RlcnMuJztcbiAgICBpZiAoIS9eW2EtekEtWjAtOV1bYS16QS1aMC05Xy1dKiQvLnRlc3QoaWQpKSByZXR1cm4gJ1VzZSBsZXR0ZXJzLCBudW1iZXJzLCB1bmRlcnNjb3JlcyBvciBoeXBoZW5zLCBzdGFydGluZyB3aXRoIGEgbGV0dGVyIG9yIG51bWJlci4nO1xuICAgIGlmIChpZC50b0xvd2VyQ2FzZSgpID09PSAnbmV3JykgcmV0dXJuICdDaG9vc2UgYW5vdGhlciBJRDsgXCJuZXdcIiBpcyByZXNlcnZlZCBmb3IgdGhlIHJlcG9ydCBidWlsZGVyLic7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xuICByZWFkb25seSBuYW1lID0gc2lnbmFsKHRoaXMucmVwb3J0Lm5hbWUgfHwgJycpO1xuICByZWFkb25seSBkZXNjcmlwdGlvbiA9IHNpZ25hbCh0aGlzLnJlcG9ydC5kZXNjcmlwdGlvbiB8fCAnJyk7XG4gIHJlYWRvbmx5IGNhdGVnb3J5ID0gc2lnbmFsKHRoaXMucmVwb3J0LmNhdGVnb3J5IHx8ICcnKTtcbiAgcmVhZG9ubHkgc2x1ZyA9IHNpZ25hbCh0aGlzLnJlcG9ydC5zbHVnIHx8IHRvU2x1Zyh0aGlzLnJlcG9ydC5uYW1lIHx8ICdyZXBvcnQnKSk7XG4gIHJlYWRvbmx5IG1lbnVHcm91cCA9IHNpZ25hbCh0aGlzLnJlcG9ydC5tZW51R3JvdXAgfHwgdGhpcy5yZXBvcnQuY2F0ZWdvcnkgfHwgJycpO1xuICByZWFkb25seSBpc1B1Ymxpc2hlZCA9IHNpZ25hbCh0aGlzLnJlcG9ydC5pc1B1Ymxpc2hlZCA/PyB0cnVlKTtcbiAgcmVhZG9ubHkgY29waWVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgaXNTYXZpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBhdHRlbXB0ZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBzYXZlRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IG5hbWVFcnJvciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuYXR0ZW1wdGVkKCkgJiYgIXRoaXMubmFtZSgpLnRyaW0oKSA/ICdFbnRlciBhIHJlcG9ydCBuYW1lLicgOiBudWxsKTtcbiAgcmVhZG9ubHkgc2x1Z0Vycm9yID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICghdGhpcy5hdHRlbXB0ZWQoKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLnNsdWcoKS50cmltKCkpIHJldHVybiAnRW50ZXIgYSBVUkwgc2x1Zy4nO1xuICAgIGlmICghL15bYS16MC05XSsoPzotW2EtejAtOV0rKSokLy50ZXN0KHRoaXMuc2x1ZygpLnRyaW0oKSkpIHJldHVybiAnVXNlIGxvd2VyY2FzZSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgc2luZ2xlIGh5cGhlbnMuJztcbiAgICBpZiAodGhpcy5zbHVnKCkudHJpbSgpID09PSAnbmV3JykgcmV0dXJuICdDaG9vc2UgYSBkaWZmZXJlbnQgc2x1ZzsgXCJuZXdcIiBpcyByZXNlcnZlZCBmb3IgdGhlIHJlcG9ydCBidWlsZGVyLic7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xuICByZWFkb25seSBmdWxsUm91dGUgPSBjb21wdXRlZCgoKSA9PiAnLycgKyB0aGlzLmJhc2VSb3V0ZSgpLnJlcGxhY2UoL15cXC8rfFxcLyskL2csICcnKSArICcvJyArIHRoaXMuc2x1ZygpLnRyaW0oKSk7XG4gIHJlYWRvbmx5IGN1cnJlbnRQcmV2aWV3RGVmID0gY29tcHV0ZWQ8UmVwb3J0RGVmaW5pdGlvbj4oKCkgPT4gKHtcbiAgICAuLi50aGlzLnJlcG9ydCwgaWQ6IHRoaXMucmVwb3J0SWQoKS50cmltKCksIG5hbWU6IHRoaXMubmFtZSgpLCBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbigpLCBjYXRlZ29yeTogdGhpcy5jYXRlZ29yeSgpLFxuICAgIHNsdWc6IHRoaXMuc2x1ZygpLCBtZW51R3JvdXA6IHRoaXMubWVudUdyb3VwKCksIGlzUHVibGlzaGVkOiB0aGlzLmlzUHVibGlzaGVkKCksXG4gIH0pKTtcblxuICBvbklkQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NhdmluZygpKSByZXR1cm47XG4gICAgdGhpcy5pZENoZWNrPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaXNQcmVwYXJpbmdTYXZlLnNldChmYWxzZSk7XG4gICAgdGhpcy51cGRhdGVDb25maXJtYXRpb24uc2V0KG51bGwpO1xuICAgIHRoaXMuaXNDaGVja2luZ0lkLnNldChmYWxzZSk7XG4gICAgdGhpcy5yZXBvcnRJZC5zZXQodmFsdWUpO1xuICAgIHRoaXMuaWRTdGF0dXMuc2V0KCd1bmNoZWNrZWQnKTtcbiAgICB0aGlzLmlkTWVzc2FnZS5zZXQoJycpO1xuICAgIHRoaXMuc2F2ZUVycm9yLnNldChudWxsKTtcbiAgfVxuXG4gIHJhbmRvbWl6ZUlkKCk6IHZvaWQge1xuICAgIGNvbnN0IHJhbmRvbSA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyAncnB0LScgKyBjcnlwdG8ucmFuZG9tVVVJRCgpIDogZ2VuZXJhdGVJZCgncnB0Jyk7XG4gICAgdGhpcy5vbklkQ2hhbmdlKHJhbmRvbSk7XG4gIH1cblxuICB2ZXJpZnlJZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NhdmluZygpIHx8IHRoaXMuaXNDaGVja2luZ0lkKCkgfHwgdGhpcy51cGRhdGVDb25maXJtYXRpb24oKSkgcmV0dXJuO1xuICAgIHRoaXMuaWRBdHRlbXB0ZWQuc2V0KHRydWUpO1xuICAgIGlmICh0aGlzLmlkRXJyb3IoKSkgcmV0dXJuO1xuICAgIGNvbnN0IGlkID0gdGhpcy5yZXBvcnRJZCgpLnRyaW0oKTtcbiAgICB0aGlzLmlzQ2hlY2tpbmdJZC5zZXQodHJ1ZSk7XG4gICAgdGhpcy5pZFN0YXR1cy5zZXQoJ2NoZWNraW5nJyk7XG4gICAgdGhpcy5pZE1lc3NhZ2Uuc2V0KCdDaGVja2luZyByZXBvcnQgSUQuLi4nKTtcbiAgICB0aGlzLmlkQ2hlY2sgPSBkZWZlcigoKSA9PiB0aGlzLnN0b3JlLmNoZWNrUmVwb3J0SWQoaWQpKS5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5pc0NoZWNraW5nSWQuc2V0KGZhbHNlKSksXG4gICAgKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogZXhpc3RzID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0SWQoKS50cmltKCkgIT09IGlkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBleGlzdHMgJiYgIXRoaXMuaWRDaGFuZ2VkKCk7XG4gICAgICAgIHRoaXMuaWRTdGF0dXMuc2V0KGV4aXN0cyA/IChjdXJyZW50ID8gJ2N1cnJlbnQnIDogJ2R1cGxpY2F0ZScpIDogJ2F2YWlsYWJsZScpO1xuICAgICAgICB0aGlzLmlkTWVzc2FnZS5zZXQoZXhpc3RzID8gKGN1cnJlbnQgPyAnVGhpcyBJRCBpcyBhbHJlYWR5IHNhdmVkLiBTYXZpbmcgd2lsbCBhc2sgYmVmb3JlIHVwZGF0aW5nIHRoaXMgcmVwb3J0LidcbiAgICAgICAgICA6ICdUaGlzIHJlcG9ydCBJRCBhbHJlYWR5IGV4aXN0cy4gU2F2aW5nIHdpbGwgYXNrIHdoZXRoZXIgdG8gdXBkYXRlIGl0LicpIDogJ1RoaXMgcmVwb3J0IElEIGlzIGF2YWlsYWJsZS4nKTtcbiAgICAgICAgdGhpcy5pc0NoZWNraW5nSWQuc2V0KGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyb3IgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZXBvcnRJZCgpLnRyaW0oKSAhPT0gaWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5pZFN0YXR1cy5zZXQoJ2Vycm9yJyk7XG4gICAgICAgIHRoaXMuaWRNZXNzYWdlLnNldChlcnJvcj8ubWVzc2FnZSB8fCAnQ291bGQgbm90IHZlcmlmeSB0aGUgcmVwb3J0IElELiBQbGVhc2UgcmV0cnkuJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgb25OYW1lQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm5hbWUuc2V0KHZhbHVlKTtcbiAgICBpZiAoIXRoaXMuY3VzdG9tU2x1ZykgdGhpcy5zbHVnLnNldCh0b1NsdWcodmFsdWUpKTtcbiAgfVxuXG4gIG9uU2x1Z0NoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXN0b21TbHVnID0gdHJ1ZTtcbiAgICB0aGlzLnNsdWcuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIGNvcHlSb3V0ZSgpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCkge1xuICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGhpcy5mdWxsUm91dGUoKSkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuY29waWVkLnNldCh0cnVlKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmNvcGllZC5zZXQoZmFsc2UpLCAyMDAwKTtcbiAgICAgIH0pLmNhdGNoKCgpID0+IHRoaXMuc2F2ZUVycm9yLnNldCgnQ291bGQgbm90IGNvcHkgdGhlIHJlcG9ydCBVUkwuJykpO1xuICAgIH1cbiAgfVxuXG4gIHNhdmUoYWN0aW9uOiBSZXBvcnRTYXZlZERpYWxvZ1Jlc3VsdFsnYWN0aW9uJ10gPSAnYmFja190b19kZXNpZ25lcicpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NhdmluZygpIHx8IHRoaXMuaXNDaGVja2luZ0lkKCkgfHwgdGhpcy51cGRhdGVDb25maXJtYXRpb24oKSkgcmV0dXJuO1xuICAgIHRoaXMuYXR0ZW1wdGVkLnNldCh0cnVlKTtcbiAgICB0aGlzLnNhdmVFcnJvci5zZXQobnVsbCk7XG4gICAgaWYgKHRoaXMuaWRFcnJvcigpIHx8IHRoaXMubmFtZUVycm9yKCkgfHwgdGhpcy5zbHVnRXJyb3IoKSkgcmV0dXJuO1xuICAgIGNvbnN0IHJldmlld2VkOiBSZXBvcnREZWZpbml0aW9uID0ge1xuICAgICAgLi4udGhpcy5yZXBvcnQsIGlkOiB0aGlzLnJlcG9ydElkKCkudHJpbSgpLFxuICAgICAgbmFtZTogdGhpcy5uYW1lKCkudHJpbSgpLCBzbHVnOiB0aGlzLnNsdWcoKS50cmltKCksXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbigpLnRyaW0oKSB8fCB1bmRlZmluZWQsXG4gICAgICBjYXRlZ29yeTogdGhpcy5jYXRlZ29yeSgpLnRyaW0oKSB8fCB1bmRlZmluZWQsXG4gICAgICBtZW51R3JvdXA6IHRoaXMubWVudUdyb3VwKCkudHJpbSgpIHx8IHVuZGVmaW5lZCxcbiAgICAgIGlzUHVibGlzaGVkOiB0aGlzLmlzUHVibGlzaGVkKCksXG4gICAgfTtcbiAgICBjb25zdCBjb250ZXh0S2V5ID0gdGhpcy5zdG9yZS5nZXRTdG9yYWdlQ29udGV4dEtleSgpO1xuICAgIHRoaXMuaXNDaGVja2luZ0lkLnNldCh0cnVlKTtcbiAgICB0aGlzLmlzUHJlcGFyaW5nU2F2ZS5zZXQodHJ1ZSk7XG4gICAgdGhpcy5pZFN0YXR1cy5zZXQoJ2NoZWNraW5nJyk7XG4gICAgdGhpcy5pZE1lc3NhZ2Uuc2V0KCdDaGVja2luZyByZXBvcnQgSUQuLi4nKTtcbiAgICB0aGlzLmlkQ2hlY2sgPSBkZWZlcigoKSA9PiB0aGlzLnN0b3JlLmluc3BlY3RSZXBvcnRJZChyZXZpZXdlZC5pZCkpLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgc3dpdGNoTWFwKHN0YXR1cyA9PiBzdGF0dXMuZXhpc3RzICYmICghTnVtYmVyLmlzSW50ZWdlcihzdGF0dXMudmVyc2lvbikgfHwgc3RhdHVzLnZlcnNpb24hIDwgMClcbiAgICAgICAgPyB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignQ291bGQgbm90IHJlYWQgdGhlIGN1cnJlbnQgcmVwb3J0IHZlcnNpb24uIFBsZWFzZSByZXRyeS4nKSkgOiBvZihzdGF0dXMpKSxcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLmlzQ2hlY2tpbmdJZC5zZXQoZmFsc2UpOyB0aGlzLmlzUHJlcGFyaW5nU2F2ZS5zZXQoZmFsc2UpOyB9KSxcbiAgICApLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiBzdGF0dXMgPT4ge1xuICAgICAgICB0aGlzLmlzQ2hlY2tpbmdJZC5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmlzUHJlcGFyaW5nU2F2ZS5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5yZXBvcnRJZCgpLnRyaW0oKSAhPT0gcmV2aWV3ZWQuaWQgfHwgdGhpcy5zdG9yZS5nZXRTdG9yYWdlQ29udGV4dEtleSgpICE9PSBjb250ZXh0S2V5KSB7XG4gICAgICAgICAgdGhpcy5pZFN0YXR1cy5zZXQoJ2Vycm9yJyk7XG4gICAgICAgICAgdGhpcy5pZE1lc3NhZ2Uuc2V0KCdSZXBvcnRpbmcgY29udGV4dCBjaGFuZ2VkLiBSZXZpZXcgdGhlIGRldGFpbHMgYW5kIHNhdmUgYWdhaW4uJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0dXMuZXhpc3RzKSB7XG4gICAgICAgICAgdGhpcy5pZFN0YXR1cy5zZXQodGhpcy5pZENoYW5nZWQoKSA/ICdkdXBsaWNhdGUnIDogJ2N1cnJlbnQnKTtcbiAgICAgICAgICB0aGlzLmlkTWVzc2FnZS5zZXQoJ1RoaXMgcmVwb3J0IElEIGFscmVhZHkgZXhpc3RzLiBDb25maXJtIHRoZSB1cGRhdGUgb3IgY2FuY2VsLicpO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ29uZmlybWF0aW9uLnNldCh7IHJlcG9ydDogcmV2aWV3ZWQsIGFjdGlvbiwgZXhwZWN0ZWRWZXJzaW9uOiBzdGF0dXMudmVyc2lvbiEsXG4gICAgICAgICAgICBleGlzdGluZ05hbWU6IHN0YXR1cy5uYW1lIHx8IHJldmlld2VkLmlkLCBjb250ZXh0S2V5IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaWRTdGF0dXMuc2V0KCdhdmFpbGFibGUnKTtcbiAgICAgICAgICB0aGlzLmlkTWVzc2FnZS5zZXQoJ1RoaXMgcmVwb3J0IElEIGlzIGF2YWlsYWJsZS4nKTtcbiAgICAgICAgICB0aGlzLnBlcnNpc3QocmV2aWV3ZWQsIGFjdGlvbiwgeyBjcmVhdGVPbmx5OiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5pZFN0YXR1cy5zZXQoJ2Vycm9yJyk7XG4gICAgICAgIHRoaXMuaWRNZXNzYWdlLnNldChlcnJvcj8ubWVzc2FnZSB8fCAnQ291bGQgbm90IHZlcmlmeSB0aGUgcmVwb3J0IElELiBQbGVhc2UgcmV0cnkuJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY2FuY2VsVXBkYXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1NhdmluZygpKSB0aGlzLnVwZGF0ZUNvbmZpcm1hdGlvbi5zZXQobnVsbCk7XG4gIH1cblxuICBjb25maXJtVXBkYXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpcm1hdGlvbiA9IHRoaXMudXBkYXRlQ29uZmlybWF0aW9uKCk7XG4gICAgaWYgKCFjb25maXJtYXRpb24gfHwgdGhpcy5pc1NhdmluZygpIHx8IHRoaXMuaXNDaGVja2luZ0lkKCkpIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZUNvbmZpcm1hdGlvbi5zZXQobnVsbCk7XG4gICAgaWYgKHRoaXMucmVwb3J0SWQoKS50cmltKCkgIT09IGNvbmZpcm1hdGlvbi5yZXBvcnQuaWQgfHwgdGhpcy5zdG9yZS5nZXRTdG9yYWdlQ29udGV4dEtleSgpICE9PSBjb25maXJtYXRpb24uY29udGV4dEtleSkge1xuICAgICAgdGhpcy5zYXZlRXJyb3Iuc2V0KCdSZXBvcnRpbmcgY29udGV4dCBjaGFuZ2VkLiBSZXZpZXcgdGhlIGRldGFpbHMgYW5kIHNhdmUgYWdhaW4uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGVyc2lzdChjb25maXJtYXRpb24ucmVwb3J0LCBjb25maXJtYXRpb24uYWN0aW9uLCB7IGV4cGVjdGVkVmVyc2lvbjogY29uZmlybWF0aW9uLmV4cGVjdGVkVmVyc2lvbiB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcGVyc2lzdChyZXBvcnQ6IFJlcG9ydERlZmluaXRpb24sIGFjdGlvbjogUmVwb3J0U2F2ZWREaWFsb2dSZXN1bHRbJ2FjdGlvbiddLCBvcHRpb25zOiBSZXBvcnRTYXZlT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuaXNTYXZpbmcuc2V0KHRydWUpO1xuICAgIGNvbnN0IHByZXZpb3VzRGlzYWJsZUNsb3NlID0gdGhpcy5kaWFsb2dSZWYuZGlzYWJsZUNsb3NlO1xuICAgIHRoaXMuZGlhbG9nUmVmLmRpc2FibGVDbG9zZSA9IHRydWU7XG4gICAgZGVmZXIoKCkgPT4gdGhpcy5zdG9yZS5zYXZlUmVwb3J0KHJlcG9ydCwgb3B0aW9ucykpLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZiksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNTYXZpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuZGlzYWJsZUNsb3NlID0gcHJldmlvdXNEaXNhYmxlQ2xvc2U7XG4gICAgICB9KSxcbiAgICApLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiBzYXZlZCA9PiB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh7IGFjdGlvbiwgcmVwb3J0OiBzYXZlZCB9KSxcbiAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgIHRoaXMuc2F2ZUVycm9yLnNldChlcnJvcj8ubWVzc2FnZSB8fCAnVGhlIHJlcG9ydCBjb3VsZCBub3QgYmUgc2F2ZWQuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gICAgICAgIGlmICgvYWxyZWFkeSBleGlzdHMvaS50ZXN0KGVycm9yPy5tZXNzYWdlIHx8ICcnKSkge1xuICAgICAgICAgIHRoaXMuaWRTdGF0dXMuc2V0KCdkdXBsaWNhdGUnKTtcbiAgICAgICAgICB0aGlzLmlkTWVzc2FnZS5zZXQoJ1RoaXMgSUQgd2FzIGp1c3Qgc2F2ZWQgYnkgYW5vdGhlciByZXF1ZXN0LiBTYXZlIGFnYWluIHRvIGNvbmZpcm0gYW4gdXBkYXRlLicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzU2F2aW5nKCkpIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gIH1cblxuICBvcGVuTGl2ZVBhZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5zYXZlKCdvcGVuX2xpdmVfcGFnZScpO1xuICB9XG59XG4iXX0=
|