tango-app-ui-store-builder 1.2.4 → 1.2.6
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/esm2022/lib/components/collection-update-ai/collection-update-ai.component.mjs +3 -2
- package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +3 -2
- package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.mjs +3 -2
- package/esm2022/lib/components/create-fixture/create-fixture.component.mjs +41 -4
- package/esm2022/lib/components/custom-select/custom-select.component.mjs +14 -5
- package/esm2022/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.mjs +3 -2
- package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +3 -2
- package/esm2022/lib/components/fixture-template-table/find-and-replace/find-and-replace.component.mjs +3 -2
- package/esm2022/lib/components/fixture-template-table/fixture-template-table.component.mjs +2 -3
- package/esm2022/lib/components/fixture-template-tree/fixture-template-tree.component.mjs +3 -2
- package/esm2022/lib/components/manage-plano/verification-table/verification-table.component.mjs +2 -3
- package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +87 -13
- package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +4 -3
- package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +114 -4
- package/esm2022/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.mjs +7 -2
- package/esm2022/lib/components/onboard-store-plano/onboard-fixture/onboard-fixture.component.mjs +3 -3
- package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +255 -25
- package/esm2022/lib/components/plano-configurations/plano-configurations.component.mjs +162 -3
- package/esm2022/lib/components/plano-library/fixture-library/fixture-library.component.mjs +3 -4
- package/esm2022/lib/components/plano-library/vm-library/vm-library.component.mjs +3 -4
- package/esm2022/lib/components/plano-tools/cad-files/cad-files.component.mjs +88 -0
- package/esm2022/lib/components/plano-tools/cad-render/cad-render.component.mjs +4 -5
- package/esm2022/lib/components/plano-tools/move-bucket/move-bucket.component.mjs +239 -0
- package/esm2022/lib/components/plano-tools/plano-data-export/plano-data-export.component.mjs +98 -3
- package/esm2022/lib/components/plano-tools/plano-migrate/plano-migrate.component.mjs +5 -4
- package/esm2022/lib/components/plano-tools/store-exports/store-exports.component.mjs +135 -33
- package/esm2022/lib/components/plano-tools/swap-template/swap-template.component.mjs +325 -0
- package/esm2022/lib/components/plano-tools/tools-parent/tools-parent.component.mjs +3 -3
- package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +3 -2
- package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +3 -2
- package/esm2022/lib/components/planogram/plano-analytics/plano-analytics.component.mjs +3 -2
- package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +1 -1
- package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +3 -2
- package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +3 -2
- package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +2 -3
- package/esm2022/lib/components/popups/delete-confirmation/delete-confirmation.component.mjs +10 -3
- package/esm2022/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.mjs +3 -4
- package/esm2022/lib/components/store-plano/store-plano.component.mjs +4 -3
- package/esm2022/lib/data/fixture-template.data.mjs +12 -1
- package/esm2022/lib/functions/plano.function.mjs +13 -1
- package/esm2022/lib/services/store-builder.service.mjs +35 -1
- package/esm2022/lib/tango-store-builder-routing.module.mjs +16 -1
- package/esm2022/lib/tango-store-builder.module.mjs +10 -1
- package/fesm2022/tango-app-ui-store-builder.mjs +1914 -401
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/create-fixture/create-fixture.component.d.ts +3 -0
- package/lib/components/custom-select/custom-select.component.d.ts +5 -2
- package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +4 -4
- package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +5 -5
- package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +7 -1
- package/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.d.ts +14 -1
- package/lib/components/onboard-store-plano/onboard-store-plano.component.d.ts +19 -2
- package/lib/components/plano-configurations/plano-configurations.component.d.ts +19 -1
- package/lib/components/plano-tools/cad-files/cad-files.component.d.ts +30 -0
- package/lib/components/plano-tools/move-bucket/move-bucket.component.d.ts +64 -0
- package/lib/components/plano-tools/plano-data-export/plano-data-export.component.d.ts +26 -0
- package/lib/components/plano-tools/store-exports/store-exports.component.d.ts +28 -3
- package/lib/components/plano-tools/swap-template/swap-template.component.d.ts +83 -0
- package/lib/components/popups/delete-confirmation/delete-confirmation.component.d.ts +3 -1
- package/lib/data/fixture-template.data.d.ts +8 -0
- package/lib/functions/plano.function.d.ts +1 -0
- package/lib/services/store-builder.service.d.ts +26 -0
- package/lib/tango-store-builder.module.d.ts +56 -53
- package/package.json +1 -1
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { Component } from '@angular/core';
|
|
2
|
-
import { Subject, takeUntil, debounceTime, filter, distinctUntilChanged,
|
|
2
|
+
import { Subject, takeUntil, debounceTime, filter, distinctUntilChanged, timer, of, EMPTY, switchMap, catchError, } from 'rxjs';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import * as i1 from "../../../services/store-builder.service";
|
|
5
5
|
import * as i2 from "tango-app-ui-global";
|
|
6
6
|
import * as i3 from "../../collection-update-ai/components/store-select/store-select.component";
|
|
7
|
+
const POLL_INITIAL_DELAY_MS = 15000;
|
|
8
|
+
const POLL_INTERVAL_MS = 10000;
|
|
9
|
+
const POLL_TIMEOUT_MS = 30 * 60 * 1000;
|
|
7
10
|
export class StoreExportsComponent {
|
|
8
11
|
sbs;
|
|
9
12
|
gs;
|
|
@@ -11,10 +14,13 @@ export class StoreExportsComponent {
|
|
|
11
14
|
storeOptions = [];
|
|
12
15
|
initialStores = [];
|
|
13
16
|
selectedStores = [];
|
|
14
|
-
|
|
17
|
+
starting = null;
|
|
18
|
+
activeJob = null;
|
|
19
|
+
busyInfo = null;
|
|
15
20
|
message = '';
|
|
16
21
|
messageType = 'success';
|
|
17
22
|
destroy$ = new Subject();
|
|
23
|
+
stopPoll$ = new Subject();
|
|
18
24
|
constructor(sbs, gs) {
|
|
19
25
|
this.sbs = sbs;
|
|
20
26
|
this.gs = gs;
|
|
@@ -27,14 +33,16 @@ export class StoreExportsComponent {
|
|
|
27
33
|
this.clientId = data.client;
|
|
28
34
|
}
|
|
29
35
|
else {
|
|
30
|
-
|
|
36
|
+
const headerData = JSON.parse(localStorage.getItem('header-filters'));
|
|
31
37
|
this.clientId = headerData?.client;
|
|
32
38
|
}
|
|
33
39
|
this.loadStores();
|
|
34
40
|
});
|
|
35
41
|
}
|
|
36
42
|
loadStores() {
|
|
37
|
-
this.sbs
|
|
43
|
+
this.sbs
|
|
44
|
+
.getStoreOrClusterList({ searchMode: 'store' })
|
|
45
|
+
.subscribe((res) => {
|
|
38
46
|
if (res?.data)
|
|
39
47
|
this.storeOptions = res.data;
|
|
40
48
|
});
|
|
@@ -48,59 +56,153 @@ export class StoreExportsComponent {
|
|
|
48
56
|
onExportOrderSheet() {
|
|
49
57
|
this.runExport('order');
|
|
50
58
|
}
|
|
59
|
+
get isWorking() {
|
|
60
|
+
return this.starting !== null || this.activeJob?.status === 'running';
|
|
61
|
+
}
|
|
62
|
+
kindLabel(kind) {
|
|
63
|
+
return kind === 'mbq' ? 'MBQ' : kind === 'order' ? 'Order Sheet' : 'Export';
|
|
64
|
+
}
|
|
65
|
+
startedAgo(iso) {
|
|
66
|
+
if (!iso)
|
|
67
|
+
return '';
|
|
68
|
+
const ms = Date.now() - new Date(iso).getTime();
|
|
69
|
+
if (ms < 60000)
|
|
70
|
+
return `${Math.max(0, Math.floor(ms / 1000))}s ago`;
|
|
71
|
+
if (ms < 3600000)
|
|
72
|
+
return `${Math.floor(ms / 60000)}m ago`;
|
|
73
|
+
return `${Math.floor(ms / 3600000)}h ago`;
|
|
74
|
+
}
|
|
75
|
+
dismissResult() {
|
|
76
|
+
this.activeJob = null;
|
|
77
|
+
this.busyInfo = null;
|
|
78
|
+
}
|
|
51
79
|
runExport(kind) {
|
|
52
|
-
if (this.
|
|
80
|
+
if (this.isWorking)
|
|
53
81
|
return;
|
|
54
82
|
if (this.selectedStores.length === 0) {
|
|
55
83
|
this.showMessage('Please select at least one store.', 'error');
|
|
56
84
|
return;
|
|
57
85
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
let baseFile = kind === 'mbq' ? 'mbq_export' : 'order_sheet_export';
|
|
63
|
-
let suffix = storeName.length === 1
|
|
64
|
-
? this.safeName(storeName[0])
|
|
65
|
-
: `${storeName.length}_stores`;
|
|
66
|
-
let fileName = `${baseFile}_${suffix}_${Date.now()}`;
|
|
67
|
-
this.loading = kind;
|
|
86
|
+
const storeName = this.selectedStores.map((s) => s.label);
|
|
87
|
+
this.busyInfo = null;
|
|
88
|
+
this.activeJob = null;
|
|
89
|
+
this.starting = kind;
|
|
68
90
|
this.message = '';
|
|
69
|
-
|
|
70
|
-
.
|
|
71
|
-
this.
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
91
|
+
const submit$ = kind === 'mbq'
|
|
92
|
+
? this.sbs.exportMBQSheetAsync({ storeName })
|
|
93
|
+
: this.sbs.exportPlanoOrderSheetAsync({ storeName });
|
|
94
|
+
submit$.subscribe({
|
|
95
|
+
next: (resp) => {
|
|
96
|
+
this.starting = null;
|
|
97
|
+
const body = resp?.body ?? resp;
|
|
98
|
+
const jobId = body?.data?.jobId;
|
|
99
|
+
if (!jobId) {
|
|
100
|
+
this.showMessage(`Failed to start ${this.kindLabel(kind)} export — server did not return a jobId.`, 'error');
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
this.activeJob = {
|
|
104
|
+
jobId,
|
|
105
|
+
kind,
|
|
106
|
+
status: 'running',
|
|
107
|
+
startedAt: new Date().toISOString(),
|
|
108
|
+
storeCount: storeName.length,
|
|
109
|
+
};
|
|
110
|
+
this.startPolling(jobId);
|
|
77
111
|
},
|
|
78
112
|
error: (err) => {
|
|
79
|
-
this.
|
|
80
|
-
|
|
113
|
+
this.starting = null;
|
|
114
|
+
const status = err?.status;
|
|
115
|
+
const respBody = err?.error;
|
|
116
|
+
if (status === 409 && respBody?.data?.jobId) {
|
|
117
|
+
this.busyInfo = {
|
|
118
|
+
jobId: respBody.data.jobId,
|
|
119
|
+
kind: respBody.data.kind,
|
|
120
|
+
startedAt: respBody.data.startedAt,
|
|
121
|
+
storeCount: respBody.data.storeCount,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
const errMsg = (typeof respBody?.error === 'string' && respBody.error) ||
|
|
126
|
+
respBody?.error?.message ||
|
|
127
|
+
respBody?.message ||
|
|
128
|
+
err?.message ||
|
|
129
|
+
`Failed to start ${this.kindLabel(kind)} export.`;
|
|
130
|
+
this.showMessage(errMsg, 'error');
|
|
131
|
+
}
|
|
81
132
|
},
|
|
82
133
|
});
|
|
83
134
|
}
|
|
84
|
-
|
|
85
|
-
|
|
135
|
+
startPolling(jobId) {
|
|
136
|
+
this.stopPoll$.next();
|
|
137
|
+
const pollStarted = Date.now();
|
|
138
|
+
timer(POLL_INITIAL_DELAY_MS, POLL_INTERVAL_MS)
|
|
139
|
+
.pipe(takeUntil(this.destroy$), takeUntil(this.stopPoll$), switchMap(() => this.sbs.getPlanoExportJob(jobId).pipe(catchError(() => {
|
|
140
|
+
if (Date.now() - pollStarted > POLL_TIMEOUT_MS) {
|
|
141
|
+
this.handlePollTimeout();
|
|
142
|
+
return EMPTY;
|
|
143
|
+
}
|
|
144
|
+
return of(null);
|
|
145
|
+
}))))
|
|
146
|
+
.subscribe((res) => {
|
|
147
|
+
if (!res)
|
|
148
|
+
return;
|
|
149
|
+
const job = res?.data;
|
|
150
|
+
if (!job)
|
|
151
|
+
return;
|
|
152
|
+
this.activeJob = {
|
|
153
|
+
jobId: job.jobId,
|
|
154
|
+
kind: job.kind,
|
|
155
|
+
status: job.status,
|
|
156
|
+
startedAt: job.startedAt,
|
|
157
|
+
completedAt: job.completedAt,
|
|
158
|
+
downloadUrl: job.downloadUrl,
|
|
159
|
+
error: job.error,
|
|
160
|
+
rowCount: job.rowCount,
|
|
161
|
+
storeCount: job.storeCount,
|
|
162
|
+
};
|
|
163
|
+
if (job.status === 'succeeded') {
|
|
164
|
+
this.stopPoll$.next();
|
|
165
|
+
this.showMessage(`${this.kindLabel(job.kind)} export is ready.`, 'success');
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (job.status === 'failed') {
|
|
169
|
+
this.stopPoll$.next();
|
|
170
|
+
this.showMessage(`${this.kindLabel(job.kind)} export failed: ${job.error || 'Unknown error'}`, 'error');
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (job.status === 'running' &&
|
|
174
|
+
Date.now() - pollStarted > POLL_TIMEOUT_MS) {
|
|
175
|
+
this.handlePollTimeout();
|
|
176
|
+
}
|
|
177
|
+
});
|
|
86
178
|
}
|
|
87
|
-
|
|
88
|
-
|
|
179
|
+
handlePollTimeout() {
|
|
180
|
+
this.stopPoll$.next();
|
|
181
|
+
if (this.activeJob) {
|
|
182
|
+
this.activeJob = {
|
|
183
|
+
...this.activeJob,
|
|
184
|
+
status: 'failed',
|
|
185
|
+
error: 'Timed out waiting for export to complete.',
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
this.showMessage('Timed out waiting for export to complete. The job may still be running on the server — refresh later.', 'error');
|
|
89
189
|
}
|
|
90
190
|
showMessage(msg, type) {
|
|
91
191
|
this.message = msg;
|
|
92
192
|
this.messageType = type;
|
|
93
|
-
setTimeout(() => (this.message = ''),
|
|
193
|
+
setTimeout(() => (this.message = ''), 6000);
|
|
94
194
|
}
|
|
95
195
|
ngOnDestroy() {
|
|
196
|
+
this.stopPoll$.next();
|
|
197
|
+
this.stopPoll$.complete();
|
|
96
198
|
this.destroy$.next();
|
|
97
199
|
this.destroy$.complete();
|
|
98
200
|
}
|
|
99
201
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StoreExportsComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.GlobalStateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
100
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: StoreExportsComponent, selector: "lib-store-exports", ngImport: i0, template: "<section class=\"store-exports p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 700px;\">\r\n <h5 class=\"mb-1\">Store Exports</h5>\r\n <p class=\"text-muted small mb-3\">\r\n Generate per-store fixture exports. Select one or more stores, then choose an export.\r\n </p>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Stores</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"onExportMbq()\"\r\n [disabled]=\"
|
|
202
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: StoreExportsComponent, selector: "lib-store-exports", ngImport: i0, template: "<section class=\"store-exports p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 700px;\">\r\n <h5 class=\"mb-1\">Store Exports</h5>\r\n <p class=\"text-muted small mb-3\">\r\n Generate per-store fixture exports. Select one or more stores, then choose an export.\r\n Large exports run in the background and are saved to S3 \u2014 a download link appears here when ready.\r\n </p>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Stores</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"onExportMbq()\"\r\n [disabled]=\"isWorking || selectedStores.length === 0\">\r\n @if (starting === 'mbq') {\r\n Starting MBQ...\r\n } @else if (activeJob?.status === 'running' && activeJob?.kind === 'mbq') {\r\n Running MBQ...\r\n } @else {\r\n Export MBQ\r\n }\r\n </button>\r\n\r\n <button\r\n class=\"btn btn-success\"\r\n (click)=\"onExportOrderSheet()\"\r\n [disabled]=\"isWorking || selectedStores.length === 0\">\r\n @if (starting === 'order') {\r\n Starting Order Sheet...\r\n } @else if (activeJob?.status === 'running' && activeJob?.kind === 'order') {\r\n Running Order Sheet...\r\n } @else {\r\n Export Order Sheet\r\n }\r\n </button>\r\n </div>\r\n\r\n @if (busyInfo) {\r\n <div class=\"mt-3 alert alert-warning\">\r\n Another {{ kindLabel(busyInfo.kind) }} export is currently running@if (busyInfo.storeCount) { ({{ busyInfo.storeCount }} store{{ busyInfo.storeCount === 1 ? '' : 's' }}) }@if (busyInfo.startedAt) {, started {{ startedAgo(busyInfo.startedAt) }}}. Please wait until it finishes before starting a new export.\r\n </div>\r\n }\r\n\r\n @if (activeJob) {\r\n <div\r\n class=\"mt-3 alert\"\r\n [class.alert-info]=\"activeJob.status === 'running'\"\r\n [class.alert-success]=\"activeJob.status === 'succeeded'\"\r\n [class.alert-danger]=\"activeJob.status === 'failed'\">\r\n @if (activeJob.status === 'running') {\r\n <div>\r\n {{ kindLabel(activeJob.kind) }} export is processing@if (activeJob.storeCount) { ({{ activeJob.storeCount }} store{{ activeJob.storeCount === 1 ? '' : 's' }}) }. Started {{ startedAgo(activeJob.startedAt) }}. Keep this page open \u2014 a download link will appear when it finishes.\r\n </div>\r\n } @else if (activeJob.status === 'succeeded' && activeJob.downloadUrl) {\r\n <div class=\"d-flex align-items-center justify-content-between gap-2 flex-wrap\">\r\n <span>\r\n {{ kindLabel(activeJob.kind) }} export ready@if (activeJob.rowCount) { \u2014 {{ activeJob.rowCount }} row{{ activeJob.rowCount === 1 ? '' : 's' }} }.\r\n </span>\r\n <div class=\"d-flex gap-2\">\r\n <a [href]=\"activeJob.downloadUrl\" class=\"btn btn-sm btn-success\" target=\"_blank\" rel=\"noopener\">Download</a>\r\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"dismissResult()\">Dismiss</button>\r\n </div>\r\n </div>\r\n } @else if (activeJob.status === 'failed') {\r\n <div class=\"d-flex align-items-center justify-content-between gap-2 flex-wrap\">\r\n <span>{{ kindLabel(activeJob.kind) }} export failed: {{ activeJob.error || 'Unknown error' }}</span>\r\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"dismissResult()\">Dismiss</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (message) {\r\n <div\r\n class=\"mt-3 alert\"\r\n [class.alert-success]=\"messageType === 'success'\"\r\n [class.alert-danger]=\"messageType === 'error'\">\r\n {{ message }}\r\n </div>\r\n }\r\n </div>\r\n</section>\r\n", styles: [".store-exports .card{border:1px solid #e0e0e0}\n"], dependencies: [{ kind: "component", type: i3.StoreSelectComponent, selector: "lib-store-select", inputs: ["options", "initialSelected", "singleSelect"], outputs: ["selectedChange"] }] });
|
|
101
203
|
}
|
|
102
204
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StoreExportsComponent, decorators: [{
|
|
103
205
|
type: Component,
|
|
104
|
-
args: [{ selector: 'lib-store-exports', template: "<section class=\"store-exports p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 700px;\">\r\n <h5 class=\"mb-1\">Store Exports</h5>\r\n <p class=\"text-muted small mb-3\">\r\n Generate per-store fixture exports. Select one or more stores, then choose an export.\r\n </p>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Stores</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"onExportMbq()\"\r\n [disabled]=\"
|
|
206
|
+
args: [{ selector: 'lib-store-exports', template: "<section class=\"store-exports p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 700px;\">\r\n <h5 class=\"mb-1\">Store Exports</h5>\r\n <p class=\"text-muted small mb-3\">\r\n Generate per-store fixture exports. Select one or more stores, then choose an export.\r\n Large exports run in the background and are saved to S3 \u2014 a download link appears here when ready.\r\n </p>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Stores</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"onExportMbq()\"\r\n [disabled]=\"isWorking || selectedStores.length === 0\">\r\n @if (starting === 'mbq') {\r\n Starting MBQ...\r\n } @else if (activeJob?.status === 'running' && activeJob?.kind === 'mbq') {\r\n Running MBQ...\r\n } @else {\r\n Export MBQ\r\n }\r\n </button>\r\n\r\n <button\r\n class=\"btn btn-success\"\r\n (click)=\"onExportOrderSheet()\"\r\n [disabled]=\"isWorking || selectedStores.length === 0\">\r\n @if (starting === 'order') {\r\n Starting Order Sheet...\r\n } @else if (activeJob?.status === 'running' && activeJob?.kind === 'order') {\r\n Running Order Sheet...\r\n } @else {\r\n Export Order Sheet\r\n }\r\n </button>\r\n </div>\r\n\r\n @if (busyInfo) {\r\n <div class=\"mt-3 alert alert-warning\">\r\n Another {{ kindLabel(busyInfo.kind) }} export is currently running@if (busyInfo.storeCount) { ({{ busyInfo.storeCount }} store{{ busyInfo.storeCount === 1 ? '' : 's' }}) }@if (busyInfo.startedAt) {, started {{ startedAgo(busyInfo.startedAt) }}}. Please wait until it finishes before starting a new export.\r\n </div>\r\n }\r\n\r\n @if (activeJob) {\r\n <div\r\n class=\"mt-3 alert\"\r\n [class.alert-info]=\"activeJob.status === 'running'\"\r\n [class.alert-success]=\"activeJob.status === 'succeeded'\"\r\n [class.alert-danger]=\"activeJob.status === 'failed'\">\r\n @if (activeJob.status === 'running') {\r\n <div>\r\n {{ kindLabel(activeJob.kind) }} export is processing@if (activeJob.storeCount) { ({{ activeJob.storeCount }} store{{ activeJob.storeCount === 1 ? '' : 's' }}) }. Started {{ startedAgo(activeJob.startedAt) }}. Keep this page open \u2014 a download link will appear when it finishes.\r\n </div>\r\n } @else if (activeJob.status === 'succeeded' && activeJob.downloadUrl) {\r\n <div class=\"d-flex align-items-center justify-content-between gap-2 flex-wrap\">\r\n <span>\r\n {{ kindLabel(activeJob.kind) }} export ready@if (activeJob.rowCount) { \u2014 {{ activeJob.rowCount }} row{{ activeJob.rowCount === 1 ? '' : 's' }} }.\r\n </span>\r\n <div class=\"d-flex gap-2\">\r\n <a [href]=\"activeJob.downloadUrl\" class=\"btn btn-sm btn-success\" target=\"_blank\" rel=\"noopener\">Download</a>\r\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"dismissResult()\">Dismiss</button>\r\n </div>\r\n </div>\r\n } @else if (activeJob.status === 'failed') {\r\n <div class=\"d-flex align-items-center justify-content-between gap-2 flex-wrap\">\r\n <span>{{ kindLabel(activeJob.kind) }} export failed: {{ activeJob.error || 'Unknown error' }}</span>\r\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"dismissResult()\">Dismiss</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (message) {\r\n <div\r\n class=\"mt-3 alert\"\r\n [class.alert-success]=\"messageType === 'success'\"\r\n [class.alert-danger]=\"messageType === 'error'\">\r\n {{ message }}\r\n </div>\r\n }\r\n </div>\r\n</section>\r\n", styles: [".store-exports .card{border:1px solid #e0e0e0}\n"] }]
|
|
105
207
|
}], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.GlobalStateService }] });
|
|
106
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtZXhwb3J0cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9wbGFuby10b29scy9zdG9yZS1leHBvcnRzL3N0b3JlLWV4cG9ydHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvc3RvcmUtZXhwb3J0cy9zdG9yZS1leHBvcnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7OztBQVloRyxNQUFNLE9BQU8scUJBQXFCO0lBY3RCO0lBQ0E7SUFkVixRQUFRLENBQVM7SUFDakIsWUFBWSxHQUFrQixFQUFFLENBQUM7SUFDakMsYUFBYSxHQUFrQixFQUFFLENBQUM7SUFDbEMsY0FBYyxHQUFrQixFQUFFLENBQUM7SUFFbkMsT0FBTyxHQUFzQixJQUFJLENBQUM7SUFFbEMsT0FBTyxHQUFXLEVBQUUsQ0FBQztJQUNyQixXQUFXLEdBQXdCLFNBQVMsQ0FBQztJQUU1QixRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVoRCxZQUNVLEdBQXdCLEVBQ3hCLEVBQXNCO1FBRHRCLFFBQUcsR0FBSCxHQUFHLENBQXFCO1FBQ3hCLE9BQUUsR0FBRixFQUFFLENBQW9CO0lBQzdCLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjO2FBQ25CLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxD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O0lBQzNCLENBQUM7d0dBdEhVLHFCQUFxQjs0RkFBckIscUJBQXFCLHlEQ2JsQyxpOENBMENBOzs0RkQ3QmEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsLCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbmFsaXplIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgU3RvcmVPcHRpb24gfSBmcm9tICcuLi8uLi9jb2xsZWN0aW9uLXVwZGF0ZS1haS9jb21wb25lbnRzL3N0b3JlLXNlbGVjdC9zdG9yZS1zZWxlY3QuY29tcG9uZW50JztcclxuXHJcbnR5cGUgRXhwb3J0S2luZCA9ICdtYnEnIHwgJ29yZGVyJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXN0b3JlLWV4cG9ydHMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zdG9yZS1leHBvcnRzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc3RvcmUtZXhwb3J0cy5jb21wb25lbnQuc2NzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdG9yZUV4cG9ydHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuICBzdG9yZU9wdGlvbnM6IFN0b3JlT3B0aW9uW10gPSBbXTtcclxuICBpbml0aWFsU3RvcmVzOiBTdG9yZU9wdGlvbltdID0gW107XHJcbiAgc2VsZWN0ZWRTdG9yZXM6IFN0b3JlT3B0aW9uW10gPSBbXTtcclxuXHJcbiAgbG9hZGluZzogRXhwb3J0S2luZCB8IG51bGwgPSBudWxsO1xyXG5cclxuICBtZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuICBtZXNzYWdlVHlwZTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyA9ICdzdWNjZXNzJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzYnM6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgIGRlYm91bmNlVGltZSgyMDApLFxyXG4gICAgICAgIGZpbHRlcigoZGF0YSkgPT4gISFkYXRhKSxcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhLmNsaWVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGhlYWRlckRhdGEgPSBKU09OLnBhcnNlKFxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2FkU3RvcmVzKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZFN0b3JlcygpIHtcclxuICAgIHRoaXMuc2JzLmdldFN0b3JlT3JDbHVzdGVyTGlzdCh7IHNlYXJjaE1vZGU6ICdzdG9yZScgfSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzPy5kYXRhKSB0aGlzLnN0b3JlT3B0aW9ucyA9IHJlcy5kYXRhO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblN0b3Jlc1NlbGVjdGVkKHN0b3JlczogU3RvcmVPcHRpb25bXSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlcyA9IHN0b3JlcztcclxuICB9XHJcblxyXG4gIG9uRXhwb3J0TWJxKCkge1xyXG4gICAgdGhpcy5ydW5FeHBvcnQoJ21icScpO1xyXG4gIH1cclxuXHJcbiAgb25FeHBvcnRPcmRlclNoZWV0KCkge1xyXG4gICAgdGhpcy5ydW5FeHBvcnQoJ29yZGVyJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJ1bkV4cG9ydChraW5kOiBFeHBvcnRLaW5kKSB7XHJcbiAgICBpZiAodGhpcy5sb2FkaW5nKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFN0b3Jlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5zaG93TWVzc2FnZSgnUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgc3RvcmUuJywgJ2Vycm9yJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgc3RvcmVOYW1lID0gdGhpcy5zZWxlY3RlZFN0b3Jlcy5tYXAoKHMpID0+IHMubGFiZWwpO1xyXG4gICAgbGV0IHJlcSQgPSBraW5kID09PSAnbWJxJ1xyXG4gICAgICA/IHRoaXMuc2JzLmV4cG9ydE1CUVNoZWV0KHsgc3RvcmVOYW1lIH0pXHJcbiAgICAgIDogdGhpcy5zYnMuZXhwb3J0UGxhbm9PcmRlclNoZWV0KHsgc3RvcmVOYW1lIH0pO1xyXG5cclxuICAgIGxldCBiYXNlRmlsZSA9IGtpbmQgPT09ICdtYnEnID8gJ21icV9leHBvcnQnIDogJ29yZGVyX3NoZWV0X2V4cG9ydCc7XHJcbiAgICBsZXQgc3VmZml4ID0gc3RvcmVOYW1lLmxlbmd0aCA9PT0gMVxyXG4gICAgICA/IHRoaXMuc2FmZU5hbWUoc3RvcmVOYW1lWzBdKVxyXG4gICAgICA6IGAke3N0b3JlTmFtZS5sZW5ndGh9X3N0b3Jlc2A7XHJcbiAgICBsZXQgZmlsZU5hbWUgPSBgJHtiYXNlRmlsZX1fJHtzdWZmaXh9XyR7RGF0ZS5ub3coKX1gO1xyXG5cclxuICAgIHRoaXMubG9hZGluZyA9IGtpbmQ7XHJcbiAgICB0aGlzLm1lc3NhZ2UgPSAnJztcclxuICAgIHJlcSRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gbnVsbDtcclxuICAgICAgICB9KSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2JzLnNhdmVBc0V4Y2VsRmlsZShyZXMsIGZpbGVOYW1lKTtcclxuICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoXHJcbiAgICAgICAgICAgIGAke3RoaXMua2luZExhYmVsKGtpbmQpfSBleHBvcnQgZG93bmxvYWRlZC5gLFxyXG4gICAgICAgICAgICAnc3VjY2VzcycsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShcclxuICAgICAgICAgICAgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fFxyXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gZ2VuZXJhdGUgJHt0aGlzLmtpbmRMYWJlbChraW5kKX0gZXhwb3J0LmAsXHJcbiAgICAgICAgICAgICdlcnJvcicsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBraW5kTGFiZWwoa2luZDogRXhwb3J0S2luZCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gJ21icScgPyAnTUJRJyA6ICdPcmRlciBTaGVldCc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNhZmVOYW1lKHM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKHMgfHwgJ3N0b3JlJykucmVwbGFjZSgvW1xcXFwvOio/XCI8PnxdL2csICdfJyk7XHJcbiAgfVxyXG5cclxuICBzaG93TWVzc2FnZShtc2c6IHN0cmluZywgdHlwZTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJykge1xyXG4gICAgdGhpcy5tZXNzYWdlID0gbXNnO1xyXG4gICAgdGhpcy5tZXNzYWdlVHlwZSA9IHR5cGU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLm1lc3NhZ2UgPSAnJyksIDUwMDApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gY2xhc3M9XCJzdG9yZS1leHBvcnRzIHAtM1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkIHAtNFwiIHN0eWxlPVwibWF4LXdpZHRoOiA3MDBweDtcIj5cclxuICAgIDxoNSBjbGFzcz1cIm1iLTFcIj5TdG9yZSBFeHBvcnRzPC9oNT5cclxuICAgIDxwIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtYi0zXCI+XHJcbiAgICAgIEdlbmVyYXRlIHBlci1zdG9yZSBmaXh0dXJlIGV4cG9ydHMuIFNlbGVjdCBvbmUgb3IgbW9yZSBzdG9yZXMsIHRoZW4gY2hvb3NlIGFuIGV4cG9ydC5cclxuICAgIDwvcD5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U3RvcmVzPC9sYWJlbD5cclxuICAgICAgPGxpYi1zdG9yZS1zZWxlY3RcclxuICAgICAgICBbb3B0aW9uc109XCJzdG9yZU9wdGlvbnNcIlxyXG4gICAgICAgIFtpbml0aWFsU2VsZWN0ZWRdPVwiaW5pdGlhbFN0b3Jlc1wiXHJcbiAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uU3RvcmVzU2VsZWN0ZWQoJGV2ZW50KVwiPlxyXG4gICAgICA8L2xpYi1zdG9yZS1zZWxlY3Q+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkV4cG9ydE1icSgpXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZyAhPT0gbnVsbCB8fCBzZWxlY3RlZFN0b3Jlcy5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICB7eyBsb2FkaW5nID09PSAnbWJxJyA/ICdHZW5lcmF0aW5nIE1CUS4uLicgOiAnRXhwb3J0IE1CUScgfX1cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkV4cG9ydE9yZGVyU2hlZXQoKVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmcgIT09IG51bGwgfHwgc2VsZWN0ZWRTdG9yZXMubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAge3sgbG9hZGluZyA9PT0gJ29yZGVyJyA/ICdHZW5lcmF0aW5nIE9yZGVyIFNoZWV0Li4uJyA6ICdFeHBvcnQgT3JkZXIgU2hlZXQnIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgQGlmIChtZXNzYWdlKSB7XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cIm10LTMgYWxlcnRcIlxyXG4gICAgICAgIFtjbGFzcy5hbGVydC1zdWNjZXNzXT1cIm1lc3NhZ2VUeXBlID09PSAnc3VjY2VzcydcIlxyXG4gICAgICAgIFtjbGFzcy5hbGVydC1kYW5nZXJdPVwibWVzc2FnZVR5cGUgPT09ICdlcnJvcidcIj5cclxuICAgICAgICB7eyBtZXNzYWdlIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcbiJdfQ==
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtZXhwb3J0cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9wbGFuby10b29scy9zdG9yZS1leHBvcnRzL3N0b3JlLWV4cG9ydHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvc3RvcmUtZXhwb3J0cy9zdG9yZS1leHBvcnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFDTCxPQUFPLEVBQ1AsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxFQUFFLEVBQ0YsS0FBSyxFQUNMLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7Ozs7O0FBMkJkLE1BQU0scUJBQXFCLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBT3ZDLE1BQU0sT0FBTyxxQkFBcUI7SUFpQnRCO0lBQ0E7SUFqQlYsUUFBUSxDQUFTO0lBQ2pCLFlBQVksR0FBa0IsRUFBRSxDQUFDO0lBQ2pDLGFBQWEsR0FBa0IsRUFBRSxDQUFDO0lBQ2xDLGNBQWMsR0FBa0IsRUFBRSxDQUFDO0lBRW5DLFFBQVEsR0FBc0IsSUFBSSxDQUFDO0lBQ25DLFNBQVMsR0FBcUIsSUFBSSxDQUFDO0lBQ25DLFFBQVEsR0FBb0IsSUFBSSxDQUFDO0lBRWpDLE9BQU8sR0FBVyxFQUFFLENBQUM7SUFDckIsV0FBVyxHQUF3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SSxFQUFFLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUc7Z0JBQ2YsR0FBRyxJQUFJLENBQUMsU0FBUztnQkFDakIsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLEtBQUssRUFBRSwyQ0FBMkM7YUFDbkQsQ0FBQztTQUNIO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FDZCx1R0FBdUcsRUFDdkcsT0FBTyxDQUNSLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVcsRUFBRSxJQUF5QjtRQUNoRCxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQXpPVSxxQkFBcUI7NEZBQXJCLHFCQUFxQix5RENoRGxDLGtrSUEwRkE7OzRGRDFDYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIFN1YmplY3QsXHJcbiAgdGFrZVVudGlsLFxyXG4gIGRlYm91bmNlVGltZSxcclxuICBmaWx0ZXIsXHJcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXHJcbiAgdGltZXIsXHJcbiAgb2YsXHJcbiAgRU1QVFksXHJcbiAgc3dpdGNoTWFwLFxyXG4gIGNhdGNoRXJyb3IsXHJcbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgU3RvcmVPcHRpb24gfSBmcm9tICcuLi8uLi9jb2xsZWN0aW9uLXVwZGF0ZS1haS9jb21wb25lbnRzL3N0b3JlLXNlbGVjdC9zdG9yZS1zZWxlY3QuY29tcG9uZW50JztcclxuXHJcbnR5cGUgRXhwb3J0S2luZCA9ICdtYnEnIHwgJ29yZGVyJztcclxudHlwZSBKb2JTdGF0dXMgPSAncnVubmluZycgfCAnc3VjY2VlZGVkJyB8ICdmYWlsZWQnO1xyXG5cclxuaW50ZXJmYWNlIEV4cG9ydEpvYiB7XHJcbiAgam9iSWQ6IHN0cmluZztcclxuICBraW5kOiBFeHBvcnRLaW5kO1xyXG4gIHN0YXR1czogSm9iU3RhdHVzO1xyXG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcclxuICBjb21wbGV0ZWRBdD86IHN0cmluZyB8IG51bGw7XHJcbiAgZG93bmxvYWRVcmw/OiBzdHJpbmcgfCBudWxsO1xyXG4gIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcclxuICByb3dDb3VudD86IG51bWJlciB8IG51bGw7XHJcbiAgc3RvcmVDb3VudD86IG51bWJlciB8IG51bGw7XHJcbn1cclxuXHJcbmludGVyZmFjZSBCdXN5SW5mbyB7XHJcbiAgam9iSWQ6IHN0cmluZztcclxuICBraW5kOiBFeHBvcnRLaW5kO1xyXG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcclxuICBzdG9yZUNvdW50PzogbnVtYmVyO1xyXG59XHJcblxyXG5jb25zdCBQT0xMX0lOSVRJQUxfREVMQVlfTVMgPSAxNTAwMDtcclxuY29uc3QgUE9MTF9JTlRFUlZBTF9NUyA9IDEwMDAwO1xyXG5jb25zdCBQT0xMX1RJTUVPVVRfTVMgPSAzMCAqIDYwICogMTAwMDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXN0b3JlLWV4cG9ydHMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zdG9yZS1leHBvcnRzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc3RvcmUtZXhwb3J0cy5jb21wb25lbnQuc2NzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdG9yZUV4cG9ydHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuICBzdG9yZU9wdGlvbnM6IFN0b3JlT3B0aW9uW10gPSBbXTtcclxuICBpbml0aWFsU3RvcmVzOiBTdG9yZU9wdGlvbltdID0gW107XHJcbiAgc2VsZWN0ZWRTdG9yZXM6IFN0b3JlT3B0aW9uW10gPSBbXTtcclxuXHJcbiAgc3RhcnRpbmc6IEV4cG9ydEtpbmQgfCBudWxsID0gbnVsbDtcclxuICBhY3RpdmVKb2I6IEV4cG9ydEpvYiB8IG51bGwgPSBudWxsO1xyXG4gIGJ1c3lJbmZvOiBCdXN5SW5mbyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBtZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuICBtZXNzYWdlVHlwZTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyA9ICdzdWNjZXNzJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9wUG9sbCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc2JzOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcclxuICAgICAgICBmaWx0ZXIoKGRhdGEpID0+ICEhZGF0YSksXHJcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZGF0YT8uY2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YS5jbGllbnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGhlYWRlckRhdGEgPSBKU09OLnBhcnNlKFxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2FkU3RvcmVzKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZFN0b3JlcygpIHtcclxuICAgIHRoaXMuc2JzXHJcbiAgICAgIC5nZXRTdG9yZU9yQ2x1c3Rlckxpc3QoeyBzZWFyY2hNb2RlOiAnc3RvcmUnIH0pXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uZGF0YSkgdGhpcy5zdG9yZU9wdGlvbnMgPSByZXMuZGF0YTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblN0b3Jlc1NlbGVjdGVkKHN0b3JlczogU3RvcmVPcHRpb25bXSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlcyA9IHN0b3JlcztcclxuICB9XHJcblxyXG4gIG9uRXhwb3J0TWJxKCkge1xyXG4gICAgdGhpcy5ydW5FeHBvcnQoJ21icScpO1xyXG4gIH1cclxuXHJcbiAgb25FeHBvcnRPcmRlclNoZWV0KCkge1xyXG4gICAgdGhpcy5ydW5FeHBvcnQoJ29yZGVyJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNXb3JraW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhcnRpbmcgIT09IG51bGwgfHwgdGhpcy5hY3RpdmVKb2I/LnN0YXR1cyA9PT0gJ3J1bm5pbmcnO1xyXG4gIH1cclxuXHJcbiAga2luZExhYmVsKGtpbmQ6IEV4cG9ydEtpbmQgfCB1bmRlZmluZWQgfCBudWxsKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBraW5kID09PSAnbWJxJyA/ICdNQlEnIDoga2luZCA9PT0gJ29yZGVyJyA/ICdPcmRlciBTaGVldCcgOiAnRXhwb3J0JztcclxuICB9XHJcblxyXG4gIHN0YXJ0ZWRBZ28oaXNvPzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWlzbykgcmV0dXJuICcnO1xyXG4gICAgY29uc3QgbXMgPSBEYXRlLm5vdygpIC0gbmV3IERhdGUoaXNvKS5nZXRUaW1lKCk7XHJcbiAgICBpZiAobXMgPCA2MF8wMDApIHJldHVybiBgJHtNYXRoLm1heCgwLCBNYXRoLmZsb29yKG1zIC8gMTAwMCkpfXMgYWdvYDtcclxuICAgIGlmIChtcyA8IDNfNjAwXzAwMCkgcmV0dXJuIGAke01hdGguZmxvb3IobXMgLyA2MF8wMDApfW0gYWdvYDtcclxuICAgIHJldHVybiBgJHtNYXRoLmZsb29yKG1zIC8gM182MDBfMDAwKX1oIGFnb2A7XHJcbiAgfVxyXG5cclxuICBkaXNtaXNzUmVzdWx0KCkge1xyXG4gICAgdGhpcy5hY3RpdmVKb2IgPSBudWxsO1xyXG4gICAgdGhpcy5idXN5SW5mbyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJ1bkV4cG9ydChraW5kOiBFeHBvcnRLaW5kKSB7XHJcbiAgICBpZiAodGhpcy5pc1dvcmtpbmcpIHJldHVybjtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnNob3dNZXNzYWdlKCdQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IG9uZSBzdG9yZS4nLCAnZXJyb3InKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0b3JlTmFtZSA9IHRoaXMuc2VsZWN0ZWRTdG9yZXMubWFwKChzKSA9PiBzLmxhYmVsKTtcclxuICAgIHRoaXMuYnVzeUluZm8gPSBudWxsO1xyXG4gICAgdGhpcy5hY3RpdmVKb2IgPSBudWxsO1xyXG4gICAgdGhpcy5zdGFydGluZyA9IGtpbmQ7XHJcbiAgICB0aGlzLm1lc3NhZ2UgPSAnJztcclxuXHJcbiAgICBjb25zdCBzdWJtaXQkID1cclxuICAgICAga2luZCA9PT0gJ21icSdcclxuICAgICAgICA/IHRoaXMuc2JzLmV4cG9ydE1CUVNoZWV0QXN5bmMoeyBzdG9yZU5hbWUgfSlcclxuICAgICAgICA6IHRoaXMuc2JzLmV4cG9ydFBsYW5vT3JkZXJTaGVldEFzeW5jKHsgc3RvcmVOYW1lIH0pO1xyXG5cclxuICAgIHN1Ym1pdCQuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlc3A6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhcnRpbmcgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGJvZHkgPSByZXNwPy5ib2R5ID8/IHJlc3A7XHJcbiAgICAgICAgY29uc3Qgam9iSWQgPSBib2R5Py5kYXRhPy5qb2JJZDtcclxuICAgICAgICBpZiAoIWpvYklkKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKFxyXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN0YXJ0ICR7dGhpcy5raW5kTGFiZWwoa2luZCl9IGV4cG9ydCDigJQgc2VydmVyIGRpZCBub3QgcmV0dXJuIGEgam9iSWQuYCxcclxuICAgICAgICAgICAgJ2Vycm9yJyxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWN0aXZlSm9iID0ge1xyXG4gICAgICAgICAgam9iSWQsXHJcbiAgICAgICAgICBraW5kLFxyXG4gICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXHJcbiAgICAgICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgIHN0b3JlQ291bnQ6IHN0b3JlTmFtZS5sZW5ndGgsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnN0YXJ0UG9sbGluZyhqb2JJZCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnN0YXJ0aW5nID0gbnVsbDtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSBlcnI/LnN0YXR1cztcclxuICAgICAgICBjb25zdCByZXNwQm9keSA9IGVycj8uZXJyb3I7XHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gNDA5ICYmIHJlc3BCb2R5Py5kYXRhPy5qb2JJZCkge1xyXG4gICAgICAgICAgdGhpcy5idXN5SW5mbyA9IHtcclxuICAgICAgICAgICAgam9iSWQ6IHJlc3BCb2R5LmRhdGEuam9iSWQsXHJcbiAgICAgICAgICAgIGtpbmQ6IHJlc3BCb2R5LmRhdGEua2luZCxcclxuICAgICAgICAgICAgc3RhcnRlZEF0OiByZXNwQm9keS5kYXRhLnN0YXJ0ZWRBdCxcclxuICAgICAgICAgICAgc3RvcmVDb3VudDogcmVzcEJvZHkuZGF0YS5zdG9yZUNvdW50LFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgZXJyTXNnID1cclxuICAgICAgICAgICAgKHR5cGVvZiByZXNwQm9keT8uZXJyb3IgPT09ICdzdHJpbmcnICYmIHJlc3BCb2R5LmVycm9yKSB8fFxyXG4gICAgICAgICAgICByZXNwQm9keT8uZXJyb3I/Lm1lc3NhZ2UgfHxcclxuICAgICAgICAgICAgcmVzcEJvZHk/Lm1lc3NhZ2UgfHxcclxuICAgICAgICAgICAgZXJyPy5tZXNzYWdlIHx8XHJcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3RhcnQgJHt0aGlzLmtpbmRMYWJlbChraW5kKX0gZXhwb3J0LmA7XHJcbiAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKGVyck1zZywgJ2Vycm9yJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0UG9sbGluZyhqb2JJZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0b3BQb2xsJC5uZXh0KCk7XHJcbiAgICBjb25zdCBwb2xsU3RhcnRlZCA9IERhdGUubm93KCk7XHJcbiAgICB0aW1lcihQT0xMX0lOSVRJQUxfREVMQVlfTVMsIFBPTExfSU5URVJWQUxfTVMpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5zdG9wUG9sbCQpLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PlxyXG4gICAgICAgICAgdGhpcy5zYnMuZ2V0UGxhbm9FeHBvcnRKb2Ioam9iSWQpLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIC0gcG9sbFN0YXJ0ZWQgPiBQT0xMX1RJTUVPVVRfTVMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUG9sbFRpbWVvdXQoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICksXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghcmVzKSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgam9iID0gcmVzPy5kYXRhO1xyXG4gICAgICAgIGlmICgham9iKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5hY3RpdmVKb2IgPSB7XHJcbiAgICAgICAgICBqb2JJZDogam9iLmpvYklkLFxyXG4gICAgICAgICAga2luZDogam9iLmtpbmQsXHJcbiAgICAgICAgICBzdGF0dXM6IGpvYi5zdGF0dXMsXHJcbiAgICAgICAgICBzdGFydGVkQXQ6IGpvYi5zdGFydGVkQXQsXHJcbiAgICAgICAgICBjb21wbGV0ZWRBdDogam9iLmNvbXBsZXRlZEF0LFxyXG4gICAgICAgICAgZG93bmxvYWRVcmw6IGpvYi5kb3dubG9hZFVybCxcclxuICAgICAgICAgIGVycm9yOiBqb2IuZXJyb3IsXHJcbiAgICAgICAgICByb3dDb3VudDogam9iLnJvd0NvdW50LFxyXG4gICAgICAgICAgc3RvcmVDb3VudDogam9iLnN0b3JlQ291bnQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoam9iLnN0YXR1cyA9PT0gJ3N1Y2NlZWRlZCcpIHtcclxuICAgICAgICAgIHRoaXMuc3RvcFBvbGwkLm5leHQoKTtcclxuICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoXHJcbiAgICAgICAgICAgIGAke3RoaXMua2luZExhYmVsKGpvYi5raW5kKX0gZXhwb3J0IGlzIHJlYWR5LmAsXHJcbiAgICAgICAgICAgICdzdWNjZXNzJyxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChqb2Iuc3RhdHVzID09PSAnZmFpbGVkJykge1xyXG4gICAgICAgICAgdGhpcy5zdG9wUG9sbCQubmV4dCgpO1xyXG4gICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShcclxuICAgICAgICAgICAgYCR7dGhpcy5raW5kTGFiZWwoam9iLmtpbmQpfSBleHBvcnQgZmFpbGVkOiAke1xyXG4gICAgICAgICAgICAgIGpvYi5lcnJvciB8fCAnVW5rbm93biBlcnJvcidcclxuICAgICAgICAgICAgfWAsXHJcbiAgICAgICAgICAgICdlcnJvcicsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBqb2Iuc3RhdHVzID09PSAncnVubmluZycgJiZcclxuICAgICAgICAgIERhdGUubm93KCkgLSBwb2xsU3RhcnRlZCA+IFBPTExfVElNRU9VVF9NU1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVQb2xsVGltZW91dCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZVBvbGxUaW1lb3V0KCkge1xyXG4gICAgdGhpcy5zdG9wUG9sbCQubmV4dCgpO1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlSm9iKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlSm9iID0ge1xyXG4gICAgICAgIC4uLnRoaXMuYWN0aXZlSm9iLFxyXG4gICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXHJcbiAgICAgICAgZXJyb3I6ICdUaW1lZCBvdXQgd2FpdGluZyBmb3IgZXhwb3J0IHRvIGNvbXBsZXRlLicsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICB0aGlzLnNob3dNZXNzYWdlKFxyXG4gICAgICAnVGltZWQgb3V0IHdhaXRpbmcgZm9yIGV4cG9ydCB0byBjb21wbGV0ZS4gVGhlIGpvYiBtYXkgc3RpbGwgYmUgcnVubmluZyBvbiB0aGUgc2VydmVyIOKAlCByZWZyZXNoIGxhdGVyLicsXHJcbiAgICAgICdlcnJvcicsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2hvd01lc3NhZ2UobXNnOiBzdHJpbmcsIHR5cGU6ICdzdWNjZXNzJyB8ICdlcnJvcicpIHtcclxuICAgIHRoaXMubWVzc2FnZSA9IG1zZztcclxuICAgIHRoaXMubWVzc2FnZVR5cGUgPSB0eXBlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5tZXNzYWdlID0gJycpLCA2MDAwKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdG9wUG9sbCQubmV4dCgpO1xyXG4gICAgdGhpcy5zdG9wUG9sbCQuY29tcGxldGUoKTtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8c2VjdGlvbiBjbGFzcz1cInN0b3JlLWV4cG9ydHMgcC0zXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNhcmQgcC00XCIgc3R5bGU9XCJtYXgtd2lkdGg6IDcwMHB4O1wiPlxyXG4gICAgPGg1IGNsYXNzPVwibWItMVwiPlN0b3JlIEV4cG9ydHM8L2g1PlxyXG4gICAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG1iLTNcIj5cclxuICAgICAgR2VuZXJhdGUgcGVyLXN0b3JlIGZpeHR1cmUgZXhwb3J0cy4gU2VsZWN0IG9uZSBvciBtb3JlIHN0b3JlcywgdGhlbiBjaG9vc2UgYW4gZXhwb3J0LlxyXG4gICAgICBMYXJnZSBleHBvcnRzIHJ1biBpbiB0aGUgYmFja2dyb3VuZCBhbmQgYXJlIHNhdmVkIHRvIFMzIOKAlCBhIGRvd25sb2FkIGxpbmsgYXBwZWFycyBoZXJlIHdoZW4gcmVhZHkuXHJcbiAgICA8L3A+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN0b3JlczwvbGFiZWw+XHJcbiAgICAgIDxsaWItc3RvcmUtc2VsZWN0XHJcbiAgICAgICAgW29wdGlvbnNdPVwic3RvcmVPcHRpb25zXCJcclxuICAgICAgICBbaW5pdGlhbFNlbGVjdGVkXT1cImluaXRpYWxTdG9yZXNcIlxyXG4gICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJvblN0b3Jlc1NlbGVjdGVkKCRldmVudClcIj5cclxuICAgICAgPC9saWItc3RvcmUtc2VsZWN0PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMiBmbGV4LXdyYXBcIj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAoY2xpY2spPVwib25FeHBvcnRNYnEoKVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzV29ya2luZyB8fCBzZWxlY3RlZFN0b3Jlcy5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICBAaWYgKHN0YXJ0aW5nID09PSAnbWJxJykge1xyXG4gICAgICAgICAgU3RhcnRpbmcgTUJRLi4uXHJcbiAgICAgICAgfSBAZWxzZSBpZiAoYWN0aXZlSm9iPy5zdGF0dXMgPT09ICdydW5uaW5nJyAmJiBhY3RpdmVKb2I/LmtpbmQgPT09ICdtYnEnKSB7XHJcbiAgICAgICAgICBSdW5uaW5nIE1CUS4uLlxyXG4gICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgRXhwb3J0IE1CUVxyXG4gICAgICAgIH1cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkV4cG9ydE9yZGVyU2hlZXQoKVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzV29ya2luZyB8fCBzZWxlY3RlZFN0b3Jlcy5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICBAaWYgKHN0YXJ0aW5nID09PSAnb3JkZXInKSB7XHJcbiAgICAgICAgICBTdGFydGluZyBPcmRlciBTaGVldC4uLlxyXG4gICAgICAgIH0gQGVsc2UgaWYgKGFjdGl2ZUpvYj8uc3RhdHVzID09PSAncnVubmluZycgJiYgYWN0aXZlSm9iPy5raW5kID09PSAnb3JkZXInKSB7XHJcbiAgICAgICAgICBSdW5uaW5nIE9yZGVyIFNoZWV0Li4uXHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICBFeHBvcnQgT3JkZXIgU2hlZXRcclxuICAgICAgICB9XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgQGlmIChidXN5SW5mbykge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwibXQtMyBhbGVydCBhbGVydC13YXJuaW5nXCI+XHJcbiAgICAgICAgQW5vdGhlciB7eyBraW5kTGFiZWwoYnVzeUluZm8ua2luZCkgfX0gZXhwb3J0IGlzIGN1cnJlbnRseSBydW5uaW5nQGlmIChidXN5SW5mby5zdG9yZUNvdW50KSB7ICh7eyBidXN5SW5mby5zdG9yZUNvdW50IH19IHN0b3Jle3sgYnVzeUluZm8uc3RvcmVDb3VudCA9PT0gMSA/ICcnIDogJ3MnIH19KSB9QGlmIChidXN5SW5mby5zdGFydGVkQXQpIHssIHN0YXJ0ZWQge3sgc3RhcnRlZEFnbyhidXN5SW5mby5zdGFydGVkQXQpIH19fS4gUGxlYXNlIHdhaXQgdW50aWwgaXQgZmluaXNoZXMgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IGV4cG9ydC5cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgQGlmIChhY3RpdmVKb2IpIHtcclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwibXQtMyBhbGVydFwiXHJcbiAgICAgICAgW2NsYXNzLmFsZXJ0LWluZm9dPVwiYWN0aXZlSm9iLnN0YXR1cyA9PT0gJ3J1bm5pbmcnXCJcclxuICAgICAgICBbY2xhc3MuYWxlcnQtc3VjY2Vzc109XCJhY3RpdmVKb2Iuc3RhdHVzID09PSAnc3VjY2VlZGVkJ1wiXHJcbiAgICAgICAgW2NsYXNzLmFsZXJ0LWRhbmdlcl09XCJhY3RpdmVKb2Iuc3RhdHVzID09PSAnZmFpbGVkJ1wiPlxyXG4gICAgICAgIEBpZiAoYWN0aXZlSm9iLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICB7eyBraW5kTGFiZWwoYWN0aXZlSm9iLmtpbmQpIH19IGV4cG9ydCBpcyBwcm9jZXNzaW5nQGlmIChhY3RpdmVKb2Iuc3RvcmVDb3VudCkgeyAoe3sgYWN0aXZlSm9iLnN0b3JlQ291bnQgfX0gc3RvcmV7eyBhY3RpdmVKb2Iuc3RvcmVDb3VudCA9PT0gMSA/ICcnIDogJ3MnIH19KSB9LiBTdGFydGVkIHt7IHN0YXJ0ZWRBZ28oYWN0aXZlSm9iLnN0YXJ0ZWRBdCkgfX0uIEtlZXAgdGhpcyBwYWdlIG9wZW4g4oCUIGEgZG93bmxvYWQgbGluayB3aWxsIGFwcGVhciB3aGVuIGl0IGZpbmlzaGVzLlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfSBAZWxzZSBpZiAoYWN0aXZlSm9iLnN0YXR1cyA9PT0gJ3N1Y2NlZWRlZCcgJiYgYWN0aXZlSm9iLmRvd25sb2FkVXJsKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBnYXAtMiBmbGV4LXdyYXBcIj5cclxuICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAge3sga2luZExhYmVsKGFjdGl2ZUpvYi5raW5kKSB9fSBleHBvcnQgcmVhZHlAaWYgKGFjdGl2ZUpvYi5yb3dDb3VudCkgeyDigJQge3sgYWN0aXZlSm9iLnJvd0NvdW50IH19IHJvd3t7IGFjdGl2ZUpvYi5yb3dDb3VudCA9PT0gMSA/ICcnIDogJ3MnIH19IH0uXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgIDxhIFtocmVmXT1cImFjdGl2ZUpvYi5kb3dubG9hZFVybFwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc3VjY2Vzc1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+RG93bmxvYWQ8L2E+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImRpc21pc3NSZXN1bHQoKVwiPkRpc21pc3M8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9IEBlbHNlIGlmIChhY3RpdmVKb2Iuc3RhdHVzID09PSAnZmFpbGVkJykge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ2FwLTIgZmxleC13cmFwXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IGtpbmRMYWJlbChhY3RpdmVKb2Iua2luZCkgfX0gZXhwb3J0IGZhaWxlZDoge3sgYWN0aXZlSm9iLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImRpc21pc3NSZXN1bHQoKVwiPkRpc21pc3M8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgQGlmIChtZXNzYWdlKSB7XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cIm10LTMgYWxlcnRcIlxyXG4gICAgICAgIFtjbGFzcy5hbGVydC1zdWNjZXNzXT1cIm1lc3NhZ2VUeXBlID09PSAnc3VjY2VzcydcIlxyXG4gICAgICAgIFtjbGFzcy5hbGVydC1kYW5nZXJdPVwibWVzc2FnZVR5cGUgPT09ICdlcnJvcidcIj5cclxuICAgICAgICB7eyBtZXNzYWdlIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcbiJdfQ==
|