tango-app-ui-store-builder 1.0.46 → 1.0.48
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 -3
- package/esm2022/lib/components/collection-update-ai/components/dynamic-filter/dynamic-filter.component.mjs +183 -0
- package/esm2022/lib/components/collection-update-ai/components/store-dropdown/store-dropdown.component.mjs +211 -0
- package/esm2022/lib/components/collection-update-ai/components/store-fixture/store-fixture.component.mjs +422 -0
- package/esm2022/lib/components/collection-update-ai/components/store-select/store-select.component.mjs +148 -0
- package/esm2022/lib/components/collection-update-ai/find-replace-layout/cancel-confirmation-modal/cancel-confirmation-modal.component.mjs +20 -0
- package/esm2022/lib/components/collection-update-ai/find-replace-layout/find-replace-layout.component.mjs +359 -0
- package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/batch-confirmation-modal/batch-confirmation-modal.component.mjs +23 -0
- package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +2524 -0
- package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/approve-complete-modal/approve-complete-modal.component.mjs +66 -0
- package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/fixture-before-after/fixture-before-after.component.mjs +85 -0
- package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.mjs +2039 -0
- package/esm2022/lib/components/collection-update-ai/find-replace-table/find-replace-table.component.mjs +433 -0
- package/esm2022/lib/components/collection-update-ai/find-replace-table/reschedule-modal/reschedule-modal.component.mjs +76 -0
- package/esm2022/lib/components/collection-update-ai/models/find-replace.model.mjs +2 -0
- package/esm2022/lib/components/collection-update-ai/services/data.service.mjs +291 -0
- package/esm2022/lib/components/create-fixture/create-fixture.component.mjs +233 -138
- package/esm2022/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.mjs +4 -2
- package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +4 -2
- package/esm2022/lib/components/fixture-template/template-basic-details/template-basic-details.component.mjs +40 -4
- package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +3 -3
- package/esm2022/lib/components/fixture-template/template-summary/template-summary.component.mjs +3 -3
- package/esm2022/lib/components/fixture-template/template-vms/template-vms.component.mjs +108 -79
- package/esm2022/lib/components/fixture-template-table/fixture-template-table.component.mjs +33 -4
- package/esm2022/lib/components/fixture-template-tree/fixture-template-tree.component.mjs +7 -3
- package/esm2022/lib/components/manage-plano/rollout-table/rollout-table.component.mjs +25 -3
- package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +4 -2
- package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +27 -4
- package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/template-vms/template-vms.component.mjs +10 -14
- package/esm2022/lib/components/manage-store-plano/verification-feedback/editable-fixture/editable-fixture.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +3 -3
- package/esm2022/lib/components/planogram/merch-compliance/fixture-products/fixture-products.component.mjs +75 -31
- package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +7 -8
- package/esm2022/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.mjs +234 -0
- package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +1110 -0
- package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.mjs +52 -0
- package/esm2022/lib/components/planogram/merch-compliance/zone-products/zone-products.component.mjs +36 -10
- package/esm2022/lib/components/planogram/plano-analytics/analytics-popup/analytics-popup.component.mjs +68 -0
- package/esm2022/lib/components/planogram/plano-analytics/date-range-picker/date-range-picker.component.mjs +92 -0
- package/esm2022/lib/components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component.mjs +645 -0
- package/esm2022/lib/components/planogram/plano-analytics/plano-analytics.component.mjs +1276 -0
- package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +33 -15
- package/esm2022/lib/components/planogram/plano-overview/fixture-overview/fixture-overview.component.mjs +41 -35
- package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +8 -4
- package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +19 -12
- package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +3 -3
- package/esm2022/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.mjs +3 -2
- package/esm2022/lib/components/store-plano/store-plano.component.mjs +4 -2
- package/esm2022/lib/interfaces/fixture-library.interface.mjs +1 -1
- package/esm2022/lib/services/store-builder.service.mjs +49 -1
- package/esm2022/lib/tango-store-builder-routing.module.mjs +23 -1
- package/esm2022/lib/tango-store-builder.module.mjs +42 -5
- package/fesm2022/tango-app-ui-store-builder.mjs +12677 -2064
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/collection-update-ai/components/dynamic-filter/dynamic-filter.component.d.ts +51 -0
- package/lib/components/collection-update-ai/components/store-dropdown/store-dropdown.component.d.ts +36 -0
- package/lib/components/collection-update-ai/components/store-fixture/store-fixture.component.d.ts +50 -0
- package/lib/components/collection-update-ai/components/store-select/store-select.component.d.ts +33 -0
- package/lib/components/collection-update-ai/find-replace-layout/cancel-confirmation-modal/cancel-confirmation-modal.component.d.ts +9 -0
- package/lib/components/collection-update-ai/find-replace-layout/find-replace-layout.component.d.ts +58 -0
- package/lib/components/collection-update-ai/find-replace-layout/prepare-template/batch-confirmation-modal/batch-confirmation-modal.component.d.ts +10 -0
- package/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.d.ts +141 -0
- package/lib/components/collection-update-ai/find-replace-layout/review-replace/approve-complete-modal/approve-complete-modal.component.d.ts +18 -0
- package/lib/components/collection-update-ai/find-replace-layout/review-replace/fixture-before-after/fixture-before-after.component.d.ts +19 -0
- package/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.d.ts +116 -0
- package/lib/components/collection-update-ai/find-replace-table/find-replace-table.component.d.ts +63 -0
- package/lib/components/collection-update-ai/find-replace-table/reschedule-modal/reschedule-modal.component.d.ts +19 -0
- package/lib/components/collection-update-ai/models/find-replace.model.d.ts +55 -0
- package/lib/components/collection-update-ai/services/data.service.d.ts +70 -0
- package/lib/components/create-fixture/create-fixture.component.d.ts +15 -14
- package/lib/components/fixture-template/template-basic-details/template-basic-details.component.d.ts +2 -0
- package/lib/components/fixture-template/template-vms/template-vms.component.d.ts +12 -12
- package/lib/components/fixture-template-table/fixture-template-table.component.d.ts +2 -0
- package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +4 -2
- package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +4 -4
- package/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.d.ts +2 -0
- package/lib/components/manage-store-plano/template-vms/template-vms.component.d.ts +0 -1
- package/lib/components/planogram/merch-compliance/fixture-products/fixture-products.component.d.ts +8 -2
- package/lib/components/planogram/merch-compliance/merch-compliance.component.d.ts +1 -3
- package/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.d.ts +47 -0
- package/lib/components/planogram/merch-compliance/product-locator/product-locator.component.d.ts +70 -0
- package/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.d.ts +16 -0
- package/lib/components/planogram/merch-compliance/zone-products/zone-products.component.d.ts +13 -3
- package/lib/components/planogram/plano-analytics/analytics-popup/analytics-popup.component.d.ts +25 -0
- package/lib/components/planogram/plano-analytics/date-range-picker/date-range-picker.component.d.ts +24 -0
- package/lib/components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component.d.ts +93 -0
- package/lib/components/planogram/plano-analytics/plano-analytics.component.d.ts +97 -0
- package/lib/components/planogram/plano-details-parent/plano-details-parent.component.d.ts +8 -3
- package/lib/components/planogram/plano-overview/fixture-overview/fixture-overview.component.d.ts +2 -4
- package/lib/interfaces/fixture-library.interface.d.ts +1 -1
- package/lib/services/store-builder.service.d.ts +25 -0
- package/lib/tango-store-builder.module.d.ts +31 -21
- package/package.json +1 -1
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { DynamicFilterComponent } from '../components/dynamic-filter/dynamic-filter.component';
|
|
3
|
+
import { Subject, takeUntil, debounceTime, distinctUntilChanged } from 'rxjs';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import { FormsModule } from '@angular/forms';
|
|
6
|
+
import { CommonSharedModule } from 'tango-app-ui-shared';
|
|
7
|
+
import { DeleteConfirmationComponent } from '../../popups/delete-confirmation/delete-confirmation.component';
|
|
8
|
+
import { CancelConfirmationModalComponent } from '../find-replace-layout/cancel-confirmation-modal/cancel-confirmation-modal.component';
|
|
9
|
+
import { RescheduleModalComponent } from './reschedule-modal/reschedule-modal.component';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "../../../services/store-builder.service";
|
|
12
|
+
import * as i2 from "@angular/router";
|
|
13
|
+
import * as i3 from "@ng-bootstrap/ng-bootstrap";
|
|
14
|
+
import * as i4 from "tango-app-ui-shared";
|
|
15
|
+
import * as i5 from "tango-app-ui-global";
|
|
16
|
+
import * as i6 from "@angular/common";
|
|
17
|
+
import * as i7 from "@angular/forms";
|
|
18
|
+
export class FindReplaceTableComponent {
|
|
19
|
+
storeBuilderService;
|
|
20
|
+
router;
|
|
21
|
+
ngbModal;
|
|
22
|
+
toast;
|
|
23
|
+
gs;
|
|
24
|
+
findReplaceList = [];
|
|
25
|
+
searchTerm = '';
|
|
26
|
+
limit = 10;
|
|
27
|
+
offset = 1;
|
|
28
|
+
totalItems = 0;
|
|
29
|
+
paginationSizes = [10, 20, 30];
|
|
30
|
+
sortedColumn = '';
|
|
31
|
+
sortOrder = -1;
|
|
32
|
+
appliedFilters = {
|
|
33
|
+
status: []
|
|
34
|
+
};
|
|
35
|
+
filterObject = [
|
|
36
|
+
{
|
|
37
|
+
title: "Status",
|
|
38
|
+
type: "multi",
|
|
39
|
+
isOpened: false,
|
|
40
|
+
options: [
|
|
41
|
+
{ name: "Draft", value: "draft", checked: false },
|
|
42
|
+
{ name: "Batch Running", value: "batch-running", checked: false },
|
|
43
|
+
{ name: "Yet To Approve", value: "yet-to-approve", checked: false },
|
|
44
|
+
{ name: "Approved", value: "approved", checked: false },
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
isPageLoading = true;
|
|
49
|
+
isError = false;
|
|
50
|
+
clientId = '';
|
|
51
|
+
destroy$ = new Subject();
|
|
52
|
+
findReplaceSub;
|
|
53
|
+
searchSubject = new Subject();
|
|
54
|
+
constructor(storeBuilderService, router, ngbModal, toast, gs) {
|
|
55
|
+
this.storeBuilderService = storeBuilderService;
|
|
56
|
+
this.router = router;
|
|
57
|
+
this.ngbModal = ngbModal;
|
|
58
|
+
this.toast = toast;
|
|
59
|
+
this.gs = gs;
|
|
60
|
+
// Setup search debounce
|
|
61
|
+
this.searchSubject.pipe(debounceTime(1000), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(() => {
|
|
62
|
+
this.onSearch();
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
ngOnInit() {
|
|
66
|
+
// Get client ID
|
|
67
|
+
this.gs.dataRangeValue
|
|
68
|
+
.pipe(takeUntil(this.destroy$))
|
|
69
|
+
.subscribe((data) => {
|
|
70
|
+
if (data?.client) {
|
|
71
|
+
this.clientId = data.client;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
const headerData = JSON.parse(localStorage.getItem("header-filters") || '{}');
|
|
75
|
+
if (headerData?.client) {
|
|
76
|
+
this.clientId = headerData.client;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Load data once clientId is available
|
|
80
|
+
if (this.clientId) {
|
|
81
|
+
this.getFindReplaceList();
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
// Also try to get clientId from localStorage immediately
|
|
85
|
+
try {
|
|
86
|
+
const headerData = JSON.parse(localStorage.getItem("header-filters") || '{}');
|
|
87
|
+
if (headerData?.client && !this.clientId) {
|
|
88
|
+
this.clientId = headerData.client;
|
|
89
|
+
this.getFindReplaceList();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
// Ignore parse errors
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
getFindReplaceList() {
|
|
97
|
+
this.findReplaceSub?.unsubscribe(); // Cancel previous request
|
|
98
|
+
this.isPageLoading = true;
|
|
99
|
+
this.findReplaceList = [];
|
|
100
|
+
const payload = {
|
|
101
|
+
limit: this.limit,
|
|
102
|
+
offset: this.offset,
|
|
103
|
+
searchValue: this.searchTerm || undefined,
|
|
104
|
+
filter: this.appliedFilters.status?.length > 0 ? this.appliedFilters : undefined,
|
|
105
|
+
sortColumnName: this.sortedColumn || undefined,
|
|
106
|
+
sortBy: this.sortOrder,
|
|
107
|
+
clientId: this.clientId
|
|
108
|
+
};
|
|
109
|
+
this.findReplaceSub = this.storeBuilderService
|
|
110
|
+
.getAllFindReplaceData(payload)
|
|
111
|
+
.pipe(takeUntil(this.destroy$))
|
|
112
|
+
.subscribe({
|
|
113
|
+
next: (res) => {
|
|
114
|
+
const response = res;
|
|
115
|
+
if (response && response?.code === 200) {
|
|
116
|
+
this.totalItems = response?.data?.count || 0;
|
|
117
|
+
this.findReplaceList = response?.data?.data ?? [];
|
|
118
|
+
if (this.totalItems < 10) {
|
|
119
|
+
this.paginationSizes = [this.totalItems];
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
this.paginationSizes = [10, 20, 30];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
this.isPageLoading = false;
|
|
126
|
+
this.isError = false;
|
|
127
|
+
},
|
|
128
|
+
error: (err) => {
|
|
129
|
+
this.isPageLoading = false;
|
|
130
|
+
this.isError = true;
|
|
131
|
+
console.error('Error fetching find replace data:', err);
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
onSearchInput(event) {
|
|
136
|
+
const value = event.target.value;
|
|
137
|
+
this.searchTerm = value;
|
|
138
|
+
this.searchSubject.next(value);
|
|
139
|
+
}
|
|
140
|
+
onSearch() {
|
|
141
|
+
this.sortedColumn = '';
|
|
142
|
+
this.sortOrder = -1;
|
|
143
|
+
this.offset = 1;
|
|
144
|
+
this.limit = 10;
|
|
145
|
+
this.getFindReplaceList();
|
|
146
|
+
}
|
|
147
|
+
clearSearch() {
|
|
148
|
+
this.searchTerm = '';
|
|
149
|
+
this.onSearch();
|
|
150
|
+
}
|
|
151
|
+
onSortTable(column) {
|
|
152
|
+
// Map UI column names to API column names
|
|
153
|
+
const columnMap = {
|
|
154
|
+
'name': 'name',
|
|
155
|
+
'created': 'createdAt',
|
|
156
|
+
'stores': 'storeCount',
|
|
157
|
+
'target': 'target',
|
|
158
|
+
'status': 'status'
|
|
159
|
+
};
|
|
160
|
+
const apiColumn = columnMap[column] || column;
|
|
161
|
+
if (this.sortedColumn === apiColumn) {
|
|
162
|
+
this.sortOrder = this.sortOrder === 1 ? -1 : 1;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
this.sortedColumn = apiColumn;
|
|
166
|
+
this.sortOrder = -1;
|
|
167
|
+
}
|
|
168
|
+
this.offset = 1;
|
|
169
|
+
this.limit = 10;
|
|
170
|
+
this.getFindReplaceList();
|
|
171
|
+
}
|
|
172
|
+
applyFilters(event) {
|
|
173
|
+
if (event && Array.isArray(event)) {
|
|
174
|
+
event.forEach((ele) => {
|
|
175
|
+
if (ele.title === 'Status' || ele.title === 'status') {
|
|
176
|
+
this.appliedFilters.status = ele.selected || [];
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
else if (event && typeof event === 'object') {
|
|
181
|
+
// Handle reset filters
|
|
182
|
+
this.appliedFilters.status = [];
|
|
183
|
+
}
|
|
184
|
+
this.offset = 1;
|
|
185
|
+
this.getFindReplaceList();
|
|
186
|
+
}
|
|
187
|
+
onPageChange(pageOffset) {
|
|
188
|
+
this.offset = Number(pageOffset);
|
|
189
|
+
this.getFindReplaceList();
|
|
190
|
+
}
|
|
191
|
+
onPageSizeChange(pageSize) {
|
|
192
|
+
this.offset = 1;
|
|
193
|
+
this.limit = Number(pageSize);
|
|
194
|
+
this.getFindReplaceList();
|
|
195
|
+
}
|
|
196
|
+
paginationSize() {
|
|
197
|
+
return this.totalItems < 10 ? this.totalItems : this.limit;
|
|
198
|
+
}
|
|
199
|
+
getStatusBadgeClass(status) {
|
|
200
|
+
const statusMap = {
|
|
201
|
+
'draft': 'draft',
|
|
202
|
+
'batch-running': 'batch-running',
|
|
203
|
+
'yet-to-approve': 'yet-to-approve',
|
|
204
|
+
'approved': 'approved',
|
|
205
|
+
'scheduled': 'approved',
|
|
206
|
+
};
|
|
207
|
+
return statusMap[status] || 'badge-secondary';
|
|
208
|
+
}
|
|
209
|
+
getStatusDisplay(status) {
|
|
210
|
+
const statusMap = {
|
|
211
|
+
'draft': 'Draft',
|
|
212
|
+
'batch-running': 'Batch Running',
|
|
213
|
+
'yet-to-approve': 'Yet To Approve',
|
|
214
|
+
'approved': 'Approved',
|
|
215
|
+
'scheduled': 'Scheduled',
|
|
216
|
+
};
|
|
217
|
+
return statusMap[status] || status;
|
|
218
|
+
}
|
|
219
|
+
getTargetDisplay(target) {
|
|
220
|
+
if (!target)
|
|
221
|
+
return '-';
|
|
222
|
+
const targetMap = {
|
|
223
|
+
'merch': 'Merch',
|
|
224
|
+
'vm': 'Visual Merch',
|
|
225
|
+
'both': 'Both'
|
|
226
|
+
};
|
|
227
|
+
return targetMap[target] || target;
|
|
228
|
+
}
|
|
229
|
+
formatDate(dateString) {
|
|
230
|
+
if (!dateString)
|
|
231
|
+
return '-';
|
|
232
|
+
// If it's already formatted (from API), return as is
|
|
233
|
+
if (typeof dateString === 'string' && dateString.includes(' ')) {
|
|
234
|
+
return dateString;
|
|
235
|
+
}
|
|
236
|
+
const date = new Date(dateString);
|
|
237
|
+
return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' });
|
|
238
|
+
}
|
|
239
|
+
onFindAndReplaceClick() {
|
|
240
|
+
this.router.navigate(['/manage/planogram/find-replace/prepare']);
|
|
241
|
+
}
|
|
242
|
+
onNameClick(item) {
|
|
243
|
+
if (!item._id) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const draftStatuses = ['draft'];
|
|
247
|
+
const batchStatuses = ['batch-running'];
|
|
248
|
+
const reviewStatuses = ['yet-to-approve', 'approved', 'scheduled'];
|
|
249
|
+
if (draftStatuses.includes(item.status)) {
|
|
250
|
+
this.router.navigate(['/manage/planogram/find-replace/prepare'], {
|
|
251
|
+
queryParams: { id: item._id }
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
else if (reviewStatuses.includes(item.status)) {
|
|
255
|
+
this.router.navigate(['/manage/planogram/find-replace/review'], {
|
|
256
|
+
queryParams: { id: item._id }
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
else if (batchStatuses.includes(item.status)) {
|
|
260
|
+
this.router.navigate(['/manage/planogram/find-replace'], {
|
|
261
|
+
queryParams: { id: item._id }
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
shouldShowDelete(item) {
|
|
266
|
+
return item.status === 'draft';
|
|
267
|
+
}
|
|
268
|
+
shouldShowCancel(item) {
|
|
269
|
+
return item.status === 'batch-running';
|
|
270
|
+
}
|
|
271
|
+
shouldShowEdit(item) {
|
|
272
|
+
return item.status === 'yet-to-approve';
|
|
273
|
+
}
|
|
274
|
+
shouldShowReschedule(item) {
|
|
275
|
+
return item.status === 'scheduled';
|
|
276
|
+
}
|
|
277
|
+
hasAnyAction(item) {
|
|
278
|
+
return this.shouldShowDelete(item) || this.shouldShowCancel(item) || this.shouldShowReschedule(item) || this.shouldShowEdit(item);
|
|
279
|
+
}
|
|
280
|
+
onEdit(item) {
|
|
281
|
+
if (!item._id) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
this.router.navigate(['/manage/planogram/find-replace/review'], {
|
|
285
|
+
queryParams: { id: item._id }
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
async confirmDeletion() {
|
|
289
|
+
const modelRef = this.ngbModal.open(DeleteConfirmationComponent, { centered: true });
|
|
290
|
+
modelRef.componentInstance.title = 'Delete Find and Replace';
|
|
291
|
+
modelRef.componentInstance.description = 'Are you sure you want to delete this find and replace?';
|
|
292
|
+
return await modelRef.result.then((result) => result === 'ok').catch(() => false);
|
|
293
|
+
}
|
|
294
|
+
async onDelete(item) {
|
|
295
|
+
if (!item._id) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
if (!await this.confirmDeletion())
|
|
299
|
+
return;
|
|
300
|
+
this.storeBuilderService.deleteFindReplaceAi({ id: item._id }).subscribe({
|
|
301
|
+
next: (res) => {
|
|
302
|
+
if (res?.status === 'success' || res?.code === 200) {
|
|
303
|
+
this.toast.getSuccessToast(res?.message || 'Find and replace deleted successfully');
|
|
304
|
+
this.getFindReplaceList();
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
this.toast.getErrorToast(res?.message || 'Failed to delete find and replace');
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
error: (err) => {
|
|
311
|
+
this.toast.getErrorToast(err?.error?.error || err?.error?.message || 'Failed to delete find and replace');
|
|
312
|
+
console.error('Error deleting find replace:', err);
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
async confirmCancel() {
|
|
317
|
+
const modelRef = this.ngbModal.open(CancelConfirmationModalComponent, { centered: true });
|
|
318
|
+
return await modelRef.result.then((result) => result === true).catch(() => false);
|
|
319
|
+
}
|
|
320
|
+
async onCancel(item) {
|
|
321
|
+
if (!item._id) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
if (!await this.confirmCancel())
|
|
325
|
+
return;
|
|
326
|
+
this.storeBuilderService.cancelFindReplace({ findReplaceId: item._id }).subscribe({
|
|
327
|
+
next: (res) => {
|
|
328
|
+
if (res?.status === 'success' || res?.code === 200) {
|
|
329
|
+
this.toast.getSuccessToast(res?.message || 'Find and replace cancelled successfully');
|
|
330
|
+
this.getFindReplaceList();
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
this.toast.getErrorToast(res?.message || 'Failed to cancel find and replace');
|
|
334
|
+
}
|
|
335
|
+
},
|
|
336
|
+
error: (err) => {
|
|
337
|
+
this.toast.getErrorToast(err?.error?.error || err?.error?.message || 'Failed to cancel find and replace');
|
|
338
|
+
console.error('Error cancelling find replace:', err);
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
async onReschedule(item) {
|
|
343
|
+
if (!item._id) {
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
const modalRef = this.ngbModal.open(RescheduleModalComponent, {
|
|
347
|
+
centered: true,
|
|
348
|
+
size: 'md',
|
|
349
|
+
backdrop: 'static',
|
|
350
|
+
windowClass: 'reschedule-modal'
|
|
351
|
+
});
|
|
352
|
+
// Pass the initial schedule values to the modal
|
|
353
|
+
modalRef.componentInstance.initialSchedule = item.schedule || false;
|
|
354
|
+
modalRef.componentInstance.initialScheduleDate = item.scheduleDate || null;
|
|
355
|
+
try {
|
|
356
|
+
const result = await modalRef.result;
|
|
357
|
+
if (result) {
|
|
358
|
+
// Prepare data for saveAsDraft API
|
|
359
|
+
// The API expects id (not _id) and all required fields
|
|
360
|
+
const draftData = {
|
|
361
|
+
id: item._id,
|
|
362
|
+
name: item.name || '',
|
|
363
|
+
searchMode: item.searchMode || 'store',
|
|
364
|
+
storeSearchString: item.storeSearchString || '',
|
|
365
|
+
target: item.target || 'merch',
|
|
366
|
+
findPrompt: item.findPrompt || '',
|
|
367
|
+
replacePrompt: item.replacePrompt || '',
|
|
368
|
+
stores: item.stores || [],
|
|
369
|
+
storeCount: item.storeCount || 0,
|
|
370
|
+
selectedClusters: item.selectedClusters || undefined,
|
|
371
|
+
status: item.status || 'draft',
|
|
372
|
+
schedule: result.schedule,
|
|
373
|
+
scheduleDate: result.scheduleDate
|
|
374
|
+
};
|
|
375
|
+
// Call saveAsDraft API first
|
|
376
|
+
this.storeBuilderService.saveAsDraft(draftData).subscribe({
|
|
377
|
+
next: (res) => {
|
|
378
|
+
if (res?.status === 'success' || res?.code === 200) {
|
|
379
|
+
// If schedule is false, call approveReplace API
|
|
380
|
+
if (!result.schedule) {
|
|
381
|
+
this.storeBuilderService.approveReplace({
|
|
382
|
+
findReplaceId: item._id
|
|
383
|
+
}).subscribe({
|
|
384
|
+
next: (approveRes) => {
|
|
385
|
+
if (approveRes?.status === 'success' || approveRes?.code === 200) {
|
|
386
|
+
this.toast.getSuccessToast(approveRes?.message || 'Find and replace approved successfully');
|
|
387
|
+
this.getFindReplaceList();
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
this.toast.getErrorToast(approveRes?.message || 'Failed to approve find and replace');
|
|
391
|
+
}
|
|
392
|
+
},
|
|
393
|
+
error: (approveErr) => {
|
|
394
|
+
this.toast.getErrorToast(approveErr?.error?.error || approveErr?.error?.message || 'Failed to approve find and replace');
|
|
395
|
+
console.error('Error approving find replace:', approveErr);
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
// Schedule is true, just show success message
|
|
401
|
+
this.toast.getSuccessToast(res?.message || 'Find and replace rescheduled successfully');
|
|
402
|
+
this.getFindReplaceList();
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
this.toast.getErrorToast(res?.message || 'Failed to reschedule find and replace');
|
|
407
|
+
}
|
|
408
|
+
},
|
|
409
|
+
error: (err) => {
|
|
410
|
+
this.toast.getErrorToast(err?.error?.error || err?.error?.message || 'Failed to reschedule find and replace');
|
|
411
|
+
console.error('Error rescheduling find replace:', err);
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
// User dismissed the modal
|
|
418
|
+
console.log('Reschedule modal dismissed');
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
ngOnDestroy() {
|
|
422
|
+
this.destroy$.next();
|
|
423
|
+
this.destroy$.complete();
|
|
424
|
+
this.findReplaceSub?.unsubscribe();
|
|
425
|
+
}
|
|
426
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FindReplaceTableComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.Router }, { token: i3.NgbModal }, { token: i4.ToastService }, { token: i5.GlobalStateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
427
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FindReplaceTableComponent, isStandalone: true, selector: "lib-find-replace-table", ngImport: i0, template: "<div class=\"content-wrapper\">\r\n <div>\r\n <div class=\"d-flex justify-content-between align-items-center mb-5\">\r\n <div>\r\n <h4>Find and Replace</h4>\r\n <span>{{ totalItems }} - Total Records</span>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <div style=\"position: relative\">\r\n <input \r\n type=\"text\" \r\n [(ngModel)]=\"searchTerm\"\r\n (input)=\"onSearchInput($event)\"\r\n style=\"padding-left: 3rem; padding-right: 3rem\" \r\n class=\"form-control\"\r\n name=\"search\" \r\n autocomplete=\"off\" \r\n placeholder=\"Search\" />\r\n\r\n <span class=\"search-icon\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" />\r\n </svg>\r\n </span>\r\n\r\n <button \r\n *ngIf=\"searchTerm\" \r\n type=\"button\" \r\n aria-label=\"Clear\" \r\n (click)=\"clearSearch()\"\r\n class=\"clear-search\">\r\n <svg width=\"64px\" height=\"64px\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <path d=\"M9 9L15 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n <path d=\"M15 9L9 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></circle>\r\n </g>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <lib-dynamic-filter [filterObject]=\"filterObject\" (applyFilters)=\"applyFilters($event)\" (resetFilters)=\"applyFilters($event)\"></lib-dynamic-filter>\r\n\r\n <!-- <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n </svg>\r\n <span class=\"ms-2\"></span> Export\r\n </button> -->\r\n\r\n <button type=\"button\" class=\"btn btn-primary d-inline-flex align-items-center\" (click)=\"onFindAndReplaceClick()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16663V15.8333M4.16675 9.99996H15.8334\" stroke=\"white\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"ms-2 text-white\">Find And Replace</span>\r\n </button>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Loading State -->\r\n <div *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- No Data State -->\r\n <div *ngIf=\"!isPageLoading && findReplaceList.length === 0 && !isError\"\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">No data found</div>\r\n <div class=\"nodatasubtext\">There is no result for find and replace table</div>\r\n </div>\r\n\r\n <!-- Error State -->\r\n <div *ngIf=\"isError && !isPageLoading\"\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <div class=\"nodatamaintext mt-3\">Error loading data</div>\r\n <div class=\"nodatasubtext\">Please try again later</div>\r\n </div>\r\n\r\n <!-- Table -->\r\n <section id=\"list-view\" *ngIf=\"!isPageLoading && findReplaceList.length > 0\">\r\n <div class=\"table-responsive\">\r\n <table class=\"w-100 table bottom-border text-nowrap\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <span class=\"cursor-pointer\" (click)=\"onSortTable('name')\">\r\n Name\r\n <i class=\"fa ms-1 mt-1\" \r\n [ngClass]=\"sortedColumn === 'name' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n aria-hidden=\"true\"></i>\r\n </span>\r\n </th>\r\n <th>\r\n <span class=\"cursor-pointer\" (click)=\"onSortTable('created')\">\r\n Created\r\n <i class=\"fa ms-1 mt-1\" \r\n [ngClass]=\"sortedColumn === 'created' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n aria-hidden=\"true\"></i>\r\n </span>\r\n </th>\r\n <th>\r\n Scheduled\r\n </th>\r\n <th>\r\n <span class=\"cursor-pointer\" (click)=\"onSortTable('stores')\">\r\n Stores\r\n <i class=\"fa ms-1 mt-1\" \r\n [ngClass]=\"sortedColumn === 'stores' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n aria-hidden=\"true\"></i>\r\n </span>\r\n </th>\r\n <th>\r\n <span class=\"cursor-pointer\" (click)=\"onSortTable('target')\">\r\n Target\r\n <i class=\"fa ms-1 mt-1\" \r\n [ngClass]=\"sortedColumn === 'target' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n aria-hidden=\"true\"></i>\r\n </span>\r\n </th>\r\n <th>\r\n Find\r\n </th>\r\n <th>\r\n Replace\r\n </th>\r\n <th>\r\n <span class=\"cursor-pointer\" (click)=\"onSortTable('status')\">\r\n Status\r\n <i class=\"fa ms-1 mt-1\" \r\n [ngClass]=\"sortedColumn === 'status' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n aria-hidden=\"true\"></i>\r\n </span>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of findReplaceList\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <a class=\"cursor-pointer text-decoration-underline\" (click)=\"onNameClick(item)\">\r\n {{ item.name || '-' }}\r\n </a>\r\n </div>\r\n </td>\r\n <td>{{ formatDate(item.createdAt) }}</td>\r\n <td class=\"text-muted\">{{ item.scheduleDate ? formatDate(item.scheduleDate) : '-' }}</td>\r\n <td class=\"text-muted\">{{ item.storeCount || 0 }}</td>\r\n <td class=\"text-muted\">{{ getTargetDisplay(item.target) }}</td>\r\n <td class=\"text-muted\">\r\n <span *ngIf=\"item.findPrompt\" [title]=\"item.findPrompt\">\r\n {{ item.findPrompt.length > 50 ? (item.findPrompt.substring(0, 50) + '...') : item.findPrompt }}\r\n </span>\r\n <span *ngIf=\"!item.findPrompt\">-</span>\r\n </td>\r\n <td class=\"text-muted\">\r\n <span *ngIf=\"item.replacePrompt\" [title]=\"item.replacePrompt\">\r\n {{ item.replacePrompt.length > 50 ? (item.replacePrompt.substring(0, 50) + '...') : item.replacePrompt }}\r\n </span>\r\n <span *ngIf=\"!item.replacePrompt\">-</span>\r\n </td>\r\n <td>\r\n <div class=\"badge\" [ngClass]=\"getStatusBadgeClass(item.status)\">\r\n {{ getStatusDisplay(item.status) }}\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"dropdown\" *ngIf=\"hasAnyAction(item)\">\r\n <button class=\"btn btn-link p-0\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <ng-container *ngTemplateOutlet=\"verticalDots\"></ng-container>\r\n </button>\r\n <ul class=\"dropdown-menu dropdown-menu-end\">\r\n <li *ngIf=\"shouldShowDelete(item)\">\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete(item)\">Delete</a>\r\n </li>\r\n <li *ngIf=\"shouldShowEdit(item)\">\r\n <a class=\"dropdown-item cursor-pointer\" (click)=\"onEdit(item)\">Edit</a>\r\n </li>\r\n <li *ngIf=\"shouldShowCancel(item)\">\r\n <a class=\"dropdown-item cursor-pointer\" (click)=\"onCancel(item)\">Cancel</a>\r\n </li>\r\n <li *ngIf=\"shouldShowReschedule(item)\">\r\n <a class=\"dropdown-item cursor-pointer\" (click)=\"onReschedule(item)\">Reschedule</a>\r\n </li>\r\n </ul>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </section>\r\n\r\n <!-- Pagination -->\r\n <lib-pagination\r\n *ngIf=\"!isPageLoading && findReplaceList.length !== 0\"\r\n [itemsPerPage]=\"limit\"\r\n [currentPage]=\"offset\"\r\n [totalItems]=\"totalItems\"\r\n [paginationSizes]=\"paginationSizes\"\r\n [pageSize]=\"paginationSize()\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\">\r\n </lib-pagination>\r\n </div>\r\n</div>\r\n\r\n<ng-template #verticalDots>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"4\" height=\"18\" viewBox=\"0 0 4 18\" fill=\"none\">\r\n <path\r\n d=\"M1 9C1 9.55228 1.44771 10 2 10C2.55228 10 3 9.55228 3 9C3 8.44772 2.55228 8 2 8C1.44771 8 1 8.44772 1 9Z\"\r\n stroke=\"#101828\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M0.999999 16C0.999999 16.5523 1.44771 17 2 17C2.55228 17 3 16.5523 3 16C3 15.4477 2.55228 15 2 15C1.44771 15 0.999999 15.4477 0.999999 16Z\"\r\n stroke=\"#101828\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M1 2C1 2.55228 1.44772 3 2 3C2.55228 3 3 2.55228 3 2C3 1.44772 2.55228 1 2 1C1.44772 1 1 1.44772 1 2Z\"\r\n stroke=\"#101828\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#f2f4f7;background:#667085}.badge.draft{background:#eaf8ff;color:#009bf3}.badge.batch-running{background:#fff6ed;color:#c4320a}.badge.approved{background:#d1fadf;color:#12b76a}.badge.yet-to-approve{background:#f2f4f7;color:#344054}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 330px);height:100%;padding:16px 24px}.badgeStyle{color:var(--Gray-700, #344054);text-align:center;font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px;background:#f2f4f7}.primaryBadgeStyle{color:var(--Gray-700, #009BF3);text-align:center;font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px;background:#eaf8ff}\n"], dependencies: [{ kind: "component", type: DynamicFilterComponent, selector: "lib-dynamic-filter", inputs: ["filterObject"], outputs: ["applyFilters", "resetFilters", "filterChanged"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonSharedModule }, { kind: "component", type: i4.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }] });
|
|
428
|
+
}
|
|
429
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FindReplaceTableComponent, decorators: [{
|
|
430
|
+
type: Component,
|
|
431
|
+
args: [{ selector: 'lib-find-replace-table', standalone: true, imports: [DynamicFilterComponent, CommonModule, FormsModule, CommonSharedModule], template: "<div class=\"content-wrapper\">\r\n <div>\r\n <div class=\"d-flex justify-content-between align-items-center mb-5\">\r\n <div>\r\n <h4>Find and Replace</h4>\r\n <span>{{ totalItems }} - Total Records</span>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <div style=\"position: relative\">\r\n <input \r\n type=\"text\" \r\n [(ngModel)]=\"searchTerm\"\r\n (input)=\"onSearchInput($event)\"\r\n style=\"padding-left: 3rem; padding-right: 3rem\" \r\n class=\"form-control\"\r\n name=\"search\" \r\n autocomplete=\"off\" \r\n placeholder=\"Search\" />\r\n\r\n <span class=\"search-icon\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" />\r\n </svg>\r\n </span>\r\n\r\n <button \r\n *ngIf=\"searchTerm\" \r\n type=\"button\" \r\n aria-label=\"Clear\" \r\n (click)=\"clearSearch()\"\r\n class=\"clear-search\">\r\n <svg width=\"64px\" height=\"64px\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <path d=\"M9 9L15 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n <path d=\"M15 9L9 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></circle>\r\n </g>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <lib-dynamic-filter [filterObject]=\"filterObject\" (applyFilters)=\"applyFilters($event)\" (resetFilters)=\"applyFilters($event)\"></lib-dynamic-filter>\r\n\r\n <!-- <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n </svg>\r\n <span class=\"ms-2\"></span> Export\r\n </button> -->\r\n\r\n <button type=\"button\" class=\"btn btn-primary d-inline-flex align-items-center\" (click)=\"onFindAndReplaceClick()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16663V15.8333M4.16675 9.99996H15.8334\" stroke=\"white\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"ms-2 text-white\">Find And Replace</span>\r\n </button>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Loading State -->\r\n <div *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- No Data State -->\r\n <div *ngIf=\"!isPageLoading && findReplaceList.length === 0 && !isError\"\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">No data found</div>\r\n <div class=\"nodatasubtext\">There is no result for find and replace table</div>\r\n </div>\r\n\r\n <!-- Error State -->\r\n <div *ngIf=\"isError && !isPageLoading\"\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <div class=\"nodatamaintext mt-3\">Error loading data</div>\r\n <div class=\"nodatasubtext\">Please try again later</div>\r\n </div>\r\n\r\n <!-- Table -->\r\n <section id=\"list-view\" *ngIf=\"!isPageLoading && findReplaceList.length > 0\">\r\n <div class=\"table-responsive\">\r\n <table class=\"w-100 table bottom-border text-nowrap\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <span class=\"cursor-pointer\" (click)=\"onSortTable('name')\">\r\n Name\r\n <i class=\"fa ms-1 mt-1\" \r\n [ngClass]=\"sortedColumn === 'name' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n aria-hidden=\"true\"></i>\r\n </span>\r\n </th>\r\n <th>\r\n <span class=\"cursor-pointer\" (click)=\"onSortTable('created')\">\r\n Created\r\n <i class=\"fa ms-1 mt-1\" \r\n [ngClass]=\"sortedColumn === 'created' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n aria-hidden=\"true\"></i>\r\n </span>\r\n </th>\r\n <th>\r\n Scheduled\r\n </th>\r\n <th>\r\n <span class=\"cursor-pointer\" (click)=\"onSortTable('stores')\">\r\n Stores\r\n <i class=\"fa ms-1 mt-1\" \r\n [ngClass]=\"sortedColumn === 'stores' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n aria-hidden=\"true\"></i>\r\n </span>\r\n </th>\r\n <th>\r\n <span class=\"cursor-pointer\" (click)=\"onSortTable('target')\">\r\n Target\r\n <i class=\"fa ms-1 mt-1\" \r\n [ngClass]=\"sortedColumn === 'target' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n aria-hidden=\"true\"></i>\r\n </span>\r\n </th>\r\n <th>\r\n Find\r\n </th>\r\n <th>\r\n Replace\r\n </th>\r\n <th>\r\n <span class=\"cursor-pointer\" (click)=\"onSortTable('status')\">\r\n Status\r\n <i class=\"fa ms-1 mt-1\" \r\n [ngClass]=\"sortedColumn === 'status' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n aria-hidden=\"true\"></i>\r\n </span>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of findReplaceList\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <a class=\"cursor-pointer text-decoration-underline\" (click)=\"onNameClick(item)\">\r\n {{ item.name || '-' }}\r\n </a>\r\n </div>\r\n </td>\r\n <td>{{ formatDate(item.createdAt) }}</td>\r\n <td class=\"text-muted\">{{ item.scheduleDate ? formatDate(item.scheduleDate) : '-' }}</td>\r\n <td class=\"text-muted\">{{ item.storeCount || 0 }}</td>\r\n <td class=\"text-muted\">{{ getTargetDisplay(item.target) }}</td>\r\n <td class=\"text-muted\">\r\n <span *ngIf=\"item.findPrompt\" [title]=\"item.findPrompt\">\r\n {{ item.findPrompt.length > 50 ? (item.findPrompt.substring(0, 50) + '...') : item.findPrompt }}\r\n </span>\r\n <span *ngIf=\"!item.findPrompt\">-</span>\r\n </td>\r\n <td class=\"text-muted\">\r\n <span *ngIf=\"item.replacePrompt\" [title]=\"item.replacePrompt\">\r\n {{ item.replacePrompt.length > 50 ? (item.replacePrompt.substring(0, 50) + '...') : item.replacePrompt }}\r\n </span>\r\n <span *ngIf=\"!item.replacePrompt\">-</span>\r\n </td>\r\n <td>\r\n <div class=\"badge\" [ngClass]=\"getStatusBadgeClass(item.status)\">\r\n {{ getStatusDisplay(item.status) }}\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"dropdown\" *ngIf=\"hasAnyAction(item)\">\r\n <button class=\"btn btn-link p-0\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <ng-container *ngTemplateOutlet=\"verticalDots\"></ng-container>\r\n </button>\r\n <ul class=\"dropdown-menu dropdown-menu-end\">\r\n <li *ngIf=\"shouldShowDelete(item)\">\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete(item)\">Delete</a>\r\n </li>\r\n <li *ngIf=\"shouldShowEdit(item)\">\r\n <a class=\"dropdown-item cursor-pointer\" (click)=\"onEdit(item)\">Edit</a>\r\n </li>\r\n <li *ngIf=\"shouldShowCancel(item)\">\r\n <a class=\"dropdown-item cursor-pointer\" (click)=\"onCancel(item)\">Cancel</a>\r\n </li>\r\n <li *ngIf=\"shouldShowReschedule(item)\">\r\n <a class=\"dropdown-item cursor-pointer\" (click)=\"onReschedule(item)\">Reschedule</a>\r\n </li>\r\n </ul>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </section>\r\n\r\n <!-- Pagination -->\r\n <lib-pagination\r\n *ngIf=\"!isPageLoading && findReplaceList.length !== 0\"\r\n [itemsPerPage]=\"limit\"\r\n [currentPage]=\"offset\"\r\n [totalItems]=\"totalItems\"\r\n [paginationSizes]=\"paginationSizes\"\r\n [pageSize]=\"paginationSize()\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\">\r\n </lib-pagination>\r\n </div>\r\n</div>\r\n\r\n<ng-template #verticalDots>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"4\" height=\"18\" viewBox=\"0 0 4 18\" fill=\"none\">\r\n <path\r\n d=\"M1 9C1 9.55228 1.44771 10 2 10C2.55228 10 3 9.55228 3 9C3 8.44772 2.55228 8 2 8C1.44771 8 1 8.44772 1 9Z\"\r\n stroke=\"#101828\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M0.999999 16C0.999999 16.5523 1.44771 17 2 17C2.55228 17 3 16.5523 3 16C3 15.4477 2.55228 15 2 15C1.44771 15 0.999999 15.4477 0.999999 16Z\"\r\n stroke=\"#101828\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M1 2C1 2.55228 1.44772 3 2 3C2.55228 3 3 2.55228 3 2C3 1.44772 2.55228 1 2 1C1.44772 1 1 1.44772 1 2Z\"\r\n stroke=\"#101828\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#f2f4f7;background:#667085}.badge.draft{background:#eaf8ff;color:#009bf3}.badge.batch-running{background:#fff6ed;color:#c4320a}.badge.approved{background:#d1fadf;color:#12b76a}.badge.yet-to-approve{background:#f2f4f7;color:#344054}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 330px);height:100%;padding:16px 24px}.badgeStyle{color:var(--Gray-700, #344054);text-align:center;font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px;background:#f2f4f7}.primaryBadgeStyle{color:var(--Gray-700, #009BF3);text-align:center;font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px;background:#eaf8ff}\n"] }]
|
|
432
|
+
}], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.Router }, { type: i3.NgbModal }, { type: i4.ToastService }, { type: i5.GlobalStateService }] });
|
|
433
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC1yZXBsYWNlLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL2NvbGxlY3Rpb24tdXBkYXRlLWFpL2ZpbmQtcmVwbGFjZS10YWJsZS9maW5kLXJlcGxhY2UtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY29sbGVjdGlvbi11cGRhdGUtYWkvZmluZC1yZXBsYWNlLXRhYmxlL2ZpbmQtcmVwbGFjZS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEVBQUUsc0JBQXNCLEVBQWdCLE1BQU0sdURBQXVELENBQUM7QUFHN0csT0FBTyxFQUFFLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBZ0IsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUM3RyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxzRkFBc0YsQ0FBQztBQUN4SSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQzs7Ozs7Ozs7O0FBVXpGLE1BQU0sT0FBTyx5QkFBeUI7SUF1QzFCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUExQ1YsZUFBZSxHQUFrQixFQUFF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QUMsNEJBQTRCLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDckMsQ0FBQzt3R0EvYlUseUJBQXlCOzRGQUF6Qix5QkFBeUIsa0ZDdEJ0QywyMWVBMlFjLDIzWUR6UEYsc0JBQXNCLG9KQUFFLFlBQVksb2dCQUFFLFdBQVcsOG1CQUFFLGtCQUFrQjs7NEZBSXBFLHlCQUF5QjtrQkFQckMsU0FBUzsrQkFDRSx3QkFBd0IsY0FDdEIsSUFBSSxXQUNQLENBQUMsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgRHluYW1pY0ZpbHRlckNvbXBvbmVudCwgRmlsdGVyQ29uZmlnIH0gZnJvbSAnLi4vY29tcG9uZW50cy9keW5hbWljLWZpbHRlci9keW5hbWljLWZpbHRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmluZFJlcGxhY2UsIEZpbmRSZXBsYWNlUmVxdWVzdCwgRmluZFJlcGxhY2VSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9maW5kLXJlcGxhY2UubW9kZWwnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRha2VVbnRpbCwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQ29tbW9uU2hhcmVkTW9kdWxlLCBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BvcHVwcy9kZWxldGUtY29uZmlybWF0aW9uL2RlbGV0ZS1jb25maXJtYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2FuY2VsQ29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9maW5kLXJlcGxhY2UtbGF5b3V0L2NhbmNlbC1jb25maXJtYXRpb24tbW9kYWwvY2FuY2VsLWNvbmZpcm1hdGlvbi1tb2RhbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBSZXNjaGVkdWxlTW9kYWxDb21wb25lbnQgfSBmcm9tICcuL3Jlc2NoZWR1bGUtbW9kYWwvcmVzY2hlZHVsZS1tb2RhbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWZpbmQtcmVwbGFjZS10YWJsZScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbRHluYW1pY0ZpbHRlckNvbXBvbmVudCwgQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgQ29tbW9uU2hhcmVkTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZmluZC1yZXBsYWNlLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZmluZC1yZXBsYWNlLXRhYmxlLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRmluZFJlcGxhY2VUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBmaW5kUmVwbGFjZUxpc3Q6IEZpbmRSZXBsYWNlW10gPSBbXTtcclxuXHJcbiAgc2VhcmNoVGVybTogc3RyaW5nID0gJyc7XHJcbiAgbGltaXQ6IG51bWJlciA9IDEwO1xyXG4gIG9mZnNldDogbnVtYmVyID0gMTtcclxuICB0b3RhbEl0ZW1zOiBudW1iZXIgPSAwO1xyXG4gIHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXTtcclxuXHJcbiAgc29ydGVkQ29sdW1uOiBzdHJpbmcgPSAnJztcclxuICBzb3J0T3JkZXI6IG51bWJlciA9IC0xO1xyXG5cclxuICBhcHBsaWVkRmlsdGVyczogYW55ID0ge1xyXG4gICAgc3RhdHVzOiBbXVxyXG4gIH07XHJcblxyXG4gIGZpbHRlck9iamVjdDogRmlsdGVyQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiBcIlN0YXR1c1wiLFxyXG4gICAgICB0eXBlOiBcIm11bHRpXCIsXHJcbiAgICAgIGlzT3BlbmVkOiBmYWxzZSxcclxuICAgICAgb3B0aW9uczogW1xyXG4gICAgICAgIHsgbmFtZTogXCJEcmFmdFwiLCB2YWx1ZTogXCJkcmFmdFwiLCBjaGVja2VkOiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJCYXRjaCBSdW5uaW5nXCIsIHZhbHVlOiBcImJhdGNoLXJ1bm5pbmdcIiwgY2hlY2tlZDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiWWV0IFRvIEFwcHJvdmVcIiwgdmFsdWU6IFwieWV0LXRvLWFwcHJvdmVcIiwgY2hlY2tlZDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiQXBwcm92ZWRcIiwgdmFsdWU6IFwiYXBwcm92ZWRcIiwgY2hlY2tlZDogZmFsc2UgfSxcclxuICAgICAgXSxcclxuICAgIH0sXHJcbiAgXTtcclxuXHJcbiAgaXNQYWdlTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNsaWVudElkOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSBmaW5kUmVwbGFjZVN1Yj86IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIHNlYXJjaFN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzdG9yZUJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgbmdiTW9kYWw6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICAvLyBTZXR1cCBzZWFyY2ggZGVib3VuY2VcclxuICAgIHRoaXMuc2VhcmNoU3ViamVjdC5waXBlKFxyXG4gICAgICBkZWJvdW5jZVRpbWUoMTAwMCksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxyXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLm9uU2VhcmNoKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gR2V0IGNsaWVudCBJRFxyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YT8uY2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YS5jbGllbnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGhlYWRlckRhdGEgPSBKU09OLnBhcnNlKFxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIGFzIHN0cmluZyB8fCAne30nXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKGhlYWRlckRhdGE/LmNsaWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsaWVudElkID0gaGVhZGVyRGF0YS5jbGllbnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIExvYWQgZGF0YSBvbmNlIGNsaWVudElkIGlzIGF2YWlsYWJsZVxyXG4gICAgICAgIGlmICh0aGlzLmNsaWVudElkKSB7XHJcbiAgICAgICAgICB0aGlzLmdldEZpbmRSZXBsYWNlTGlzdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICBcclxuICAgIC8vIEFsc28gdHJ5IHRvIGdldCBjbGllbnRJZCBmcm9tIGxvY2FsU3RvcmFnZSBpbW1lZGlhdGVseVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSBhcyBzdHJpbmcgfHwgJ3t9J1xyXG4gICAgICApO1xyXG4gICAgICBpZiAoaGVhZGVyRGF0YT8uY2xpZW50ICYmICF0aGlzLmNsaWVudElkKSB7XHJcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckRhdGEuY2xpZW50O1xyXG4gICAgICAgIHRoaXMuZ2V0RmluZFJlcGxhY2VMaXN0KCk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gSWdub3JlIHBhcnNlIGVycm9yc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RmluZFJlcGxhY2VMaXN0KCkge1xyXG4gICAgdGhpcy5maW5kUmVwbGFjZVN1Yj8udW5zdWJzY3JpYmUoKTsgLy8gQ2FuY2VsIHByZXZpb3VzIHJlcXVlc3RcclxuXHJcbiAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5maW5kUmVwbGFjZUxpc3QgPSBbXTtcclxuXHJcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgIGxpbWl0OiB0aGlzLmxpbWl0LFxyXG4gICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxyXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5zZWFyY2hUZXJtIHx8IHVuZGVmaW5lZCxcclxuICAgICAgZmlsdGVyOiB0aGlzLmFwcGxpZWRGaWx0ZXJzLnN0YXR1cz8ubGVuZ3RoID4gMCA/IHRoaXMuYXBwbGllZEZpbHRlcnMgOiB1bmRlZmluZWQsXHJcbiAgICAgIHNvcnRDb2x1bW5OYW1lOiB0aGlzLnNvcnRlZENvbHVtbiB8fCB1bmRlZmluZWQsXHJcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0T3JkZXIsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZmluZFJlcGxhY2VTdWIgPSB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmdldEFsbEZpbmRSZXBsYWNlRGF0YShwYXlsb2FkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXMgYXMgRmluZFJlcGxhY2VSZXNwb25zZTtcclxuICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZT8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IHJlc3BvbnNlPy5kYXRhPy5jb3VudCB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLmZpbmRSZXBsYWNlTGlzdCA9IHJlc3BvbnNlPy5kYXRhPy5kYXRhID8/IFtdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy50b3RhbEl0ZW1zIDwgMTApIHtcclxuICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25TaXplcyA9IFt0aGlzLnRvdGFsSXRlbXNdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNpemVzID0gWzEwLCAyMCwgMzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuaXNFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5pc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGZpbmQgcmVwbGFjZSBkYXRhOicsIGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaElucHV0KGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG4gICAgdGhpcy5zZWFyY2hUZXJtID0gdmFsdWU7XHJcbiAgICB0aGlzLnNlYXJjaFN1YmplY3QubmV4dCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaCgpIHtcclxuICAgIHRoaXMuc29ydGVkQ29sdW1uID0gJyc7XHJcbiAgICB0aGlzLnNvcnRPcmRlciA9IC0xO1xyXG4gICAgdGhpcy5vZmZzZXQgPSAxO1xyXG4gICAgdGhpcy5saW1pdCA9IDEwO1xyXG4gICAgdGhpcy5nZXRGaW5kUmVwbGFjZUxpc3QoKTtcclxuICB9XHJcblxyXG4gIGNsZWFyU2VhcmNoKCkge1xyXG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XHJcbiAgICB0aGlzLm9uU2VhcmNoKCk7XHJcbiAgfVxyXG5cclxuICBvblNvcnRUYWJsZShjb2x1bW46IHN0cmluZykge1xyXG4gICAgLy8gTWFwIFVJIGNvbHVtbiBuYW1lcyB0byBBUEkgY29sdW1uIG5hbWVzXHJcbiAgICBjb25zdCBjb2x1bW5NYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICAgICduYW1lJzogJ25hbWUnLFxyXG4gICAgICAnY3JlYXRlZCc6ICdjcmVhdGVkQXQnLFxyXG4gICAgICAnc3RvcmVzJzogJ3N0b3JlQ291bnQnLFxyXG4gICAgICAndGFyZ2V0JzogJ3RhcmdldCcsXHJcbiAgICAgICdzdGF0dXMnOiAnc3RhdHVzJ1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhcGlDb2x1bW4gPSBjb2x1bW5NYXBbY29sdW1uXSB8fCBjb2x1bW47XHJcblxyXG4gICAgaWYgKHRoaXMuc29ydGVkQ29sdW1uID09PSBhcGlDb2x1bW4pIHtcclxuICAgICAgdGhpcy5zb3J0T3JkZXIgPSB0aGlzLnNvcnRPcmRlciA9PT0gMSA/IC0xIDogMTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc29ydGVkQ29sdW1uID0gYXBpQ29sdW1uO1xyXG4gICAgICB0aGlzLnNvcnRPcmRlciA9IC0xO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vZmZzZXQgPSAxO1xyXG4gICAgdGhpcy5saW1pdCA9IDEwO1xyXG4gICAgdGhpcy5nZXRGaW5kUmVwbGFjZUxpc3QoKTtcclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVycyhldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQgJiYgQXJyYXkuaXNBcnJheShldmVudCkpIHtcclxuICAgICAgZXZlbnQuZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZWxlLnRpdGxlID09PSAnU3RhdHVzJyB8fCBlbGUudGl0bGUgPT09ICdzdGF0dXMnKSB7XHJcbiAgICAgICAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzLnN0YXR1cyA9IGVsZS5zZWxlY3RlZCB8fCBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChldmVudCAmJiB0eXBlb2YgZXZlbnQgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIC8vIEhhbmRsZSByZXNldCBmaWx0ZXJzXHJcbiAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnMuc3RhdHVzID0gW107XHJcbiAgICB9XHJcbiAgICB0aGlzLm9mZnNldCA9IDE7XHJcbiAgICB0aGlzLmdldEZpbmRSZXBsYWNlTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgb25QYWdlQ2hhbmdlKHBhZ2VPZmZzZXQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5vZmZzZXQgPSBOdW1iZXIocGFnZU9mZnNldCk7XHJcbiAgICB0aGlzLmdldEZpbmRSZXBsYWNlTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgb25QYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm9mZnNldCA9IDE7XHJcbiAgICB0aGlzLmxpbWl0ID0gTnVtYmVyKHBhZ2VTaXplKTtcclxuICAgIHRoaXMuZ2V0RmluZFJlcGxhY2VMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBwYWdpbmF0aW9uU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudG90YWxJdGVtcyA8IDEwID8gdGhpcy50b3RhbEl0ZW1zIDogdGhpcy5saW1pdDtcclxuICB9XHJcblxyXG4gIGdldFN0YXR1c0JhZGdlQ2xhc3Moc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3RhdHVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgICAnZHJhZnQnOiAnZHJhZnQnLFxyXG4gICAgICAnYmF0Y2gtcnVubmluZyc6ICdiYXRjaC1ydW5uaW5nJyxcclxuICAgICAgJ3lldC10by1hcHByb3ZlJzogJ3lldC10by1hcHByb3ZlJyxcclxuICAgICAgJ2FwcHJvdmVkJzogJ2FwcHJvdmVkJyxcclxuICAgICAgJ3NjaGVkdWxlZCc6ICdhcHByb3ZlZCcsXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHN0YXR1c01hcFtzdGF0dXNdIHx8ICdiYWRnZS1zZWNvbmRhcnknO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdHVzRGlzcGxheShzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzdGF0dXNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICAgICdkcmFmdCc6ICdEcmFmdCcsXHJcbiAgICAgICdiYXRjaC1ydW5uaW5nJzogJ0JhdGNoIFJ1bm5pbmcnLFxyXG4gICAgICAneWV0LXRvLWFwcHJvdmUnOiAnWWV0IFRvIEFwcHJvdmUnLFxyXG4gICAgICAnYXBwcm92ZWQnOiAnQXBwcm92ZWQnLFxyXG4gICAgICAnc2NoZWR1bGVkJzogJ1NjaGVkdWxlZCcsXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHN0YXR1c01hcFtzdGF0dXNdIHx8IHN0YXR1cztcclxuICB9XHJcblxyXG4gIGdldFRhcmdldERpc3BsYXkodGFyZ2V0Pzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghdGFyZ2V0KSByZXR1cm4gJy0nO1xyXG4gICAgY29uc3QgdGFyZ2V0TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgICAnbWVyY2gnOiAnTWVyY2gnLFxyXG4gICAgICAndm0nOiAnVmlzdWFsIE1lcmNoJyxcclxuICAgICAgJ2JvdGgnOiAnQm90aCdcclxuICAgIH07XHJcbiAgICByZXR1cm4gdGFyZ2V0TWFwW3RhcmdldF0gfHwgdGFyZ2V0O1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0RGF0ZShkYXRlU3RyaW5nPzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghZGF0ZVN0cmluZykgcmV0dXJuICctJztcclxuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBmb3JtYXR0ZWQgKGZyb20gQVBJKSwgcmV0dXJuIGFzIGlzXHJcbiAgICBpZiAodHlwZW9mIGRhdGVTdHJpbmcgPT09ICdzdHJpbmcnICYmIGRhdGVTdHJpbmcuaW5jbHVkZXMoJyAnKSkge1xyXG4gICAgICByZXR1cm4gZGF0ZVN0cmluZztcclxuICAgIH1cclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRlU3RyaW5nKTtcclxuICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tR0InLCB7IGRheTogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnIH0pO1xyXG4gIH1cclxuXHJcbiAgb25GaW5kQW5kUmVwbGFjZUNsaWNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL3BsYW5vZ3JhbS9maW5kLXJlcGxhY2UvcHJlcGFyZSddKTtcclxuICB9XHJcblxyXG4gIG9uTmFtZUNsaWNrKGl0ZW06IEZpbmRSZXBsYWNlKTogdm9pZCB7XHJcbiAgICBpZiAoIWl0ZW0uX2lkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkcmFmdFN0YXR1c2VzID0gWydkcmFmdCddO1xyXG4gICAgY29uc3QgYmF0Y2hTdGF0dXNlcyA9IFsnYmF0Y2gtcnVubmluZyddO1xyXG4gICAgY29uc3QgcmV2aWV3U3RhdHVzZXMgPSBbJ3lldC10by1hcHByb3ZlJywgJ2FwcHJvdmVkJywgJ3NjaGVkdWxlZCddO1xyXG5cclxuICAgIGlmIChkcmFmdFN0YXR1c2VzLmluY2x1ZGVzKGl0ZW0uc3RhdHVzKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvcGxhbm9ncmFtL2ZpbmQtcmVwbGFjZS9wcmVwYXJlJ10sIHtcclxuICAgICAgICBxdWVyeVBhcmFtczogeyBpZDogaXRlbS5faWQgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAocmV2aWV3U3RhdHVzZXMuaW5jbHVkZXMoaXRlbS5zdGF0dXMpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS9wbGFub2dyYW0vZmluZC1yZXBsYWNlL3JldmlldyddLCB7XHJcbiAgICAgICAgcXVlcnlQYXJhbXM6IHsgaWQ6IGl0ZW0uX2lkIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKGJhdGNoU3RhdHVzZXMuaW5jbHVkZXMoaXRlbS5zdGF0dXMpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS9wbGFub2dyYW0vZmluZC1yZXBsYWNlJ10sIHtcclxuICAgICAgICBxdWVyeVBhcmFtczogeyBpZDogaXRlbS5faWQgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3VsZFNob3dEZWxldGUoaXRlbTogRmluZFJlcGxhY2UpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpdGVtLnN0YXR1cyA9PT0gJ2RyYWZ0JztcclxuICB9XHJcblxyXG4gIHNob3VsZFNob3dDYW5jZWwoaXRlbTogRmluZFJlcGxhY2UpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpdGVtLnN0YXR1cyA9PT0gJ2JhdGNoLXJ1bm5pbmcnIDtcclxuICB9XHJcblxyXG4gIHNob3VsZFNob3dFZGl0KGl0ZW06IEZpbmRSZXBsYWNlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gaXRlbS5zdGF0dXMgPT09ICd5ZXQtdG8tYXBwcm92ZSc7XHJcbiAgfVxyXG5cclxuICBzaG91bGRTaG93UmVzY2hlZHVsZShpdGVtOiBGaW5kUmVwbGFjZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICBpdGVtLnN0YXR1cyA9PT0gJ3NjaGVkdWxlZCc7XHJcbiAgfVxyXG5cclxuICBoYXNBbnlBY3Rpb24oaXRlbTogRmluZFJlcGxhY2UpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNob3VsZFNob3dEZWxldGUoaXRlbSkgfHwgdGhpcy5zaG91bGRTaG93Q2FuY2VsKGl0ZW0pIHx8IHRoaXMuc2hvdWxkU2hvd1Jlc2NoZWR1bGUoaXRlbSkgfHwgdGhpcy5zaG91bGRTaG93RWRpdChpdGVtKTtcclxuICB9XHJcblxyXG4gIG9uRWRpdChpdGVtOiBGaW5kUmVwbGFjZSk6IHZvaWQge1xyXG4gICAgaWYgKCFpdGVtLl9pZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvcGxhbm9ncmFtL2ZpbmQtcmVwbGFjZS9yZXZpZXcnXSwge1xyXG4gICAgICBxdWVyeVBhcmFtczogeyBpZDogaXRlbS5faWQgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb25maXJtRGVsZXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQsIHsgY2VudGVyZWQ6IHRydWUgfSk7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50aXRsZSA9ICdEZWxldGUgRmluZCBhbmQgUmVwbGFjZSc7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZmluZCBhbmQgcmVwbGFjZT8nO1xyXG5cclxuICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09ICdvaycpLmNhdGNoKCgpID0+IGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uRGVsZXRlKGl0ZW06IEZpbmRSZXBsYWNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWl0ZW0uX2lkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWF3YWl0IHRoaXMuY29uZmlybURlbGV0aW9uKCkpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZGVsZXRlRmluZFJlcGxhY2VBaSh7IGlkOiBpdGVtLl9pZCB9KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzPy5zdGF0dXMgPT09ICdzdWNjZXNzJyB8fCByZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzPy5tZXNzYWdlIHx8ICdGaW5kIGFuZCByZXBsYWNlIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgICAgICAgICB0aGlzLmdldEZpbmRSZXBsYWNlTGlzdCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QocmVzPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZGVsZXRlIGZpbmQgYW5kIHJlcGxhY2UnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yIHx8IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBkZWxldGUgZmluZCBhbmQgcmVwbGFjZScpO1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGRlbGV0aW5nIGZpbmQgcmVwbGFjZTonLCBlcnIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1DYW5jZWwoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihDYW5jZWxDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudCwgeyBjZW50ZXJlZDogdHJ1ZSB9KTtcclxuXHJcbiAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSB0cnVlKS5jYXRjaCgoKSA9PiBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNhbmNlbChpdGVtOiBGaW5kUmVwbGFjZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFpdGVtLl9pZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFhd2FpdCB0aGlzLmNvbmZpcm1DYW5jZWwoKSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5jYW5jZWxGaW5kUmVwbGFjZSh7IGZpbmRSZXBsYWNlSWQ6IGl0ZW0uX2lkIH0pLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnIHx8IHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChyZXM/Lm1lc3NhZ2UgfHwgJ0ZpbmQgYW5kIHJlcGxhY2UgY2FuY2VsbGVkIHN1Y2Nlc3NmdWxseScpO1xyXG4gICAgICAgICAgdGhpcy5nZXRGaW5kUmVwbGFjZUxpc3QoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KHJlcz8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGNhbmNlbCBmaW5kIGFuZCByZXBsYWNlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciB8fCBlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gY2FuY2VsIGZpbmQgYW5kIHJlcGxhY2UnKTtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjYW5jZWxsaW5nIGZpbmQgcmVwbGFjZTonLCBlcnIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uUmVzY2hlZHVsZShpdGVtOiBGaW5kUmVwbGFjZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFpdGVtLl9pZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oUmVzY2hlZHVsZU1vZGFsQ29tcG9uZW50LCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICBzaXplOiAnbWQnLFxyXG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXHJcbiAgICAgIHdpbmRvd0NsYXNzOiAncmVzY2hlZHVsZS1tb2RhbCdcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFBhc3MgdGhlIGluaXRpYWwgc2NoZWR1bGUgdmFsdWVzIHRvIHRoZSBtb2RhbFxyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuaW5pdGlhbFNjaGVkdWxlID0gaXRlbS5zY2hlZHVsZSB8fCBmYWxzZTtcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmluaXRpYWxTY2hlZHVsZURhdGUgPSBpdGVtLnNjaGVkdWxlRGF0ZSB8fCBudWxsO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGFsUmVmLnJlc3VsdDtcclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIC8vIFByZXBhcmUgZGF0YSBmb3Igc2F2ZUFzRHJhZnQgQVBJXHJcbiAgICAgICAgLy8gVGhlIEFQSSBleHBlY3RzIGlkIChub3QgX2lkKSBhbmQgYWxsIHJlcXVpcmVkIGZpZWxkc1xyXG4gICAgICAgIGNvbnN0IGRyYWZ0RGF0YTogYW55ID0ge1xyXG4gICAgICAgICAgaWQ6IGl0ZW0uX2lkLFxyXG4gICAgICAgICAgbmFtZTogaXRlbS5uYW1lIHx8ICcnLFxyXG4gICAgICAgICAgc2VhcmNoTW9kZTogaXRlbS5zZWFyY2hNb2RlIHx8ICdzdG9yZScsXHJcbiAgICAgICAgICBzdG9yZVNlYXJjaFN0cmluZzogaXRlbS5zdG9yZVNlYXJjaFN0cmluZyB8fCAnJyxcclxuICAgICAgICAgIHRhcmdldDogaXRlbS50YXJnZXQgfHwgJ21lcmNoJyxcclxuICAgICAgICAgIGZpbmRQcm9tcHQ6IGl0ZW0uZmluZFByb21wdCB8fCAnJyxcclxuICAgICAgICAgIHJlcGxhY2VQcm9tcHQ6IGl0ZW0ucmVwbGFjZVByb21wdCB8fCAnJyxcclxuICAgICAgICAgIHN0b3JlczogaXRlbS5zdG9yZXMgfHwgW10sXHJcbiAgICAgICAgICBzdG9yZUNvdW50OiBpdGVtLnN0b3JlQ291bnQgfHwgMCxcclxuICAgICAgICAgIHNlbGVjdGVkQ2x1c3RlcnM6IGl0ZW0uc2VsZWN0ZWRDbHVzdGVycyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICBzdGF0dXM6IGl0ZW0uc3RhdHVzIHx8ICdkcmFmdCcsXHJcbiAgICAgICAgICBzY2hlZHVsZTogcmVzdWx0LnNjaGVkdWxlLFxyXG4gICAgICAgICAgc2NoZWR1bGVEYXRlOiByZXN1bHQuc2NoZWR1bGVEYXRlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gQ2FsbCBzYXZlQXNEcmFmdCBBUEkgZmlyc3RcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2Uuc2F2ZUFzRHJhZnQoZHJhZnREYXRhKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnIHx8IHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgLy8gSWYgc2NoZWR1bGUgaXMgZmFsc2UsIGNhbGwgYXBwcm92ZVJlcGxhY2UgQVBJXHJcbiAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuc2NoZWR1bGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5hcHByb3ZlUmVwbGFjZSh7XHJcbiAgICAgICAgICAgICAgICAgIGZpbmRSZXBsYWNlSWQ6IGl0ZW0uX2lkXHJcbiAgICAgICAgICAgICAgICB9KS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgICBuZXh0OiAoYXBwcm92ZVJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcHJvdmVSZXM/LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnIHx8IGFwcHJvdmVSZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoYXBwcm92ZVJlcz8ubWVzc2FnZSB8fCAnRmluZCBhbmQgcmVwbGFjZSBhcHByb3ZlZCBzdWNjZXNzZnVsbHknKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RmluZFJlcGxhY2VMaXN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChhcHByb3ZlUmVzPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gYXBwcm92ZSBmaW5kIGFuZCByZXBsYWNlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBlcnJvcjogKGFwcHJvdmVFcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoYXBwcm92ZUVycj8uZXJyb3I/LmVycm9yIHx8IGFwcHJvdmVFcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gYXBwcm92ZSBmaW5kIGFuZCByZXBsYWNlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYXBwcm92aW5nIGZpbmQgcmVwbGFjZTonLCBhcHByb3ZlRXJyKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFNjaGVkdWxlIGlzIHRydWUsIGp1c3Qgc2hvdyBzdWNjZXNzIG1lc3NhZ2VcclxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHJlcz8ubWVzc2FnZSB8fCAnRmluZCBhbmQgcmVwbGFjZSByZXNjaGVkdWxlZCBzdWNjZXNzZnVsbHknKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RmluZFJlcGxhY2VMaXN0KCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChyZXM/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byByZXNjaGVkdWxlIGZpbmQgYW5kIHJlcGxhY2UnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciB8fCBlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gcmVzY2hlZHVsZSBmaW5kIGFuZCByZXBsYWNlJyk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlc2NoZWR1bGluZyBmaW5kIHJlcGxhY2U6JywgZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gVXNlciBkaXNtaXNzZWQgdGhlIG1vZGFsXHJcbiAgICAgIGNvbnNvbGUubG9nKCdSZXNjaGVkdWxlIG1vZGFsIGRpc21pc3NlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIHRoaXMuZmluZFJlcGxhY2VTdWI/LnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjb250ZW50LXdyYXBwZXJcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItNVwiPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGg0PkZpbmQgYW5kIFJlcGxhY2U8L2g0PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgdG90YWxJdGVtcyB9fSAtIFRvdGFsIFJlY29yZHM8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGVybVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvblNlYXJjaElucHV0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctbGVmdDogM3JlbTsgcGFkZGluZy1yaWdodDogM3JlbVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJzZWFyY2hcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWFyY2gtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmUgeDE9XCIxM1wiIHkxPVwiMTNcIiB4Mj1cIjE2XCIgeTI9XCIxNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VhcmNoVGVybVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbGVhclwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xlYXItc2VhcmNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI2NHB4XCIgaGVpZ2h0PVwiNjRweFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBpZD1cIlNWR1JlcG9fYmdDYXJyaWVyXCIgc3Ryb2tlLXdpZHRoPVwiMFwiPjwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGlkPVwiU1ZHUmVwb190cmFjZXJDYXJyaWVyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgaWQ9XCJTVkdSZXBvX2ljb25DYXJyaWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDlMMTUgMTVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1IDlMOSAxNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiOVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGxpYi1keW5hbWljLWZpbHRlciBbZmlsdGVyT2JqZWN0XT1cImZpbHRlck9iamVjdFwiIChhcHBseUZpbHRlcnMpPVwiYXBwbHlGaWx0ZXJzKCRldmVudClcIiAocmVzZXRGaWx0ZXJzKT1cImFwcGx5RmlsdGVycygkZXZlbnQpXCI+PC9saWItZHluYW1pYy1maWx0ZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNMTQuMTY2NyA2LjY2NjY3TDEwIDIuNU0xMCAyLjVMNS44MzMzMyA2LjY2NjY3TTEwIDIuNVYxMi41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMlwiPjwvc3Bhbj4gRXhwb3J0XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgZC1pbmxpbmUtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiAoY2xpY2spPVwib25GaW5kQW5kUmVwbGFjZUNsaWNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMC4wMDAxIDQuMTY2NjNWMTUuODMzM000LjE2Njc1IDkuOTk5OTZIMTUuODMzNFwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMiB0ZXh0LXdoaXRlXCI+RmluZCBBbmQgUmVwbGFjZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gTG9hZGluZyBTdGF0ZSAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNQYWdlTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gTm8gRGF0YSBTdGF0ZSAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzUGFnZUxvYWRpbmcgJiYgZmluZFJlcGxhY2VMaXN0Lmxlbmd0aCA9PT0gMCAmJiAhaXNFcnJvclwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YW1haW50ZXh0IG10LTNcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFzdWJ0ZXh0XCI+VGhlcmUgaXMgbm8gcmVzdWx0IGZvciBmaW5kIGFuZCByZXBsYWNlIHRhYmxlPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gRXJyb3IgU3RhdGUgLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImlzRXJyb3IgJiYgIWlzUGFnZUxvYWRpbmdcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YW1haW50ZXh0IG10LTNcIj5FcnJvciBsb2FkaW5nIGRhdGE8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YXN1YnRleHRcIj5QbGVhc2UgdHJ5IGFnYWluIGxhdGVyPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gVGFibGUgLS0+XHJcbiAgICAgICAgPHNlY3Rpb24gaWQ9XCJsaXN0LXZpZXdcIiAqbmdJZj1cIiFpc1BhZ2VMb2FkaW5nICYmIGZpbmRSZXBsYWNlTGlzdC5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ3LTEwMCB0YWJsZSBib3R0b20tYm9yZGVyIHRleHQtbm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvblNvcnRUYWJsZSgnbmFtZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBtcy0xIG10LTFcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnbmFtZScgPyAoc29ydE9yZGVyID09PSAxID8gJ2ZhLWFycm93LXVwJyA6ICdmYS1hcnJvdy1kb3duJykgOiAnZmEtYXJyb3ctZG93bidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uU29ydFRhYmxlKCdjcmVhdGVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIG1zLTEgbXQtMVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzb3J0ZWRDb2x1bW4gPT09ICdjcmVhdGVkJyA/IChzb3J0T3JkZXIgPT09IDEgPyAnZmEtYXJyb3ctdXAnIDogJ2ZhLWFycm93LWRvd24nKSA6ICdmYS1hcnJvdy1kb3duJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVkdWxlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uU29ydFRhYmxlKCdzdG9yZXMnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBtcy0xIG10LTFcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnc3RvcmVzJyA/IChzb3J0T3JkZXIgPT09IDEgPyAnZmEtYXJyb3ctdXAnIDogJ2ZhLWFycm93LWRvd24nKSA6ICdmYS1hcnJvdy1kb3duJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0VGFibGUoJ3RhcmdldCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIG1zLTEgbXQtMVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzb3J0ZWRDb2x1bW4gPT09ICd0YXJnZXQnID8gKHNvcnRPcmRlciA9PT0gMSA/ICdmYS1hcnJvdy11cCcgOiAnZmEtYXJyb3ctZG93bicpIDogJ2ZhLWFycm93LWRvd24nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBsYWNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0VGFibGUoJ3N0YXR1cycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIG1zLTEgbXQtMVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzb3J0ZWRDb2x1bW4gPT09ICdzdGF0dXMnID8gKHNvcnRPcmRlciA9PT0gMSA/ICdmYS1hcnJvdy11cCcgOiAnZmEtYXJyb3ctZG93bicpIDogJ2ZhLWFycm93LWRvd24nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbmRSZXBsYWNlTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdGV4dC1kZWNvcmF0aW9uLXVuZGVybGluZVwiIChjbGljayk9XCJvbk5hbWVDbGljayhpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5uYW1lIHx8ICctJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IGZvcm1hdERhdGUoaXRlbS5jcmVhdGVkQXQpIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtbXV0ZWRcIj57eyBpdGVtLnNjaGVkdWxlRGF0ZSA/IGZvcm1hdERhdGUoaXRlbS5zY2hlZHVsZURhdGUpIDogJy0nIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtbXV0ZWRcIj57eyBpdGVtLnN0b3JlQ291bnQgfHwgMCB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+e3sgZ2V0VGFyZ2V0RGlzcGxheShpdGVtLnRhcmdldCkgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5maW5kUHJvbXB0XCIgW3RpdGxlXT1cIml0ZW0uZmluZFByb21wdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmZpbmRQcm9tcHQubGVuZ3RoID4gNTAgPyAoaXRlbS5maW5kUHJvbXB0LnN1YnN0cmluZygwLCA1MCkgKyAnLi4uJykgOiBpdGVtLmZpbmRQcm9tcHQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXRlbS5maW5kUHJvbXB0XCI+LTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLnJlcGxhY2VQcm9tcHRcIiBbdGl0bGVdPVwiaXRlbS5yZXBsYWNlUHJvbXB0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ucmVwbGFjZVByb21wdC5sZW5ndGggPiA1MCA/IChpdGVtLnJlcGxhY2VQcm9tcHQuc3Vic3RyaW5nKDAsIDUwKSArICcuLi4nKSA6IGl0ZW0ucmVwbGFjZVByb21wdCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpdGVtLnJlcGxhY2VQcm9tcHRcIj4tPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFkZ2VcIiBbbmdDbGFzc109XCJnZXRTdGF0dXNCYWRnZUNsYXNzKGl0ZW0uc3RhdHVzKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRTdGF0dXNEaXNwbGF5KGl0ZW0uc3RhdHVzKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd25cIiAqbmdJZj1cImhhc0FueUFjdGlvbihpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rIHAtMFwiIHR5cGU9XCJidXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidmVydGljYWxEb3RzXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJzaG91bGRTaG93RGVsZXRlKGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGN1cnNvci1wb2ludGVyIHRleHQtZGFuZ2VyXCIgKGNsaWNrKT1cIm9uRGVsZXRlKGl0ZW0pXCI+RGVsZXRlPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cInNob3VsZFNob3dFZGl0KGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uRWRpdChpdGVtKVwiPkVkaXQ8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwic2hvdWxkU2hvd0NhbmNlbChpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvbkNhbmNlbChpdGVtKVwiPkNhbmNlbDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJzaG91bGRTaG93UmVzY2hlZHVsZShpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvblJlc2NoZWR1bGUoaXRlbSlcIj5SZXNjaGVkdWxlPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgICAgPCEtLSBQYWdpbmF0aW9uIC0tPlxyXG4gICAgICAgIDxsaWItcGFnaW5hdGlvblxyXG4gICAgICAgICAgICAqbmdJZj1cIiFpc1BhZ2VMb2FkaW5nICYmIGZpbmRSZXBsYWNlTGlzdC5sZW5ndGggIT09IDBcIlxyXG4gICAgICAgICAgICBbaXRlbXNQZXJQYWdlXT1cImxpbWl0XCJcclxuICAgICAgICAgICAgW2N1cnJlbnRQYWdlXT1cIm9mZnNldFwiXHJcbiAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsSXRlbXNcIlxyXG4gICAgICAgICAgICBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2luYXRpb25TaXplc1wiXHJcbiAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdpbmF0aW9uU2l6ZSgpXCJcclxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgPC9saWItcGFnaW5hdGlvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdmVydGljYWxEb3RzPlxyXG4gICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDQgMThcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgIGQ9XCJNMSA5QzEgOS41NTIyOCAxLjQ0NzcxIDEwIDIgMTBDMi41NTIyOCAxMCAzIDkuNTUyMjggMyA5QzMgOC40NDc3MiAyLjU1MjI4IDggMiA4QzEuNDQ3NzEgOCAxIDguNDQ3NzIgMSA5WlwiXHJcbiAgICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIlxyXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgIGQ9XCJNMC45OTk5OTkgMTZDMC45OTk5OTkgMTYuNTUyMyAxLjQ0NzcxIDE3IDIgMTdDMi41NTIyOCAxNyAzIDE2LjU1MjMgMyAxNkMzIDE1LjQ0NzcgMi41NTIyOCAxNSAyIDE1QzEuNDQ3NzEgMTUgMC45OTk5OTkgMTUuNDQ3NyAwLjk5OTk5OSAxNlpcIlxyXG4gICAgICAgICAgICBzdHJva2U9XCIjMTAxODI4XCJcclxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICBkPVwiTTEgMkMxIDIuNTUyMjggMS40NDc3MiAzIDIgM0MyLjU1MjI4IDMgMyAyLjU1MjI4IDMgMkMzIDEuNDQ3NzIgMi41NTIyOCAxIDIgMUMxLjQ0NzcyIDEgMSAxLjQ0NzcyIDEgMlpcIlxyXG4gICAgICAgICAgICBzdHJva2U9XCIjMTAxODI4XCJcclxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgLz5cclxuICAgIDwvc3ZnPlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|