tango-app-ui-manage-tickets 3.3.0-beta.9 → 3.7.0-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/esm2022/lib/components/footfall-dic/footfall-dic.component.mjs +853 -0
- package/esm2022/lib/components/group-select/group-select.component.mjs +155 -0
- package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +108 -0
- package/esm2022/lib/components/tango-manage-tickets/tango-manage-tickets.component.mjs +4 -3
- package/esm2022/lib/components/tickets/tickets.component.mjs +39 -4
- package/esm2022/lib/services/ticket.service.mjs +58 -1
- package/esm2022/lib/tango-manage-tickets.module.mjs +16 -4
- package/fesm2022/tango-app-ui-manage-tickets.mjs +1227 -34
- package/fesm2022/tango-app-ui-manage-tickets.mjs.map +1 -1
- package/lib/components/footfall-dic/footfall-dic.component.d.ts +127 -0
- package/lib/components/group-select/group-select.component.d.ts +33 -0
- package/lib/components/reactive-select/reactive-select.component.d.ts +32 -0
- package/lib/components/tickets/tickets.component.d.ts +1 -0
- package/lib/services/ticket.service.d.ts +12 -1
- package/lib/tango-manage-tickets.module.d.ts +8 -5
- package/package.json +1 -1
|
@@ -0,0 +1,853 @@
|
|
|
1
|
+
import { Component, ViewChild } from '@angular/core';
|
|
2
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
+
import { FormControl } from '@angular/forms';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "tango-app-ui-global";
|
|
6
|
+
import * as i2 from "../../services/ticket.service";
|
|
7
|
+
import * as i3 from "tango-app-ui-shared";
|
|
8
|
+
import * as i4 from "@ng-bootstrap/ng-bootstrap";
|
|
9
|
+
import * as i5 from "../../services/excel.service";
|
|
10
|
+
import * as i6 from "@angular/forms";
|
|
11
|
+
import * as i7 from "@angular/common";
|
|
12
|
+
import * as i8 from "../reactive-select/reactive-select.component";
|
|
13
|
+
import * as i9 from "../group-select/group-select.component";
|
|
14
|
+
export class FootfallDicComponent {
|
|
15
|
+
gs;
|
|
16
|
+
ticketService;
|
|
17
|
+
cd;
|
|
18
|
+
toast;
|
|
19
|
+
modalService;
|
|
20
|
+
excelservice;
|
|
21
|
+
fb;
|
|
22
|
+
searchValue;
|
|
23
|
+
loading = false;
|
|
24
|
+
noData = false;
|
|
25
|
+
sortedColumn = '';
|
|
26
|
+
sortDirection = 1;
|
|
27
|
+
footfallView = true;
|
|
28
|
+
headerFilters;
|
|
29
|
+
footfallList_req;
|
|
30
|
+
form;
|
|
31
|
+
selectedRevopsType;
|
|
32
|
+
revopsTypeArray = [
|
|
33
|
+
{ value: "", label: "All" },
|
|
34
|
+
{ value: "duplicateImages", label: "Duplicates" },
|
|
35
|
+
{ value: "employee", label: "Employee/Staff" },
|
|
36
|
+
{ value: "houseKeeping", label: "House Keeping" },
|
|
37
|
+
];
|
|
38
|
+
type = [
|
|
39
|
+
{ value: "open", label: "Open" },
|
|
40
|
+
{ value: "closed", label: "Closed" },
|
|
41
|
+
];
|
|
42
|
+
// selectedStatus: FormControl;
|
|
43
|
+
pendingArray = [
|
|
44
|
+
{ value: "", label: "All" },
|
|
45
|
+
{ value: "pending", label: "Pending" },
|
|
46
|
+
{ value: "approved", label: "Approved" },
|
|
47
|
+
{ value: "rejected", label: "Rejected" },
|
|
48
|
+
];
|
|
49
|
+
actionStatus;
|
|
50
|
+
filterForm;
|
|
51
|
+
ticketData = {
|
|
52
|
+
ticketName: "Footfall Directory",
|
|
53
|
+
ticketId: "TE_INF_F5645G4534A24",
|
|
54
|
+
storeName: "LKST98 | RK Salai, Mylapore, Chennai, Tamil Nadu, India",
|
|
55
|
+
status: "Open",
|
|
56
|
+
date: "04 Sep 2023",
|
|
57
|
+
footfall: {
|
|
58
|
+
total: 100,
|
|
59
|
+
duplicates: 10,
|
|
60
|
+
employee: 2,
|
|
61
|
+
houseKeeping: 1,
|
|
62
|
+
},
|
|
63
|
+
duplicates: [
|
|
64
|
+
{ url: "assets/img1.jpg" },
|
|
65
|
+
{ url: "assets/img2.jpg" },
|
|
66
|
+
{ url: "assets/img3.jpg" },
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
selectedStores = [];
|
|
70
|
+
allSelected = false;
|
|
71
|
+
stores = [];
|
|
72
|
+
destroy$ = new Subject();
|
|
73
|
+
constructor(gs, ticketService, cd, toast, modalService, excelservice, fb) {
|
|
74
|
+
this.gs = gs;
|
|
75
|
+
this.ticketService = ticketService;
|
|
76
|
+
this.cd = cd;
|
|
77
|
+
this.toast = toast;
|
|
78
|
+
this.modalService = modalService;
|
|
79
|
+
this.excelservice = excelservice;
|
|
80
|
+
this.fb = fb;
|
|
81
|
+
}
|
|
82
|
+
ngOnDestroy() {
|
|
83
|
+
this.destroy$.next(true);
|
|
84
|
+
this.destroy$.complete();
|
|
85
|
+
}
|
|
86
|
+
ngOnInit() {
|
|
87
|
+
this.footfallView = true;
|
|
88
|
+
this.selectedRevopsType = new FormControl('');
|
|
89
|
+
this.filterForm = this.fb.group({
|
|
90
|
+
selectedStatus: new FormControl('open'),
|
|
91
|
+
actionStatus: new FormControl(''),
|
|
92
|
+
ClusterList: new FormControl([]),
|
|
93
|
+
});
|
|
94
|
+
this.form = this.fb.group({
|
|
95
|
+
selectedRevopsType: this.selectedRevopsType,
|
|
96
|
+
});
|
|
97
|
+
this.gs.dataRangeValue?.pipe(takeUntil(this.destroy$))?.subscribe({
|
|
98
|
+
next: (data) => {
|
|
99
|
+
if (data) {
|
|
100
|
+
this.headerFilters = data;
|
|
101
|
+
this.footfallList_req = {
|
|
102
|
+
client: this.headerFilters.clients.toString(),
|
|
103
|
+
fromDate: this.headerFilters?.date?.startDate,
|
|
104
|
+
toDate: this.headerFilters?.date?.endDate,
|
|
105
|
+
};
|
|
106
|
+
this.getTicketSummary();
|
|
107
|
+
this.getTicketList();
|
|
108
|
+
this.getAllGroups();
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
getFootfallSummaryData;
|
|
114
|
+
getTicketSummary() {
|
|
115
|
+
this.ticketService
|
|
116
|
+
.getTicketSummaryApi(this.footfallList_req.client, this.footfallList_req.fromDate, this.footfallList_req.toDate)
|
|
117
|
+
.pipe(takeUntil(this.destroy$))
|
|
118
|
+
.subscribe({
|
|
119
|
+
next: (res) => {
|
|
120
|
+
if (res && res?.data && res?.data?.result) {
|
|
121
|
+
this.getFootfallSummaryData = res?.data?.result;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
this.getFootfallSummaryData = [];
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
error: (err) => {
|
|
128
|
+
this.getFootfallSummaryData = [];
|
|
129
|
+
},
|
|
130
|
+
complete: () => {
|
|
131
|
+
this.getFootfallSummaryData.length === 0;
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
this.cd.detectChanges();
|
|
135
|
+
}
|
|
136
|
+
offset = 0;
|
|
137
|
+
limit = 10;
|
|
138
|
+
isExport = false;
|
|
139
|
+
footfallListData;
|
|
140
|
+
totalItems;
|
|
141
|
+
paginationSizes = [10, 20, 30];
|
|
142
|
+
getTicketList() {
|
|
143
|
+
this.loading = true;
|
|
144
|
+
this.searchValue = this.searchValue?.trim() || '';
|
|
145
|
+
this.offset = this.offset || 1;
|
|
146
|
+
this.limit = this.limit || 10;
|
|
147
|
+
this.isExport = false;
|
|
148
|
+
this.ticketService
|
|
149
|
+
.getTicketListApi(this.footfallList_req.client, this.footfallList_req.fromDate, this.footfallList_req.toDate, this.searchValue, this.limit, this.offset, this.isExport, this.sortedColumn, this.sortDirection)
|
|
150
|
+
.pipe(takeUntil(this.destroy$))
|
|
151
|
+
.subscribe({
|
|
152
|
+
next: (res) => {
|
|
153
|
+
if (res && res.code === 200) {
|
|
154
|
+
this.noData = false;
|
|
155
|
+
this.loading = false;
|
|
156
|
+
this.footfallListData = res?.data?.result;
|
|
157
|
+
this.totalItems = res?.data?.count;
|
|
158
|
+
if (this.totalItems < 10) {
|
|
159
|
+
this.paginationSizes = [this.totalItems];
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
this.paginationSizes = [10, 20, 30];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
this.noData = true;
|
|
167
|
+
this.loading = false;
|
|
168
|
+
this.footfallListData = [];
|
|
169
|
+
}
|
|
170
|
+
this.cd.detectChanges();
|
|
171
|
+
},
|
|
172
|
+
error: (err) => {
|
|
173
|
+
this.noData = true;
|
|
174
|
+
this.loading = false;
|
|
175
|
+
},
|
|
176
|
+
complete: () => {
|
|
177
|
+
this.loading = false;
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
currentPage = 1;
|
|
182
|
+
pageSize = 10;
|
|
183
|
+
onPageChange(pageOffset) {
|
|
184
|
+
this.currentPage = Number(pageOffset);
|
|
185
|
+
this.offset = Number(pageOffset);
|
|
186
|
+
this.limit = 10;
|
|
187
|
+
this.getTicketList();
|
|
188
|
+
}
|
|
189
|
+
onPageSizeChange(pageSize) {
|
|
190
|
+
this.pageSize = Number(pageSize);
|
|
191
|
+
this.limit = Number(pageSize);
|
|
192
|
+
this.currentPage = 1;
|
|
193
|
+
this.offset = 1;
|
|
194
|
+
this.getTicketList();
|
|
195
|
+
}
|
|
196
|
+
setpageSize() {
|
|
197
|
+
if (this.totalItems < 10) {
|
|
198
|
+
return this.totalItems;
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
return this.pageSize;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
searchData() {
|
|
205
|
+
this.currentPage = 1;
|
|
206
|
+
this.offset = 1;
|
|
207
|
+
this.limit = 10;
|
|
208
|
+
this.getTicketList();
|
|
209
|
+
}
|
|
210
|
+
exportXLSX() {
|
|
211
|
+
this.searchValue = this.searchValue?.trim() || '';
|
|
212
|
+
this.offset = 1;
|
|
213
|
+
this.limit = 10000;
|
|
214
|
+
this.isExport = true;
|
|
215
|
+
this.ticketService
|
|
216
|
+
.getTicketListExportApi(this.footfallList_req.client, this.footfallList_req.fromDate, this.footfallList_req.toDate, this.searchValue, this.limit, this.offset, this.isExport, this.sortedColumn, this.sortDirection)
|
|
217
|
+
.pipe(takeUntil(this.destroy$))
|
|
218
|
+
.subscribe({
|
|
219
|
+
next: (res) => {
|
|
220
|
+
this.excelservice.saveAsExcelFile(res, 'footfall directory ticket ');
|
|
221
|
+
},
|
|
222
|
+
error: (err) => {
|
|
223
|
+
this.toast.getErrorToast('Error exporting data:' + err.error ? err.error : err.message);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
onSort(column) {
|
|
228
|
+
if (this.sortedColumn === column) {
|
|
229
|
+
this.sortDirection = this.sortDirection === 1 ? -1 : 1;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
this.sortedColumn = column;
|
|
233
|
+
this.sortDirection = 1;
|
|
234
|
+
}
|
|
235
|
+
this.getTicketList();
|
|
236
|
+
}
|
|
237
|
+
storeCount;
|
|
238
|
+
searchStoresData() {
|
|
239
|
+
this.getStores();
|
|
240
|
+
}
|
|
241
|
+
StoresSearchValue = '';
|
|
242
|
+
getStores() {
|
|
243
|
+
this.ticketService.getTaggedStoresApi(this.footfallList_req.client, this.footfallList_req.fromDate, this.footfallList_req.toDate, this.StoresSearchValue, this.groups).pipe(takeUntil(this.destroy$))
|
|
244
|
+
.subscribe({
|
|
245
|
+
next: (res) => {
|
|
246
|
+
if (res && res.code === 200) {
|
|
247
|
+
this.stores = res?.data?.result;
|
|
248
|
+
this.storeCount = res.data?.count || 0;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
this.stores = [];
|
|
252
|
+
this.storeCount = 0;
|
|
253
|
+
}
|
|
254
|
+
this.cd.detectChanges();
|
|
255
|
+
},
|
|
256
|
+
error: (err) => {
|
|
257
|
+
this.stores = [];
|
|
258
|
+
this.storeCount = 0;
|
|
259
|
+
},
|
|
260
|
+
complete: () => { },
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
getTaggedStoresData;
|
|
264
|
+
typeChange(event) {
|
|
265
|
+
this.filterForm.get('selectedStatus')?.setValue(event || null);
|
|
266
|
+
}
|
|
267
|
+
pendingChange(event) {
|
|
268
|
+
this.filterForm.get('actionStatus')?.setValue(event || null);
|
|
269
|
+
}
|
|
270
|
+
RevopsTypeChange(event) {
|
|
271
|
+
const selectedType = event ?? '';
|
|
272
|
+
this.footfalloffset = 1;
|
|
273
|
+
if (selectedType === '')
|
|
274
|
+
this.footfalllimit = 1;
|
|
275
|
+
else
|
|
276
|
+
this.footfalllimit = 250;
|
|
277
|
+
this.form.get('selectedRevopsType')?.setValue(selectedType);
|
|
278
|
+
this.allSelectValue = false;
|
|
279
|
+
// Clear selected lists
|
|
280
|
+
this.selectedEmployeeImagesList = [];
|
|
281
|
+
this.selectedHousekeepingImagesList = [];
|
|
282
|
+
this.selectedDuplicateImagesList = [];
|
|
283
|
+
// Reset counts
|
|
284
|
+
this.employeeACCount = '';
|
|
285
|
+
this.houseKeepingACCount = '';
|
|
286
|
+
this.duplicateACCount = '';
|
|
287
|
+
this.dataStoreView();
|
|
288
|
+
}
|
|
289
|
+
footfalloffset = 1;
|
|
290
|
+
footfalllimit = 1;
|
|
291
|
+
footfallTicketsData = [];
|
|
292
|
+
storeIdValue;
|
|
293
|
+
dataReset() {
|
|
294
|
+
this.selectedStores = [];
|
|
295
|
+
this.allSelected = false;
|
|
296
|
+
this.form.get('selectedRevopsType')?.setValue('');
|
|
297
|
+
this.filterForm.get('selectedStatus')?.setValue('open');
|
|
298
|
+
this.filterForm.get('actionStatus')?.setValue('pending');
|
|
299
|
+
this.dataStoreView();
|
|
300
|
+
}
|
|
301
|
+
dataApply() {
|
|
302
|
+
this.allSelectValue = false;
|
|
303
|
+
this.dataStoreView();
|
|
304
|
+
}
|
|
305
|
+
imageUrl;
|
|
306
|
+
dataIndexId;
|
|
307
|
+
dateString;
|
|
308
|
+
footfallNoData = false;
|
|
309
|
+
footfallLoading = true;
|
|
310
|
+
lastSelectedTicket = null;
|
|
311
|
+
hasInitialStoreSynced = false;
|
|
312
|
+
addStoreIfNotExists(store) {
|
|
313
|
+
if (this.hasInitialStoreSynced)
|
|
314
|
+
return;
|
|
315
|
+
const storeId = store?.storeId;
|
|
316
|
+
if (storeId && !this.selectedStores.includes(storeId)) {
|
|
317
|
+
this.selectedStores.push(storeId);
|
|
318
|
+
}
|
|
319
|
+
this.hasInitialStoreSynced = true;
|
|
320
|
+
this.allSelected = this.selectedStores.length === this.stores.length;
|
|
321
|
+
}
|
|
322
|
+
dataStoreView(data) {
|
|
323
|
+
this.footfallTicketsData = [];
|
|
324
|
+
this.footfallNoData = false;
|
|
325
|
+
this.footfallLoading = true;
|
|
326
|
+
const ticket = data?._source ? data : this.lastSelectedTicket;
|
|
327
|
+
if (!ticket || !ticket._source) {
|
|
328
|
+
this.footfallLoading = false;
|
|
329
|
+
this.footfallNoData = true;
|
|
330
|
+
this.toast.getErrorToast('No ticket data available');
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
this.lastSelectedTicket = ticket;
|
|
334
|
+
this.addStoreIfNotExists(ticket._source);
|
|
335
|
+
this.dataIndexId = ticket._id || '';
|
|
336
|
+
this.dateString = ticket._source.dateString || '';
|
|
337
|
+
this.imageUrl = this.ticketService?.footfallCDN;
|
|
338
|
+
this.storeIdValue = this.selectedStores;
|
|
339
|
+
const revopsType = this.form.get('selectedRevopsType')?.value;
|
|
340
|
+
const selectedStatus = this.filterForm.get('selectedStatus')?.value;
|
|
341
|
+
const actionStatus = this.filterForm.get('actionStatus')?.value;
|
|
342
|
+
const storeId = this.storeIdValue;
|
|
343
|
+
const fromDate = this.footfallList_req.fromDate;
|
|
344
|
+
const toDate = this.footfallList_req.toDate;
|
|
345
|
+
const offset = this.footfalloffset;
|
|
346
|
+
const limit = revopsType === '' ? this.footfalllimit : this.footfalllimit = 250;
|
|
347
|
+
this.ticketService
|
|
348
|
+
.getTicketsApi(storeId, fromDate, toDate, revopsType, selectedStatus, actionStatus, offset, limit)
|
|
349
|
+
.pipe(takeUntil(this.destroy$))
|
|
350
|
+
.subscribe({
|
|
351
|
+
next: (res) => {
|
|
352
|
+
if (res && res.code === 200) {
|
|
353
|
+
if (res?.data?.result?.length === 0) {
|
|
354
|
+
this.footfallTicketsData = [];
|
|
355
|
+
this.footfallView = true;
|
|
356
|
+
this.footfallNoData = true;
|
|
357
|
+
this.footfallLoading = false;
|
|
358
|
+
this.toast.getErrorToast('No data found for the selected filters');
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
this.footfallTicketsData = res?.data?.result ?? [];
|
|
362
|
+
this.totalItemsFootfall = res?.data?.count;
|
|
363
|
+
this.paginationSizes = this.totalItemsFootfall < 1
|
|
364
|
+
? [this.totalItemsFootfall]
|
|
365
|
+
: [1];
|
|
366
|
+
this.footfallView = false;
|
|
367
|
+
this.footfallNoData = false;
|
|
368
|
+
this.footfallLoading = false;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
this.footfallTicketsData = [];
|
|
373
|
+
this.footfallView = false;
|
|
374
|
+
this.footfallNoData = true;
|
|
375
|
+
this.footfallLoading = false;
|
|
376
|
+
}
|
|
377
|
+
},
|
|
378
|
+
error: () => {
|
|
379
|
+
this.footfallTicketsData = [];
|
|
380
|
+
this.footfallView = false;
|
|
381
|
+
this.footfallNoData = true;
|
|
382
|
+
this.footfallLoading = false;
|
|
383
|
+
},
|
|
384
|
+
complete: () => {
|
|
385
|
+
this.cd.detectChanges();
|
|
386
|
+
},
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
isCollapsed = false;
|
|
390
|
+
toggleSidebar() {
|
|
391
|
+
this.isCollapsed = !this.isCollapsed;
|
|
392
|
+
}
|
|
393
|
+
matchedType;
|
|
394
|
+
matchedArray = [{ value: "all", label: "matched: All" }];
|
|
395
|
+
onFilterApply() {
|
|
396
|
+
this.dataStoreView();
|
|
397
|
+
}
|
|
398
|
+
pageSizeFootfall = 1;
|
|
399
|
+
footfallcurrentPage = 1;
|
|
400
|
+
onFootfallPageChange(pageOffset) {
|
|
401
|
+
this.footfallcurrentPage = Number(pageOffset);
|
|
402
|
+
this.footfalloffset = Number(pageOffset);
|
|
403
|
+
this.footfalllimit = 1;
|
|
404
|
+
this.dataStoreView();
|
|
405
|
+
}
|
|
406
|
+
onFootfallPageSizeChange(pageSize) {
|
|
407
|
+
this.footfalllimit = Number(pageSize);
|
|
408
|
+
this.pageSizeFootfall = Number(pageSize);
|
|
409
|
+
this.footfallcurrentPage = 1;
|
|
410
|
+
this.footfalloffset = 1;
|
|
411
|
+
this.dataStoreView();
|
|
412
|
+
}
|
|
413
|
+
totalItemsFootfall;
|
|
414
|
+
setFootfallpageSize() {
|
|
415
|
+
if (this.totalItemsFootfall < 1) {
|
|
416
|
+
return this.totalItemsFootfall;
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
return this.pageSizeFootfall;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
toggleStoreSelection(store) {
|
|
423
|
+
const storeId = store?.storeId;
|
|
424
|
+
if (!storeId)
|
|
425
|
+
return;
|
|
426
|
+
const index = this.selectedStores.indexOf(storeId);
|
|
427
|
+
if (index > -1) {
|
|
428
|
+
this.selectedStores.splice(index, 1);
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
this.selectedStores.push(storeId);
|
|
432
|
+
}
|
|
433
|
+
this.allSelected = this.selectedStores.length === this.stores.length;
|
|
434
|
+
}
|
|
435
|
+
toggleSelectAll() {
|
|
436
|
+
const visibleStoreIds = this.filteredStores.map((s) => s.storeId);
|
|
437
|
+
if (this.allSelected) {
|
|
438
|
+
// Remove only the visible ones
|
|
439
|
+
this.selectedStores = this.selectedStores.filter(id => !visibleStoreIds.includes(id));
|
|
440
|
+
}
|
|
441
|
+
else {
|
|
442
|
+
// Add only those that are not already selected
|
|
443
|
+
const newIds = visibleStoreIds.filter(id => !this.selectedStores.includes(id));
|
|
444
|
+
this.selectedStores = [...this.selectedStores, ...newIds];
|
|
445
|
+
}
|
|
446
|
+
this.allSelected = this.selectedStores.length === this.stores.length;
|
|
447
|
+
}
|
|
448
|
+
isSelected(store) {
|
|
449
|
+
return this.selectedStores.includes(store.storeId);
|
|
450
|
+
}
|
|
451
|
+
imgtoggleSelectAll() {
|
|
452
|
+
this.allSelected = !this.allSelected;
|
|
453
|
+
this.ticketData.duplicates.forEach((img) => {
|
|
454
|
+
img.selected = this.allSelected;
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
selectedImagesList = [];
|
|
458
|
+
selectedDuplicateImagesList = [];
|
|
459
|
+
selectedHousekeepingImagesList = [];
|
|
460
|
+
selectedEmployeeImagesList = [];
|
|
461
|
+
houseKeepingACCount;
|
|
462
|
+
employeeACCount;
|
|
463
|
+
duplicateACCount;
|
|
464
|
+
cloneWithoutSelected(obj) {
|
|
465
|
+
const { ...rest } = obj;
|
|
466
|
+
return rest;
|
|
467
|
+
}
|
|
468
|
+
allSelectValue = false;
|
|
469
|
+
cloneWithoutSelected1(data) {
|
|
470
|
+
const { __parent, ...rest } = data;
|
|
471
|
+
return { ...rest };
|
|
472
|
+
}
|
|
473
|
+
onImageCheckboxChange1(data, category, parentOriginal) {
|
|
474
|
+
let selectedList;
|
|
475
|
+
if (category === 'duplicate') {
|
|
476
|
+
parentOriginal = parentOriginal || data.__parent;
|
|
477
|
+
const existingOriginal = this.selectedDuplicateImagesList.find((item) => item.tempId === parentOriginal?.tempId);
|
|
478
|
+
if (data.selected) {
|
|
479
|
+
if (existingOriginal) {
|
|
480
|
+
const alreadyExists = existingOriginal.data?.some((dup) => dup.tempId === data.tempId);
|
|
481
|
+
if (!alreadyExists) {
|
|
482
|
+
existingOriginal.data.push(this.cloneWithoutSelected1(data));
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
this.selectedDuplicateImagesList.push({
|
|
487
|
+
tempId: parentOriginal?.tempId,
|
|
488
|
+
filePath: parentOriginal?.filePath,
|
|
489
|
+
entryTime: parentOriginal?.entryTime,
|
|
490
|
+
exitTime: parentOriginal?.exitTime,
|
|
491
|
+
timeRange: parentOriginal?.timeRange,
|
|
492
|
+
data: [this.cloneWithoutSelected1(data)],
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
else {
|
|
497
|
+
if (existingOriginal) {
|
|
498
|
+
existingOriginal.data = existingOriginal.data.filter((d) => d.tempId !== data.tempId);
|
|
499
|
+
if (existingOriginal.data.length === 0) {
|
|
500
|
+
this.selectedDuplicateImagesList = this.selectedDuplicateImagesList.filter((o) => o.tempId !== parentOriginal?.tempId);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
this.duplicateACCount = this.selectedDuplicateImagesList.reduce((sum, orig) => sum + orig.data.length, 0);
|
|
505
|
+
}
|
|
506
|
+
if (category === 'employee') {
|
|
507
|
+
selectedList = this.selectedEmployeeImagesList;
|
|
508
|
+
}
|
|
509
|
+
else if (category === 'housekeeping') {
|
|
510
|
+
selectedList = this.selectedHousekeepingImagesList;
|
|
511
|
+
}
|
|
512
|
+
if (category !== 'duplicate') {
|
|
513
|
+
if (data.selected) {
|
|
514
|
+
const alreadyExists = selectedList.some((item) => item.tempId === data.tempId);
|
|
515
|
+
if (!alreadyExists) {
|
|
516
|
+
selectedList.push(data);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
const index = selectedList.findIndex((item) => item.tempId === data.tempId);
|
|
521
|
+
if (index !== -1) {
|
|
522
|
+
selectedList.splice(index, 1);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
this.employeeACCount = this.selectedEmployeeImagesList.length;
|
|
526
|
+
this.houseKeepingACCount = this.selectedHousekeepingImagesList.length;
|
|
527
|
+
}
|
|
528
|
+
// 🔒 Disable other checkboxes if one type is selected
|
|
529
|
+
const totalSelected = this.duplicateACCount + this.employeeACCount + this.houseKeepingACCount;
|
|
530
|
+
if (totalSelected > 0) {
|
|
531
|
+
this.checkedValue = false;
|
|
532
|
+
}
|
|
533
|
+
else {
|
|
534
|
+
this.checkedValue = true;
|
|
535
|
+
}
|
|
536
|
+
this.cd.detectChanges(); // To update the template
|
|
537
|
+
this.allSelectValue = this.areAllCheckboxesSelected();
|
|
538
|
+
// console.log('✅ Counts:', {
|
|
539
|
+
// duplicateACCount: this.duplicateACCount,
|
|
540
|
+
// employeeACCount: this.employeeACCount,
|
|
541
|
+
// houseKeepingACCount: this.houseKeepingACCount,
|
|
542
|
+
// checkedValue: this.checkedValue,
|
|
543
|
+
// });
|
|
544
|
+
}
|
|
545
|
+
selectAllValue() {
|
|
546
|
+
this.allSelectValue = !this.allSelectValue;
|
|
547
|
+
this.checkedValue = !this.allSelectValue;
|
|
548
|
+
this.selectedEmployeeImagesList = [];
|
|
549
|
+
this.selectedHousekeepingImagesList = [];
|
|
550
|
+
this.selectedDuplicateImagesList = [];
|
|
551
|
+
for (const ticket of this.footfallTicketsData) {
|
|
552
|
+
const source = ticket._source;
|
|
553
|
+
// ✅ Employee
|
|
554
|
+
if (Array.isArray(source.employee)) {
|
|
555
|
+
source.employee.forEach((img) => {
|
|
556
|
+
img.selected = this.allSelectValue;
|
|
557
|
+
if (this.allSelectValue && !this.selectedEmployeeImagesList.some(e => e.tempId === img.tempId)) {
|
|
558
|
+
this.selectedEmployeeImagesList.push(img);
|
|
559
|
+
}
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
// ✅ Housekeeping
|
|
563
|
+
if (Array.isArray(source.houseKeeping)) {
|
|
564
|
+
source.houseKeeping.forEach((emp) => {
|
|
565
|
+
emp.selected = this.allSelectValue;
|
|
566
|
+
if (this.allSelectValue && !this.selectedHousekeepingImagesList.some(e => e.tempId === emp.tempId)) {
|
|
567
|
+
this.selectedHousekeepingImagesList.push(emp);
|
|
568
|
+
}
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
// ✅ Duplicate
|
|
572
|
+
if (Array.isArray(source.duplicateImages)) {
|
|
573
|
+
source.duplicateImages.forEach((original) => {
|
|
574
|
+
if (Array.isArray(original.data)) {
|
|
575
|
+
original.data.forEach((dup) => {
|
|
576
|
+
dup.selected = this.allSelectValue;
|
|
577
|
+
dup.__parent = original; // ✅ Needed for uncheck
|
|
578
|
+
});
|
|
579
|
+
if (this.allSelectValue && original.data.length > 0) {
|
|
580
|
+
const existing = this.selectedDuplicateImagesList.find((o) => o.tempId === original.tempId);
|
|
581
|
+
if (!existing) {
|
|
582
|
+
this.selectedDuplicateImagesList.push({
|
|
583
|
+
tempId: original.tempId,
|
|
584
|
+
filePath: original.filePath,
|
|
585
|
+
entryTime: original.entryTime,
|
|
586
|
+
exitTime: original.exitTime,
|
|
587
|
+
timeRange: original.timeRange,
|
|
588
|
+
data: original.data.map((d) => this.cloneWithoutSelected1(d)),
|
|
589
|
+
});
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
this.houseKeepingACCount = this.selectedHousekeepingImagesList.length;
|
|
597
|
+
this.employeeACCount = this.selectedEmployeeImagesList.length;
|
|
598
|
+
this.duplicateACCount = this.selectedDuplicateImagesList.reduce((sum, orig) => sum + orig.data.length, 0);
|
|
599
|
+
}
|
|
600
|
+
areAllCheckboxesSelected() {
|
|
601
|
+
for (const ticket of this.footfallTicketsData) {
|
|
602
|
+
const source = ticket._source;
|
|
603
|
+
if (source.employee?.some((img) => !img.selected))
|
|
604
|
+
return false;
|
|
605
|
+
if (source.houseKeeping?.some((img) => !img.selected))
|
|
606
|
+
return false;
|
|
607
|
+
if (source.duplicateImages?.some((original) => original.data?.some((dup) => !dup.selected)))
|
|
608
|
+
return false;
|
|
609
|
+
}
|
|
610
|
+
return true;
|
|
611
|
+
}
|
|
612
|
+
checkedValue = true;
|
|
613
|
+
onImageCheckboxChange(data, category, parentOriginal) {
|
|
614
|
+
let selectedList;
|
|
615
|
+
switch (category) {
|
|
616
|
+
case 'duplicate':
|
|
617
|
+
// Ensure selectedDuplicateImagesList is an array of ORIGINALS with selected children
|
|
618
|
+
const existingOriginal = this.selectedDuplicateImagesList.find((item) => item.tempId === parentOriginal?.tempId);
|
|
619
|
+
if (data.selected) {
|
|
620
|
+
if (existingOriginal) {
|
|
621
|
+
const alreadyExists = existingOriginal.data?.some((dup) => dup.tempId === data.tempId);
|
|
622
|
+
if (!alreadyExists) {
|
|
623
|
+
existingOriginal.data.push(this.cloneWithoutSelected(data)); // ✅ no 'selected' key
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
else {
|
|
627
|
+
this.selectedDuplicateImagesList.push({
|
|
628
|
+
tempId: parentOriginal?.tempId,
|
|
629
|
+
filePath: parentOriginal?.filePath,
|
|
630
|
+
entryTime: parentOriginal?.entryTime,
|
|
631
|
+
exitTime: parentOriginal?.exitTime,
|
|
632
|
+
timeRange: parentOriginal?.timeRange,
|
|
633
|
+
data: [this.cloneWithoutSelected(data)], // ✅
|
|
634
|
+
});
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
else {
|
|
638
|
+
// Remove from selected duplicates
|
|
639
|
+
if (existingOriginal) {
|
|
640
|
+
existingOriginal.data = existingOriginal.data.filter((d) => d.tempId !== data.tempId);
|
|
641
|
+
// Remove the whole original if no duplicates are left
|
|
642
|
+
if (existingOriginal.data.length === 0) {
|
|
643
|
+
this.selectedDuplicateImagesList = this.selectedDuplicateImagesList.filter((o) => o.tempId !== parentOriginal?.tempId);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
// Count only from selected duplicates
|
|
648
|
+
this.duplicateACCount = this.selectedDuplicateImagesList.reduce((sum, orig) => sum + orig.data.length, 0);
|
|
649
|
+
return;
|
|
650
|
+
case 'housekeeping':
|
|
651
|
+
selectedList = this.selectedHousekeepingImagesList;
|
|
652
|
+
break;
|
|
653
|
+
case 'employee':
|
|
654
|
+
selectedList = this.selectedEmployeeImagesList;
|
|
655
|
+
break;
|
|
656
|
+
default:
|
|
657
|
+
return;
|
|
658
|
+
}
|
|
659
|
+
// Unchanged logic for employee and housekeeping
|
|
660
|
+
selectedList = selectedList || [];
|
|
661
|
+
if (data.selected) {
|
|
662
|
+
const alreadyExists = Array.isArray(selectedList) && selectedList.some((item) => item.tempId === data.tempId);
|
|
663
|
+
if (!alreadyExists) {
|
|
664
|
+
selectedList.push(data);
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
else {
|
|
668
|
+
const updated = Array.isArray(selectedList) ? selectedList.filter((item) => item.tempId !== data.tempId) : [];
|
|
669
|
+
if (category === 'housekeeping') {
|
|
670
|
+
this.selectedHousekeepingImagesList = updated;
|
|
671
|
+
}
|
|
672
|
+
else if (category === 'employee') {
|
|
673
|
+
this.selectedEmployeeImagesList = updated;
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
this.houseKeepingACCount = this.selectedHousekeepingImagesList?.length || 0;
|
|
677
|
+
this.employeeACCount = this.selectedEmployeeImagesList.length || 0;
|
|
678
|
+
}
|
|
679
|
+
commentText;
|
|
680
|
+
submitValue(status = 'approved', category = 'duplicate') {
|
|
681
|
+
// Step 1: Validate based on current category
|
|
682
|
+
let selectedList;
|
|
683
|
+
switch (category) {
|
|
684
|
+
case 'duplicate':
|
|
685
|
+
selectedList = this.selectedDuplicateImagesList;
|
|
686
|
+
break;
|
|
687
|
+
case 'housekeeping':
|
|
688
|
+
selectedList = this.selectedHousekeepingImagesList;
|
|
689
|
+
break;
|
|
690
|
+
case 'employee':
|
|
691
|
+
selectedList = this.selectedEmployeeImagesList;
|
|
692
|
+
break;
|
|
693
|
+
default:
|
|
694
|
+
return;
|
|
695
|
+
}
|
|
696
|
+
if (selectedList.length === 0) {
|
|
697
|
+
this.toast.getErrorToast('Please select at least one image');
|
|
698
|
+
return;
|
|
699
|
+
}
|
|
700
|
+
// Replace selected → isChecked before sending
|
|
701
|
+
const transformedList = selectedList.map(item => {
|
|
702
|
+
const { selected, ...rest } = item;
|
|
703
|
+
return { ...rest, isChecked: true };
|
|
704
|
+
});
|
|
705
|
+
// Step 2: Build full payload
|
|
706
|
+
const payload = [];
|
|
707
|
+
for (const ticket of this.footfallTicketsData) {
|
|
708
|
+
const source = ticket._source;
|
|
709
|
+
const singlePayload = {
|
|
710
|
+
_id: ticket._id,
|
|
711
|
+
comments: this.commentText || '',
|
|
712
|
+
dateString: source.dateString || this.dateString,
|
|
713
|
+
employeeStatus: category === 'employee' ? status : 'pending',
|
|
714
|
+
houseKeepingStatus: category === 'housekeeping' ? status : 'pending',
|
|
715
|
+
duplicateStatus: category === 'duplicate' ? status : 'pending',
|
|
716
|
+
};
|
|
717
|
+
if (category === 'employee') {
|
|
718
|
+
singlePayload.employee = transformedList;
|
|
719
|
+
singlePayload.employeeACCount = this.employeeACCount ? this.employeeACCount : 0;
|
|
720
|
+
}
|
|
721
|
+
if (category === 'housekeeping') {
|
|
722
|
+
singlePayload.houseKeeping = transformedList;
|
|
723
|
+
singlePayload.houseKeepingACCount = this.houseKeepingACCount ? this.houseKeepingACCount : 0;
|
|
724
|
+
}
|
|
725
|
+
if (category === 'duplicate') {
|
|
726
|
+
singlePayload.duplicateImages = transformedList;
|
|
727
|
+
singlePayload.duplicateACCount = this.duplicateACCount ? this.duplicateACCount : 0;
|
|
728
|
+
}
|
|
729
|
+
payload.push(singlePayload);
|
|
730
|
+
}
|
|
731
|
+
// console.log('Payload to submit:', payload);
|
|
732
|
+
// return
|
|
733
|
+
// Step 3: Set status based on current category
|
|
734
|
+
switch (category) {
|
|
735
|
+
case 'duplicate':
|
|
736
|
+
payload.forEach(item => item.duplicateStatus = status);
|
|
737
|
+
break;
|
|
738
|
+
case 'housekeeping':
|
|
739
|
+
payload.forEach(item => item.houseKeepingStatus = status);
|
|
740
|
+
break;
|
|
741
|
+
case 'employee':
|
|
742
|
+
payload.forEach(item => item.employeeStatus = status);
|
|
743
|
+
break;
|
|
744
|
+
}
|
|
745
|
+
// Step 4: Submit the payload
|
|
746
|
+
this.ticketService.getUpdateStatusApi({ data: payload })
|
|
747
|
+
.pipe(takeUntil(this.destroy$))
|
|
748
|
+
.subscribe({
|
|
749
|
+
next: (res) => {
|
|
750
|
+
if (res && res.code === 200) {
|
|
751
|
+
this.toast.getSuccessToast(res?.message || 'Ticket updated successfully');
|
|
752
|
+
this.allSelected = false;
|
|
753
|
+
this.allSelectValue = false;
|
|
754
|
+
this.dataStoreView();
|
|
755
|
+
this.cancel();
|
|
756
|
+
}
|
|
757
|
+
else {
|
|
758
|
+
this.toast.getErrorToast('Failed to update ticket');
|
|
759
|
+
}
|
|
760
|
+
},
|
|
761
|
+
error: (err) => {
|
|
762
|
+
const msg = err.error.error || err.error || err?.error?.message || err.message || 'Unknown error';
|
|
763
|
+
this.toast.getErrorToast('Error updating ticket: ' + msg);
|
|
764
|
+
this.allSelected = false;
|
|
765
|
+
this.allSelectValue = false;
|
|
766
|
+
}
|
|
767
|
+
});
|
|
768
|
+
}
|
|
769
|
+
searchTerm = '';
|
|
770
|
+
get filteredStores() {
|
|
771
|
+
if (!this.searchTerm?.trim())
|
|
772
|
+
return this.stores;
|
|
773
|
+
const term = this.searchTerm.toLowerCase();
|
|
774
|
+
return this.stores.filter(store => store?.storeName?.toLowerCase().includes(term));
|
|
775
|
+
}
|
|
776
|
+
onImageError(event) {
|
|
777
|
+
event.target.src = 'assets/images/fallback-image.png'; // or any default image path
|
|
778
|
+
}
|
|
779
|
+
backToNavigation() {
|
|
780
|
+
this.selectedStores = [];
|
|
781
|
+
this.allSelected = false;
|
|
782
|
+
this.allSelectValue = false;
|
|
783
|
+
this.footfallView = true;
|
|
784
|
+
this.getTicketSummary();
|
|
785
|
+
this.getTicketList();
|
|
786
|
+
}
|
|
787
|
+
zoomPopup;
|
|
788
|
+
popupvalue;
|
|
789
|
+
popupType;
|
|
790
|
+
popupOpen(type, value) {
|
|
791
|
+
const modalRef = this.modalService.open(this.zoomPopup, { centered: true, size: 'md' });
|
|
792
|
+
this.popupType = type;
|
|
793
|
+
if (value === 'duplicateImages') {
|
|
794
|
+
this.popupvalue = 'duplicate';
|
|
795
|
+
}
|
|
796
|
+
else {
|
|
797
|
+
this.popupvalue = value;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
cancel() {
|
|
801
|
+
this.modalService.dismissAll();
|
|
802
|
+
this.allSelected = false;
|
|
803
|
+
this.allSelectValue = false;
|
|
804
|
+
// Clear all selected flags from the data
|
|
805
|
+
for (const ticket of this.footfallTicketsData) {
|
|
806
|
+
const source = ticket._source;
|
|
807
|
+
source.employee?.forEach((img) => (img.selected = false));
|
|
808
|
+
source.houseKeeping?.forEach((img) => (img.selected = false));
|
|
809
|
+
source.duplicateImages?.forEach((original) => {
|
|
810
|
+
original.data?.forEach((dup) => (dup.selected = false));
|
|
811
|
+
});
|
|
812
|
+
}
|
|
813
|
+
// Clear selected lists
|
|
814
|
+
this.selectedEmployeeImagesList = [];
|
|
815
|
+
this.selectedHousekeepingImagesList = [];
|
|
816
|
+
this.selectedDuplicateImagesList = [];
|
|
817
|
+
// Reset counts
|
|
818
|
+
this.employeeACCount = '';
|
|
819
|
+
this.houseKeepingACCount = '';
|
|
820
|
+
this.duplicateACCount = '';
|
|
821
|
+
this.checkedValue = true;
|
|
822
|
+
}
|
|
823
|
+
ClusterList = [];
|
|
824
|
+
getAllGroups() {
|
|
825
|
+
this.ticketService.getclusters({ clientId: this.headerFilters.client, group: [], city: [] }).subscribe({
|
|
826
|
+
next: (res) => {
|
|
827
|
+
if (res && res.code == 200) {
|
|
828
|
+
this.ClusterList = res?.data?.groupData;
|
|
829
|
+
this.getStores();
|
|
830
|
+
}
|
|
831
|
+
else {
|
|
832
|
+
this.ClusterList = [];
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
});
|
|
836
|
+
}
|
|
837
|
+
groups = [];
|
|
838
|
+
ongroupSelect(event) {
|
|
839
|
+
this.filterForm.get('ClusterList')?.setValue(event);
|
|
840
|
+
this.groups = event.map((el) => el.groupName);
|
|
841
|
+
this.getStores();
|
|
842
|
+
}
|
|
843
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FootfallDicComponent, deps: [{ token: i1.GlobalStateService }, { token: i2.TicketService }, { token: i0.ChangeDetectorRef }, { token: i3.ToastService }, { token: i4.NgbModal }, { token: i5.ExcelService }, { token: i6.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
844
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FootfallDicComponent, selector: "lib-footfall-dic", viewQueries: [{ propertyName: "zoomPopup", first: true, predicate: ["zoomPopup"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"footfallView\" class=\"row\">\r\n <div class=\"col-md-3 mb-3\">\r\n <div class=\"card\">\r\n <div class=\"card-header ellipse1 py-1 px-5\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.totalTickets !== null ?\r\n getFootfallSummaryData?.totalTickets : '--' }}</h5>\r\n <span class=\"sub-header\">Total tickets</span>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-2 px-5\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-6 col-xl-9 col-md-6 my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.openTickets !== null ?\r\n getFootfallSummaryData?.openTickets : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Open</span>\r\n </div>\r\n <div class=\"col-lg-6 col-xl-3 col-md-6 my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.closedTickets !== null ?\r\n getFootfallSummaryData?.closedTickets : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Closed</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-9 mb-3\">\r\n <div class=\"card\">\r\n <div class=\"card-header ellipse1 py-1 px-5\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.noShopper !== null ?\r\n getFootfallSummaryData?.noShopper : '--' }}</h5>\r\n <div class=\"sub-header\">Non-Shoppers</div>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-2 px-5\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-4 col-xl-5 col-md-4 my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.duplicateCount !== null ?\r\n getFootfallSummaryData?.duplicateCount : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Duplicates</span>\r\n </div>\r\n <div class=\"col-lg-4 col-xl-5 col-md-4 my-3 \">\r\n <h5 class=\"card-title \">{{ getFootfallSummaryData?.employeeCount !== null ?\r\n getFootfallSummaryData?.employeeCount : '--' }}</h5>\r\n <span class=\"card-title-sub-header \">Employee/Staff</span>\r\n </div>\r\n <div class=\"col-lg-4 col-xl-2 col-md-4 my-3\">\r\n <h5 class=\"card-title \">{{ getFootfallSummaryData?.houseKeepingCount !== null ?\r\n getFootfallSummaryData?.houseKeepingCount : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Housekeeping</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"footfallView\" class=\"card\">\r\n <div class=\"card-header border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\">Ticket Info</span>\r\n <span class=\"text-sub mb-2\">Based on {{footfallList_req?.fromDate | date: 'dd MMM, yyyy'}} \u2013 {{footfallList_req?.toDate | date: 'dd MMM, yyyy'}} </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 svg-icon-1 position-absolute ms-3\">\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\"></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 me-2\" placeholder=\"Search\" autocomplete=\"off\"\r\n (change)=\"searchData()\" [(ngModel)]=\"searchValue\" />\r\n <!-- <lib-filters [dataObject]=\"dataObject\"\r\n (appliedFilters)=\"applyFilters($event)\"></lib-filters> -->\r\n\r\n <button type=\"button\" (click)=\"exportXLSX()\"\r\n class=\"btn btn-default mx-2 btn-outline btn-outline-default rounded-3 text-nowrap border-val\">\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\" />\r\n </svg>\r\n <span class=\"ms-2\">Export</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-body mt-3 py-0 px-0\">\r\n\r\n\r\n\r\n <div *ngIf=\"loading\" class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"noData\" class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\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=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for this Date</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!loading && !noData\" class=\"table-responsive\">\r\n <table class=\"table bottom-border text-nowrap \">\r\n <thead>\r\n <tr>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('storeName')\">Store Info<svg\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'storeName' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('ticketId')\">Ticket ID<svg\r\n [ngClass]=\"sortedColumn === 'ticketId' && sortDirection === 1 ? 'rotate' : ''\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'ticketId' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('dateString')\">Ticket raised on\r\n <svg [ngClass]=\"sortedColumn === 'dateString' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'dateString' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('footfallCount')\">Total footfalls\r\n <svg [ngClass]=\"sortedColumn === 'footfallCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'footfallCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('duplicateCount')\">Duplicates\r\n <svg [ngClass]=\"sortedColumn === 'duplicateCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'duplicateCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('employeeCount')\">Employee/Staff\r\n <svg [ngClass]=\"sortedColumn === 'employeeCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'employeeCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('houseKeepingCount')\">Housekeeping\r\n <svg [ngClass]=\"sortedColumn === 'houseKeepingCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'houseKeepingCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n\r\n <th>Revised footfalls\r\n \r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('status')\">Status<svg\r\n [ngClass]=\"sortedColumn === 'status' && sortDirection === 1 ? 'rotate' : ''\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'status' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></th>\r\n <!-- <th >Actions</th> -->\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let ticket of footfallListData\">\r\n <ng-container *ngIf=\"ticket?._source as source\">\r\n <td (click)=\"dataStoreView(ticket)\">\r\n <div class=\"text-primary cursor-pointer\">{{ source.storeName }}</div>\r\n <div class=\"text-gray-500 fs-7 mt-2\">ID : {{ source.storeId }}</div>\r\n </td>\r\n \r\n <td class=\"py-7\">{{ source.ticketId }}</td>\r\n <td class=\"py-7\">{{ source.dateString | date: 'dd MMM, yyyy' }}</td>\r\n <td class=\"py-7\">{{ source.footfallCount }}</td>\r\n <td class=\"py-7\">{{ source.duplicateCount }}</td>\r\n <td class=\"py-7\">{{ source.employeeCount }}</td>\r\n <td class=\"py-7\">{{ source.houseKeepingCount }}</td>\r\n <td class=\"py-7\">\r\n {{ source.footfallCount - (source.houseKeepingCount + source.employeeCount +\r\n source.duplicateCount) }}\r\n </td>\r\n \r\n <td class=\"py-7\">\r\n <span *ngIf=\"source.status === 'open' || source.status === 'closed'\" class=\"badge mx-2\" [ngClass]=\"{\r\n 'badge-light-primary': source.status === 'open',\r\n 'badge-light-default': source.status === 'closed'\r\n }\">\r\n {{ source.status | titlecase }}\r\n </span>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div *ngIf=\"!loading && !noData\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\"\r\n [paginationSizes]=\"paginationSizes\" [pageSize]=\"setpageSize()\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n\r\n<div *ngIf=\"!footfallView\" class=\"card mt-2\">\r\n <form [formGroup]=\"filterForm\">\r\n <div class=\"row my-0\">\r\n <div class=\"col-lg-3 my-3\">\r\n <span class=\"ms-2 cursor-pointer\" (click)=\"backToNavigation()\" ><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"44\" viewBox=\"0 0 56 44\"\r\n fill=\"none\">\r\n <g filter=\"url(#filter0_d_887_4505)\">\r\n <rect x=\"2\" y=\"1\" width=\"52\" height=\"40\" rx=\"8\" fill=\"white\" />\r\n <rect x=\"2.5\" y=\"1.5\" width=\"51\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\r\n <path d=\"M30.5 26L25.5 21L30.5 16\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_887_4505\" x=\"0\" y=\"0\" width=\"56\" height=\"44\" filterUnits=\"userSpaceOnUse\"\r\n color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_887_4505\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_887_4505\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg></span>\r\n <span class=\"card-title-foot ms-3\">Footfall Directory</span>\r\n </div>\r\n <div class=\"col-md-2 my-3\">\r\n \r\n <lib-reactive-select formControlName=\"selectedStatus\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"type\"\r\n (itemChange)=\"typeChange($event)\"></lib-reactive-select>\r\n \r\n\r\n </div>\r\n <div class=\"col-md-2 my-3\">\r\n \r\n <lib-reactive-select formControlName=\"actionStatus\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"pendingArray\"\r\n (itemChange)=\"pendingChange($event)\"></lib-reactive-select>\r\n \r\n </div>\r\n <div class=\"col-md-3 my-4\" >\r\n <div class=\"select-wrapper\">\r\n <div class=\"placeholder-overlay\" *ngIf=\"!(filterForm.get('ClusterList')?.value?.length)\">\r\n Select cluster\r\n </div>\r\n <lib-group-select [items]=\"ClusterList\" [disabled]=\"false\" [multi]=\"true\"\r\n [searchField]=\"'groupName'\" [idField]=\"'groupName'\" (selected)=\"ongroupSelect($event)\"\r\n [selectedValues]=\"filterForm.get('ClusterList')?.value\">\r\n </lib-group-select>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-2 my-4\">\r\n <div class=\"d-flex me-3\">\r\n <a (click)=\"onFilterApply()\" type=\"submit\" class=\"btn btn-sm btn-primary px-4 \"><span>Apply</span></a>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n</div>\r\n<div *ngIf=\"!footfallView\" class=\"row mt-3\">\r\n <div class=\"position-relative\" \r\n [ngClass]=\"isCollapsed ? 'd-none' : 'col-md-3'\" >\r\n <div class=\"card\">\r\n <div class=\"card-header border-0 pt-3 px-5\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\">Footfall Directory</span>\r\n <span class=\"text-sub mb-2\">Based on {{footfallList_req.fromDate | date: 'dd MMM, yyyy'}} \u2013 {{footfallList_req.toDate | date: 'dd MMM, yyyy'}} </span>\r\n </h3>\r\n </div>\r\n <span class=\"cursor-pointer\" (click)=\"toggleSidebar()\" style=\"position: absolute; top: 15px; right: -25px;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"68\" height=\"68\" viewBox=\"0 0 68 68\" fill=\"none\">\r\n<g filter=\"url(#filter0_dd_778_34282)\">\r\n<rect x=\"12\" width=\"44\" height=\"44\" rx=\"22\" fill=\"white\"/>\r\n<path d=\"M33 27L28 22L33 17M40 27L35 22L40 17\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<filter id=\"filter0_dd_778_34282\" x=\"0\" y=\"0\" width=\"68\" height=\"68\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n<feMorphology radius=\"2\" operator=\"erode\" in=\"SourceAlpha\" result=\"effect1_dropShadow_778_34282\"/>\r\n<feOffset dy=\"4\"/>\r\n<feGaussianBlur stdDeviation=\"3\"/>\r\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.03 0\"/>\r\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_778_34282\"/>\r\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n<feMorphology radius=\"4\" operator=\"erode\" in=\"SourceAlpha\" result=\"effect2_dropShadow_778_34282\"/>\r\n<feOffset dy=\"12\"/>\r\n<feGaussianBlur stdDeviation=\"8\"/>\r\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.08 0\"/>\r\n<feBlend mode=\"normal\" in2=\"effect1_dropShadow_778_34282\" result=\"effect2_dropShadow_778_34282\"/>\r\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_778_34282\" result=\"shape\"/>\r\n</filter>\r\n</defs>\r\n</svg>\r\n</span>\r\n <div class=\"text-end mt-10\">\r\n <button class=\"btn btn-outline w-25 me-3 btn-resize\" (click)=\"dataReset()\"> Reset </button>\r\n <button class=\"btn btn-primary w-25 me-5 btn-resize\" (click)=\"dataApply()\">Apply</button>\r\n </div>\r\n <div class=\"p-4 w-100 overflow-auto\">\r\n <input\r\n class=\"form-control form-control-sm mb-2 px-2 py-1 w-100\"\r\n type=\"text\"\r\n placeholder=\"Search\"\r\n [(ngModel)]=\"StoresSearchValue\"\r\n (change)=\"searchStoresData()\"\r\n/>\r\n\r\n <div class=\"mb-2 border-selectall\">\r\n <input type=\"checkbox\" [checked]=\"allSelected\" (change)=\"toggleSelectAll()\" />\r\n <label class=\"mt-2 font-semibold ms-2\">Select All {{storeCount}} Stores</label>\r\n </div>\r\n <ul class=\"list-unstyled ps-0\">\r\n <li *ngFor=\"let store of stores\" class=\"mb-5\">\r\n <input type=\"checkbox\" [checked]=\"isSelected(store)\" (change)=\"toggleStoreSelection(store)\" />\r\n {{ store?.storeName }}\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"isCollapsed ? 'col-12' : 'col-md-9'\" >\r\n <div class=\"card\">\r\n\r\n <div class=\"card-header border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <div *ngIf=\"selectedRevopsType?.value !== ''\" class=\"mb-2\">\r\n <input *ngIf=\"!footfallLoading && !footfallNoData\"\r\n type=\"checkbox\"\r\n [checked]=\"allSelectValue\"\r\n (change)=\"selectAllValue()\" />\r\n <label *ngIf=\"!footfallLoading && !footfallNoData\" class=\"mt-2 fs-6 font-semibold ms-2\">\r\n Select All (\r\n {{\r\n houseKeepingACCount > 0\r\n ? houseKeepingACCount\r\n : employeeACCount > 0\r\n ? employeeACCount\r\n : duplicateACCount > 0\r\n ? duplicateACCount\r\n : 0\r\n }}\r\n )\r\n</label>\r\n <!-- -->\r\n</div>\r\n </h3>\r\n <div class=\"card-toolbar\">\r\n <form class=\"mx-4\" [formGroup]=\"form\">\r\n <lib-reactive-select formControlName=\"selectedRevopsType\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"revopsTypeArray\" (itemChange)=\"RevopsTypeChange($event)\"></lib-reactive-select>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"selectedRevopsType?.value !== ''\" class=\"my-7 d-flex justify-content-end me-5\" role=\"group\">\r\n <button *ngIf=\"!footfallLoading && !footfallNoData\" [disabled]=\"checkedValue\" class=\"btn btn-outline me-1\" (click)=\"popupOpen('rejected',this.selectedRevopsType.value)\">Reject selection</button>\r\n <button *ngIf=\"!footfallLoading && !footfallNoData\" [disabled]=\"checkedValue\" class=\"btn btn-primary ms-1\" (click)=\"popupOpen('approved',this.selectedRevopsType.value)\">Approve selection</button>\r\n </div>\r\n <section *ngIf=\"selectedRevopsType?.value === ''\">\r\n <div *ngIf=\"!footfallLoading && !footfallNoData\" class=\"card-body mt-3 py-0\">\r\n\r\n <span class=\"cursor-pointer\" *ngIf=\"isCollapsed\" (click)=\"toggleSidebar()\" style=\"position: absolute; top: 15px; left: 0;\">\r\n <svg class=\"mt-2 ms-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M9.72714 12.6365L13.3635 9.00013L9.72714 5.36377M4.63623 12.6365L8.27259 9.00013L4.63623 5.36377\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n <div *ngIf=\"ticket?._source as source\" class=\"row mb-6\">\r\n <div class=\"col-2 card-title-label my-2\">Ticket Name</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-9 card-title-value my-2\">{{ source.ticketName ? (source.ticketName | titlecase) : '-' }}</div>\r\n <div class=\"col-2 card-title-label my-2\">Ticket ID</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-9 card-title-value my-2\">{{ source.ticketId ? source.ticketId:'-' }}</div>\r\n <div class=\"col-2 card-title-label my-2\">Store Name</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-9 card-title-value my-2\">{{ source.storeName ? source.storeName:'-' }}</div>\r\n <div class=\"col-2 card-title-label my-2\">Status</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 my-2\"><span \r\n class=\"badge\" \r\n [ngClass]=\"{\r\n 'badge-light-primary': source.status === 'open',\r\n 'badge-secondary': source.status === 'closed',\r\n 'badge-light-warning': source.status === 'pending',\r\n 'badge-light-danger': source.status === 'rejected'\r\n }\">\r\n {{ source.status ? (source.status | titlecase) : '-' }}\r\n</span></div>\r\n \r\n <div class=\"col-2 card-title-label my-2\">Date</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 card-title-value my-2\">{{ source.dateString ? (source.dateString | date: 'dd MMM, yyyy') :'- ' }}</div>\r\n </div>\r\n \r\n <div *ngIf=\"ticket?._source as source\" class=\"border-totalfootfall\">\r\n <div class=\"card-header ellipse1 min-h-45px py-1 px-5\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title\">{{ source?.footfallCount !== null ?\r\n source?.footfallCount : '--' }} <span class=\"sub-header ms-2\">Total Footfall</span></h5>\r\n \r\n </div>\r\n </div>\r\n <div class=\"card-body py-2 px-5\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-3 col-xl-3 col-md-3 my-3\">\r\n <h5 class=\"card-title\">{{ source?.duplicateCount !== null ?\r\n source?.duplicateCount : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Duplicates</span>\r\n </div>\r\n <div class=\"col-lg-3 col-xl-3 col-md-3 my-3\">\r\n <h5 class=\"card-title\">{{ source?.employeeCount !== null ?\r\n source?.employeeCount : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Employee/Staff</span>\r\n </div>\r\n \r\n <div class=\"col-lg-3 col-xl-3 col-md-3 my-3\">\r\n <h5 class=\"card-title\">{{ source?.houseKeepingCount !== null ?\r\n source?.houseKeepingCount : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">House Keeping</span>\r\n </div>\r\n <div class=\"col-lg-3 col-xl-3 col-md-3 my-3 vl\">\r\n <h5 class=\"card-title\"> {{ \r\n (source.footfallCount || 0) - \r\n ((source.houseKeepingCount || 0) + \r\n (source.employeeCount || 0) + \r\n (source.duplicateCount || 0)) \r\n }}</h5>\r\n <span class=\"card-title-sub-header\">Actual footfall</span>\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n \r\n \r\n <div *ngIf=\"ticket?._source as source\" class=\"my-4\">\r\n <h3 *ngIf=\"source?.duplicateImages?.length\" class=\"text-lg font-semibold mb-2\"> <span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_730_76157)\">\r\n <path\r\n d=\"M3.75 11.25H3C2.60218 11.25 2.22064 11.092 1.93934 10.8107C1.65804 10.5294 1.5 10.1478 1.5 9.75V3C1.5 2.60218 1.65804 2.22064 1.93934 1.93934C2.22064 1.65804 2.60218 1.5 3 1.5H9.75C10.1478 1.5 10.5294 1.65804 10.8107 1.93934C11.092 2.22064 11.25 2.60218 11.25 3V3.75M8.25 6.75H15C15.8284 6.75 16.5 7.42157 16.5 8.25V15C16.5 15.8284 15.8284 16.5 15 16.5H8.25C7.42157 16.5 6.75 15.8284 6.75 15V8.25C6.75 7.42157 7.42157 6.75 8.25 6.75Z\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_76157\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>Duplicates</h3>\r\n \r\n \r\n <div *ngFor=\"let original of source.duplicateImages\" class=\"mb-4\">\r\n <div *ngIf=\"source?.duplicateImages?.length\" class=\"duplicate-head my-2\">Original image</div>\r\n <div class=\"row\">\r\n <div class=\"col-md-3 relative\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3\">\r\n \r\n <img [src]=\"imageUrl + original.filePath\" alt=\"\" class=\"w-100 rounded border\" />\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{ original.tempId }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{ original.entryTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"duplicate-head my-2\">Duplicates</div>\r\n <div class=\"row\">\r\n <div class=\"col-md-3 position-relative\" *ngFor=\"let img of original.data\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3 position-relative\">\r\n <input *ngIf=\"source.status ==='pending'\"\r\n type=\"checkbox\"\r\n [(ngModel)]=\"img.selected\"\r\n class=\"position-absolute absolute form-check-input\"\r\n(change)=\"onImageCheckboxChange(img, 'duplicate', original)\"\r\n />\r\n <img [src]=\"imageUrl + img.filePath\" alt=\"\" class=\"w-100 mb-2 rounded border\" />\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{ img.tempId }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{ img.entryTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n <div *ngIf=\"source?.duplicateImages?.length\" class=\"my-7 d-flex justify-content-end\" role=\"group\">\r\n <button [disabled]=\"!duplicateACCount\" class=\"btn btn-outline me-1\" (click)=\"popupOpen('rejected','duplicate')\" >Reject</button>\r\n <button [disabled]=\"!duplicateACCount\" class=\"btn btn-primary ms-1\" (click)=\"popupOpen('approved','duplicate')\">Approve</button>\r\n </div>\r\n \r\n <div *ngIf=\"source?.employee?.length\" class=\"duplicate-head my-2\">Employee/Staff</div>\r\n <div class=\"row\">\r\n <div class=\"col-md-3 position-relative\" *ngFor=\"let img of source.employee\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3 position-relative\">\r\n \r\n <!-- Top-right Checkbox -->\r\n <input *ngIf=\"source.status ==='pending'\" type=\"checkbox\" [(ngModel)]=\"img.selected\"\r\n class=\"position-absolute absolute form-check-input\"\r\n (change)=\"onImageCheckboxChange(img, 'employee')\" />\r\n \r\n \r\n <!-- Image -->\r\n <img [src]=\"imageUrl + img.filePath\" alt=\"\" class=\"w-100 mb-2 rounded border\" />\r\n \r\n <!-- Details -->\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{img.tempId}}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{img.entryTime}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"source?.employee?.length\" class=\"my-7 d-flex justify-content-end\" role=\"group\">\r\n <button [disabled]=\"!employeeACCount\" class=\"btn btn-outline me-1\" (click)=\"popupOpen('rejected','employee')\" >Reject</button>\r\n <button [disabled]=\"!employeeACCount\" class=\"btn btn-primary ms-1\" (click)=\"popupOpen('approved','employee')\">Approve</button>\r\n </div>\r\n \r\n \r\n <div *ngIf=\"source?.houseKeeping?.length\" class=\"duplicate-head my-2\">House Keeping</div>\r\n <div class=\"row\">\r\n <div class=\"col-md-3 position-relative\" *ngFor=\"let img of source.houseKeeping\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3 position-relative\">\r\n \r\n <!-- Top-right Checkbox -->\r\n <input *ngIf=\"source.status ==='pending'\" type=\"checkbox\" [(ngModel)]=\"img.selected\"\r\n class=\"position-absolute absolute form-check-input\"\r\n (change)=\"onImageCheckboxChange(img, 'housekeeping')\" />\r\n \r\n \r\n <!-- Image -->\r\n <img [src]=\"imageUrl + img.filePath\" alt=\"\" class=\"w-100 mb-2 rounded border\" />\r\n \r\n <!-- Details -->\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{img.tempId}}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{img.entryTime}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"source?.houseKeeping?.length\" class=\"my-7 d-flex justify-content-end\" role=\"group\">\r\n <button [disabled]=\"!houseKeepingACCount\" class=\"btn btn-outline me-1\" (click)=\"popupOpen('reject','housekeeping')\" >Reject</button>\r\n <button [disabled]=\"!houseKeepingACCount\" class=\"btn btn-primary ms-1\" (click)=\"popupOpen('approved','housekeeping')\">Approve</button>\r\n </div>\r\n </div>\r\n \r\n </ng-container>\r\n <div *ngIf=\"!footfallLoading && !footfallNoData\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"pageSizeFootfall\" [currentPage]=\"footfallcurrentPage\" [totalItems]=\"totalItemsFootfall\"\r\n [paginationSizes]=\"paginationSizes\" [pageSize]=\"setFootfallpageSize()\" (pageChange)=\"onFootfallPageChange($event)\"\r\n (pageSizeChange)=\"onFootfallPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n \r\n </div>\r\n \r\n </section>\r\n <div *ngIf=\"footfallLoading\" class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"footfallNoData\" class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n \r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column \" style=\"margin: 64px;border-radius: 8px;\r\nbackground: var(--Gray-50, #F9FAFB);\">\r\n <svg class=\"my-5\" xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n <g clip-path=\"url(#clip0_730_75095)\">\r\n <path\r\n d=\"M55.3327 62V58.6667C55.3327 56.8986 54.6303 55.2029 53.3801 53.9526C52.1298 52.7024 50.4341 52 48.666 52H35.3327C33.5646 52 31.8689 52.7024 30.6186 53.9526C29.3684 55.2029 28.666 56.8986 28.666 58.6667V62M65.3327 62V58.6667C65.3316 57.1895 64.8399 55.7546 63.935 54.5872C63.03 53.4198 61.7629 52.5859 60.3327 52.2167M53.666 32.2167C55.1 32.5838 56.3711 33.4178 57.2787 34.5872C58.1864 35.7565 58.6791 37.1947 58.6791 38.675C58.6791 40.1553 58.1864 41.5935 57.2787 42.7628C56.3711 43.9322 55.1 44.7662 53.666 45.1333M48.666 38.6667C48.666 42.3486 45.6812 45.3333 41.9993 45.3333C38.3174 45.3333 35.3327 42.3486 35.3327 38.6667C35.3327 34.9848 38.3174 32 41.9993 32C45.6812 32 48.666 34.9848 48.666 38.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_75095\">\r\n <rect width=\"40\" height=\"40\" fill=\"white\" transform=\"translate(27 27)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <div class=\"nodata-title my-3\">No pending items</div>\r\n <div class=\"nodata-sub mb-3\">Looks like there is no action item required for <span\r\n *ngIf=\"selectedRevopsType?.value==='duplicateImages'\">duplicates</span><span\r\n *ngIf=\"selectedRevopsType?.value==='employee'\">employee/staff</span> <span\r\n *ngIf=\"selectedRevopsType?.value==='houseKeeping'\">houseKeeping</span></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Card Body -->\r\n <div *ngIf=\"selectedRevopsType?.value !== ''\" class=\"card-body mt-3 py-0\">\r\n <span class=\"cursor-pointer\" *ngIf=\"isCollapsed\" (click)=\"toggleSidebar()\" style=\"position: absolute; top: 15px; left: 0;\">\r\n <svg class=\"mt-2 ms-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M9.72714 12.6365L13.3635 9.00013L9.72714 5.36377M4.63623 12.6365L8.27259 9.00013L4.63623 5.36377\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n <div *ngIf=\"ticket?._source as source\" class=\"my-4\">\r\n <div *ngFor=\"let original of source.duplicateImages\" class=\"mb-4\">\r\n <div *ngIf=\"source?.duplicateImages?.length\" class=\"duplicate-head my-2\">Original image</div>\r\n <div class=\"row\">\r\n <!-- \u2705 Original Image -->\r\n <div class=\"col-md-3 relative\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3\">\r\n \r\n <img [src]=\"imageUrl + original.filePath\" alt=\"\" class=\"w-100 rounded border\" />\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{ original.tempId }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{ original.entryTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- \uD83D\uDFE8 Duplicate Images (for this original) -->\r\n <div class=\"duplicate-head my-2\">Duplicates</div>\r\n <div class=\"row\">\r\n <div class=\"col-md-3 position-relative\" *ngFor=\"let img of original.data\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3 position-relative\">\r\n <input *ngIf=\"source.status ==='pending'\" type=\"checkbox\" [(ngModel)]=\"img.selected\"\r\n class=\"position-absolute absolute form-check-input\"\r\n (change)=\"onImageCheckboxChange1(img, 'duplicate')\" />\r\n <img [src]=\"imageUrl + img.filePath\" alt=\"\" class=\"w-100 mb-2 rounded border\" />\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{ img.tempId }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{ img.entryTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"source?.employee?.length\" class=\"row\">\r\n <div class=\"col-md-3 position-relative\" *ngFor=\"let img of source.employee\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3 position-relative\">\r\n \r\n <!-- Top-right Checkbox -->\r\n <input *ngIf=\"source.status ==='pending'\" type=\"checkbox\" [(ngModel)]=\"img.selected\"\r\n class=\"position-absolute absolute form-check-input\"\r\n (change)=\"onImageCheckboxChange1(img, 'employee')\" />\r\n \r\n \r\n <!-- Image -->\r\n <img [src]=\"imageUrl + img.filePath\" alt=\"\" class=\"w-100 mb-2 rounded border\" />\r\n \r\n <!-- Details -->\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{img.tempId}}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{img.entryTime}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"source?.houseKeeping?.length\" class=\"row\">\r\n <div class=\"col-md-3 position-relative\" *ngFor=\"let img of source.houseKeeping\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3 position-relative\">\r\n \r\n <!-- Top-right Checkbox -->\r\n <input *ngIf=\"source.status ==='pending'\" type=\"checkbox\" [(ngModel)]=\"img.selected\"\r\n class=\"position-absolute absolute form-check-input\"\r\n (change)=\"onImageCheckboxChange1(img, 'housekeeping')\" />\r\n \r\n \r\n <!-- Image -->\r\n <img [src]=\"imageUrl + img.filePath\" alt=\"\" class=\"w-100 mb-2 rounded border\" />\r\n \r\n <!-- Details -->\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{img.tempId}}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{img.entryTime}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <div *ngIf=\"!footfallLoading && !footfallNoData\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"pageSizeFootfall\" [currentPage]=\"footfallcurrentPage\"\r\n [totalItems]=\"totalItemsFootfall\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"setFootfallpageSize()\"\r\n (pageChange)=\"onFootfallPageChange($event)\"\r\n (pageSizeChange)=\"onFootfallPageSizeChange($event)\"></lib-pagination>\r\n </div> -->\r\n </div>\r\n </div>\r\n \r\n </div>\r\n</div>\r\n\r\n<ng-template #zoomPopup let-model>\r\n <div class=\"p-4 m-4\">\r\n <div class=\"modal-header border-0 p-0 w-100 flex-column align-items-start\">\r\n \r\n <!-- Heading -->\r\n <h5 class=\"modal-title mb-2\">\r\n {{ popupType === 'approved' ? 'Approve' : 'Reject' }} Selected Images\r\n </h5>\r\n\r\n <!-- Description -->\r\n <p class=\"mb-3\">\r\n You're about to {{ popupType === 'approved' ? 'approve' : 'reject' }} the following number of selected images.\r\n </p>\r\n\r\n <!-- Count Box -->\r\n <div class=\"border border-1 rounded p-3 w-50 mb-4\">\r\n <div *ngIf=\"popupvalue === 'employee'\" class=\"fw-semibold fs-5 mb-2\">\r\n {{ employeeACCount || '--' }}\r\n </div>\r\n <div *ngIf=\"popupvalue === 'housekeeping'\" class=\"fw-semibold fs-5 mb-2\">\r\n {{ houseKeepingACCount || '--' }}\r\n </div>\r\n <div *ngIf=\"popupvalue === 'duplicate'\" class=\"fw-semibold fs-5 mb-2\">\r\n {{ duplicateACCount || '--' }}\r\n </div>\r\n <div class=\"fw-semibold text-muted fs-6 mt-2\">\r\n {{ popupvalue | titlecase }}s\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"w-100 d-flex justify-content-end\">\r\n <button class=\"btn btn-outline me-2\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary\" (click)=\"submitValue(popupType, popupvalue)\">\r\n {{ popupType === 'approved' ? 'Approve' : 'Reject' }}\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n", styles: [".card-header,.header{color:var(--Gray-900, #101828);font-size:20px!important;font-style:normal;font-weight:700;line-height:30px}.sub-header{color:var(--Gray-700, #344054);font-size:14px!important;font-style:normal;font-weight:600;line-height:20px}.ellipse1{border-radius:6px;border-bottom:2px solid var(--Gray-200, #EAECF0);background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.card-title-foot{color:var(--Gray-800, #1D2939)!important;font-size:18px;font-weight:600;line-height:28px}.card-title-label{color:var(--Gray-800, #1D2939)!important;font-size:16px;font-weight:600;line-height:28px}.card-title-value{color:var(--Gray-800, #1D2939)!important;font-size:16px;font-weight:400;line-height:28px}input[type=checkbox]{width:16px!important;height:16px!important;margin:7px 5px -2px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #D0D5DD)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.rotate{rotate:180deg;transition:1s}.border-selectall{border-radius:6px!important;border-bottom:1px solid var(--Gray-200, #EAECF0)!important;background:var(--White, #FFF)!important;padding:8px 2px}.border-selectall1{border-radius:6px!important;background:var(--White, #FFF)!important;padding:8px 2px}.border-totalfootfall{border-radius:12px;padding:4px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF)}.vl{border-left:2px solid #000;height:50px}.duplicate-head{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.img-border{border-radius:5px!important;border:2px solid var(--Gray-300, #D0D5DD)}.desc-title{color:var(--Gray-900, #101828);font-size:8px;font-weight:500;line-height:14px}.desc-value{color:var(--Gray-900, #475467);font-size:7px;font-weight:500;line-height:14px}.img-border{overflow:hidden;position:relative}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:1px!important}.absolute{top:5px;right:5px;z-index:2}.img-src{width:25%;height:20%}.backButtonright{border-radius:1000px!important;background:var(--text-primary, #FFF)!important;padding:12px!important;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808!important;box-shadow:0 8.727px 11.636px -2.909px #10182814,0 2.909px 4.364px -1.455px #10182808!important;position:absolute;top:30px;right:-10px;z-index:0}.backButtonleft{border-radius:1000px!important;background:#fff;padding:14px!important;border:var(--Gray-300, #D0D5DD);box-shadow:0 8.727px 11.636px -2.909px #10182814,0 2.909px 4.364px -1.455px #10182808;position:absolute;top:30px;left:-20px;z-index:5}.select-wrapper{position:relative;display:inline-block;width:100%}.placeholder-overlay{position:absolute;color:var(--Gray-500, #667085);font-family:Inter;font-size:16px!important;font-style:normal;font-weight:400;top:10px;left:15px;pointer-events:none;font-size:1.1rem;z-index:1}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.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: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i8.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["isDisabled", "idField", "nameField", "label", "data"], outputs: ["itemChange"] }, { kind: "component", type: i9.GroupSelectComponent, selector: "lib-group-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i7.DatePipe, name: "date" }] });
|
|
845
|
+
}
|
|
846
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FootfallDicComponent, decorators: [{
|
|
847
|
+
type: Component,
|
|
848
|
+
args: [{ selector: "lib-footfall-dic", template: "<div *ngIf=\"footfallView\" class=\"row\">\r\n <div class=\"col-md-3 mb-3\">\r\n <div class=\"card\">\r\n <div class=\"card-header ellipse1 py-1 px-5\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.totalTickets !== null ?\r\n getFootfallSummaryData?.totalTickets : '--' }}</h5>\r\n <span class=\"sub-header\">Total tickets</span>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-2 px-5\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-6 col-xl-9 col-md-6 my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.openTickets !== null ?\r\n getFootfallSummaryData?.openTickets : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Open</span>\r\n </div>\r\n <div class=\"col-lg-6 col-xl-3 col-md-6 my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.closedTickets !== null ?\r\n getFootfallSummaryData?.closedTickets : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Closed</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-9 mb-3\">\r\n <div class=\"card\">\r\n <div class=\"card-header ellipse1 py-1 px-5\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.noShopper !== null ?\r\n getFootfallSummaryData?.noShopper : '--' }}</h5>\r\n <div class=\"sub-header\">Non-Shoppers</div>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-2 px-5\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-4 col-xl-5 col-md-4 my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.duplicateCount !== null ?\r\n getFootfallSummaryData?.duplicateCount : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Duplicates</span>\r\n </div>\r\n <div class=\"col-lg-4 col-xl-5 col-md-4 my-3 \">\r\n <h5 class=\"card-title \">{{ getFootfallSummaryData?.employeeCount !== null ?\r\n getFootfallSummaryData?.employeeCount : '--' }}</h5>\r\n <span class=\"card-title-sub-header \">Employee/Staff</span>\r\n </div>\r\n <div class=\"col-lg-4 col-xl-2 col-md-4 my-3\">\r\n <h5 class=\"card-title \">{{ getFootfallSummaryData?.houseKeepingCount !== null ?\r\n getFootfallSummaryData?.houseKeepingCount : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Housekeeping</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"footfallView\" class=\"card\">\r\n <div class=\"card-header border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\">Ticket Info</span>\r\n <span class=\"text-sub mb-2\">Based on {{footfallList_req?.fromDate | date: 'dd MMM, yyyy'}} \u2013 {{footfallList_req?.toDate | date: 'dd MMM, yyyy'}} </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 svg-icon-1 position-absolute ms-3\">\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\"></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 me-2\" placeholder=\"Search\" autocomplete=\"off\"\r\n (change)=\"searchData()\" [(ngModel)]=\"searchValue\" />\r\n <!-- <lib-filters [dataObject]=\"dataObject\"\r\n (appliedFilters)=\"applyFilters($event)\"></lib-filters> -->\r\n\r\n <button type=\"button\" (click)=\"exportXLSX()\"\r\n class=\"btn btn-default mx-2 btn-outline btn-outline-default rounded-3 text-nowrap border-val\">\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\" />\r\n </svg>\r\n <span class=\"ms-2\">Export</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-body mt-3 py-0 px-0\">\r\n\r\n\r\n\r\n <div *ngIf=\"loading\" class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"noData\" class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\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=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for this Date</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!loading && !noData\" class=\"table-responsive\">\r\n <table class=\"table bottom-border text-nowrap \">\r\n <thead>\r\n <tr>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('storeName')\">Store Info<svg\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'storeName' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('ticketId')\">Ticket ID<svg\r\n [ngClass]=\"sortedColumn === 'ticketId' && sortDirection === 1 ? 'rotate' : ''\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'ticketId' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('dateString')\">Ticket raised on\r\n <svg [ngClass]=\"sortedColumn === 'dateString' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'dateString' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('footfallCount')\">Total footfalls\r\n <svg [ngClass]=\"sortedColumn === 'footfallCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'footfallCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('duplicateCount')\">Duplicates\r\n <svg [ngClass]=\"sortedColumn === 'duplicateCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'duplicateCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('employeeCount')\">Employee/Staff\r\n <svg [ngClass]=\"sortedColumn === 'employeeCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'employeeCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('houseKeepingCount')\">Housekeeping\r\n <svg [ngClass]=\"sortedColumn === 'houseKeepingCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'houseKeepingCount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n\r\n <th>Revised footfalls\r\n \r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('status')\">Status<svg\r\n [ngClass]=\"sortedColumn === 'status' && sortDirection === 1 ? 'rotate' : ''\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'status' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></th>\r\n <!-- <th >Actions</th> -->\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let ticket of footfallListData\">\r\n <ng-container *ngIf=\"ticket?._source as source\">\r\n <td (click)=\"dataStoreView(ticket)\">\r\n <div class=\"text-primary cursor-pointer\">{{ source.storeName }}</div>\r\n <div class=\"text-gray-500 fs-7 mt-2\">ID : {{ source.storeId }}</div>\r\n </td>\r\n \r\n <td class=\"py-7\">{{ source.ticketId }}</td>\r\n <td class=\"py-7\">{{ source.dateString | date: 'dd MMM, yyyy' }}</td>\r\n <td class=\"py-7\">{{ source.footfallCount }}</td>\r\n <td class=\"py-7\">{{ source.duplicateCount }}</td>\r\n <td class=\"py-7\">{{ source.employeeCount }}</td>\r\n <td class=\"py-7\">{{ source.houseKeepingCount }}</td>\r\n <td class=\"py-7\">\r\n {{ source.footfallCount - (source.houseKeepingCount + source.employeeCount +\r\n source.duplicateCount) }}\r\n </td>\r\n \r\n <td class=\"py-7\">\r\n <span *ngIf=\"source.status === 'open' || source.status === 'closed'\" class=\"badge mx-2\" [ngClass]=\"{\r\n 'badge-light-primary': source.status === 'open',\r\n 'badge-light-default': source.status === 'closed'\r\n }\">\r\n {{ source.status | titlecase }}\r\n </span>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div *ngIf=\"!loading && !noData\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\"\r\n [paginationSizes]=\"paginationSizes\" [pageSize]=\"setpageSize()\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n\r\n<div *ngIf=\"!footfallView\" class=\"card mt-2\">\r\n <form [formGroup]=\"filterForm\">\r\n <div class=\"row my-0\">\r\n <div class=\"col-lg-3 my-3\">\r\n <span class=\"ms-2 cursor-pointer\" (click)=\"backToNavigation()\" ><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"44\" viewBox=\"0 0 56 44\"\r\n fill=\"none\">\r\n <g filter=\"url(#filter0_d_887_4505)\">\r\n <rect x=\"2\" y=\"1\" width=\"52\" height=\"40\" rx=\"8\" fill=\"white\" />\r\n <rect x=\"2.5\" y=\"1.5\" width=\"51\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\r\n <path d=\"M30.5 26L25.5 21L30.5 16\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_887_4505\" x=\"0\" y=\"0\" width=\"56\" height=\"44\" filterUnits=\"userSpaceOnUse\"\r\n color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_887_4505\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_887_4505\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg></span>\r\n <span class=\"card-title-foot ms-3\">Footfall Directory</span>\r\n </div>\r\n <div class=\"col-md-2 my-3\">\r\n \r\n <lib-reactive-select formControlName=\"selectedStatus\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"type\"\r\n (itemChange)=\"typeChange($event)\"></lib-reactive-select>\r\n \r\n\r\n </div>\r\n <div class=\"col-md-2 my-3\">\r\n \r\n <lib-reactive-select formControlName=\"actionStatus\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"pendingArray\"\r\n (itemChange)=\"pendingChange($event)\"></lib-reactive-select>\r\n \r\n </div>\r\n <div class=\"col-md-3 my-4\" >\r\n <div class=\"select-wrapper\">\r\n <div class=\"placeholder-overlay\" *ngIf=\"!(filterForm.get('ClusterList')?.value?.length)\">\r\n Select cluster\r\n </div>\r\n <lib-group-select [items]=\"ClusterList\" [disabled]=\"false\" [multi]=\"true\"\r\n [searchField]=\"'groupName'\" [idField]=\"'groupName'\" (selected)=\"ongroupSelect($event)\"\r\n [selectedValues]=\"filterForm.get('ClusterList')?.value\">\r\n </lib-group-select>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-2 my-4\">\r\n <div class=\"d-flex me-3\">\r\n <a (click)=\"onFilterApply()\" type=\"submit\" class=\"btn btn-sm btn-primary px-4 \"><span>Apply</span></a>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n</div>\r\n<div *ngIf=\"!footfallView\" class=\"row mt-3\">\r\n <div class=\"position-relative\" \r\n [ngClass]=\"isCollapsed ? 'd-none' : 'col-md-3'\" >\r\n <div class=\"card\">\r\n <div class=\"card-header border-0 pt-3 px-5\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\">Footfall Directory</span>\r\n <span class=\"text-sub mb-2\">Based on {{footfallList_req.fromDate | date: 'dd MMM, yyyy'}} \u2013 {{footfallList_req.toDate | date: 'dd MMM, yyyy'}} </span>\r\n </h3>\r\n </div>\r\n <span class=\"cursor-pointer\" (click)=\"toggleSidebar()\" style=\"position: absolute; top: 15px; right: -25px;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"68\" height=\"68\" viewBox=\"0 0 68 68\" fill=\"none\">\r\n<g filter=\"url(#filter0_dd_778_34282)\">\r\n<rect x=\"12\" width=\"44\" height=\"44\" rx=\"22\" fill=\"white\"/>\r\n<path d=\"M33 27L28 22L33 17M40 27L35 22L40 17\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<filter id=\"filter0_dd_778_34282\" x=\"0\" y=\"0\" width=\"68\" height=\"68\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n<feMorphology radius=\"2\" operator=\"erode\" in=\"SourceAlpha\" result=\"effect1_dropShadow_778_34282\"/>\r\n<feOffset dy=\"4\"/>\r\n<feGaussianBlur stdDeviation=\"3\"/>\r\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.03 0\"/>\r\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_778_34282\"/>\r\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n<feMorphology radius=\"4\" operator=\"erode\" in=\"SourceAlpha\" result=\"effect2_dropShadow_778_34282\"/>\r\n<feOffset dy=\"12\"/>\r\n<feGaussianBlur stdDeviation=\"8\"/>\r\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.08 0\"/>\r\n<feBlend mode=\"normal\" in2=\"effect1_dropShadow_778_34282\" result=\"effect2_dropShadow_778_34282\"/>\r\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_778_34282\" result=\"shape\"/>\r\n</filter>\r\n</defs>\r\n</svg>\r\n</span>\r\n <div class=\"text-end mt-10\">\r\n <button class=\"btn btn-outline w-25 me-3 btn-resize\" (click)=\"dataReset()\"> Reset </button>\r\n <button class=\"btn btn-primary w-25 me-5 btn-resize\" (click)=\"dataApply()\">Apply</button>\r\n </div>\r\n <div class=\"p-4 w-100 overflow-auto\">\r\n <input\r\n class=\"form-control form-control-sm mb-2 px-2 py-1 w-100\"\r\n type=\"text\"\r\n placeholder=\"Search\"\r\n [(ngModel)]=\"StoresSearchValue\"\r\n (change)=\"searchStoresData()\"\r\n/>\r\n\r\n <div class=\"mb-2 border-selectall\">\r\n <input type=\"checkbox\" [checked]=\"allSelected\" (change)=\"toggleSelectAll()\" />\r\n <label class=\"mt-2 font-semibold ms-2\">Select All {{storeCount}} Stores</label>\r\n </div>\r\n <ul class=\"list-unstyled ps-0\">\r\n <li *ngFor=\"let store of stores\" class=\"mb-5\">\r\n <input type=\"checkbox\" [checked]=\"isSelected(store)\" (change)=\"toggleStoreSelection(store)\" />\r\n {{ store?.storeName }}\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"isCollapsed ? 'col-12' : 'col-md-9'\" >\r\n <div class=\"card\">\r\n\r\n <div class=\"card-header border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <div *ngIf=\"selectedRevopsType?.value !== ''\" class=\"mb-2\">\r\n <input *ngIf=\"!footfallLoading && !footfallNoData\"\r\n type=\"checkbox\"\r\n [checked]=\"allSelectValue\"\r\n (change)=\"selectAllValue()\" />\r\n <label *ngIf=\"!footfallLoading && !footfallNoData\" class=\"mt-2 fs-6 font-semibold ms-2\">\r\n Select All (\r\n {{\r\n houseKeepingACCount > 0\r\n ? houseKeepingACCount\r\n : employeeACCount > 0\r\n ? employeeACCount\r\n : duplicateACCount > 0\r\n ? duplicateACCount\r\n : 0\r\n }}\r\n )\r\n</label>\r\n <!-- -->\r\n</div>\r\n </h3>\r\n <div class=\"card-toolbar\">\r\n <form class=\"mx-4\" [formGroup]=\"form\">\r\n <lib-reactive-select formControlName=\"selectedRevopsType\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"revopsTypeArray\" (itemChange)=\"RevopsTypeChange($event)\"></lib-reactive-select>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"selectedRevopsType?.value !== ''\" class=\"my-7 d-flex justify-content-end me-5\" role=\"group\">\r\n <button *ngIf=\"!footfallLoading && !footfallNoData\" [disabled]=\"checkedValue\" class=\"btn btn-outline me-1\" (click)=\"popupOpen('rejected',this.selectedRevopsType.value)\">Reject selection</button>\r\n <button *ngIf=\"!footfallLoading && !footfallNoData\" [disabled]=\"checkedValue\" class=\"btn btn-primary ms-1\" (click)=\"popupOpen('approved',this.selectedRevopsType.value)\">Approve selection</button>\r\n </div>\r\n <section *ngIf=\"selectedRevopsType?.value === ''\">\r\n <div *ngIf=\"!footfallLoading && !footfallNoData\" class=\"card-body mt-3 py-0\">\r\n\r\n <span class=\"cursor-pointer\" *ngIf=\"isCollapsed\" (click)=\"toggleSidebar()\" style=\"position: absolute; top: 15px; left: 0;\">\r\n <svg class=\"mt-2 ms-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M9.72714 12.6365L13.3635 9.00013L9.72714 5.36377M4.63623 12.6365L8.27259 9.00013L4.63623 5.36377\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n <div *ngIf=\"ticket?._source as source\" class=\"row mb-6\">\r\n <div class=\"col-2 card-title-label my-2\">Ticket Name</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-9 card-title-value my-2\">{{ source.ticketName ? (source.ticketName | titlecase) : '-' }}</div>\r\n <div class=\"col-2 card-title-label my-2\">Ticket ID</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-9 card-title-value my-2\">{{ source.ticketId ? source.ticketId:'-' }}</div>\r\n <div class=\"col-2 card-title-label my-2\">Store Name</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-9 card-title-value my-2\">{{ source.storeName ? source.storeName:'-' }}</div>\r\n <div class=\"col-2 card-title-label my-2\">Status</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 my-2\"><span \r\n class=\"badge\" \r\n [ngClass]=\"{\r\n 'badge-light-primary': source.status === 'open',\r\n 'badge-secondary': source.status === 'closed',\r\n 'badge-light-warning': source.status === 'pending',\r\n 'badge-light-danger': source.status === 'rejected'\r\n }\">\r\n {{ source.status ? (source.status | titlecase) : '-' }}\r\n</span></div>\r\n \r\n <div class=\"col-2 card-title-label my-2\">Date</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 card-title-value my-2\">{{ source.dateString ? (source.dateString | date: 'dd MMM, yyyy') :'- ' }}</div>\r\n </div>\r\n \r\n <div *ngIf=\"ticket?._source as source\" class=\"border-totalfootfall\">\r\n <div class=\"card-header ellipse1 min-h-45px py-1 px-5\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title\">{{ source?.footfallCount !== null ?\r\n source?.footfallCount : '--' }} <span class=\"sub-header ms-2\">Total Footfall</span></h5>\r\n \r\n </div>\r\n </div>\r\n <div class=\"card-body py-2 px-5\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-3 col-xl-3 col-md-3 my-3\">\r\n <h5 class=\"card-title\">{{ source?.duplicateCount !== null ?\r\n source?.duplicateCount : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Duplicates</span>\r\n </div>\r\n <div class=\"col-lg-3 col-xl-3 col-md-3 my-3\">\r\n <h5 class=\"card-title\">{{ source?.employeeCount !== null ?\r\n source?.employeeCount : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Employee/Staff</span>\r\n </div>\r\n \r\n <div class=\"col-lg-3 col-xl-3 col-md-3 my-3\">\r\n <h5 class=\"card-title\">{{ source?.houseKeepingCount !== null ?\r\n source?.houseKeepingCount : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">House Keeping</span>\r\n </div>\r\n <div class=\"col-lg-3 col-xl-3 col-md-3 my-3 vl\">\r\n <h5 class=\"card-title\"> {{ \r\n (source.footfallCount || 0) - \r\n ((source.houseKeepingCount || 0) + \r\n (source.employeeCount || 0) + \r\n (source.duplicateCount || 0)) \r\n }}</h5>\r\n <span class=\"card-title-sub-header\">Actual footfall</span>\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n \r\n \r\n <div *ngIf=\"ticket?._source as source\" class=\"my-4\">\r\n <h3 *ngIf=\"source?.duplicateImages?.length\" class=\"text-lg font-semibold mb-2\"> <span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_730_76157)\">\r\n <path\r\n d=\"M3.75 11.25H3C2.60218 11.25 2.22064 11.092 1.93934 10.8107C1.65804 10.5294 1.5 10.1478 1.5 9.75V3C1.5 2.60218 1.65804 2.22064 1.93934 1.93934C2.22064 1.65804 2.60218 1.5 3 1.5H9.75C10.1478 1.5 10.5294 1.65804 10.8107 1.93934C11.092 2.22064 11.25 2.60218 11.25 3V3.75M8.25 6.75H15C15.8284 6.75 16.5 7.42157 16.5 8.25V15C16.5 15.8284 15.8284 16.5 15 16.5H8.25C7.42157 16.5 6.75 15.8284 6.75 15V8.25C6.75 7.42157 7.42157 6.75 8.25 6.75Z\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_76157\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>Duplicates</h3>\r\n \r\n \r\n <div *ngFor=\"let original of source.duplicateImages\" class=\"mb-4\">\r\n <div *ngIf=\"source?.duplicateImages?.length\" class=\"duplicate-head my-2\">Original image</div>\r\n <div class=\"row\">\r\n <div class=\"col-md-3 relative\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3\">\r\n \r\n <img [src]=\"imageUrl + original.filePath\" alt=\"\" class=\"w-100 rounded border\" />\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{ original.tempId }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{ original.entryTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"duplicate-head my-2\">Duplicates</div>\r\n <div class=\"row\">\r\n <div class=\"col-md-3 position-relative\" *ngFor=\"let img of original.data\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3 position-relative\">\r\n <input *ngIf=\"source.status ==='pending'\"\r\n type=\"checkbox\"\r\n [(ngModel)]=\"img.selected\"\r\n class=\"position-absolute absolute form-check-input\"\r\n(change)=\"onImageCheckboxChange(img, 'duplicate', original)\"\r\n />\r\n <img [src]=\"imageUrl + img.filePath\" alt=\"\" class=\"w-100 mb-2 rounded border\" />\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{ img.tempId }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{ img.entryTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n <div *ngIf=\"source?.duplicateImages?.length\" class=\"my-7 d-flex justify-content-end\" role=\"group\">\r\n <button [disabled]=\"!duplicateACCount\" class=\"btn btn-outline me-1\" (click)=\"popupOpen('rejected','duplicate')\" >Reject</button>\r\n <button [disabled]=\"!duplicateACCount\" class=\"btn btn-primary ms-1\" (click)=\"popupOpen('approved','duplicate')\">Approve</button>\r\n </div>\r\n \r\n <div *ngIf=\"source?.employee?.length\" class=\"duplicate-head my-2\">Employee/Staff</div>\r\n <div class=\"row\">\r\n <div class=\"col-md-3 position-relative\" *ngFor=\"let img of source.employee\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3 position-relative\">\r\n \r\n <!-- Top-right Checkbox -->\r\n <input *ngIf=\"source.status ==='pending'\" type=\"checkbox\" [(ngModel)]=\"img.selected\"\r\n class=\"position-absolute absolute form-check-input\"\r\n (change)=\"onImageCheckboxChange(img, 'employee')\" />\r\n \r\n \r\n <!-- Image -->\r\n <img [src]=\"imageUrl + img.filePath\" alt=\"\" class=\"w-100 mb-2 rounded border\" />\r\n \r\n <!-- Details -->\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{img.tempId}}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{img.entryTime}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"source?.employee?.length\" class=\"my-7 d-flex justify-content-end\" role=\"group\">\r\n <button [disabled]=\"!employeeACCount\" class=\"btn btn-outline me-1\" (click)=\"popupOpen('rejected','employee')\" >Reject</button>\r\n <button [disabled]=\"!employeeACCount\" class=\"btn btn-primary ms-1\" (click)=\"popupOpen('approved','employee')\">Approve</button>\r\n </div>\r\n \r\n \r\n <div *ngIf=\"source?.houseKeeping?.length\" class=\"duplicate-head my-2\">House Keeping</div>\r\n <div class=\"row\">\r\n <div class=\"col-md-3 position-relative\" *ngFor=\"let img of source.houseKeeping\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3 position-relative\">\r\n \r\n <!-- Top-right Checkbox -->\r\n <input *ngIf=\"source.status ==='pending'\" type=\"checkbox\" [(ngModel)]=\"img.selected\"\r\n class=\"position-absolute absolute form-check-input\"\r\n (change)=\"onImageCheckboxChange(img, 'housekeeping')\" />\r\n \r\n \r\n <!-- Image -->\r\n <img [src]=\"imageUrl + img.filePath\" alt=\"\" class=\"w-100 mb-2 rounded border\" />\r\n \r\n <!-- Details -->\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{img.tempId}}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{img.entryTime}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"source?.houseKeeping?.length\" class=\"my-7 d-flex justify-content-end\" role=\"group\">\r\n <button [disabled]=\"!houseKeepingACCount\" class=\"btn btn-outline me-1\" (click)=\"popupOpen('reject','housekeeping')\" >Reject</button>\r\n <button [disabled]=\"!houseKeepingACCount\" class=\"btn btn-primary ms-1\" (click)=\"popupOpen('approved','housekeeping')\">Approve</button>\r\n </div>\r\n </div>\r\n \r\n </ng-container>\r\n <div *ngIf=\"!footfallLoading && !footfallNoData\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"pageSizeFootfall\" [currentPage]=\"footfallcurrentPage\" [totalItems]=\"totalItemsFootfall\"\r\n [paginationSizes]=\"paginationSizes\" [pageSize]=\"setFootfallpageSize()\" (pageChange)=\"onFootfallPageChange($event)\"\r\n (pageSizeChange)=\"onFootfallPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n \r\n </div>\r\n \r\n </section>\r\n <div *ngIf=\"footfallLoading\" class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"footfallNoData\" class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n \r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column \" style=\"margin: 64px;border-radius: 8px;\r\nbackground: var(--Gray-50, #F9FAFB);\">\r\n <svg class=\"my-5\" xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n <g clip-path=\"url(#clip0_730_75095)\">\r\n <path\r\n d=\"M55.3327 62V58.6667C55.3327 56.8986 54.6303 55.2029 53.3801 53.9526C52.1298 52.7024 50.4341 52 48.666 52H35.3327C33.5646 52 31.8689 52.7024 30.6186 53.9526C29.3684 55.2029 28.666 56.8986 28.666 58.6667V62M65.3327 62V58.6667C65.3316 57.1895 64.8399 55.7546 63.935 54.5872C63.03 53.4198 61.7629 52.5859 60.3327 52.2167M53.666 32.2167C55.1 32.5838 56.3711 33.4178 57.2787 34.5872C58.1864 35.7565 58.6791 37.1947 58.6791 38.675C58.6791 40.1553 58.1864 41.5935 57.2787 42.7628C56.3711 43.9322 55.1 44.7662 53.666 45.1333M48.666 38.6667C48.666 42.3486 45.6812 45.3333 41.9993 45.3333C38.3174 45.3333 35.3327 42.3486 35.3327 38.6667C35.3327 34.9848 38.3174 32 41.9993 32C45.6812 32 48.666 34.9848 48.666 38.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_75095\">\r\n <rect width=\"40\" height=\"40\" fill=\"white\" transform=\"translate(27 27)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <div class=\"nodata-title my-3\">No pending items</div>\r\n <div class=\"nodata-sub mb-3\">Looks like there is no action item required for <span\r\n *ngIf=\"selectedRevopsType?.value==='duplicateImages'\">duplicates</span><span\r\n *ngIf=\"selectedRevopsType?.value==='employee'\">employee/staff</span> <span\r\n *ngIf=\"selectedRevopsType?.value==='houseKeeping'\">houseKeeping</span></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Card Body -->\r\n <div *ngIf=\"selectedRevopsType?.value !== ''\" class=\"card-body mt-3 py-0\">\r\n <span class=\"cursor-pointer\" *ngIf=\"isCollapsed\" (click)=\"toggleSidebar()\" style=\"position: absolute; top: 15px; left: 0;\">\r\n <svg class=\"mt-2 ms-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M9.72714 12.6365L13.3635 9.00013L9.72714 5.36377M4.63623 12.6365L8.27259 9.00013L4.63623 5.36377\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n <div *ngIf=\"ticket?._source as source\" class=\"my-4\">\r\n <div *ngFor=\"let original of source.duplicateImages\" class=\"mb-4\">\r\n <div *ngIf=\"source?.duplicateImages?.length\" class=\"duplicate-head my-2\">Original image</div>\r\n <div class=\"row\">\r\n <!-- \u2705 Original Image -->\r\n <div class=\"col-md-3 relative\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3\">\r\n \r\n <img [src]=\"imageUrl + original.filePath\" alt=\"\" class=\"w-100 rounded border\" />\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{ original.tempId }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{ original.entryTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- \uD83D\uDFE8 Duplicate Images (for this original) -->\r\n <div class=\"duplicate-head my-2\">Duplicates</div>\r\n <div class=\"row\">\r\n <div class=\"col-md-3 position-relative\" *ngFor=\"let img of original.data\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3 position-relative\">\r\n <input *ngIf=\"source.status ==='pending'\" type=\"checkbox\" [(ngModel)]=\"img.selected\"\r\n class=\"position-absolute absolute form-check-input\"\r\n (change)=\"onImageCheckboxChange1(img, 'duplicate')\" />\r\n <img [src]=\"imageUrl + img.filePath\" alt=\"\" class=\"w-100 mb-2 rounded border\" />\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{ img.tempId }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{ img.entryTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"source?.employee?.length\" class=\"row\">\r\n <div class=\"col-md-3 position-relative\" *ngFor=\"let img of source.employee\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3 position-relative\">\r\n \r\n <!-- Top-right Checkbox -->\r\n <input *ngIf=\"source.status ==='pending'\" type=\"checkbox\" [(ngModel)]=\"img.selected\"\r\n class=\"position-absolute absolute form-check-input\"\r\n (change)=\"onImageCheckboxChange1(img, 'employee')\" />\r\n \r\n \r\n <!-- Image -->\r\n <img [src]=\"imageUrl + img.filePath\" alt=\"\" class=\"w-100 mb-2 rounded border\" />\r\n \r\n <!-- Details -->\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{img.tempId}}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{img.entryTime}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"source?.houseKeeping?.length\" class=\"row\">\r\n <div class=\"col-md-3 position-relative\" *ngFor=\"let img of source.houseKeeping\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3 position-relative\">\r\n \r\n <!-- Top-right Checkbox -->\r\n <input *ngIf=\"source.status ==='pending'\" type=\"checkbox\" [(ngModel)]=\"img.selected\"\r\n class=\"position-absolute absolute form-check-input\"\r\n (change)=\"onImageCheckboxChange1(img, 'housekeeping')\" />\r\n \r\n \r\n <!-- Image -->\r\n <img [src]=\"imageUrl + img.filePath\" alt=\"\" class=\"w-100 mb-2 rounded border\" />\r\n \r\n <!-- Details -->\r\n <div class=\"desc-title ms-2 mt-2\">Temp ID: {{img.tempId}}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{img.entryTime}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <div *ngIf=\"!footfallLoading && !footfallNoData\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"pageSizeFootfall\" [currentPage]=\"footfallcurrentPage\"\r\n [totalItems]=\"totalItemsFootfall\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"setFootfallpageSize()\"\r\n (pageChange)=\"onFootfallPageChange($event)\"\r\n (pageSizeChange)=\"onFootfallPageSizeChange($event)\"></lib-pagination>\r\n </div> -->\r\n </div>\r\n </div>\r\n \r\n </div>\r\n</div>\r\n\r\n<ng-template #zoomPopup let-model>\r\n <div class=\"p-4 m-4\">\r\n <div class=\"modal-header border-0 p-0 w-100 flex-column align-items-start\">\r\n \r\n <!-- Heading -->\r\n <h5 class=\"modal-title mb-2\">\r\n {{ popupType === 'approved' ? 'Approve' : 'Reject' }} Selected Images\r\n </h5>\r\n\r\n <!-- Description -->\r\n <p class=\"mb-3\">\r\n You're about to {{ popupType === 'approved' ? 'approve' : 'reject' }} the following number of selected images.\r\n </p>\r\n\r\n <!-- Count Box -->\r\n <div class=\"border border-1 rounded p-3 w-50 mb-4\">\r\n <div *ngIf=\"popupvalue === 'employee'\" class=\"fw-semibold fs-5 mb-2\">\r\n {{ employeeACCount || '--' }}\r\n </div>\r\n <div *ngIf=\"popupvalue === 'housekeeping'\" class=\"fw-semibold fs-5 mb-2\">\r\n {{ houseKeepingACCount || '--' }}\r\n </div>\r\n <div *ngIf=\"popupvalue === 'duplicate'\" class=\"fw-semibold fs-5 mb-2\">\r\n {{ duplicateACCount || '--' }}\r\n </div>\r\n <div class=\"fw-semibold text-muted fs-6 mt-2\">\r\n {{ popupvalue | titlecase }}s\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"w-100 d-flex justify-content-end\">\r\n <button class=\"btn btn-outline me-2\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary\" (click)=\"submitValue(popupType, popupvalue)\">\r\n {{ popupType === 'approved' ? 'Approve' : 'Reject' }}\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n", styles: [".card-header,.header{color:var(--Gray-900, #101828);font-size:20px!important;font-style:normal;font-weight:700;line-height:30px}.sub-header{color:var(--Gray-700, #344054);font-size:14px!important;font-style:normal;font-weight:600;line-height:20px}.ellipse1{border-radius:6px;border-bottom:2px solid var(--Gray-200, #EAECF0);background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.card-title-foot{color:var(--Gray-800, #1D2939)!important;font-size:18px;font-weight:600;line-height:28px}.card-title-label{color:var(--Gray-800, #1D2939)!important;font-size:16px;font-weight:600;line-height:28px}.card-title-value{color:var(--Gray-800, #1D2939)!important;font-size:16px;font-weight:400;line-height:28px}input[type=checkbox]{width:16px!important;height:16px!important;margin:7px 5px -2px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #D0D5DD)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.rotate{rotate:180deg;transition:1s}.border-selectall{border-radius:6px!important;border-bottom:1px solid var(--Gray-200, #EAECF0)!important;background:var(--White, #FFF)!important;padding:8px 2px}.border-selectall1{border-radius:6px!important;background:var(--White, #FFF)!important;padding:8px 2px}.border-totalfootfall{border-radius:12px;padding:4px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF)}.vl{border-left:2px solid #000;height:50px}.duplicate-head{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.img-border{border-radius:5px!important;border:2px solid var(--Gray-300, #D0D5DD)}.desc-title{color:var(--Gray-900, #101828);font-size:8px;font-weight:500;line-height:14px}.desc-value{color:var(--Gray-900, #475467);font-size:7px;font-weight:500;line-height:14px}.img-border{overflow:hidden;position:relative}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:1px!important}.absolute{top:5px;right:5px;z-index:2}.img-src{width:25%;height:20%}.backButtonright{border-radius:1000px!important;background:var(--text-primary, #FFF)!important;padding:12px!important;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808!important;box-shadow:0 8.727px 11.636px -2.909px #10182814,0 2.909px 4.364px -1.455px #10182808!important;position:absolute;top:30px;right:-10px;z-index:0}.backButtonleft{border-radius:1000px!important;background:#fff;padding:14px!important;border:var(--Gray-300, #D0D5DD);box-shadow:0 8.727px 11.636px -2.909px #10182814,0 2.909px 4.364px -1.455px #10182808;position:absolute;top:30px;left:-20px;z-index:5}.select-wrapper{position:relative;display:inline-block;width:100%}.placeholder-overlay{position:absolute;color:var(--Gray-500, #667085);font-family:Inter;font-size:16px!important;font-style:normal;font-weight:400;top:10px;left:15px;pointer-events:none;font-size:1.1rem;z-index:1}\n"] }]
|
|
849
|
+
}], ctorParameters: () => [{ type: i1.GlobalStateService }, { type: i2.TicketService }, { type: i0.ChangeDetectorRef }, { type: i3.ToastService }, { type: i4.NgbModal }, { type: i5.ExcelService }, { type: i6.FormBuilder }], propDecorators: { zoomPopup: [{
|
|
850
|
+
type: ViewChild,
|
|
851
|
+
args: ['zoomPopup']
|
|
852
|
+
}] } });
|
|
853
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9vdGZhbGwtZGljLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS10aWNrZXRzL3NyYy9saWIvY29tcG9uZW50cy9mb290ZmFsbC1kaWMvZm9vdGZhbGwtZGljLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS10aWNrZXRzL3NyYy9saWIvY29tcG9uZW50cy9mb290ZmFsbC1kaWMvZm9vdGZhbGwtZGljLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUErQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckcsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLMUMsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7OztBQVExRCxNQUFNLE9BQU8sb0JBQW9CO0lBeURyQjtJQUNBO0lBQ0E7SUFDQTtJQUE0QjtJQUM1QjtJQUFtQztJQTVEN0MsV0FBVyxDQUFNO0lBQ2pCLE9BQU8sR0FBWSxLQUFLLENBQUM7SUFDekIsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUN4QixZQUFZLEdBQU0sRUFBRSxDQUFDO0lBQ3JCLGFBQWEsR0FBTSxDQUFDLENBQUM7SUFFckIsWUFBWSxHQUFXLElBQUksQ0FBQztJQUM1QixhQUFhLENBQU07SUFDbkIsZ0JBQWdCLENBQU07SUFDdEIsSUFBSSxDQUFNO0lBQ1Ysa0JBQWtCLENBQWM7SUFDOUIsZUFBZSxHQUFRO1FBQ3ZCLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1FBQzNCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUU7UUFDakQsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFF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QU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2xELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNsQixDQUFDO3dHQTc4QlMsb0JBQW9COzRGQUFwQixvQkFBb0IsZ0tDZGpDLDBvbERBNnhCQTs7NEZEL3dCYSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0Usa0JBQWtCOzBQQXE1QkosU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsRWxlbWVudFJlZixWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBUaWNrZXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGlja2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgRXhjZWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXhjZWwuc2VydmljZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJsaWItZm9vdGZhbGwtZGljXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9mb290ZmFsbC1kaWMuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL2Zvb3RmYWxsLWRpYy5jb21wb25lbnQuc2Nzc1wiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9vdGZhbGxEaWNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsT25EZXN0cm95IHtcclxuICBzZWFyY2hWYWx1ZTogYW55O1xyXG4gIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBub0RhdGE6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzb3J0ZWRDb2x1bW46IGFueT0nJztcclxuICBzb3J0RGlyZWN0aW9uOiBhbnk9MTtcclxuXHJcbiAgZm9vdGZhbGxWaWV3OmJvb2xlYW4gPSB0cnVlO1xyXG4gIGhlYWRlckZpbHRlcnM6IGFueTtcclxuICBmb290ZmFsbExpc3RfcmVxOiBhbnk7XHJcbiAgZm9ybTogYW55O1xyXG4gIHNlbGVjdGVkUmV2b3BzVHlwZTogRm9ybUNvbnRyb2w7XHJcbiAgICByZXZvcHNUeXBlQXJyYXk6IGFueSA9IFtcclxuICAgIHsgdmFsdWU6IFwiXCIsIGxhYmVsOiBcIkFsbFwiIH0sXHJcbiAgICB7IHZhbHVlOiBcImR1cGxpY2F0ZUltYWdlc1wiLCBsYWJlbDogXCJEdXBsaWNhdGVzXCIgfSxcclxuICAgIHsgdmFsdWU6IFwiZW1wbG95ZWVcIiwgbGFiZWw6IFwiRW1wbG95ZWUvU3RhZmZcIiB9LFxyXG4gICAgeyB2YWx1ZTogXCJob3VzZUtlZXBpbmdcIiwgbGFiZWw6IFwiSG91c2UgS2VlcGluZ1wiIH0sXHJcbiAgXTtcclxuICB0eXBlOiBhbnkgPSBbXHJcbiAgICB7IHZhbHVlOiBcIm9wZW5cIiwgbGFiZWw6IFwiT3BlblwiIH0sXHJcbiAgICB7IHZhbHVlOiBcImNsb3NlZFwiLCBsYWJlbDogXCJDbG9zZWRcIiB9LFxyXG4gIF07XHJcbiAgLy8gc2VsZWN0ZWRTdGF0dXM6IEZvcm1Db250cm9sO1xyXG5cclxuICAgIHBlbmRpbmdBcnJheTogYW55ID0gW1xyXG4gICAgICAgeyB2YWx1ZTogXCJcIiwgbGFiZWw6IFwiQWxsXCIgfSxcclxuICAgIHsgdmFsdWU6IFwicGVuZGluZ1wiLCBsYWJlbDogXCJQZW5kaW5nXCIgfSxcclxuICAgIHsgdmFsdWU6IFwiYXBwcm92ZWRcIiwgbGFiZWw6IFwiQXBwcm92ZWRcIiB9LFxyXG4gICAgeyB2YWx1ZTogXCJyZWplY3RlZFwiLCBsYWJlbDogXCJSZWplY3RlZFwiIH0sXHJcbiAgXTtcclxuICBhY3Rpb25TdGF0dXM6IEZvcm1Db250cm9sO1xyXG4gIGZpbHRlckZvcm06YW55O1xyXG5cclxuICAgIHRpY2tldERhdGE6IGFueSA9IHtcclxuICAgIHRpY2tldE5hbWU6IFwiRm9vdGZhbGwgRGlyZWN0b3J5XCIsXHJcbiAgICB0aWNrZXRJZDogXCJURV9JTkZfRjU2NDVHNDUzNEEyNFwiLFxyXG4gICAgc3RvcmVOYW1lOiBcIkxLU1Q5OCB8IFJLIFNhbGFpLCBNeWxhcG9yZSwgQ2hlbm5haSwgVGFtaWwgTmFkdSwgSW5kaWFcIixcclxuICAgIHN0YXR1czogXCJPcGVuXCIsXHJcbiAgICBkYXRlOiBcIjA0IFNlcCAyMDIzXCIsXHJcbiAgICBmb290ZmFsbDoge1xyXG4gICAgICB0b3RhbDogMTAwLFxyXG4gICAgICBkdXBsaWNhdGVzOiAxMCxcclxuICAgICAgZW1wbG95ZWU6IDIsXHJcbiAgICAgIGhvdXNlS2VlcGluZzogMSxcclxuICAgIH0sXHJcbiAgICBkdXBsaWNhdGVzOiBbXHJcbiAgICAgIHsgdXJsOiBcImFzc2V0cy9pbWcxLmpwZ1wiIH0sXHJcbiAgICAgIHsgdXJsOiBcImFzc2V0cy9pbWcyLmpwZ1wiIH0sXHJcbiAgICAgIHsgdXJsOiBcImFzc2V0cy9pbWczLmpwZ1wiIH0sXHJcbiAgICBdLFxyXG4gIH07XHJcbiAgc2VsZWN0ZWRTdG9yZXM6IGFueVtdID0gW107IFxyXG5hbGxTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5zdG9yZXM6IGFueVtdID0gW107IFxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgdGlja2V0U2VydmljZTogVGlja2V0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgZXhjZWxzZXJ2aWNlOiBFeGNlbFNlcnZpY2UscHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZvb3RmYWxsVmlldyA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZFJldm9wc1R5cGUgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xyXG4gICB0aGlzLmZpbHRlckZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgIHNlbGVjdGVkU3RhdHVzOiBuZXcgRm9ybUNvbnRyb2woJ29wZW4nKSxcclxuICAgIGFjdGlvblN0YXR1czogbmV3IEZvcm1Db250cm9sKCcnKSxcclxuICAgIENsdXN0ZXJMaXN0OiBuZXcgRm9ybUNvbnRyb2woW10pLFxyXG4gIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgIHNlbGVjdGVkUmV2b3BzVHlwZTogdGhpcy5zZWxlY3RlZFJldm9wc1R5cGUsXHJcbiAgICAgICAgfSk7XHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlPy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSk/LnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgdGhpcy5oZWFkZXJGaWx0ZXJzID0gZGF0YTtcclxuICAgICAgICAgIHRoaXMuZm9vdGZhbGxMaXN0X3JlcSA9IHtcclxuICAgICAgICAgICAgY2xpZW50OiB0aGlzLmhlYWRlckZpbHRlcnMuY2xpZW50cy50b1N0cmluZygpLFxyXG4gICAgICAgICAgICBmcm9tRGF0ZTogdGhpcy5oZWFkZXJGaWx0ZXJzPy5kYXRlPy5zdGFydERhdGUsXHJcbiAgICAgICAgICAgIHRvRGF0ZTogdGhpcy5oZWFkZXJGaWx0ZXJzPy5kYXRlPy5lbmREYXRlLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGlja2V0U3VtbWFyeSgpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUaWNrZXRMaXN0KCk7XHJcbiAgICAgICAgICB0aGlzLmdldEFsbEdyb3VwcygpO1xyXG4gICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcbiAgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YTogYW55O1xyXG4gIGdldFRpY2tldFN1bW1hcnkoKSB7XHJcbiAgICB0aGlzLnRpY2tldFNlcnZpY2VcclxuICAgICAgLmdldFRpY2tldFN1bW1hcnlBcGkoXHJcbiAgICAgICAgdGhpcy5mb290ZmFsbExpc3RfcmVxLmNsaWVudCxcclxuICAgICAgICB0aGlzLmZvb3RmYWxsTGlzdF9yZXEuZnJvbURhdGUsXHJcbiAgICAgICAgdGhpcy5mb290ZmFsbExpc3RfcmVxLnRvRGF0ZVxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcz8uZGF0YSAmJiByZXM/LmRhdGE/LnJlc3VsdCkge1xyXG4gICAgICAgICAgICB0aGlzLmdldEZvb3RmYWxsU3VtbWFyeURhdGEgPSByZXM/LmRhdGE/LnJlc3VsdDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YSA9IFtdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5nZXRGb290ZmFsbFN1bW1hcnlEYXRhID0gW107XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5nZXRGb290ZmFsbFN1bW1hcnlEYXRhLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgb2Zmc2V0ID0gMDtcclxuICBsaW1pdCA9IDEwO1xyXG4gIGlzRXhwb3J0OmFueSA9IGZhbHNlO1xyXG4gIGZvb3RmYWxsTGlzdERhdGE6YW55O1xyXG4gIHRvdGFsSXRlbXM6YW55O1xyXG4gIHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXTtcclxuICBnZXRUaWNrZXRMaXN0KCl7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHRoaXMuc2VhcmNoVmFsdWU/LnRyaW0oKSB8fCAnJztcclxuICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5vZmZzZXQgfHwgMTtcclxuICAgIHRoaXMubGltaXQgPSB0aGlzLmxpbWl0IHx8IDEwO1xyXG4gICAgdGhpcy5pc0V4cG9ydCA9IGZhbHNlO1xyXG4gICAgdGhpcy50aWNrZXRTZXJ2aWNlXHJcbiAgICAgIC5nZXRUaWNrZXRMaXN0QXBpKFxyXG4gICAgICAgIHRoaXMuZm9vdGZhbGxMaXN0X3JlcS5jbGllbnQsXHJcbiAgICAgICAgdGhpcy5mb290ZmFsbExpc3RfcmVxLmZyb21EYXRlLFxyXG4gICAgICAgIHRoaXMuZm9vdGZhbGxMaXN0X3JlcS50b0RhdGUsXHJcbiAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSx0aGlzLmxpbWl0LFxyXG4gICAgICAgIHRoaXMub2Zmc2V0LHRoaXMuaXNFeHBvcnQsdGhpcy5zb3J0ZWRDb2x1bW4sdGhpcy5zb3J0RGlyZWN0aW9uXHJcbiAgICAgIClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vRGF0YSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5mb290ZmFsbExpc3REYXRhID0gcmVzPy5kYXRhPy5yZXN1bHQ7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSByZXM/LmRhdGE/LmNvdW50O1xyXG4gICAgICAgICAgICBpZiAodGhpcy50b3RhbEl0ZW1zIDwgMTApIHsgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbdGhpcy50b3RhbEl0ZW1zXSB9IGVsc2UgeyB0aGlzLnBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXSB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgIHRoaXMuZm9vdGZhbGxMaXN0RGF0YSA9W107XHJcbiAgICAgICAgICAgICBcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub0RhdGEgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuY3VycmVudFBhZ2U6YW55ID0gMTtcclxucGFnZVNpemU6YW55ID0gMTA7XHJcbiAgICBvblBhZ2VDaGFuZ2UocGFnZU9mZnNldDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gTnVtYmVyKHBhZ2VPZmZzZXQpO1xyXG4gICAgdGhpcy5vZmZzZXQgPSBOdW1iZXIocGFnZU9mZnNldCk7XHJcbiAgICB0aGlzLmxpbWl0ID0xMDtcclxuICAgIHRoaXMuZ2V0VGlja2V0TGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgb25QYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gTnVtYmVyKHBhZ2VTaXplKTtcclxuICAgIHRoaXMubGltaXQgPSBOdW1iZXIocGFnZVNpemUpO1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICB0aGlzLm9mZnNldCA9IDE7XHJcbiAgICB0aGlzLmdldFRpY2tldExpc3QoKTtcclxuICB9XHJcblxyXG4gICBzZXRwYWdlU2l6ZSgpIHtcclxuICAgIGlmICh0aGlzLnRvdGFsSXRlbXMgPCAxMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50b3RhbEl0ZW1zO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGFnZVNpemU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNlYXJjaERhdGEoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgIHRoaXMub2Zmc2V0ID0gMTtcclxuICAgIHRoaXMubGltaXQ9MTA7XHJcbiAgICB0aGlzLmdldFRpY2tldExpc3QoKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydFhMU1goKSB7XHJcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gdGhpcy5zZWFyY2hWYWx1ZT8udHJpbSgpIHx8ICcnO1xyXG4gICAgdGhpcy5vZmZzZXQgPSAxO1xyXG4gICAgdGhpcy5saW1pdCA9IDEwMDAwO1xyXG4gICAgdGhpcy5pc0V4cG9ydCA9IHRydWU7XHJcbiAgICB0aGlzLnRpY2tldFNlcnZpY2VcclxuICAgICAgLmdldFRpY2tldExpc3RFeHBvcnRBcGkoXHJcbiAgICAgICAgdGhpcy5mb290ZmFsbExpc3RfcmVxLmNsaWVudCxcclxuICAgICAgICB0aGlzLmZvb3RmYWxsTGlzdF9yZXEuZnJvbURhdGUsXHJcbiAgICAgICAgdGhpcy5mb290ZmFsbExpc3RfcmVxLnRvRGF0ZSxcclxuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlLHRoaXMubGltaXQsXHJcbiAgICAgICAgdGhpcy5vZmZzZXQsdGhpcy5pc0V4cG9ydCx0aGlzLnNvcnRlZENvbHVtbix0aGlzLnNvcnREaXJlY3Rpb25cclxuICAgICAgKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgIHRoaXMuZXhjZWxzZXJ2aWNlLnNhdmVBc0V4Y2VsRmlsZShyZXMsICdmb290ZmFsbCBkaXJlY3RvcnkgdGlja2V0ICcpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0Vycm9yIGV4cG9ydGluZyBkYXRhOicgKyBlcnIuZXJyb3IgPyBlcnIuZXJyb3IgOiBlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgb25Tb3J0KGNvbHVtbjogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5zb3J0ZWRDb2x1bW4gPT09IGNvbHVtbikge1xyXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSB0aGlzLnNvcnREaXJlY3Rpb24gPT09IDEgPyAtMSA6IDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNvcnRlZENvbHVtbiA9IGNvbHVtbjtcclxuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gMTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0VGlja2V0TGlzdCgpO1xyXG4gIH1cclxuICBzdG9yZUNvdW50OmFueTtcclxuXHJcbiAgc2VhcmNoU3RvcmVzRGF0YSgpe1xyXG50aGlzLmdldFN0b3JlcygpO1xyXG4gIH1cclxuXHJcbiAgU3RvcmVzU2VhcmNoVmFsdWU6YW55PScnO1xyXG4gIGdldFN0b3Jlcygpe1xyXG4gICAgdGhpcy50aWNrZXRTZXJ2aWNlLmdldFRhZ2dlZFN0b3Jlc0FwaShcclxuICAgICAgdGhpcy5mb290ZmFsbExpc3RfcmVxLmNsaWVudCxcclxuICAgICAgdGhpcy5mb290ZmFsbExpc3RfcmVxLmZyb21EYXRlLFxyXG4gICAgICB0aGlzLmZvb3RmYWxsTGlzdF9yZXEudG9EYXRlLFxyXG4gICAgICB0aGlzLlN0b3Jlc1NlYXJjaFZhbHVlLFxyXG4gICAgICAgdGhpcy5ncm91cHMsXHJcbiAgICApLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy5zdG9yZXMgPSByZXM/LmRhdGE/LnJlc3VsdDtcclxuICAgICAgICAgIHRoaXMuc3RvcmVDb3VudCA9IHJlcy5kYXRhPy5jb3VudCB8fCAwO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnN0b3JlcyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5zdG9yZUNvdW50ID0wO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgdGhpcy5zdG9yZXMgPVtdO1xyXG4gICAgICAgdGhpcy5zdG9yZUNvdW50ID0wO1xyXG4gICAgICB9LFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge30sXHJcbiAgICB9KTsgXHJcbiAgfVxyXG5nZXRUYWdnZWRTdG9yZXNEYXRhOiBhbnk7XHJcblxyXG5cclxudHlwZUNoYW5nZShldmVudDogYW55KSB7XHJcbiAgdGhpcy5maWx0ZXJGb3JtLmdldCgnc2VsZWN0ZWRTdGF0dXMnKT8uc2V0VmFsdWUoZXZlbnQgfHwgbnVsbCk7XHJcbn1cclxuXHJcbnBlbmRpbmdDaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gIHRoaXMuZmlsdGVyRm9ybS5nZXQoJ2FjdGlvblN0YXR1cycpPy5zZXRWYWx1ZShldmVudCB8fCBudWxsKTtcclxufVxyXG5cclxuUmV2b3BzVHlwZUNoYW5nZShldmVudDogYW55KSB7XHJcbiAgY29uc3Qgc2VsZWN0ZWRUeXBlID0gZXZlbnQgPz8gJyc7XHJcbiAgICB0aGlzLmZvb3RmYWxsb2Zmc2V0ID0xO1xyXG4gIGlmKCBzZWxlY3RlZFR5cGUgPT09ICcnKSBcclxudGhpcy5mb290ZmFsbGxpbWl0ID0gICAgMTtcclxuICAgIGVsc2VcclxuICB0aGlzLmZvb3RmYWxsbGltaXQgPSAyNTA7XHJcbiAgdGhpcy5mb3JtLmdldCgnc2VsZWN0ZWRSZXZvcHNUeXBlJyk/LnNldFZhbHVlKHNlbGVjdGVkVHlwZSk7XHJcbnRoaXMuYWxsU2VsZWN0VmFsdWUgPWZhbHNlO1xyXG4gIC8vIENsZWFyIHNlbGVjdGVkIGxpc3RzXHJcbiAgdGhpcy5zZWxlY3RlZEVtcGxveWVlSW1hZ2VzTGlzdCA9IFtdO1xyXG4gIHRoaXMuc2VsZWN0ZWRIb3VzZWtlZXBpbmdJbWFnZXNMaXN0ID0gW107XHJcbiAgdGhpcy5zZWxlY3RlZER1cGxpY2F0ZUltYWdlc0xpc3QgPSBbXTtcclxuXHJcbiAgLy8gUmVzZXQgY291bnRzXHJcbiAgdGhpcy5lbXBsb3llZUFDQ291bnQgPSAnJztcclxuICB0aGlzLmhvdXNlS2VlcGluZ0FDQ291bnQgPSAnJztcclxuICB0aGlzLmR1cGxpY2F0ZUFDQ291bnQgPSAnJztcclxuICB0aGlzLmRhdGFTdG9yZVZpZXcoKTsgXHJcbn1cclxuXHJcblxyXG5cclxuICBmb290ZmFsbG9mZnNldD0xO1xyXG4gIGZvb3RmYWxsbGltaXQ9MTtcclxuZm9vdGZhbGxUaWNrZXRzRGF0YTphbnk9W107XHJcbnN0b3JlSWRWYWx1ZTphbnk7XHJcbiBcclxuXHJcbmRhdGFSZXNldCgpe1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlcyA9IFtdO1xyXG4gICAgdGhpcy5hbGxTZWxlY3RlZCA9IGZhbHNlO1xyXG4gIHRoaXMuZm9ybS5nZXQoJ3NlbGVjdGVkUmV2b3BzVHlwZScpPy5zZXRWYWx1ZSgnJyk7XHJcbiAgdGhpcy5maWx0ZXJGb3JtLmdldCgnc2VsZWN0ZWRTdGF0dXMnKT8uc2V0VmFsdWUoJ29wZW4nKTtcclxuICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdhY3Rpb25TdGF0dXMnKT8uc2V0VmFsdWUoJ3BlbmRpbmcnKTtcclxuICB0aGlzLmRhdGFTdG9yZVZpZXcoKTtcclxufVxyXG5kYXRhQXBwbHkoKSB7XHJcbiAgdGhpcy5hbGxTZWxlY3RWYWx1ZSA9ZmFsc2VcclxuICB0aGlzLmRhdGFTdG9yZVZpZXcoKTtcclxufVxyXG5pbWFnZVVybDphbnk7XHJcbmRhdGFJbmRleElkOmFueTtcclxuZGF0ZVN0cmluZzphbnk7XHJcbiAgZm9vdGZhbGxOb0RhdGEgPSBmYWxzZTtcclxuICBmb290ZmFsbExvYWRpbmcgPSB0cnVlO1xyXG4gIHByaXZhdGUgbGFzdFNlbGVjdGVkVGlja2V0OiBhbnkgPSBudWxsO1xyXG5cclxuaGFzSW5pdGlhbFN0b3JlU3luY2VkID0gZmFsc2U7XHJcblxyXG5hZGRTdG9yZUlmTm90RXhpc3RzKHN0b3JlOiBhbnkpIHtcclxuICBpZiAodGhpcy5oYXNJbml0aWFsU3RvcmVTeW5jZWQpIHJldHVybjtcclxuXHJcbiAgY29uc3Qgc3RvcmVJZCA9IHN0b3JlPy5zdG9yZUlkO1xyXG4gIGlmIChzdG9yZUlkICYmICF0aGlzLnNlbGVjdGVkU3RvcmVzLmluY2x1ZGVzKHN0b3JlSWQpKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVzLnB1c2goc3RvcmVJZCk7XHJcbiAgfVxyXG5cclxuICB0aGlzLmhhc0luaXRpYWxTdG9yZVN5bmNlZCA9IHRydWU7XHJcbiAgdGhpcy5hbGxTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRTdG9yZXMubGVuZ3RoID09PSB0aGlzLnN0b3Jlcy5sZW5ndGg7XHJcbn1cclxuXHJcbmRhdGFTdG9yZVZpZXcoZGF0YT86IGFueSkge1xyXG4gICB0aGlzLmZvb3RmYWxsVGlja2V0c0RhdGEgPSBbXTtcclxuICB0aGlzLmZvb3RmYWxsTm9EYXRhID0gZmFsc2U7XHJcbiAgdGhpcy5mb290ZmFsbExvYWRpbmcgPSB0cnVlO1xyXG4gIGNvbnN0IHRpY2tldCA9IGRhdGE/Ll9zb3VyY2UgPyBkYXRhIDogdGhpcy5sYXN0U2VsZWN0ZWRUaWNrZXQ7XHJcblxyXG4gIGlmICghdGlja2V0IHx8ICF0aWNrZXQuX3NvdXJjZSkge1xyXG4gICAgdGhpcy5mb290ZmFsbExvYWRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuZm9vdGZhbGxOb0RhdGEgPSB0cnVlO1xyXG4gICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdObyB0aWNrZXQgZGF0YSBhdmFpbGFibGUnKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIHRoaXMubGFzdFNlbGVjdGVkVGlja2V0ID0gdGlja2V0O1xyXG50aGlzLmFkZFN0b3JlSWZOb3RFeGlzdHModGlja2V0Ll9zb3VyY2UpO1xyXG4gIHRoaXMuZGF0YUluZGV4SWQgPSB0aWNrZXQuX2lkIHx8ICcnO1xyXG4gIHRoaXMuZGF0ZVN0cmluZyA9IHRpY2tldC5fc291cmNlLmRhdGVTdHJpbmcgfHwgJyc7XHJcbiAgdGhpcy5pbWFnZVVybCA9IHRoaXMudGlja2V0U2VydmljZT8uZm9vdGZhbGxDRE47XHJcbiB0aGlzLnN0b3JlSWRWYWx1ZSA9IHRoaXMuc2VsZWN0ZWRTdG9yZXM7IFxyXG4gIGNvbnN0IHJldm9wc1R5cGUgPSB0aGlzLmZvcm0uZ2V0KCdzZWxlY3RlZFJldm9wc1R5cGUnKT8udmFsdWU7XHJcbiAgY29uc3Qgc2VsZWN0ZWRTdGF0dXMgPSB0aGlzLmZpbHRlckZvcm0uZ2V0KCdzZWxlY3RlZFN0YXR1cycpPy52YWx1ZTtcclxuICBjb25zdCBhY3Rpb25TdGF0dXMgPSB0aGlzLmZpbHRlckZvcm0uZ2V0KCdhY3Rpb25TdGF0dXMnKT8udmFsdWU7XHJcblxyXG4gIGNvbnN0IHN0b3JlSWQgPSB0aGlzLnN0b3JlSWRWYWx1ZTtcclxuICBjb25zdCBmcm9tRGF0ZSA9IHRoaXMuZm9vdGZhbGxMaXN0X3JlcS5mcm9tRGF0ZTtcclxuICBjb25zdCB0b0RhdGUgPSB0aGlzLmZvb3RmYWxsTGlzdF9yZXEudG9EYXRlO1xyXG4gIGNvbnN0IG9mZnNldCA9IHRoaXMuZm9vdGZhbGxvZmZzZXQ7XHJcbiAgY29uc3QgbGltaXQgPSByZXZvcHNUeXBlID09PScnID8gdGhpcy5mb290ZmFsbGxpbWl0IDp0aGlzLmZvb3RmYWxsbGltaXQgPSAyNTA7XHJcblxyXG4gIHRoaXMudGlja2V0U2VydmljZVxyXG4gICAgLmdldFRpY2tldHNBcGkoc3RvcmVJZCwgZnJvbURhdGUsIHRvRGF0ZSwgcmV2b3BzVHlwZSwgc2VsZWN0ZWRTdGF0dXMsIGFjdGlvblN0YXR1cywgb2Zmc2V0LCBsaW1pdClcclxuICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZihyZXMgJiYgcmVzLmNvZGUgPT09MjAwKXtcclxuICAgICAgICBpZiAocmVzPy5kYXRhPy5yZXN1bHQ/Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhID0gW107XHJcbiAgICAgICAgICB0aGlzLmZvb3RmYWxsVmlldyA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmZvb3RmYWxsTm9EYXRhID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZm9vdGZhbGxMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ05vIGRhdGEgZm91bmQgZm9yIHRoZSBzZWxlY3RlZCBmaWx0ZXJzJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZm9vdGZhbGxUaWNrZXRzRGF0YSA9IHJlcz8uZGF0YT8ucmVzdWx0ID8/IFtdO1xyXG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zRm9vdGZhbGwgPSByZXM/LmRhdGE/LmNvdW50O1xyXG5cclxuICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNpemVzID0gdGhpcy50b3RhbEl0ZW1zRm9vdGZhbGwgPCAxXHJcbiAgICAgICAgICAgID8gW3RoaXMudG90YWxJdGVtc0Zvb3RmYWxsXVxyXG4gICAgICAgICAgICA6IFsxXTtcclxuXHJcbiAgICAgICAgICB0aGlzLmZvb3RmYWxsVmlldyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5mb290ZmFsbE5vRGF0YSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5mb290ZmFsbExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhID0gW107XHJcbiAgICAgICAgdGhpcy5mb290ZmFsbFZpZXcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmZvb3RmYWxsTm9EYXRhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZvb3RmYWxsTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhID0gW107XHJcbiAgICAgICAgdGhpcy5mb290ZmFsbFZpZXcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmZvb3RmYWxsTm9EYXRhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZvb3RmYWxsTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmlzQ29sbGFwc2VkID0gZmFsc2U7XHJcblxyXG50b2dnbGVTaWRlYmFyKCkge1xyXG4gIHRoaXMuaXNDb2xsYXBzZWQgPSAhdGhpcy5pc0NvbGxhcHNlZDtcclxufVxyXG4gIG1hdGNoZWRUeXBlOiBhbnk7XHJcblxyXG4gIG1hdGNoZWRBcnJheTogYW55ID0gW3sgdmFsdWU6IFwiYWxsXCIsIGxhYmVsOiBcIm1hdGNoZWQ6IEFsbFwiIH1dO1xyXG4gIG9uRmlsdGVyQXBwbHkoKSB7XHJcbiAgdGhpcy5kYXRhU3RvcmVWaWV3KCk7XHJcblxyXG4gIH1cclxucGFnZVNpemVGb290ZmFsbDphbnkgPSAxO1xyXG5mb290ZmFsbGN1cnJlbnRQYWdlOmFueSA9IDE7XHJcbiAgICBvbkZvb3RmYWxsUGFnZUNoYW5nZShwYWdlT2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuZm9vdGZhbGxjdXJyZW50UGFnZSA9IE51bWJlcihwYWdlT2Zmc2V0KTtcclxuICAgIHRoaXMuZm9vdGZhbGxvZmZzZXQgPSBOdW1iZXIocGFnZU9mZnNldCk7XHJcbiAgICB0aGlzLmZvb3RmYWxsbGltaXQgPTE7XHJcbiAgdGhpcy5kYXRhU3RvcmVWaWV3KCk7XHJcbiAgfVxyXG5cclxuICBvbkZvb3RmYWxsUGFnZVNpemVDaGFuZ2UocGFnZVNpemU6IG51bWJlcikge1xyXG4gICAgdGhpcy5mb290ZmFsbGxpbWl0ID0gTnVtYmVyKHBhZ2VTaXplKTtcclxuICAgICB0aGlzLnBhZ2VTaXplRm9vdGZhbGwgPSBOdW1iZXIocGFnZVNpemUpO1xyXG4gICAgdGhpcy5mb290ZmFsbGN1cnJlbnRQYWdlID0gMTtcclxuICAgIHRoaXMuZm9vdGZhbGxvZmZzZXQgPSAxO1xyXG4gICAgdGhpcy5kYXRhU3RvcmVWaWV3KCk7XHJcbiAgfVxyXG50b3RhbEl0ZW1zRm9vdGZhbGw6YW55O1xyXG4gICBzZXRGb290ZmFsbHBhZ2VTaXplKCkge1xyXG4gICAgaWYgKHRoaXMudG90YWxJdGVtc0Zvb3RmYWxsIDwgMSkge1xyXG4gICAgICByZXR1cm4gdGhpcy50b3RhbEl0ZW1zRm9vdGZhbGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5wYWdlU2l6ZUZvb3RmYWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxudG9nZ2xlU3RvcmVTZWxlY3Rpb24oc3RvcmU6IGFueSkge1xyXG4gIGNvbnN0IHN0b3JlSWQgPSBzdG9yZT8uc3RvcmVJZDtcclxuICBpZiAoIXN0b3JlSWQpIHJldHVybjtcclxuXHJcbiAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGVjdGVkU3RvcmVzLmluZGV4T2Yoc3RvcmVJZCk7XHJcblxyXG4gIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZXMucHVzaChzdG9yZUlkKTtcclxuICB9XHJcblxyXG4gIHRoaXMuYWxsU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gdGhpcy5zdG9yZXMubGVuZ3RoO1xyXG59XHJcblxyXG5cclxudG9nZ2xlU2VsZWN0QWxsKCkge1xyXG4gIGNvbnN0IHZpc2libGVTdG9yZUlkcyA9IHRoaXMuZmlsdGVyZWRTdG9yZXMubWFwKChzKSA9PiBzLnN0b3JlSWQpO1xyXG5cclxuICBpZiAodGhpcy5hbGxTZWxlY3RlZCkge1xyXG4gICAgLy8gUmVtb3ZlIG9ubHkgdGhlIHZpc2libGUgb25lc1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlcyA9IHRoaXMuc2VsZWN0ZWRTdG9yZXMuZmlsdGVyKFxyXG4gICAgICBpZCA9PiAhdmlzaWJsZVN0b3JlSWRzLmluY2x1ZGVzKGlkKVxyXG4gICAgKTtcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gQWRkIG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90IGFscmVhZHkgc2VsZWN0ZWRcclxuICAgIGNvbnN0IG5ld0lkcyA9IHZpc2libGVTdG9yZUlkcy5maWx0ZXIoaWQgPT4gIXRoaXMuc2VsZWN0ZWRTdG9yZXMuaW5jbHVkZXMoaWQpXHJcbiAgICApO1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlcyA9IFsuLi50aGlzLnNlbGVjdGVkU3RvcmVzLCAuLi5uZXdJZHNdO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5hbGxTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRTdG9yZXMubGVuZ3RoID09PSB0aGlzLnN0b3Jlcy5sZW5ndGg7XHJcbn1cclxuXHJcblxyXG5pc1NlbGVjdGVkKHN0b3JlOiBhbnkpOiBib29sZWFuIHtcclxuICByZXR1cm4gdGhpcy5zZWxlY3RlZFN0b3Jlcy5pbmNsdWRlcyhzdG9yZS5zdG9yZUlkKTtcclxufVxyXG5cclxuXHJcbiAgaW1ndG9nZ2xlU2VsZWN0QWxsKCkge1xyXG4gICAgdGhpcy5hbGxTZWxlY3RlZCA9ICF0aGlzLmFsbFNlbGVjdGVkO1xyXG4gICAgdGhpcy50aWNrZXREYXRhLmR1cGxpY2F0ZXMuZm9yRWFjaCgoaW1nOiBhbnkpID0+IHtcclxuICAgICAgaW1nLnNlbGVjdGVkID0gdGhpcy5hbGxTZWxlY3RlZDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRJbWFnZXNMaXN0OiBhbnlbXSA9IFtdO1xyXG5cclxuICBzZWxlY3RlZER1cGxpY2F0ZUltYWdlc0xpc3Q6IGFueVtdID0gW107XHJcbiAgc2VsZWN0ZWRIb3VzZWtlZXBpbmdJbWFnZXNMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHNlbGVjdGVkRW1wbG95ZWVJbWFnZXNMaXN0OiBhbnlbXSA9IFtdO1xyXG5ob3VzZUtlZXBpbmdBQ0NvdW50OmFueTtcclxuZW1wbG95ZWVBQ0NvdW50OmFueTtcclxuZHVwbGljYXRlQUNDb3VudDphbnk7XHJcblxyXG5jbG9uZVdpdGhvdXRTZWxlY3RlZChvYmo6IGFueSkge1xyXG4gIGNvbnN0IHsgLi4ucmVzdCB9ID0gb2JqO1xyXG4gIHJldHVybiByZXN0O1xyXG59XHJcblxyXG5cclxuYWxsU2VsZWN0VmFsdWUgPSBmYWxzZTtcclxuXHJcbmNsb25lV2l0aG91dFNlbGVjdGVkMShkYXRhOiBhbnkpOiBhbnkge1xyXG4gIGNvbnN0IHsgIF9fcGFyZW50LCAuLi5yZXN0IH0gPSBkYXRhO1xyXG4gIHJldHVybiB7IC4uLnJlc3QgfTtcclxufVxyXG5cclxub25JbWFnZUNoZWNrYm94Q2hhbmdlMShkYXRhOiBhbnksIGNhdGVnb3J5OiBzdHJpbmcsIHBhcmVudE9yaWdpbmFsPzogYW55KSB7XHJcbiAgbGV0IHNlbGVjdGVkTGlzdDogYW55O1xyXG5cclxuICBpZiAoY2F0ZWdvcnkgPT09ICdkdXBsaWNhdGUnKSB7XHJcbiAgICBwYXJlbnRPcmlnaW5hbCA9IHBhcmVudE9yaWdpbmFsIHx8IGRhdGEuX19wYXJlbnQ7XHJcblxyXG4gICAgY29uc3QgZXhpc3RpbmdPcmlnaW5hbCA9IHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVJbWFnZXNMaXN0LmZpbmQoXHJcbiAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0udGVtcElkID09PSBwYXJlbnRPcmlnaW5hbD8udGVtcElkXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChkYXRhLnNlbGVjdGVkKSB7XHJcbiAgICAgIGlmIChleGlzdGluZ09yaWdpbmFsKSB7XHJcbiAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGV4aXN0aW5nT3JpZ2luYWwuZGF0YT8uc29tZShcclxuICAgICAgICAgIChkdXA6IGFueSkgPT4gZHVwLnRlbXBJZCA9PT0gZGF0YS50ZW1wSWRcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICghYWxyZWFkeUV4aXN0cykge1xyXG4gICAgICAgICAgZXhpc3RpbmdPcmlnaW5hbC5kYXRhLnB1c2godGhpcy5jbG9uZVdpdGhvdXRTZWxlY3RlZDEoZGF0YSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRHVwbGljYXRlSW1hZ2VzTGlzdC5wdXNoKHtcclxuICAgICAgICAgIHRlbXBJZDogcGFyZW50T3JpZ2luYWw/LnRlbXBJZCxcclxuICAgICAgICAgIGZpbGVQYXRoOiBwYXJlbnRPcmlnaW5hbD8uZmlsZVBhdGgsXHJcbiAgICAgICAgICBlbnRyeVRpbWU6IHBhcmVudE9yaWdpbmFsPy5lbnRyeVRpbWUsXHJcbiAgICAgICAgICBleGl0VGltZTogcGFyZW50T3JpZ2luYWw/LmV4aXRUaW1lLFxyXG4gICAgICAgICAgdGltZVJhbmdlOiBwYXJlbnRPcmlnaW5hbD8udGltZVJhbmdlLFxyXG4gICAgICAgICAgZGF0YTogW3RoaXMuY2xvbmVXaXRob3V0U2VsZWN0ZWQxKGRhdGEpXSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGV4aXN0aW5nT3JpZ2luYWwpIHtcclxuICAgICAgICBleGlzdGluZ09yaWdpbmFsLmRhdGEgPSBleGlzdGluZ09yaWdpbmFsLmRhdGEuZmlsdGVyKFxyXG4gICAgICAgICAgKGQ6IGFueSkgPT4gZC50ZW1wSWQgIT09IGRhdGEudGVtcElkXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGV4aXN0aW5nT3JpZ2luYWwuZGF0YS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVJbWFnZXNMaXN0ID0gdGhpcy5zZWxlY3RlZER1cGxpY2F0ZUltYWdlc0xpc3QuZmlsdGVyKFxyXG4gICAgICAgICAgICAobzogYW55KSA9PiBvLnRlbXBJZCAhPT0gcGFyZW50T3JpZ2luYWw/LnRlbXBJZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmR1cGxpY2F0ZUFDQ291bnQgPSB0aGlzLnNlbGVjdGVkRHVwbGljYXRlSW1hZ2VzTGlzdC5yZWR1Y2UoXHJcbiAgICAgIChzdW06IG51bWJlciwgb3JpZzogYW55KSA9PiBzdW0gKyBvcmlnLmRhdGEubGVuZ3RoLFxyXG4gICAgICAwXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgaWYgKGNhdGVnb3J5ID09PSAnZW1wbG95ZWUnKSB7XHJcbiAgICBzZWxlY3RlZExpc3QgPSB0aGlzLnNlbGVjdGVkRW1wbG95ZWVJbWFnZXNMaXN0O1xyXG4gIH0gZWxzZSBpZiAoY2F0ZWdvcnkgPT09ICdob3VzZWtlZXBpbmcnKSB7XHJcbiAgICBzZWxlY3RlZExpc3QgPSB0aGlzLnNlbGVjdGVkSG91c2VrZWVwaW5nSW1hZ2VzTGlzdDtcclxuICB9XHJcblxyXG4gIGlmIChjYXRlZ29yeSAhPT0gJ2R1cGxpY2F0ZScpIHtcclxuICAgIGlmIChkYXRhLnNlbGVjdGVkKSB7XHJcbiAgICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBzZWxlY3RlZExpc3Quc29tZSgoaXRlbTogYW55KSA9PiBpdGVtLnRlbXBJZCA9PT0gZGF0YS50ZW1wSWQpO1xyXG4gICAgICBpZiAoIWFscmVhZHlFeGlzdHMpIHtcclxuICAgICAgICBzZWxlY3RlZExpc3QucHVzaChkYXRhKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBzZWxlY3RlZExpc3QuZmluZEluZGV4KChpdGVtOiBhbnkpID0+IGl0ZW0udGVtcElkID09PSBkYXRhLnRlbXBJZCk7XHJcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICBzZWxlY3RlZExpc3Quc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1wbG95ZWVBQ0NvdW50ID0gdGhpcy5zZWxlY3RlZEVtcGxveWVlSW1hZ2VzTGlzdC5sZW5ndGg7XHJcbiAgICB0aGlzLmhvdXNlS2VlcGluZ0FDQ291bnQgPSB0aGlzLnNlbGVjdGVkSG91c2VrZWVwaW5nSW1hZ2VzTGlzdC5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvLyDwn5SSIERpc2FibGUgb3RoZXIgY2hlY2tib3hlcyBpZiBvbmUgdHlwZSBpcyBzZWxlY3RlZFxyXG4gIGNvbnN0IHRvdGFsU2VsZWN0ZWQgPVxyXG4gICAgdGhpcy5kdXBsaWNhdGVBQ0NvdW50ICsgdGhpcy5lbXBsb3llZUFDQ291bnQgKyB0aGlzLmhvdXNlS2VlcGluZ0FDQ291bnQ7XHJcblxyXG4gIGlmICh0b3RhbFNlbGVjdGVkID4gMCkge1xyXG4gICAgdGhpcy5jaGVja2VkVmFsdWUgPSBmYWxzZTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5jaGVja2VkVmFsdWUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7IC8vIFRvIHVwZGF0ZSB0aGUgdGVtcGxhdGVcclxuICB0aGlzLmFsbFNlbGVjdFZhbHVlID0gdGhpcy5hcmVBbGxDaGVja2JveGVzU2VsZWN0ZWQoKTtcclxuXHJcbiAgLy8gY29uc29sZS5sb2coJ+KchSBDb3VudHM6Jywge1xyXG4gIC8vICAgZHVwbGljYXRlQUNDb3VudDogdGhpcy5kdXBsaWNhdGVBQ0NvdW50LFxyXG4gIC8vICAgZW1wbG95ZWVBQ0NvdW50OiB0aGlzLmVtcGxveWVlQUNDb3VudCxcclxuICAvLyAgIGhvdXNlS2VlcGluZ0FDQ291bnQ6IHRoaXMuaG91c2VLZWVwaW5nQUNDb3VudCxcclxuICAvLyAgIGNoZWNrZWRWYWx1ZTogdGhpcy5jaGVja2VkVmFsdWUsXHJcbiAgLy8gfSk7XHJcbn1cclxuXHJcblxyXG5cclxuc2VsZWN0QWxsVmFsdWUoKSB7XHJcbiAgdGhpcy5hbGxTZWxlY3RWYWx1ZSA9ICF0aGlzLmFsbFNlbGVjdFZhbHVlO1xyXG4gIHRoaXMuY2hlY2tlZFZhbHVlID0gIXRoaXMuYWxsU2VsZWN0VmFsdWU7XHJcblxyXG4gIHRoaXMuc2VsZWN0ZWRFbXBsb3llZUltYWdlc0xpc3QgPSBbXTtcclxuICB0aGlzLnNlbGVjdGVkSG91c2VrZWVwaW5nSW1hZ2VzTGlzdCA9IFtdO1xyXG4gIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVJbWFnZXNMaXN0ID0gW107XHJcblxyXG4gIGZvciAoY29uc3QgdGlja2V0IG9mIHRoaXMuZm9vdGZhbGxUaWNrZXRzRGF0YSkge1xyXG4gICAgY29uc3Qgc291cmNlID0gdGlja2V0Ll9zb3VyY2U7XHJcblxyXG4gICAgLy8g4pyFIEVtcGxveWVlXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UuZW1wbG95ZWUpKSB7XHJcbiAgICAgIHNvdXJjZS5lbXBsb3llZS5mb3JFYWNoKChpbWc6IGFueSkgPT4ge1xyXG4gICAgICAgIGltZy5zZWxlY3RlZCA9IHRoaXMuYWxsU2VsZWN0VmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuYWxsU2VsZWN0VmFsdWUgJiYgIXRoaXMuc2VsZWN0ZWRFbXBsb3llZUltYWdlc0xpc3Quc29tZShlID0+IGUudGVtcElkID09PSBpbWcudGVtcElkKSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEVtcGxveWVlSW1hZ2VzTGlzdC5wdXNoKGltZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDinIUgSG91c2VrZWVwaW5nXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UuaG91c2VLZWVwaW5nKSkge1xyXG4gICAgICBzb3VyY2UuaG91c2VLZWVwaW5nLmZvckVhY2goKGVtcDogYW55KSA9PiB7XHJcbiAgICAgICAgZW1wLnNlbGVjdGVkID0gdGhpcy5hbGxTZWxlY3RWYWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5hbGxTZWxlY3RWYWx1ZSAmJiAhdGhpcy5zZWxlY3RlZEhvdXNla2VlcGluZ0ltYWdlc0xpc3Quc29tZShlID0+IGUudGVtcElkID09PSBlbXAudGVtcElkKSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEhvdXNla2VlcGluZ0ltYWdlc0xpc3QucHVzaChlbXApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g4pyFIER1cGxpY2F0ZVxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlLmR1cGxpY2F0ZUltYWdlcykpIHtcclxuICAgICAgc291cmNlLmR1cGxpY2F0ZUltYWdlcy5mb3JFYWNoKChvcmlnaW5hbDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3JpZ2luYWwuZGF0YSkpIHtcclxuICAgICAgICAgIG9yaWdpbmFsLmRhdGEuZm9yRWFjaCgoZHVwOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgZHVwLnNlbGVjdGVkID0gdGhpcy5hbGxTZWxlY3RWYWx1ZTtcclxuICAgICAgICAgICAgZHVwLl9fcGFyZW50ID0gb3JpZ2luYWw7IC8vIOKchSBOZWVkZWQgZm9yIHVuY2hlY2tcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmFsbFNlbGVjdFZhbHVlICYmIG9yaWdpbmFsLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVJbWFnZXNMaXN0LmZpbmQoXHJcbiAgICAgICAgICAgICAgKG86IGFueSkgPT4gby50ZW1wSWQgPT09IG9yaWdpbmFsLnRlbXBJZFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFleGlzdGluZykge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVJbWFnZXNMaXN0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdGVtcElkOiBvcmlnaW5hbC50ZW1wSWQsXHJcbiAgICAgICAgICAgICAgICBmaWxlUGF0aDogb3JpZ2luYWwuZmlsZVBhdGgsXHJcbiAgICAgICAgICAgICAgICBlbnRyeVRpbWU6IG9yaWdpbmFsLmVudHJ5VGltZSxcclxuICAgICAgICAgICAgICAgIGV4aXRUaW1lOiBvcmlnaW5hbC5leGl0VGltZSxcclxuICAgICAgICAgICAgICAgIHRpbWVSYW5nZTogb3JpZ2luYWwudGltZVJhbmdlLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogb3JpZ2luYWwuZGF0YS5tYXAoKGQ6IGFueSkgPT4gdGhpcy5jbG9uZVdpdGhvdXRTZWxlY3RlZDEoZCkpLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRoaXMuaG91c2VLZWVwaW5nQUNDb3VudCA9IHRoaXMuc2VsZWN0ZWRIb3VzZWtlZXBpbmdJbWFnZXNMaXN0Lmxlbmd0aDtcclxuICB0aGlzLmVtcGxveWVlQUNDb3VudCA9IHRoaXMuc2VsZWN0ZWRFbXBsb3llZUltYWdlc0xpc3QubGVuZ3RoO1xyXG4gIHRoaXMuZHVwbGljYXRlQUNDb3VudCA9IHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVJbWFnZXNMaXN0LnJlZHVjZShcclxuICAgIChzdW06IG51bWJlciwgb3JpZzogYW55KSA9PiBzdW0gKyBvcmlnLmRhdGEubGVuZ3RoLFxyXG4gICAgMFxyXG4gICk7XHJcbn1cclxuXHJcblxyXG5hcmVBbGxDaGVja2JveGVzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgZm9yIChjb25zdCB0aWNrZXQgb2YgdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhKSB7XHJcbiAgICBjb25zdCBzb3VyY2UgPSB0aWNrZXQuX3NvdXJjZTtcclxuXHJcbiAgICBpZiAoc291cmNlLmVtcGxveWVlPy5zb21lKChpbWc6IGFueSkgPT4gIWltZy5zZWxlY3RlZCkpIHJldHVybiBmYWxzZTtcclxuICAgIGlmIChzb3VyY2UuaG91c2VLZWVwaW5nPy5zb21lKChpbWc6IGFueSkgPT4gIWltZy5zZWxlY3RlZCkpIHJldHVybiBmYWxzZTtcclxuICAgIGlmIChzb3VyY2UuZHVwbGljYXRlSW1hZ2VzPy5zb21lKChvcmlnaW5hbDogYW55KSA9PiBcclxuICAgICAgb3JpZ2luYWwuZGF0YT8uc29tZSgoZHVwOiBhbnkpID0+ICFkdXAuc2VsZWN0ZWQpKSkgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG5jaGVja2VkVmFsdWUgPXRydWU7XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxub25JbWFnZUNoZWNrYm94Q2hhbmdlKGRhdGE6IGFueSwgY2F0ZWdvcnk6IHN0cmluZywgcGFyZW50T3JpZ2luYWw/OiBhbnkpIHtcclxuICBsZXQgc2VsZWN0ZWRMaXN0O1xyXG5cclxuICBzd2l0Y2ggKGNhdGVnb3J5KSB7XHJcbiAgICBjYXNlICdkdXBsaWNhdGUnOlxyXG4gICAgICAvLyBFbnN1cmUgc2VsZWN0ZWREdXBsaWNhdGVJbWFnZXNMaXN0IGlzIGFuIGFycmF5IG9mIE9SSUdJTkFMUyB3aXRoIHNlbGVjdGVkIGNoaWxkcmVuXHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nT3JpZ2luYWwgPSB0aGlzLnNlbGVjdGVkRHVwbGljYXRlSW1hZ2VzTGlzdC5maW5kKFxyXG4gICAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0udGVtcElkID09PSBwYXJlbnRPcmlnaW5hbD8udGVtcElkXHJcbiAgICAgICk7XHJcblxyXG4gICAgaWYgKGRhdGEuc2VsZWN0ZWQpIHtcclxuICBpZiAoZXhpc3RpbmdPcmlnaW5hbCkge1xyXG4gICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGV4aXN0aW5nT3JpZ2luYWwuZGF0YT8uc29tZShcclxuICAgICAgKGR1cDogYW55KSA9PiBkdXAudGVtcElkID09PSBkYXRhLnRlbXBJZFxyXG4gICAgKTtcclxuICAgIGlmICghYWxyZWFkeUV4aXN0cykge1xyXG4gICAgICBleGlzdGluZ09yaWdpbmFsLmRhdGEucHVzaCh0aGlzLmNsb25lV2l0aG91dFNlbGVjdGVkKGRhdGEpKTsgLy8g4pyFIG5vICdzZWxlY3RlZCcga2V5XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVJbWFnZXNMaXN0LnB1c2goe1xyXG4gICAgICB0ZW1wSWQ6IHBhcmVudE9yaWdpbmFsPy50ZW1wSWQsXHJcbiAgICAgIGZpbGVQYXRoOiBwYXJlbnRPcmlnaW5hbD8uZmlsZVBhdGgsXHJcbiAgICAgIGVudHJ5VGltZTogcGFyZW50T3JpZ2luYWw/LmVudHJ5VGltZSxcclxuICAgICAgZXhpdFRpbWU6IHBhcmVudE9yaWdpbmFsPy5leGl0VGltZSxcclxuICAgICAgdGltZVJhbmdlOiBwYXJlbnRPcmlnaW5hbD8udGltZVJhbmdlLFxyXG4gICAgICBkYXRhOiBbdGhpcy5jbG9uZVdpdGhvdXRTZWxlY3RlZChkYXRhKV0sIC8vIOKchVxyXG4gICAgfSk7XHJcbiAgfVxyXG59IGVsc2Uge1xyXG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIHNlbGVjdGVkIGR1cGxpY2F0ZXNcclxuICAgICAgICBpZiAoZXhpc3RpbmdPcmlnaW5hbCkge1xyXG4gICAgICAgICAgZXhpc3RpbmdPcmlnaW5hbC5kYXRhID0gZXhpc3RpbmdPcmlnaW5hbC5kYXRhLmZpbHRlcihcclxuICAgICAgICAgICAgKGQ6IGFueSkgPT4gZC50ZW1wSWQgIT09IGRhdGEudGVtcElkXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIC8vIFJlbW92ZSB0aGUgd2hvbGUgb3JpZ2luYWwgaWYgbm8gZHVwbGljYXRlcyBhcmUgbGVmdFxyXG4gICAgICAgICAgaWYgKGV4aXN0aW5nT3JpZ2luYWwuZGF0YS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZER1cGxpY2F0ZUltYWdlc0xpc3QgPSB0aGlzLnNlbGVjdGVkRHVwbGljYXRlSW1hZ2VzTGlzdC5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKG86IGFueSkgPT4gby50ZW1wSWQgIT09IHBhcmVudE9yaWdpbmFsPy50ZW1wSWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENvdW50IG9ubHkgZnJvbSBzZWxlY3RlZCBkdXBsaWNhdGVzXHJcbiAgICAgIHRoaXMuZHVwbGljYXRlQUNDb3VudCA9IHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVJbWFnZXNMaXN0LnJlZHVjZShcclxuICAgICAgICAoc3VtOiBudW1iZXIsIG9yaWc6IGFueSkgPT4gc3VtICsgb3JpZy5kYXRhLmxlbmd0aCxcclxuICAgICAgICAwXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBjYXNlICdob3VzZWtlZXBpbmcnOlxyXG4gICAgICBzZWxlY3RlZExpc3QgPSB0aGlzLnNlbGVjdGVkSG91c2VrZWVwaW5nSW1hZ2VzTGlzdDtcclxuICAgICAgYnJlYWs7XHJcblxyXG4gICAgY2FzZSAnZW1wbG95ZWUnOlxyXG4gICAgICBzZWxlY3RlZExpc3QgPSB0aGlzLnNlbGVjdGVkRW1wbG95ZWVJbWFnZXNMaXN0O1xyXG4gICAgICBicmVhaztcclxuXHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICAvLyBVbmNoYW5nZWQgbG9naWMgZm9yIGVtcGxveWVlIGFuZCBob3VzZWtlZXBpbmdcclxuICBzZWxlY3RlZExpc3QgPSBzZWxlY3RlZExpc3QgfHwgW107XHJcbiAgaWYgKGRhdGEuc2VsZWN0ZWQpIHtcclxuICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBBcnJheS5pc0FycmF5KHNlbGVjdGVkTGlzdCkgJiYgc2VsZWN0ZWRMaXN0LnNvbWUoKGl0ZW06IGFueSkgPT4gaXRlbS50ZW1wSWQgPT09IGRhdGEudGVtcElkKTtcclxuICAgIGlmICghYWxyZWFkeUV4aXN0cykge1xyXG4gICAgICBzZWxlY3RlZExpc3QucHVzaChkYXRhKTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgdXBkYXRlZCA9IEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRMaXN0KSA/IHNlbGVjdGVkTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS50ZW1wSWQgIT09IGRhdGEudGVtcElkKSA6IFtdO1xyXG5cclxuICAgIGlmIChjYXRlZ29yeSA9PT0gJ2hvdXNla2VlcGluZycpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEhvdXNla2VlcGluZ0ltYWdlc0xpc3QgPSB1cGRhdGVkO1xyXG4gICAgfSBlbHNlIGlmIChjYXRlZ29yeSA9PT0gJ2VtcGxveWVlJykge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRW1wbG95ZWVJbWFnZXNMaXN0ID0gdXBkYXRlZDtcclxuICAgIH1cclxuICB9XHJcbiAgdGhpcy5ob3VzZUtlZXBpbmdBQ0NvdW50ID0gIHRoaXMuc2VsZWN0ZWRIb3VzZWtlZXBpbmdJbWFnZXNMaXN0Py5sZW5ndGh8fCAwXHJcbiAgdGhpcy5lbXBsb3llZUFDQ291bnQgPSB0aGlzLnNlbGVjdGVkRW1wbG95ZWVJbWFnZXNMaXN0Lmxlbmd0aCB8fCAwXHJcbn1cclxuXHJcblxyXG5jb21tZW50VGV4dDphbnk7XHJcbnN1Ym1pdFZhbHVlKHN0YXR1czogc3RyaW5nID0gJ2FwcHJvdmVkJywgY2F0ZWdvcnk6IHN0cmluZyA9ICdkdXBsaWNhdGUnKSB7XHJcbiAgLy8gU3RlcCAxOiBWYWxpZGF0ZSBiYXNlZCBvbiBjdXJyZW50IGNhdGVnb3J5XHJcbiBsZXQgc2VsZWN0ZWRMaXN0O1xyXG4gIHN3aXRjaCAoY2F0ZWdvcnkpIHtcclxuICAgIGNhc2UgJ2R1cGxpY2F0ZSc6XHJcbiAgICAgIHNlbGVjdGVkTGlzdCA9IHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVJbWFnZXNMaXN0O1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgJ2hvdXNla2VlcGluZyc6XHJcbiAgICAgIHNlbGVjdGVkTGlzdCA9IHRoaXMuc2VsZWN0ZWRIb3VzZWtlZXBpbmdJbWFnZXNMaXN0O1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgJ2VtcGxveWVlJzpcclxuICAgICAgc2VsZWN0ZWRMaXN0ID0gdGhpcy5zZWxlY3RlZEVtcGxveWVlSW1hZ2VzTGlzdDtcclxuICAgICAgYnJlYWs7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBpZiAoc2VsZWN0ZWRMaXN0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IG9uZSBpbWFnZScpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8gUmVwbGFjZSBzZWxlY3RlZCDihpIgaXNDaGVja2VkIGJlZm9yZSBzZW5kaW5nXHJcbiAgY29uc3QgdHJhbnNmb3JtZWRMaXN0ID0gc2VsZWN0ZWRMaXN0Lm1hcChpdGVtID0+IHtcclxuICAgIGNvbnN0IHsgc2VsZWN0ZWQsIC4uLnJlc3QgfSA9IGl0ZW07XHJcbiAgICByZXR1cm4geyAuLi5yZXN0LCBpc0NoZWNrZWQ6IHRydWUgfTtcclxuICB9KTtcclxuXHJcbiAgLy8gU3RlcCAyOiBCdWlsZCBmdWxsIHBheWxvYWRcclxuY29uc3QgcGF5bG9hZDogYW55W10gPSBbXTtcclxuXHJcbmZvciAoY29uc3QgdGlja2V0IG9mIHRoaXMuZm9vdGZhbGxUaWNrZXRzRGF0YSkge1xyXG4gIGNvbnN0IHNvdXJjZSA9IHRpY2tldC5fc291cmNlO1xyXG5cclxuICBjb25zdCBzaW5nbGVQYXlsb2FkOiBhbnkgPSB7XHJcbiAgICBfaWQ6IHRpY2tldC5faWQsXHJcbiAgICBjb21tZW50czogdGhpcy5jb21tZW50VGV4dCB8fCAnJyxcclxuICAgIGRhdGVTdHJpbmc6IHNvdXJjZS5kYXRlU3RyaW5nIHx8IHRoaXMuZGF0ZVN0cmluZyxcclxuXHJcbiAgICBlbXBsb3llZVN0YXR1czogY2F0ZWdvcnkgPT09ICdlbXBsb3llZScgPyBzdGF0dXMgOiAncGVuZGluZycsXHJcbiAgICBob3VzZUtlZXBpbmdTdGF0dXM6IGNhdGVnb3J5ID09PSAnaG91c2VrZWVwaW5nJyA/IHN0YXR1cyA6ICdwZW5kaW5nJyxcclxuICAgIGR1cGxpY2F0ZVN0YXR1czogY2F0ZWdvcnkgPT09ICdkdXBsaWNhdGUnID8gc3RhdHVzIDogJ3BlbmRpbmcnLFxyXG4gIH07XHJcblxyXG4gIGlmIChjYXRlZ29yeSA9PT0gJ2VtcGxveWVlJykge1xyXG4gICAgc2luZ2xlUGF5bG9hZC5lbXBsb3llZSA9IHRyYW5zZm9ybWVkTGlzdDtcclxuICAgIHNpbmdsZVBheWxvYWQuZW1wbG95ZWVBQ0NvdW50ID0gdGhpcy5lbXBsb3llZUFDQ291bnQgPyB0aGlzLmVtcGxveWVlQUNDb3VudCA6IDA7XHJcbiAgfVxyXG5cclxuICBpZiAoY2F0ZWdvcnkgPT09ICdob3VzZWtlZXBpbmcnKSB7XHJcbiAgICBzaW5nbGVQYXlsb2FkLmhvdXNlS2VlcGluZyA9IHRyYW5zZm9ybWVkTGlzdDtcclxuICAgIHNpbmdsZVBheWxvYWQuaG91c2VLZWVwaW5nQUNDb3VudCA9IHRoaXMuaG91c2VLZWVwaW5nQUNDb3VudCA/IHRoaXMuaG91c2VLZWVwaW5nQUNDb3VudCA6IDA7XHJcbiAgfVxyXG5cclxuICBpZiAoY2F0ZWdvcnkgPT09ICdkdXBsaWNhdGUnKSB7XHJcbiAgICBzaW5nbGVQYXlsb2FkLmR1cGxpY2F0ZUltYWdlcyA9IHRyYW5zZm9ybWVkTGlzdDtcclxuICAgIHNpbmdsZVBheWxvYWQuZHVwbGljYXRlQUNDb3VudCA9IHRoaXMuZHVwbGljYXRlQUNDb3VudCA/IHRoaXMuZHVwbGljYXRlQUNDb3VudCA6IDA7XHJcbiAgfVxyXG5cclxuICBwYXlsb2FkLnB1c2goc2luZ2xlUGF5bG9hZCk7XHJcbn1cclxuXHJcbi8vICAgY29uc29sZS5sb2coJ1BheWxvYWQgdG8gc3VibWl0OicsIHBheWxvYWQpO1xyXG4vLyByZXR1cm5cclxuICAvLyBTdGVwIDM6IFNldCBzdGF0dXMgYmFzZWQgb24gY3VycmVudCBjYXRlZ29yeVxyXG4gIHN3aXRjaCAoY2F0ZWdvcnkpIHtcclxuICAgIGNhc2UgJ2R1cGxpY2F0ZSc6XHJcbiAgICAgIHBheWxvYWQuZm9yRWFjaChpdGVtID0+IGl0ZW0uZHVwbGljYXRlU3RhdHVzID0gc3RhdHVzKTtcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlICdob3VzZWtlZXBpbmcnOlxyXG4gICAgICBwYXlsb2FkLmZvckVhY2goaXRlbSA9PiBpdGVtLmhvdXNlS2VlcGluZ1N0YXR1cyA9IHN0YXR1cyk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnZW1wbG95ZWUnOlxyXG4gICAgICBwYXlsb2FkLmZvckVhY2goaXRlbSA9PiBpdGVtLmVtcGxveWVlU3RhdHVzID0gc3RhdHVzKTtcclxuICAgICAgYnJlYWs7XHJcbiAgfVxyXG5cclxuICAvLyBTdGVwIDQ6IFN1Ym1pdCB0aGUgcGF5bG9hZFxyXG4gIHRoaXMudGlja2V0U2VydmljZS5nZXRVcGRhdGVTdGF0dXNBcGkoe2RhdGE6cGF5bG9hZH0pXHJcbiAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChyZXM/Lm1lc3NhZ2UgfHwgJ1RpY2tldCB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xyXG4gICAgICAgICBcclxuICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuYWxsU2VsZWN0VmFsdWUgPWZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5kYXRhU3RvcmVWaWV3KCk7XHJcbiAgICAgICAgICB0aGlzLmNhbmNlbCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byB1cGRhdGUgdGlja2V0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbXNnID0gZXJyLmVycm9yLmVycm9yIHx8IGVyci5lcnJvciB8fCBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVyci5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJztcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0Vycm9yIHVwZGF0aW5nIHRpY2tldDogJyArIG1zZyk7XHJcbiAgICAgICBcclxuICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuYWxsU2VsZWN0VmFsdWUgPWZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5zZWFyY2hUZXJtOmFueSA9ICcnO1xyXG5nZXQgZmlsdGVyZWRTdG9yZXMoKSB7XHJcbiAgaWYgKCF0aGlzLnNlYXJjaFRlcm0/LnRyaW0oKSkgcmV0dXJuIHRoaXMuc3RvcmVzO1xyXG5cclxuICBjb25zdCB0ZXJtID0gdGhpcy5zZWFyY2hUZXJtLnRvTG93ZXJDYXNlKCk7XHJcbiAgcmV0dXJuIHRoaXMuc3RvcmVzLmZpbHRlcihzdG9yZSA9PlxyXG4gICAgc3RvcmU/LnN0b3JlTmFtZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKVxyXG4gICk7XHJcbn1cclxub25JbWFnZUVycm9yKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICBldmVudC50YXJnZXQuc3JjID0gJ2Fzc2V0cy9pbWFnZXMvZmFsbGJhY2staW1hZ2UucG5nJzsgLy8gb3IgYW55IGRlZmF1bHQgaW1hZ2UgcGF0aFxyXG59XHJcbiAgYmFja1RvTmF2aWdhdGlvbigpe1xyXG4gIHRoaXMuc2VsZWN0ZWRTdG9yZXMgPSBbXTtcclxuICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuYWxsU2VsZWN0VmFsdWUgPWZhbHNlO1xyXG4gICAgdGhpcy5mb290ZmFsbFZpZXcgPXRydWU7XHJcbiAgICB0aGlzLmdldFRpY2tldFN1bW1hcnkoKTtcclxuICAgICAgdGhpcy5nZXRUaWNrZXRMaXN0KCk7XHJcbiAgfVxyXG4gIEBWaWV3Q2hpbGQoJ3pvb21Qb3B1cCcpIHpvb21Qb3B1cDogRWxlbWVudFJlZjtcclxuICBwb3B1cHZhbHVlOmFueTtcclxuICBwb3B1cFR5cGU6YW55O1xyXG4gIHBvcHVwT3Blbih0eXBlOmFueSx2YWx1ZTphbnkpe1xyXG4gY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuem9vbVBvcHVwLCB7IGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnIH0pO1xyXG4gICAgdGhpcy5wb3B1cFR5cGUgPSB0eXBlO1xyXG4gICAgaWYodmFsdWUgPT09J2R1cGxpY2F0ZUltYWdlcycpe1xyXG4gICAgICB0aGlzLnBvcHVwdmFsdWUgPSAnZHVwbGljYXRlJztcclxuICAgIH0gZWxzZXtcclxuICAgICAgdGhpcy5wb3B1cHZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5jYW5jZWwoKSB7XHJcbiAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG5cclxuXHJcbiAgdGhpcy5hbGxTZWxlY3RlZCA9IGZhbHNlO1xyXG4gIHRoaXMuYWxsU2VsZWN0VmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgLy8gQ2xlYXIgYWxsIHNlbGVjdGVkIGZsYWdzIGZyb20gdGhlIGRhdGFcclxuICBmb3IgKGNvbnN0IHRpY2tldCBvZiB0aGlzLmZvb3RmYWxsVGlja2V0c0RhdGEpIHtcclxuICAgIGNvbnN0IHNvdXJjZSA9IHRpY2tldC5fc291cmNlO1xyXG5cclxuICAgIHNvdXJjZS5lbXBsb3llZT8uZm9yRWFjaCgoaW1nOiBhbnkpID0+IChpbWcuc2VsZWN0ZWQgPSBmYWxzZSkpO1xyXG4gICAgc291cmNlLmhvdXNlS2VlcGluZz8uZm9yRWFjaCgoaW1nOiBhbnkpID0+IChpbWcuc2VsZWN0ZWQgPSBmYWxzZSkpO1xyXG4gICAgc291cmNlLmR1cGxpY2F0ZUltYWdlcz8uZm9yRWFjaCgob3JpZ2luYWw6IGFueSkgPT4ge1xyXG4gICAgICBvcmlnaW5hbC5kYXRhPy5mb3JFYWNoKChkdXA6IGFueSkgPT4gKGR1cC5zZWxlY3RlZCA9IGZhbHNlKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIENsZWFyIHNlbGVjdGVkIGxpc3RzXHJcbiAgdGhpcy5zZWxlY3RlZEVtcGxveWVlSW1hZ2VzTGlzdCA9IFtdO1xyXG4gIHRoaXMuc2VsZWN0ZWRIb3VzZWtlZXBpbmdJbWFnZXNMaXN0ID0gW107XHJcbiAgdGhpcy5zZWxlY3RlZER1cGxpY2F0ZUltYWdlc0xpc3QgPSBbXTtcclxuXHJcbiAgLy8gUmVzZXQgY291bnRzXHJcbiAgdGhpcy5lbXBsb3llZUFDQ291bnQgPSAnJztcclxuICB0aGlzLmhvdXNlS2VlcGluZ0FDQ291bnQgPSAnJztcclxuICB0aGlzLmR1cGxpY2F0ZUFDQ291bnQgPSAnJztcclxuXHJcbiAgdGhpcy5jaGVja2VkVmFsdWUgPSB0cnVlO1xyXG59XHJcbkNsdXN0ZXJMaXN0OmFueT1bXTtcclxuICBnZXRBbGxHcm91cHMoKSB7XHJcbiAgICB0aGlzLnRpY2tldFNlcnZpY2UuZ2V0Y2x1c3RlcnMoeyBjbGllbnRJZDogdGhpcy5oZWFkZXJGaWx0ZXJzLmNsaWVudCwgZ3JvdXA6IFtdLCBjaXR5OiBbXSB9KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy5DbHVzdGVyTGlzdCA9IHJlcz8uZGF0YT8uZ3JvdXBEYXRhO1xyXG4gICAgICAgICAgICAgdGhpcy5nZXRTdG9yZXMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5DbHVzdGVyTGlzdCA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbmdyb3VwczogYW55ID0gW107XHJcbiAgIG9uZ3JvdXBTZWxlY3QoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnQ2x1c3Rlckxpc3QnKT8uc2V0VmFsdWUoZXZlbnQpXHJcbiAgICB0aGlzLmdyb3VwcyA9IGV2ZW50Lm1hcCgoZWw6IGFueSkgPT4gZWwuZ3JvdXBOYW1lKVxyXG4gICAgdGhpcy5nZXRTdG9yZXMoKTtcclxuICAgfVxyXG4vLyAgIGlzU3VibWl0RGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbi8vICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkUmV2b3BzVHlwZT8udmFsdWUpIHtcclxuLy8gICAgIGNhc2UgJ2VtcGxveWVlJzpcclxuLy8gICAgICAgcmV0dXJuIHRoaXMuZW1wbG95ZWVBQ0NvdW50ID09PSAwO1xyXG4vLyAgICAgY2FzZSAnaG91c2VLZWVwaW5nJzpcclxuLy8gICAgICAgcmV0dXJuIHRoaXMuaG91c2VLZWVwaW5nQUNDb3VudCA9PT0gMDtcclxuLy8gICAgIGNhc2UgJ2R1cGxpY2F0ZSc6XHJcbi8vICAgICAgIHJldHVybiB0aGlzLmR1cGxpY2F0ZUFDQ291bnQgPT09IDA7XHJcbi8vICAgICBkZWZhdWx0OlxyXG4vLyAgICAgICByZXR1cm4gdHJ1ZTtcclxuLy8gICB9XHJcbi8vIH1cclxuXHJcbn1cclxuIiwiPGRpdiAqbmdJZj1cImZvb3RmYWxsVmlld1wiIGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgbWItM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBlbGxpcHNlMSAgcHktMSBweC01XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXktMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy50b3RhbFRpY2tldHMgIT09IG51bGwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy50b3RhbFRpY2tldHMgOiAnLS0nIH19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1Yi1oZWFkZXJcIj5Ub3RhbCB0aWNrZXRzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTIgcHgtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctNiBjb2wteGwtOSBjb2wtbWQtNiBteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5vcGVuVGlja2V0cyAhPT0gbnVsbCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5vcGVuVGlja2V0cyA6ICctLScgfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdGl0bGUtc3ViLWhlYWRlclwiPk9wZW48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy02IGNvbC14bC0zIGNvbC1tZC02IG15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZVwiPnt7IGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmNsb3NlZFRpY2tldHMgIT09IG51bGwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8uY2xvc2VkVGlja2V0cyA6ICctLScgfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdGl0bGUtc3ViLWhlYWRlclwiPkNsb3NlZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTkgbWItM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciAgZWxsaXBzZTEgcHktMSBweC01XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXktMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5ub1Nob3BwZXIgIT09IG51bGwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5ub1Nob3BwZXIgOiAnLS0nIH19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRlclwiPk5vbi1TaG9wcGVyczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTIgcHgtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctNCBjb2wteGwtNSBjb2wtbWQtNCBteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5kdXBsaWNhdGVDb3VudCAhPT0gbnVsbCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5kdXBsaWNhdGVDb3VudCA6ICctLScgfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdGl0bGUtc3ViLWhlYWRlclwiPkR1cGxpY2F0ZXM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy00IGNvbC14bC01IGNvbC1tZC00IG15LTMgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGUgXCI+e3sgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8uZW1wbG95ZWVDb3VudCAhPT0gbnVsbCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5lbXBsb3llZUNvdW50IDogJy0tJyB9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC10aXRsZS1zdWItaGVhZGVyIFwiPkVtcGxveWVlL1N0YWZmPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctNCBjb2wteGwtMiBjb2wtbWQtNCBteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGUgXCI+e3sgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8uaG91c2VLZWVwaW5nQ291bnQgIT09IG51bGwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8uaG91c2VLZWVwaW5nQ291bnQgOiAnLS0nIH19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLXRpdGxlLXN1Yi1oZWFkZXJcIj5Ib3VzZWtlZXBpbmc8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cImZvb3RmYWxsVmlld1wiIGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJvcmRlci0wIHB0LTNcIj5cclxuICAgICAgICA8aDMgY2xhc3M9XCJjYXJkLXRpdGxlIGFsaWduLWl0ZW1zLXN0YXJ0IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1sYWJlbCBtYi0yXCI+VGlja2V0IEluZm88L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zdWIgbWItMlwiPkJhc2VkIG9uIHt7Zm9vdGZhbGxMaXN0X3JlcT8uZnJvbURhdGUgfCBkYXRlOiAnZGQgTU1NLCB5eXl5J319IOKAkyB7e2Zvb3RmYWxsTGlzdF9yZXE/LnRvRGF0ZSB8IGRhdGU6ICdkZCBNTU0sIHl5eXknfX0gPC9zcGFuPlxyXG4gICAgICAgIDwvaDM+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdG9vbGJhclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwb3NpdGlvbi1yZWxhdGl2ZSBteS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xIHBvc2l0aW9uLWFic29sdXRlIG1zLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBvcGFjaXR5PVwiMC41XCIgeD1cIjE3LjAzNjVcIiB5PVwiMTUuMTIyM1wiIHdpZHRoPVwiOC4xNTU0NlwiIGhlaWdodD1cIjJcIiByeD1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSg0NSAxNy4wMzY1IDE1LjEyMjMpXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcmVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMSAxOUM2LjU1NTU2IDE5IDMgMTUuNDQ0NCAzIDExQzMgNi41NTU1NiA2LjU1NTU2IDMgMTEgM0MxNS40NDQ0IDMgMTkgNi41NTU1NiAxOSAxMUMxOSAxNS40NDQ0IDE1LjQ0NDQgMTkgMTEgMTlaTTExIDVDNy41MzMzMyA1IDUgNy41MzMzMyA1IDExQzUgMTQuNDY2NyA3LjUzMzMzIDE3IDExIDE3QzE0LjQ2NjcgMTcgMTcgMTQuNDY2NyAxNyAxMUMxNyA3LjUzMzMzIDE0LjQ2NjcgNSAxMSA1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBzLTE0IG1lLTJcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VhcmNoRGF0YSgpXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hWYWx1ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8bGliLWZpbHRlcnMgIFtkYXRhT2JqZWN0XT1cImRhdGFPYmplY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoYXBwbGllZEZpbHRlcnMpPVwiYXBwbHlGaWx0ZXJzKCRldmVudClcIj48L2xpYi1maWx0ZXJzPiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImV4cG9ydFhMU1goKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IG14LTIgYnRuLW91dGxpbmUgYnRuLW91dGxpbmUtZGVmYXVsdCByb3VuZGVkLTMgdGV4dC1ub3dyYXAgYm9yZGVyLXZhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+RXhwb3J0PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgbXQtMyBweS0wIHB4LTBcIj5cclxuXHJcblxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwicm93IGxvYWRlciAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIm5vRGF0YVwiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YS1zdWJcIj5UaGVyZSBpcyBubyByZXN1bHQgZm9yIHRoaXMgRGF0ZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiAhbm9EYXRhXCIgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGJvdHRvbS1ib3JkZXIgdGV4dC1ub3dyYXAgXCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvblNvcnQoJ3N0b3JlTmFtZScpXCI+U3RvcmUgSW5mbzxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzb3J0ZWRDb2x1bW4gPT09ICdzdG9yZU5hbWUnICYmIHNvcnREaXJlY3Rpb24gPT09IDEgPyAncm90YXRlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRlZENvbHVtbiA9PT0gJ3N0b3JlTmFtZScgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uU29ydCgndGlja2V0SWQnKVwiPlRpY2tldCBJRDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzb3J0ZWRDb2x1bW4gPT09ICd0aWNrZXRJZCcgJiYgc29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydGVkQ29sdW1uID09PSAndGlja2V0SWQnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvblNvcnQoJ2RhdGVTdHJpbmcnKVwiPlRpY2tldCByYWlzZWQgb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnZGF0ZVN0cmluZycgJiYgc29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydGVkQ29sdW1uID09PSAnZGF0ZVN0cmluZycgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvblNvcnQoJ2Zvb3RmYWxsQ291bnQnKVwiPlRvdGFsIGZvb3RmYWxsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0ZWRDb2x1bW4gPT09ICdmb290ZmFsbENvdW50JyAmJiBzb3J0RGlyZWN0aW9uID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0ZWRDb2x1bW4gPT09ICdmb290ZmFsbENvdW50JyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uU29ydCgnZHVwbGljYXRlQ291bnQnKVwiPkR1cGxpY2F0ZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnZHVwbGljYXRlQ291bnQnICYmIHNvcnREaXJlY3Rpb24gPT09IDEgPyAncm90YXRlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRlZENvbHVtbiA9PT0gJ2R1cGxpY2F0ZUNvdW50JyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uU29ydCgnZW1wbG95ZWVDb3VudCcpXCI+RW1wbG95ZWUvU3RhZmZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnZW1wbG95ZWVDb3VudCcgJiYgc29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydGVkQ29sdW1uID09PSAnZW1wbG95ZWVDb3VudCcgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvblNvcnQoJ2hvdXNlS2VlcGluZ0NvdW50JylcIj5Ib3VzZWtlZXBpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnaG91c2VLZWVwaW5nQ291bnQnICYmIHNvcnREaXJlY3Rpb24gPT09IDEgPyAncm90YXRlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRlZENvbHVtbiA9PT0gJ2hvdXNlS2VlcGluZ0NvdW50JyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+UmV2aXNlZCBmb290ZmFsbHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvblNvcnQoJ3N0YXR1cycpXCI+U3RhdHVzPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNvcnRlZENvbHVtbiA9PT0gJ3N0YXR1cycgJiYgc29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB3aWR0aD1cIjE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydGVkQ29sdW1uID09PSAnc3RhdHVzJyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8dGggPkFjdGlvbnM8L3RoPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHRpY2tldCBvZiBmb290ZmFsbExpc3REYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0aWNrZXQ/Ll9zb3VyY2UgYXMgc291cmNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKGNsaWNrKT1cImRhdGFTdG9yZVZpZXcodGlja2V0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXByaW1hcnkgY3Vyc29yLXBvaW50ZXJcIj57eyBzb3VyY2Uuc3RvcmVOYW1lIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZ3JheS01MDAgZnMtNyBtdC0yXCI+SUQgOiB7eyBzb3VyY2Uuc3RvcmVJZCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicHktN1wiPnt7IHNvdXJjZS50aWNrZXRJZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJweS03XCI+e3sgc291cmNlLmRhdGVTdHJpbmcgfCBkYXRlOiAnZGQgTU1NLCB5eXl5JyB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJweS03XCI+e3sgc291cmNlLmZvb3RmYWxsQ291bnQgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicHktN1wiPnt7IHNvdXJjZS5kdXBsaWNhdGVDb3VudCB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJweS03XCI+e3sgc291cmNlLmVtcGxveWVlQ291bnQgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicHktN1wiPnt7IHNvdXJjZS5ob3VzZUtlZXBpbmdDb3VudCB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJweS03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc291cmNlLmZvb3RmYWxsQ291bnQgLSAoc291cmNlLmhvdXNlS2VlcGluZ0NvdW50ICsgc291cmNlLmVtcGxveWVlQ291bnQgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5kdXBsaWNhdGVDb3VudCkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInB5LTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNvdXJjZS5zdGF0dXMgPT09ICdvcGVuJyB8fCBzb3VyY2Uuc3RhdHVzID09PSAnY2xvc2VkJ1wiIGNsYXNzPVwiYmFkZ2UgbXgtMlwiIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhZGdlLWxpZ2h0LXByaW1hcnknOiBzb3VyY2Uuc3RhdHVzID09PSAnb3BlbicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWRnZS1saWdodC1kZWZhdWx0Jzogc291cmNlLnN0YXR1cyA9PT0gJ2Nsb3NlZCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzb3VyY2Uuc3RhdHVzIHwgdGl0bGVjYXNlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nICYmICFub0RhdGFcIiBjbGFzcz1cIm15LTNcIj5cclxuICAgICAgICAgICAgPGxpYi1wYWdpbmF0aW9uIFtpdGVtc1BlclBhZ2VdPVwicGFnZVNpemVcIiBbY3VycmVudFBhZ2VdPVwiY3VycmVudFBhZ2VcIiBbdG90YWxJdGVtc109XCJ0b3RhbEl0ZW1zXCJcclxuICAgICAgICAgICAgICAgIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cInNldHBhZ2VTaXplKClcIiAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcblxyXG5cclxuPGRpdiAqbmdJZj1cIiFmb290ZmFsbFZpZXdcIiBjbGFzcz1cImNhcmQgbXQtMlwiPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBteS0wXCI+XHJcbiAgICAgICAgPGRpdiAgY2xhc3M9XCJjb2wtbGctMyBteS0zXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMiBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJiYWNrVG9OYXZpZ2F0aW9uKClcIiA+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjQ0XCIgdmlld0JveD1cIjAgMCA1NiA0NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF84ODdfNDUwNSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNTJcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCI1MVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zMC41IDI2TDI1LjUgMjFMMzAuNSAxNlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIGlkPVwiZmlsdGVyMF9kXzg4N180NTA1XCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI0NFwiIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPVwic1JHQlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT1cIjBcIiByZXN1bHQ9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggaW49XCJTb3VyY2VBbHBoYVwiIHR5cGU9XCJtYXRyaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCIgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd184ODdfNDUwNVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCIgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93Xzg4N180NTA1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJzaGFwZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLXRpdGxlLWZvb3QgbXMtM1wiPkZvb3RmYWxsIERpcmVjdG9yeTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgbXktM1wiPlxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJzZWxlY3RlZFN0YXR1c1wiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJ0eXBlXCJcclxuICAgICAgICAgICAgICAgIChpdGVtQ2hhbmdlKT1cInR5cGVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgIFxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgbXktM1wiPlxyXG4gICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImFjdGlvblN0YXR1c1wiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJwZW5kaW5nQXJyYXlcIlxyXG4gICAgICAgICAgICAgICAgKGl0ZW1DaGFuZ2UpPVwicGVuZGluZ0NoYW5nZSgkZXZlbnQpXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICBcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIG15LTRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsYWNlaG9sZGVyLW92ZXJsYXlcIiAqbmdJZj1cIiEoZmlsdGVyRm9ybS5nZXQoJ0NsdXN0ZXJMaXN0Jyk/LnZhbHVlPy5sZW5ndGgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IGNsdXN0ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1ncm91cC1zZWxlY3QgW2l0ZW1zXT1cIkNsdXN0ZXJMaXN0XCIgW2Rpc2FibGVkXT1cImZhbHNlXCIgW211bHRpXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hGaWVsZF09XCInZ3JvdXBOYW1lJ1wiIFtpZEZpZWxkXT1cIidncm91cE5hbWUnXCIgKHNlbGVjdGVkKT1cIm9uZ3JvdXBTZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkVmFsdWVzXT1cImZpbHRlckZvcm0uZ2V0KCdDbHVzdGVyTGlzdCcpPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItZ3JvdXAtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIG15LTRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBtZS0zXCI+XHJcbiAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwib25GaWx0ZXJBcHBseSgpXCIgdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeSBweC00IFwiPjxzcGFuPkFwcGx5PC9zcGFuPjwvYT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9mb3JtPlxyXG48L2Rpdj5cclxuPGRpdiAqbmdJZj1cIiFmb290ZmFsbFZpZXdcIiBjbGFzcz1cInJvdyBtdC0zXCI+XHJcbiAgICA8ZGl2ICBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCIgXHJcbiAgICBbbmdDbGFzc109XCJpc0NvbGxhcHNlZCA/ICdkLW5vbmUnIDogJ2NvbC1tZC0zJ1wiID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTAgcHQtMyBweC01XCI+XHJcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJjYXJkLXRpdGxlIGFsaWduLWl0ZW1zLXN0YXJ0IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLWxhYmVsIG1iLTJcIj5Gb290ZmFsbCBEaXJlY3Rvcnk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXN1YiBtYi0yXCI+QmFzZWQgb24ge3tmb290ZmFsbExpc3RfcmVxLmZyb21EYXRlIHwgZGF0ZTogJ2RkIE1NTSwgeXl5eSd9fSDigJMge3tmb290ZmFsbExpc3RfcmVxLnRvRGF0ZSB8IGRhdGU6ICdkZCBNTU0sIHl5eXknfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgIDxzcGFuICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInRvZ2dsZVNpZGViYXIoKVwiIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IDE1cHg7IHJpZ2h0OiAtMjVweDtcIj5cclxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNjhcIiBoZWlnaHQ9XCI2OFwiIHZpZXdCb3g9XCIwIDAgNjggNjhcIiBmaWxsPVwibm9uZVwiPlxyXG48ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZGRfNzc4XzM0MjgyKVwiPlxyXG48cmVjdCB4PVwiMTJcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiByeD1cIjIyXCIgZmlsbD1cIndoaXRlXCIvPlxyXG48cGF0aCBkPVwiTTMzIDI3TDI4IDIyTDMzIDE3TTQwIDI3TDM1IDIyTDQwIDE3XCIgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbjwvZz5cclxuPGRlZnM+XHJcbjxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RkXzc3OF8zNDI4MlwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjY4XCIgaGVpZ2h0PVwiNjhcIiBmaWx0ZXJVbml0cz1cInVzZXJTcGFjZU9uVXNlXCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPVwic1JHQlwiPlxyXG48ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiLz5cclxuPGZlQ29sb3JNYXRyaXggaW49XCJTb3VyY2VBbHBoYVwiIHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiIHJlc3VsdD1cImhhcmRBbHBoYVwiLz5cclxuPGZlTW9ycGhvbG9neSByYWRpdXM9XCIyXCIgb3BlcmF0b3I9XCJlcm9kZVwiIGluPVwiU291cmNlQWxwaGFcIiByZXN1bHQ9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfNzc4XzM0MjgyXCIvPlxyXG48ZmVPZmZzZXQgZHk9XCI0XCIvPlxyXG48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiM1wiLz5cclxuPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wMyAwXCIvPlxyXG48ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW4yPVwiQmFja2dyb3VuZEltYWdlRml4XCIgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93Xzc3OF8zNDI4MlwiLz5cclxuPGZlQ29sb3JNYXRyaXggaW49XCJTb3VyY2VBbHBoYVwiIHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiIHJlc3VsdD1cImhhcmRBbHBoYVwiLz5cclxuPGZlTW9ycGhvbG9neSByYWRpdXM9XCI0XCIgb3BlcmF0b3I9XCJlcm9kZVwiIGluPVwiU291cmNlQWxwaGFcIiByZXN1bHQ9XCJlZmZlY3QyX2Ryb3BTaGFkb3dfNzc4XzM0MjgyXCIvPlxyXG48ZmVPZmZzZXQgZHk9XCIxMlwiLz5cclxuPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjhcIi8+XHJcbjxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDggMFwiLz5cclxuPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd183NzhfMzQyODJcIiByZXN1bHQ9XCJlZmZlY3QyX2Ryb3BTaGFkb3dfNzc4XzM0MjgyXCIvPlxyXG48ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCIgaW4yPVwiZWZmZWN0Ml9kcm9wU2hhZG93Xzc3OF8zNDI4MlwiIHJlc3VsdD1cInNoYXBlXCIvPlxyXG48L2ZpbHRlcj5cclxuPC9kZWZzPlxyXG48L3N2Zz5cclxuPC9zcGFuPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbmQgbXQtMTBcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgdy0yNSBtZS0zIGJ0bi1yZXNpemVcIiAoY2xpY2spPVwiZGF0YVJlc2V0KClcIj4gUmVzZXQgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMjUgbWUtNSBidG4tcmVzaXplXCIgKGNsaWNrKT1cImRhdGFBcHBseSgpXCI+QXBwbHk8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTQgdy0xMDAgb3ZlcmZsb3ctYXV0b1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dFxyXG4gIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSBtYi0yIHB4LTIgcHktMSB3LTEwMFwiXHJcbiAgdHlwZT1cInRleHRcIlxyXG4gIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCJcclxuICBbKG5nTW9kZWwpXT1cIlN0b3Jlc1NlYXJjaFZhbHVlXCJcclxuICAoY2hhbmdlKT1cInNlYXJjaFN0b3Jlc0RhdGEoKVwiXHJcbi8+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgYm9yZGVyLXNlbGVjdGFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJhbGxTZWxlY3RlZFwiIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm10LTIgZm9udC1zZW1pYm9sZCBtcy0yXCI+U2VsZWN0IEFsbCB7e3N0b3JlQ291bnR9fSBTdG9yZXM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkIHBzLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHN0b3JlIG9mIHN0b3Jlc1wiIGNsYXNzPVwibWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZChzdG9yZSlcIiAoY2hhbmdlKT1cInRvZ2dsZVN0b3JlU2VsZWN0aW9uKHN0b3JlKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHN0b3JlPy5zdG9yZU5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgW25nQ2xhc3NdPVwiaXNDb2xsYXBzZWQgPyAnY29sLTEyJyA6ICdjb2wtbWQtOSdcIiA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMCBwdC0zXCI+XHJcbiAgICAgICAgICAgICAgICA8aDMgIGNsYXNzPVwiY2FyZC10aXRsZSBhbGlnbi1pdGVtcy1zdGFydCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFJldm9wc1R5cGU/LnZhbHVlICE9PSAnJ1wiIGNsYXNzPVwibWItMlwiPlxyXG4gIDxpbnB1dCAqbmdJZj1cIiFmb290ZmFsbExvYWRpbmcgJiYgIWZvb3RmYWxsTm9EYXRhXCJcclxuICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICBbY2hlY2tlZF09XCJhbGxTZWxlY3RWYWx1ZVwiXHJcbiAgICAoY2hhbmdlKT1cInNlbGVjdEFsbFZhbHVlKClcIiAvPlxyXG4gPGxhYmVsICpuZ0lmPVwiIWZvb3RmYWxsTG9hZGluZyAmJiAhZm9vdGZhbGxOb0RhdGFcIiBjbGFzcz1cIm10LTIgZnMtNiBmb250LXNlbWlib2xkIG1zLTJcIj5cclxuICBTZWxlY3QgQWxsIChcclxuICAgIHt7XHJcbiAgICAgIGhvdXNlS2VlcGluZ0FDQ291bnQgPiAwXHJcbiAgICAgICAgPyBob3VzZUtlZXBpbmdBQ0NvdW50XHJcbiAgICAgICAgOiBlbXBsb3llZUFDQ291bnQgPiAwXHJcbiAgICAgICAgPyBlbXBsb3llZUFDQ291bnRcclxuICAgICAgICA6IGR1cGxpY2F0ZUFDQ291bnQgPiAwXHJcbiAgICAgICAgPyBkdXBsaWNhdGVBQ0NvdW50XHJcbiAgICAgICAgOiAwXHJcbiAgICB9fVxyXG4gIClcclxuPC9sYWJlbD5cclxuICA8IS0tICAtLT5cclxuPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdG9vbGJhclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJteC00XCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0ZWRSZXZvcHNUeXBlXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cInJldm9wc1R5cGVBcnJheVwiIChpdGVtQ2hhbmdlKT1cIlJldm9wc1R5cGVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFJldm9wc1R5cGU/LnZhbHVlICE9PSAnJ1wiICBjbGFzcz1cIm15LTcgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWUtNVwiIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZm9vdGZhbGxMb2FkaW5nICYmICFmb290ZmFsbE5vRGF0YVwiIFtkaXNhYmxlZF09XCJjaGVja2VkVmFsdWVcIiAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgbWUtMVwiIChjbGljayk9XCJwb3B1cE9wZW4oJ3JlamVjdGVkJyx0aGlzLnNlbGVjdGVkUmV2b3BzVHlwZS52YWx1ZSlcIj5SZWplY3Qgc2VsZWN0aW9uPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWZvb3RmYWxsTG9hZGluZyAmJiAhZm9vdGZhbGxOb0RhdGFcIiBbZGlzYWJsZWRdPVwiY2hlY2tlZFZhbHVlXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXMtMVwiIChjbGljayk9XCJwb3B1cE9wZW4oJ2FwcHJvdmVkJyx0aGlzLnNlbGVjdGVkUmV2b3BzVHlwZS52YWx1ZSlcIj5BcHByb3ZlIHNlbGVjdGlvbjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHNlY3Rpb24gKm5nSWY9XCJzZWxlY3RlZFJldm9wc1R5cGU/LnZhbHVlID09PSAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFmb290ZmFsbExvYWRpbmcgJiYgIWZvb3RmYWxsTm9EYXRhXCIgY2xhc3M9XCJjYXJkLWJvZHkgbXQtMyBweS0wXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKm5nSWY9XCJpc0NvbGxhcHNlZFwiICAoY2xpY2spPVwidG9nZ2xlU2lkZWJhcigpXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMTVweDsgbGVmdDogMDtcIj5cclxuICAgICAgICAgICA8c3ZnIGNsYXNzPVwibXQtMiBtcy0yXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05LjcyNzE0IDEyLjYzNjVMMTMuMzYzNSA5LjAwMDEzTDkuNzI3MTQgNS4zNjM3N000LjYzNjIzIDEyLjYzNjVMOC4yNzI1OSA5LjAwMDEzTDQuNjM2MjMgNS4zNjM3N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGlja2V0IG9mIGZvb3RmYWxsVGlja2V0c0RhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGlja2V0Py5fc291cmNlIGFzIHNvdXJjZVwiIGNsYXNzPVwicm93IG1iLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIGNhcmQtdGl0bGUtbGFiZWwgbXktMlwiPlRpY2tldCBOYW1lPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMSBmb250LWJvbGQgbXktMlwiPjo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC05IGNhcmQtdGl0bGUtdmFsdWUgbXktMlwiPnt7IHNvdXJjZS50aWNrZXROYW1lID8gKHNvdXJjZS50aWNrZXROYW1lIHwgdGl0bGVjYXNlKSA6ICctJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgY2FyZC10aXRsZS1sYWJlbCBteS0yXCI+VGlja2V0IElEPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMSBmb250LWJvbGQgbXktMlwiPjo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC05IGNhcmQtdGl0bGUtdmFsdWUgbXktMlwiPnt7IHNvdXJjZS50aWNrZXRJZCA/IHNvdXJjZS50aWNrZXRJZDonLScgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIGNhcmQtdGl0bGUtbGFiZWwgbXktMlwiPlN0b3JlIE5hbWU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xIGZvbnQtYm9sZCBteS0yXCI+OjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTkgY2FyZC10aXRsZS12YWx1ZSBteS0yXCI+e3sgc291cmNlLnN0b3JlTmFtZSA/IHNvdXJjZS5zdG9yZU5hbWU6Jy0nICB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgY2FyZC10aXRsZS1sYWJlbCBteS0yXCI+U3RhdHVzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMSBmb250LWJvbGQgbXktMlwiPjo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIG15LTJcIj48c3BhbiBcclxuICBjbGFzcz1cImJhZGdlXCIgXHJcbiAgW25nQ2xhc3NdPVwie1xyXG4gICAgJ2JhZGdlLWxpZ2h0LXByaW1hcnknOiBzb3VyY2Uuc3RhdHVzID09PSAnb3BlbicsXHJcbiAgICAnYmFkZ2Utc2Vjb25kYXJ5Jzogc291cmNlLnN0YXR1cyA9PT0gJ2Nsb3NlZCcsXHJcbiAgICAnYmFkZ2UtbGlnaHQtd2FybmluZyc6IHNvdXJjZS5zdGF0dXMgPT09ICdwZW5kaW5nJyxcclxuICAgICdiYWRnZS1saWdodC1kYW5nZXInOiBzb3VyY2Uuc3RhdHVzID09PSAncmVqZWN0ZWQnXHJcbiAgfVwiPlxyXG4gIHt7IHNvdXJjZS5zdGF0dXMgPyAoc291cmNlLnN0YXR1cyB8IHRpdGxlY2FzZSkgOiAnLScgfX1cclxuPC9zcGFuPjwvZGl2PlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMiBjYXJkLXRpdGxlLWxhYmVsIG15LTJcIj5EYXRlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMSBmb250LWJvbGQgbXktMlwiPjo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIGNhcmQtdGl0bGUtdmFsdWUgbXktMlwiPnt7IHNvdXJjZS5kYXRlU3RyaW5nID8gKHNvdXJjZS5kYXRlU3RyaW5nIHwgZGF0ZTogJ2RkIE1NTSwgeXl5eScpIDonLSAgJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0aWNrZXQ/Ll9zb3VyY2UgYXMgc291cmNlXCIgY2xhc3M9XCJib3JkZXItdG90YWxmb290ZmFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgZWxsaXBzZTEgbWluLWgtNDVweCAgcHktMSBweC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXktMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyBzb3VyY2U/LmZvb3RmYWxsQ291bnQgIT09IG51bGwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPy5mb290ZmFsbENvdW50IDogJy0tJyB9fSA8c3BhbiBjbGFzcz1cInN1Yi1oZWFkZXIgbXMtMlwiPlRvdGFsIEZvb3RmYWxsPC9zcGFuPjwvaDU+XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0yIHB4LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTMgY29sLXhsLTMgY29sLW1kLTMgbXktM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgc291cmNlPy5kdXBsaWNhdGVDb3VudCAhPT0gbnVsbCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U/LmR1cGxpY2F0ZUNvdW50IDogJy0tJyB9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC10aXRsZS1zdWItaGVhZGVyXCI+RHVwbGljYXRlczwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTMgY29sLXhsLTMgY29sLW1kLTMgbXktM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgc291cmNlPy5lbXBsb3llZUNvdW50ICE9PSBudWxsID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT8uZW1wbG95ZWVDb3VudCA6ICctLScgfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdGl0bGUtc3ViLWhlYWRlclwiPkVtcGxveWVlL1N0YWZmPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0zIGNvbC14bC0zIGNvbC1tZC0zIG15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZVwiPnt7IHNvdXJjZT8uaG91c2VLZWVwaW5nQ291bnQgIT09IG51bGwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPy5ob3VzZUtlZXBpbmdDb3VudCA6ICctLScgfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdGl0bGUtc3ViLWhlYWRlclwiPkhvdXNlIEtlZXBpbmc8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0zIGNvbC14bC0zIGNvbC1tZC0zIG15LTMgdmxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZVwiPiB7eyBcclxuICAgICAgKHNvdXJjZS5mb290ZmFsbENvdW50IHx8IDApIC0gXHJcbiAgICAgICgoc291cmNlLmhvdXNlS2VlcGluZ0NvdW50IHx8IDApICsgXHJcbiAgICAgICAoc291cmNlLmVtcGxveWVlQ291bnQgfHwgMCkgKyBcclxuICAgICAgIChzb3VyY2UuZHVwbGljYXRlQ291bnQgfHwgMCkpIFxyXG4gICAgfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdGl0bGUtc3ViLWhlYWRlclwiPkFjdHVhbCBmb290ZmFsbDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0aWNrZXQ/Ll9zb3VyY2UgYXMgc291cmNlXCIgY2xhc3M9XCJteS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyAqbmdJZj1cInNvdXJjZT8uZHVwbGljYXRlSW1hZ2VzPy5sZW5ndGhcIiBjbGFzcz1cInRleHQtbGcgZm9udC1zZW1pYm9sZCBtYi0yXCI+IDxzcGFuIGNsYXNzPVwibWUtMlwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzczMF83NjE1NylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zLjc1IDExLjI1SDNDMi42MDIxOCAxMS4yNSAyLjIyMDY0IDExLjA5MiAxLjkzOTM0IDEwLjgxMDdDMS42NTgwNCAxMC41Mjk0IDEuNSAxMC4xNDc4IDEuNSA5Ljc1VjNDMS41IDIuNjAyMTggMS42NTgwNCAyLjIyMDY0IDEuOTM5MzQgMS45MzkzNEMyLjIyMDY0IDEuNjU4MDQgMi42MDIxOCAxLjUgMyAxLjVIOS43NUMxMC4xNDc4IDEuNSAxMC41Mjk0IDEuNjU4MDQgMTAuODEwNyAxLjkzOTM0QzExLjA5MiAyLjIyMDY0IDExLjI1IDIuNjAyMTggMTEuMjUgM1YzLjc1TTguMjUgNi43NUgxNUMxNS44Mjg0IDYuNzUgMTYuNSA3LjQyMTU3IDE2LjUgOC4yNVYxNUMxNi41IDE1LjgyODQgMTUuODI4NCAxNi41IDE1IDE2LjVIOC4yNUM3LjQyMTU3IDE2LjUgNi43NSAxNS44Mjg0IDYuNzUgMTVWOC4yNUM2Ljc1IDcuNDIxNTcgNy40MjE1NyA2Ljc1IDguMjUgNi43NVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNzMwXzc2MTU3XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+RHVwbGljYXRlczwvaDM+XHJcbiAgICBcclxuICAgIFxyXG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgb3JpZ2luYWwgb2Ygc291cmNlLmR1cGxpY2F0ZUltYWdlc1wiIGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzb3VyY2U/LmR1cGxpY2F0ZUltYWdlcz8ubGVuZ3RoXCIgY2xhc3M9XCJkdXBsaWNhdGUtaGVhZCBteS0yXCI+T3JpZ2luYWwgaW1hZ2U8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyByZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBiLTMgaW1nLWJvcmRlciBib3JkZXIgYm9yZGVyLTEgaC0xMDAgcm91bmRlZC0zXCI+XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWFnZVVybCArIG9yaWdpbmFsLmZpbGVQYXRoXCIgYWx0PVwiXCIgY2xhc3M9XCJ3LTEwMCByb3VuZGVkIGJvcmRlclwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXRpdGxlIG1zLTIgbXQtMlwiPlRlbXAgSUQ6IHt7IG9yaWdpbmFsLnRlbXBJZCB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy12YWx1ZSBtcy0yXCI+RW50cnkgVGltZToge3sgb3JpZ2luYWwuZW50cnlUaW1lIH19PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICBcclxuICAgICAgPGRpdiBjbGFzcz1cImR1cGxpY2F0ZS1oZWFkIG15LTJcIj5EdXBsaWNhdGVzPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgcG9zaXRpb24tcmVsYXRpdmVcIiAqbmdGb3I9XCJsZXQgaW1nIG9mIG9yaWdpbmFsLmRhdGFcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi0zIGltZy1ib3JkZXIgYm9yZGVyIGJvcmRlci0xIGgtMTAwIHJvdW5kZWQtMyBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJzb3VyY2Uuc3RhdHVzID09PSdwZW5kaW5nJ1wiXHJcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImltZy5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSBhYnNvbHV0ZSBmb3JtLWNoZWNrLWlucHV0XCJcclxuKGNoYW5nZSk9XCJvbkltYWdlQ2hlY2tib3hDaGFuZ2UoaW1nLCAnZHVwbGljYXRlJywgb3JpZ2luYWwpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlVXJsICsgaW1nLmZpbGVQYXRoXCIgYWx0PVwiXCIgY2xhc3M9XCJ3LTEwMCBtYi0yIHJvdW5kZWQgYm9yZGVyXCIgLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MtdGl0bGUgbXMtMiBtdC0yXCI+VGVtcCBJRDoge3sgaW1nLnRlbXBJZCB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy12YWx1ZSBtcy0yXCI+RW50cnkgVGltZToge3sgaW1nLmVudHJ5VGltZSB9fTwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic291cmNlPy5kdXBsaWNhdGVJbWFnZXM/Lmxlbmd0aFwiIGNsYXNzPVwibXktNyBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cIiFkdXBsaWNhdGVBQ0NvdW50XCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgbWUtMVwiIChjbGljayk9XCJwb3B1cE9wZW4oJ3JlamVjdGVkJywnZHVwbGljYXRlJylcIiA+UmVqZWN0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCIhZHVwbGljYXRlQUNDb3VudFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1zLTFcIiAoY2xpY2spPVwicG9wdXBPcGVuKCdhcHByb3ZlZCcsJ2R1cGxpY2F0ZScpXCI+QXBwcm92ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic291cmNlPy5lbXBsb3llZT8ubGVuZ3RoXCIgY2xhc3M9XCJkdXBsaWNhdGUtaGVhZCBteS0yXCI+RW1wbG95ZWUvU3RhZmY8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIHBvc2l0aW9uLXJlbGF0aXZlXCIgKm5nRm9yPVwibGV0IGltZyBvZiBzb3VyY2UuZW1wbG95ZWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItMyBpbWctYm9yZGVyIGJvcmRlciBib3JkZXItMSBoLTEwMCByb3VuZGVkLTMgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRvcC1yaWdodCBDaGVja2JveCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic291cmNlLnN0YXR1cyA9PT0ncGVuZGluZydcIiB0eXBlPVwiY2hlY2tib3hcIiAgWyhuZ01vZGVsKV09XCJpbWcuc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSBhYnNvbHV0ZSBmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25JbWFnZUNoZWNrYm94Q2hhbmdlKGltZywgJ2VtcGxveWVlJylcIiAgLz5cclxuICAgIFxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW1hZ2UgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWFnZVVybCArIGltZy5maWxlUGF0aFwiIGFsdD1cIlwiIGNsYXNzPVwidy0xMDAgbWItMiByb3VuZGVkIGJvcmRlclwiIC8+XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZXRhaWxzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy10aXRsZSBtcy0yIG10LTJcIj5UZW1wIElEOiB7e2ltZy50ZW1wSWR9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy12YWx1ZSBtcy0yXCI+RW50cnkgVGltZToge3tpbWcuZW50cnlUaW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzb3VyY2U/LmVtcGxveWVlPy5sZW5ndGhcIiBjbGFzcz1cIm15LTcgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIiByb2xlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cIiFlbXBsb3llZUFDQ291bnRcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBtZS0xXCIgKGNsaWNrKT1cInBvcHVwT3BlbigncmVqZWN0ZWQnLCdlbXBsb3llZScpXCIgPlJlamVjdDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiIWVtcGxveWVlQUNDb3VudFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1zLTFcIiAoY2xpY2spPVwicG9wdXBPcGVuKCdhcHByb3ZlZCcsJ2VtcGxveWVlJylcIj5BcHByb3ZlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzb3VyY2U/LmhvdXNlS2VlcGluZz8ubGVuZ3RoXCIgY2xhc3M9XCJkdXBsaWNhdGUtaGVhZCBteS0yXCI+SG91c2UgS2VlcGluZzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgcG9zaXRpb24tcmVsYXRpdmVcIiAqbmdGb3I9XCJsZXQgaW1nIG9mIHNvdXJjZS5ob3VzZUtlZXBpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItMyBpbWctYm9yZGVyIGJvcmRlciBib3JkZXItMSBoLTEwMCByb3VuZGVkLTMgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRvcC1yaWdodCBDaGVja2JveCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic291cmNlLnN0YXR1cyA9PT0ncGVuZGluZydcIiB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImltZy5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIGFic29sdXRlIGZvcm0tY2hlY2staW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkltYWdlQ2hlY2tib3hDaGFuZ2UoaW1nLCAnaG91c2VrZWVwaW5nJylcIiAvPlxyXG4gICAgXHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJbWFnZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlVXJsICsgaW1nLmZpbGVQYXRoXCIgYWx0PVwiXCIgY2xhc3M9XCJ3LTEwMCBtYi0yIHJvdW5kZWQgYm9yZGVyXCIgLz5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERldGFpbHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXRpdGxlIG1zLTIgbXQtMlwiPlRlbXAgSUQ6IHt7aW1nLnRlbXBJZH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXZhbHVlIG1zLTJcIj5FbnRyeSBUaW1lOiB7e2ltZy5lbnRyeVRpbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNvdXJjZT8uaG91c2VLZWVwaW5nPy5sZW5ndGhcIiBjbGFzcz1cIm15LTcgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIiByb2xlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cIiFob3VzZUtlZXBpbmdBQ0NvdW50XCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgbWUtMVwiIChjbGljayk9XCJwb3B1cE9wZW4oJ3JlamVjdCcsJ2hvdXNla2VlcGluZycpXCIgPlJlamVjdDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiIWhvdXNlS2VlcGluZ0FDQ291bnRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtcy0xXCIgKGNsaWNrKT1cInBvcHVwT3BlbignYXBwcm92ZWQnLCdob3VzZWtlZXBpbmcnKVwiPkFwcHJvdmU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICA8ZGl2ICpuZ0lmPVwiIWZvb3RmYWxsTG9hZGluZyAmJiAhZm9vdGZhbGxOb0RhdGFcIiBjbGFzcz1cIm15LTNcIj5cclxuICAgICAgICAgICAgICAgIDxsaWItcGFnaW5hdGlvbiBbaXRlbXNQZXJQYWdlXT1cInBhZ2VTaXplRm9vdGZhbGxcIiBbY3VycmVudFBhZ2VdPVwiZm9vdGZhbGxjdXJyZW50UGFnZVwiIFt0b3RhbEl0ZW1zXT1cInRvdGFsSXRlbXNGb290ZmFsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRpb25TaXplc109XCJwYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwic2V0Rm9vdGZhbGxwYWdlU2l6ZSgpXCIgKHBhZ2VDaGFuZ2UpPVwib25Gb290ZmFsbFBhZ2VDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uRm9vdGZhbGxQYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgIFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuIDxkaXYgKm5nSWY9XCJmb290ZmFsbExvYWRpbmdcIiBjbGFzcz1cInJvdyBsb2FkZXIgIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZm9vdGZhbGxOb0RhdGFcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uIFwiIHN0eWxlPVwibWFyZ2luOiA2NHB4O2JvcmRlci1yYWRpdXM6IDhweDtcclxuYmFja2dyb3VuZDogdmFyKC0tR3JheS01MCwgI0Y5RkFGQik7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJteS01XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiOTRcIiBoZWlnaHQ9XCI5NFwiIHZpZXdCb3g9XCIwIDAgOTQgOTRcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjdcIiB5PVwiN1wiIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIHJ4PVwiNDBcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiN1wiIHk9XCI3XCIgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgcng9XCI0MFwiIHN0cm9rZT1cIiNFQUY4RkZcIiBzdHJva2Utd2lkdGg9XCIxMy4zMzMzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNzMwXzc1MDk1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNTUuMzMyNyA2MlY1OC42NjY3QzU1LjMzMjcgNTYuODk4NiA1NC42MzAzIDU1LjIwMjkgNTMuMzgwMSA1My45NTI2QzUyLjEyOTggNTIuNzAyNCA1MC40MzQxIDUyIDQ4LjY2NiA1MkgzNS4zMzI3QzMzLjU2NDYgNTIgMzEuODY4OSA1Mi43MDI0IDMwLjYxODYgNTMuOTUyNkMyOS4zNjg0IDU1LjIwMjkgMjguNjY2IDU2Ljg5ODYgMjguNjY2IDU4LjY2NjdWNjJNNjUuMzMyNyA2MlY1OC42NjY3QzY1LjMzMTYgNTcuMTg5NSA2NC44Mzk5IDU1Ljc1NDYgNjMuOTM1IDU0LjU4NzJDNjMuMDMgNTMuNDE5OCA2MS43NjI5IDUyLjU4NTkgNjAuMzMyNyA1Mi4yMTY3TTUzLjY2NiAzMi4yMTY3QzU1LjEgMzIuNTgzOCA1Ni4zNzExIDMzLjQxNzggNTcuMjc4NyAzNC41ODcyQzU4LjE4NjQgMzUuNzU2NSA1OC42NzkxIDM3LjE5NDcgNTguNjc5MSAzOC42NzVDNTguNjc5MSA0MC4xNTUzIDU4LjE4NjQgNDEuNTkzNSA1Ny4yNzg3IDQyLjc2MjhDNTYuMzcxMSA0My45MzIyIDU1LjEgNDQuNzY2MiA1My42NjYgNDUuMTMzM000OC42NjYgMzguNjY2N0M0OC42NjYgNDIuMzQ4NiA0NS42ODEyIDQ1LjMzMzMgNDEuOTk5MyA0NS4zMzMzQzM4LjMxNzQgNDUuMzMzMyAzNS4zMzI3IDQyLjM0ODYgMzUuMzMyNyAzOC42NjY3QzM1LjMzMjcgMzQuOTg0OCAzOC4zMTc0IDMyIDQxLjk5OTMgMzJDNDUuNjgxMiAzMiA0OC42NjYgMzQuOTg0OCA0OC42NjYgMzguNjY2N1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiNFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF83MzBfNzUwOTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgZmlsbD1cIndoaXRlXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDI3IDI3KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtdGl0bGUgbXktM1wiPk5vIHBlbmRpbmcgaXRlbXM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YS1zdWIgbWItM1wiPkxvb2tzIGxpa2UgdGhlcmUgaXMgbm8gYWN0aW9uIGl0ZW0gcmVxdWlyZWQgZm9yIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFJldm9wc1R5cGU/LnZhbHVlPT09J2R1cGxpY2F0ZUltYWdlcydcIj5kdXBsaWNhdGVzPC9zcGFuPjxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFJldm9wc1R5cGU/LnZhbHVlPT09J2VtcGxveWVlJ1wiPmVtcGxveWVlL3N0YWZmPC9zcGFuPiA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRSZXZvcHNUeXBlPy52YWx1ZT09PSdob3VzZUtlZXBpbmcnXCI+aG91c2VLZWVwaW5nPC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgIDwhLS0gQ2FyZCBCb2R5IC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRSZXZvcHNUeXBlPy52YWx1ZSAhPT0gJydcIiBjbGFzcz1cImNhcmQtYm9keSBtdC0zIHB5LTBcIj5cclxuICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAqbmdJZj1cImlzQ29sbGFwc2VkXCIgIChjbGljayk9XCJ0b2dnbGVTaWRlYmFyKClcIiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAxNXB4OyBsZWZ0OiAwO1wiPlxyXG4gICAgICAgICAgIDxzdmcgY2xhc3M9XCJtdC0yIG1zLTJcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkuNzI3MTQgMTIuNjM2NUwxMy4zNjM1IDkuMDAwMTNMOS43MjcxNCA1LjM2Mzc3TTQuNjM2MjMgMTIuNjM2NUw4LjI3MjU5IDkuMDAwMTNMNC42MzYyMyA1LjM2Mzc3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0aWNrZXQgb2YgZm9vdGZhbGxUaWNrZXRzRGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0aWNrZXQ/Ll9zb3VyY2UgYXMgc291cmNlXCIgY2xhc3M9XCJteS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9yaWdpbmFsIG9mIHNvdXJjZS5kdXBsaWNhdGVJbWFnZXNcIiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzb3VyY2U/LmR1cGxpY2F0ZUltYWdlcz8ubGVuZ3RoXCIgY2xhc3M9XCJkdXBsaWNhdGUtaGVhZCBteS0yXCI+T3JpZ2luYWwgaW1hZ2U8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIOKchSBPcmlnaW5hbCBJbWFnZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBiLTMgaW1nLWJvcmRlciBib3JkZXIgYm9yZGVyLTEgaC0xMDAgcm91bmRlZC0zXCI+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlVXJsICsgb3JpZ2luYWwuZmlsZVBhdGhcIiBhbHQ9XCJcIiBjbGFzcz1cInctMTAwIHJvdW5kZWQgYm9yZGVyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXRpdGxlIG1zLTIgbXQtMlwiPlRlbXAgSUQ6IHt7IG9yaWdpbmFsLnRlbXBJZCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MtdmFsdWUgbXMtMlwiPkVudHJ5IFRpbWU6IHt7IG9yaWdpbmFsLmVudHJ5VGltZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0g8J+fqCBEdXBsaWNhdGUgSW1hZ2VzIChmb3IgdGhpcyBvcmlnaW5hbCkgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHVwbGljYXRlLWhlYWQgbXktMlwiPkR1cGxpY2F0ZXM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgcG9zaXRpb24tcmVsYXRpdmVcIiAqbmdGb3I9XCJsZXQgaW1nIG9mIG9yaWdpbmFsLmRhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBiLTMgaW1nLWJvcmRlciBib3JkZXIgYm9yZGVyLTEgaC0xMDAgcm91bmRlZC0zIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJzb3VyY2Uuc3RhdHVzID09PSdwZW5kaW5nJ1wiIHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiaW1nLnNlbGVjdGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIGFic29sdXRlIGZvcm0tY2hlY2staW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25JbWFnZUNoZWNrYm94Q2hhbmdlMShpbWcsICdkdXBsaWNhdGUnKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1hZ2VVcmwgKyBpbWcuZmlsZVBhdGhcIiBhbHQ9XCJcIiBjbGFzcz1cInctMTAwIG1iLTIgcm91bmRlZCBib3JkZXJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MtdGl0bGUgbXMtMiBtdC0yXCI+VGVtcCBJRDoge3sgaW1nLnRlbXBJZCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MtdmFsdWUgbXMtMlwiPkVudHJ5IFRpbWU6IHt7IGltZy5lbnRyeVRpbWUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNvdXJjZT8uZW1wbG95ZWU/Lmxlbmd0aFwiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgcG9zaXRpb24tcmVsYXRpdmVcIiAqbmdGb3I9XCJsZXQgaW1nIG9mIHNvdXJjZS5lbXBsb3llZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi0zIGltZy1ib3JkZXIgYm9yZGVyIGJvcmRlci0xIGgtMTAwIHJvdW5kZWQtMyBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVG9wLXJpZ2h0IENoZWNrYm94IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJzb3VyY2Uuc3RhdHVzID09PSdwZW5kaW5nJ1wiIHR5cGU9XCJjaGVja2JveFwiICBbKG5nTW9kZWwpXT1cImltZy5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIGFic29sdXRlIGZvcm0tY2hlY2staW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkltYWdlQ2hlY2tib3hDaGFuZ2UxKGltZywgJ2VtcGxveWVlJylcIiAgLz5cclxuICAgIFxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW1hZ2UgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWFnZVVybCArIGltZy5maWxlUGF0aFwiIGFsdD1cIlwiIGNsYXNzPVwidy0xMDAgbWItMiByb3VuZGVkIGJvcmRlclwiIC8+XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZXRhaWxzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy10aXRsZSBtcy0yIG10LTJcIj5UZW1wIElEOiB7e2ltZy50ZW1wSWR9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy12YWx1ZSBtcy0yXCI+RW50cnkgVGltZToge3tpbWcuZW50cnlUaW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzb3VyY2U/LmhvdXNlS2VlcGluZz8ubGVuZ3RoXCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBwb3NpdGlvbi1yZWxhdGl2ZVwiICpuZ0Zvcj1cImxldCBpbWcgb2Ygc291cmNlLmhvdXNlS2VlcGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi0zIGltZy1ib3JkZXIgYm9yZGVyIGJvcmRlci0xIGgtMTAwIHJvdW5kZWQtMyBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVG9wLXJpZ2h0IENoZWNrYm94IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJzb3VyY2Uuc3RhdHVzID09PSdwZW5kaW5nJ1wiIHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiaW1nLnNlbGVjdGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgYWJzb2x1dGUgZm9ybS1jaGVjay1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uSW1hZ2VDaGVja2JveENoYW5nZTEoaW1nLCAnaG91c2VrZWVwaW5nJylcIiAvPlxyXG4gICAgXHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJbWFnZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlVXJsICsgaW1nLmZpbGVQYXRoXCIgYWx0PVwiXCIgY2xhc3M9XCJ3LTEwMCBtYi0yIHJvdW5kZWQgYm9yZGVyXCIgLz5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERldGFpbHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXRpdGxlIG1zLTIgbXQtMlwiPlRlbXAgSUQ6IHt7aW1nLnRlbXBJZH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXZhbHVlIG1zLTJcIj5FbnRyeSBUaW1lOiB7e2ltZy5lbnRyeVRpbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCIhZm9vdGZhbGxMb2FkaW5nICYmICFmb290ZmFsbE5vRGF0YVwiIGNsYXNzPVwibXktM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItcGFnaW5hdGlvbiBbaXRlbXNQZXJQYWdlXT1cInBhZ2VTaXplRm9vdGZhbGxcIiBbY3VycmVudFBhZ2VdPVwiZm9vdGZhbGxjdXJyZW50UGFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsSXRlbXNGb290ZmFsbFwiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cInNldEZvb3RmYWxscGFnZVNpemUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uRm9vdGZhbGxQYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25Gb290ZmFsbFBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjem9vbVBvcHVwIGxldC1tb2RlbD5cclxuICA8ZGl2IGNsYXNzPVwicC00IG0tNFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBib3JkZXItMCBwLTAgdy0xMDAgZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtc3RhcnRcIj5cclxuICAgICAgXHJcbiAgICAgIDwhLS0gSGVhZGluZyAtLT5cclxuICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGUgbWItMlwiPlxyXG4gICAgICAgIHt7IHBvcHVwVHlwZSA9PT0gJ2FwcHJvdmVkJyA/ICdBcHByb3ZlJyA6ICdSZWplY3QnIH19IFNlbGVjdGVkIEltYWdlc1xyXG4gICAgICA8L2g1PlxyXG5cclxuICAgICAgPCEtLSBEZXNjcmlwdGlvbiAtLT5cclxuICAgICAgPHAgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgWW91J3JlIGFib3V0IHRvIHt7IHBvcHVwVHlwZSA9PT0gJ2FwcHJvdmVkJyA/ICdhcHByb3ZlJyA6ICdyZWplY3QnIH19IHRoZSBmb2xsb3dpbmcgbnVtYmVyIG9mIHNlbGVjdGVkIGltYWdlcy5cclxuICAgICAgPC9wPlxyXG5cclxuICAgICAgPCEtLSBDb3VudCBCb3ggLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXIgYm9yZGVyLTEgcm91bmRlZCBwLTMgdy01MCBtYi00XCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInBvcHVwdmFsdWUgPT09ICdlbXBsb3llZSdcIiBjbGFzcz1cImZ3LXNlbWlib2xkIGZzLTUgbWItMlwiPlxyXG4gICAgICAgICAgIHt7IGVtcGxveWVlQUNDb3VudCB8fCAnLS0nIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInBvcHVwdmFsdWUgPT09ICdob3VzZWtlZXBpbmcnXCIgY2xhc3M9XCJmdy1zZW1pYm9sZCBmcy01IG1iLTJcIj5cclxuICAgICAgICAgIHt7IGhvdXNlS2VlcGluZ0FDQ291bnQgfHwgJy0tJyB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJwb3B1cHZhbHVlID09PSAnZHVwbGljYXRlJ1wiIGNsYXNzPVwiZnctc2VtaWJvbGQgZnMtNSBtYi0yXCI+XHJcbiAgICAgICAgICB7eyBkdXBsaWNhdGVBQ0NvdW50IHx8ICctLScgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgdGV4dC1tdXRlZCBmcy02IG10LTJcIj5cclxuICAgICAgICAgIHt7IHBvcHVwdmFsdWUgfCB0aXRsZWNhc2UgfX1zXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBtZS0yXCIgIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAgKGNsaWNrKT1cInN1Ym1pdFZhbHVlKHBvcHVwVHlwZSwgcG9wdXB2YWx1ZSlcIj5cclxuICAgICAgICAgIHt7IHBvcHVwVHlwZSA9PT0gJ2FwcHJvdmVkJyA/ICdBcHByb3ZlJyA6ICdSZWplY3QnIH19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuIl19
|