tango-app-ui-store-builder 1.0.1-beta-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2022/lib/components/create-layout/create-layout.component.mjs +1815 -0
- package/esm2022/lib/components/create-layout/popups/add-floor/add-floor.component.mjs +40 -0
- package/esm2022/lib/components/create-layout/popups/clear-all-steps/clear-all-steps.component.mjs +16 -0
- package/esm2022/lib/components/create-layout/popups/delete-layout/delete-layout.component.mjs +16 -0
- package/esm2022/lib/components/custom-select/custom-select.component.mjs +155 -0
- package/esm2022/lib/components/layout-builder/layout-builder.component.mjs +56 -0
- package/esm2022/lib/components/layout-summary/layout-summary.component.mjs +809 -0
- package/esm2022/lib/components/layout-summary/popups/complete-layout/complete-layout.component.mjs +16 -0
- package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +87 -0
- package/esm2022/lib/components/store-layout-table/store-layout-table.component.mjs +709 -0
- package/esm2022/lib/components/store-offcanvas-component/store-offcanvas-component.component.mjs +99 -0
- package/esm2022/lib/interfaces/layout-builder.interface.mjs +2 -0
- package/esm2022/lib/services/store-builder.service.mjs +99 -0
- package/esm2022/lib/tango-store-builder-routing.module.mjs +41 -0
- package/esm2022/lib/tango-store-builder.module.mjs +71 -0
- package/esm2022/public-api.mjs +5 -0
- package/esm2022/tango-app-ui-store-builder.mjs +5 -0
- package/esm2022/tango-store-builder.mjs +5 -0
- package/fesm2022/tango-app-ui-store-builder.mjs +3947 -0
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -0
- package/fesm2022/tango-store-builder.mjs +3947 -0
- package/fesm2022/tango-store-builder.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/create-layout/create-layout.component.d.ts +197 -0
- package/lib/components/create-layout/popups/add-floor/add-floor.component.d.ts +16 -0
- package/lib/components/create-layout/popups/clear-all-steps/clear-all-steps.component.d.ts +8 -0
- package/lib/components/create-layout/popups/delete-layout/delete-layout.component.d.ts +8 -0
- package/lib/components/custom-select/custom-select.component.d.ts +33 -0
- package/lib/components/layout-builder/layout-builder.component.d.ts +18 -0
- package/lib/components/layout-summary/layout-summary.component.d.ts +92 -0
- package/lib/components/layout-summary/popups/complete-layout/complete-layout.component.d.ts +8 -0
- package/lib/components/reactive-select/reactive-select.component.d.ts +26 -0
- package/lib/components/store-layout-table/store-layout-table.component.d.ts +73 -0
- package/lib/components/store-offcanvas-component/store-offcanvas-component.component.d.ts +26 -0
- package/lib/interfaces/layout-builder.interface.d.ts +23 -0
- package/lib/services/store-builder.service.d.ts +33 -0
- package/lib/tango-store-builder-routing.module.d.ts +7 -0
- package/lib/tango-store-builder.module.d.ts +22 -0
- package/package.json +25 -0
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,709 @@
|
|
|
1
|
+
import { Component, ViewChild, HostListener } from '@angular/core';
|
|
2
|
+
import { Subject, takeUntil, debounceTime } from 'rxjs';
|
|
3
|
+
import * as XLSX from 'xlsx';
|
|
4
|
+
import JSZip from 'jszip';
|
|
5
|
+
import { DeleteLayoutComponent } from '../create-layout/popups/delete-layout/delete-layout.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@ng-bootstrap/ng-bootstrap";
|
|
8
|
+
import * as i2 from "tango-app-ui-global";
|
|
9
|
+
import * as i3 from "tango-app-ui-shared";
|
|
10
|
+
import * as i4 from "../../services/store-builder.service";
|
|
11
|
+
import * as i5 from "@angular/router";
|
|
12
|
+
import * as i6 from "@angular/common";
|
|
13
|
+
import * as i7 from "@angular/forms";
|
|
14
|
+
export class StoreLayoutTableComponent {
|
|
15
|
+
modalDef;
|
|
16
|
+
pageInfo;
|
|
17
|
+
toast;
|
|
18
|
+
gs;
|
|
19
|
+
builderService;
|
|
20
|
+
Router;
|
|
21
|
+
fileInput;
|
|
22
|
+
loading = true;
|
|
23
|
+
selectedTab = 'layoutBuilder';
|
|
24
|
+
floorNo = 1;
|
|
25
|
+
searchStore;
|
|
26
|
+
storeList = [];
|
|
27
|
+
store = [];
|
|
28
|
+
paginationSizes = [];
|
|
29
|
+
selectedStore = {};
|
|
30
|
+
showDropDown = false;
|
|
31
|
+
totalItems;
|
|
32
|
+
dynamicData = {
|
|
33
|
+
clientId: '',
|
|
34
|
+
limit: 10,
|
|
35
|
+
offset: 1,
|
|
36
|
+
searchValue: '',
|
|
37
|
+
sortColumnName: '',
|
|
38
|
+
sortBy: '',
|
|
39
|
+
filter: []
|
|
40
|
+
};
|
|
41
|
+
layoutList = [];
|
|
42
|
+
pageSize = 10;
|
|
43
|
+
dataObject = [
|
|
44
|
+
{
|
|
45
|
+
Description: 'status',
|
|
46
|
+
Issues: [
|
|
47
|
+
{ text: 'Draft', id: 'draft' },
|
|
48
|
+
{ text: 'Completed', id: 'completed' },
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
error = [];
|
|
53
|
+
excelData;
|
|
54
|
+
showNoData = true;
|
|
55
|
+
destroy$ = new Subject();
|
|
56
|
+
scale = 1;
|
|
57
|
+
gridWidth = 5;
|
|
58
|
+
gridHeight = 5;
|
|
59
|
+
pixelSize = 50;
|
|
60
|
+
createBuilder;
|
|
61
|
+
uploadBuilder;
|
|
62
|
+
constructor(modalDef, pageInfo, toast, gs, builderService, Router) {
|
|
63
|
+
this.modalDef = modalDef;
|
|
64
|
+
this.pageInfo = pageInfo;
|
|
65
|
+
this.toast = toast;
|
|
66
|
+
this.gs = gs;
|
|
67
|
+
this.builderService = builderService;
|
|
68
|
+
this.Router = Router;
|
|
69
|
+
}
|
|
70
|
+
ngOnInit() {
|
|
71
|
+
this.setPageData();
|
|
72
|
+
let getDetails = JSON.parse(localStorage.getItem('header-filters'));
|
|
73
|
+
console.log(getDetails);
|
|
74
|
+
if (getDetails) {
|
|
75
|
+
this.dynamicData.clientId = getDetails?.client || getDetails?.clients?.[0] || getDetails?.clients?.[1];
|
|
76
|
+
this.getLayoutList();
|
|
77
|
+
this.getStoreList();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
ngOnDestroy() {
|
|
81
|
+
this.destroy$.next(true);
|
|
82
|
+
this.destroy$.complete();
|
|
83
|
+
}
|
|
84
|
+
setPageData() {
|
|
85
|
+
this.pageInfo.setTitle("Planogram");
|
|
86
|
+
this.pageInfo.setDescription("");
|
|
87
|
+
this.pageInfo.setBreadcrumbs([]);
|
|
88
|
+
}
|
|
89
|
+
getLayoutList() {
|
|
90
|
+
this.loading = true;
|
|
91
|
+
this.layoutList = [];
|
|
92
|
+
this.builderService.layoutList(this.dynamicData).pipe(takeUntil(this.destroy$), debounceTime(300)).subscribe({
|
|
93
|
+
next: (res) => {
|
|
94
|
+
this.loading = false;
|
|
95
|
+
if (res && res?.data?.data.length) {
|
|
96
|
+
this.showNoData = false;
|
|
97
|
+
this.layoutList = res.data.data;
|
|
98
|
+
this.totalItems = res.data.count;
|
|
99
|
+
if (this.totalItems < 9) {
|
|
100
|
+
this.paginationSizes = [this.totalItems];
|
|
101
|
+
this.pageSize = this.totalItems;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this.paginationSizes = [10, 20, 30];
|
|
105
|
+
this.pageSize = this.dynamicData.limit;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
if (this.dynamicData.searchValue.length || this.dynamicData.filter.length) {
|
|
110
|
+
this.showNoData = false;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
this.showNoData = true;
|
|
114
|
+
}
|
|
115
|
+
this.layoutList = [];
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
error: (err) => {
|
|
119
|
+
this.showNoData = true;
|
|
120
|
+
this.loading = false;
|
|
121
|
+
this.layoutList = [];
|
|
122
|
+
this.toast.getErrorToast(err?.error?.error || 'Something went wrong');
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
getStoreList() {
|
|
127
|
+
let data = {
|
|
128
|
+
"clientId": [this.dynamicData.clientId],
|
|
129
|
+
"offset": 1,
|
|
130
|
+
"limit": 10000,
|
|
131
|
+
"sortColumName": "storeId",
|
|
132
|
+
"sortBy": -1,
|
|
133
|
+
"searchValue": "",
|
|
134
|
+
"export": false,
|
|
135
|
+
"status": [
|
|
136
|
+
"Live",
|
|
137
|
+
"onboarded",
|
|
138
|
+
"deployed",
|
|
139
|
+
"paired",
|
|
140
|
+
"installationfailed",
|
|
141
|
+
"Infra Issue"
|
|
142
|
+
]
|
|
143
|
+
};
|
|
144
|
+
this.builderService.getStoreList(data).subscribe((res) => {
|
|
145
|
+
if (res && res.code == 200 && res.data.result.length) {
|
|
146
|
+
let stores = [];
|
|
147
|
+
res.data.result.forEach((item) => {
|
|
148
|
+
stores.push({
|
|
149
|
+
name: item.storeName,
|
|
150
|
+
id: item.storeId
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
this.storeList = this.store = stores;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
this.storeList = [];
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
applyFilters(event) {
|
|
161
|
+
this.dynamicData.limit = 10;
|
|
162
|
+
this.dynamicData.filter = event?.[0]?.Issues.map((ele) => ele.id);
|
|
163
|
+
this.getLayoutList();
|
|
164
|
+
}
|
|
165
|
+
BuilderCreate() {
|
|
166
|
+
this.showDropDown = false;
|
|
167
|
+
this.selectedStore = {};
|
|
168
|
+
this.floorNo = 1;
|
|
169
|
+
this.modalDef.open(this.createBuilder, { centered: true });
|
|
170
|
+
}
|
|
171
|
+
floorDec() {
|
|
172
|
+
if (this.floorNo >= 2) {
|
|
173
|
+
this.floorNo--;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
floorInc() {
|
|
177
|
+
this.floorNo++;
|
|
178
|
+
}
|
|
179
|
+
filterSearch() {
|
|
180
|
+
if (this.searchStore.trim().length) {
|
|
181
|
+
let store = this.searchStore.split(',');
|
|
182
|
+
if (store.length > 1) {
|
|
183
|
+
store = store.map((item) => item.trim().toLowerCase());
|
|
184
|
+
this.storeList = this.store.filter((item) => store.includes(item.name.toLowerCase()));
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
this.storeList = this.store.filter((item) => item.name.toLowerCase().includes(this.searchStore.trim().toLowerCase()));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
this.storeList = [...this.store];
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
updateSelectedStore(index) {
|
|
195
|
+
this.selectedStore = this.storeList[index];
|
|
196
|
+
this.closeDropDown();
|
|
197
|
+
}
|
|
198
|
+
closeDropDown() {
|
|
199
|
+
this.showDropDown = false;
|
|
200
|
+
}
|
|
201
|
+
toggleDropDown() {
|
|
202
|
+
this.showDropDown = true;
|
|
203
|
+
}
|
|
204
|
+
createLayout() {
|
|
205
|
+
let params = {
|
|
206
|
+
storeName: this.selectedStore.name,
|
|
207
|
+
storeId: this.selectedStore.id,
|
|
208
|
+
clientId: this.dynamicData.clientId,
|
|
209
|
+
floorNumber: this.floorNo,
|
|
210
|
+
};
|
|
211
|
+
this.builderService.createLayout(params).pipe(takeUntil(this.destroy$), debounceTime(300)).subscribe({
|
|
212
|
+
next: (res) => {
|
|
213
|
+
if (res.code == 200) {
|
|
214
|
+
this.toast.getSuccessToast(res?.message || 'Layout created successfully');
|
|
215
|
+
this.selectedStore = {};
|
|
216
|
+
this.floorNo = 1;
|
|
217
|
+
this.modalDef.dismissAll();
|
|
218
|
+
this.Router.navigateByUrl(`/manage/planogram/layout-builder/create?id=${res.data.id}`);
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
error: (err) => {
|
|
222
|
+
console.log(err);
|
|
223
|
+
this.toast.getErrorToast(err?.error?.error || 'Something went wrong');
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
onPageChange(event) {
|
|
228
|
+
this.dynamicData.offset = event;
|
|
229
|
+
this.getLayoutList();
|
|
230
|
+
}
|
|
231
|
+
onPageSizeChange(event) {
|
|
232
|
+
this.dynamicData.offset = 1;
|
|
233
|
+
this.dynamicData.limit = event;
|
|
234
|
+
this.getLayoutList();
|
|
235
|
+
}
|
|
236
|
+
search() {
|
|
237
|
+
this.dynamicData.limit = 10;
|
|
238
|
+
this.dynamicData.offset = 1;
|
|
239
|
+
this.dynamicData.sortColumnName = '';
|
|
240
|
+
this.dynamicData.sortBy = '';
|
|
241
|
+
this.getLayoutList();
|
|
242
|
+
}
|
|
243
|
+
onSort(data) {
|
|
244
|
+
this.dynamicData.offset = 1;
|
|
245
|
+
if (this.dynamicData.sortColumnName == data) {
|
|
246
|
+
this.dynamicData.sortBy = this.dynamicData.sortBy == 1 ? -1 : 1;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
this.dynamicData.sortBy = 1;
|
|
250
|
+
this.dynamicData.sortColumnName = data;
|
|
251
|
+
}
|
|
252
|
+
this.getLayoutList();
|
|
253
|
+
}
|
|
254
|
+
getHeadersFromSheet(sheet) {
|
|
255
|
+
const headers = [];
|
|
256
|
+
const range = XLSX.utils.decode_range(sheet['!ref']);
|
|
257
|
+
// Loop through the columns in the first row
|
|
258
|
+
for (let col = range.s.c; col <= range.e.c; col++) {
|
|
259
|
+
const cell = sheet[XLSX.utils.encode_cell({ r: range.s.r, c: col })];
|
|
260
|
+
if (cell) {
|
|
261
|
+
headers.push(cell.v);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return headers;
|
|
265
|
+
}
|
|
266
|
+
onFileUpload(event) {
|
|
267
|
+
let data;
|
|
268
|
+
const target = (event.target);
|
|
269
|
+
let isExcelFile = !!target.files[0].name.match(/(.xls|.xlsx)/);
|
|
270
|
+
this.error = [];
|
|
271
|
+
if (isExcelFile) {
|
|
272
|
+
const reader = new FileReader();
|
|
273
|
+
reader.readAsBinaryString(target.files[0]);
|
|
274
|
+
reader.onload = (e) => {
|
|
275
|
+
const bstr = e.target.result;
|
|
276
|
+
const wb = XLSX.read(bstr, { type: 'binary' });
|
|
277
|
+
const wsname = wb.SheetNames[0];
|
|
278
|
+
const ws = wb.Sheets[wsname];
|
|
279
|
+
data = XLSX.utils.sheet_to_json(ws);
|
|
280
|
+
const worksheet = wb.Sheets[wb.SheetNames[0]];
|
|
281
|
+
// Get the header row (first row)
|
|
282
|
+
const headers = this.getHeadersFromSheet(worksheet);
|
|
283
|
+
if (!data.length) {
|
|
284
|
+
this.fileInput.nativeElement.value = '';
|
|
285
|
+
return this.toast.getErrorToast('Please enter values');
|
|
286
|
+
}
|
|
287
|
+
let storeList = [];
|
|
288
|
+
let emptyList = [];
|
|
289
|
+
data.forEach((item, index) => {
|
|
290
|
+
let getValue = headers.filter(key => item[key] === null || item[key] === '' || item[key] == undefined);
|
|
291
|
+
if (getValue.length) {
|
|
292
|
+
getValue.forEach((item) => {
|
|
293
|
+
let letter = item == 'Store Name' ? 'A' : item == 'No.of.Floors' ? 'B' : item == 'Step' ? 'C' : item == 'Elements' ? 'D' : item == 'Measurements(ft)' ? 'E' : item == 'direction' ? 'F' : 'G';
|
|
294
|
+
emptyList.push(letter + parseInt(index + 2));
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
let checkDuplicate = storeList.findIndex((ele) => ele.storeName.trim() == item['Store Name'].trim() && ele.floorNumber == item['No.of.Floors'] && ele.step == item['Step']);
|
|
299
|
+
if (checkDuplicate == -1) {
|
|
300
|
+
storeList.push({
|
|
301
|
+
storeName: item['Store Name'].trim(),
|
|
302
|
+
floorNumber: item['No.of.Floors'],
|
|
303
|
+
step: item['Step'],
|
|
304
|
+
elements: item['Elements'] == 'Glass/Facade' ? 'facade' : item['Elements'].toLowerCase(),
|
|
305
|
+
distance: item['Measurements(ft)'],
|
|
306
|
+
direction: item['Direction'].toLowerCase(),
|
|
307
|
+
degree: item['Degree']
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
this.error.push({ index: index + 2, message: 'Duplicate Step', ExistIndex: checkDuplicate + 2, series: 'C' });
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
if (emptyList.length) {
|
|
316
|
+
console.log(emptyList);
|
|
317
|
+
this.error.push({ index: emptyList.toString(), message: 'Missing Field' });
|
|
318
|
+
}
|
|
319
|
+
let uniqueStore = [...new Set(storeList.map((ele) => ele.storeName))];
|
|
320
|
+
this.excelData = {
|
|
321
|
+
totalStore: uniqueStore.length,
|
|
322
|
+
totalRow: data.length,
|
|
323
|
+
totalError: this.error.length
|
|
324
|
+
};
|
|
325
|
+
console.log(this.error);
|
|
326
|
+
if (this.error.length) {
|
|
327
|
+
this.modalDef.dismissAll();
|
|
328
|
+
this.fileInput.nativeElement.value = '';
|
|
329
|
+
this.modalDef.open(this.uploadBuilder, { centered: true });
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
this.builderService.BulkUpload({ data: storeList, clientId: this.dynamicData.clientId }).pipe(takeUntil(this.destroy$), debounceTime(300)).subscribe({
|
|
333
|
+
next: (res) => {
|
|
334
|
+
this.modalDef.dismissAll();
|
|
335
|
+
if (res && res.code == 200) {
|
|
336
|
+
this.fileInput.nativeElement.value = '';
|
|
337
|
+
this.toast.getSuccessToast(res?.message || 'Bulk store upload successfully');
|
|
338
|
+
this.Router.navigateByUrl(`/manage/planogram/layout-builder/create?id=${res.data.id}`);
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
error: (err) => {
|
|
342
|
+
this.modalDef.dismissAll();
|
|
343
|
+
if (err?.error?.error) {
|
|
344
|
+
let error = err?.error?.error;
|
|
345
|
+
error.forEach((err) => {
|
|
346
|
+
let errorKey = [];
|
|
347
|
+
data.forEach((ele, index) => {
|
|
348
|
+
let findExists = err.value.find((elem) => elem == ele['Store Name']);
|
|
349
|
+
if (findExists) {
|
|
350
|
+
errorKey.push(`A${index + 2}`);
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
this.error.push({ index: errorKey.toString(), message: err.message });
|
|
354
|
+
});
|
|
355
|
+
this.excelData.totalError = this.error.length;
|
|
356
|
+
this.fileInput.nativeElement.value = '';
|
|
357
|
+
this.modalDef.open(this.uploadBuilder, { centered: true });
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
this.toast.getErrorToast('Please upload xlsx file');
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
Reupload() {
|
|
369
|
+
this.fileInput.nativeElement.value = '';
|
|
370
|
+
let ele = document.getElementById('xlsxUpload');
|
|
371
|
+
ele?.click();
|
|
372
|
+
}
|
|
373
|
+
showDeleteDropDown(i) {
|
|
374
|
+
this.layoutList.forEach((item, index) => {
|
|
375
|
+
if (i == index) {
|
|
376
|
+
item.deleteIndex = item?.deleteIndex ? false : true;
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
item.deleteIndex = false;
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
deleteLayout(id) {
|
|
384
|
+
let modelRef = this.modalDef.open(DeleteLayoutComponent, { centered: true });
|
|
385
|
+
modelRef.result.then((res) => {
|
|
386
|
+
if (res.message == 'confirm') {
|
|
387
|
+
this.builderService.deleteLayout(id).pipe(takeUntil(this.destroy$), debounceTime(300)).subscribe({
|
|
388
|
+
next: (res) => {
|
|
389
|
+
if (res && res.code == 200) {
|
|
390
|
+
this.toast.getSuccessToast(res?.message || 'Layout deleted successfully');
|
|
391
|
+
this.getLayoutList();
|
|
392
|
+
}
|
|
393
|
+
},
|
|
394
|
+
error: (error) => {
|
|
395
|
+
this.toast.getErrorToast(error?.error?.error || 'Something went wrong');
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
normalizedPixelPerMetre(polygon) {
|
|
402
|
+
const MIN_PIXELS_PER_METER = 50;
|
|
403
|
+
const MAX_PIXELS_PER_METER = 150;
|
|
404
|
+
let totalLength = 0;
|
|
405
|
+
let lineCount = 0;
|
|
406
|
+
polygon.forEach((line) => {
|
|
407
|
+
if (line.unit === 'ft') {
|
|
408
|
+
totalLength = totalLength + (line.distance * 3.28084);
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
totalLength = totalLength + line.distance;
|
|
412
|
+
}
|
|
413
|
+
lineCount++;
|
|
414
|
+
});
|
|
415
|
+
const averageLength = lineCount > 0 ? totalLength / lineCount : 0;
|
|
416
|
+
const MAX_AVERAGE_LENGTH = 50;
|
|
417
|
+
const MIN_AVERAGE_LENGTH = 5;
|
|
418
|
+
const normalizedLength = Math.min(Math.max(averageLength, MIN_AVERAGE_LENGTH), MAX_AVERAGE_LENGTH);
|
|
419
|
+
const pixelsPerMeter = MAX_PIXELS_PER_METER -
|
|
420
|
+
((normalizedLength - MIN_AVERAGE_LENGTH) / (MAX_AVERAGE_LENGTH - MIN_AVERAGE_LENGTH)) *
|
|
421
|
+
(MAX_PIXELS_PER_METER - MIN_PIXELS_PER_METER);
|
|
422
|
+
return Math.round(pixelsPerMeter);
|
|
423
|
+
}
|
|
424
|
+
convertToPixels(value, unit) {
|
|
425
|
+
const PIXELS_PER_METER = this.pixelSize;
|
|
426
|
+
const PIXELS_PER_FOOT = PIXELS_PER_METER / 3.28084;
|
|
427
|
+
if (typeof value !== 'number' || value < 0) {
|
|
428
|
+
throw new Error('Value must be a non-negative number');
|
|
429
|
+
}
|
|
430
|
+
switch (unit) {
|
|
431
|
+
case 'm':
|
|
432
|
+
return value * PIXELS_PER_METER;
|
|
433
|
+
case 'ft':
|
|
434
|
+
return value * PIXELS_PER_FOOT;
|
|
435
|
+
default:
|
|
436
|
+
throw new Error("Invalid unit. Supported units are 'mt' for meters and 'ft' for feet.");
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
snapToGrid(value, gridSize) {
|
|
440
|
+
return Math.round(value / gridSize) * gridSize;
|
|
441
|
+
}
|
|
442
|
+
download(data) {
|
|
443
|
+
this.builderService.getPlano({ id: [data._id] }).pipe(takeUntil(this.destroy$), debounceTime(300)).subscribe({
|
|
444
|
+
next: (res) => {
|
|
445
|
+
if (res && res.code == 200) {
|
|
446
|
+
this.onExportAsZip(data.storeName, res.data[0]);
|
|
447
|
+
}
|
|
448
|
+
},
|
|
449
|
+
error: (error) => {
|
|
450
|
+
this.toast.getErrorToast(error?.error?.error || 'Something went wrong');
|
|
451
|
+
}
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
async onExportAsZip(store, data) {
|
|
455
|
+
const zip = new JSZip();
|
|
456
|
+
const padding = 100;
|
|
457
|
+
const canvas = document.createElement('canvas');
|
|
458
|
+
const ctx = canvas.getContext('2d');
|
|
459
|
+
canvas.width = 10000;
|
|
460
|
+
canvas.height = 10000;
|
|
461
|
+
const centerX = canvas.width / 2 / this.scale;
|
|
462
|
+
const centerY = canvas.height / 2 / this.scale;
|
|
463
|
+
let currentPoint = {
|
|
464
|
+
x: this.snapToGrid(centerX, this.gridHeight),
|
|
465
|
+
y: this.snapToGrid(centerY, this.gridWidth),
|
|
466
|
+
};
|
|
467
|
+
const renderCanvas = async (layoutPolygon) => {
|
|
468
|
+
const exportLayout = [];
|
|
469
|
+
layoutPolygon.forEach((instruction) => {
|
|
470
|
+
const radians = {
|
|
471
|
+
up: ((180 - instruction.angle) * Math.PI) / 180,
|
|
472
|
+
left: ((270 - instruction.angle) * Math.PI) / 180,
|
|
473
|
+
down: ((360 - instruction.angle) * Math.PI) / 180,
|
|
474
|
+
right: ((90 - instruction.angle) * Math.PI) / 180,
|
|
475
|
+
}[instruction.direction];
|
|
476
|
+
if (radians === undefined) {
|
|
477
|
+
throw new Error(`Invalid direction: ${instruction.direction}`);
|
|
478
|
+
}
|
|
479
|
+
this.pixelSize = this.normalizedPixelPerMetre(layoutPolygon);
|
|
480
|
+
const distanceInPixels = this.convertToPixels(instruction.distance, instruction.unit);
|
|
481
|
+
const newX = currentPoint.x + Math.cos(radians) * distanceInPixels;
|
|
482
|
+
const newY = currentPoint.y - Math.sin(radians) * distanceInPixels;
|
|
483
|
+
const newPoint = {
|
|
484
|
+
x: this.snapToGrid(newX, this.gridWidth),
|
|
485
|
+
y: this.snapToGrid(newY, this.gridHeight),
|
|
486
|
+
};
|
|
487
|
+
const lineSegment = [
|
|
488
|
+
currentPoint,
|
|
489
|
+
newPoint,
|
|
490
|
+
{
|
|
491
|
+
elementType: instruction.elementType,
|
|
492
|
+
distance: instruction.distance,
|
|
493
|
+
unit: instruction.unit,
|
|
494
|
+
direction: instruction.direction,
|
|
495
|
+
angle: instruction.angle,
|
|
496
|
+
elementNumber: instruction.elementNumber,
|
|
497
|
+
},
|
|
498
|
+
];
|
|
499
|
+
exportLayout.push(lineSegment);
|
|
500
|
+
currentPoint = newPoint;
|
|
501
|
+
});
|
|
502
|
+
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
503
|
+
exportLayout.forEach(([point1, point2]) => {
|
|
504
|
+
[point1, point2].forEach((point) => {
|
|
505
|
+
if (point.x !== undefined) {
|
|
506
|
+
minX = Math.min(minX, point.x);
|
|
507
|
+
maxX = Math.max(maxX, point.x);
|
|
508
|
+
}
|
|
509
|
+
if (point.y !== undefined) {
|
|
510
|
+
minY = Math.min(minY, point.y);
|
|
511
|
+
maxY = Math.max(maxY, point.y);
|
|
512
|
+
}
|
|
513
|
+
});
|
|
514
|
+
});
|
|
515
|
+
minX -= padding;
|
|
516
|
+
minY -= padding;
|
|
517
|
+
maxX += padding;
|
|
518
|
+
maxY += padding;
|
|
519
|
+
canvas.width = maxX - minX;
|
|
520
|
+
canvas.height = maxY - minY;
|
|
521
|
+
ctx.fillStyle = 'white';
|
|
522
|
+
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
523
|
+
ctx.save();
|
|
524
|
+
ctx.translate(-minX, -minY);
|
|
525
|
+
ctx.scale(this.scale, this.scale);
|
|
526
|
+
function drawArrowhead(ctx, x, y, angle) {
|
|
527
|
+
const size = 5;
|
|
528
|
+
ctx.save();
|
|
529
|
+
ctx.translate(x, y);
|
|
530
|
+
ctx.rotate(angle);
|
|
531
|
+
ctx.beginPath();
|
|
532
|
+
ctx.moveTo(0, 0);
|
|
533
|
+
ctx.lineTo(-size, -size / 2);
|
|
534
|
+
ctx.lineTo(-size, size / 2);
|
|
535
|
+
ctx.closePath();
|
|
536
|
+
ctx.fillStyle = 'black';
|
|
537
|
+
ctx.fill();
|
|
538
|
+
ctx.restore();
|
|
539
|
+
}
|
|
540
|
+
ctx.beginPath();
|
|
541
|
+
exportLayout.forEach((edge, edgeIndex) => {
|
|
542
|
+
const point = edge[0];
|
|
543
|
+
const nextPoint = edge[1];
|
|
544
|
+
const properties = edge[2];
|
|
545
|
+
if (edgeIndex === 0)
|
|
546
|
+
ctx.moveTo(point.x, point.y);
|
|
547
|
+
ctx.lineTo(nextPoint.x, nextPoint.y);
|
|
548
|
+
const dx = nextPoint.x - point.x;
|
|
549
|
+
const dy = nextPoint.y - point.y;
|
|
550
|
+
const length = Math.sqrt(dx * dx + dy * dy);
|
|
551
|
+
const offsetX = (dy / length) * 20;
|
|
552
|
+
const offsetY = (-dx / length) * 20;
|
|
553
|
+
const boxPoints = [
|
|
554
|
+
{ x: point.x, y: point.y },
|
|
555
|
+
{ x: nextPoint.x, y: nextPoint.y },
|
|
556
|
+
{ x: nextPoint.x + offsetX, y: nextPoint.y + offsetY },
|
|
557
|
+
{ x: point.x + offsetX, y: point.y + offsetY },
|
|
558
|
+
];
|
|
559
|
+
ctx.beginPath();
|
|
560
|
+
ctx.moveTo(boxPoints[0].x, boxPoints[0].y);
|
|
561
|
+
boxPoints.forEach((pt, index) => {
|
|
562
|
+
if (properties.elementType === 'entrance') {
|
|
563
|
+
if (index < 2) {
|
|
564
|
+
ctx.lineTo(pt.x, pt.y);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
else {
|
|
568
|
+
ctx.lineTo(pt.x, pt.y);
|
|
569
|
+
}
|
|
570
|
+
});
|
|
571
|
+
if (properties.elementType === 'opening') {
|
|
572
|
+
ctx.closePath();
|
|
573
|
+
ctx.fillStyle = '#F9FAFB';
|
|
574
|
+
ctx.fill();
|
|
575
|
+
ctx.strokeStyle = '#F9FAFB';
|
|
576
|
+
ctx.stroke();
|
|
577
|
+
}
|
|
578
|
+
else {
|
|
579
|
+
ctx.closePath();
|
|
580
|
+
ctx.fillStyle = '#F9FAFB';
|
|
581
|
+
ctx.fill();
|
|
582
|
+
ctx.strokeStyle = '#1D2939';
|
|
583
|
+
ctx.stroke();
|
|
584
|
+
}
|
|
585
|
+
const textX = (boxPoints[1].x + boxPoints[3].x) / 2;
|
|
586
|
+
const textY = (boxPoints[1].y + boxPoints[3].y) / 2;
|
|
587
|
+
ctx.save();
|
|
588
|
+
ctx.translate(textX, textY);
|
|
589
|
+
if (dx === 0) {
|
|
590
|
+
ctx.rotate(-Math.PI / 2);
|
|
591
|
+
}
|
|
592
|
+
else if (dy !== 0) {
|
|
593
|
+
const angle = Math.atan2(dy, dx);
|
|
594
|
+
ctx.rotate(angle);
|
|
595
|
+
}
|
|
596
|
+
ctx.font = '12px Arial';
|
|
597
|
+
ctx.fillStyle = 'black';
|
|
598
|
+
ctx.textAlign = 'center';
|
|
599
|
+
ctx.textBaseline = 'middle';
|
|
600
|
+
ctx.fillText(`${properties.elementType} ${properties.elementNumber} - ${properties.distance} ${properties.unit}`, 0, 0);
|
|
601
|
+
ctx.restore();
|
|
602
|
+
if (properties.distance >= 4) {
|
|
603
|
+
const centerX = textX;
|
|
604
|
+
const centerY = textY;
|
|
605
|
+
const rightX = (boxPoints[1].x + boxPoints[2].x) / 2;
|
|
606
|
+
const rightY = (boxPoints[1].y + boxPoints[2].y) / 2;
|
|
607
|
+
const leftX = (boxPoints[0].x + boxPoints[3].x) / 2;
|
|
608
|
+
const leftY = (boxPoints[0].y + boxPoints[3].y) / 2;
|
|
609
|
+
function adjustPoint(x1, y1, x2, y2, distance) {
|
|
610
|
+
const angle = Math.atan2(y2 - y1, x2 - x1);
|
|
611
|
+
return {
|
|
612
|
+
x: x1 + Math.cos(angle) * distance,
|
|
613
|
+
y: y1 + Math.sin(angle) * distance,
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
const rightStart = adjustPoint(centerX, centerY, rightX, rightY, 50);
|
|
617
|
+
const rightEnd = adjustPoint(rightX, rightY, centerX, centerY, 10);
|
|
618
|
+
const leftStart = adjustPoint(centerX, centerY, leftX, leftY, 50);
|
|
619
|
+
const leftEnd = adjustPoint(leftX, leftY, centerX, centerY, 10);
|
|
620
|
+
ctx.beginPath();
|
|
621
|
+
ctx.moveTo(rightStart.x, rightStart.y);
|
|
622
|
+
ctx.lineTo(rightEnd.x, rightEnd.y);
|
|
623
|
+
ctx.strokeStyle = 'black';
|
|
624
|
+
ctx.stroke();
|
|
625
|
+
let rightAngle = Math.atan2(rightEnd.y - rightStart.y, rightEnd.x - rightStart.x);
|
|
626
|
+
drawArrowhead(ctx, rightEnd.x, rightEnd.y, rightAngle);
|
|
627
|
+
ctx.beginPath();
|
|
628
|
+
ctx.moveTo(leftStart.x, leftStart.y);
|
|
629
|
+
ctx.lineTo(leftEnd.x, leftEnd.y);
|
|
630
|
+
ctx.strokeStyle = 'black';
|
|
631
|
+
ctx.stroke();
|
|
632
|
+
let leftAngle = Math.atan2(leftEnd.y - leftStart.y, leftEnd.x - leftStart.x);
|
|
633
|
+
drawArrowhead(ctx, leftEnd.x, leftEnd.y, leftAngle);
|
|
634
|
+
}
|
|
635
|
+
if (properties.elementType === 'entrance') {
|
|
636
|
+
const angle = Math.atan2(nextPoint.y - point.y, nextPoint.x - point.x);
|
|
637
|
+
const entranceAngle = angle + (15 * Math.PI) / 180;
|
|
638
|
+
const lineLength = this.convertToPixels(properties.distance, properties.unit) * 0.75;
|
|
639
|
+
const endPoint = {
|
|
640
|
+
x: point.x + Math.cos(entranceAngle) * lineLength,
|
|
641
|
+
y: point.y + Math.sin(entranceAngle) * lineLength,
|
|
642
|
+
};
|
|
643
|
+
ctx.beginPath();
|
|
644
|
+
ctx.moveTo(point.x, point.y);
|
|
645
|
+
ctx.lineTo(endPoint.x, endPoint.y);
|
|
646
|
+
ctx.strokeStyle = '#1D2939';
|
|
647
|
+
ctx.stroke();
|
|
648
|
+
}
|
|
649
|
+
});
|
|
650
|
+
ctx.restore();
|
|
651
|
+
return new Promise((resolve) => {
|
|
652
|
+
console.log(canvas);
|
|
653
|
+
canvas.toBlob((blob) => {
|
|
654
|
+
console.log(blob);
|
|
655
|
+
const reader = new FileReader();
|
|
656
|
+
reader.onload = () => resolve(reader.result);
|
|
657
|
+
reader.readAsDataURL(blob);
|
|
658
|
+
canvas.remove();
|
|
659
|
+
});
|
|
660
|
+
});
|
|
661
|
+
};
|
|
662
|
+
for (let i = 0; i < data.floor.length; i++) {
|
|
663
|
+
const imageDataUrl = await renderCanvas(data.floor[i].layoutPolygon);
|
|
664
|
+
const base64Data = imageDataUrl.split(',')[1];
|
|
665
|
+
zip.file(`${store}_${data.floor[i].floorName}_layout.png`, base64Data, { base64: true });
|
|
666
|
+
}
|
|
667
|
+
zip.generateAsync({ type: 'blob' }).then((blob) => {
|
|
668
|
+
const link = document.createElement('a');
|
|
669
|
+
link.href = URL.createObjectURL(blob);
|
|
670
|
+
link.download = `${data.storeName}_layouts.zip`;
|
|
671
|
+
link.click();
|
|
672
|
+
});
|
|
673
|
+
}
|
|
674
|
+
onOutsideClick(event) {
|
|
675
|
+
console.log(event);
|
|
676
|
+
const closeDropDelete = event.target.closest(".close-delete");
|
|
677
|
+
console.log(closeDropDelete);
|
|
678
|
+
if (!closeDropDelete) {
|
|
679
|
+
this.layoutList.forEach((item, index) => {
|
|
680
|
+
item.deleteIndex = false;
|
|
681
|
+
});
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
clickOutside(event) {
|
|
685
|
+
const clickedInside = event.target.closest(".dropdown-close");
|
|
686
|
+
if (!clickedInside) {
|
|
687
|
+
this.closeDropDown();
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StoreLayoutTableComponent, deps: [{ token: i1.NgbModal }, { token: i2.PageInfoService }, { token: i3.ToastService }, { token: i2.GlobalStateService }, { token: i4.StoreBuilderService }, { token: i5.Router }], target: i0.ɵɵFactoryTarget.Component });
|
|
691
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StoreLayoutTableComponent, selector: "lib-store-layout-table", host: { listeners: { "document:click": "onOutsideClick($event)" } }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["file"], descendants: true }, { propertyName: "createBuilder", first: true, predicate: ["createBuilder"], descendants: true }, { propertyName: "uploadBuilder", first: true, predicate: ["uploadBuilder"], descendants: true }], ngImport: i0, template: "\r\n<div class=\"mx-3 mt-5\">\r\n <ul class=\"nav nav-stretch nav-line-tabs nav-line-tabs-2x border-transparent fs-5 fw-bolder flex-nowrap\">\r\n <li class=\"nav-item cursor-pointer\" [ngClass]=\"selectedTab === 'layoutBuilder' ? 'tabClassActive' :''\"><a class=\"text-active-primary px-4 py-3\" [ngClass]=\"selectedTab === 'layoutBuilder' ? 'active' :''\">Layout builder</a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" [ngClass]=\"selectedTab === 'storeBuilder' ? 'tabClassActive' :''\"><a class=\"text-active-primary px-4 py-3\" [ngClass]=\"selectedTab === 'storeBuilder' ? 'active' :''\">Store builder</a>\r\n </li>\r\n </ul>\r\n</div>\r\n<input style=\"display: none;\" type=\"file\" #file id=\"xlsxUpload\" (change)=\"onFileUpload($event)\" />\r\n<div class=\"card mt-5\" *ngIf=\"selectedTab === 'layoutBuilder'\">\r\n <div class=\"card-header border-0\" *ngIf=\"!showNoData\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\">Store layout </span>\r\n </h3>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon footfallsearch svg-icon-1 position-absolute ms-8\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\">\r\n </rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input type=\"text\" class=\"form-control ps-14 mx-2 footfallsearch\"\r\n placeholder=\"Search\" autocomplete=\"off\" [(ngModel)]=\"dynamicData.searchValue\" (change)=\"search()\"/>\r\n\r\n <lib-filters [dataObject]=\"dataObject\" (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n <a type=\"button\" (click)=\"BuilderCreate()\"\r\n class=\"btn btn-primary ms-2 rounded-3 text-nowrap ng-star-inserted\" tabindex=\"0\"><svg\r\n 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\"></path>\r\n </svg><span class=\"ms-2 text-white\">Create Manually</span></a>\r\n \r\n <button type=\"button\" class=\"btn-outline ps-4 pe-2 btn align-items-end text-nowrap invheader mx-2\" >\r\n <span class=\"d-flex align-items-center\">\r\n <div class=\"cursor-pointer\" (click)=\"file.click()\">\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> <span>Upload</span>\r\n </div>\r\n <div class=\"vr ms-3 me-1\"></div>\r\n <div class=\"cursor-pointer\">\r\n <a href=\"../../../assets/files/StoreBuilderTemplate.xlsx\" download>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M6 9L12 15L18 9\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </a>\r\n </div>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-body p-0 mt-5\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table text-nowrap bottom-border\" *ngIf=\"layoutList.length\">\r\n <thead>\r\n <tr>\r\n <th><span class=\"cursor-pointer\" (click)=\"onSort('storeName')\">Store Name <svg\r\n [ngClass]=\"dynamicData.sortColumnName === 'storeName' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"dynamicData.sortColumnName === 'storeName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span></th>\r\n <th><span class=\"cursor-pointer\" (click)=\"onSort('layoutName')\">Layout Name <svg\r\n [ngClass]=\"dynamicData.sortColumnName === 'layoutName' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"dynamicData.sortColumnName === 'layoutName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span></th>\r\n <th><span class=\"cursor-pointer\" (click)=\"onSort('floorNumber')\">No of Floors <svg\r\n [ngClass]=\"dynamicData.sortColumnName === 'floorNumber' && dynamicData.sortBy === 1 ? 'rotate' : ''\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"dynamicData.sortColumnName === 'floorNumber' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span></th>\r\n <th> <span class=\"cursor-pointer\" (click)=\"onSort('createdByName')\">Created By <svg\r\n [ngClass]=\"dynamicData.sortColumnName === 'createdByName' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"dynamicData.sortColumnName === 'createdByName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span></th>\r\n <th><span class=\"cursor-pointer\" (click)=\"onSort('createdAt')\">Created Date <svg\r\n [ngClass]=\"dynamicData.sortColumnName === 'createdAt' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"dynamicData.sortColumnName === 'createdAt' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span></th>\r\n <th><span class=\"cursor-pointer\" (click)=\"onSort('status')\">Status <svg\r\n [ngClass]=\"dynamicData.sortColumnName === 'status' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"dynamicData.sortColumnName === 'status' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of layoutList;let i =index;\">\r\n <td><span><a class=\"storeLink cursor-pointer\" [href]=\"'/manage/planogram/layout-builder/create?id='+item._id\">{{item?.storeName}}</a></span></td>\r\n <td><span><a class=\"storeLink cursor-pointer\" [href]=\"'/manage/planogram/layout-builder/create?id='+item._id\">{{item?.layoutName}}</a></span></td>\r\n <td>{{item.floorNumber}}</td>\r\n <td><div class=\"symbol symbol-35px symbol-circle\"><span\r\n class=\"symbol-label bg-light-primary text-primary me-2\">{{item?.createdByName.slice(0,2).toUpperCase()}}</span></div>{{item?.createdByName}}</td>\r\n <td>{{item.createdAt}}</td>\r\n <td><span class=\"badge badge-light-success\">{{item.status | titlecase}}</span></td>\r\n <td>\r\n <div class=\"d-flex\">\r\n <div class=\"me-10\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" *ngIf=\"item.status !== 'draft'\" (click)=\"download(item)\" class=\"cursor-pointer\">\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.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\r\n stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <a [href]=\"'/manage/planogram/layout-builder/create?id='+item._id\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" *ngIf=\"item.status === 'draft'\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3855 2.28106 14.6454 2.10744 14.9313 1.98899C15.2173 1.87054 15.5238 1.80957 15.8333 1.80957C16.1429 1.80957 16.4494 1.87054 16.7353 1.98899C17.0213 2.10744 17.2811 2.28106 17.5 2.49993C17.7189 2.7188 17.8925 2.97863 18.0109 3.2646C18.1294 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1294 4.78262 18.0109 5.06859C17.8925 5.35455 17.7189 5.61439 17.5 5.83326L6.25 17.0833L1.66667 18.3333L2.91667 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></a>\r\n </div>\r\n <div class=\"close-delete\">\r\n <div class=\"position-relative\">\r\n <span (click)=\"$event.stopPropagation();showDeleteDropDown(i)\" class=\"cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"23\" viewBox=\"0 0 24 23\" fill=\"none\">\r\n <path\r\n d=\"M11 11.4999C11 12.0292 11.4477 12.4583 12 12.4583C12.5523 12.4583 13 12.0292 13 11.4999C13 10.9706 12.5523 10.5416 12 10.5416C11.4477 10.5416 11 10.9706 11 11.4999Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 18.2083C11 18.7375 11.4477 19.1666 12 19.1666C12.5523 19.1666 13 18.7375 13 18.2083C13 17.679 12.5523 17.2499 12 17.2499C11.4477 17.2499 11 17.679 11 18.2083Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 4.79159C11 5.32086 11.4477 5.74992 12 5.74992C12.5523 5.74992 13 5.32086 13 4.79159C13 4.26231 12.5523 3.83325 12 3.83325C11.4477 3.83325 11 4.26231 11 4.79159Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div *ngIf=\"item?.deleteIndex\" (click)=\"$event.stopPropagation(); deleteLayout(item._id)\" class=\"option cursor-pointer\">Delete\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <ng-container>\r\n <div class=\"row loader d-flex justify-content-center align-items-center\" *ngIf=\"loading\">\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 </ng-container>\r\n <ng-container *ngIf=\"!showNoData && !layoutList.length && !loading\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 my-6\">\r\n <div 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 Store Layout</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container class=\"mb-10\">\r\n <div class=\"row h-400px mt-10\" *ngIf=\"!loading && this.showNoData\">\r\n <div class=\"col-lg-6 text-center\">\r\n <div class=\"text-center\">\r\n <div class=\"round d-flex justify-content-center\">\r\n <div class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <path\r\n d=\"M19.9999 13.333V26.6663M13.3333 19.9997H26.6666M36.6666 19.9997C36.6666 29.2044 29.2047 36.6663 19.9999 36.6663C10.7952 36.6663 3.33325 29.2044 3.33325 19.9997C3.33325 10.7949 10.7952 3.33301 19.9999 3.33301C29.2047 3.33301 36.6666 10.7949 36.6666 19.9997Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"3.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"titleHead mt-3\">\r\n Create a store layout manually\r\n </div>\r\n <div class=\"titleContent mt-3\">\r\n You can create a single store layout manually by step by step\r\n </div>\r\n <div class=\"titleContent mt-8\">\r\n <button class=\"btn btn-outline btnClass\" (click)=\"BuilderCreate()\">\r\n <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M12 5V19M5 12H19\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n Create manually\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 text-center\">\r\n \r\n <div class=\"end-border position-relative text-center\">\r\n <span class=\"or-center bg-white step-text\">or</span>\r\n <div class=\"round d-flex justify-content-center\">\r\n <div class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <path\r\n d=\"M35 25V31.6667C35 32.5507 34.6488 33.3986 34.0237 34.0237C33.3986 34.6488 32.5507 35 31.6667 35H8.33333C7.44928 35 6.60143 34.6488 5.97631 34.0237C5.35119 33.3986 5 32.5507 5 31.6667V25M28.3333 13.3333L20 5M20 5L11.6667 13.3333M20 5V25\"\r\n stroke=\"#00A3FF\" stroke-width=\"3.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"titleHead mt-3\">\r\n Create a store layout using CSV\r\n </div>\r\n <div class=\"titleContent mt-3\">\r\n You can create a single or a multiple store layout using CSV.\r\n </div>\r\n <div class=\"d-flex justify-content-center mt-10\">\r\n <div class=\"titleContent text-center\">\r\n <div class=\"d-flex step-text\"><div>Step1 - </div><div class=\"ms-1 \"><a class=\"dowloadLink\" href=\"../../../assets/files/StoreBuilderTemplate.xlsx\" download>Download the template here</a></div></div>\r\n <div class=\"mt-2 d-flex step-text\"><div>Step2 - </div><div class=\"ms-1\">Add your data to the Template File</div></div>\r\n <div class=\"mt-2 d-flex step-text\"><div>Step3 - </div><div class=\"ms-1\">Upload it below for processing</div></div>\r\n </div>\r\n </div>\r\n <div class=\"titleContent mt-8\">\r\n <button class=\"btn btn-primary btnClass\" (click)=\"file.click()\">\r\n <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"21\" height=\"20\" viewBox=\"0 0 21 20\" fill=\"none\">\r\n <path\r\n d=\"M18 12.5V15.8333C18 16.2754 17.8244 16.6993 17.5118 17.0118C17.1993 17.3244 16.7754 17.5 16.3333 17.5H4.66667C4.22464 17.5 3.80072 17.3244 3.48816 17.0118C3.17559 16.6993 3 16.2754 3 15.8333V12.5M14.6667 6.66667L10.5 2.5M10.5 2.5L6.33333 6.66667M10.5 2.5V12.5\"\r\n stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n Upload CSV\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!loading && layoutList.length\">\r\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"dynamicData.limit\" [currentPage]=\"dynamicData.offset\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #createBuilder let-modal>\r\n <div class=\"card scroll\">\r\n <div class=\"card-header border-0\">\r\n <div class=\"card-title\">\r\n <span class=\"card-label\">Create store layout</span>\r\n </div>\r\n </div>\r\n <div class=\"card-body storeCard\">\r\n <div class=\"selectStore\">\r\n <div class=\"mt-2\">\r\n <div class=\"pt-3 position-relative\" (clickOutside)=\"closeDropDown()\">\r\n <label for=\"inputmodel\" class=\"label pb-2\">Select Store</label>\r\n <div class=\"dropdown-close\">\r\n <div class=\"w-100\">\r\n <div class=\"d-flex align-items-center position-relative w-100\">\r\n <input type=\"text\" class=\"form-control dropdown-input\"\r\n (click)=\"toggleDropDown()\" readonly placeholder=\"Select One Store\" [ngModel]=\"selectedStore?.name\"/>\r\n </div>\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu w-100\" *ngIf=\"showDropDown\">\r\n <div class=\"mx-3\">\r\n <input type=\"text\" class=\"form-control mb-2\" placeholder=\"Search Store...\"\r\n [(ngModel)]=\"searchStore\" (ngModelChange)=\"filterSearch()\" />\r\n </div>\r\n <div [class]=\"storeList.length > 5 ? 'h-200px overflow-auto' : 'h-auto'\">\r\n <div class=\"dropdown-item form-check custom-dropdown-item\" *ngFor=\"let store of storeList;let i= index\"\r\n (click)=\"updateSelectedStore(i)\">\r\n <label class=\"\" [for]=\"store.name\">\r\n {{ store.name }}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"h-auto\" *ngIf=\"!storeList.length\">\r\n <div class=\"dropdown-item form-check custom-dropdown-item\" >\r\n <label class=\"\">No Data.</label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mt-5\">No of floors</div>\r\n <div class=\"mt-2\">\r\n <div style=\"position: relative;\"><svg role=\"button\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"dec\" (click)=\"floorDec()\">\r\n <path d=\"M4.16602 10H15.8327\" stroke=\"#667085\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n </svg><input readonly=\"\" type=\"number\" [(ngModel)]=\"floorNo\" id=\"floor\"\r\n autocomplete=\"off\" class=\"form-control inc-dec-input\"\r\n ><svg role=\"button\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\" class=\"inc\" (click)=\"floorInc()\">\r\n <path d=\"M8.00065 3.33337V12.6667M3.33398 8.00004H12.6673\" stroke=\"#667085\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n </svg></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer storeCard text-end border-0\">\r\n <button class=\"btn mx-5 btn-outline\" (click)=\"modal.dismiss()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"createLayout()\" [disabled]=\"!selectedStore?.name\">Save</button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #uploadBuilder let-modal>\r\n <div class=\"card scroll\">\r\n <div class=\"card-body\">\r\n <div class=\"cardTitle\">Create store layout (CSV Upload)</div>\r\n <div class=\"row mt-6\">\r\n <div class=\"col-md-4\">\r\n <div class=\"card p-2 padding-left\">\r\n <div class=\"count\">{{excelData.totalStore}}</div>\r\n <div class=\"countTitle\">Total store</div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div class=\"card p-2\">\r\n <div class=\"count\">{{excelData.totalRow}}</div>\r\n <div class=\"countTitle\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div class=\"card p-2\">\r\n <div class=\"count text-danger\">{{excelData.totalError}}</div>\r\n <div class=\"countTitle text-danger\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mt-5\">\r\n <div class=\"cardTitle\">Invalid details!</div>\r\n <div class=\"countTitle fontWeight\">Please provide correct and complete layout information.</div>\r\n <div class=\"error mt-5 p-5 pt-0 h-auto mh-200px overflow-scroll\" *ngIf=\"error\">\r\n <div class=\"mt-5\" *ngFor=\"let error of error;let i =index\">\r\n <span>{{i + 1}}) {{error.message}} - <span *ngIf=\"error?.ExistIndex\">{{error.series}}{{error.ExistIndex}},</span>{{error.series}}{{error.index}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer storeCard text-end border-0\">\r\n <button class=\"btn mx-5 btn-outline\" (click)=\"modal.dismiss()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-danger\" (click)=\"Reupload()\">Reupload</button>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".tabClassActive{background-color:var(--Primary-50, #EAF8FF)!important;border-radius:10%!important}.nav-item a{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500;line-height:20px}.nav-item.tabClassActive a{color:var(--Primary-700, #009BF3)!important}.titleHead{color:var(--Black, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:500;line-height:28px}.titleContent{color:var(--Black, #101828);text-align:center;font-family:Inter;font-size:14px;font-style:normal;font-weight:400;line-height:20px}.btnClass{color:var(--Gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:600;line-height:24px;text-transform:capitalize}.dowloadLink{color:var(--Primary-800, #008EDF);font-family:Inter;font-size:14px;font-style:normal;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}.end-border{border-left:2px solid #D0D5DD!important}.or-center{position:absolute;left:-1%;top:50%;transform:translateY(-50%)}.step-text{color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px}.storeLink{color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;text-transform:capitalize}.storeLink:hover{text-decoration-line:underline!important}.selectStore{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.inc-dec-input{padding-right:30px;padding-left:30px;text-align:center}.inc{height:100%;position:absolute;right:14px;top:0}.dec{height:100%;position:absolute;left:14px;top:0}.selectStore .dropdown-menu{position:absolute;top:100%;left:0;right:0;border:1px solid #ccc;background-color:#fff;z-index:1000;display:block;box-sizing:border-box}.selectStore .dropdown-item{padding:8px 12px}.selectStore .dropdown-item:hover{background-color:#f1f1f1}.selectStore .dropdown-item input[type=checkbox]{margin-right:10px}.selectStore .custom-dropdown-menu{border-radius:4px;box-shadow:0 1px 2px #1018280d}.selectStore .custom-dropdown-item{display:flex;align-items:center}.selectStore .custom-dropdown-item input{margin-left:10px}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .shimmer .image-card{height:90px;width:90px;float:right;border-radius:8px}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.rotate{rotate:180deg;transition:1s}.storeCard{padding-top:0!important}.cardTitle{color:var(--Gray-800, #1D2939);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.count{color:#000;font-family:Inter;font-size:20px;font-style:normal;font-weight:500;line-height:30px}.countTitle{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.fontWeight{font-weight:500!important}.error{color:var(--Error-700, #B42318);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px;border-radius:8px;border:1px solid var(--Error-300, #FDA29B);background:var(--Error-25, #FFFBFA)}.option{width:200px;position:absolute;padding:10px 16px;background:#fef3f2;color:#d92d20;font-size:14px;font-weight:500;line-height:20px;right:0;z-index:1;top:25px}.icon{display:flex;width:80px;height:80px;padding:13px;justify-content:center;align-items:center;flex-shrink:0;border-radius:46.667px;border:13.333px solid var(--Primary-50, #EAF8FF);background:var(--Primary-100, #DAF1FF)}\n"], dependencies: [{ 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: 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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: "component", type: i3.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i3.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "pipe", type: i6.TitleCasePipe, name: "titlecase" }] });
|
|
692
|
+
}
|
|
693
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StoreLayoutTableComponent, decorators: [{
|
|
694
|
+
type: Component,
|
|
695
|
+
args: [{ selector: 'lib-store-layout-table', template: "\r\n<div class=\"mx-3 mt-5\">\r\n <ul class=\"nav nav-stretch nav-line-tabs nav-line-tabs-2x border-transparent fs-5 fw-bolder flex-nowrap\">\r\n <li class=\"nav-item cursor-pointer\" [ngClass]=\"selectedTab === 'layoutBuilder' ? 'tabClassActive' :''\"><a class=\"text-active-primary px-4 py-3\" [ngClass]=\"selectedTab === 'layoutBuilder' ? 'active' :''\">Layout builder</a>\r\n </li>\r\n <li class=\"nav-item cursor-pointer\" [ngClass]=\"selectedTab === 'storeBuilder' ? 'tabClassActive' :''\"><a class=\"text-active-primary px-4 py-3\" [ngClass]=\"selectedTab === 'storeBuilder' ? 'active' :''\">Store builder</a>\r\n </li>\r\n </ul>\r\n</div>\r\n<input style=\"display: none;\" type=\"file\" #file id=\"xlsxUpload\" (change)=\"onFileUpload($event)\" />\r\n<div class=\"card mt-5\" *ngIf=\"selectedTab === 'layoutBuilder'\">\r\n <div class=\"card-header border-0\" *ngIf=\"!showNoData\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\">Store layout </span>\r\n </h3>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon footfallsearch svg-icon-1 position-absolute ms-8\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\">\r\n </rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input type=\"text\" class=\"form-control ps-14 mx-2 footfallsearch\"\r\n placeholder=\"Search\" autocomplete=\"off\" [(ngModel)]=\"dynamicData.searchValue\" (change)=\"search()\"/>\r\n\r\n <lib-filters [dataObject]=\"dataObject\" (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n <a type=\"button\" (click)=\"BuilderCreate()\"\r\n class=\"btn btn-primary ms-2 rounded-3 text-nowrap ng-star-inserted\" tabindex=\"0\"><svg\r\n 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\"></path>\r\n </svg><span class=\"ms-2 text-white\">Create Manually</span></a>\r\n \r\n <button type=\"button\" class=\"btn-outline ps-4 pe-2 btn align-items-end text-nowrap invheader mx-2\" >\r\n <span class=\"d-flex align-items-center\">\r\n <div class=\"cursor-pointer\" (click)=\"file.click()\">\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> <span>Upload</span>\r\n </div>\r\n <div class=\"vr ms-3 me-1\"></div>\r\n <div class=\"cursor-pointer\">\r\n <a href=\"../../../assets/files/StoreBuilderTemplate.xlsx\" download>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M6 9L12 15L18 9\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </a>\r\n </div>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-body p-0 mt-5\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table text-nowrap bottom-border\" *ngIf=\"layoutList.length\">\r\n <thead>\r\n <tr>\r\n <th><span class=\"cursor-pointer\" (click)=\"onSort('storeName')\">Store Name <svg\r\n [ngClass]=\"dynamicData.sortColumnName === 'storeName' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"dynamicData.sortColumnName === 'storeName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span></th>\r\n <th><span class=\"cursor-pointer\" (click)=\"onSort('layoutName')\">Layout Name <svg\r\n [ngClass]=\"dynamicData.sortColumnName === 'layoutName' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"dynamicData.sortColumnName === 'layoutName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span></th>\r\n <th><span class=\"cursor-pointer\" (click)=\"onSort('floorNumber')\">No of Floors <svg\r\n [ngClass]=\"dynamicData.sortColumnName === 'floorNumber' && dynamicData.sortBy === 1 ? 'rotate' : ''\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"dynamicData.sortColumnName === 'floorNumber' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span></th>\r\n <th> <span class=\"cursor-pointer\" (click)=\"onSort('createdByName')\">Created By <svg\r\n [ngClass]=\"dynamicData.sortColumnName === 'createdByName' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"dynamicData.sortColumnName === 'createdByName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span></th>\r\n <th><span class=\"cursor-pointer\" (click)=\"onSort('createdAt')\">Created Date <svg\r\n [ngClass]=\"dynamicData.sortColumnName === 'createdAt' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"dynamicData.sortColumnName === 'createdAt' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span></th>\r\n <th><span class=\"cursor-pointer\" (click)=\"onSort('status')\">Status <svg\r\n [ngClass]=\"dynamicData.sortColumnName === 'status' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"dynamicData.sortColumnName === 'status' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of layoutList;let i =index;\">\r\n <td><span><a class=\"storeLink cursor-pointer\" [href]=\"'/manage/planogram/layout-builder/create?id='+item._id\">{{item?.storeName}}</a></span></td>\r\n <td><span><a class=\"storeLink cursor-pointer\" [href]=\"'/manage/planogram/layout-builder/create?id='+item._id\">{{item?.layoutName}}</a></span></td>\r\n <td>{{item.floorNumber}}</td>\r\n <td><div class=\"symbol symbol-35px symbol-circle\"><span\r\n class=\"symbol-label bg-light-primary text-primary me-2\">{{item?.createdByName.slice(0,2).toUpperCase()}}</span></div>{{item?.createdByName}}</td>\r\n <td>{{item.createdAt}}</td>\r\n <td><span class=\"badge badge-light-success\">{{item.status | titlecase}}</span></td>\r\n <td>\r\n <div class=\"d-flex\">\r\n <div class=\"me-10\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" *ngIf=\"item.status !== 'draft'\" (click)=\"download(item)\" class=\"cursor-pointer\">\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.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\r\n stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <a [href]=\"'/manage/planogram/layout-builder/create?id='+item._id\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" *ngIf=\"item.status === 'draft'\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3855 2.28106 14.6454 2.10744 14.9313 1.98899C15.2173 1.87054 15.5238 1.80957 15.8333 1.80957C16.1429 1.80957 16.4494 1.87054 16.7353 1.98899C17.0213 2.10744 17.2811 2.28106 17.5 2.49993C17.7189 2.7188 17.8925 2.97863 18.0109 3.2646C18.1294 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1294 4.78262 18.0109 5.06859C17.8925 5.35455 17.7189 5.61439 17.5 5.83326L6.25 17.0833L1.66667 18.3333L2.91667 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></a>\r\n </div>\r\n <div class=\"close-delete\">\r\n <div class=\"position-relative\">\r\n <span (click)=\"$event.stopPropagation();showDeleteDropDown(i)\" class=\"cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"23\" viewBox=\"0 0 24 23\" fill=\"none\">\r\n <path\r\n d=\"M11 11.4999C11 12.0292 11.4477 12.4583 12 12.4583C12.5523 12.4583 13 12.0292 13 11.4999C13 10.9706 12.5523 10.5416 12 10.5416C11.4477 10.5416 11 10.9706 11 11.4999Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 18.2083C11 18.7375 11.4477 19.1666 12 19.1666C12.5523 19.1666 13 18.7375 13 18.2083C13 17.679 12.5523 17.2499 12 17.2499C11.4477 17.2499 11 17.679 11 18.2083Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 4.79159C11 5.32086 11.4477 5.74992 12 5.74992C12.5523 5.74992 13 5.32086 13 4.79159C13 4.26231 12.5523 3.83325 12 3.83325C11.4477 3.83325 11 4.26231 11 4.79159Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div *ngIf=\"item?.deleteIndex\" (click)=\"$event.stopPropagation(); deleteLayout(item._id)\" class=\"option cursor-pointer\">Delete\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <ng-container>\r\n <div class=\"row loader d-flex justify-content-center align-items-center\" *ngIf=\"loading\">\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 </ng-container>\r\n <ng-container *ngIf=\"!showNoData && !layoutList.length && !loading\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 my-6\">\r\n <div 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 Store Layout</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container class=\"mb-10\">\r\n <div class=\"row h-400px mt-10\" *ngIf=\"!loading && this.showNoData\">\r\n <div class=\"col-lg-6 text-center\">\r\n <div class=\"text-center\">\r\n <div class=\"round d-flex justify-content-center\">\r\n <div class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <path\r\n d=\"M19.9999 13.333V26.6663M13.3333 19.9997H26.6666M36.6666 19.9997C36.6666 29.2044 29.2047 36.6663 19.9999 36.6663C10.7952 36.6663 3.33325 29.2044 3.33325 19.9997C3.33325 10.7949 10.7952 3.33301 19.9999 3.33301C29.2047 3.33301 36.6666 10.7949 36.6666 19.9997Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"3.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"titleHead mt-3\">\r\n Create a store layout manually\r\n </div>\r\n <div class=\"titleContent mt-3\">\r\n You can create a single store layout manually by step by step\r\n </div>\r\n <div class=\"titleContent mt-8\">\r\n <button class=\"btn btn-outline btnClass\" (click)=\"BuilderCreate()\">\r\n <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M12 5V19M5 12H19\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n Create manually\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 text-center\">\r\n \r\n <div class=\"end-border position-relative text-center\">\r\n <span class=\"or-center bg-white step-text\">or</span>\r\n <div class=\"round d-flex justify-content-center\">\r\n <div class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <path\r\n d=\"M35 25V31.6667C35 32.5507 34.6488 33.3986 34.0237 34.0237C33.3986 34.6488 32.5507 35 31.6667 35H8.33333C7.44928 35 6.60143 34.6488 5.97631 34.0237C5.35119 33.3986 5 32.5507 5 31.6667V25M28.3333 13.3333L20 5M20 5L11.6667 13.3333M20 5V25\"\r\n stroke=\"#00A3FF\" stroke-width=\"3.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"titleHead mt-3\">\r\n Create a store layout using CSV\r\n </div>\r\n <div class=\"titleContent mt-3\">\r\n You can create a single or a multiple store layout using CSV.\r\n </div>\r\n <div class=\"d-flex justify-content-center mt-10\">\r\n <div class=\"titleContent text-center\">\r\n <div class=\"d-flex step-text\"><div>Step1 - </div><div class=\"ms-1 \"><a class=\"dowloadLink\" href=\"../../../assets/files/StoreBuilderTemplate.xlsx\" download>Download the template here</a></div></div>\r\n <div class=\"mt-2 d-flex step-text\"><div>Step2 - </div><div class=\"ms-1\">Add your data to the Template File</div></div>\r\n <div class=\"mt-2 d-flex step-text\"><div>Step3 - </div><div class=\"ms-1\">Upload it below for processing</div></div>\r\n </div>\r\n </div>\r\n <div class=\"titleContent mt-8\">\r\n <button class=\"btn btn-primary btnClass\" (click)=\"file.click()\">\r\n <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"21\" height=\"20\" viewBox=\"0 0 21 20\" fill=\"none\">\r\n <path\r\n d=\"M18 12.5V15.8333C18 16.2754 17.8244 16.6993 17.5118 17.0118C17.1993 17.3244 16.7754 17.5 16.3333 17.5H4.66667C4.22464 17.5 3.80072 17.3244 3.48816 17.0118C3.17559 16.6993 3 16.2754 3 15.8333V12.5M14.6667 6.66667L10.5 2.5M10.5 2.5L6.33333 6.66667M10.5 2.5V12.5\"\r\n stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n Upload CSV\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!loading && layoutList.length\">\r\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"dynamicData.limit\" [currentPage]=\"dynamicData.offset\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #createBuilder let-modal>\r\n <div class=\"card scroll\">\r\n <div class=\"card-header border-0\">\r\n <div class=\"card-title\">\r\n <span class=\"card-label\">Create store layout</span>\r\n </div>\r\n </div>\r\n <div class=\"card-body storeCard\">\r\n <div class=\"selectStore\">\r\n <div class=\"mt-2\">\r\n <div class=\"pt-3 position-relative\" (clickOutside)=\"closeDropDown()\">\r\n <label for=\"inputmodel\" class=\"label pb-2\">Select Store</label>\r\n <div class=\"dropdown-close\">\r\n <div class=\"w-100\">\r\n <div class=\"d-flex align-items-center position-relative w-100\">\r\n <input type=\"text\" class=\"form-control dropdown-input\"\r\n (click)=\"toggleDropDown()\" readonly placeholder=\"Select One Store\" [ngModel]=\"selectedStore?.name\"/>\r\n </div>\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu w-100\" *ngIf=\"showDropDown\">\r\n <div class=\"mx-3\">\r\n <input type=\"text\" class=\"form-control mb-2\" placeholder=\"Search Store...\"\r\n [(ngModel)]=\"searchStore\" (ngModelChange)=\"filterSearch()\" />\r\n </div>\r\n <div [class]=\"storeList.length > 5 ? 'h-200px overflow-auto' : 'h-auto'\">\r\n <div class=\"dropdown-item form-check custom-dropdown-item\" *ngFor=\"let store of storeList;let i= index\"\r\n (click)=\"updateSelectedStore(i)\">\r\n <label class=\"\" [for]=\"store.name\">\r\n {{ store.name }}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"h-auto\" *ngIf=\"!storeList.length\">\r\n <div class=\"dropdown-item form-check custom-dropdown-item\" >\r\n <label class=\"\">No Data.</label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mt-5\">No of floors</div>\r\n <div class=\"mt-2\">\r\n <div style=\"position: relative;\"><svg role=\"button\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"dec\" (click)=\"floorDec()\">\r\n <path d=\"M4.16602 10H15.8327\" stroke=\"#667085\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n </svg><input readonly=\"\" type=\"number\" [(ngModel)]=\"floorNo\" id=\"floor\"\r\n autocomplete=\"off\" class=\"form-control inc-dec-input\"\r\n ><svg role=\"button\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\" class=\"inc\" (click)=\"floorInc()\">\r\n <path d=\"M8.00065 3.33337V12.6667M3.33398 8.00004H12.6673\" stroke=\"#667085\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n </svg></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer storeCard text-end border-0\">\r\n <button class=\"btn mx-5 btn-outline\" (click)=\"modal.dismiss()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"createLayout()\" [disabled]=\"!selectedStore?.name\">Save</button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #uploadBuilder let-modal>\r\n <div class=\"card scroll\">\r\n <div class=\"card-body\">\r\n <div class=\"cardTitle\">Create store layout (CSV Upload)</div>\r\n <div class=\"row mt-6\">\r\n <div class=\"col-md-4\">\r\n <div class=\"card p-2 padding-left\">\r\n <div class=\"count\">{{excelData.totalStore}}</div>\r\n <div class=\"countTitle\">Total store</div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div class=\"card p-2\">\r\n <div class=\"count\">{{excelData.totalRow}}</div>\r\n <div class=\"countTitle\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div class=\"card p-2\">\r\n <div class=\"count text-danger\">{{excelData.totalError}}</div>\r\n <div class=\"countTitle text-danger\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mt-5\">\r\n <div class=\"cardTitle\">Invalid details!</div>\r\n <div class=\"countTitle fontWeight\">Please provide correct and complete layout information.</div>\r\n <div class=\"error mt-5 p-5 pt-0 h-auto mh-200px overflow-scroll\" *ngIf=\"error\">\r\n <div class=\"mt-5\" *ngFor=\"let error of error;let i =index\">\r\n <span>{{i + 1}}) {{error.message}} - <span *ngIf=\"error?.ExistIndex\">{{error.series}}{{error.ExistIndex}},</span>{{error.series}}{{error.index}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer storeCard text-end border-0\">\r\n <button class=\"btn mx-5 btn-outline\" (click)=\"modal.dismiss()\">Cancel</button>\r\n <button class=\"btn btn-sm btn-danger\" (click)=\"Reupload()\">Reupload</button>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".tabClassActive{background-color:var(--Primary-50, #EAF8FF)!important;border-radius:10%!important}.nav-item a{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500;line-height:20px}.nav-item.tabClassActive a{color:var(--Primary-700, #009BF3)!important}.titleHead{color:var(--Black, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:500;line-height:28px}.titleContent{color:var(--Black, #101828);text-align:center;font-family:Inter;font-size:14px;font-style:normal;font-weight:400;line-height:20px}.btnClass{color:var(--Gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:600;line-height:24px;text-transform:capitalize}.dowloadLink{color:var(--Primary-800, #008EDF);font-family:Inter;font-size:14px;font-style:normal;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}.end-border{border-left:2px solid #D0D5DD!important}.or-center{position:absolute;left:-1%;top:50%;transform:translateY(-50%)}.step-text{color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px}.storeLink{color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;text-transform:capitalize}.storeLink:hover{text-decoration-line:underline!important}.selectStore{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.inc-dec-input{padding-right:30px;padding-left:30px;text-align:center}.inc{height:100%;position:absolute;right:14px;top:0}.dec{height:100%;position:absolute;left:14px;top:0}.selectStore .dropdown-menu{position:absolute;top:100%;left:0;right:0;border:1px solid #ccc;background-color:#fff;z-index:1000;display:block;box-sizing:border-box}.selectStore .dropdown-item{padding:8px 12px}.selectStore .dropdown-item:hover{background-color:#f1f1f1}.selectStore .dropdown-item input[type=checkbox]{margin-right:10px}.selectStore .custom-dropdown-menu{border-radius:4px;box-shadow:0 1px 2px #1018280d}.selectStore .custom-dropdown-item{display:flex;align-items:center}.selectStore .custom-dropdown-item input{margin-left:10px}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .shimmer .image-card{height:90px;width:90px;float:right;border-radius:8px}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.rotate{rotate:180deg;transition:1s}.storeCard{padding-top:0!important}.cardTitle{color:var(--Gray-800, #1D2939);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.count{color:#000;font-family:Inter;font-size:20px;font-style:normal;font-weight:500;line-height:30px}.countTitle{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.fontWeight{font-weight:500!important}.error{color:var(--Error-700, #B42318);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px;border-radius:8px;border:1px solid var(--Error-300, #FDA29B);background:var(--Error-25, #FFFBFA)}.option{width:200px;position:absolute;padding:10px 16px;background:#fef3f2;color:#d92d20;font-size:14px;font-weight:500;line-height:20px;right:0;z-index:1;top:25px}.icon{display:flex;width:80px;height:80px;padding:13px;justify-content:center;align-items:center;flex-shrink:0;border-radius:46.667px;border:13.333px solid var(--Primary-50, #EAF8FF);background:var(--Primary-100, #DAF1FF)}\n"] }]
|
|
696
|
+
}], ctorParameters: () => [{ type: i1.NgbModal }, { type: i2.PageInfoService }, { type: i3.ToastService }, { type: i2.GlobalStateService }, { type: i4.StoreBuilderService }, { type: i5.Router }], propDecorators: { fileInput: [{
|
|
697
|
+
type: ViewChild,
|
|
698
|
+
args: ['file']
|
|
699
|
+
}], createBuilder: [{
|
|
700
|
+
type: ViewChild,
|
|
701
|
+
args: ['createBuilder']
|
|
702
|
+
}], uploadBuilder: [{
|
|
703
|
+
type: ViewChild,
|
|
704
|
+
args: ['uploadBuilder']
|
|
705
|
+
}], onOutsideClick: [{
|
|
706
|
+
type: HostListener,
|
|
707
|
+
args: ["document:click", ["$event"]]
|
|
708
|
+
}] } });
|
|
709
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtbGF5b3V0LXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL3N0b3JlLWxheW91dC10YWJsZS9zdG9yZS1sYXlvdXQtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvc3RvcmUtbGF5b3V0LXRhYmxlL3N0b3JlLWxheW91dC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixTQUFTLEVBQUMsWUFBWSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBRWxHLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFDLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUl2RCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sK0RBQStELENBQUE7Ozs7Ozs7OztBQU9uRyxNQUFNLE9BQU8seUJBQXlCO0lBMkNoQjtJQUEwQjtJQUFpQztJQUEyQjtJQUE4QjtJQUEyQztJQTFDaEssU0FBUyxDQUFjO0lBQzFDLE9BQU8sR0FBVyxJQUFJLENBQUM7SUFDdkIsV0FBVyxHQUFVLGVBQWUsQ0FBQztJQUNyQyxPQUFPLEdBQVEsQ0FBQyxDQUFDO0lBQ2pCLFdBQVcsQ0FBUTtJQUNuQixTQUFTLEdBQVMsRUFBRSxDQUFBO0lBQ3BCLEtBQUssR0FBUyxFQUFFLENBQUM7SUFDakIsZUFBZSxHQUFPLEVBQUUsQ0FBQztJQUN6QixhQUFhLEdBQU8sRUFBRSxDQUFDO0lBQ3ZCLFlBQVksR0FBVyxLQUFLLENBQUM7SUFDN0IsVUFBVSxD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QUU7WUFDbEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQzt3R0E5dUJRLHlCQUF5Qjs0RkFBekIseUJBQXlCLHdhQ2hCdEMsbWg1QkFrWGM7OzRGRGxXRCx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0Usd0JBQXdCOzhOQUtmLFNBQVM7c0JBQTNCLFNBQVM7dUJBQUMsTUFBTTtnQkF1Q1csYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUNFLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZTtnQkFvckJ4QixjQUFjO3NCQURmLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQsSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmICB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCwgTmdiTW9kYWxSZWYgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCxkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlLCBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgSlNaaXAgZnJvbSAnanN6aXAnO1xyXG5pbXBvcnQge0RlbGV0ZUxheW91dENvbXBvbmVudH0gZnJvbSAnLi4vY3JlYXRlLWxheW91dC9wb3B1cHMvZGVsZXRlLWxheW91dC9kZWxldGUtbGF5b3V0LmNvbXBvbmVudCdcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXN0b3JlLWxheW91dC10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3N0b3JlLWxheW91dC10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3N0b3JlLWxheW91dC10YWJsZS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFN0b3JlTGF5b3V0VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKCdmaWxlJykgZmlsZUlucHV0ITogRWxlbWVudFJlZjtcclxuICBsb2FkaW5nOmJvb2xlYW4gPSB0cnVlO1xyXG4gIHNlbGVjdGVkVGFiOnN0cmluZyA9ICdsYXlvdXRCdWlsZGVyJztcclxuICBmbG9vck5vOm51bWJlcj0xO1xyXG4gIHNlYXJjaFN0b3JlOnN0cmluZztcclxuICBzdG9yZUxpc3Q6YW55W10gPSBbXVxyXG4gIHN0b3JlOmFueVtdID0gW107XHJcbiAgcGFnaW5hdGlvblNpemVzOmFueSA9IFtdO1xyXG4gIHNlbGVjdGVkU3RvcmU6YW55ID0ge307XHJcbiAgc2hvd0Ryb3BEb3duOmJvb2xlYW4gPSBmYWxzZTtcclxuICB0b3RhbEl0ZW1zOm51bWJlcjtcclxuICBkeW5hbWljRGF0YTphbnkgPSB7XHJcbiAgICBjbGllbnRJZDonJyxcclxuICAgIGxpbWl0OjEwLFxyXG4gICAgb2Zmc2V0OjEsXHJcbiAgICBzZWFyY2hWYWx1ZTonJyxcclxuICAgIHNvcnRDb2x1bW5OYW1lOicnLFxyXG4gICAgc29ydEJ5OicnLFxyXG4gICAgZmlsdGVyOltdXHJcbiAgfVxyXG4gIGxheW91dExpc3Q6YW55ID0gW107XHJcbiAgcGFnZVNpemU6YW55PTEwO1xyXG4gIGRhdGFPYmplY3Q6IGFueSA9IFtcclxuICAgIHtcclxuICAgICAgRGVzY3JpcHRpb246ICdzdGF0dXMnLFxyXG4gICAgICBJc3N1ZXM6IFtcclxuICAgICAgICB7IHRleHQ6ICdEcmFmdCcsIGlkOiAnZHJhZnQnIH0sXHJcbiAgICAgICAgeyB0ZXh0OiAnQ29tcGxldGVkJywgaWQ6ICdjb21wbGV0ZWQnIH0sXHJcbiAgICAgIF0sXHJcbiAgICB9LFxyXG4gIF07XHJcbiAgZXJyb3I6YW55ID0gW107XHJcbiAgZXhjZWxEYXRhOmFueTtcclxuICBzaG93Tm9EYXRhOmJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG4gIHByaXZhdGUgc2NhbGUgPSAxO1xyXG4gIGdyaWRXaWR0aCA9IDU7XHJcbiAgZ3JpZEhlaWdodCA9IDU7XHJcbiAgcGl4ZWxTaXplOmFueSA9IDUwO1xyXG4gIEBWaWV3Q2hpbGQoJ2NyZWF0ZUJ1aWxkZXInKSBjcmVhdGVCdWlsZGVyOiBhbnk7XHJcbiAgQFZpZXdDaGlsZCgndXBsb2FkQnVpbGRlcicpIHVwbG9hZEJ1aWxkZXI6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RhbERlZjpOZ2JNb2RhbCxwcml2YXRlIHBhZ2VJbmZvOlBhZ2VJbmZvU2VydmljZSxwcml2YXRlIHRvYXN0OlRvYXN0U2VydmljZSxwcml2YXRlIGdzOkdsb2JhbFN0YXRlU2VydmljZSxwcml2YXRlIGJ1aWxkZXJTZXJ2aWNlOlN0b3JlQnVpbGRlclNlcnZpY2UscHJpdmF0ZSBSb3V0ZXI6Um91dGVyKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0UGFnZURhdGEoKTtcclxuICAgIGxldCBnZXREZXRhaWxzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSBhcyBzdHJpbmcpXHJcbiAgICBjb25zb2xlLmxvZyhnZXREZXRhaWxzKVxyXG4gICAgaWYoZ2V0RGV0YWlscykgIHtcclxuICAgICAgdGhpcy5keW5hbWljRGF0YS5jbGllbnRJZCA9IGdldERldGFpbHM/LmNsaWVudCB8fCBnZXREZXRhaWxzPy5jbGllbnRzPy5bMF0gfHwgZ2V0RGV0YWlscz8uY2xpZW50cz8uWzFdO1xyXG4gICAgICB0aGlzLmdldExheW91dExpc3QoKTtcclxuICAgICAgdGhpcy5nZXRTdG9yZUxpc3QoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBzZXRQYWdlRGF0YSgpIHtcclxuICAgIHRoaXMucGFnZUluZm8uc2V0VGl0bGUoXCJQbGFub2dyYW1cIik7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldERlc2NyaXB0aW9uKFwiXCIpO1xyXG4gICAgdGhpcy5wYWdlSW5mby5zZXRCcmVhZGNydW1icyhbXSk7XHJcbiAgfVxyXG5cclxuICBnZXRMYXlvdXRMaXN0KCkge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMubGF5b3V0TGlzdCA9IFtdO1xyXG4gICAgdGhpcy5idWlsZGVyU2VydmljZS5sYXlvdXRMaXN0KHRoaXMuZHluYW1pY0RhdGEpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCBkZWJvdW5jZVRpbWUoMzAwKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDoocmVzOmFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmKHJlcyAmJiByZXM/LmRhdGE/LmRhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dOb0RhdGEgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMubGF5b3V0TGlzdCA9IHJlcy5kYXRhLmRhdGE7XHJcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSByZXMuZGF0YS5jb3VudDtcclxuICAgICAgICAgIGlmKHRoaXMudG90YWxJdGVtcyA8IDkpIHtcclxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbdGhpcy50b3RhbEl0ZW1zXTtcclxuICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMudG90YWxJdGVtcztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25TaXplcyA9IFsxMCwyMCwzMF07XHJcbiAgICAgICAgICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLmR5bmFtaWNEYXRhLmxpbWl0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmKHRoaXMuZHluYW1pY0RhdGEuc2VhcmNoVmFsdWUubGVuZ3RoIHx8IHRoaXMuZHluYW1pY0RhdGEuZmlsdGVyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dOb0RhdGEgPSBmYWxzZTtcclxuICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zaG93Tm9EYXRhID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubGF5b3V0TGlzdCA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6KGVycjphbnkpID0+e1xyXG4gICAgICAgIHRoaXMuc2hvd05vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yIHx8ICdTb21ldGhpbmcgd2VudCB3cm9uZycpXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RvcmVMaXN0KCkge1xyXG4gICAgbGV0IGRhdGEgPSB7XHJcbiAgICBcImNsaWVudElkXCI6IFt0aGlzLmR5bmFtaWNEYXRhLmNsaWVudElkXSxcclxuICAgIFwib2Zmc2V0XCI6IDEsXHJcbiAgICBcImxpbWl0XCI6IDEwMDAwLFxyXG4gICAgXCJzb3J0Q29sdW1OYW1lXCI6IFwic3RvcmVJZFwiLFxyXG4gICAgXCJzb3J0QnlcIjogLTEsXHJcbiAgICBcInNlYXJjaFZhbHVlXCI6IFwiXCIsXHJcbiAgICBcImV4cG9ydFwiOiBmYWxzZSxcclxuICAgIFwic3RhdHVzXCI6IFtcclxuICAgICAgICBcIkxpdmVcIixcclxuICAgICAgICBcIm9uYm9hcmRlZFwiLFxyXG4gICAgICAgIFwiZGVwbG95ZWRcIixcclxuICAgICAgICBcInBhaXJlZFwiLFxyXG4gICAgICAgIFwiaW5zdGFsbGF0aW9uZmFpbGVkXCIsXHJcbiAgICAgICAgXCJJbmZyYSBJc3N1ZVwiXHJcbiAgICBdXHJcbiAgIH1cclxuICAgdGhpcy5idWlsZGVyU2VydmljZS5nZXRTdG9yZUxpc3QoZGF0YSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgaWYocmVzICYmIHJlcy5jb2RlID09IDIwMCAmJiByZXMuZGF0YS5yZXN1bHQubGVuZ3RoKSB7XHJcbiAgICAgIGxldCBzdG9yZXM6YW55ID0gW107XHJcbiAgICAgIHJlcy5kYXRhLnJlc3VsdC5mb3JFYWNoKChpdGVtOmFueSkgPT4ge1xyXG4gICAgICAgIHN0b3Jlcy5wdXNoKHtcclxuICAgICAgICAgIG5hbWU6aXRlbS5zdG9yZU5hbWUsXHJcbiAgICAgICAgICBpZDppdGVtLnN0b3JlSWRcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLnN0b3JlTGlzdCA9IHRoaXMuc3RvcmUgPSAgc3RvcmVzO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICB9XHJcbiAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlGaWx0ZXJzKGV2ZW50OmFueSkge1xyXG4gICAgdGhpcy5keW5hbWljRGF0YS5saW1pdCA9IDEwO1xyXG4gICAgdGhpcy5keW5hbWljRGF0YS5maWx0ZXIgPSBldmVudD8uWzBdPy5Jc3N1ZXMubWFwKChlbGU6YW55KSA9PiBlbGUuaWQpO1xyXG4gICAgdGhpcy5nZXRMYXlvdXRMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBCdWlsZGVyQ3JlYXRlKCkge1xyXG4gICAgdGhpcy5zaG93RHJvcERvd24gPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZSA9IHt9O1xyXG4gICAgdGhpcy5mbG9vck5vID0gMTtcclxuICAgIHRoaXMubW9kYWxEZWYub3Blbih0aGlzLmNyZWF0ZUJ1aWxkZXIse2NlbnRlcmVkOnRydWV9KTtcclxuICB9XHJcblxyXG4gIGZsb29yRGVjKCkge1xyXG4gICAgaWYodGhpcy5mbG9vck5vID49IDIpIHtcclxuICAgICAgdGhpcy5mbG9vck5vLS07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmbG9vckluYygpIHtcclxuICAgIHRoaXMuZmxvb3JObysrO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyU2VhcmNoKCkge1xyXG4gICAgaWYodGhpcy5zZWFyY2hTdG9yZS50cmltKCkubGVuZ3RoKSB7XHJcbiAgICAgIGxldCBzdG9yZSA9IHRoaXMuc2VhcmNoU3RvcmUuc3BsaXQoJywnKTtcclxuICAgICAgaWYoc3RvcmUubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHN0b3JlID0gc3RvcmUubWFwKChpdGVtOmFueSkgPT4gaXRlbS50cmltKCkudG9Mb3dlckNhc2UoKSlcclxuICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IHRoaXMuc3RvcmUuZmlsdGVyKChpdGVtOmFueSkgPT4gc3RvcmUuaW5jbHVkZXMoaXRlbS5uYW1lLnRvTG93ZXJDYXNlKCkpKVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gdGhpcy5zdG9yZS5maWx0ZXIoKGl0ZW06YW55KSA9PiBpdGVtLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaFN0b3JlLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RvcmVMaXN0ID0gWy4uLnRoaXMuc3RvcmVdXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWxlY3RlZFN0b3JlKGluZGV4Om51bWJlcil7XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmUgPSB0aGlzLnN0b3JlTGlzdFtpbmRleF07XHJcbiAgICB0aGlzLmNsb3NlRHJvcERvd24oKTtcclxuICB9XHJcblxyXG4gIGNsb3NlRHJvcERvd24oKSB7XHJcbiAgICB0aGlzLnNob3dEcm9wRG93biA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRHJvcERvd24oKSB7XHJcbiAgICB0aGlzLnNob3dEcm9wRG93biA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVMYXlvdXQoKSB7XHJcbiAgICBsZXQgcGFyYW1zID0ge1xyXG4gICAgICBzdG9yZU5hbWU6dGhpcy5zZWxlY3RlZFN0b3JlLm5hbWUsXHJcbiAgICAgIHN0b3JlSWQ6dGhpcy5zZWxlY3RlZFN0b3JlLmlkLFxyXG4gICAgICBjbGllbnRJZDp0aGlzLmR5bmFtaWNEYXRhLmNsaWVudElkLFxyXG4gICAgICBmbG9vck51bWJlcjp0aGlzLmZsb29yTm8sXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5idWlsZGVyU2VydmljZS5jcmVhdGVMYXlvdXQocGFyYW1zKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgZGVib3VuY2VUaW1lKDMwMCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6KHJlczphbnkpID0+e1xyXG4gICAgICAgIGlmKHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzPy5tZXNzYWdlIHx8ICdMYXlvdXQgY3JlYXRlZCBzdWNjZXNzZnVsbHknKTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZSA9e307XHJcbiAgICAgICAgICB0aGlzLmZsb29yTm8gPSAxO1xyXG4gICAgICAgICAgdGhpcy5tb2RhbERlZi5kaXNtaXNzQWxsKCk7XHJcbiAgICAgICAgICB0aGlzLlJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGAvbWFuYWdlL3BsYW5vZ3JhbS9sYXlvdXQtYnVpbGRlci9jcmVhdGU/aWQ9JHtyZXMuZGF0YS5pZH1gKVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6KGVycjphbnkpID0+e1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycilcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgfHwgJ1NvbWV0aGluZyB3ZW50IHdyb25nJylcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VDaGFuZ2UoZXZlbnQ6YW55KSB7XHJcbiAgICB0aGlzLmR5bmFtaWNEYXRhLm9mZnNldCA9IGV2ZW50O1xyXG4gICAgdGhpcy5nZXRMYXlvdXRMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKGV2ZW50OmFueSkge1xyXG4gICAgdGhpcy5keW5hbWljRGF0YS5vZmZzZXQgPSAxO1xyXG4gICAgdGhpcy5keW5hbWljRGF0YS5saW1pdCA9IGV2ZW50O1xyXG4gICAgdGhpcy5nZXRMYXlvdXRMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBzZWFyY2goKSB7XHJcbiAgICB0aGlzLmR5bmFtaWNEYXRhLmxpbWl0ID0gMTA7XHJcbiAgICB0aGlzLmR5bmFtaWNEYXRhLm9mZnNldCA9IDE7XHJcbiAgICB0aGlzLmR5bmFtaWNEYXRhLnNvcnRDb2x1bW5OYW1lID0gJyc7XHJcbiAgICB0aGlzLmR5bmFtaWNEYXRhLnNvcnRCeSA9ICcnO1xyXG4gICAgdGhpcy5nZXRMYXlvdXRMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBvblNvcnQoZGF0YTphbnkpIHtcclxuICAgIHRoaXMuZHluYW1pY0RhdGEub2Zmc2V0ID0gMTtcclxuICAgIGlmKHRoaXMuZHluYW1pY0RhdGEuc29ydENvbHVtbk5hbWUgPT0gZGF0YSkge1xyXG4gICAgICB0aGlzLmR5bmFtaWNEYXRhLnNvcnRCeSA9IHRoaXMuZHluYW1pY0RhdGEuc29ydEJ5ID09IDEgPyAtMSA6IDE7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5keW5hbWljRGF0YS5zb3J0QnkgPSAxO1xyXG4gICAgICB0aGlzLmR5bmFtaWNEYXRhLnNvcnRDb2x1bW5OYW1lID0gZGF0YTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0TGF5b3V0TGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SGVhZGVyc0Zyb21TaGVldChzaGVldDogYW55KTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgaGVhZGVyczogc3RyaW5nW10gPSBbXTtcclxuICAgIGNvbnN0IHJhbmdlID0gWExTWC51dGlscy5kZWNvZGVfcmFuZ2Uoc2hlZXRbJyFyZWYnXSk7XHJcbiAgICBcclxuICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgY29sdW1ucyBpbiB0aGUgZmlyc3Qgcm93XHJcbiAgICBmb3IgKGxldCBjb2wgPSByYW5nZS5zLmM7IGNvbCA8PSByYW5nZS5lLmM7IGNvbCsrKSB7XHJcbiAgICAgIGNvbnN0IGNlbGwgPSBzaGVldFtYTFNYLnV0aWxzLmVuY29kZV9jZWxsKHsgcjogcmFuZ2Uucy5yLCBjOiBjb2wgfSldO1xyXG4gICAgICBpZiAoY2VsbCkge1xyXG4gICAgICAgIGhlYWRlcnMucHVzaChjZWxsLnYpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaGVhZGVycztcclxuICB9XHJcblxyXG4gIG9uRmlsZVVwbG9hZChldmVudDphbnkpIHtcclxuICAgIGxldCBkYXRhOiBhbnk7XHJcbiAgICBjb25zdCB0YXJnZXQ6IERhdGFUcmFuc2ZlciA9IDxEYXRhVHJhbnNmZXI+KGV2ZW50LnRhcmdldCk7XHJcbiAgICBsZXQgaXNFeGNlbEZpbGUgPSAhIXRhcmdldC5maWxlc1swXS5uYW1lLm1hdGNoKC8oLnhsc3wueGxzeCkvKTtcclxuICAgIHRoaXMuZXJyb3IgPSBbXTtcclxuXHJcbiAgICBpZiAoaXNFeGNlbEZpbGUpIHtcclxuICAgICAgY29uc3QgcmVhZGVyOiBGaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyh0YXJnZXQuZmlsZXNbMF0pO1xyXG4gICAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJzdHI6IHN0cmluZyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgICBjb25zdCB3YjogWExTWC5Xb3JrQm9vayA9IFhMU1gucmVhZChic3RyLCB7IHR5cGU6ICdiaW5hcnknIH0pO1xyXG4gICAgICAgIGNvbnN0IHdzbmFtZTogc3RyaW5nID0gd2IuU2hlZXROYW1lc1swXTtcclxuICAgICAgICBjb25zdCB3czogWExTWC5Xb3JrU2hlZXQgPSB3Yi5TaGVldHNbd3NuYW1lXTtcclxuICAgICAgICBkYXRhID0gWExTWC51dGlscy5zaGVldF90b19qc29uKHdzKTtcclxuICAgICAgICBjb25zdCB3b3Jrc2hlZXQgPSB3Yi5TaGVldHNbd2IuU2hlZXROYW1lc1swXV07XHJcblxyXG4gICAgICAgIC8vIEdldCB0aGUgaGVhZGVyIHJvdyAoZmlyc3Qgcm93KVxyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmdldEhlYWRlcnNGcm9tU2hlZXQod29ya3NoZWV0KTtcclxuICAgICAgICBpZighZGF0YS5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgICAgICAgIHJldHVybiB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1BsZWFzZSBlbnRlciB2YWx1ZXMnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHN0b3JlTGlzdDphbnkgPSBbXTtcclxuICAgICAgICBsZXQgZW1wdHlMaXN0OmFueT1bXTtcclxuICAgICAgICBkYXRhLmZvckVhY2goKGl0ZW06YW55LGluZGV4OmFueSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGdldFZhbHVlID0gaGVhZGVycy5maWx0ZXIoa2V5ID0+IGl0ZW1ba2V5XSA9PT0gbnVsbCB8fCBpdGVtW2tleV0gPT09ICcnIHx8IGl0ZW1ba2V5XSA9PSB1bmRlZmluZWQpO1xyXG4gICAgICAgICAgaWYoZ2V0VmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGdldFZhbHVlLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICBsZXQgbGV0dGVyID0gaXRlbSA9PSAnU3RvcmUgTmFtZScgPyAnQScgOiBpdGVtID09ICdOby5vZi5GbG9vcnMnID8gJ0InIDogaXRlbSA9PSAnU3RlcCcgPyAnQycgOiBpdGVtID09ICdFbGVtZW50cycgPyAnRCcgOiBpdGVtID09ICdNZWFzdXJlbWVudHMoZnQpJyA/ICdFJyA6IGl0ZW0gPT0gJ2RpcmVjdGlvbicgPyAnRicgOiAnRyc7XHJcbiAgICAgICAgICAgICAgZW1wdHlMaXN0LnB1c2gobGV0dGVyICsgcGFyc2VJbnQoaW5kZXggKyAyKSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgY2hlY2tEdXBsaWNhdGUgPSBzdG9yZUxpc3QuZmluZEluZGV4KChlbGU6YW55KSA9PiBlbGUuc3RvcmVOYW1lLnRyaW0oKSA9PSBpdGVtWydTdG9yZSBOYW1lJ10udHJpbSgpICYmIGVsZS5mbG9vck51bWJlciA9PSBpdGVtWydOby5vZi5GbG9vcnMnXSAmJiBlbGUuc3RlcCA9PSBpdGVtWydTdGVwJ10pXHJcbiAgICAgICAgICAgIGlmKGNoZWNrRHVwbGljYXRlID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgc3RvcmVMaXN0LnB1c2goXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIHN0b3JlTmFtZTppdGVtWydTdG9yZSBOYW1lJ10udHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgICBmbG9vck51bWJlcjppdGVtWydOby5vZi5GbG9vcnMnXSxcclxuICAgICAgICAgICAgICAgICAgc3RlcDppdGVtWydTdGVwJ10sXHJcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOml0ZW1bJ0VsZW1lbnRzJ10gID09ICdHbGFzcy9GYWNhZGUnID8gJ2ZhY2FkZScgOiBpdGVtWydFbGVtZW50cyddLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgICAgICAgIGRpc3RhbmNlOml0ZW1bJ01lYXN1cmVtZW50cyhmdCknXSxcclxuICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOml0ZW1bJ0RpcmVjdGlvbiddLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgICAgICAgIGRlZ3JlZTppdGVtWydEZWdyZWUnXVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmVycm9yLnB1c2goe2luZGV4OmluZGV4ICsgMixtZXNzYWdlOidEdXBsaWNhdGUgU3RlcCcsRXhpc3RJbmRleDpjaGVja0R1cGxpY2F0ZSArIDIsc2VyaWVzOidDJ30pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICBpZihlbXB0eUxpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhlbXB0eUxpc3QpXHJcbiAgICAgICAgICB0aGlzLmVycm9yLnB1c2goe2luZGV4OmVtcHR5TGlzdC50b1N0cmluZygpLG1lc3NhZ2U6J01pc3NpbmcgRmllbGQnfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB1bmlxdWVTdG9yZSA9IFsuLi5uZXcgU2V0KHN0b3JlTGlzdC5tYXAoKGVsZTphbnkpID0+IGVsZS5zdG9yZU5hbWUpKV07XHJcbiAgICAgICAgdGhpcy5leGNlbERhdGEgPSB7XHJcbiAgICAgICAgICB0b3RhbFN0b3JlOnVuaXF1ZVN0b3JlLmxlbmd0aCxcclxuICAgICAgICAgIHRvdGFsUm93OiBkYXRhLmxlbmd0aCxcclxuICAgICAgICAgIHRvdGFsRXJyb3I6dGhpcy5lcnJvci5sZW5ndGhcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5lcnJvcilcclxuICAgICAgICBpZih0aGlzLmVycm9yLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5tb2RhbERlZi5kaXNtaXNzQWxsKCk7XHJcbiAgICAgICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgICAgICB0aGlzLm1vZGFsRGVmLm9wZW4odGhpcy51cGxvYWRCdWlsZGVyLHtjZW50ZXJlZDp0cnVlfSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYnVpbGRlclNlcnZpY2UuQnVsa1VwbG9hZCh7ZGF0YTpzdG9yZUxpc3QsY2xpZW50SWQ6dGhpcy5keW5hbWljRGF0YS5jbGllbnRJZH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCBkZWJvdW5jZVRpbWUoMzAwKSkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6KHJlczphbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tb2RhbERlZi5kaXNtaXNzQWxsKCk7XHJcbiAgICAgICAgICAgIGlmKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzPy5tZXNzYWdlIHx8ICdCdWxrIHN0b3JlIHVwbG9hZCBzdWNjZXNzZnVsbHknKTtcclxuICAgICAgICAgICAgICB0aGlzLlJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGAvbWFuYWdlL3BsYW5vZ3JhbS9sYXlvdXQtYnVpbGRlci9jcmVhdGU/aWQ9JHtyZXMuZGF0YS5pZH1gKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6KGVycjphbnkpID0+e1xyXG4gICAgICAgICAgICB0aGlzLm1vZGFsRGVmLmRpc21pc3NBbGwoKTtcclxuICAgICAgICAgICAgaWYoZXJyPy5lcnJvcj8uZXJyb3IpIHtcclxuICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBlcnI/LmVycm9yPy5lcnJvcjtcclxuICAgICAgICAgICAgICBlcnJvci5mb3JFYWNoKChlcnI6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZXJyb3JLZXk6YW55ID0gW107XHJcbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKGVsZTphbnksaW5kZXg6YW55KSA9PntcclxuICAgICAgICAgICAgICAgICAgbGV0IGZpbmRFeGlzdHMgPSBlcnIudmFsdWUuZmluZCgoZWxlbTphbnkpID0+IGVsZW0gPT0gZWxlWydTdG9yZSBOYW1lJ10pO1xyXG4gICAgICAgICAgICAgICAgICBpZihmaW5kRXhpc3RzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JLZXkucHVzaChgQSR7aW5kZXgrMn1gKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvci5wdXNoKHtpbmRleDplcnJvcktleS50b1N0cmluZygpLG1lc3NhZ2U6ZXJyLm1lc3NhZ2V9KTtcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIHRoaXMuZXhjZWxEYXRhLnRvdGFsRXJyb3IgPSB0aGlzLmVycm9yLmxlbmd0aDtcclxuICAgICAgICAgICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgICAgdGhpcy5tb2RhbERlZi5vcGVuKHRoaXMudXBsb2FkQnVpbGRlcix7Y2VudGVyZWQ6dHJ1ZX0pO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1BsZWFzZSB1cGxvYWQgeGxzeCBmaWxlJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIFJldXBsb2FkKCkge1xyXG4gICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgbGV0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd4bHN4VXBsb2FkJyk7XHJcbiAgICBlbGU/LmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBzaG93RGVsZXRlRHJvcERvd24oaTphbnkpIHtcclxuICAgIHRoaXMubGF5b3V0TGlzdC5mb3JFYWNoKChpdGVtOmFueSxpbmRleDphbnkpID0+IHtcclxuICAgICAgaWYoaSA9PSBpbmRleCkge1xyXG4gICAgICAgIGl0ZW0uZGVsZXRlSW5kZXggPSBpdGVtPy5kZWxldGVJbmRleCA/IGZhbHNlIDogdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpdGVtLmRlbGV0ZUluZGV4ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBkZWxldGVMYXlvdXQoaWQ6YW55KSB7XHJcbiAgICBsZXQgbW9kZWxSZWYgPSB0aGlzLm1vZGFsRGVmLm9wZW4oRGVsZXRlTGF5b3V0Q29tcG9uZW50LHtjZW50ZXJlZDp0cnVlfSk7XHJcbiAgICBtb2RlbFJlZi5yZXN1bHQudGhlbigocmVzKSA9PntcclxuICAgICAgaWYocmVzLm1lc3NhZ2UgPT0gJ2NvbmZpcm0nKSB7XHJcbiAgICAgICAgdGhpcy5idWlsZGVyU2VydmljZS5kZWxldGVMYXlvdXQoaWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCBkZWJvdW5jZVRpbWUoMzAwKSkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6KHJlczphbnkpID0+e1xyXG4gICAgICAgICAgICBpZihyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzPy5tZXNzYWdlIHx8ICdMYXlvdXQgZGVsZXRlZCBzdWNjZXNzZnVsbHknKTtcclxuICAgICAgICAgICAgICB0aGlzLmdldExheW91dExpc3QoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOihlcnJvcjphbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycm9yPy5lcnJvcj8uZXJyb3IgfHwgJ1NvbWV0aGluZyB3ZW50IHdyb25nJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBub3JtYWxpemVkUGl4ZWxQZXJNZXRyZShwb2x5Z29uOiBhbnkpOiBudW1iZXIge1xyXG4gICAgY29uc3QgTUlOX1BJWEVMU19QRVJfTUVURVIgPSA1MDtcclxuICAgIGNvbnN0IE1BWF9QSVhFTFNfUEVSX01FVEVSID0gMTUwO1xyXG5cclxuICAgIGxldCB0b3RhbExlbmd0aCA9IDA7XHJcbiAgICBsZXQgbGluZUNvdW50ID0gMDtcclxuXHJcbiAgICBwb2x5Z29uLmZvckVhY2goKGxpbmU6IGFueSkgPT4ge1xyXG4gICAgICBpZiAobGluZS51bml0ID09PSAnZnQnKSB7XHJcbiAgICAgICAgdG90YWxMZW5ndGggPSB0b3RhbExlbmd0aCArIChsaW5lLmRpc3RhbmNlICogMy4yODA4NCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdG90YWxMZW5ndGggPSB0b3RhbExlbmd0aCArIGxpbmUuZGlzdGFuY2U7XHJcbiAgICAgIH1cclxuICAgICAgbGluZUNvdW50Kys7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBhdmVyYWdlTGVuZ3RoID0gbGluZUNvdW50ID4gMCA/IHRvdGFsTGVuZ3RoIC8gbGluZUNvdW50IDogMDtcclxuXHJcbiAgICBjb25zdCBNQVhfQVZFUkFHRV9MRU5HVEggPSA1MDtcclxuICAgIGNvbnN0IE1JTl9BVkVSQUdFX0xFTkdUSCA9IDU7XHJcblxyXG4gICAgY29uc3Qgbm9ybWFsaXplZExlbmd0aCA9IE1hdGgubWluKFxyXG4gICAgICBNYXRoLm1heChhdmVyYWdlTGVuZ3RoLCBNSU5fQVZFUkFHRV9MRU5HVEgpLFxyXG4gICAgICBNQVhfQVZFUkFHRV9MRU5HVEhcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgcGl4ZWxzUGVyTWV0ZXIgPVxyXG4gICAgICBNQVhfUElYRUxTX1BFUl9NRVRFUiAtXHJcbiAgICAgICgobm9ybWFsaXplZExlbmd0aCAtIE1JTl9BVkVSQUdFX0xFTkdUSCkgLyAoTUFYX0FWRVJBR0VfTEVOR1RIIC0gTUlOX0FWRVJBR0VfTEVOR1RIKSkgKlxyXG4gICAgICAoTUFYX1BJWEVMU19QRVJfTUVURVIgLSBNSU5fUElYRUxTX1BFUl9NRVRFUik7XHJcblxyXG4gICAgcmV0dXJuIE1hdGgucm91bmQocGl4ZWxzUGVyTWV0ZXIpO1xyXG4gIH1cclxuXHJcbiAgY29udmVydFRvUGl4ZWxzKHZhbHVlOiBudW1iZXIsIHVuaXQ6ICdmdCcgfCAnbScpOiBudW1iZXIge1xyXG4gICAgY29uc3QgUElYRUxTX1BFUl9NRVRFUiA9IHRoaXMucGl4ZWxTaXplO1xyXG4gICAgY29uc3QgUElYRUxTX1BFUl9GT09UID0gUElYRUxTX1BFUl9NRVRFUiAvIDMuMjgwODQ7XHJcblxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicgfHwgdmFsdWUgPCAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgY2FzZSAnbSc6XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlICogUElYRUxTX1BFUl9NRVRFUjtcclxuICAgICAgY2FzZSAnZnQnOlxyXG4gICAgICAgIHJldHVybiB2YWx1ZSAqIFBJWEVMU19QRVJfRk9PVDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHVuaXQuIFN1cHBvcnRlZCB1bml0cyBhcmUgJ210JyBmb3IgbWV0ZXJzIGFuZCAnZnQnIGZvciBmZWV0LlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNuYXBUb0dyaWQodmFsdWU6IG51bWJlciwgZ3JpZFNpemU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAvIGdyaWRTaXplKSAqIGdyaWRTaXplO1xyXG4gIH1cclxuXHJcbiAgZG93bmxvYWQoZGF0YTphbnkpIHtcclxuICAgIHRoaXMuYnVpbGRlclNlcnZpY2UuZ2V0UGxhbm8oe2lkOltkYXRhLl9pZF19KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgZGVib3VuY2VUaW1lKDMwMCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6KHJlczphbnkpID0+e1xyXG4gICAgICAgIGlmKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMub25FeHBvcnRBc1ppcChkYXRhLnN0b3JlTmFtZSxyZXMuZGF0YVswXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjooZXJyb3I6YW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycm9yPy5lcnJvcj8uZXJyb3IgfHwgJ1NvbWV0aGluZyB3ZW50IHdyb25nJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25FeHBvcnRBc1ppcChzdG9yZTpTdHJpbmcsZGF0YTphbnkpIHtcclxuICAgIGNvbnN0IHppcCA9IG5ldyBKU1ppcCgpO1xyXG4gICAgY29uc3QgcGFkZGluZyA9IDEwMDtcclxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykhO1xyXG4gICAgY2FudmFzLndpZHRoID0gMTAwMDA7IFxyXG4gICAgY2FudmFzLmhlaWdodCA9IDEwMDAwO1xyXG4gIFxyXG4gICAgY29uc3QgY2VudGVyWCA9IGNhbnZhcy53aWR0aCAvIDIgLyB0aGlzLnNjYWxlO1xyXG4gICAgY29uc3QgY2VudGVyWSA9IGNhbnZhcy5oZWlnaHQgLyAyIC8gdGhpcy5zY2FsZTtcclxuICBcclxuICAgIGxldCBjdXJyZW50UG9pbnQgPSB7XHJcbiAgICAgIHg6IHRoaXMuc25hcFRvR3JpZChjZW50ZXJYLCB0aGlzLmdyaWRIZWlnaHQpLFxyXG4gICAgICB5OiB0aGlzLnNuYXBUb0dyaWQoY2VudGVyWSwgdGhpcy5ncmlkV2lkdGgpLFxyXG4gICAgfTtcclxuICBcclxuICAgIGNvbnN0IHJlbmRlckNhbnZhcyA9IGFzeW5jIChsYXlvdXRQb2x5Z29uOiBhbnlbXSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgICAgIGNvbnN0IGV4cG9ydExheW91dDogYW55W10gPSBbXTtcclxuICBcclxuICAgICAgbGF5b3V0UG9seWdvbi5mb3JFYWNoKChpbnN0cnVjdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmFkaWFuczogbnVtYmVyID0ge1xyXG4gICAgICAgICAgdXA6ICgoMTgwIC0gaW5zdHJ1Y3Rpb24uYW5nbGUpICogTWF0aC5QSSkgLyAxODAsXHJcbiAgICAgICAgICBsZWZ0OiAoKDI3MCAtIGluc3RydWN0aW9uLmFuZ2xlKSAqIE1hdGguUEkpIC8gMTgwLFxyXG4gICAgICAgICAgZG93bjogKCgzNjAgLSBpbnN0cnVjdGlvbi5hbmdsZSkgKiBNYXRoLlBJKSAvIDE4MCxcclxuICAgICAgICAgIHJpZ2h0OiAoKDkwIC0gaW5zdHJ1Y3Rpb24uYW5nbGUpICogTWF0aC5QSSkgLyAxODAsXHJcbiAgICAgICAgfVtpbnN0cnVjdGlvbi5kaXJlY3Rpb24gYXMgJ3VwJyB8ICdsZWZ0JyB8ICdkb3duJyB8ICdyaWdodCddO1xyXG4gICAgICAgIGlmIChyYWRpYW5zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkaXJlY3Rpb246ICR7aW5zdHJ1Y3Rpb24uZGlyZWN0aW9ufWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBpeGVsU2l6ZSA9IHRoaXMubm9ybWFsaXplZFBpeGVsUGVyTWV0cmUobGF5b3V0UG9seWdvbik7XHJcbiAgICAgICAgY29uc3QgZGlzdGFuY2VJblBpeGVscyA9IHRoaXMuY29udmVydFRvUGl4ZWxzKGluc3RydWN0aW9uLmRpc3RhbmNlLCBpbnN0cnVjdGlvbi51bml0KTtcclxuICAgICAgICBjb25zdCBuZXdYID0gY3VycmVudFBvaW50LnggKyBNYXRoLmNvcyhyYWRpYW5zKSAqIGRpc3RhbmNlSW5QaXhlbHM7XHJcbiAgICAgICAgY29uc3QgbmV3WSA9IGN1cnJlbnRQb2ludC55IC0gTWF0aC5zaW4ocmFkaWFucykgKiBkaXN0YW5jZUluUGl4ZWxzO1xyXG4gICAgICAgIGNvbnN0IG5ld1BvaW50ID0ge1xyXG4gICAgICAgICAgeDogdGhpcy5zbmFwVG9HcmlkKG5ld1gsIHRoaXMuZ3JpZFdpZHRoKSxcclxuICAgICAgICAgIHk6IHRoaXMuc25hcFRvR3JpZChuZXdZLCB0aGlzLmdyaWRIZWlnaHQpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgbGluZVNlZ21lbnQgPSBbXHJcbiAgICAgICAgICBjdXJyZW50UG9pbnQsXHJcbiAgICAgICAgICBuZXdQb2ludCxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZWxlbWVudFR5cGU6IGluc3RydWN0aW9uLmVsZW1lbnRUeXBlLFxyXG4gICAgICAgICAgICBkaXN0YW5jZTogaW5zdHJ1Y3Rpb24uZGlzdGFuY2UsXHJcbiAgICAgICAgICAgIHVuaXQ6IGluc3RydWN0aW9uLnVuaXQsXHJcbiAgICAgICAgICAgIGRpcmVjdGlvbjogaW5zdHJ1Y3Rpb24uZGlyZWN0aW9uLFxyXG4gICAgICAgICAgICBhbmdsZTogaW5zdHJ1Y3Rpb24uYW5nbGUsXHJcbiAgICAgICAgICAgIGVsZW1lbnROdW1iZXI6IGluc3RydWN0aW9uLmVsZW1lbnROdW1iZXIsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgZXhwb3J0TGF5b3V0LnB1c2gobGluZVNlZ21lbnQpO1xyXG4gICAgICAgIGN1cnJlbnRQb2ludCA9IG5ld1BvaW50O1xyXG4gICAgICB9KTtcclxuICBcclxuICAgICAgbGV0IG1pblggPSBJbmZpbml0eSxcclxuICAgICAgICBtaW5ZID0gSW5maW5pdHksXHJcbiAgICAgICAgbWF4WCA9IC1JbmZpbml0eSxcclxuICAgICAgICBtYXhZID0gLUluZmluaXR5O1xyXG4gIFxyXG4gICAgICBleHBvcnRMYXlvdXQuZm9yRWFjaCgoW3BvaW50MSwgcG9pbnQyXSkgPT4ge1xyXG4gICAgICAgIFtwb2ludDEsIHBvaW50Ml0uZm9yRWFjaCgocG9pbnQpID0+IHtcclxuICAgICAgICAgIGlmIChwb2ludC54ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIHBvaW50LngpO1xyXG4gICAgICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgcG9pbnQueCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocG9pbnQueSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBwb2ludC55KTtcclxuICAgICAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHBvaW50LnkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgICAgbWluWCAtPSBwYWRkaW5nO1xyXG4gICAgICBtaW5ZIC09IHBhZGRpbmc7XHJcbiAgICAgIG1heFggKz0gcGFkZGluZztcclxuICAgICAgbWF4WSArPSBwYWRkaW5nO1xyXG4gIFxyXG4gICAgICBjYW52YXMud2lkdGggPSBtYXhYIC0gbWluWDtcclxuICAgICAgY2FudmFzLmhlaWdodCA9IG1heFkgLSBtaW5ZO1xyXG4gIFxyXG4gICAgICBjdHguZmlsbFN0eWxlID0gJ3doaXRlJztcclxuICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XHJcblxyXG4gICAgICBjdHguc2F2ZSgpO1xyXG4gICAgICBjdHgudHJhbnNsYXRlKC1taW5YLCAtbWluWSk7XHJcbiAgICAgIGN0eC5zY2FsZSh0aGlzLnNjYWxlLCB0aGlzLnNjYWxlKTtcclxuICBcclxuICAgICAgZnVuY3Rpb24gZHJhd0Fycm93aGVhZChjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGFuZ2xlOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gNTtcclxuICAgICAgICBjdHguc2F2ZSgpO1xyXG4gICAgICAgIGN0eC50cmFuc2xhdGUoeCwgeSk7XHJcbiAgICAgICAgY3R4LnJvdGF0ZShhbmdsZSk7XHJcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgICAgIGN0eC5tb3ZlVG8oMCwgMCk7XHJcbiAgICAgICAgY3R4LmxpbmVUbygtc2l6ZSwgLXNpemUgLyAyKTtcclxuICAgICAgICBjdHgubGluZVRvKC1zaXplLCBzaXplIC8gMik7XHJcbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xyXG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSAnYmxhY2snO1xyXG4gICAgICAgIGN0eC5maWxsKCk7XHJcbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgICBleHBvcnRMYXlvdXQuZm9yRWFjaCgoZWRnZSwgZWRnZUluZGV4KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcG9pbnQgPSBlZGdlWzBdO1xyXG4gICAgICAgIGNvbnN0IG5leHRQb2ludCA9IGVkZ2VbMV07XHJcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IGVkZ2VbMl07XHJcblxyXG4gICAgICAgIGlmIChlZGdlSW5kZXggPT09IDApIGN0eC5tb3ZlVG8ocG9pbnQueCwgcG9pbnQueSk7XHJcbiAgICAgICAgY3R4LmxpbmVUbyhuZXh0UG9pbnQueCwgbmV4dFBvaW50LnkpO1xyXG5cclxuICAgICAgICBjb25zdCBkeCA9IG5leHRQb2ludC54IC0gcG9pbnQueDtcclxuICAgICAgICBjb25zdCBkeSA9IG5leHRQb2ludC55IC0gcG9pbnQueTtcclxuICAgICAgICBjb25zdCBsZW5ndGggPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFggPSAoZHkgLyBsZW5ndGgpICogMjA7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0WSA9ICgtZHggLyBsZW5ndGgpICogMjA7XHJcblxyXG4gICAgICAgIGNvbnN0IGJveFBvaW50cyA9IFtcclxuICAgICAgICAgIHsgeDogcG9pbnQueCwgeTogcG9pbnQueSB9LFxyXG4gICAgICAgICAgeyB4OiBuZXh0UG9pbnQueCwgeTogbmV4dFBvaW50LnkgfSxcclxuICAgICAgICAgIHsgeDogbmV4dFBvaW50LnggKyBvZmZzZXRYLCB5OiBuZXh0UG9pbnQueSArIG9mZnNldFkgfSxcclxuICAgICAgICAgIHsgeDogcG9pbnQueCArIG9mZnNldFgsIHk6IHBvaW50LnkgKyBvZmZzZXRZIH0sXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgICAgIGN0eC5tb3ZlVG8oYm94UG9pbnRzWzBdLngsIGJveFBvaW50c1swXS55KTtcclxuICAgICAgICBib3hQb2ludHMuZm9yRWFjaCgocHQsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICBpZiAocHJvcGVydGllcy5lbGVtZW50VHlwZSA9PT0gJ2VudHJhbmNlJykge1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPCAyKSB7XHJcbiAgICAgICAgICAgICAgY3R4LmxpbmVUbyhwdC54LCBwdC55KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjdHgubGluZVRvKHB0LngsIHB0LnkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChwcm9wZXJ0aWVzLmVsZW1lbnRUeXBlID09PSAnb3BlbmluZycpIHtcclxuICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcclxuICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSAnI0Y5RkFGQic7XHJcbiAgICAgICAgICBjdHguZmlsbCgpO1xyXG5cclxuICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICcjRjlGQUZCJztcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgY3R4LnN0cm9rZSgpOyBcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xyXG4gICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjRjlGQUZCJztcclxuICAgICAgICAgIGN0eC5maWxsKCk7XHJcbiAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAnIzFEMjkzOSc7XHJcbiAgICAgICAgICBjdHguc3Ryb2tlKCk7IFxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGNvbnN0IHRleHRYID0gKGJveFBvaW50c1sxXS54ICsgYm94UG9pbnRzWzNdLngpIC8gMjtcclxuICAgICAgICBjb25zdCB0ZXh0WSA9IChib3hQb2ludHNbMV0ueSArIGJveFBvaW50c1szXS55KSAvIDI7XHJcblxyXG4gICAgICAgIGN0eC5zYXZlKCk7XHJcbiAgICAgICAgY3R4LnRyYW5zbGF0ZSh0ZXh0WCwgdGV4dFkpO1xyXG5cclxuICAgICAgICBpZiAoZHggPT09IDApIHtcclxuICAgICAgICAgIGN0eC5yb3RhdGUoLU1hdGguUEkgLyAyKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGR5ICE9PSAwKSB7XHJcbiAgICAgICAgICBjb25zdCBhbmdsZSA9IE1hdGguYXRhbjIoZHksIGR4KTtcclxuICAgICAgICAgIGN0eC5yb3RhdGUoYW5nbGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY3R4LmZvbnQgPSAnMTJweCBBcmlhbCc7XHJcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICdibGFjayc7XHJcbiAgICAgICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInO1xyXG4gICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcclxuICAgICAgICBjdHguZmlsbFRleHQoXHJcbiAgICAgICAgICBgJHtwcm9wZXJ0aWVzLmVsZW1lbnRUeXBlfSAke3Byb3BlcnRpZXMuZWxlbWVudE51bWJlcn0gLSAke3Byb3BlcnRpZXMuZGlzdGFuY2V9ICR7cHJvcGVydGllcy51bml0fWAsXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgMFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcclxuICAgICAgICBpZihwcm9wZXJ0aWVzLmRpc3RhbmNlID49IDQpe1xyXG4gICAgICAgICAgY29uc3QgY2VudGVyWCA9IHRleHRYO1xyXG4gICAgICAgICAgY29uc3QgY2VudGVyWSA9IHRleHRZO1xyXG4gICAgICAgICAgY29uc3QgcmlnaHRYID0gKGJveFBvaW50c1sxXS54ICsgYm94UG9pbnRzWzJdLngpIC8gMjtcclxuICAgICAgICAgIGNvbnN0IHJpZ2h0WSA9IChib3hQb2ludHNbMV0ueSArIGJveFBvaW50c1syXS55KSAvIDI7XHJcbiAgICAgICAgICBjb25zdCBsZWZ0WCA9IChib3hQb2ludHNbMF0ueCArIGJveFBvaW50c1szXS54KSAvIDI7XHJcbiAgICAgICAgICBjb25zdCBsZWZ0WSA9IChib3hQb2ludHNbMF0ueSArIGJveFBvaW50c1szXS55KSAvIDI7XHJcblxyXG4gICAgICAgICAgZnVuY3Rpb24gYWRqdXN0UG9pbnQoeDE6IGFueSwgeTE6IGFueSwgeDI6IGFueSwgeTI6IGFueSwgZGlzdGFuY2U6IGFueSkge1xyXG4gICAgICAgICAgICBjb25zdCBhbmdsZSA9IE1hdGguYXRhbjIoeTIgLSB5MSwgeDIgLSB4MSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgeDogeDEgKyBNYXRoLmNvcyhhbmdsZSkgKiBkaXN0YW5jZSxcclxuICAgICAgICAgICAgICB5OiB5MSArIE1hdGguc2luKGFuZ2xlKSAqIGRpc3RhbmNlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IHJpZ2h0U3RhcnQgPSBhZGp1c3RQb2ludChjZW50ZXJYLCBjZW50ZXJZLCByaWdodFgsIHJpZ2h0WSwgNTApO1xyXG4gICAgICAgICAgY29uc3QgcmlnaHRFbmQgPSBhZGp1c3RQb2ludChyaWdodFgsIHJpZ2h0WSwgY2VudGVyWCwgY2VudGVyWSwgMTApO1xyXG4gICAgICAgICAgY29uc3QgbGVmdFN0YXJ0ID0gYWRqdXN0UG9pbnQoY2VudGVyWCwgY2VudGVyWSwgbGVmdFgsIGxlZnRZLCA1MCk7XHJcbiAgICAgICAgICBjb25zdCBsZWZ0RW5kID0gYWRqdXN0UG9pbnQobGVmdFgsIGxlZnRZLCBjZW50ZXJYLCBjZW50ZXJZLCAxMCk7XHJcblxyXG4gICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgICAgICAgY3R4Lm1vdmVUbyhyaWdodFN0YXJ0LngsIHJpZ2h0U3RhcnQueSk7XHJcbiAgICAgICAgICBjdHgubGluZVRvKHJpZ2h0RW5kLngsIHJpZ2h0RW5kLnkpO1xyXG4gICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gJ2JsYWNrJztcclxuICAgICAgICAgIGN0eC5zdHJva2UoKTtcclxuICAgICAgICAgIGxldCByaWdodEFuZ2xlID0gTWF0aC5hdGFuMihyaWdodEVuZC55IC0gcmlnaHRTdGFydC55LCByaWdodEVuZC54IC0gcmlnaHRTdGFydC54KTtcclxuICAgICAgICAgIGRyYXdBcnJvd2hlYWQoY3R4LCByaWdodEVuZC54LCByaWdodEVuZC55LCByaWdodEFuZ2xlKTtcclxuXHJcbiAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICBjdHgubW92ZVRvKGxlZnRTdGFydC54LCBsZWZ0U3RhcnQueSk7XHJcbiAgICAgICAgICBjdHgubGluZVRvKGxlZnRFbmQueCwgbGVmdEVuZC55KTtcclxuICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICdibGFjayc7XHJcbiAgICAgICAgICBjdHguc3Ryb2tlKCk7XHJcbiAgICAgICAgICBsZXQgbGVmdEFuZ2xlID0gTWF0aC5hdGFuMihsZWZ0RW5kLnkgLSBsZWZ0U3RhcnQueSwgbGVmdEVuZC54IC0gbGVmdFN0YXJ0LngpO1xyXG4gICAgICAgICAgZHJhd0Fycm93aGVhZChjdHgsIGxlZnRFbmQueCwgbGVmdEVuZC55LCBsZWZ0QW5nbGUpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHByb3BlcnRpZXMuZWxlbWVudFR5cGUgPT09ICdlbnRyYW5jZScpIHtcclxuICAgICAgICAgIGNvbnN0IGFuZ2xlID0gTWF0aC5hdGFuMihuZXh0UG9pbnQueSAtIHBvaW50LnksIG5leHRQb2ludC54IC0gcG9pbnQueCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICBjb25zdCBlbnRyYW5jZUFuZ2xlID0gYW5nbGUgKyAoMTUgKiBNYXRoLlBJKSAvIDE4MDtcclxuICAgICAgICBcclxuICAgICAgICAgIGNvbnN0IGxpbmVMZW5ndGggPSB0aGlzLmNvbnZlcnRUb1BpeGVscyhwcm9wZXJ0aWVzLmRpc3RhbmNlLCBwcm9wZXJ0aWVzLnVuaXQpICogMC43NTtcclxuICAgICAgICAgIGNvbnN0IGVuZFBvaW50ID0ge1xyXG4gICAgICAgICAgICB4OiBwb2ludC54ICsgTWF0aC5jb3MoZW50cmFuY2VBbmdsZSkgKiBsaW5lTGVuZ3RoLFxyXG4gICAgICAgICAgICB5OiBwb2ludC55ICsgTWF0aC5zaW4oZW50cmFuY2VBbmdsZSkgKiBsaW5lTGVuZ3RoLFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICBjdHgubW92ZVRvKHBvaW50LngsIHBvaW50LnkpO1xyXG4gICAgICAgICAgY3R4LmxpbmVUbyhlbmRQb2ludC54LCBlbmRQb2ludC55KTtcclxuICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICcjMUQyOTM5JztcclxuICAgICAgICAgIGN0eC5zdHJva2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY3R4LnJlc3RvcmUoKTtcclxuXHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGNhbnZhcylcclxuICAgICAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhibG9iKVxyXG4gICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcclxuICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IhKTtcclxuICAgICAgICAgIGNhbnZhcy5yZW1vdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5mbG9vci5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBpbWFnZURhdGFVcmwgPSBhd2FpdCByZW5kZXJDYW52YXMoZGF0YS5mbG9vcltpXS5sYXlvdXRQb2x5Z29uKTtcclxuICAgICAgY29uc3QgYmFzZTY0RGF0YSA9IGltYWdlRGF0YVVybC5zcGxpdCgnLCcpWzFdO1xyXG4gICAgICB6aXAuZmlsZShgJHtzdG9yZX1fJHtkYXRhLmZsb29yW2ldLmZsb29yTmFtZX1fbGF5b3V0LnBuZ2AsIGJhc2U2NERhdGEsIHsgYmFzZTY0OiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHppcC5nZW5lcmF0ZUFzeW5jKHsgdHlwZTogJ2Jsb2InIH0pLnRoZW4oKGJsb2I6YW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgIGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgIGxpbmsuZG93bmxvYWQgPSBgJHtkYXRhLnN0b3JlTmFtZX1fbGF5b3V0cy56aXBgO1xyXG4gICAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJkb2N1bWVudDpjbGlja1wiLCBbXCIkZXZlbnRcIl0pXHJcbiAgICBvbk91dHNpZGVDbGljayhldmVudDpNb3VzZUV2ZW50KTp2b2lkIHtcclxuICAgICAgY29uc29sZS5sb2coZXZlbnQpXHJcbiAgICAgIGNvbnN0IGNsb3NlRHJvcERlbGV0ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuY2xvc2UtZGVsZXRlXCIpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGNsb3NlRHJvcERlbGV0ZSlcclxuICAgICAgICBpZiAoIWNsb3NlRHJvcERlbGV0ZSkge1xyXG4gICAgICAgICAgdGhpcy5sYXlvdXRMaXN0LmZvckVhY2goKGl0ZW06YW55LGluZGV4OmFueSkgPT4ge1xyXG4gICAgICAgICAgICBpdGVtLmRlbGV0ZUluZGV4ID0gZmFsc2U7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNsaWNrT3V0c2lkZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgICBjb25zdCBjbGlja2VkSW5zaWRlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcclxuICAgICAgICBcIi5kcm9wZG93bi1jbG9zZVwiXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICghY2xpY2tlZEluc2lkZSkge1xyXG4gICAgICAgIHRoaXMuY2xvc2VEcm9wRG93bigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbn1cclxuIiwiXHJcbjxkaXYgY2xhc3M9XCJteC0zIG10LTVcIj5cclxuICAgIDx1bCBjbGFzcz1cIm5hdiBuYXYtc3RyZXRjaCBuYXYtbGluZS10YWJzIG5hdi1saW5lLXRhYnMtMnggYm9yZGVyLXRyYW5zcGFyZW50IGZzLTUgZnctYm9sZGVyIGZsZXgtbm93cmFwXCI+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gY3Vyc29yLXBvaW50ZXJcIiBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0gJ2xheW91dEJ1aWxkZXInID8gJ3RhYkNsYXNzQWN0aXZlJyA6JydcIj48YSBjbGFzcz1cInRleHQtYWN0aXZlLXByaW1hcnkgcHgtNCBweS0zXCIgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICdsYXlvdXRCdWlsZGVyJyA/ICdhY3RpdmUnIDonJ1wiPkxheW91dCBidWlsZGVyPC9hPlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gY3Vyc29yLXBvaW50ZXJcIiBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0gJ3N0b3JlQnVpbGRlcicgPyAndGFiQ2xhc3NBY3RpdmUnIDonJ1wiPjxhIGNsYXNzPVwidGV4dC1hY3RpdmUtcHJpbWFyeSBweC00IHB5LTNcIiBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0gJ3N0b3JlQnVpbGRlcicgPyAnYWN0aXZlJyA6JydcIj5TdG9yZSBidWlsZGVyPC9hPlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICA8L3VsPlxyXG48L2Rpdj5cclxuPGlucHV0IHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiB0eXBlPVwiZmlsZVwiICNmaWxlIGlkPVwieGxzeFVwbG9hZFwiIChjaGFuZ2UpPVwib25GaWxlVXBsb2FkKCRldmVudClcIiAvPlxyXG48ZGl2IGNsYXNzPVwiY2FyZCBtdC01XCIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ2xheW91dEJ1aWxkZXInXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTBcIiAqbmdJZj1cIiFzaG93Tm9EYXRhXCI+XHJcbiAgICAgICAgPGgzIGNsYXNzPVwiY2FyZC10aXRsZSBhbGlnbi1pdGVtcy1zdGFydCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtbGFiZWwgbWItMlwiPlN0b3JlIGxheW91dCA8L3NwYW4+XHJcbiAgICAgICAgPC9oMz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10b29sYmFyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyICBwb3NpdGlvbi1yZWxhdGl2ZSBteS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBmb290ZmFsbHNlYXJjaCBzdmctaWNvbi0xIHBvc2l0aW9uLWFic29sdXRlICBtcy04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgb3BhY2l0eT1cIjAuNVwiIHg9XCIxNy4wMzY1XCIgeT1cIjE1LjEyMjNcIiB3aWR0aD1cIjguMTU1NDZcIiBoZWlnaHQ9XCIyXCIgcng9XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoNDUgMTcuMDM2NSAxNS4xMjIzKVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMSAxOUM2LjU1NTU2IDE5IDMgMTUuNDQ0NCAzIDExQzMgNi41NTU1NiA2LjU1NTU2IDMgMTEgM0MxNS40NDQ0IDMgMTkgNi41NTU1NiAxOSAxMUMxOSAxNS40NDQ0IDE1LjQ0NDQgMTkgMTEgMTlaTTExIDVDNy41MzMzMyA1IDUgNy41MzMzMyA1IDExQzUgMTQuNDY2NyA3LjUzMzMzIDE3IDExIDE3QzE0LjQ2NjcgMTcgMTcgMTQuNDY2NyAxNyAxMUMxNyA3LjUzMzMzIDE0LjQ2NjcgNSAxMSA1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBzLTE0IG14LTIgZm9vdGZhbGxzZWFyY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFsobmdNb2RlbCldPVwiZHluYW1pY0RhdGEuc2VhcmNoVmFsdWVcIiAoY2hhbmdlKT1cInNlYXJjaCgpXCIvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bGliLWZpbHRlcnMgW2RhdGFPYmplY3RdPVwiZGF0YU9iamVjdFwiIChhcHBsaWVkRmlsdGVycyk9XCJhcHBseUZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiQnVpbGRlckNyZWF0ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXMtMiByb3VuZGVkLTMgdGV4dC1ub3dyYXAgbmctc3Rhci1pbnNlcnRlZFwiIHRhYmluZGV4PVwiMFwiPjxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAuMDAwMSA0LjE2NjYzVjE1LjgzMzNNNC4xNjY3NSA5Ljk5OTk2SDE1LjgzMzRcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PHNwYW4gY2xhc3M9XCJtcy0yIHRleHQtd2hpdGVcIj5DcmVhdGUgTWFudWFsbHk8L3NwYW4+PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1vdXRsaW5lIHBzLTQgcGUtMiBidG4gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlciBteC0yXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJmaWxlLmNsaWNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+PC9zcGFuPiA8c3Bhbj5VcGxvYWQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ciBtcy0zIG1lLTFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIuLi8uLi8uLi9hc3NldHMvZmlsZXMvU3RvcmVCdWlsZGVyVGVtcGxhdGUueGxzeFwiIGRvd25sb2FkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNiA5TDEyIDE1TDE4IDlcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0wIG10LTVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0ZXh0LW5vd3JhcCBib3R0b20tYm9yZGVyXCIgKm5nSWY9XCJsYXlvdXRMaXN0Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdzdG9yZU5hbWUnKVwiPlN0b3JlIE5hbWUgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImR5bmFtaWNEYXRhLnNvcnRDb2x1bW5OYW1lID09PSAnc3RvcmVOYW1lJyAmJiBkeW5hbWljRGF0YS5zb3J0QnkgPT09IDEgPyAncm90YXRlJyA6ICcnXCIgd2lkdGg9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cImR5bmFtaWNEYXRhLnNvcnRDb2x1bW5OYW1lID09PSAnc3RvcmVOYW1lJyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uU29ydCgnbGF5b3V0TmFtZScpXCI+TGF5b3V0IE5hbWUgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImR5bmFtaWNEYXRhLnNvcnRDb2x1bW5OYW1lID09PSAnbGF5b3V0TmFtZScgJiYgZHluYW1pY0RhdGEuc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiIHdpZHRoPVwiMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJkeW5hbWljRGF0YS5zb3J0Q29sdW1uTmFtZSA9PT0gJ2xheW91dE5hbWUnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdmbG9vck51bWJlcicpXCI+Tm8gb2YgRmxvb3JzICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZHluYW1pY0RhdGEuc29ydENvbHVtbk5hbWUgPT09ICdmbG9vck51bWJlcicgJiYgZHluYW1pY0RhdGEuc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJkeW5hbWljRGF0YS5zb3J0Q29sdW1uTmFtZSA9PT0gJ2Zsb29yTnVtYmVyJyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4gPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvblNvcnQoJ2NyZWF0ZWRCeU5hbWUnKVwiPkNyZWF0ZWQgQnkgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImR5bmFtaWNEYXRhLnNvcnRDb2x1bW5OYW1lID09PSAnY3JlYXRlZEJ5TmFtZScgJiYgZHluYW1pY0RhdGEuc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiIHdpZHRoPVwiMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJkeW5hbWljRGF0YS5zb3J0Q29sdW1uTmFtZSA9PT0gJ2NyZWF0ZWRCeU5hbWUnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdjcmVhdGVkQXQnKVwiPkNyZWF0ZWQgRGF0ZSA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZHluYW1pY0RhdGEuc29ydENvbHVtbk5hbWUgPT09ICdjcmVhdGVkQXQnICYmIGR5bmFtaWNEYXRhLnNvcnRCeSA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB3aWR0aD1cIjE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwiZHluYW1pY0RhdGEuc29ydENvbHVtbk5hbWUgPT09ICdjcmVhdGVkQXQnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdzdGF0dXMnKVwiPlN0YXR1cyA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZHluYW1pY0RhdGEuc29ydENvbHVtbk5hbWUgPT09ICdzdGF0dXMnICYmIGR5bmFtaWNEYXRhLnNvcnRCeSA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB3aWR0aD1cIjE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwiZHluYW1pY0RhdGEuc29ydENvbHVtbk5hbWUgPT09ICdzdGF0dXMnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxheW91dExpc3Q7bGV0IGkgPWluZGV4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHNwYW4+PGEgY2xhc3M9XCJzdG9yZUxpbmsgY3Vyc29yLXBvaW50ZXJcIiBbaHJlZl09XCInL21hbmFnZS9wbGFub2dyYW0vbGF5b3V0LWJ1aWxkZXIvY3JlYXRlP2lkPScraXRlbS5faWRcIj57e2l0ZW0/LnN0b3JlTmFtZX19PC9hPjwvc3Bhbj48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHNwYW4+PGEgY2xhc3M9XCJzdG9yZUxpbmsgY3Vyc29yLXBvaW50ZXJcIiBbaHJlZl09XCInL21hbmFnZS9wbGFub2dyYW0vbGF5b3V0LWJ1aWxkZXIvY3JlYXRlP2lkPScraXRlbS5faWRcIj57e2l0ZW0/LmxheW91dE5hbWV9fTwvYT48L3NwYW4+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7aXRlbS5mbG9vck51bWJlcn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJzeW1ib2wgc3ltYm9sLTM1cHggc3ltYm9sLWNpcmNsZVwiPjxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzeW1ib2wtbGFiZWwgYmctbGlnaHQtcHJpbWFyeSB0ZXh0LXByaW1hcnkgbWUtMlwiPnt7aXRlbT8uY3JlYXRlZEJ5TmFtZS5zbGljZSgwLDIpLnRvVXBwZXJDYXNlKCl9fTwvc3Bhbj48L2Rpdj57e2l0ZW0/LmNyZWF0ZWRCeU5hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2l0ZW0uY3JlYXRlZEF0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1zdWNjZXNzXCI+e3tpdGVtLnN0YXR1cyB8IHRpdGxlY2FzZX19PC9zcGFuPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgKm5nSWY9XCJpdGVtLnN0YXR1cyAhPT0gJ2RyYWZ0J1wiIChjbGljayk9XCJkb3dubG9hZChpdGVtKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTUuODMzMzMgOC4zMzMzM0wxMCAxMi41TTEwIDEyLjVMMTQuMTY2NyA4LjMzMzMzTTEwIDEyLjVWMi41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBbaHJlZl09XCInL21hbmFnZS9wbGFub2dyYW0vbGF5b3V0LWJ1aWxkZXIvY3JlYXRlP2lkPScraXRlbS5faWRcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiAqbmdJZj1cIml0ZW0uc3RhdHVzID09PSAnZHJhZnQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTQuMTY2NyAyLjQ5OTkzQzE0LjM4NTUgMi4yODEwNiAxNC42NDU0IDIuMTA3NDQgMTQuOTMxMyAxLjk4ODk5QzE1LjIxNzMgMS44NzA1NCAxNS41MjM4IDEuODA5NTcgMTUuODMzMyAxLjgwOTU3QzE2LjE0MjkgMS44MDk1NyAxNi40NDk0IDEuODcwNTQgMTYuNzM1MyAxLjk4ODk5QzE3LjAyMTMgMi4xMDc0NCAxNy4yODExIDIuMjgxMDYgMTcuNSAyLjQ5OTkzQzE3LjcxODkgMi43MTg4IDE3Ljg5MjUgMi45Nzg2MyAxOC4wMTA5IDMuMjY0NkMxOC4xMjk0IDMuNTUwNTcgMTguMTkwNCAzLjg1NzA2IDE4LjE5MDQgNC4xNjY1OUMxOC4xOTA0IDQuNDc2MTIgMTguMTI5NCA0Ljc4MjYyIDE4LjAxMDkgNS4wNjg1OUMxNy44OTI1IDUuMzU0NTUgMTcuNzE4OSA1LjYxNDM5IDE3LjUgNS44MzMyNkw2LjI1IDE3LjA4MzNMMS42NjY2NyAxOC4zMzMzTDIuOTE2NjcgMTMuNzQ5OUwxNC4xNjY3IDIuNDk5OTNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xvc2UtZGVsZXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtzaG93RGVsZXRlRHJvcERvd24oaSlcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjIzXCIgdmlld0JveD1cIjAgMCAyNCAyM1wiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExIDExLjQ5OTlDMTEgMTIuMDI5MiAxMS40NDc3IDEyLjQ1ODMgMTIgMTIuNDU4M0MxMi41NTIzIDEyLjQ1ODMgMTMgMTIuMDI5MiAxMyAxMS40OTk5QzEzIDEwLjk3MDYgMTIuNTUyMyAxMC41NDE2IDEyIDEwLjU0MTZDMTEuNDQ3NyAxMC41NDE2IDExIDEwLjk3MDYgMTEgMTEuNDk5OVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMSAxOC4yMDgzQzExIDE4LjczNzUgMTEuNDQ3NyAxOS4xNjY2IDEyIDE5LjE2NjZDMTIuNTUyMyAxOS4xNjY2IDEzIDE4LjczNzUgMTMgMTguMjA4M0MxMyAxNy42NzkgMTIuNTUyMyAxNy4yNDk5IDEyIDE3LjI0OTlDMTEuNDQ3NyAxNy4yNDk5IDExIDE3LjY3OSAxMSAxOC4yMDgzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExIDQuNzkxNTlDMTEgNS4zMjA4NiAxMS40NDc3IDUuNzQ5OTIgMTIgNS43NDk5MkMxMi41NTIzIDUuNzQ5OTIgMTMgNS4zMjA4NiAxMyA0Ljc5MTU5QzEzIDQuMjYyMzEgMTIuNTUyMyAzLjgzMzI1IDEyIDMuODMzMjVDMTEuNDQ3NyAzLjgzMzI1IDExIDQuMjYyMzEgMTEgNC43OTE1OVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LmRlbGV0ZUluZGV4XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZGVsZXRlTGF5b3V0KGl0ZW0uX2lkKVwiIGNsYXNzPVwib3B0aW9uIGN1cnNvci1wb2ludGVyXCI+RGVsZXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzaG93Tm9EYXRhICYmICFsYXlvdXRMaXN0Lmxlbmd0aCAmJiAhbG9hZGluZ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG15LTZcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFtYWludGV4dCBtdC0zXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhc3VidGV4dFwiPlRoZXJlIGlzIG5vIHJlc3VsdCBmb3IgU3RvcmUgTGF5b3V0PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBjbGFzcz1cIm1iLTEwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgaC00MDBweCBtdC0xMFwiICpuZ0lmPVwiIWxvYWRpbmcgJiYgdGhpcy5zaG93Tm9EYXRhXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTYgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdW5kIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHZpZXdCb3g9XCIwIDAgNDAgNDBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xOS45OTk5IDEzLjMzM1YyNi42NjYzTTEzLjMzMzMgMTkuOTk5N0gyNi42NjY2TTM2LjY2NjYgMTkuOTk5N0MzNi42NjY2IDI5LjIwNDQgMjkuMjA0NyAzNi42NjYzIDE5Ljk5OTkgMzYuNjY2M0MxMC43OTUyIDM2LjY2NjMgMy4zMzMyNSAyOS4yMDQ0IDMuMzMzMjUgMTkuOTk5N0MzLjMzMzI1IDEwLjc5NDkgMTAuNzk1MiAzLjMzMzAxIDE5Ljk5OTkgMy4zMzMwMUMyOS4yMDQ3IDMuMzMzMDEgMzYuNjY2NiAxMC43OTQ5IDM2LjY2NjYgMTkuOTk5N1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjMuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVIZWFkIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBhIHN0b3JlIGxheW91dCBtYW51YWxseVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlQ29udGVudCBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGNyZWF0ZSBhIHNpbmdsZSBzdG9yZSBsYXlvdXQgbWFudWFsbHkgYnkgc3RlcCBieSBzdGVwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVDb250ZW50IG10LThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgYnRuQ2xhc3NcIiAoY2xpY2spPVwiQnVpbGRlckNyZWF0ZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgNVYxOU01IDEySDE5XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgbWFudWFsbHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy02IHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVuZC1ib3JkZXIgcG9zaXRpb24tcmVsYXRpdmUgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvci1jZW50ZXIgYmctd2hpdGUgc3RlcC10ZXh0XCI+b3I8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3VuZCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiB2aWV3Qm94PVwiMCAwIDQwIDQwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMzUgMjVWMzEuNjY2N0MzNSAzMi41NTA3IDM0LjY0ODggMzMuMzk4NiAzNC4wMjM3IDM0LjAyMzdDMzMuMzk4NiAzNC42NDg4IDMyLjU1MDcgMzUgMzEuNjY2NyAzNUg4LjMzMzMzQzcuNDQ5MjggMzUgNi42MDE0MyAzNC42NDg4IDUuOTc2MzEgMzQuMDIzN0M1LjM1MTE5IDMzLjM5ODYgNSAzMi41NTA3IDUgMzEuNjY2N1YyNU0yOC4zMzMzIDEzLjMzMzNMMjAgNU0yMCA1TDExLjY2NjcgMTMuMzMzM00yMCA1VjI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIzLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlSGVhZCBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgYSBzdG9yZSBsYXlvdXQgdXNpbmcgQ1NWXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVDb250ZW50IG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gY3JlYXRlIGEgc2luZ2xlIG9yIGEgbXVsdGlwbGUgc3RvcmUgbGF5b3V0IHVzaW5nIENTVi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBtdC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlQ29udGVudCB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggc3RlcC10ZXh0XCI+PGRpdj5TdGVwMSAtIDwvZGl2PjxkaXYgY2xhc3M9XCJtcy0xIFwiPjxhIGNsYXNzPVwiZG93bG9hZExpbmtcIiBocmVmPVwiLi4vLi4vLi4vYXNzZXRzL2ZpbGVzL1N0b3JlQnVpbGRlclRlbXBsYXRlLnhsc3hcIiBkb3dubG9hZD5Eb3dubG9hZCB0aGUgdGVtcGxhdGUgaGVyZTwvYT48L2Rpdj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBkLWZsZXggc3RlcC10ZXh0XCI+PGRpdj5TdGVwMiAtIDwvZGl2PjxkaXYgY2xhc3M9XCJtcy0xXCI+QWRkIHlvdXIgZGF0YSB0byB0aGUgVGVtcGxhdGUgRmlsZTwvZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIGQtZmxleCBzdGVwLXRleHRcIj48ZGl2PlN0ZXAzIC0gPC9kaXY+PGRpdiBjbGFzcz1cIm1zLTFcIj5VcGxvYWQgaXQgYmVsb3cgZm9yIHByb2Nlc3Npbmc8L2Rpdj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlQ29udGVudCBtdC04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bkNsYXNzXCIgKGNsaWNrKT1cImZpbGUuY2xpY2soKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjFcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjEgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xOCAxMi41VjE1LjgzMzNDMTggMTYuMjc1NCAxNy44MjQ0IDE2LjY5OTMgMTcuNTExOCAxNy4wMTE4QzE3LjE5OTMgMTcuMzI0NCAxNi43NzU0IDE3LjUgMTYuMzMzMyAxNy41SDQuNjY2NjdDNC4yMjQ2NCAxNy41IDMuODAwNzIgMTcuMzI0NCAzLjQ4ODE2IDE3LjAxMThDMy4xNzU1OSAxNi42OTkzIDMgMTYuMjc1NCAzIDE1LjgzMzNWMTIuNU0xNC42NjY3IDYuNjY2NjdMMTAuNSAyLjVNMTAuNSAyLjVMNi4zMzMzMyA2LjY2NjY3TTEwLjUgMi41VjEyLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBsb2FkIENTVlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiBsYXlvdXRMaXN0Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICA8bGliLXBhZ2luYXRpb24gY2xhc3M9XCJ0ZXh0LXN0YXJ0XCIgW2l0ZW1zUGVyUGFnZV09XCJkeW5hbWljRGF0YS5saW1pdFwiIFtjdXJyZW50UGFnZV09XCJkeW5hbWljRGF0YS5vZmZzZXRcIlxyXG4gICAgICAgICAgICAgICAgW3RvdGFsSXRlbXNdPVwidG90YWxJdGVtc1wiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCIgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI2NyZWF0ZUJ1aWxkZXIgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgc2Nyb2xsXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJvcmRlci0wXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtbGFiZWxcIj5DcmVhdGUgc3RvcmUgbGF5b3V0PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHN0b3JlQ2FyZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0U3RvcmVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTMgcG9zaXRpb24tcmVsYXRpdmVcIiAoY2xpY2tPdXRzaWRlKT1cImNsb3NlRHJvcERvd24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiaW5wdXRtb2RlbFwiIGNsYXNzPVwibGFiZWwgcGItMlwiPlNlbGVjdCBTdG9yZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jbG9zZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZHJvcGRvd24taW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURyb3BEb3duKClcIiByZWFkb25seSBwbGFjZWhvbGRlcj1cIlNlbGVjdCBPbmUgU3RvcmVcIiBbbmdNb2RlbF09XCJzZWxlY3RlZFN0b3JlPy5uYW1lXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudSBjdXN0b20tZHJvcGRvd24tbWVudSB3LTEwMFwiICpuZ0lmPVwic2hvd0Ryb3BEb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWItMlwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFN0b3JlLi4uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoU3RvcmVcIiAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJTZWFyY2goKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwic3RvcmVMaXN0Lmxlbmd0aCA+IDUgPyAnaC0yMDBweCBvdmVyZmxvdy1hdXRvJyA6ICdoLWF1dG8nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGZvcm0tY2hlY2sgY3VzdG9tLWRyb3Bkb3duLWl0ZW1cIiAqbmdGb3I9XCJsZXQgc3RvcmUgb2Ygc3RvcmVMaXN0O2xldCBpPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlU2VsZWN0ZWRTdG9yZShpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgW2Zvcl09XCJzdG9yZS5uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc3RvcmUubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtYXV0b1wiICpuZ0lmPVwiIXN0b3JlTGlzdC5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZm9ybS1jaGVjayBjdXN0b20tZHJvcGRvd24taXRlbVwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIlwiPk5vIERhdGEuPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC01XCI+Tm8gb2YgZmxvb3JzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+PHN2ZyByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cImRlY1wiIChjbGljayk9XCJmbG9vckRlYygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQuMTY2MDIgMTBIMTUuODMyN1wiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PGlucHV0IHJlYWRvbmx5PVwiXCIgdHlwZT1cIm51bWJlclwiIFsobmdNb2RlbCldPVwiZmxvb3JOb1wiIGlkPVwiZmxvb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgaW5jLWRlYy1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PHN2ZyByb2xlPVwiYnV0dG9uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwiaW5jXCIgKGNsaWNrKT1cImZsb29ySW5jKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4wMDA2NSAzLjMzMzM3VjEyLjY2NjdNMy4zMzM5OCA4LjAwMDA0SDEyLjY2NzNcIiBzdHJva2U9XCIjNjY3MDg1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBzdG9yZUNhcmQgdGV4dC1lbmQgYm9yZGVyLTBcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBteC01IGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeVwiIChjbGljayk9XCJjcmVhdGVMYXlvdXQoKVwiIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRTdG9yZT8ubmFtZVwiPlNhdmU8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICN1cGxvYWRCdWlsZGVyIGxldC1tb2RhbD5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIHNjcm9sbFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRUaXRsZVwiPkNyZWF0ZSBzdG9yZSBsYXlvdXQgKENTViBVcGxvYWQpPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtNlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC0yIHBhZGRpbmctbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRcIj57e2V4Y2VsRGF0YS50b3RhbFN0b3JlfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50VGl0bGVcIj5Ub3RhbCBzdG9yZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50XCI+e3tleGNlbERhdGEudG90YWxSb3d9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRUaXRsZVwiPlJvd3MgcHJvY2Vzc2VkPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnQgdGV4dC1kYW5nZXJcIj57e2V4Y2VsRGF0YS50b3RhbEVycm9yfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50VGl0bGUgdGV4dC1kYW5nZXJcIj5FcnJvcjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRUaXRsZVwiPkludmFsaWQgZGV0YWlscyE8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudFRpdGxlIGZvbnRXZWlnaHRcIj5QbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGFuZCBjb21wbGV0ZSBsYXlvdXQgaW5mb3JtYXRpb24uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXJyb3IgbXQtNSBwLTUgcHQtMCBoLWF1dG8gbWgtMjAwcHggb3ZlcmZsb3ctc2Nyb2xsXCIgKm5nSWY9XCJlcnJvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC01XCIgKm5nRm9yPVwibGV0IGVycm9yIG9mIGVycm9yO2xldCBpID1pbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2kgKyAxfX0mIzQxOyB7e2Vycm9yLm1lc3NhZ2V9fSAtIDxzcGFuICpuZ0lmPVwiZXJyb3I/LkV4aXN0SW5kZXhcIj57e2Vycm9yLnNlcmllc319e3tlcnJvci5FeGlzdEluZGV4fX0sPC9zcGFuPnt7ZXJyb3Iuc2VyaWVzfX17e2Vycm9yLmluZGV4fX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIHN0b3JlQ2FyZCB0ZXh0LWVuZCBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIG14LTUgYnRuLW91dGxpbmVcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kYW5nZXJcIiAoY2xpY2spPVwiUmV1cGxvYWQoKVwiPlJldXBsb2FkPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
|