tango-app-ui-analyse-trax 3.6.0 → 3.6.2-bulktask-2
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/action-centre/action-centre.component.mjs +3 -3
- package/esm2022/lib/components/activity-log-v2/activity-log-v2.component.mjs +3 -2
- package/esm2022/lib/components/activity-log-v2/log-view-popup/store-user-dropdown/store-user-dropdown.component.mjs +3 -3
- package/esm2022/lib/components/activity-log-v2/log-view-popup/view-action/view-action.component.mjs +3 -3
- package/esm2022/lib/components/add-checklist/add-checklist.component.mjs +5 -3
- package/esm2022/lib/components/add-multitask/add-multitask.component.mjs +538 -0
- package/esm2022/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.mjs +269 -0
- package/esm2022/lib/components/add-multitask/create-task.data.mjs +306 -0
- package/esm2022/lib/components/add-multitask/create-task.interface.mjs +2 -0
- package/esm2022/lib/components/add-multitask/unique-string-validator.mjs +10 -0
- package/esm2022/lib/components/add-multitask/whitespace-validator.mjs +10 -0
- package/esm2022/lib/components/add-task/add-task.component.mjs +3 -1
- package/esm2022/lib/components/checklist-configure/checklist-configure.component.mjs +4 -4
- package/esm2022/lib/components/dashboard/dashboard.component.mjs +3 -3
- package/esm2022/lib/components/dashboard-info/dashboard-info.component.mjs +1 -1
- package/esm2022/lib/components/disabled-select/disabled-select.component.mjs +158 -0
- package/esm2022/lib/components/export-gallery/export-gallery.component.mjs +7 -2
- package/esm2022/lib/components/eye-test-audit/eye-test/eye-test.component.mjs +11 -17
- package/esm2022/lib/components/eye-test-audit/group-select/group-select.component.mjs +3 -3
- package/esm2022/lib/components/eye-test-audit/reactive-select/reactive-select.component.mjs +3 -3
- package/esm2022/lib/components/flags/flags.component.mjs +1 -1
- package/esm2022/lib/components/flags-info/flags-info.component.mjs +1 -1
- package/esm2022/lib/components/gallery/gallery.component.mjs +324 -50
- package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +6 -3
- package/esm2022/lib/components/task-configure/task-configure.component.mjs +6 -6
- package/esm2022/lib/components/task-info/task-info.component.mjs +1 -1
- package/esm2022/lib/services/trax.service.mjs +20 -2
- package/esm2022/lib/tango-analyse-trax.module.mjs +12 -5
- package/fesm2022/{tango-app-ui-analyse-trax-eye-test-audit.module-mp5zGDN4.mjs → tango-app-ui-analyse-trax-eye-test-audit.module-B6bePYMW.mjs} +20 -26
- package/fesm2022/tango-app-ui-analyse-trax-eye-test-audit.module-B6bePYMW.mjs.map +1 -0
- package/fesm2022/{tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-DKvlR9IQ.mjs → tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-IHj5-6FY.mjs} +1820 -253
- package/fesm2022/tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-IHj5-6FY.mjs.map +1 -0
- package/fesm2022/tango-app-ui-analyse-trax.mjs +1 -1
- package/lib/components/activity-log-v2/activity-log-v2.component.d.ts +1 -0
- package/lib/components/add-multitask/add-multitask.component.d.ts +95 -0
- package/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.d.ts +42 -0
- package/lib/components/add-multitask/create-task.data.d.ts +244 -0
- package/lib/components/add-multitask/create-task.interface.d.ts +147 -0
- package/lib/components/add-multitask/unique-string-validator.d.ts +2 -0
- package/lib/components/add-multitask/whitespace-validator.d.ts +2 -0
- package/lib/components/disabled-select/disabled-select.component.d.ts +34 -0
- package/lib/components/eye-test-audit/eye-test-audit/start-audit/start-audit.component.d.ts +2 -2
- package/lib/components/flags/flags.component.d.ts +2 -2
- package/lib/components/flags-info/flags-info.component.d.ts +3 -3
- package/lib/components/flags-new/flags-new.component.d.ts +2 -2
- package/lib/components/gallery/gallery.component.d.ts +40 -2
- package/lib/components/manage-task/manage-task.component.d.ts +1 -1
- package/lib/components/orders/orders.component.d.ts +1 -1
- package/lib/components/reactive-select/reactive-select.component.d.ts +2 -2
- package/lib/components/reports/reports.component.d.ts +2 -2
- package/lib/components/task-configure/task-configure.component.d.ts +3 -3
- package/lib/services/trax.service.d.ts +6 -1
- package/lib/tango-analyse-trax.module.d.ts +11 -8
- package/package.json +1 -1
- package/fesm2022/tango-app-ui-analyse-trax-eye-test-audit.module-mp5zGDN4.mjs.map +0 -1
- package/fesm2022/tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-DKvlR9IQ.mjs.map +0 -1
package/esm2022/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.mjs
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import { AddMultitaskComponent } from '../add-multitask.component';
|
|
3
|
+
import * as XLSX from 'xlsx';
|
|
4
|
+
import { Subject, takeUntil } from "rxjs";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@ng-bootstrap/ng-bootstrap";
|
|
7
|
+
import * as i2 from "../../../services/trax.service";
|
|
8
|
+
import * as i3 from "tango-app-ui-shared";
|
|
9
|
+
import * as i4 from "@angular/common";
|
|
10
|
+
export class BulkcreationmodelComponent {
|
|
11
|
+
modalService;
|
|
12
|
+
activeModal;
|
|
13
|
+
traxService;
|
|
14
|
+
toastService;
|
|
15
|
+
cd;
|
|
16
|
+
selectedOption = 'same';
|
|
17
|
+
payload;
|
|
18
|
+
taskDetails;
|
|
19
|
+
checklistInfo;
|
|
20
|
+
type;
|
|
21
|
+
sourceCheckList_id;
|
|
22
|
+
filtertype;
|
|
23
|
+
headerData;
|
|
24
|
+
excelData = [];
|
|
25
|
+
bulkupload;
|
|
26
|
+
fileInput;
|
|
27
|
+
fileInput1;
|
|
28
|
+
afterValidation;
|
|
29
|
+
excelError;
|
|
30
|
+
destroy$ = new Subject();
|
|
31
|
+
constructor(modalService, activeModal, traxService, toastService, cd) {
|
|
32
|
+
this.modalService = modalService;
|
|
33
|
+
this.activeModal = activeModal;
|
|
34
|
+
this.traxService = traxService;
|
|
35
|
+
this.toastService = toastService;
|
|
36
|
+
this.cd = cd;
|
|
37
|
+
this.headerData = JSON.parse(localStorage.getItem('header-filters'));
|
|
38
|
+
}
|
|
39
|
+
setOption(option) {
|
|
40
|
+
this.selectedOption = option;
|
|
41
|
+
}
|
|
42
|
+
proceed() {
|
|
43
|
+
console.log('Selected Option:', this.selectedOption);
|
|
44
|
+
if (this.selectedOption === 'same') {
|
|
45
|
+
this.taskcreationPopup(true);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
this.modalService.open(this.bulkupload, {
|
|
49
|
+
centered: true, backdrop: 'static'
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
taskcreationPopup(showcomment) {
|
|
54
|
+
const modalRef = this.modalService.open(AddMultitaskComponent, {
|
|
55
|
+
centered: true,
|
|
56
|
+
size: 'lg',
|
|
57
|
+
});
|
|
58
|
+
modalRef.componentInstance.type = this.type;
|
|
59
|
+
modalRef.componentInstance.filtertype = this.filtertype;
|
|
60
|
+
modalRef.componentInstance.taskDetails = this.taskDetails;
|
|
61
|
+
modalRef.componentInstance.sourceCheckList_id = this.sourceCheckList_id;
|
|
62
|
+
modalRef.componentInstance.payload = this.payload;
|
|
63
|
+
modalRef.componentInstance.showcomment = showcomment;
|
|
64
|
+
modalRef.componentInstance.excelData = this.excelData;
|
|
65
|
+
modalRef.result.then((result) => {
|
|
66
|
+
console.log(result);
|
|
67
|
+
if (result == 'submit') {
|
|
68
|
+
this.activeModal.close('submit');
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
closeactivepopup() {
|
|
73
|
+
this.activeModal.close('submit');
|
|
74
|
+
}
|
|
75
|
+
validateDetails() {
|
|
76
|
+
console.log(this.headerData?.client);
|
|
77
|
+
let params = {
|
|
78
|
+
assignedData: this.excelData,
|
|
79
|
+
clientId: this.headerData?.client,
|
|
80
|
+
coverage: this.payload.coverage
|
|
81
|
+
};
|
|
82
|
+
this.traxService.taskvalidateUserData(params).pipe(takeUntil(this.destroy$)).subscribe({
|
|
83
|
+
next: (res) => {
|
|
84
|
+
if (res && res?.code == 200) {
|
|
85
|
+
this.taskcreationPopup(false);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
error: (err) => {
|
|
89
|
+
if (err?.error?.error && err?.error?.code == 400) {
|
|
90
|
+
let errorData = err?.error?.error;
|
|
91
|
+
console.log(errorData);
|
|
92
|
+
if (errorData.length) {
|
|
93
|
+
this.modalService.dismissAll();
|
|
94
|
+
const popupcontent = {
|
|
95
|
+
displayprop: false,
|
|
96
|
+
imagesrc: `<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect x="4" y="4" width="48" height="48" rx="24" fill="#FEF0C7"/><path d="M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z" stroke="#DC6803" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="4" width="48" height="48" rx="24" stroke="#FFFAEB" stroke-width="8"/></svg>`,
|
|
97
|
+
title: `Invalid details!`,
|
|
98
|
+
content: `Please provide correct and complete store information.`,
|
|
99
|
+
buttontype: 'error',
|
|
100
|
+
error: errorData
|
|
101
|
+
};
|
|
102
|
+
this.afterUplload(popupcontent);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
Reupload() {
|
|
110
|
+
// this.dialog.dismissAll();
|
|
111
|
+
if (this.fileInput) {
|
|
112
|
+
this.fileInput.nativeElement.value = '';
|
|
113
|
+
}
|
|
114
|
+
if (this.fileInput1) {
|
|
115
|
+
this.fileInput1.nativeElement.value = '';
|
|
116
|
+
}
|
|
117
|
+
let ele = document.getElementById('kt_account_team_size_select_2');
|
|
118
|
+
ele?.click();
|
|
119
|
+
this.cd.detectChanges();
|
|
120
|
+
}
|
|
121
|
+
getStoreCounts(data) {
|
|
122
|
+
if (this.payload.coverage === 'store') {
|
|
123
|
+
const uniqueStoreNames = new Set(data.map((item) => item.storeName));
|
|
124
|
+
return uniqueStoreNames.size;
|
|
125
|
+
}
|
|
126
|
+
else if (this.payload.coverage === 'users') {
|
|
127
|
+
const uniqueUserNames = new Set(data.map((item) => item.userName));
|
|
128
|
+
return uniqueUserNames.size;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
downloadTemplate() {
|
|
132
|
+
console.log(this.payload);
|
|
133
|
+
let excelData = [];
|
|
134
|
+
if (this.payload.selectedStores && this.payload.selectedStores.length > 0) {
|
|
135
|
+
this.payload.selectedStores.forEach((item) => {
|
|
136
|
+
excelData.push({
|
|
137
|
+
checklistName: this.payload.checklistName,
|
|
138
|
+
questionName: this.payload.inputData.qname,
|
|
139
|
+
storeName: item.storeName,
|
|
140
|
+
comments: '',
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
else if (this.payload.selectedUsers && this.payload.selectedUsers.length > 0) {
|
|
145
|
+
this.payload.selectedStores.forEach((item) => {
|
|
146
|
+
excelData.push({
|
|
147
|
+
checklistName: this.payload.checklistName,
|
|
148
|
+
questionName: this.payload.inputData.qname,
|
|
149
|
+
userEmail: item.userEmail,
|
|
150
|
+
comments: '',
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
this.traxService.exportAsExcelFile(excelData, `Bulk ${this.type}`);
|
|
155
|
+
}
|
|
156
|
+
afterUplload(data) {
|
|
157
|
+
this.excelError = data;
|
|
158
|
+
this.modalService.open(this.afterValidation, { centered: true, backdrop: 'static' });
|
|
159
|
+
}
|
|
160
|
+
onFileUpload(event, type) {
|
|
161
|
+
const target = (event.target);
|
|
162
|
+
let data;
|
|
163
|
+
let error = [];
|
|
164
|
+
let ValidationError = false;
|
|
165
|
+
let isExcelFile = !!target.files[0].name.match(/(.xls|.xlsx)/);
|
|
166
|
+
if (isExcelFile) {
|
|
167
|
+
const reader = new FileReader();
|
|
168
|
+
reader.readAsBinaryString(target.files[0]);
|
|
169
|
+
reader.onload = (e) => {
|
|
170
|
+
const bstr = e.target.result;
|
|
171
|
+
const wb = XLSX.read(bstr, { type: 'binary' });
|
|
172
|
+
const wsname = wb.SheetNames[0];
|
|
173
|
+
const ws = wb.Sheets[wsname];
|
|
174
|
+
data = XLSX.utils.sheet_to_json(ws);
|
|
175
|
+
this.excelData = data;
|
|
176
|
+
if (!data.length || (data.some((item) => 'clusterName' in item || 'teamName' in item))) {
|
|
177
|
+
this.toastService.getErrorToast('Please Upload a Valid file.');
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
// data = data.filter((item: any) => {
|
|
181
|
+
// return ((item?.storeName && item?.storeName.trim() != '' && item?.storeName.trim() != null) || (item?.userName && item?.userName.trim() != '' && item?.userName.trim() != null) || (item?.userEmail && item?.userEmail.trim() != '' && item?.userEmail.trim() != null))
|
|
182
|
+
// })
|
|
183
|
+
data.forEach((element, index) => {
|
|
184
|
+
if (element?.userEmail) {
|
|
185
|
+
element.userEmail = element?.userEmail.replace(/\s/g, '');
|
|
186
|
+
}
|
|
187
|
+
console.log(this.payload.coverage);
|
|
188
|
+
if (this.payload.coverage === 'store') {
|
|
189
|
+
console.log(element.storeName);
|
|
190
|
+
if ((element.storeName && element.storeName.trim() == '') || element.storeName == null) {
|
|
191
|
+
error.push(`Invalid StoreName - C${index + 2}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else if (this.payload.coverage === 'users') {
|
|
195
|
+
if ((element.userEmail && element.userEmail.trim() == '') || element.userEmail == null) {
|
|
196
|
+
error.push(`Invalid userEmail - C${index + 2}`);
|
|
197
|
+
}
|
|
198
|
+
if (element?.userEmail && !element.userEmail.match(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/)) {
|
|
199
|
+
error.push(`Invalid userEmail - C${index + 2}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// if ((element.comments && element.comments.trim() == '') || element.comments == null) {
|
|
203
|
+
// error.push(`Invalid comment - D${index + 2}`)
|
|
204
|
+
// }
|
|
205
|
+
});
|
|
206
|
+
console.log(error.length);
|
|
207
|
+
if (error.length) {
|
|
208
|
+
this.modalService.dismissAll();
|
|
209
|
+
const popupcontent = {
|
|
210
|
+
displayprop: false,
|
|
211
|
+
imagesrc: `<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect x="4" y="4" width="48" height="48" rx="24" fill="#FEF0C7"/><path d="M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z" stroke="#DC6803" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="4" width="48" height="48" rx="24" stroke="#FFFAEB" stroke-width="8"/></svg>`,
|
|
212
|
+
title: `Invalid details!`,
|
|
213
|
+
content: `Please provide correct and complete store information.`,
|
|
214
|
+
buttontype: 'error',
|
|
215
|
+
error: error
|
|
216
|
+
};
|
|
217
|
+
this.afterUplload(popupcontent);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
!ValidationError ? this.afterUplload() : '';
|
|
222
|
+
}
|
|
223
|
+
if (this.fileInput) {
|
|
224
|
+
this.fileInput.nativeElement.value = '';
|
|
225
|
+
}
|
|
226
|
+
if (this.fileInput1) {
|
|
227
|
+
this.fileInput1.nativeElement.value = '';
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
if (this.fileInput) {
|
|
233
|
+
this.fileInput.nativeElement.value = '';
|
|
234
|
+
}
|
|
235
|
+
this.toastService.getErrorToast('Please Upload a Excel file.');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BulkcreationmodelComponent, deps: [{ token: i1.NgbModal }, { token: i1.NgbActiveModal }, { token: i2.TraxService }, { token: i3.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
239
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BulkcreationmodelComponent, selector: "lib-bulkcreationmodel", inputs: { payload: "payload", taskDetails: "taskDetails", checklistInfo: "checklistInfo", type: "type", sourceCheckList_id: "sourceCheckList_id", filtertype: "filtertype" }, viewQueries: [{ propertyName: "bulkupload", first: true, predicate: ["bulkupload"], descendants: true }, { propertyName: "fileInput", first: true, predicate: ["file"], descendants: true }, { propertyName: "fileInput1", first: true, predicate: ["file1"], descendants: true }, { propertyName: "afterValidation", first: true, predicate: ["afterValidation"], descendants: true }], ngImport: i0, template: "<div class=\"card group-delete py-0\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 mb-5\">\r\n <div class=\"symbol symbol-75px symbol-circle d-flex \">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8M14 2L20 8M14 2V8H20M12 18V12M9 15H15\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"text-capitalize mx-3\"> {{type}}</h3>\r\n </div>\r\n </div>\r\n <div class=\"form-check mb-3 p-3 border rounded option-box\"\r\n [ngClass]=\"{ 'active-option': selectedOption === 'same' }\" (click)=\"setOption('same')\">\r\n <input class=\"form-check-input my-5 mx-3\" type=\"radio\" name=\"taskOption\" id=\"sameComment\"\r\n [checked]=\"selectedOption === 'same'\">\r\n <div class=\"mx-3\">\r\n <label class=\"form-check-label fw-semibold\" for=\"sameComment\">\r\n Create task with same comment\r\n </label>\r\n <div class=\"text-muted small mt-1 ms-10\">\r\n Apply a single comment to all selected stores. This option is useful when the {{type}} details are identical for\r\n every store.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-check p-3 border rounded option-box\"\r\n [ngClass]=\"{ 'active-option': selectedOption === 'different' }\" (click)=\"setOption('different')\">\r\n <input class=\"form-check-input my-5 mx-3\" type=\"radio\" name=\"taskOption\" id=\"differentComments\"\r\n [checked]=\"selectedOption === 'different'\">\r\n <div class=\"mx-3\">\r\n <label class=\"form-check-label fw-semibold\" for=\"differentComments\">\r\n Create {{type}} with different comments <span class=\"text-muted\">(via Excel upload)</span>\r\n </label>\r\n <div class=\"text-muted small mt-1 ms-10\">\r\n Use an Excel template to assign different comments to each selected store. This allows you to customize the\r\n {{type}} for each location.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"modal-footer border-top-0\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary\" data-bs-dismiss=\"modal\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"proceed()\">Proceed</button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n<ng-template #bulkupload let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-5\">\r\n <div class=\"card-title mt-3\">\r\n <div class=\"bg-light-primary rounded-5 w-40px h-40px d-flex justify-content-center align-items-center\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M30 18H22C21.4696 18 20.9609 18.2107 20.5858 18.5858C20.2107 18.9609 20 19.4696 20 20V36C20 36.5304 20.2107 37.0391 20.5858 37.4142C20.9609 37.7893 21.4696 38 22 38H34C34.5304 38 35.0391 37.7893 35.4142 37.4142C35.7893 37.0391 36 36.5304 36 36V24M30 18L36 24M30 18V24H36M28 34V28M25 31H31\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div> <span class=\"config-heading fw-semibold ms-5 w-auto text-capitalize\">{{type}}</span>\r\n </div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"flex-column\">\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">1. Use the template to upload and create multiple {{type}}s at once.</div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">2. Download the template here - <a class=\"text-decoration-underline cursor-pointer\" (click)=\"downloadTemplate()\">Download the template here</a></div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">3. Add your data to the Template File</div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">4. Upload it below for processing</div>\r\n\r\n \r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"model.close()\">Cancel</button>\r\n <button class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"file1.click()\">Upload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event,'upload')\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Assign <span *ngIf=\"this.payload.coverage==='store'\">Stores</span> <span *ngIf=\"this.payload.coverage==='users'\">Users</span></span></div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total <span *ngIf=\"this.payload.coverage==='store'\">Stores</span> <span *ngIf=\"this.payload.coverage==='users'\">Users</span></div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div [ngClass]=\"excelError ? 'error-heading':''\" class=\"fw-semibold config-heading w-100\">{{excelError?.error?.length || 0}}</div>\r\n <div [ngClass]=\"excelError ? 'excel-error':''\" class=\"fw-semibold subtitle mt-1\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct and complete layout information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup()\">Cancel</button>\r\n <button *ngIf=\"!excelError\" class=\"btn btn-md py-4 btn-default ms-3 btn-primary\" (click)=\"validateDetails()\">Proceed</button>\r\n <button *ngIf=\"excelError\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"Reupload();\">Reupload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event,'reupload')\" />\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".option-box{transition:border-color .3s,background-color .3s;cursor:pointer}.option-box:hover{border-color:#0d6efd}.active-option{border-color:#008edf!important;color:#008edf!important;background-color:#e7f1ff}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
240
|
+
}
|
|
241
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BulkcreationmodelComponent, decorators: [{
|
|
242
|
+
type: Component,
|
|
243
|
+
args: [{ selector: 'lib-bulkcreationmodel', template: "<div class=\"card group-delete py-0\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 mb-5\">\r\n <div class=\"symbol symbol-75px symbol-circle d-flex \">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8M14 2L20 8M14 2V8H20M12 18V12M9 15H15\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"text-capitalize mx-3\"> {{type}}</h3>\r\n </div>\r\n </div>\r\n <div class=\"form-check mb-3 p-3 border rounded option-box\"\r\n [ngClass]=\"{ 'active-option': selectedOption === 'same' }\" (click)=\"setOption('same')\">\r\n <input class=\"form-check-input my-5 mx-3\" type=\"radio\" name=\"taskOption\" id=\"sameComment\"\r\n [checked]=\"selectedOption === 'same'\">\r\n <div class=\"mx-3\">\r\n <label class=\"form-check-label fw-semibold\" for=\"sameComment\">\r\n Create task with same comment\r\n </label>\r\n <div class=\"text-muted small mt-1 ms-10\">\r\n Apply a single comment to all selected stores. This option is useful when the {{type}} details are identical for\r\n every store.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-check p-3 border rounded option-box\"\r\n [ngClass]=\"{ 'active-option': selectedOption === 'different' }\" (click)=\"setOption('different')\">\r\n <input class=\"form-check-input my-5 mx-3\" type=\"radio\" name=\"taskOption\" id=\"differentComments\"\r\n [checked]=\"selectedOption === 'different'\">\r\n <div class=\"mx-3\">\r\n <label class=\"form-check-label fw-semibold\" for=\"differentComments\">\r\n Create {{type}} with different comments <span class=\"text-muted\">(via Excel upload)</span>\r\n </label>\r\n <div class=\"text-muted small mt-1 ms-10\">\r\n Use an Excel template to assign different comments to each selected store. This allows you to customize the\r\n {{type}} for each location.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"modal-footer border-top-0\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary\" data-bs-dismiss=\"modal\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"proceed()\">Proceed</button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n<ng-template #bulkupload let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-5\">\r\n <div class=\"card-title mt-3\">\r\n <div class=\"bg-light-primary rounded-5 w-40px h-40px d-flex justify-content-center align-items-center\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M30 18H22C21.4696 18 20.9609 18.2107 20.5858 18.5858C20.2107 18.9609 20 19.4696 20 20V36C20 36.5304 20.2107 37.0391 20.5858 37.4142C20.9609 37.7893 21.4696 38 22 38H34C34.5304 38 35.0391 37.7893 35.4142 37.4142C35.7893 37.0391 36 36.5304 36 36V24M30 18L36 24M30 18V24H36M28 34V28M25 31H31\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div> <span class=\"config-heading fw-semibold ms-5 w-auto text-capitalize\">{{type}}</span>\r\n </div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"flex-column\">\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">1. Use the template to upload and create multiple {{type}}s at once.</div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">2. Download the template here - <a class=\"text-decoration-underline cursor-pointer\" (click)=\"downloadTemplate()\">Download the template here</a></div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">3. Add your data to the Template File</div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">4. Upload it below for processing</div>\r\n\r\n \r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"model.close()\">Cancel</button>\r\n <button class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"file1.click()\">Upload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event,'upload')\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Assign <span *ngIf=\"this.payload.coverage==='store'\">Stores</span> <span *ngIf=\"this.payload.coverage==='users'\">Users</span></span></div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total <span *ngIf=\"this.payload.coverage==='store'\">Stores</span> <span *ngIf=\"this.payload.coverage==='users'\">Users</span></div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div [ngClass]=\"excelError ? 'error-heading':''\" class=\"fw-semibold config-heading w-100\">{{excelError?.error?.length || 0}}</div>\r\n <div [ngClass]=\"excelError ? 'excel-error':''\" class=\"fw-semibold subtitle mt-1\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct and complete layout information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup()\">Cancel</button>\r\n <button *ngIf=\"!excelError\" class=\"btn btn-md py-4 btn-default ms-3 btn-primary\" (click)=\"validateDetails()\">Proceed</button>\r\n <button *ngIf=\"excelError\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"Reupload();\">Reupload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event,'reupload')\" />\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".option-box{transition:border-color .3s,background-color .3s;cursor:pointer}.option-box:hover{border-color:#0d6efd}.active-option{border-color:#008edf!important;color:#008edf!important;background-color:#e7f1ff}\n"] }]
|
|
244
|
+
}], ctorParameters: () => [{ type: i1.NgbModal }, { type: i1.NgbActiveModal }, { type: i2.TraxService }, { type: i3.ToastService }, { type: i0.ChangeDetectorRef }], propDecorators: { payload: [{
|
|
245
|
+
type: Input
|
|
246
|
+
}], taskDetails: [{
|
|
247
|
+
type: Input
|
|
248
|
+
}], checklistInfo: [{
|
|
249
|
+
type: Input
|
|
250
|
+
}], type: [{
|
|
251
|
+
type: Input
|
|
252
|
+
}], sourceCheckList_id: [{
|
|
253
|
+
type: Input
|
|
254
|
+
}], filtertype: [{
|
|
255
|
+
type: Input
|
|
256
|
+
}], bulkupload: [{
|
|
257
|
+
type: ViewChild,
|
|
258
|
+
args: ['bulkupload']
|
|
259
|
+
}], fileInput: [{
|
|
260
|
+
type: ViewChild,
|
|
261
|
+
args: ['file']
|
|
262
|
+
}], fileInput1: [{
|
|
263
|
+
type: ViewChild,
|
|
264
|
+
args: ['file1']
|
|
265
|
+
}], afterValidation: [{
|
|
266
|
+
type: ViewChild,
|
|
267
|
+
args: ['afterValidation']
|
|
268
|
+
}] } });
|
|
269
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsa2NyZWF0aW9ubW9kZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYW5hbHlzZS10cmF4L3NyYy9saWIvY29tcG9uZW50cy9hZGQtbXVsdGl0YXNrL2J1bGtjcmVhdGlvbm1vZGVsL2J1bGtjcmVhdGlvbm1vZGVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYWRkLW11bHRpdGFzay9idWxrY3JlYXRpb25tb2RlbC9idWxrY3JlYXRpb25tb2RlbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTNGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBR25FLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBbUIsT0FBTyxFQUFzQyxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQU0vRixNQUFNLE9BQU8sMEJBQTBCO0lBZ0JqQjtJQUFnQztJQUFxQztJQUFrQztJQUFvQztJQWYvSixjQUFjLEdBQUcsTUFBTSxDQUFDO0lBQ2YsT0FBTyxDQUFLO0lBQ1osV0FBVyxDQUFLO0lBQ2hCLGFBQWEsQ0FBSztJQUNsQixJQUFJLENBQUs7SUFDVCxrQkFBa0IsQ0FBSztJQUN2QixVQUFVLENBQUs7SUFDeEIsVUFBVSxDQUFjO0lBQ3hCLFNBQVMsR0FBUSxFQUFFLENBQUE7SUFDTSxVQUFVLENBQU07SUFDdEIsU0FBUyxDQUFjO0lBQ3RCLFVBQVUsQ0FBYztJQUNkLGVBQWUsQ0FBTTtJQUNuRCxVQUFVLENBQU07SUFDaEIsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENB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QUVELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLENBQUM7U0FDaEU7SUFDSCxDQUFDO3dHQXRPVSwwQkFBMEI7NEZBQTFCLDBCQUEwQixvbUJDYnZDLGc0UUFtSWM7OzRGRHRIRCwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0UsdUJBQXVCOytMQU14QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFHbUIsVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZO2dCQUNKLFNBQVM7c0JBQTNCLFNBQVM7dUJBQUMsTUFBTTtnQkFDRyxVQUFVO3NCQUE3QixTQUFTO3VCQUFDLE9BQU87Z0JBQ1ksZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5nYk1vZGFsLE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBBZGRNdWx0aXRhc2tDb21wb25lbnQgfSBmcm9tICcuLi9hZGQtbXVsdGl0YXNrLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRyYXhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJheC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCAqIGFzIFhMU1ggZnJvbSAneGxzeCc7XHJcbmltcG9ydCB7IEhlYWRlckZpbHRlciwgIH0gZnJvbSAnLi4vLi4vdGFzay1jb25maWd1cmUvdGFzay1jb25maWd1cmUuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqc1wiO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1idWxrY3JlYXRpb25tb2RlbCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2J1bGtjcmVhdGlvbm1vZGVsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYnVsa2NyZWF0aW9ubW9kZWwuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCdWxrY3JlYXRpb25tb2RlbENvbXBvbmVudCB7XHJcbiAgc2VsZWN0ZWRPcHRpb24gPSAnc2FtZSc7XHJcbiAgQElucHV0KCkgcGF5bG9hZDogYW55XHJcbiAgQElucHV0KCkgdGFza0RldGFpbHM6IGFueVxyXG4gIEBJbnB1dCgpIGNoZWNrbGlzdEluZm86IGFueVxyXG4gIEBJbnB1dCgpIHR5cGU6IGFueVxyXG4gIEBJbnB1dCgpIHNvdXJjZUNoZWNrTGlzdF9pZDogYW55XHJcbiAgQElucHV0KCkgZmlsdGVydHlwZTogYW55XHJcbiAgaGVhZGVyRGF0YTogSGVhZGVyRmlsdGVyXHJcbiAgZXhjZWxEYXRhOiBhbnkgPSBbXVxyXG4gIEBWaWV3Q2hpbGQoJ2J1bGt1cGxvYWQnKSBidWxrdXBsb2FkOiBhbnk7XHJcbiAgQFZpZXdDaGlsZCgnZmlsZScpIGZpbGVJbnB1dCE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnZmlsZTEnKSBmaWxlSW5wdXQxITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdhZnRlclZhbGlkYXRpb24nKSBhZnRlclZhbGlkYXRpb246IGFueTtcclxuICBleGNlbEVycm9yOiBhbnk7XHJcbiAgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCwgcHJpdmF0ZSBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsIHByaXZhdGUgdHJheFNlcnZpY2U6IFRyYXhTZXJ2aWNlLCBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLCBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gICAgdGhpcy5oZWFkZXJEYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSBhcyBzdHJpbmcpXHJcbiAgfVxyXG4gIHNldE9wdGlvbihvcHRpb246IHN0cmluZykge1xyXG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IG9wdGlvbjtcclxuICB9XHJcblxyXG4gIHByb2NlZWQoKSB7XHJcbiAgICBjb25zb2xlLmxvZygnU2VsZWN0ZWQgT3B0aW9uOicsIHRoaXMuc2VsZWN0ZWRPcHRpb24pO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRPcHRpb24gPT09ICdzYW1lJykge1xyXG4gICAgICB0aGlzLnRhc2tjcmVhdGlvblBvcHVwKHRydWUpXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmJ1bGt1cGxvYWQsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSwgYmFja2Ryb3A6ICdzdGF0aWMnXHJcbiAgICAgIH0pXHJcblxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICB0YXNrY3JlYXRpb25Qb3B1cChzaG93Y29tbWVudDogYm9vbGVhbikge1xyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEFkZE11bHRpdGFza0NvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogJ2xnJyxcclxuXHJcbiAgICB9KTtcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnR5cGUgPSB0aGlzLnR5cGVcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmZpbHRlcnR5cGUgPSB0aGlzLmZpbHRlcnR5cGVcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRhc2tEZXRhaWxzID0gdGhpcy50YXNrRGV0YWlsc1xyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2Uuc291cmNlQ2hlY2tMaXN0X2lkID0gdGhpcy5zb3VyY2VDaGVja0xpc3RfaWRcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnBheWxvYWQgPSB0aGlzLnBheWxvYWRcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnNob3djb21tZW50ID0gc2hvd2NvbW1lbnRcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmV4Y2VsRGF0YSA9IHRoaXMuZXhjZWxEYXRhXHJcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlc3VsdClcclxuICAgICAgaWYgKHJlc3VsdCA9PSAnc3VibWl0Jykge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICBjbG9zZWFjdGl2ZXBvcHVwKCkge1xyXG4gICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuICB9XHJcbiAgdmFsaWRhdGVEZXRhaWxzKCkge1xyXG4gICAgY29uc29sZS5sb2codGhpcy5oZWFkZXJEYXRhPy5jbGllbnQpXHJcbiAgICBsZXQgcGFyYW1zID0ge1xyXG4gICAgICBhc3NpZ25lZERhdGE6IHRoaXMuZXhjZWxEYXRhLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgIGNvdmVyYWdlOiB0aGlzLnBheWxvYWQuY292ZXJhZ2VcclxuICAgIH1cclxuICAgIHRoaXMudHJheFNlcnZpY2UudGFza3ZhbGlkYXRlVXNlckRhdGEocGFyYW1zKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXM/LmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRhc2tjcmVhdGlvblBvcHVwKGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChlcnI/LmVycm9yPy5lcnJvciAmJiBlcnI/LmVycm9yPy5jb2RlID09IDQwMCkge1xyXG4gICAgICAgICAgbGV0IGVycm9yRGF0YSA9IGVycj8uZXJyb3I/LmVycm9yO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3JEYXRhKVxyXG4gICAgICAgICAgaWYgKGVycm9yRGF0YS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG4gICAgICAgICAgICBjb25zdCBwb3B1cGNvbnRlbnQgPSB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheXByb3A6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGltYWdlc3JjOiBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCI+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0ZFRjBDN1wiLz48cGF0aCBkPVwiTTI3Ljk5OTggMjQuMDAxMlYyOC4wMDEyTTI3Ljk5OTggMzIuMDAxMkgyOC4wMDk4TTI2LjI4OTggMTguODYxMkwxNy44MTk4IDMzLjAwMTJDMTcuNjQ1MSAzMy4zMDM2IDE3LjU1MjcgMzMuNjQ2NSAxNy41NTE4IDMzLjk5NTdDMTcuNTUwOCAzNC4zNDQ5IDE3LjY0MTMgMzQuNjg4MyAxNy44MTQyIDM0Ljk5MTdDMTcuOTg3MSAzNS4yOTUxIDE4LjIzNjUgMzUuNTQ3OSAxOC41Mzc1IDM1LjcyNUMxOC44Mzg1IDM1LjkwMjEgMTkuMTgwNiAzNS45OTczIDE5LjUyOTggMzYuMDAxMkgzNi40Njk4QzM2LjgxOSAzNS45OTczIDM3LjE2MTEgMzUuOTAyMSAzNy40NjIxIDM1LjcyNUMzNy43NjMxIDM1LjU0NzkgMzguMDEyNCAzNS4yOTUxIDM4LjE4NTQgMzQuOTkxN0MzOC4zNTgzIDM0LjY4ODMgMzguNDQ4OCAzNC4zNDQ5IDM4LjQ0NzggMzMuOTk1N0MzOC40NDY4IDMzLjY0NjUgMzguMzU0NCAzMy4zMDM2IDM4LjE3OTggMzMuMDAxMkwyOS43MDk4IDE4Ljg2MTJDMjkuNTMxNSAxOC41NjczIDI5LjI4MDUgMTguMzI0MyAyOC45ODEgMTguMTU1N0MyOC42ODE0IDE3Ljk4NyAyOC4zNDM1IDE3Ljg5ODQgMjcuOTk5OCAxNy44OTg0QzI3LjY1NiAxNy44OTg0IDI3LjMxODEgMTcuOTg3IDI3LjAxODYgMTguMTU1N0MyNi43MTkxIDE4LjMyNDMgMjYuNDY4IDE4LjU2NzMgMjYuMjg5OCAxOC44NjEyWlwiIHN0cm9rZT1cIiNEQzY4MDNcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0ZGRkFFQlwiIHN0cm9rZS13aWR0aD1cIjhcIi8+PC9zdmc+YCxcclxuICAgICAgICAgICAgICB0aXRsZTogYEludmFsaWQgZGV0YWlscyFgLFxyXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IGBQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGFuZCBjb21wbGV0ZSBzdG9yZSBpbmZvcm1hdGlvbi5gLFxyXG4gICAgICAgICAgICAgIGJ1dHRvbnR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yRGF0YVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKHBvcHVwY29udGVudClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcblxyXG5cclxuXHJcblxyXG4gIH1cclxuICBSZXVwbG9hZCgpIHtcclxuICAgIC8vIHRoaXMuZGlhbG9nLmRpc21pc3NBbGwoKTtcclxuICAgIGlmICh0aGlzLmZpbGVJbnB1dCkge1xyXG4gICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5maWxlSW5wdXQxKSB7XHJcbiAgICAgIHRoaXMuZmlsZUlucHV0MS5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICB9XHJcbiAgICBsZXQgZWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2t0X2FjY291bnRfdGVhbV9zaXplX3NlbGVjdF8yJyk7XHJcbiAgICBlbGU/LmNsaWNrKCk7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgZ2V0U3RvcmVDb3VudHMoZGF0YTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5wYXlsb2FkLmNvdmVyYWdlID09PSAnc3RvcmUnKSB7XHJcbiAgICAgIGNvbnN0IHVuaXF1ZVN0b3JlTmFtZXMgPSBuZXcgU2V0KGRhdGEubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0uc3RvcmVOYW1lKSk7XHJcbiAgICAgIHJldHVybiB1bmlxdWVTdG9yZU5hbWVzLnNpemU7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMucGF5bG9hZC5jb3ZlcmFnZSA9PT0gJ3VzZXJzJykge1xyXG4gICAgICBjb25zdCB1bmlxdWVVc2VyTmFtZXMgPSBuZXcgU2V0KGRhdGEubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0udXNlck5hbWUpKTtcclxuICAgICAgcmV0dXJuIHVuaXF1ZVVzZXJOYW1lcy5zaXplO1xyXG4gICAgfVxyXG4gIH1cclxuICBkb3dubG9hZFRlbXBsYXRlKCkge1xyXG4gICAgY29uc29sZS5sb2codGhpcy5wYXlsb2FkKVxyXG4gICAgbGV0IGV4Y2VsRGF0YTogYW55ID0gW107XHJcbiAgICBpZiAodGhpcy5wYXlsb2FkLnNlbGVjdGVkU3RvcmVzICYmIHRoaXMucGF5bG9hZC5zZWxlY3RlZFN0b3Jlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMucGF5bG9hZC5zZWxlY3RlZFN0b3Jlcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBleGNlbERhdGEucHVzaCh7XHJcbiAgICAgICAgICBjaGVja2xpc3ROYW1lOiB0aGlzLnBheWxvYWQuY2hlY2tsaXN0TmFtZSxcclxuICAgICAgICAgIHF1ZXN0aW9uTmFtZTogdGhpcy5wYXlsb2FkLmlucHV0RGF0YS5xbmFtZSxcclxuICAgICAgICAgIHN0b3JlTmFtZTogaXRlbS5zdG9yZU5hbWUsXHJcbiAgICAgICAgICBjb21tZW50czogJycsXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSBpZiAodGhpcy5wYXlsb2FkLnNlbGVjdGVkVXNlcnMgJiYgdGhpcy5wYXlsb2FkLnNlbGVjdGVkVXNlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnBheWxvYWQuc2VsZWN0ZWRTdG9yZXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgZXhjZWxEYXRhLnB1c2goe1xyXG4gICAgICAgICAgY2hlY2tsaXN0TmFtZTogdGhpcy5wYXlsb2FkLmNoZWNrbGlzdE5hbWUsXHJcbiAgICAgICAgICBxdWVzdGlvbk5hbWU6IHRoaXMucGF5bG9hZC5pbnB1dERhdGEucW5hbWUsXHJcbiAgICAgICAgICB1c2VyRW1haWw6IGl0ZW0udXNlckVtYWlsLFxyXG4gICAgICAgICAgY29tbWVudHM6ICcnLFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcblxyXG4gICAgfVxyXG4gICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRBc0V4Y2VsRmlsZShleGNlbERhdGEsIGBCdWxrICR7dGhpcy50eXBlfWApO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBhZnRlclVwbGxvYWQoZGF0YT86IGFueSkge1xyXG4gICAgdGhpcy5leGNlbEVycm9yID0gZGF0YTtcclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5hZnRlclZhbGlkYXRpb24sIHsgY2VudGVyZWQ6IHRydWUsIGJhY2tkcm9wOiAnc3RhdGljJyB9KVxyXG4gIH1cclxuICBvbkZpbGVVcGxvYWQoZXZlbnQ6IGFueSwgdHlwZTogYW55KSB7XHJcbiAgICBjb25zdCB0YXJnZXQ6IERhdGFUcmFuc2ZlciA9IDxEYXRhVHJhbnNmZXI+KGV2ZW50LnRhcmdldCk7XHJcbiAgICBsZXQgZGF0YTogYW55O1xyXG4gICAgbGV0IGVycm9yOiBhbnkgPSBbXTtcclxuICAgIGxldCBWYWxpZGF0aW9uRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBpc0V4Y2VsRmlsZSA9ICEhdGFyZ2V0LmZpbGVzWzBdLm5hbWUubWF0Y2goLygueGxzfC54bHN4KS8pO1xyXG4gICAgaWYgKGlzRXhjZWxGaWxlKSB7XHJcbiAgICAgIGNvbnN0IHJlYWRlcjogRmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcodGFyZ2V0LmZpbGVzWzBdKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBic3RyOiBzdHJpbmcgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgY29uc3Qgd2I6IFhMU1guV29ya0Jvb2sgPSBYTFNYLnJlYWQoYnN0ciwgeyB0eXBlOiAnYmluYXJ5JyB9KTtcclxuICAgICAgICBjb25zdCB3c25hbWU6IHN0cmluZyA9IHdiLlNoZWV0TmFtZXNbMF07XHJcbiAgICAgICAgY29uc3Qgd3M6IFhMU1guV29ya1NoZWV0ID0gd2IuU2hlZXRzW3dzbmFtZV07XHJcbiAgICAgICAgZGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbih3cyk7XHJcbiAgICAgICAgdGhpcy5leGNlbERhdGEgPSBkYXRhO1xyXG4gICAgICAgIGlmICghZGF0YS5sZW5ndGggfHwgKGRhdGEuc29tZSgoaXRlbTogYW55KSA9PiAnY2x1c3Rlck5hbWUnIGluIGl0ZW0gfHwgJ3RlYW1OYW1lJyBpbiBpdGVtKSkpIHtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ1BsZWFzZSBVcGxvYWQgYSBWYWxpZCBmaWxlLicpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRhdGEgPSBkYXRhLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gICByZXR1cm4gKChpdGVtPy5zdG9yZU5hbWUgJiYgaXRlbT8uc3RvcmVOYW1lLnRyaW0oKSAhPSAnJyAmJiBpdGVtPy5zdG9yZU5hbWUudHJpbSgpICE9IG51bGwpIHx8IChpdGVtPy51c2VyTmFtZSAmJiBpdGVtPy51c2VyTmFtZS50cmltKCkgIT0gJycgJiYgaXRlbT8udXNlck5hbWUudHJpbSgpICE9IG51bGwpIHx8IChpdGVtPy51c2VyRW1haWwgJiYgaXRlbT8udXNlckVtYWlsLnRyaW0oKSAhPSAnJyAmJiBpdGVtPy51c2VyRW1haWwudHJpbSgpICE9IG51bGwpKVxyXG4gICAgICAgIC8vIH0pXHJcbiAgICAgICAgZGF0YS5mb3JFYWNoKChlbGVtZW50OiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChlbGVtZW50Py51c2VyRW1haWwpIHtcclxuICAgICAgICAgICAgZWxlbWVudC51c2VyRW1haWwgPSBlbGVtZW50Py51c2VyRW1haWwucmVwbGFjZSgvXFxzL2csICcnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMucGF5bG9hZC5jb3ZlcmFnZSlcclxuICAgICAgICAgIGlmICh0aGlzLnBheWxvYWQuY292ZXJhZ2UgPT09ICdzdG9yZScpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZWxlbWVudC5zdG9yZU5hbWUpXHJcbiAgICAgICAgICAgIGlmICgoZWxlbWVudC5zdG9yZU5hbWUgJiYgZWxlbWVudC5zdG9yZU5hbWUudHJpbSgpID09ICcnKSB8fCBlbGVtZW50LnN0b3JlTmFtZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgZXJyb3IucHVzaChgSW52YWxpZCBTdG9yZU5hbWUgLSBDJHtpbmRleCArIDJ9YClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBheWxvYWQuY292ZXJhZ2UgPT09ICd1c2VycycpIHtcclxuICAgICAgICAgICAgaWYgKChlbGVtZW50LnVzZXJFbWFpbCAmJiBlbGVtZW50LnVzZXJFbWFpbC50cmltKCkgPT0gJycpIHx8IGVsZW1lbnQudXNlckVtYWlsID09IG51bGwpIHtcclxuICAgICAgICAgICAgICBlcnJvci5wdXNoKGBJbnZhbGlkIHVzZXJFbWFpbCAtIEMke2luZGV4ICsgMn1gKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50Py51c2VyRW1haWwgJiYgIWVsZW1lbnQudXNlckVtYWlsLm1hdGNoKC9eW2EtekEtWjAtOS5fLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Miw2fSQvKSkge1xyXG4gICAgICAgICAgICAgIGVycm9yLnB1c2goYEludmFsaWQgdXNlckVtYWlsIC0gQyR7aW5kZXggKyAyfWApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGlmICgoZWxlbWVudC5jb21tZW50cyAmJiBlbGVtZW50LmNvbW1lbnRzLnRyaW0oKSA9PSAnJykgfHwgZWxlbWVudC5jb21tZW50cyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAvLyAgIGVycm9yLnB1c2goYEludmFsaWQgY29tbWVudCAtIEQke2luZGV4ICsgMn1gKVxyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgIGlmIChlcnJvci5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICAgICAgICAgIGNvbnN0IHBvcHVwY29udGVudCA9IHtcclxuICAgICAgICAgICAgZGlzcGxheXByb3A6IGZhbHNlLFxyXG4gICAgICAgICAgICBpbWFnZXNyYzogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI1NlwiIHZpZXdCb3g9XCIwIDAgNTYgNTZcIiBmaWxsPVwibm9uZVwiPjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNGRUYwQzdcIi8+PHBhdGggZD1cIk0yNy45OTk4IDI0LjAwMTJWMjguMDAxMk0yNy45OTk4IDMyLjAwMTJIMjguMDA5OE0yNi4yODk4IDE4Ljg2MTJMMTcuODE5OCAzMy4wMDEyQzE3LjY0NTEgMzMuMzAzNiAxNy41NTI3IDMzLjY0NjUgMTcuNTUxOCAzMy45OTU3QzE3LjU1MDggMzQuMzQ0OSAxNy42NDEzIDM0LjY4ODMgMTcuODE0MiAzNC45OTE3QzE3Ljk4NzEgMzUuMjk1MSAxOC4yMzY1IDM1LjU0NzkgMTguNTM3NSAzNS43MjVDMTguODM4NSAzNS45MDIxIDE5LjE4MDYgMzUuOTk3MyAxOS41Mjk4IDM2LjAwMTJIMzYuNDY5OEMzNi44MTkgMzUuOTk3MyAzNy4xNjExIDM1LjkwMjEgMzcuNDYyMSAzNS43MjVDMzcuNzYzMSAzNS41NDc5IDM4LjAxMjQgMzUuMjk1MSAzOC4xODU0IDM0Ljk5MTdDMzguMzU4MyAzNC42ODgzIDM4LjQ0ODggMzQuMzQ0OSAzOC40NDc4IDMzLjk5NTdDMzguNDQ2OCAzMy42NDY1IDM4LjM1NDQgMzMuMzAzNiAzOC4xNzk4IDMzLjAwMTJMMjkuNzA5OCAxOC44NjEyQzI5LjUzMTUgMTguNTY3MyAyOS4yODA1IDE4LjMyNDMgMjguOTgxIDE4LjE1NTdDMjguNjgxNCAxNy45ODcgMjguMzQzNSAxNy44OTg0IDI3Ljk5OTggMTcuODk4NEMyNy42NTYgMTcuODk4NCAyNy4zMTgxIDE3Ljk4NyAyNy4wMTg2IDE4LjE1NTdDMjYuNzE5MSAxOC4zMjQzIDI2LjQ2OCAxOC41NjczIDI2LjI4OTggMTguODYxMlpcIiBzdHJva2U9XCIjREM2ODAzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNGRkZBRUJcIiBzdHJva2Utd2lkdGg9XCI4XCIvPjwvc3ZnPmAsXHJcbiAgICAgICAgICAgIHRpdGxlOiBgSW52YWxpZCBkZXRhaWxzIWAsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGBQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGFuZCBjb21wbGV0ZSBzdG9yZSBpbmZvcm1hdGlvbi5gLFxyXG4gICAgICAgICAgICBidXR0b250eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgICBlcnJvcjogZXJyb3JcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKHBvcHVwY29udGVudClcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAhVmFsaWRhdGlvbkVycm9yID8gdGhpcy5hZnRlclVwbGxvYWQoKSA6ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5maWxlSW5wdXQpIHtcclxuICAgICAgICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsZUlucHV0MSkge1xyXG4gICAgICAgICAgdGhpcy5maWxlSW5wdXQxLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5maWxlSW5wdXQpIHtcclxuICAgICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ1BsZWFzZSBVcGxvYWQgYSBFeGNlbCBmaWxlLicpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2FyZCBncm91cC1kZWxldGUgcHktMFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHktMCBkLWZsZXggZmxleC1zdGFydCBmbGV4LWNvbHVtbiBwLTkgXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibXktNSBtYi01XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzeW1ib2wgc3ltYm9sLTc1cHggc3ltYm9sLWNpcmNsZSBkLWZsZXggXCI+XHJcbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICBkPVwiTTE0IDJINkM1LjQ2OTU3IDIgNC45NjA4NiAyLjIxMDcxIDQuNTg1NzkgMi41ODU3OUM0LjIxMDcxIDIuOTYwODYgNCAzLjQ2OTU3IDQgNFYyMEM0IDIwLjUzMDQgNC4yMTA3MSAyMS4wMzkxIDQuNTg1NzkgMjEuNDE0MkM0Ljk2MDg2IDIxLjc4OTMgNS40Njk1NyAyMiA2IDIySDE4QzE4LjUzMDQgMjIgMTkuMDM5MSAyMS43ODkzIDE5LjQxNDIgMjEuNDE0MkMxOS43ODkzIDIxLjAzOTEgMjAgMjAuNTMwNCAyMCAyMFY4TTE0IDJMMjAgOE0xNCAyVjhIMjBNMTIgMThWMTJNOSAxNUgxNVwiXHJcbiAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LWNhcGl0YWxpemUgbXgtM1wiPiB7e3R5cGV9fTwvaDM+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0zIHAtMyBib3JkZXIgcm91bmRlZCBvcHRpb24tYm94XCJcclxuICAgICAgW25nQ2xhc3NdPVwieyAnYWN0aXZlLW9wdGlvbic6IHNlbGVjdGVkT3B0aW9uID09PSAnc2FtZScgfVwiIChjbGljayk9XCJzZXRPcHRpb24oJ3NhbWUnKVwiPlxyXG4gICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG15LTUgbXgtM1wiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ0YXNrT3B0aW9uXCIgaWQ9XCJzYW1lQ29tbWVudFwiXHJcbiAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRPcHRpb24gPT09ICdzYW1lJ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibXgtM1wiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgZnctc2VtaWJvbGRcIiBmb3I9XCJzYW1lQ29tbWVudFwiPlxyXG4gICAgICAgICAgQ3JlYXRlIHRhc2sgd2l0aCBzYW1lIGNvbW1lbnRcclxuICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTEgbXMtMTBcIj5cclxuICAgICAgICAgIEFwcGx5IGEgc2luZ2xlIGNvbW1lbnQgdG8gYWxsIHNlbGVjdGVkIHN0b3Jlcy4gVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4gdGhlIHt7dHlwZX19IGRldGFpbHMgYXJlIGlkZW50aWNhbCBmb3JcclxuICAgICAgICAgIGV2ZXJ5IHN0b3JlLlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIHAtMyBib3JkZXIgcm91bmRlZCBvcHRpb24tYm94XCJcclxuICAgICAgW25nQ2xhc3NdPVwieyAnYWN0aXZlLW9wdGlvbic6IHNlbGVjdGVkT3B0aW9uID09PSAnZGlmZmVyZW50JyB9XCIgKGNsaWNrKT1cInNldE9wdGlvbignZGlmZmVyZW50JylcIj5cclxuICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCAgbXktNSBteC0zXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cInRhc2tPcHRpb25cIiBpZD1cImRpZmZlcmVudENvbW1lbnRzXCJcclxuICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZE9wdGlvbiA9PT0gJ2RpZmZlcmVudCdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm14LTNcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIGZ3LXNlbWlib2xkXCIgZm9yPVwiZGlmZmVyZW50Q29tbWVudHNcIj5cclxuICAgICAgICAgIENyZWF0ZSB7e3R5cGV9fSB3aXRoIGRpZmZlcmVudCBjb21tZW50cyA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj4odmlhIEV4Y2VsIHVwbG9hZCk8L3NwYW4+XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtdC0xIG1zLTEwXCI+XHJcbiAgICAgICAgICBVc2UgYW4gRXhjZWwgdGVtcGxhdGUgdG8gYXNzaWduIGRpZmZlcmVudCBjb21tZW50cyB0byBlYWNoIHNlbGVjdGVkIHN0b3JlLiBUaGlzIGFsbG93cyB5b3UgdG8gY3VzdG9taXplIHRoZVxyXG4gICAgICAgICAge3t0eXBlfX0gZm9yIGVhY2ggbG9jYXRpb24uXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXIgYm9yZGVyLXRvcC0wXCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInByb2NlZWQoKVwiPlByb2NlZWQ8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjYnVsa3VwbG9hZCBsZXQtbW9kZWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMCBtdC01XCI+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZSBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmctbGlnaHQtcHJpbWFyeSByb3VuZGVkLTUgdy00MHB4IGgtNDBweCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNEQUYxRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMzAgMThIMjJDMjEuNDY5NiAxOCAyMC45NjA5IDE4LjIxMDcgMjAuNTg1OCAxOC41ODU4QzIwLjIxMDcgMTguOTYwOSAyMCAxOS40Njk2IDIwIDIwVjM2QzIwIDM2LjUzMDQgMjAuMjEwNyAzNy4wMzkxIDIwLjU4NTggMzcuNDE0MkMyMC45NjA5IDM3Ljc4OTMgMjEuNDY5NiAzOCAyMiAzOEgzNEMzNC41MzA0IDM4IDM1LjAzOTEgMzcuNzg5MyAzNS40MTQyIDM3LjQxNDJDMzUuNzg5MyAzNy4wMzkxIDM2IDM2LjUzMDQgMzYgMzZWMjRNMzAgMThMMzYgMjRNMzAgMThWMjRIMzZNMjggMzRWMjhNMjUgMzFIMzFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PiA8c3BhbiBjbGFzcz1cImNvbmZpZy1oZWFkaW5nIGZ3LXNlbWlib2xkIG1zLTUgdy1hdXRvIHRleHQtY2FwaXRhbGl6ZVwiPnt7dHlwZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwdC0wXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlQXNzaWduIG10LTNcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA0MDBcIj4xLiBVc2UgdGhlIHRlbXBsYXRlIHRvIHVwbG9hZCBhbmQgY3JlYXRlIG11bHRpcGxlIHt7dHlwZX19cyBhdCBvbmNlLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlQXNzaWduIG10LTNcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA0MDBcIj4yLiBEb3dubG9hZCB0aGUgdGVtcGxhdGUgaGVyZSAtICA8YSBjbGFzcz1cInRleHQtZGVjb3JhdGlvbi11bmRlcmxpbmUgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZG93bmxvYWRUZW1wbGF0ZSgpXCI+RG93bmxvYWQgdGhlIHRlbXBsYXRlIGhlcmU8L2E+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmVBc3NpZ24gbXQtM1wiIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDQwMFwiPjMuIEFkZCB5b3VyIGRhdGEgdG8gdGhlIFRlbXBsYXRlIEZpbGU8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZUFzc2lnbiBtdC0zXCIgc3R5bGU9XCJmb250LXdlaWdodDogNDAwXCI+NC4gVXBsb2FkIGl0IGJlbG93IGZvciBwcm9jZXNzaW5nPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgYm9yZGVyLTAgdGV4dC1lbmQgcHQtMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1tZCBidG4tZGVmYXVsdCBidG4tb3V0bGluZVwiIChjbGljayk9XCJtb2RlbC5jbG9zZSgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW1kIHB5LTMgYnRuLWRlZmF1bHQgbXMtMyBidG4tcHJpbWFyeVwiIChjbGljayk9XCJmaWxlMS5jbGljaygpXCI+VXBsb2FkPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlbjtcIiAjZmlsZTEgdHlwZT1cImZpbGVcIiBpZD1cImt0X2FjY291bnRfdGVhbV9zaXplX3NlbGVjdF8yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZVVwbG9hZCgkZXZlbnQsJ3VwbG9hZCcpXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNhZnRlclZhbGlkYXRpb24gbGV0LW1vZGVsPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTAgbXQtMFwiPlxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdGl0bGUgbXQtM1wiPjxzcGFuIGNsYXNzPVwiY29uZmlnLWhlYWRpbmcgZnctc2VtaWJvbGQgdy1hdXRvXCI+QXNzaWduIDxzcGFuICpuZ0lmPVwidGhpcy5wYXlsb2FkLmNvdmVyYWdlPT09J3N0b3JlJ1wiPlN0b3Jlczwvc3Bhbj4gPHNwYW4gKm5nSWY9XCJ0aGlzLnBheWxvYWQuY292ZXJhZ2U9PT0ndXNlcnMnXCI+VXNlcnM8L3NwYW4+PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHQtMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIj5cclxuICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1jYXJkIHJvdW5kZWQtMyBwLTMgZmxleC1jb2x1bW4gaC04MHB4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmcgdy0xMDBcIj57e2dldFN0b3JlQ291bnRzKGV4Y2VsRGF0YSl9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkIHN1YnRpdGxlIG10LTFcIj5Ub3RhbCA8c3BhbiAqbmdJZj1cInRoaXMucGF5bG9hZC5jb3ZlcmFnZT09PSdzdG9yZSdcIj5TdG9yZXM8L3NwYW4+IDxzcGFuICpuZ0lmPVwidGhpcy5wYXlsb2FkLmNvdmVyYWdlPT09J3VzZXJzJ1wiPlVzZXJzPC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1jYXJkIHJvdW5kZWQtMyBwLTMgZmxleC1jb2x1bW4gaC04MHB4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1zZW1pYm9sZCBjb25maWctaGVhZGluZyB3LTEwMFwiPnt7ZXhjZWxEYXRhPy5sZW5ndGh9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgc3VidGl0bGUgbXQtMVwiPlJvd3MgcHJvY2Vzc2VkPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtY2FyZCByb3VuZGVkLTMgcC0zIGZsZXgtY29sdW1uIGgtODBweFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImV4Y2VsRXJyb3IgPyAnZXJyb3ItaGVhZGluZyc6JydcIiBjbGFzcz1cImZ3LXNlbWlib2xkIGNvbmZpZy1oZWFkaW5nIHctMTAwXCI+e3tleGNlbEVycm9yPy5lcnJvcj8ubGVuZ3RoIHx8IDB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImV4Y2VsRXJyb3IgPyAnZXhjZWwtZXJyb3InOicnXCIgY2xhc3M9XCJmdy1zZW1pYm9sZCBzdWJ0aXRsZSBtdC0xXCI+RXJyb3I8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZXhjZWxFcnJvclwiIGNsYXNzPVwiZmxleC1jb2x1bW4gbXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1oZWFkaW5nIGZ3LWJvbGRcIj5JbnZhbGlkIERldGFpbHMgITwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlIG10LTVcIj5QbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGFuZCBjb21wbGV0ZSBsYXlvdXQgaW5mb3JtYXRpb24uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC01IHctMTAwIHJvdW5kZWQtMyBib3JkZXItZXJyb3IgbXQtNSBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGVycm9yIG9mIGV4Y2VsRXJyb3I/LmVycm9yOyBsZXQgaSA9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3RcIiBbbmdDbGFzc109XCIhbGFzdCA/ICdtYi0yJyA6ICcnXCIgY2xhc3M9XCJ0ZXh0LWVycm9yXCI+e3tpICsgMX19KSB7e2Vycm9yfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIGJvcmRlci0wIHRleHQtZW5kIHB0LTBcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbWQgYnRuLWRlZmF1bHQgYnRuLW91dGxpbmVcIiAoY2xpY2spPVwiY2xvc2VhY3RpdmVwb3B1cCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZXhjZWxFcnJvclwiIGNsYXNzPVwiYnRuIGJ0bi1tZCBweS00IGJ0bi1kZWZhdWx0IG1zLTMgYnRuLXByaW1hcnlcIiAoY2xpY2spPVwidmFsaWRhdGVEZXRhaWxzKClcIj5Qcm9jZWVkPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJleGNlbEVycm9yXCIgY2xhc3M9XCJidG4gcHktMyBidG4tbWQgYnRuLWRlZmF1bHQgbXMtMyBidG4tZGFuZ2VyXCIgKGNsaWNrKT1cIlJldXBsb2FkKCk7XCI+UmV1cGxvYWQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuO1wiICNmaWxlMSB0eXBlPVwiZmlsZVwiIGlkPVwia3RfYWNjb3VudF90ZWFtX3NpemVfc2VsZWN0XzJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25GaWxlVXBsb2FkKCRldmVudCwncmV1cGxvYWQnKVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
|