bways-report 0.1.5 → 0.1.7
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 +291 -422
- package/esm2022/lib/core/config/bways-report-config.mjs +83 -0
- package/esm2022/lib/core/index.mjs +2 -1
- package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
- package/esm2022/lib/core/services/index.mjs +2 -1
- package/esm2022/lib/core/services/report-data-discovery.service.mjs +138 -0
- package/esm2022/lib/core/services/report-session-context.service.mjs +11 -7
- package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
- package/esm2022/lib/core/utils/data-normalization.util.mjs +87 -1
- package/esm2022/lib/core/utils/identifier-humanizer.mjs +15 -4
- package/esm2022/lib/core/utils/report-parameter.util.mjs +119 -3
- package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +69 -0
- package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +98 -0
- package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +57 -0
- package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +85 -0
- package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +163 -0
- package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +12 -0
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +20 -30
- package/esm2022/lib/data-access/adapters/index.mjs +8 -1
- package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
- package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +12 -2
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +71 -13
- package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +407 -0
- package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +403 -222
- package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +41 -34
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +142 -20
- package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +154 -5
- package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +11 -5
- package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +15 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +112 -39
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +204 -10
- package/esm2022/lib/features/designer/designer.component.mjs +44 -3
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +70 -3
- package/esm2022/lib/features/embed/bways-report-builder.component.mjs +207 -0
- package/esm2022/lib/features/embed/bways-report-menu.component.mjs +433 -0
- package/esm2022/lib/features/embed/bways-report-page.component.mjs +204 -0
- package/esm2022/lib/features/embed/index.mjs +5 -0
- package/esm2022/lib/features/embed/inject-report-menu.mjs +99 -0
- package/esm2022/lib/features/index.mjs +2 -1
- package/esm2022/lib/features/persistence/services/report-store.service.mjs +43 -5
- package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +4 -4
- package/esm2022/lib/features/routing/index.mjs +2 -2
- package/esm2022/lib/features/routing/models/report-route.models.mjs +1 -1
- package/esm2022/lib/features/routing/report-routes.mjs +42 -1
- package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +6 -8
- package/esm2022/lib/features/routing/services/report-menu.service.mjs +14 -4
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +22 -3
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +121 -15
- package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +28 -5
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +113 -20
- package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
- package/esm2022/lib/primitives/components/index.mjs +2 -1
- package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +9 -3
- package/esm2022/lib/primitives/components/searchable-select/rpt-searchable-select.component.mjs +386 -0
- package/esm2022/lib/provide-reporting.mjs +156 -11
- package/fesm2022/bways-report.mjs +5703 -1766
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/config/bways-report-config.d.ts +161 -0
- package/lib/core/index.d.ts +1 -0
- package/lib/core/models/report-definition.model.d.ts +16 -0
- package/lib/core/services/index.d.ts +1 -0
- package/lib/core/services/report-data-discovery.service.d.ts +38 -0
- package/lib/core/services/report-session-context.service.d.ts +1 -0
- package/lib/core/tokens/reporting-config.token.d.ts +18 -0
- package/lib/core/utils/data-normalization.util.d.ts +10 -0
- package/lib/core/utils/report-parameter.util.d.ts +18 -1
- package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +13 -0
- package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +14 -0
- package/lib/data-access/adapters/endpoint-masterdata.adapter.d.ts +11 -0
- package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +15 -0
- package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +21 -0
- package/lib/data-access/adapters/endpoint-tokens.d.ts +21 -0
- package/lib/data-access/adapters/http-lookup.adapter.d.ts +2 -1
- package/lib/data-access/adapters/index.d.ts +7 -0
- package/lib/data-access/contracts/lookup.contract.d.ts +2 -2
- package/lib/features/designer/components/component-palette/component-palette.component.d.ts +1 -0
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +6 -2
- package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +34 -0
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +6 -0
- package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +3 -0
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +12 -2
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +41 -1
- package/lib/features/designer/components/property-editor/property-editor.component.d.ts +19 -0
- package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +13 -1
- package/lib/features/designer/designer.component.d.ts +4 -0
- package/lib/features/designer/services/designer-state.service.d.ts +12 -1
- package/lib/features/embed/bways-report-builder.component.d.ts +48 -0
- package/lib/features/embed/bways-report-menu.component.d.ts +40 -0
- package/lib/features/embed/bways-report-page.component.d.ts +61 -0
- package/lib/features/embed/index.d.ts +4 -0
- package/lib/features/embed/inject-report-menu.d.ts +44 -0
- package/lib/features/index.d.ts +1 -0
- package/lib/features/persistence/services/report-store.service.d.ts +5 -0
- package/lib/features/routing/index.d.ts +1 -1
- package/lib/features/routing/models/report-route.models.d.ts +3 -0
- package/lib/features/routing/report-routes.d.ts +40 -0
- package/lib/features/routing/resolvers/report.resolver.d.ts +1 -1
- package/lib/features/runtime/dynamic-renderer.component.d.ts +1 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +8 -59
- package/lib/primitives/components/button/rpt-button.component.d.ts +3 -0
- package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +18 -2
- package/lib/primitives/components/index.d.ts +2 -0
- package/lib/primitives/components/searchable-select/rpt-searchable-select.component.d.ts +89 -0
- package/lib/provide-reporting.d.ts +28 -6
- package/package.json +1 -1
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, inject, signal, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { Router } from '@angular/router';
|
|
5
|
+
import { DialogRef, DIALOG_DATA } from '@angular/cdk/dialog';
|
|
6
|
+
import { ReportStoreService } from '../../../persistence/services/report-store.service';
|
|
7
|
+
import { ReportRuntimeComponent } from '../../../runtime/report-runtime.component';
|
|
8
|
+
import { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';
|
|
9
|
+
import { REPORTING_CONFIG } from '../../../../core/tokens/reporting-config.token';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@angular/forms";
|
|
12
|
+
function toSlug(val) {
|
|
13
|
+
return val
|
|
14
|
+
.toLowerCase()
|
|
15
|
+
.trim()
|
|
16
|
+
.replace(/[^\w\s-]/g, '')
|
|
17
|
+
.replace(/[\s_-]+/g, '-')
|
|
18
|
+
.replace(/^-+|-+$/g, '');
|
|
19
|
+
}
|
|
20
|
+
export class ReportSavedDialogComponent {
|
|
21
|
+
dialogRef = inject((DialogRef));
|
|
22
|
+
data = inject(DIALOG_DATA);
|
|
23
|
+
store = inject(ReportStoreService);
|
|
24
|
+
reportingConfig = inject(REPORTING_CONFIG, { optional: true });
|
|
25
|
+
router = inject(Router, { optional: true });
|
|
26
|
+
report = this.data.report;
|
|
27
|
+
baseRoute = signal(this.data.routeBase || this.reportingConfig?.routeBase || 'reports');
|
|
28
|
+
name = signal(this.report.name || 'Untitled Report');
|
|
29
|
+
slug = signal(this.report.slug || toSlug(this.report.name || 'report'));
|
|
30
|
+
menuGroup = signal(this.report.menuGroup || this.report.category || 'General');
|
|
31
|
+
isPublished = signal(this.report.isPublished ?? true);
|
|
32
|
+
copied = signal(false);
|
|
33
|
+
savedStateMessage = signal(null);
|
|
34
|
+
fullRoute = computed(() => {
|
|
35
|
+
const base = this.baseRoute().replace(/^\/+|\/+$/g, '');
|
|
36
|
+
const s = this.slug().replace(/^\/+|\/+$/g, '') || this.report.id;
|
|
37
|
+
return `/${base}/${s}`;
|
|
38
|
+
});
|
|
39
|
+
currentPreviewDef = computed(() => ({
|
|
40
|
+
...this.report,
|
|
41
|
+
name: this.name(),
|
|
42
|
+
slug: this.slug(),
|
|
43
|
+
menuGroup: this.menuGroup(),
|
|
44
|
+
isPublished: this.isPublished(),
|
|
45
|
+
}));
|
|
46
|
+
onNameChange(newName) {
|
|
47
|
+
this.name.set(newName);
|
|
48
|
+
// If slug was auto-derived, keep it updated
|
|
49
|
+
if (!this.report.slug) {
|
|
50
|
+
this.slug.set(toSlug(newName));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
copyRoute() {
|
|
54
|
+
if (typeof navigator !== 'undefined' && navigator.clipboard) {
|
|
55
|
+
navigator.clipboard.writeText(this.fullRoute()).then(() => {
|
|
56
|
+
this.copied.set(true);
|
|
57
|
+
setTimeout(() => this.copied.set(false), 2000);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
saveUpdatedDefinition() {
|
|
62
|
+
const updated = {
|
|
63
|
+
...this.report,
|
|
64
|
+
name: this.name().trim() || this.report.name,
|
|
65
|
+
slug: this.slug().trim() || toSlug(this.name()),
|
|
66
|
+
menuGroup: this.menuGroup().trim() || undefined,
|
|
67
|
+
isPublished: this.isPublished(),
|
|
68
|
+
updatedAt: new Date().toISOString(),
|
|
69
|
+
};
|
|
70
|
+
// Save to persistence store so navigation & menu updates immediately
|
|
71
|
+
this.store.saveReport(updated).subscribe({
|
|
72
|
+
next: () => this.savedStateMessage.set('Settings synchronized'),
|
|
73
|
+
error: (err) => console.warn('[ReportSavedDialog] Failed to sync settings:', err),
|
|
74
|
+
});
|
|
75
|
+
return updated;
|
|
76
|
+
}
|
|
77
|
+
close(action = 'back_to_designer') {
|
|
78
|
+
const updated = this.saveUpdatedDefinition();
|
|
79
|
+
this.dialogRef.close({ action, report: updated });
|
|
80
|
+
}
|
|
81
|
+
openLivePage() {
|
|
82
|
+
const updated = this.saveUpdatedDefinition();
|
|
83
|
+
this.dialogRef.close({ action: 'open_live_page', report: updated });
|
|
84
|
+
const route = this.fullRoute();
|
|
85
|
+
if (this.router) {
|
|
86
|
+
this.router.navigateByUrl(route);
|
|
87
|
+
}
|
|
88
|
+
else if (typeof window !== 'undefined') {
|
|
89
|
+
window.location.href = route;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportSavedDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
93
|
+
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" role="dialog" aria-modal="true" aria-labelledby="dialog-title">
|
|
95
|
+
<!-- Modal Header -->
|
|
96
|
+
<div class="rpt-dialog-header">
|
|
97
|
+
<div class="rpt-header-left">
|
|
98
|
+
<div class="rpt-success-icon-badge">
|
|
99
|
+
<rpt-icon name="check" [size]="14" />
|
|
100
|
+
</div>
|
|
101
|
+
<div>
|
|
102
|
+
<h2 id="dialog-title" class="rpt-dialog-title">Report Saved Successfully</h2>
|
|
103
|
+
<p class="rpt-dialog-subtitle">Configure page routing, navigation placement, and test the generated form.</p>
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
<button
|
|
107
|
+
type="button"
|
|
108
|
+
class="rpt-dialog-close"
|
|
109
|
+
(click)="close('back_to_designer')"
|
|
110
|
+
aria-label="Close dialog"
|
|
111
|
+
>
|
|
112
|
+
<rpt-icon name="x" [size]="14" />
|
|
113
|
+
</button>
|
|
114
|
+
</div>
|
|
115
|
+
|
|
116
|
+
<!-- Modal Body (Two-Column Split) -->
|
|
117
|
+
<div class="rpt-dialog-body">
|
|
118
|
+
<!-- Left Column: Settings & Publishing -->
|
|
119
|
+
<div class="rpt-settings-column">
|
|
120
|
+
<div class="rpt-section-header">Page Navigation & Settings</div>
|
|
121
|
+
|
|
122
|
+
<!-- Report Name -->
|
|
123
|
+
<div class="rpt-form-group">
|
|
124
|
+
<label class="rpt-label" for="rpt-dlg-name">Display Name</label>
|
|
125
|
+
<input
|
|
126
|
+
id="rpt-dlg-name"
|
|
127
|
+
type="text"
|
|
128
|
+
class="rpt-input"
|
|
129
|
+
[ngModel]="name()"
|
|
130
|
+
(ngModelChange)="onNameChange($event)"
|
|
131
|
+
placeholder="e.g. Sales Register"
|
|
132
|
+
/>
|
|
133
|
+
</div>
|
|
134
|
+
|
|
135
|
+
<!-- URL Slug -->
|
|
136
|
+
<div class="rpt-form-group">
|
|
137
|
+
<label class="rpt-label" for="rpt-dlg-slug">URL Slug</label>
|
|
138
|
+
<div class="rpt-slug-input-wrapper">
|
|
139
|
+
<span class="rpt-slug-prefix">/{{ baseRoute() }}/</span>
|
|
140
|
+
<input
|
|
141
|
+
id="rpt-dlg-slug"
|
|
142
|
+
type="text"
|
|
143
|
+
class="rpt-input rpt-slug-field"
|
|
144
|
+
[ngModel]="slug()"
|
|
145
|
+
(ngModelChange)="slug.set($event)"
|
|
146
|
+
placeholder="sale-report"
|
|
147
|
+
/>
|
|
148
|
+
</div>
|
|
149
|
+
<span class="rpt-help-text">Direct URL for users to view this report page.</span>
|
|
150
|
+
</div>
|
|
151
|
+
|
|
152
|
+
<!-- Menu Group / Category -->
|
|
153
|
+
<div class="rpt-form-group">
|
|
154
|
+
<label class="rpt-label" for="rpt-dlg-group">Menu Group</label>
|
|
155
|
+
<input
|
|
156
|
+
id="rpt-dlg-group"
|
|
157
|
+
type="text"
|
|
158
|
+
class="rpt-input"
|
|
159
|
+
[ngModel]="menuGroup()"
|
|
160
|
+
(ngModelChange)="menuGroup.set($event)"
|
|
161
|
+
placeholder="e.g. Sales, Finance, Operations"
|
|
162
|
+
/>
|
|
163
|
+
<span class="rpt-help-text">Sidebar folder heading where this page appears.</span>
|
|
164
|
+
</div>
|
|
165
|
+
|
|
166
|
+
<!-- Publish to Menu Toggle -->
|
|
167
|
+
<div class="rpt-publish-card">
|
|
168
|
+
<div class="rpt-publish-text">
|
|
169
|
+
<span class="rpt-publish-title">Publish to Menu</span>
|
|
170
|
+
<span class="rpt-publish-desc">Display in the sidebar navigation.</span>
|
|
171
|
+
</div>
|
|
172
|
+
<label class="rpt-switch">
|
|
173
|
+
<input
|
|
174
|
+
type="checkbox"
|
|
175
|
+
[checked]="isPublished()"
|
|
176
|
+
(change)="isPublished.set(!isPublished())"
|
|
177
|
+
/>
|
|
178
|
+
<span class="rpt-slider"></span>
|
|
179
|
+
</label>
|
|
180
|
+
</div>
|
|
181
|
+
|
|
182
|
+
<!-- Copy URL Box -->
|
|
183
|
+
<div class="rpt-share-card">
|
|
184
|
+
<div class="rpt-share-url-row">
|
|
185
|
+
<span class="rpt-share-label">Live:</span>
|
|
186
|
+
<code class="rpt-share-code">{{ fullRoute() }}</code>
|
|
187
|
+
<button
|
|
188
|
+
type="button"
|
|
189
|
+
class="rpt-btn-copy"
|
|
190
|
+
(click)="copyRoute()"
|
|
191
|
+
[title]="copied() ? 'Copied!' : 'Copy Route'"
|
|
192
|
+
>
|
|
193
|
+
<rpt-icon [name]="copied() ? 'check' : 'copy'" [size]="11" />
|
|
194
|
+
<span>{{ copied() ? 'Copied' : 'Copy' }}</span>
|
|
195
|
+
</button>
|
|
196
|
+
</div>
|
|
197
|
+
</div>
|
|
198
|
+
</div>
|
|
199
|
+
|
|
200
|
+
<!-- Right Column: Interactive Form Live Preview -->
|
|
201
|
+
<div class="rpt-preview-column">
|
|
202
|
+
<div class="rpt-preview-header">
|
|
203
|
+
<div class="rpt-preview-badge">
|
|
204
|
+
<span class="rpt-live-dot"></span>
|
|
205
|
+
<span>Live Generated Form</span>
|
|
206
|
+
</div>
|
|
207
|
+
<span class="rpt-preview-hint">Interactive preview matching runtime page</span>
|
|
208
|
+
</div>
|
|
209
|
+
|
|
210
|
+
<div class="rpt-preview-runtime-wrapper">
|
|
211
|
+
<div class="rpt-preview-card-frame">
|
|
212
|
+
<rpt-runtime [report]="currentPreviewDef()" />
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
</div>
|
|
216
|
+
</div>
|
|
217
|
+
|
|
218
|
+
<!-- Modal Footer -->
|
|
219
|
+
<div class="rpt-dialog-footer">
|
|
220
|
+
<div class="rpt-footer-left">
|
|
221
|
+
@if (savedStateMessage()) {
|
|
222
|
+
<span class="rpt-saved-pill">
|
|
223
|
+
<rpt-icon name="check" [size]="11" />
|
|
224
|
+
{{ savedStateMessage() }}
|
|
225
|
+
</span>
|
|
226
|
+
}
|
|
227
|
+
</div>
|
|
228
|
+
<div class="rpt-footer-actions">
|
|
229
|
+
<button
|
|
230
|
+
type="button"
|
|
231
|
+
class="rpt-btn rpt-btn-secondary"
|
|
232
|
+
(click)="close('back_to_designer')"
|
|
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>
|
|
243
|
+
</button>
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
</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"], outputs: ["resetRequested", "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
|
+
}
|
|
249
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportSavedDialogComponent, decorators: [{
|
|
250
|
+
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" role="dialog" aria-modal="true" aria-labelledby="dialog-title">
|
|
253
|
+
<!-- Modal Header -->
|
|
254
|
+
<div class="rpt-dialog-header">
|
|
255
|
+
<div class="rpt-header-left">
|
|
256
|
+
<div class="rpt-success-icon-badge">
|
|
257
|
+
<rpt-icon name="check" [size]="14" />
|
|
258
|
+
</div>
|
|
259
|
+
<div>
|
|
260
|
+
<h2 id="dialog-title" class="rpt-dialog-title">Report Saved Successfully</h2>
|
|
261
|
+
<p class="rpt-dialog-subtitle">Configure page routing, navigation placement, and test the generated form.</p>
|
|
262
|
+
</div>
|
|
263
|
+
</div>
|
|
264
|
+
<button
|
|
265
|
+
type="button"
|
|
266
|
+
class="rpt-dialog-close"
|
|
267
|
+
(click)="close('back_to_designer')"
|
|
268
|
+
aria-label="Close dialog"
|
|
269
|
+
>
|
|
270
|
+
<rpt-icon name="x" [size]="14" />
|
|
271
|
+
</button>
|
|
272
|
+
</div>
|
|
273
|
+
|
|
274
|
+
<!-- Modal Body (Two-Column Split) -->
|
|
275
|
+
<div class="rpt-dialog-body">
|
|
276
|
+
<!-- Left Column: Settings & Publishing -->
|
|
277
|
+
<div class="rpt-settings-column">
|
|
278
|
+
<div class="rpt-section-header">Page Navigation & Settings</div>
|
|
279
|
+
|
|
280
|
+
<!-- Report Name -->
|
|
281
|
+
<div class="rpt-form-group">
|
|
282
|
+
<label class="rpt-label" for="rpt-dlg-name">Display Name</label>
|
|
283
|
+
<input
|
|
284
|
+
id="rpt-dlg-name"
|
|
285
|
+
type="text"
|
|
286
|
+
class="rpt-input"
|
|
287
|
+
[ngModel]="name()"
|
|
288
|
+
(ngModelChange)="onNameChange($event)"
|
|
289
|
+
placeholder="e.g. Sales Register"
|
|
290
|
+
/>
|
|
291
|
+
</div>
|
|
292
|
+
|
|
293
|
+
<!-- URL Slug -->
|
|
294
|
+
<div class="rpt-form-group">
|
|
295
|
+
<label class="rpt-label" for="rpt-dlg-slug">URL Slug</label>
|
|
296
|
+
<div class="rpt-slug-input-wrapper">
|
|
297
|
+
<span class="rpt-slug-prefix">/{{ baseRoute() }}/</span>
|
|
298
|
+
<input
|
|
299
|
+
id="rpt-dlg-slug"
|
|
300
|
+
type="text"
|
|
301
|
+
class="rpt-input rpt-slug-field"
|
|
302
|
+
[ngModel]="slug()"
|
|
303
|
+
(ngModelChange)="slug.set($event)"
|
|
304
|
+
placeholder="sale-report"
|
|
305
|
+
/>
|
|
306
|
+
</div>
|
|
307
|
+
<span class="rpt-help-text">Direct URL for users to view this report page.</span>
|
|
308
|
+
</div>
|
|
309
|
+
|
|
310
|
+
<!-- Menu Group / Category -->
|
|
311
|
+
<div class="rpt-form-group">
|
|
312
|
+
<label class="rpt-label" for="rpt-dlg-group">Menu Group</label>
|
|
313
|
+
<input
|
|
314
|
+
id="rpt-dlg-group"
|
|
315
|
+
type="text"
|
|
316
|
+
class="rpt-input"
|
|
317
|
+
[ngModel]="menuGroup()"
|
|
318
|
+
(ngModelChange)="menuGroup.set($event)"
|
|
319
|
+
placeholder="e.g. Sales, Finance, Operations"
|
|
320
|
+
/>
|
|
321
|
+
<span class="rpt-help-text">Sidebar folder heading where this page appears.</span>
|
|
322
|
+
</div>
|
|
323
|
+
|
|
324
|
+
<!-- Publish to Menu Toggle -->
|
|
325
|
+
<div class="rpt-publish-card">
|
|
326
|
+
<div class="rpt-publish-text">
|
|
327
|
+
<span class="rpt-publish-title">Publish to Menu</span>
|
|
328
|
+
<span class="rpt-publish-desc">Display in the sidebar navigation.</span>
|
|
329
|
+
</div>
|
|
330
|
+
<label class="rpt-switch">
|
|
331
|
+
<input
|
|
332
|
+
type="checkbox"
|
|
333
|
+
[checked]="isPublished()"
|
|
334
|
+
(change)="isPublished.set(!isPublished())"
|
|
335
|
+
/>
|
|
336
|
+
<span class="rpt-slider"></span>
|
|
337
|
+
</label>
|
|
338
|
+
</div>
|
|
339
|
+
|
|
340
|
+
<!-- Copy URL Box -->
|
|
341
|
+
<div class="rpt-share-card">
|
|
342
|
+
<div class="rpt-share-url-row">
|
|
343
|
+
<span class="rpt-share-label">Live:</span>
|
|
344
|
+
<code class="rpt-share-code">{{ fullRoute() }}</code>
|
|
345
|
+
<button
|
|
346
|
+
type="button"
|
|
347
|
+
class="rpt-btn-copy"
|
|
348
|
+
(click)="copyRoute()"
|
|
349
|
+
[title]="copied() ? 'Copied!' : 'Copy Route'"
|
|
350
|
+
>
|
|
351
|
+
<rpt-icon [name]="copied() ? 'check' : 'copy'" [size]="11" />
|
|
352
|
+
<span>{{ copied() ? 'Copied' : 'Copy' }}</span>
|
|
353
|
+
</button>
|
|
354
|
+
</div>
|
|
355
|
+
</div>
|
|
356
|
+
</div>
|
|
357
|
+
|
|
358
|
+
<!-- Right Column: Interactive Form Live Preview -->
|
|
359
|
+
<div class="rpt-preview-column">
|
|
360
|
+
<div class="rpt-preview-header">
|
|
361
|
+
<div class="rpt-preview-badge">
|
|
362
|
+
<span class="rpt-live-dot"></span>
|
|
363
|
+
<span>Live Generated Form</span>
|
|
364
|
+
</div>
|
|
365
|
+
<span class="rpt-preview-hint">Interactive preview matching runtime page</span>
|
|
366
|
+
</div>
|
|
367
|
+
|
|
368
|
+
<div class="rpt-preview-runtime-wrapper">
|
|
369
|
+
<div class="rpt-preview-card-frame">
|
|
370
|
+
<rpt-runtime [report]="currentPreviewDef()" />
|
|
371
|
+
</div>
|
|
372
|
+
</div>
|
|
373
|
+
</div>
|
|
374
|
+
</div>
|
|
375
|
+
|
|
376
|
+
<!-- Modal Footer -->
|
|
377
|
+
<div class="rpt-dialog-footer">
|
|
378
|
+
<div class="rpt-footer-left">
|
|
379
|
+
@if (savedStateMessage()) {
|
|
380
|
+
<span class="rpt-saved-pill">
|
|
381
|
+
<rpt-icon name="check" [size]="11" />
|
|
382
|
+
{{ savedStateMessage() }}
|
|
383
|
+
</span>
|
|
384
|
+
}
|
|
385
|
+
</div>
|
|
386
|
+
<div class="rpt-footer-actions">
|
|
387
|
+
<button
|
|
388
|
+
type="button"
|
|
389
|
+
class="rpt-btn rpt-btn-secondary"
|
|
390
|
+
(click)="close('back_to_designer')"
|
|
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>
|
|
401
|
+
</button>
|
|
402
|
+
</div>
|
|
403
|
+
</div>
|
|
404
|
+
</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"] }]
|
|
406
|
+
}] });
|
|
407
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXNhdmVkLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL2RpYWxvZ3MvcmVwb3J0LXNhdmVkLWRpYWxvZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUM3RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7O0FBWWxGLFNBQVMsTUFBTSxDQUFDLEdBQVc7SUFDekIsT0FBTyxHQUFHO1NBQ1AsV0FBVyxFQUFFO1NBQ2IsSUFBSSxFQUFFO1NBQ04sT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7U0FDeEIsT0FBTyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUM7U0FDeEIsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBa29CRCxNQUFNLE9BQU8sMEJBQTBCO0lB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwSlQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IERpYWxvZ1JlZiwgRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9jZGsvZGlhbG9nJztcbmltcG9ydCB7IFJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRTdG9yZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9wZXJzaXN0ZW5jZS9zZXJ2aWNlcy9yZXBvcnQtc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRSdW50aW1lQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vcnVudGltZS9yZXBvcnQtcnVudGltZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSRVBPUlRJTkdfQ09ORklHIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS90b2tlbnMvcmVwb3J0aW5nLWNvbmZpZy50b2tlbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0U2F2ZWREaWFsb2dEYXRhIHtcbiAgcmVwb3J0OiBSZXBvcnREZWZpbml0aW9uO1xuICByb3V0ZUJhc2U/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==
|