client-core-services 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2020/client-core-services.mjs +5 -0
- package/esm2020/lib/my-lib.module.mjs +98 -0
- package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
- package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
- package/esm2020/lib/services/api/api.service.mjs +611 -0
- package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
- package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
- package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
- package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
- package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
- package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
- package/esm2020/lib/services/chart/chart.service.mjs +166 -0
- package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
- package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
- package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
- package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
- package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
- package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
- package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
- package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
- package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
- package/esm2020/lib/services/download/download.service.mjs +151 -0
- package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
- package/esm2020/lib/services/env/env.service.mjs +232 -0
- package/esm2020/lib/services/env/serverHostList.mjs +56 -0
- package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
- package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
- package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
- package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
- package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
- package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
- package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
- package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
- package/esm2020/lib/services/loader/loader.service.mjs +17 -0
- package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
- package/esm2020/lib/services/model/model.service.mjs +30 -0
- package/esm2020/lib/services/notify/notification.service.mjs +84 -0
- package/esm2020/lib/services/operator/operator.service.mjs +58 -0
- package/esm2020/lib/services/permission/permission.service.mjs +88 -0
- package/esm2020/lib/services/router/router.service.mjs +78 -0
- package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
- package/esm2020/lib/services/storage/storage.service.mjs +749 -0
- package/esm2020/lib/services/tree-component/interface.mjs +6 -0
- package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
- package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
- package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
- package/esm2020/lib/shared/configuration/config.mjs +76 -0
- package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
- package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
- package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
- package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
- package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
- package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
- package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
- package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
- package/esm2020/lib/shared/platform.mjs +2 -0
- package/esm2020/public-api.mjs +53 -0
- package/fesm2015/client-core-services.mjs +15487 -0
- package/fesm2015/client-core-services.mjs.map +1 -0
- package/fesm2020/client-core-services.mjs +15482 -0
- package/fesm2020/client-core-services.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/my-lib.module.d.ts +18 -0
- package/lib/services/api/api-call/api-call.service.d.ts +60 -0
- package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
- package/lib/services/api/api.service.d.ts +88 -0
- package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
- package/lib/services/api/auth/auth.service.d.ts +50 -0
- package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
- package/lib/services/api/common-api/common-api.service.d.ts +22 -0
- package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
- package/lib/services/api/public-api/public-api.service.d.ts +14 -0
- package/lib/services/chart/chart.service.d.ts +21 -0
- package/lib/services/check-if/check-if.service.d.ts +50 -0
- package/lib/services/common-utils/common-function.service.d.ts +84 -0
- package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
- package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
- package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
- package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
- package/lib/services/data-share/data-share.service.d.ts +174 -0
- package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
- package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
- package/lib/services/download/download.service.d.ts +35 -0
- package/lib/services/encryption/encryption.service.d.ts +8 -0
- package/lib/services/env/env.service.d.ts +44 -0
- package/lib/services/env/serverHostList.d.ts +9 -0
- package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
- package/lib/services/form/form-control/form-control.service.d.ts +44 -0
- package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
- package/lib/services/form/form-value/form-value.service.d.ts +32 -0
- package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
- package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
- package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
- package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
- package/lib/services/loader/loader.service.d.ts +8 -0
- package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
- package/lib/services/model/model.service.d.ts +11 -0
- package/lib/services/notify/notification.service.d.ts +22 -0
- package/lib/services/operator/operator.service.d.ts +27 -0
- package/lib/services/permission/permission.service.d.ts +18 -0
- package/lib/services/router/router.service.d.ts +14 -0
- package/lib/services/storage/cookies.service.d.ts +11 -0
- package/lib/services/storage/storage.service.d.ts +132 -0
- package/lib/services/tree-component/interface.d.ts +13 -0
- package/lib/services/tree-component/tree-component.service.d.ts +38 -0
- package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
- package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
- package/lib/shared/configuration/config.d.ts +144 -0
- package/lib/shared/configuration/editor-config.d.ts +72 -0
- package/lib/shared/enums/common.enum.d.ts +16 -0
- package/lib/shared/enums/config.enum.d.ts +54 -0
- package/lib/shared/enums/end-point.enum.d.ts +66 -0
- package/lib/shared/enums/flags.enum.d.ts +18 -0
- package/lib/shared/enums/keycodes.enum.d.ts +120 -0
- package/lib/shared/enums/operator_type.enum.d.ts +9 -0
- package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
- package/lib/shared/platform.d.ts +1 -0
- package/package.json +40 -0
- package/public-api.d.ts +49 -0
|
@@ -0,0 +1,1277 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../../services/storage/storage.service";
|
|
4
|
+
import * as i2 from "../model/model.service";
|
|
5
|
+
import * as i3 from "@angular/common";
|
|
6
|
+
import * as i4 from "../api/api.service";
|
|
7
|
+
import * as i5 from "../common-utils/core-function/core-function.service";
|
|
8
|
+
import * as i6 from "../env/env.service";
|
|
9
|
+
import * as i7 from "../notify/notification.service";
|
|
10
|
+
export class CommonFunctionService {
|
|
11
|
+
constructor(storageService, modalService, datePipe, apiService, coreFunctionService, envService, notificationService) {
|
|
12
|
+
this.storageService = storageService;
|
|
13
|
+
this.modalService = modalService;
|
|
14
|
+
this.datePipe = datePipe;
|
|
15
|
+
this.apiService = apiService;
|
|
16
|
+
this.coreFunctionService = coreFunctionService;
|
|
17
|
+
this.envService = envService;
|
|
18
|
+
this.notificationService = notificationService;
|
|
19
|
+
this.userInfo = this.storageService.GetUserInfo();
|
|
20
|
+
}
|
|
21
|
+
getRefcode() {
|
|
22
|
+
this.userInfo = this.storageService.GetUserInfo();
|
|
23
|
+
if (this.userInfo != null && this.userInfo != undefined && this.userInfo.refCode) {
|
|
24
|
+
return this.userInfo.refCode;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
getAppId() {
|
|
31
|
+
this.userInfo = this.storageService.GetUserInfo();
|
|
32
|
+
if (this.userInfo != null && this.userInfo != undefined && this.userInfo.appId) {
|
|
33
|
+
return this.userInfo.appId;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
getObjectValue(field, object) {
|
|
40
|
+
let result = object;
|
|
41
|
+
if (field && field != null && field != '' && field != " ") {
|
|
42
|
+
let list = field.split(".");
|
|
43
|
+
for (let index = 0; index < list.length; index++) {
|
|
44
|
+
result = result[list[index]];
|
|
45
|
+
if (result === null || result === undefined) {
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
return "";
|
|
52
|
+
}
|
|
53
|
+
getddnDisplayVal(val) {
|
|
54
|
+
if (val && val.name) {
|
|
55
|
+
return val.name;
|
|
56
|
+
}
|
|
57
|
+
else if (val && val.label) {
|
|
58
|
+
return val.label;
|
|
59
|
+
}
|
|
60
|
+
else if (val && val.field_name) {
|
|
61
|
+
return val.field_name;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
return val;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
openTreeModal(fieldLabel, ddnField, modalName) {
|
|
68
|
+
const alertData = {
|
|
69
|
+
"event": true,
|
|
70
|
+
"fieldName": fieldLabel,
|
|
71
|
+
"ddnFieldName": ddnField
|
|
72
|
+
};
|
|
73
|
+
this.modalService.open(modalName, alertData);
|
|
74
|
+
}
|
|
75
|
+
dateFormat(value) {
|
|
76
|
+
return this.datePipe.transform(value, 'dd/MM/yyyy');
|
|
77
|
+
}
|
|
78
|
+
getDivClass(field, fieldsLangth) {
|
|
79
|
+
const fields = { ...field };
|
|
80
|
+
if (!fields.type) {
|
|
81
|
+
fields.type = "text";
|
|
82
|
+
}
|
|
83
|
+
if (fields.field_class && field.field_class != '') {
|
|
84
|
+
return fields.field_class;
|
|
85
|
+
}
|
|
86
|
+
switch (fields.type) {
|
|
87
|
+
case "list_of_checkbox":
|
|
88
|
+
case "list_of_fields":
|
|
89
|
+
case "html":
|
|
90
|
+
case "label":
|
|
91
|
+
case "grid_selection":
|
|
92
|
+
case "tabular_data_selector":
|
|
93
|
+
case "group_of_fields":
|
|
94
|
+
return "col-lg-12";
|
|
95
|
+
default:
|
|
96
|
+
if (fieldsLangth <= 5) {
|
|
97
|
+
return "col-lg-12";
|
|
98
|
+
}
|
|
99
|
+
else if (fieldsLangth <= 10) {
|
|
100
|
+
return "col-lg-6";
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
return "col-lg-3";
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
getFixedDivClass(field, fieldsLangth) {
|
|
108
|
+
const fields = { ...field };
|
|
109
|
+
if (!fields.type) {
|
|
110
|
+
fields.type = "text";
|
|
111
|
+
}
|
|
112
|
+
if (fields.field_class && field.field_class != '') {
|
|
113
|
+
return fields.field_class;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
getButtonDivClass(field) {
|
|
117
|
+
const fields = { ...field };
|
|
118
|
+
if (fields.field_class && field.field_class != '') {
|
|
119
|
+
return fields.field_class;
|
|
120
|
+
}
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
getConvertedString(ja, incomingTemplate) {
|
|
124
|
+
let template = "" + incomingTemplate;
|
|
125
|
+
let reg = new RegExp("(\\[)(.*?)(\\])");
|
|
126
|
+
let matcher = template.match(reg);
|
|
127
|
+
let group = reg.exec(template);
|
|
128
|
+
console.log(matcher.groups);
|
|
129
|
+
let listMatches = [];
|
|
130
|
+
// while(matcher.find){
|
|
131
|
+
listMatches.push(matcher[2]);
|
|
132
|
+
// }
|
|
133
|
+
listMatches.forEach(element => {
|
|
134
|
+
let valueObj = null;
|
|
135
|
+
let details = matcher[2];
|
|
136
|
+
let valueString = this.getStringValue(details, ja);
|
|
137
|
+
template = template.replace("[" + matcher[2] + "]", valueString);
|
|
138
|
+
});
|
|
139
|
+
return template;
|
|
140
|
+
}
|
|
141
|
+
getStringValue(details, ja) {
|
|
142
|
+
//ja -> object
|
|
143
|
+
//deatils -> pattern
|
|
144
|
+
let valueConfig = details.split(",");
|
|
145
|
+
return this.getObjectValue(valueConfig[0], ja);
|
|
146
|
+
}
|
|
147
|
+
sanitizeObject(tableFields, formValue, validatField, formValueWithCust) {
|
|
148
|
+
for (let index = 0; index < tableFields.length; index++) {
|
|
149
|
+
const element = tableFields[index];
|
|
150
|
+
if (element && element.field_name) {
|
|
151
|
+
if (element.type != 'list_of_fields' && element.type != 'group_of_fields') {
|
|
152
|
+
if (element && element.datatype) {
|
|
153
|
+
switch (element.datatype.toLowerCase()) {
|
|
154
|
+
case "list_of_object":
|
|
155
|
+
case "list_of_object_with_popup":
|
|
156
|
+
case "chips":
|
|
157
|
+
case "chips_with_mask":
|
|
158
|
+
if (validatField) {
|
|
159
|
+
if (formValue[element.field_name] != "" && formValue[element.field_name] != null && !this.isArray(formValue[element.field_name])) {
|
|
160
|
+
return { 'msg': 'Entered value for ' + element.label + ' is not valid. !!!' };
|
|
161
|
+
}
|
|
162
|
+
else if (this.applicableForValidation(element) && !this.isArray(formValueWithCust[element.field_name]) && formValueWithCust[element.field_name].length <= 0) {
|
|
163
|
+
return { 'msg': 'Please Enter ' + element.label + '. !!!' };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else if (formValue[element.field_name] == "" || !this.isArray(formValue[element.field_name])) {
|
|
167
|
+
formValue[element.field_name] = null;
|
|
168
|
+
}
|
|
169
|
+
break;
|
|
170
|
+
case "object":
|
|
171
|
+
if (validatField) {
|
|
172
|
+
if (formValue[element.field_name] != "" && formValue[element.field_name] != null && typeof formValue[element.field_name] != 'object') {
|
|
173
|
+
return { 'msg': 'Entered value for ' + element.label + ' is not valid. !!!' };
|
|
174
|
+
}
|
|
175
|
+
else if (this.applicableForValidation(element) && typeof formValue[element.field_name] != 'object') {
|
|
176
|
+
return { 'msg': 'Please Enter ' + element.label + '. !!!' };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else if (formValue[element.field_name] == "" || (typeof formValue[element.field_name] != 'object' && element.type != 'date')) {
|
|
180
|
+
formValue[element.field_name] = null;
|
|
181
|
+
}
|
|
182
|
+
break;
|
|
183
|
+
default:
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (element && element.type) {
|
|
189
|
+
switch (element.type.toLowerCase()) {
|
|
190
|
+
case "list_of_string":
|
|
191
|
+
if (validatField) {
|
|
192
|
+
if (formValue[element.field_name] != "" && formValue[element.field_name] != null) {
|
|
193
|
+
return { 'msg': 'Entered value for ' + element.label + ' is not valid. !!!' };
|
|
194
|
+
}
|
|
195
|
+
else if (this.applicableForValidation(element) && !this.isArray(formValueWithCust[element.field_name]) && formValueWithCust[element.field_name].length > 0) {
|
|
196
|
+
return { 'msg': 'Please Enter ' + element.label + '. !!!' };
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
else if (formValue[element.field_name] == "" || !this.isArray(formValue[element.field_name])) {
|
|
200
|
+
formValue[element.field_name] = null;
|
|
201
|
+
}
|
|
202
|
+
break;
|
|
203
|
+
case "number":
|
|
204
|
+
if (validatField) {
|
|
205
|
+
if (this.applicableForValidation(element) && formValue[element.field_name] < 0) {
|
|
206
|
+
return { 'msg': ' ' + element.label + ' should be greater than or equal 0. !!!' };
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else if (!Number(formValue[element.field_name])) {
|
|
210
|
+
formValue[element.field_name] = 0;
|
|
211
|
+
}
|
|
212
|
+
break;
|
|
213
|
+
case "text":
|
|
214
|
+
case "textarea":
|
|
215
|
+
case "mobile":
|
|
216
|
+
case "email":
|
|
217
|
+
if (!validatField) {
|
|
218
|
+
if (formValue[element.field_name] == "" || formValue[element.field_name] == undefined) {
|
|
219
|
+
formValue[element.field_name] = null;
|
|
220
|
+
}
|
|
221
|
+
else if (typeof formValue[element.field_name] == "string") {
|
|
222
|
+
let value = this.coreFunctionService.removeSpaceFromString(formValue[element.field_name]);
|
|
223
|
+
if (value == "") {
|
|
224
|
+
formValue[element.field_name] = null;
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
formValue[element.field_name] = value;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
break;
|
|
232
|
+
case "list_of_fields":
|
|
233
|
+
if (validatField) {
|
|
234
|
+
if (this.applicableForValidation(element)) {
|
|
235
|
+
if (element.datatype != 'key_value') {
|
|
236
|
+
if (formValueWithCust[element.field_name] == null || !this.isArray(formValueWithCust[element.field_name]) || formValueWithCust[element.field_name].length <= 0) {
|
|
237
|
+
return { 'msg': element.label + ' is required.' };
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else if (element.datatype == 'key_value') {
|
|
241
|
+
if (typeof formValueWithCust[element.field_name] != 'object' || Object.keys(formValueWithCust[element.field_name]).length <= 0) {
|
|
242
|
+
return { 'msg': element.label + ' is required.' };
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
if (!this.isArray(formValue[element.field_name]) || formValue[element.field_name].length <= 0) {
|
|
249
|
+
if (formValue[element.field_name] != null) {
|
|
250
|
+
if (element.datatype == 'key_value' && typeof formValue[element.field_name] == 'object') {
|
|
251
|
+
const object = formValue[element.field_name];
|
|
252
|
+
const len = Object.keys(object).length;
|
|
253
|
+
if (len == 0) {
|
|
254
|
+
formValue[element.field_name] = null;
|
|
255
|
+
}
|
|
256
|
+
else if (object.key != undefined) {
|
|
257
|
+
if (object.key == '') {
|
|
258
|
+
formValue[element.field_name] = null;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (element.datatype != 'key_value') {
|
|
263
|
+
formValue[element.field_name] = null;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
if (element.list_of_fields && element.list_of_fields) {
|
|
269
|
+
for (let j = 0; j < element.list_of_fields.length; j++) {
|
|
270
|
+
const data = element.list_of_fields[j];
|
|
271
|
+
if (data && data.datatype) {
|
|
272
|
+
switch (data.datatype.toLowerCase()) {
|
|
273
|
+
case "list_of_object":
|
|
274
|
+
case "chips":
|
|
275
|
+
case "chips_with_mask":
|
|
276
|
+
if (formValue[element.field_name] && formValue[element.field_name].length > 0) {
|
|
277
|
+
formValue[element.field_name].forEach((fiedlList) => {
|
|
278
|
+
if (fiedlList[data.field_name] == "" || !this.isArray(fiedlList[data.field_name])) {
|
|
279
|
+
fiedlList[data.field_name] = null;
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
break;
|
|
284
|
+
case "object":
|
|
285
|
+
if (formValue[element.field_name] && formValue[element.field_name].length > 0) {
|
|
286
|
+
formValue[element.field_name].forEach((fiedlList) => {
|
|
287
|
+
if (fiedlList[data.field_name] == "" || typeof fiedlList[data.field_name] != 'object') {
|
|
288
|
+
fiedlList[data.field_name] = null;
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
break;
|
|
293
|
+
default:
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (data && data.type) {
|
|
298
|
+
switch (data.type.toLowerCase()) {
|
|
299
|
+
case "list_of_string":
|
|
300
|
+
if (formValue[element.field_name] && formValue[element.field_name].length > 0) {
|
|
301
|
+
formValue[element.field_name].forEach((fiedlList) => {
|
|
302
|
+
if (fiedlList[data.field_name] == "" || !this.isArray(fiedlList[data.field_name])) {
|
|
303
|
+
fiedlList[data.field_name] = null;
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
break;
|
|
308
|
+
case "text":
|
|
309
|
+
case "textarea":
|
|
310
|
+
case "mobile":
|
|
311
|
+
case "email":
|
|
312
|
+
if (formValue[element.field_name] && formValue[element.field_name].length > 0) {
|
|
313
|
+
formValue[element.field_name].forEach((fiedlList) => {
|
|
314
|
+
let value = fiedlList[data.field_name];
|
|
315
|
+
if (value == "") {
|
|
316
|
+
fiedlList[data.field_name] = null;
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
value = this.coreFunctionService.removeSpaceFromString(fiedlList[data.field_name]);
|
|
320
|
+
fiedlList[data.field_name] = value;
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
break;
|
|
325
|
+
default:
|
|
326
|
+
if (formValue[element.field_name] && formValue[element.field_name].length > 0) {
|
|
327
|
+
formValue[element.field_name].forEach((fiedlList) => {
|
|
328
|
+
if (fiedlList[data.field_name] == "" || fiedlList[data.field_name] == undefined) {
|
|
329
|
+
fiedlList[data.field_name] = null;
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
break;
|
|
341
|
+
case "group_of_fields":
|
|
342
|
+
for (let j = 0; j < element.list_of_fields.length; j++) {
|
|
343
|
+
const data = element.list_of_fields[j];
|
|
344
|
+
if (data && data.datatype) {
|
|
345
|
+
switch (data.datatype.toLowerCase()) {
|
|
346
|
+
case "list_of_object":
|
|
347
|
+
case "chips":
|
|
348
|
+
case "chips_with_mask":
|
|
349
|
+
if (validatField) {
|
|
350
|
+
if (formValue[element.field_name][data.field_name] != "" && formValue[element.field_name][data.field_name] != null) {
|
|
351
|
+
return { 'msg': 'Entered value for ' + data.label + ' is not valid. !!!' };
|
|
352
|
+
}
|
|
353
|
+
else if (this.applicableForValidation(data) && !this.isArray(formValueWithCust[data.field_name]) && formValueWithCust[data.field_name].length > 0) {
|
|
354
|
+
return { 'msg': 'Please Enter ' + data.label + '. !!!' };
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
else if (formValue[element.field_name][data.field_name] == "" || !this.isArray(formValue[element.field_name][data.field_name])) {
|
|
358
|
+
formValue[element.field_name][data.field_name] = null;
|
|
359
|
+
}
|
|
360
|
+
break;
|
|
361
|
+
case "object":
|
|
362
|
+
if (validatField) {
|
|
363
|
+
if (formValue[element.field_name][data.field_name] != "" && formValue[element.field_name][data.field_name] != null) {
|
|
364
|
+
return { 'msg': 'Entered value for ' + data.label + ' is not valid. !!!' };
|
|
365
|
+
}
|
|
366
|
+
else if (this.applicableForValidation(data) && typeof formValue[element.field_name][data.field_name] != 'object') {
|
|
367
|
+
return { 'msg': 'Please Enter ' + data.label + '. !!!' };
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
else if (formValue[element.field_name][data.field_name] == "" || typeof formValue[element.field_name][data.field_name] != 'object') {
|
|
371
|
+
formValue[element.field_name][data.field_name] = null;
|
|
372
|
+
}
|
|
373
|
+
break;
|
|
374
|
+
default:
|
|
375
|
+
break;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
if (data && data.type) {
|
|
379
|
+
switch (data.type.toLowerCase()) {
|
|
380
|
+
case "list_of_string":
|
|
381
|
+
if (validatField) {
|
|
382
|
+
if (formValue[element.field_name][data.field_name] != "" && formValue[element.field_name][data.field_name] != null) {
|
|
383
|
+
return { 'msg': 'Entered value for ' + data.label + ' is not valid. !!!' };
|
|
384
|
+
}
|
|
385
|
+
else if (this.applicableForValidation(data) && !this.isArray(formValueWithCust[data.field_name]) && formValueWithCust[data.field_name].length > 0) {
|
|
386
|
+
return { 'msg': 'Please Enter ' + data.label + '. !!!' };
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
else if (formValue[element.field_name][data.field_name] == "" || !this.isArray(formValue[element.field_name][data.field_name])) {
|
|
390
|
+
formValue[element.field_name][data.field_name] = null;
|
|
391
|
+
}
|
|
392
|
+
break;
|
|
393
|
+
case "file":
|
|
394
|
+
if (!validatField) {
|
|
395
|
+
if (formValue[element.field_name][data.field_name] == "" || formValue[element.field_name][data.field_name] == undefined) {
|
|
396
|
+
formValue[element.field_name][data.field_name] = null;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
break;
|
|
400
|
+
case "number":
|
|
401
|
+
if (!Number(formValue[element.field_name][data.field_name])) {
|
|
402
|
+
formValue[element.field_name][data.field_name] = 0;
|
|
403
|
+
}
|
|
404
|
+
break;
|
|
405
|
+
case "text":
|
|
406
|
+
case "textarea":
|
|
407
|
+
case "mobile":
|
|
408
|
+
case "email":
|
|
409
|
+
if (!validatField) {
|
|
410
|
+
if (formValue[element.field_name][data.field_name] == "" || formValue[element.field_name][data.field_name] == undefined) {
|
|
411
|
+
formValue[element.field_name][data.field_name] = null;
|
|
412
|
+
}
|
|
413
|
+
else if (typeof formValue[element.field_name][data.field_name] == "string") {
|
|
414
|
+
let value = formValue[element.field_name][data.field_name];
|
|
415
|
+
if (value == "") {
|
|
416
|
+
formValue[element.field_name][data.field_name] = null;
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
value = this.coreFunctionService.removeSpaceFromString(formValue[element.field_name][data.field_name]);
|
|
420
|
+
formValue[element.field_name][data.field_name] = value;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
break;
|
|
425
|
+
default:
|
|
426
|
+
if (formValue[element.field_name][data.field_name] == "" || formValue[element.field_name][data.field_name] == undefined) {
|
|
427
|
+
formValue[element.field_name][data.field_name] = null;
|
|
428
|
+
}
|
|
429
|
+
break;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
break;
|
|
434
|
+
case "stepper":
|
|
435
|
+
for (let j = 0; j < element.list_of_fields.length; j++) {
|
|
436
|
+
const step = element.list_of_fields[j];
|
|
437
|
+
if (step.list_of_fields && step.list_of_fields != null && step.list_of_fields.length > 0) {
|
|
438
|
+
for (let k = 0; k < step.list_of_fields.length; k++) {
|
|
439
|
+
const data = step.list_of_fields[k];
|
|
440
|
+
switch (data.datatype) {
|
|
441
|
+
case "list_of_object":
|
|
442
|
+
case "chips":
|
|
443
|
+
case "chips_with_mask":
|
|
444
|
+
if (validatField) {
|
|
445
|
+
if (formValue[data.field_name] != "" && formValue[data.field_name] != null) {
|
|
446
|
+
return { 'msg': 'Entered value for ' + data.label + ' is not valid. !!!' };
|
|
447
|
+
}
|
|
448
|
+
else if (this.applicableForValidation(data) && !this.isArray(formValueWithCust[data.field_name]) && formValueWithCust[data.field_name].length > 0) {
|
|
449
|
+
return { 'msg': 'Please Enter ' + data.label + '. !!!' };
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
else if (formValue[data.field_name] == "" && !this.isArray(formValue[data.field_name])) {
|
|
453
|
+
formValue[data.field_name] = null;
|
|
454
|
+
}
|
|
455
|
+
break;
|
|
456
|
+
case "object":
|
|
457
|
+
if (validatField) {
|
|
458
|
+
if (formValue[data.field_name] != "" && formValue[data.field_name] != null) {
|
|
459
|
+
return { 'msg': 'Entered value for ' + data.label + ' is not valid. !!!' };
|
|
460
|
+
}
|
|
461
|
+
else if (this.applicableForValidation(data) && typeof formValue[data.field_name] != 'object') {
|
|
462
|
+
return { 'msg': 'Please Enter ' + data.label + '. !!!' };
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
else if (formValue[data.field_name] == "" && typeof formValue[data.field_name] != 'object') {
|
|
466
|
+
formValue[data.field_name] = null;
|
|
467
|
+
}
|
|
468
|
+
break;
|
|
469
|
+
case "number":
|
|
470
|
+
if (!Number(formValue[data.field_name])) {
|
|
471
|
+
formValue[data.field_name] = 0;
|
|
472
|
+
}
|
|
473
|
+
break;
|
|
474
|
+
default:
|
|
475
|
+
break;
|
|
476
|
+
}
|
|
477
|
+
switch (data.type) {
|
|
478
|
+
case "list_of_string":
|
|
479
|
+
if (validatField) {
|
|
480
|
+
if (formValue[data.field_name] != "" && formValue[data.field_name] != null) {
|
|
481
|
+
return { 'msg': 'Entered value for ' + data.label + ' is not valid. !!!' };
|
|
482
|
+
}
|
|
483
|
+
else if (this.applicableForValidation(data) && !this.isArray(formValueWithCust[data.field_name]) && formValueWithCust[data.field_name].length > 0) {
|
|
484
|
+
return { 'msg': 'Please Enter ' + data.label + '. !!!' };
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
else if (formValue[data.field_name] == "" && !this.isArray(formValue[data.field_name])) {
|
|
488
|
+
formValue[data.field_name] = null;
|
|
489
|
+
}
|
|
490
|
+
break;
|
|
491
|
+
default:
|
|
492
|
+
break;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
break;
|
|
498
|
+
case "list_of_checkbox":
|
|
499
|
+
if (validatField && element.is_mandatory) {
|
|
500
|
+
if (formValueWithCust[element.field_name] && this.isArray(formValueWithCust[element.field_name]) && formValueWithCust[element.field_name].length == 0) {
|
|
501
|
+
return { 'msg': element.label + ' is mandatory. !!!' };
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
break;
|
|
505
|
+
default:
|
|
506
|
+
if (validatField) {
|
|
507
|
+
}
|
|
508
|
+
else if (formValue[element.field_name] == "" || formValue[element.field_name] == undefined) {
|
|
509
|
+
formValue[element.field_name] = null;
|
|
510
|
+
}
|
|
511
|
+
break;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
if (validatField) {
|
|
517
|
+
return true;
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
return this.coreFunctionService.checkBlankProperties(formValue);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
applicableForValidation(field) {
|
|
524
|
+
if (field.is_mandatory) {
|
|
525
|
+
if (field.show_if != '' && field.show_if != null) {
|
|
526
|
+
if (field['display'] || field['show']) {
|
|
527
|
+
return true;
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
return false;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
else {
|
|
534
|
+
return true;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
else {
|
|
538
|
+
return false;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
getDateInStringFunction(templateValue) {
|
|
542
|
+
let result = {};
|
|
543
|
+
let monthNumber;
|
|
544
|
+
let monthName;
|
|
545
|
+
let year;
|
|
546
|
+
const fromDate = templateValue['fromDate'];
|
|
547
|
+
if (fromDate && fromDate != "") {
|
|
548
|
+
const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
|
549
|
+
monthNumber = new Date(fromDate).getMonth();
|
|
550
|
+
monthName = months[monthNumber];
|
|
551
|
+
year = new Date(fromDate).getFullYear();
|
|
552
|
+
let label = monthName + '-' + year;
|
|
553
|
+
result['labelName'] = label;
|
|
554
|
+
}
|
|
555
|
+
return result;
|
|
556
|
+
}
|
|
557
|
+
populatefields(value, populate_fields, field, multipleFormCollection) {
|
|
558
|
+
let obj = {};
|
|
559
|
+
let check = false;
|
|
560
|
+
if (field && field.field_name) {
|
|
561
|
+
let fieldName = "";
|
|
562
|
+
if (field.parent && field.parent != '') {
|
|
563
|
+
fieldName = field.parent + '.' + field.field_name;
|
|
564
|
+
}
|
|
565
|
+
else {
|
|
566
|
+
fieldName = field.field_name;
|
|
567
|
+
}
|
|
568
|
+
if (field.type == "checkbox" && this.getObjectValue(fieldName, value)) {
|
|
569
|
+
check = true;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
if (populate_fields && populate_fields.length > 0) {
|
|
573
|
+
populate_fields.forEach((el) => {
|
|
574
|
+
value = this.getFormDataInMultiformCollection(multipleFormCollection, value);
|
|
575
|
+
let toList = el.to.split(".");
|
|
576
|
+
if (toList && toList.length > 1) {
|
|
577
|
+
const parent = toList[0];
|
|
578
|
+
if (!obj[parent])
|
|
579
|
+
obj[parent] = {};
|
|
580
|
+
const child = toList[1];
|
|
581
|
+
if (check) {
|
|
582
|
+
obj[parent][child] = this.mergeMultiFieldsValues(el.from, value);
|
|
583
|
+
}
|
|
584
|
+
else {
|
|
585
|
+
obj[parent][child] = "";
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
const field = toList[0];
|
|
590
|
+
if (check) {
|
|
591
|
+
obj[field] = this.mergeMultiFieldsValues(el.from, value);
|
|
592
|
+
}
|
|
593
|
+
else {
|
|
594
|
+
obj[field] = "";
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
return obj;
|
|
600
|
+
}
|
|
601
|
+
mergeMultiFieldsValues(field, object) {
|
|
602
|
+
let result = "";
|
|
603
|
+
if (field && field != null && field != '' && field != " ") {
|
|
604
|
+
let list = field.split("+");
|
|
605
|
+
for (let index = 0; index < list.length; index++) {
|
|
606
|
+
if (result != "") {
|
|
607
|
+
let lastIndex = list.length - 1;
|
|
608
|
+
result = result + list[lastIndex] + this.getObjectValue(list[index], object);
|
|
609
|
+
}
|
|
610
|
+
else {
|
|
611
|
+
result = this.getObjectValue(list[index], object);
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
return result;
|
|
616
|
+
}
|
|
617
|
+
populate_fields_for_report(templateForm) {
|
|
618
|
+
// templateForm.controls['reporting_fax'].setValue(templateForm.value['fax']);
|
|
619
|
+
templateForm.controls['reporting_mobile'].setValue(templateForm.value['mobile']);
|
|
620
|
+
templateForm.controls['reporting_tel'].setValue(templateForm.value['phone']);
|
|
621
|
+
templateForm.controls['reporting_city'].setValue(templateForm.value['city']);
|
|
622
|
+
templateForm.controls['reporting_state'].setValue(templateForm.value['state']);
|
|
623
|
+
templateForm.controls['reporting_country'].setValue(templateForm.value['country']);
|
|
624
|
+
// templateForm.controls['reporting_address_line2'].setValue(templateForm.value['address_line2']);
|
|
625
|
+
templateForm.controls['reporting_gst'].setValue(templateForm.value['gst_no']);
|
|
626
|
+
templateForm.controls['reporting_contact_person_email'].setValue(templateForm.value['email']);
|
|
627
|
+
templateForm.controls['reporting_address'].setValue(templateForm.value['address_line1']);
|
|
628
|
+
templateForm.controls['reporting_pincode'].setValue(templateForm.value['pincode']);
|
|
629
|
+
templateForm.controls['reporting_contact_person'].setValue(templateForm.value['first_name'] + " " + templateForm.value['last_name']);
|
|
630
|
+
templateForm.controls['reporting_company'].setValue(templateForm.value.account.name);
|
|
631
|
+
}
|
|
632
|
+
// getNetAmountWithPercent(total:number, percent:number) {
|
|
633
|
+
// let percentAmount = 0;
|
|
634
|
+
// let netAmount = 0;
|
|
635
|
+
// percentAmount = total * percent / 100;
|
|
636
|
+
// netAmount = total - percentAmount;
|
|
637
|
+
// return { p_amount: percentAmount, net_amount: netAmount }
|
|
638
|
+
// }
|
|
639
|
+
// claimAmountCalculation(field1:any, field2:any, field3:any) {
|
|
640
|
+
// let total = 0;
|
|
641
|
+
// if (field1 && field1 != "") {
|
|
642
|
+
// total = total + field1
|
|
643
|
+
// }
|
|
644
|
+
// if (field2 && field2 != "") {
|
|
645
|
+
// total = total + field2;
|
|
646
|
+
// }
|
|
647
|
+
// if (field3 && field3 != "") {
|
|
648
|
+
// total = total + field3;
|
|
649
|
+
// }
|
|
650
|
+
// return total;
|
|
651
|
+
// }
|
|
652
|
+
// array_move(arr:any, old_index:number, new_index:number) {
|
|
653
|
+
// if (new_index >= arr.length) {
|
|
654
|
+
// var k = new_index - arr.length + 1;
|
|
655
|
+
// while (k--) {
|
|
656
|
+
// arr.push(undefined);
|
|
657
|
+
// }
|
|
658
|
+
// }
|
|
659
|
+
// arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
|
|
660
|
+
// return arr; // for testing
|
|
661
|
+
// };
|
|
662
|
+
openFileUpload(fieldName, modalName, formValue, fileData) {
|
|
663
|
+
const alertData = {
|
|
664
|
+
"field": fieldName,
|
|
665
|
+
"event": true,
|
|
666
|
+
"fieldName": fieldName.field_name,
|
|
667
|
+
"ddnFieldName": fieldName.ddn_field,
|
|
668
|
+
"files": fileData,
|
|
669
|
+
"tableFields": null,
|
|
670
|
+
"defaultBucket": null,
|
|
671
|
+
"defaultS3Key": null
|
|
672
|
+
};
|
|
673
|
+
if (fieldName.tableFields) {
|
|
674
|
+
alertData['tableFields'] = fieldName.tableFields;
|
|
675
|
+
}
|
|
676
|
+
if (fieldName.defaultBucket) {
|
|
677
|
+
alertData['defaultBucket'] = fieldName.defaultBucket;
|
|
678
|
+
}
|
|
679
|
+
if (fieldName.defaultS3Key) {
|
|
680
|
+
alertData['defaultS3Key'] = fieldName.defaultS3Key;
|
|
681
|
+
}
|
|
682
|
+
this.modalService.open(modalName, alertData);
|
|
683
|
+
}
|
|
684
|
+
openAlertModal(id, type, headerMessage, bodyMessage) {
|
|
685
|
+
const alertData = {
|
|
686
|
+
"type": type,
|
|
687
|
+
"bodyMessage": bodyMessage,
|
|
688
|
+
"headerMessage": headerMessage
|
|
689
|
+
};
|
|
690
|
+
this.modalService.open(id, alertData);
|
|
691
|
+
}
|
|
692
|
+
getForm(forms, formName, gridButtons) {
|
|
693
|
+
if (forms[formName] && forms[formName] != undefined && forms[formName] != null && forms[formName] != '') {
|
|
694
|
+
return JSON.parse(JSON.stringify(forms[formName]));
|
|
695
|
+
}
|
|
696
|
+
else {
|
|
697
|
+
if (forms['default'] && forms['default'] != undefined && forms['default'] != null) {
|
|
698
|
+
if (formName == 'UPDATE') {
|
|
699
|
+
if (gridButtons && gridButtons.length > 0) {
|
|
700
|
+
let check = false;
|
|
701
|
+
gridButtons.forEach((button) => {
|
|
702
|
+
if (button && button.onclick && button.onclick.action_name && button.onclick.action_name.toUpperCase() == 'UPDATE') {
|
|
703
|
+
check = true;
|
|
704
|
+
}
|
|
705
|
+
});
|
|
706
|
+
if (check) {
|
|
707
|
+
return JSON.parse(JSON.stringify(forms['default']));
|
|
708
|
+
}
|
|
709
|
+
else {
|
|
710
|
+
return {};
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
else {
|
|
714
|
+
return {};
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
else {
|
|
718
|
+
return JSON.parse(JSON.stringify(forms['default']));
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
else {
|
|
722
|
+
return {};
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
// getTitlecase(value) {
|
|
727
|
+
// return this.titlecasePipe.transform(value);
|
|
728
|
+
// }
|
|
729
|
+
gotoHomePage() {
|
|
730
|
+
const payload = {
|
|
731
|
+
appName: this.envService.getAppName(),
|
|
732
|
+
data: {
|
|
733
|
+
accessToken: this.storageService.GetAccessToken()
|
|
734
|
+
}
|
|
735
|
+
};
|
|
736
|
+
return payload;
|
|
737
|
+
}
|
|
738
|
+
download_file(payload) {
|
|
739
|
+
this.apiService.GetFileData(payload);
|
|
740
|
+
}
|
|
741
|
+
getQRCode(data) {
|
|
742
|
+
this.apiService.GetQr(data);
|
|
743
|
+
}
|
|
744
|
+
getAuditHistory(data) {
|
|
745
|
+
this.apiService.getAuditHistory(data);
|
|
746
|
+
}
|
|
747
|
+
downloadFile(file) {
|
|
748
|
+
const payload = {
|
|
749
|
+
path: 'download',
|
|
750
|
+
data: file
|
|
751
|
+
};
|
|
752
|
+
this.apiService.DownloadFile(payload);
|
|
753
|
+
}
|
|
754
|
+
numberOnly(event) {
|
|
755
|
+
const charCode = (event.which) ? event.which : event.keyCode;
|
|
756
|
+
if (charCode > 31 && (charCode < 48 || charCode > 57)) {
|
|
757
|
+
return false;
|
|
758
|
+
}
|
|
759
|
+
return true;
|
|
760
|
+
}
|
|
761
|
+
viewModal(id, object, field, currentMenu, editemode) {
|
|
762
|
+
const alertData = {
|
|
763
|
+
"field": field,
|
|
764
|
+
"data": object,
|
|
765
|
+
"menu_name": currentMenu.name,
|
|
766
|
+
'editemode': editemode
|
|
767
|
+
};
|
|
768
|
+
this.modalService.open(id, alertData);
|
|
769
|
+
}
|
|
770
|
+
custmizedKey(parentfield) {
|
|
771
|
+
let custmizedKey = parentfield.field_name;
|
|
772
|
+
switch (parentfield.type) {
|
|
773
|
+
case "list_of_fields":
|
|
774
|
+
case "group_of_fields":
|
|
775
|
+
custmizedKey = parentfield.field_name + '_' + parentfield.type;
|
|
776
|
+
break;
|
|
777
|
+
default:
|
|
778
|
+
custmizedKey = parentfield.field_name;
|
|
779
|
+
break;
|
|
780
|
+
}
|
|
781
|
+
return custmizedKey;
|
|
782
|
+
}
|
|
783
|
+
checkStorageValue(object, parent, chield) {
|
|
784
|
+
let check = false;
|
|
785
|
+
if (parent != '' && parent != undefined && parent != null) {
|
|
786
|
+
const parentKey = this.custmizedKey(parent);
|
|
787
|
+
if (object[parentKey] && object[parentKey][chield.field_name] && object[parentKey][chield.field_name].length > 0) {
|
|
788
|
+
check = true;
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
else {
|
|
792
|
+
if (object[chield.field_name]) {
|
|
793
|
+
check = true;
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
return check;
|
|
797
|
+
}
|
|
798
|
+
getVariableStorageValue(object, parent, chield) {
|
|
799
|
+
let data = [];
|
|
800
|
+
if (parent != '' && parent != undefined && parent != null) {
|
|
801
|
+
const parentKey = this.custmizedKey(parent);
|
|
802
|
+
if (this.checkStorageValue(object, parent, chield)) {
|
|
803
|
+
data = object[parentKey][chield.field_name];
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
else {
|
|
807
|
+
if (this.checkStorageValue(object, '', chield)) {
|
|
808
|
+
data = object[chield.field_name];
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
return data;
|
|
812
|
+
}
|
|
813
|
+
formSize(evt, fieldLangth) {
|
|
814
|
+
if (evt && evt.class && evt.class != '') {
|
|
815
|
+
return evt.class;
|
|
816
|
+
}
|
|
817
|
+
else if (fieldLangth <= 5) {
|
|
818
|
+
return '';
|
|
819
|
+
}
|
|
820
|
+
else if (fieldLangth <= 10) {
|
|
821
|
+
return 'modal-lg';
|
|
822
|
+
}
|
|
823
|
+
else {
|
|
824
|
+
return 'modal-dialog-full-width';
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
// price_after_disc_health_test(templateForm:any){
|
|
828
|
+
// let templateValue = templateForm.getRawValue();
|
|
829
|
+
// let discount = 0;
|
|
830
|
+
// discount = templateValue.discount;
|
|
831
|
+
// }
|
|
832
|
+
// setPageNumverAndSize(payload:any,page:number,){
|
|
833
|
+
// payload['pageNo'] = page - 1;
|
|
834
|
+
// payload['pageSize'] = this.itemNumOfGrid;
|
|
835
|
+
// return payload;
|
|
836
|
+
// }
|
|
837
|
+
getMatchingInList(list, IncomingData, existData) {
|
|
838
|
+
var validity = true;
|
|
839
|
+
list.forEach((matchcriteria) => {
|
|
840
|
+
if (this.getObjectValue(matchcriteria, IncomingData) == this.getObjectValue(matchcriteria, existData)) {
|
|
841
|
+
validity = validity && true;
|
|
842
|
+
}
|
|
843
|
+
else {
|
|
844
|
+
validity = validity && false;
|
|
845
|
+
}
|
|
846
|
+
});
|
|
847
|
+
return validity;
|
|
848
|
+
}
|
|
849
|
+
getCorrectIndex(data, indx, field, gridData, filterValue) {
|
|
850
|
+
let index;
|
|
851
|
+
if (field.matching_fields_for_grid_selection && field.matching_fields_for_grid_selection.length > 0) {
|
|
852
|
+
gridData.forEach((row, i) => {
|
|
853
|
+
var validity = true;
|
|
854
|
+
field.matching_fields_for_grid_selection.forEach((matchcriteria) => {
|
|
855
|
+
if (this.getObjectValue(matchcriteria, data) == this.getObjectValue(matchcriteria, row)) {
|
|
856
|
+
validity = validity && true;
|
|
857
|
+
}
|
|
858
|
+
else {
|
|
859
|
+
validity = validity && false;
|
|
860
|
+
}
|
|
861
|
+
});
|
|
862
|
+
if (validity == true) {
|
|
863
|
+
index = i;
|
|
864
|
+
}
|
|
865
|
+
});
|
|
866
|
+
}
|
|
867
|
+
else if (data._id != undefined) {
|
|
868
|
+
index = this.getIndexInArrayById(gridData, data._id);
|
|
869
|
+
}
|
|
870
|
+
else {
|
|
871
|
+
index = indx;
|
|
872
|
+
}
|
|
873
|
+
if (index && index != indx && filterValue == '') {
|
|
874
|
+
index = indx;
|
|
875
|
+
}
|
|
876
|
+
return index;
|
|
877
|
+
}
|
|
878
|
+
getIndexInArrayById(array, id, key) {
|
|
879
|
+
let index = -1;
|
|
880
|
+
if (array && array.length > 0) {
|
|
881
|
+
for (let i = 0; i < array.length; i++) {
|
|
882
|
+
const element = array[i];
|
|
883
|
+
if (key != undefined && key != null) {
|
|
884
|
+
if (this.isArray(key) && key.length > 0 && Object.keys(id).length > 0) {
|
|
885
|
+
if (this.getMatchingInList(key, id, element)) {
|
|
886
|
+
index = i;
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
else {
|
|
890
|
+
const idValue = this.getObjectValue(key, element);
|
|
891
|
+
if (id && id == idValue) {
|
|
892
|
+
index = i;
|
|
893
|
+
break;
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
else if (element._id && element._id == id) {
|
|
898
|
+
index = i;
|
|
899
|
+
break;
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
;
|
|
903
|
+
}
|
|
904
|
+
return index;
|
|
905
|
+
}
|
|
906
|
+
openModal(id, data) {
|
|
907
|
+
this.modalService.open(id, data);
|
|
908
|
+
}
|
|
909
|
+
getOperatorSymbol(operator) {
|
|
910
|
+
switch (operator) {
|
|
911
|
+
case 'eq':
|
|
912
|
+
return '=';
|
|
913
|
+
default:
|
|
914
|
+
return '=';
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
// getRouthQueryToRedirectUrl(){
|
|
918
|
+
// const redirectUrl:any = this.storageService.getRedirectUrl();
|
|
919
|
+
// let searchKey = '';
|
|
920
|
+
// if(redirectUrl.indexOf('?') != -1 ){
|
|
921
|
+
// searchKey = '?';
|
|
922
|
+
// }
|
|
923
|
+
// if(redirectUrl.indexOf('%') != -1){
|
|
924
|
+
// searchKey = '%';
|
|
925
|
+
// }
|
|
926
|
+
// let newUrlWithQuery = '';
|
|
927
|
+
// if(searchKey != ''){
|
|
928
|
+
// const index = redirectUrl.indexOf(searchKey);
|
|
929
|
+
// const stringLength = redirectUrl.length;
|
|
930
|
+
// const queryPrams = redirectUrl.substring(index,stringLength);
|
|
931
|
+
// const newParam = queryPrams.replace('%3F','');
|
|
932
|
+
// newUrlWithQuery = newParam.replace('%3D',':');
|
|
933
|
+
// }
|
|
934
|
+
// return {newUrlWithQuery};
|
|
935
|
+
// }
|
|
936
|
+
getFormDataInMultiformCollection(multiformCollection, formValue, index) {
|
|
937
|
+
let data = {};
|
|
938
|
+
if (index >= 0 && multiformCollection && multiformCollection.length >= 1 && multiformCollection[index] && multiformCollection[index]['data']) {
|
|
939
|
+
data = multiformCollection[index]['data'];
|
|
940
|
+
}
|
|
941
|
+
else {
|
|
942
|
+
let dummyData = {};
|
|
943
|
+
if (multiformCollection && multiformCollection.length > 0) {
|
|
944
|
+
multiformCollection.forEach((element, index) => {
|
|
945
|
+
let currentData = {};
|
|
946
|
+
if (element.data) {
|
|
947
|
+
currentData = element.data;
|
|
948
|
+
}
|
|
949
|
+
if (index == 0) {
|
|
950
|
+
dummyData = currentData;
|
|
951
|
+
}
|
|
952
|
+
else {
|
|
953
|
+
Object.keys(currentData).forEach(key => {
|
|
954
|
+
dummyData[key] = currentData[key];
|
|
955
|
+
});
|
|
956
|
+
}
|
|
957
|
+
});
|
|
958
|
+
}
|
|
959
|
+
if (Object.keys(formValue).length > 0) {
|
|
960
|
+
Object.keys(formValue).forEach(key => {
|
|
961
|
+
dummyData[key] = formValue[key];
|
|
962
|
+
});
|
|
963
|
+
}
|
|
964
|
+
data = dummyData;
|
|
965
|
+
}
|
|
966
|
+
return data;
|
|
967
|
+
}
|
|
968
|
+
convertListOfStringToListObject(list_of_populated_fields, keysList, seprator) {
|
|
969
|
+
let listOfObjects = [];
|
|
970
|
+
list_of_populated_fields.forEach((element) => {
|
|
971
|
+
let object = {};
|
|
972
|
+
let source_targetList = element.split(seprator);
|
|
973
|
+
keysList.forEach((key, i) => {
|
|
974
|
+
object[key] = source_targetList[i];
|
|
975
|
+
});
|
|
976
|
+
listOfObjects.push(object);
|
|
977
|
+
});
|
|
978
|
+
return listOfObjects;
|
|
979
|
+
}
|
|
980
|
+
// Commenting unused Function
|
|
981
|
+
// updateUserPreference(data:object,fieldName:string,parent?:string){
|
|
982
|
+
// let payloadData = this.getUserPreferenceObj(data,fieldName,parent);
|
|
983
|
+
// let payload = {
|
|
984
|
+
// "curTemp" : "user_preference",
|
|
985
|
+
// "data" : payloadData
|
|
986
|
+
// }
|
|
987
|
+
// this.apiService.SaveFormData(payload);
|
|
988
|
+
// }
|
|
989
|
+
// getUserPreferenceByFieldName(fieldName:string){
|
|
990
|
+
// let data = [];
|
|
991
|
+
// let userPreference = this.storageService.getUserPreference();
|
|
992
|
+
// if(userPreference && userPreference[fieldName]){
|
|
993
|
+
// data = userPreference[fieldName];
|
|
994
|
+
// }
|
|
995
|
+
// return data;
|
|
996
|
+
// }
|
|
997
|
+
// getUserPreferenceObj(data:any,fieldName:string,parent?:string){
|
|
998
|
+
// let refObj:any = this.getReferenceObject(data);
|
|
999
|
+
// if(parent != ''){
|
|
1000
|
+
// refObj = parent;
|
|
1001
|
+
// }
|
|
1002
|
+
// if(fieldName == "favoriteMenus"){
|
|
1003
|
+
// refObj = data;
|
|
1004
|
+
// }
|
|
1005
|
+
// let uRef:any = {};
|
|
1006
|
+
// let userPreference = this.storageService.getUserPreference();
|
|
1007
|
+
// if(userPreference && userPreference._id && userPreference._id != null && userPreference._id != ''){
|
|
1008
|
+
// let fieldData = userPreference[fieldName];
|
|
1009
|
+
// if(fieldData && fieldData.length > 0){
|
|
1010
|
+
// let matchIndex = -1;
|
|
1011
|
+
// for (let index = 0; index < fieldData.length; index++) {
|
|
1012
|
+
// const element = fieldData[index];
|
|
1013
|
+
// if(element._id == refObj._id){
|
|
1014
|
+
// matchIndex = index;
|
|
1015
|
+
// break;
|
|
1016
|
+
// }
|
|
1017
|
+
// }
|
|
1018
|
+
// if(matchIndex > -1){
|
|
1019
|
+
// if(parent != ''){
|
|
1020
|
+
// let submenu = fieldData[matchIndex].submenu;
|
|
1021
|
+
// let submenuMatchIndex = -1;
|
|
1022
|
+
// if(submenu && submenu.length > 0){
|
|
1023
|
+
// for (let j = 0; j < submenu.length; j++) {
|
|
1024
|
+
// const subMenu = submenu[j];
|
|
1025
|
+
// if(subMenu._id == data._id){
|
|
1026
|
+
// submenuMatchIndex = j;
|
|
1027
|
+
// break;
|
|
1028
|
+
// }
|
|
1029
|
+
// }
|
|
1030
|
+
// }
|
|
1031
|
+
// if(submenuMatchIndex > -1){
|
|
1032
|
+
// submenu.splice(submenuMatchIndex);
|
|
1033
|
+
// if(fieldData[matchIndex].submenu.length == 0){
|
|
1034
|
+
// fieldData.splice(matchIndex);
|
|
1035
|
+
// }else{
|
|
1036
|
+
// fieldData[matchIndex].submenu = submenu;
|
|
1037
|
+
// }
|
|
1038
|
+
// }else{
|
|
1039
|
+
// if(submenu.length > 0){
|
|
1040
|
+
// fieldData[matchIndex].submenu.push(data);
|
|
1041
|
+
// }else{
|
|
1042
|
+
// fieldData[matchIndex].submenu = []
|
|
1043
|
+
// fieldData[matchIndex].submenu.push(data);
|
|
1044
|
+
// }
|
|
1045
|
+
// }
|
|
1046
|
+
// }else{
|
|
1047
|
+
// fieldData.splice(matchIndex, 1);
|
|
1048
|
+
// }
|
|
1049
|
+
// }else{
|
|
1050
|
+
// if(parent != ''){
|
|
1051
|
+
// refObj['submenu'] = [];
|
|
1052
|
+
// refObj['submenu'].push(data);
|
|
1053
|
+
// fieldData.push(refObj);
|
|
1054
|
+
// }else{
|
|
1055
|
+
// fieldData.push(refObj);
|
|
1056
|
+
// }
|
|
1057
|
+
// }
|
|
1058
|
+
// }else{
|
|
1059
|
+
// fieldData = [];
|
|
1060
|
+
// fieldData.push(refObj);
|
|
1061
|
+
// }
|
|
1062
|
+
// userPreference[fieldName] = fieldData;
|
|
1063
|
+
// uRef = userPreference;
|
|
1064
|
+
// }else{
|
|
1065
|
+
// let user = this.storageService.GetUserInfo();
|
|
1066
|
+
// let userRef = this.getReferenceObject(user);
|
|
1067
|
+
// let dataList = [];
|
|
1068
|
+
// dataList.push(refObj);
|
|
1069
|
+
// uRef['userId'] = userRef;
|
|
1070
|
+
// uRef[fieldName] = dataList;
|
|
1071
|
+
// }
|
|
1072
|
+
// return uRef
|
|
1073
|
+
// }
|
|
1074
|
+
getReferenceObject(obj) {
|
|
1075
|
+
let ref = {};
|
|
1076
|
+
ref["_id"] = obj._id;
|
|
1077
|
+
ref["code"] = obj.code;
|
|
1078
|
+
ref["name"] = obj.name;
|
|
1079
|
+
if (obj.version != null) {
|
|
1080
|
+
ref["version"] = obj.version;
|
|
1081
|
+
}
|
|
1082
|
+
return ref;
|
|
1083
|
+
}
|
|
1084
|
+
dateDiff(dateSent) {
|
|
1085
|
+
let obj = {};
|
|
1086
|
+
let currentDate = new Date();
|
|
1087
|
+
dateSent = new Date(dateSent);
|
|
1088
|
+
// let diff = Date.UTC(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate()) - Date.UTC(dateSent.getFullYear(), dateSent.getMonth(), dateSent.getDate());
|
|
1089
|
+
let diff = currentDate.getTime() - dateSent.getTime();
|
|
1090
|
+
let days = Math.floor(diff / (60 * 60 * 24 * 1000));
|
|
1091
|
+
let hours = Math.floor(diff / (60 * 60 * 1000)) - (days * 24);
|
|
1092
|
+
let minutes = Math.floor(diff / (60 * 1000)) - ((days * 24 * 60) + (hours * 60));
|
|
1093
|
+
let seconds = Math.floor(diff / 1000) - ((days * 24 * 60 * 60) + (hours * 60 * 60) + (minutes * 60));
|
|
1094
|
+
obj['days'] = days;
|
|
1095
|
+
obj['hours'] = hours;
|
|
1096
|
+
obj['minutes'] = minutes;
|
|
1097
|
+
obj['seconds'] = seconds;
|
|
1098
|
+
return obj;
|
|
1099
|
+
}
|
|
1100
|
+
getDay(data) {
|
|
1101
|
+
let createdDate = data.createdDate;
|
|
1102
|
+
if (createdDate) {
|
|
1103
|
+
let obj = this.dateDiff(createdDate);
|
|
1104
|
+
if (obj && obj['days'] == 0) {
|
|
1105
|
+
if (obj['hours'] == 0) {
|
|
1106
|
+
return obj['minutes'] + " Minutes ago";
|
|
1107
|
+
}
|
|
1108
|
+
else {
|
|
1109
|
+
return obj['hours'] + " hours " + obj['minutes'] + " Minutes ago";
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
else {
|
|
1113
|
+
return obj['days'] + " days ago";
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
return "";
|
|
1117
|
+
}
|
|
1118
|
+
updateFieldInList(fieldName, list) {
|
|
1119
|
+
let modifyList = [];
|
|
1120
|
+
if (list && list.length > 0) {
|
|
1121
|
+
list.forEach((element) => {
|
|
1122
|
+
let value = JSON.parse(JSON.stringify(element));
|
|
1123
|
+
value[fieldName] = true;
|
|
1124
|
+
modifyList.push(value);
|
|
1125
|
+
});
|
|
1126
|
+
}
|
|
1127
|
+
return modifyList;
|
|
1128
|
+
}
|
|
1129
|
+
// manufactured_as_customer(templateForm: FormGroup) {
|
|
1130
|
+
// (<FormGroup>templateForm.controls["sample_details"]).controls["mfg_by"].patchValue(templateForm.value.account.name);
|
|
1131
|
+
// }
|
|
1132
|
+
// supplied_as_customer(templateForm: FormGroup) {
|
|
1133
|
+
// (<FormGroup>templateForm.controls["sample_details"]).controls["supplied_by"].patchValue(templateForm.value.account.name);
|
|
1134
|
+
// }
|
|
1135
|
+
funModeTravelChange(value) {
|
|
1136
|
+
let obj1 = {
|
|
1137
|
+
distanceInKm: '',
|
|
1138
|
+
localTa: ''
|
|
1139
|
+
};
|
|
1140
|
+
let obj = {
|
|
1141
|
+
claimSheet: obj1
|
|
1142
|
+
};
|
|
1143
|
+
return obj;
|
|
1144
|
+
}
|
|
1145
|
+
print(data) {
|
|
1146
|
+
let popupWin;
|
|
1147
|
+
popupWin = window.open('', '_blank', 'top=0,left=0,height=100%,width=auto');
|
|
1148
|
+
popupWin.document.write('<div class="noprint" style="text-align:right;"><a onClick="window.print()" style="text-align: right;display: inline-block;cursor: pointer;border: 2px solid #4285f4!important;background-color: transparent!important;color: #4285f4!important;box-shadow: 0 2px 5px 0 rgba(0,0,0,.16), 0 2px 10px 0 rgba(0,0,0,.12);padding: 7px 25px;font-size: .81rem;transition: .2s ease-in-out;margin: .375rem;text-transform: uppercase;">Print</a></div><style>@media print{.noprint{display:none;}}</style>' + data);
|
|
1149
|
+
popupWin.document.close();
|
|
1150
|
+
popupWin.print();
|
|
1151
|
+
}
|
|
1152
|
+
isArray(obj) {
|
|
1153
|
+
return Array.isArray(obj);
|
|
1154
|
+
}
|
|
1155
|
+
donotResetField(tableFields, FormValue) {
|
|
1156
|
+
let donotResetFieldLists = {};
|
|
1157
|
+
tableFields.forEach((tablefield) => {
|
|
1158
|
+
if (tablefield.do_not_refresh_on_add && tablefield.type != "list_of_fields" && tablefield.type != "group_of_fields" && tablefield.type != "stepper") {
|
|
1159
|
+
donotResetFieldLists[tablefield.field_name] = FormValue[tablefield.field_name];
|
|
1160
|
+
}
|
|
1161
|
+
else if (tablefield.type == "group_of_fields") {
|
|
1162
|
+
if (tablefield.list_of_fields && tablefield.list_of_fields.length > 0) {
|
|
1163
|
+
tablefield.list_of_fields.forEach((field) => {
|
|
1164
|
+
if (field.do_not_refresh_on_add) {
|
|
1165
|
+
donotResetFieldLists[tablefield.field_name][field.field_name] = FormValue[tablefield.field_name][field.field_name];
|
|
1166
|
+
}
|
|
1167
|
+
});
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1170
|
+
else if (tablefield.type == "stepper") {
|
|
1171
|
+
if (tablefield.list_of_fields && tablefield.list_of_fields.length > 0) {
|
|
1172
|
+
tablefield.list_of_fields.forEach((step) => {
|
|
1173
|
+
if (step.list_of_fields && step.list_of_fields.length > 0) {
|
|
1174
|
+
step.list_of_fields.forEach((field) => {
|
|
1175
|
+
if (field.do_not_refresh_on_add) {
|
|
1176
|
+
donotResetFieldLists[step.field_name][field.field_name] = FormValue[step.field_name][field.field_name];
|
|
1177
|
+
}
|
|
1178
|
+
});
|
|
1179
|
+
}
|
|
1180
|
+
});
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
});
|
|
1184
|
+
return donotResetFieldLists;
|
|
1185
|
+
}
|
|
1186
|
+
// modifyFileSetValue(files:any){
|
|
1187
|
+
// let fileName = '';
|
|
1188
|
+
// let fileLength = files.length;
|
|
1189
|
+
// let file = files[0];
|
|
1190
|
+
// if(fileLength == 1 && (file.fileName || file.rollName)){
|
|
1191
|
+
// fileName = file.fileName || file.rollName;
|
|
1192
|
+
// }else if(fileLength > 1){
|
|
1193
|
+
// fileName = fileLength + " Files";
|
|
1194
|
+
// }
|
|
1195
|
+
// return fileName;
|
|
1196
|
+
// }
|
|
1197
|
+
// modifyUploadFiles(files:any){
|
|
1198
|
+
// const fileList:any = [];
|
|
1199
|
+
// if(files && files.length > 0){
|
|
1200
|
+
// files.forEach((element:any) => {
|
|
1201
|
+
// if(element._id){
|
|
1202
|
+
// fileList.push(element)
|
|
1203
|
+
// }else{
|
|
1204
|
+
// if(!element.uploadData){
|
|
1205
|
+
// fileList.push({uploadData:[element]});
|
|
1206
|
+
// }else{
|
|
1207
|
+
// fileList.push(element);
|
|
1208
|
+
// }
|
|
1209
|
+
// }
|
|
1210
|
+
// });
|
|
1211
|
+
// }
|
|
1212
|
+
// return fileList;
|
|
1213
|
+
// }
|
|
1214
|
+
getFirstCharOfString(char) {
|
|
1215
|
+
if (this.coreFunctionService.isNotBlank(char)) {
|
|
1216
|
+
return char.charAt(0);
|
|
1217
|
+
}
|
|
1218
|
+
else {
|
|
1219
|
+
return '';
|
|
1220
|
+
}
|
|
1221
|
+
}
|
|
1222
|
+
removeItem(data, column, i) {
|
|
1223
|
+
data[column.field_name].splice(i, 1);
|
|
1224
|
+
return data[column.field_name];
|
|
1225
|
+
}
|
|
1226
|
+
checkObjecOrString(data) {
|
|
1227
|
+
if (data._id) {
|
|
1228
|
+
return data._id;
|
|
1229
|
+
}
|
|
1230
|
+
else {
|
|
1231
|
+
return data;
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
copyGridCellText(value) {
|
|
1235
|
+
if (value) {
|
|
1236
|
+
navigator.clipboard.writeText(value);
|
|
1237
|
+
this.notificationService.notify("bg-success", "Text Copied");
|
|
1238
|
+
}
|
|
1239
|
+
}
|
|
1240
|
+
copyGridColumnText(head, data, elements) {
|
|
1241
|
+
let columnData = "";
|
|
1242
|
+
if (data.length > 0) {
|
|
1243
|
+
let field_name = head.field_name;
|
|
1244
|
+
if (head.type == "info" && elements && elements.length > 0) {
|
|
1245
|
+
if (head.gridColumns) {
|
|
1246
|
+
let childGridColumn = head.gridColumns;
|
|
1247
|
+
let childFieldName = childGridColumn[0]['field_name'];
|
|
1248
|
+
columnData = elements.map((ele) => {
|
|
1249
|
+
let childData;
|
|
1250
|
+
if (ele[field_name] && this.isArray(ele[field_name]) && ele[field_name].length > 0) {
|
|
1251
|
+
childData = ele[field_name].map((chidData) => {
|
|
1252
|
+
return chidData[childFieldName];
|
|
1253
|
+
}).join('\n').trim();
|
|
1254
|
+
}
|
|
1255
|
+
return childData;
|
|
1256
|
+
}).join('\n').trim();
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
else {
|
|
1260
|
+
columnData = data.map((ele) => {
|
|
1261
|
+
if (ele[field_name] != undefined)
|
|
1262
|
+
return ele[field_name];
|
|
1263
|
+
}).join('\n').trim();
|
|
1264
|
+
}
|
|
1265
|
+
navigator.clipboard.writeText(columnData);
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
CommonFunctionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CommonFunctionService, deps: [{ token: i1.StorageService }, { token: i2.ModelService }, { token: i3.DatePipe }, { token: i4.ApiService }, { token: i5.CoreFunctionService }, { token: i6.EnvService }, { token: i7.NotificationService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1270
|
+
CommonFunctionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CommonFunctionService, providedIn: 'root' });
|
|
1271
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CommonFunctionService, decorators: [{
|
|
1272
|
+
type: Injectable,
|
|
1273
|
+
args: [{
|
|
1274
|
+
providedIn: 'root'
|
|
1275
|
+
}]
|
|
1276
|
+
}], ctorParameters: function () { return [{ type: i1.StorageService }, { type: i2.ModelService }, { type: i3.DatePipe }, { type: i4.ApiService }, { type: i5.CoreFunctionService }, { type: i6.EnvService }, { type: i7.NotificationService }]; } });
|
|
1277
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtY29yZS9zcmMvbGliL3NlcnZpY2VzL2NvbW1vbi11dGlscy9jb21tb24tZnVuY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFjM0MsTUFBTSxPQUFPLHFCQUFxQjtJQUloQyxZQUNVLGNBQThCLEVBQzlCLFlBQTBCLEVBQzFCLFFBQWtCLEVBQ2xCLFVBQXFCLEVBQ3JCLG1CQUF1QyxFQUN2QyxVQUFxQixFQUNyQixtQkFBdUM7UUFOdkMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUNyQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQW9CO1FBQ3ZDLGVBQVUsR0FBVixVQUFVLENBQVc7UUFDckIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFvQjtRQUUvQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUNoRixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1NBQzlCO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUNELFFBQVE7UUFD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dGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdG9yYWdlL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IENvcmVGdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24tdXRpbHMvY29yZS1mdW5jdGlvbi9jb3JlLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2FwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTW9kZWxTZXJ2aWNlIH0gZnJvbSAnLi4vbW9kZWwvbW9kZWwuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudlNlcnZpY2UgfSBmcm9tICcuLi9lbnYvZW52LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZ5L25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb21tb25GdW5jdGlvblNlcnZpY2Uge1xyXG4gIHVzZXJJbmZvOiBhbnk7XHJcbiAgbG9jYWxUYXM6YW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGVsU2VydmljZSxcclxuICAgIHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlLFxyXG4gICAgcHJpdmF0ZSBhcGlTZXJ2aWNlOkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvcmVGdW5jdGlvblNlcnZpY2U6Q29yZUZ1bmN0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZW52U2VydmljZTpFbnZTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOk5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICApIHtcclxuICAgIHRoaXMudXNlckluZm8gPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLkdldFVzZXJJbmZvKCk7XHJcbiAgfVxyXG5cclxuICBnZXRSZWZjb2RlKCkge1xyXG4gICAgdGhpcy51c2VySW5mbyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuR2V0VXNlckluZm8oKTtcclxuICAgIGlmICh0aGlzLnVzZXJJbmZvICE9IG51bGwgJiYgdGhpcy51c2VySW5mbyAhPSB1bmRlZmluZWQgJiYgdGhpcy51c2VySW5mby5yZWZDb2RlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnVzZXJJbmZvLnJlZkNvZGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0QXBwSWQoKSB7XHJcbiAgICB0aGlzLnVzZXJJbmZvID0gdGhpcy5zdG9yYWdlU2VydmljZS5HZXRVc2VySW5mbygpO1xyXG4gICAgaWYgKHRoaXMudXNlckluZm8gIT0gbnVsbCAmJiB0aGlzLnVzZXJJbmZvICE9IHVuZGVmaW5lZCAmJiB0aGlzLnVzZXJJbmZvLmFwcElkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnVzZXJJbmZvLmFwcElkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldE9iamVjdFZhbHVlKGZpZWxkOmFueSwgb2JqZWN0OmFueSkge1xyXG4gICAgbGV0IHJlc3VsdCA9IG9iamVjdDtcclxuICAgIGlmIChmaWVsZCAmJiBmaWVsZCAhPSBudWxsICYmIGZpZWxkICE9ICcnICYmIGZpZWxkICE9IFwiIFwiKSB7XHJcblxyXG4gICAgICBsZXQgbGlzdCA9IGZpZWxkLnNwbGl0KFwiLlwiKVxyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICByZXN1bHQgPSByZXN1bHRbbGlzdFtpbmRleF1dXHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cclxuXHJcbiAgZ2V0ZGRuRGlzcGxheVZhbCh2YWw6YW55KSB7XHJcbiAgICBpZiAodmFsICYmIHZhbC5uYW1lKSB7XHJcbiAgICAgIHJldHVybiB2YWwubmFtZTtcclxuICAgIH0gZWxzZSBpZiAodmFsICYmIHZhbC5sYWJlbCkge1xyXG4gICAgICByZXR1cm4gdmFsLmxhYmVsO1xyXG4gICAgfSBlbHNlIGlmICh2YWwgJiYgdmFsLmZpZWxkX25hbWUpIHtcclxuICAgICAgcmV0dXJuIHZhbC5maWVsZF9uYW1lO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH1cclxuICB9XHJcbiAgb3BlblRyZWVNb2RhbChmaWVsZExhYmVsOmFueSwgZGRuRmllbGQ6YW55LCBtb2RhbE5hbWU6YW55KSB7XHJcbiAgICBjb25zdCBhbGVydERhdGEgPSB7XHJcbiAgICAgIFwiZXZlbnRcIjogdHJ1ZSxcclxuICAgICAgXCJmaWVsZE5hbWVcIjogZmllbGRMYWJlbCxcclxuICAgICAgXCJkZG5GaWVsZE5hbWVcIjogZGRuRmllbGRcclxuICAgIH1cclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4obW9kYWxOYW1lLCBhbGVydERhdGEpO1xyXG4gIH1cclxuICBkYXRlRm9ybWF0KHZhbHVlOmFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLCAnZGQvTU0veXl5eScpO1xyXG4gIH1cclxuICBnZXREaXZDbGFzcyhmaWVsZDphbnksZmllbGRzTGFuZ3RoOmFueSl7XHJcbiAgICBjb25zdCBmaWVsZHMgPSB7Li4uZmllbGR9XHJcbiAgICBpZiAoIWZpZWxkcy50eXBlKSB7XHJcbiAgICAgIGZpZWxkcy50eXBlID0gXCJ0ZXh0XCI7XHJcbiAgICB9XHJcbiAgICBpZihmaWVsZHMuZmllbGRfY2xhc3MgJiYgZmllbGQuZmllbGRfY2xhc3MgIT0gJycpe1xyXG4gICAgICByZXR1cm4gZmllbGRzLmZpZWxkX2NsYXNzO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoIChmaWVsZHMudHlwZSkge1xyXG4gICAgICBjYXNlIFwibGlzdF9vZl9jaGVja2JveFwiOlxyXG4gICAgICBjYXNlIFwibGlzdF9vZl9maWVsZHNcIjpcclxuICAgICAgY2FzZSBcImh0bWxcIjpcclxuICAgICAgY2FzZSBcImxhYmVsXCI6XHJcbiAgICAgIGNhc2UgXCJncmlkX3NlbGVjdGlvblwiOlxyXG4gICAgICBjYXNlIFwidGFidWxhcl9kYXRhX3NlbGVjdG9yXCI6XHJcbiAgICAgIGNhc2UgXCJncm91cF9vZl9maWVsZHNcIjpcclxuICAgICAgICByZXR1cm4gXCJjb2wtbGctMTJcIjtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBpZihmaWVsZHNMYW5ndGggPD0gNSl7XHJcbiAgICAgICAgICByZXR1cm4gXCJjb2wtbGctMTJcIjtcclxuICAgICAgICB9ZWxzZSBpZihmaWVsZHNMYW5ndGggPD0gMTApe1xyXG4gICAgICAgICAgcmV0dXJuIFwiY29sLWxnLTZcIjtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiBcImNvbC1sZy0zXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXRGaXhlZERpdkNsYXNzKGZpZWxkOmFueSxmaWVsZHNMYW5ndGg6YW55KXtcclxuICAgIGNvbnN0IGZpZWxkcyA9IHsuLi5maWVsZH1cclxuICAgIGlmICghZmllbGRzLnR5cGUpIHtcclxuICAgICAgZmllbGRzLnR5cGUgPSBcInRleHRcIjtcclxuICAgIH1cclxuICAgIGlmKGZpZWxkcy5maWVsZF9jbGFzcyAmJiBmaWVsZC5maWVsZF9jbGFzcyAhPSAnJyl7XHJcbiAgICAgIHJldHVybiBmaWVsZHMuZmllbGRfY2xhc3M7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldEJ1dHRvbkRpdkNsYXNzKGZpZWxkOmFueSl7XHJcbiAgICBjb25zdCBmaWVsZHMgPSB7Li4uZmllbGR9XHJcbiAgICBpZihmaWVsZHMuZmllbGRfY2xhc3MgJiYgZmllbGQuZmllbGRfY2xhc3MgIT0gJycpe1xyXG4gICAgICByZXR1cm4gZmllbGRzLmZpZWxkX2NsYXNzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuO1xyXG5cclxuICB9XHJcbiAgZ2V0Q29udmVydGVkU3RyaW5nKGphOmFueSwgaW5jb21pbmdUZW1wbGF0ZTphbnkpe1xyXG4gICAgbGV0IHRlbXBsYXRlID0gXCJcIiArIGluY29taW5nVGVtcGxhdGU7XHJcbiAgICBsZXQgcmVnID0gbmV3IFJlZ0V4cChcIihcXFxcWykoLio/KShcXFxcXSlcIik7XHJcblxyXG4gICAgbGV0IG1hdGNoZXI6YW55ID0gdGVtcGxhdGUubWF0Y2gocmVnKTtcclxuICAgIGxldCBncm91cCA9IHJlZy5leGVjKHRlbXBsYXRlKTtcclxuICAgIGNvbnNvbGUubG9nKG1hdGNoZXIuZ3JvdXBzKTtcclxuXHJcbiAgICBsZXQgbGlzdE1hdGNoZXMgPSBbXTtcclxuICAgIC8vIHdoaWxlKG1hdGNoZXIuZmluZCl7XHJcbiAgICAgIGxpc3RNYXRjaGVzLnB1c2gobWF0Y2hlclsyXSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgbGlzdE1hdGNoZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgbGV0IHZhbHVlT2JqID0gbnVsbDtcclxuICAgICAgbGV0IGRldGFpbHMgPSBtYXRjaGVyWzJdO1xyXG4gICAgICBsZXQgdmFsdWVTdHJpbmcgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKGRldGFpbHMsIGphKTtcclxuICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKFwiW1wiICsgbWF0Y2hlclsyXSArIFwiXVwiLCB2YWx1ZVN0cmluZyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGVtcGxhdGU7XHJcbiAgfVxyXG4gIGdldFN0cmluZ1ZhbHVlKGRldGFpbHM6YW55LGphOmFueSl7XHJcbiAgICAvL2phIC0+IG9iamVjdFxyXG4gICAgLy9kZWF0aWxzIC0+IHBhdHRlcm5cclxuICAgIGxldCB2YWx1ZUNvbmZpZyA9IGRldGFpbHMuc3BsaXQoXCIsXCIpO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0VmFsdWUodmFsdWVDb25maWdbMF0sIGphKVxyXG4gIH1cclxuXHJcblxyXG4gIHNhbml0aXplT2JqZWN0KHRhYmxlRmllbGRzOmFueSwgZm9ybVZhbHVlOmFueSwgdmFsaWRhdEZpZWxkOmFueSxmb3JtVmFsdWVXaXRoQ3VzdD86YW55KSB7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGFibGVGaWVsZHMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0YWJsZUZpZWxkc1tpbmRleF07XHJcbiAgICAgIGlmKGVsZW1lbnQgJiYgZWxlbWVudC5maWVsZF9uYW1lKXtcclxuICAgICAgICBpZihlbGVtZW50LnR5cGUgIT0gJ2xpc3Rfb2ZfZmllbGRzJyAmJiBlbGVtZW50LnR5cGUgIT0gJ2dyb3VwX29mX2ZpZWxkcycpe1xyXG4gICAgICAgICAgaWYoZWxlbWVudCAmJiBlbGVtZW50LmRhdGF0eXBlKXtcclxuICAgICAgICAgICAgc3dpdGNoIChlbGVtZW50LmRhdGF0eXBlLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9vYmplY3RcIjpcclxuICAgICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9vYmplY3Rfd2l0aF9wb3B1cFwiOlxyXG4gICAgICAgICAgICAgIGNhc2UgXCJjaGlwc1wiOlxyXG4gICAgICAgICAgICAgIGNhc2UgXCJjaGlwc193aXRoX21hc2tcIjpcclxuICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRGaWVsZCl7XHJcbiAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdICE9IFwiXCIgJiYgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gIT0gbnVsbCAmJiAgIXRoaXMuaXNBcnJheShmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSkpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7J21zZyc6J0VudGVyZWQgdmFsdWUgZm9yICcrZWxlbWVudC5sYWJlbCsnIGlzIG5vdCB2YWxpZC4gISEhJ31cclxuICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodGhpcy5hcHBsaWNhYmxlRm9yVmFsaWRhdGlvbihlbGVtZW50KSAmJiAhdGhpcy5pc0FycmF5KGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0pICYmIGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0ubGVuZ3RoIDw9IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7J21zZyc6J1BsZWFzZSBFbnRlciAnKyBlbGVtZW50LmxhYmVsICsgJy4gISEhJ31cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYgKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdID09IFwiXCIgfHwgIXRoaXMuaXNBcnJheShmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgaWYodmFsaWRhdEZpZWxkKXtcclxuICAgICAgICAgICAgICAgICAgaWYoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gIT0gXCJcIiAmJiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSAhPSBudWxsICYmIHR5cGVvZiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSAhPSAnb2JqZWN0Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzonRW50ZXJlZCB2YWx1ZSBmb3IgJytlbGVtZW50LmxhYmVsKycgaXMgbm90IHZhbGlkLiAhISEnfVxyXG4gICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmFwcGxpY2FibGVGb3JWYWxpZGF0aW9uKGVsZW1lbnQpICYmIHR5cGVvZiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSAhPSAnb2JqZWN0Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzonUGxlYXNlIEVudGVyICcrIGVsZW1lbnQubGFiZWwgKyAnLiAhISEnfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZiAoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPT0gXCJcIiB8fCAodHlwZW9mIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdICE9ICdvYmplY3QnICYmIGVsZW1lbnQudHlwZSAhPSAnZGF0ZScpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihlbGVtZW50ICYmIGVsZW1lbnQudHlwZSl7XHJcbiAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX3N0cmluZ1wiOlxyXG4gICAgICAgICAgICAgIGlmKHZhbGlkYXRGaWVsZCl7XHJcbiAgICAgICAgICAgICAgICBpZihmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSAhPSBcIlwiICYmIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4geydtc2cnOidFbnRlcmVkIHZhbHVlIGZvciAnK2VsZW1lbnQubGFiZWwrJyBpcyBub3QgdmFsaWQuICEhISd9XHJcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmFwcGxpY2FibGVGb3JWYWxpZGF0aW9uKGVsZW1lbnQpICYmICF0aGlzLmlzQXJyYXkoZm9ybVZhbHVlV2l0aEN1c3RbZWxlbWVudC5maWVsZF9uYW1lXSkgJiYgZm9ybVZhbHVlV2l0aEN1c3RbZWxlbWVudC5maWVsZF9uYW1lXS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzonUGxlYXNlIEVudGVyICcrIGVsZW1lbnQubGFiZWwgKyAnLiAhISEnfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1lbHNlIGlmIChmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9PSBcIlwiIHx8ICF0aGlzLmlzQXJyYXkoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgICAgaWYodmFsaWRhdEZpZWxkKXtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuYXBwbGljYWJsZUZvclZhbGlkYXRpb24oZWxlbWVudCkgJiYgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV08MCl7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7J21zZyc6JyAnICtlbGVtZW50LmxhYmVsICsgJyBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIDAuICEhISd9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfWVsc2UgaWYgKCFOdW1iZXIoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9IDA7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxyXG4gICAgICAgICAgICBjYXNlIFwibW9iaWxlXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJlbWFpbFwiOlxyXG4gICAgICAgICAgICAgIGlmKCF2YWxpZGF0RmllbGQpe1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdID09IFwiXCIgfHwgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLnJlbW92ZVNwYWNlRnJvbVN0cmluZyhmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9maWVsZHNcIjpcclxuICAgICAgICAgICAgICBpZih2YWxpZGF0RmllbGQpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5hcHBsaWNhYmxlRm9yVmFsaWRhdGlvbihlbGVtZW50KSl7XHJcbiAgICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQuZGF0YXR5cGUgIT0gJ2tleV92YWx1ZScpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0gPT0gbnVsbCB8fCAhdGhpcy5pc0FycmF5KGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0pIHx8IGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0ubGVuZ3RoIDw9IDApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzogZWxlbWVudC5sYWJlbCArICcgaXMgcmVxdWlyZWQuJ31cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGVsZW1lbnQuZGF0YXR5cGUgPT0gJ2tleV92YWx1ZScpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBmb3JtVmFsdWVXaXRoQ3VzdFtlbGVtZW50LmZpZWxkX25hbWVdICE9ICdvYmplY3QnIHx8IE9iamVjdC5rZXlzKGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0pLmxlbmd0aCA8PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7J21zZyc6IGVsZW1lbnQubGFiZWwgKyAnIGlzIHJlcXVpcmVkLid9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNBcnJheShmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSkgfHwgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0ubGVuZ3RoIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kYXRhdHlwZSA9PSAna2V5X3ZhbHVlJyAmJiB0eXBlb2YgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iamVjdCA9IGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW4gPSBPYmplY3Qua2V5cyhvYmplY3QpLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdC5rZXkgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3Qua2V5ID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRhdGF0eXBlICE9ICdrZXlfdmFsdWUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBpZihlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzICYmIGVsZW1lbnQubGlzdF9vZl9maWVsZHMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGVsZW1lbnQubGlzdF9vZl9maWVsZHNbal07XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhICYmIGRhdGEuZGF0YXR5cGUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGEuZGF0YXR5cGUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX29iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjaGlwc1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjaGlwc193aXRoX21hc2tcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSAmJiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdLmZvckVhY2goKGZpZWRsTGlzdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdID09IFwiXCIgfHwgIXRoaXMuaXNBcnJheShmaWVkbExpc3RbZGF0YS5maWVsZF9uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdICYmIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0uZm9yRWFjaCgoZmllZGxMaXN0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllZGxMaXN0W2RhdGEuZmllbGRfbmFtZV0gPT0gXCJcIiB8fCB0eXBlb2YgZmllZGxMaXN0W2RhdGEuZmllbGRfbmFtZV0gIT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhICYmIGRhdGEudHlwZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9zdHJpbmdcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSAmJiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdLmZvckVhY2goKGZpZWRsTGlzdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdID09IFwiXCIgfHwgIXRoaXMuaXNBcnJheShmaWVkbExpc3RbZGF0YS5maWVsZF9uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dGFyZWFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibW9iaWxlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVtYWlsXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gJiYgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXS5mb3JFYWNoKChmaWVkbExpc3Q6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllZGxMaXN0W2RhdGEuZmllbGRfbmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLnJlbW92ZVNwYWNlRnJvbVN0cmluZyhmaWVkbExpc3RbZGF0YS5maWVsZF9uYW1lXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSAmJiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdLmZvckVhY2goKGZpZWRsTGlzdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdID09IFwiXCIgfHwgZmllZGxMaXN0W2RhdGEuZmllbGRfbmFtZV0gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVkbExpc3RbZGF0YS5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZ3JvdXBfb2ZfZmllbGRzXCI6XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGVsZW1lbnQubGlzdF9vZl9maWVsZHNbal07XHJcbiAgICAgICAgICAgICAgICBpZihkYXRhICYmIGRhdGEuZGF0YXR5cGUpe1xyXG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGEuZGF0YXR5cGUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX29iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjaGlwc1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjaGlwc193aXRoX21hc2tcIjpcclxuICAgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRGaWVsZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gIT0gXCJcIiAmJiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7J21zZyc6J0VudGVyZWQgdmFsdWUgZm9yICcrZGF0YS5sYWJlbCsnIGlzIG5vdCB2YWxpZC4gISEhJ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodGhpcy5hcHBsaWNhYmxlRm9yVmFsaWRhdGlvbihkYXRhKSAmJiAhdGhpcy5pc0FycmF5KGZvcm1WYWx1ZVdpdGhDdXN0W2RhdGEuZmllbGRfbmFtZV0pICYmIGZvcm1WYWx1ZVdpdGhDdXN0W2RhdGEuZmllbGRfbmFtZV0ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzonUGxlYXNlIEVudGVyICcrIGRhdGEubGFiZWwgKyAnLiAhISEnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZiAoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSA9PSBcIlwiIHx8ICF0aGlzLmlzQXJyYXkoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRhdEZpZWxkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSAhPSBcIlwiICYmIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzonRW50ZXJlZCB2YWx1ZSBmb3IgJytkYXRhLmxhYmVsKycgaXMgbm90IHZhbGlkLiAhISEnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmFwcGxpY2FibGVGb3JWYWxpZGF0aW9uKGRhdGEpICYmIHR5cGVvZiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdICE9ICdvYmplY3QnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geydtc2cnOidQbGVhc2UgRW50ZXIgJysgZGF0YS5sYWJlbCArICcuICEhISd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID09IFwiXCIgfHwgdHlwZW9mIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gIT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKGRhdGEgJiYgZGF0YS50eXBlKXtcclxuICAgICAgICAgICAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX3N0cmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRhdEZpZWxkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSAhPSBcIlwiICYmIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzonRW50ZXJlZCB2YWx1ZSBmb3IgJytkYXRhLmxhYmVsKycgaXMgbm90IHZhbGlkLiAhISEnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmFwcGxpY2FibGVGb3JWYWxpZGF0aW9uKGRhdGEpICYmICF0aGlzLmlzQXJyYXkoZm9ybVZhbHVlV2l0aEN1c3RbZGF0YS5maWVsZF9uYW1lXSkgJiYgZm9ybVZhbHVlV2l0aEN1c3RbZGF0YS5maWVsZF9uYW1lXS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geydtc2cnOidQbGVhc2UgRW50ZXIgJysgZGF0YS5sYWJlbCArICcuICEhISd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID09IFwiXCIgfHwgIXRoaXMuaXNBcnJheShmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmaWxlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZighdmFsaWRhdEZpZWxkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gPT0gXCJcIiB8fCBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIU51bWJlcihmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRleHRhcmVhXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1vYmlsZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbWFpbFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYoIXZhbGlkYXRGaWVsZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID09IFwiXCIgfHwgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodHlwZW9mIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gPT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5yZW1vdmVTcGFjZUZyb21TdHJpbmcoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gPT0gXCJcIiB8fCBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwic3RlcHBlclwiOlxyXG4gICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RlcCA9IGVsZW1lbnQubGlzdF9vZl9maWVsZHNbal07XHJcbiAgICAgICAgICAgICAgICBpZihzdGVwLmxpc3Rfb2ZfZmllbGRzICYmIHN0ZXAubGlzdF9vZl9maWVsZHMgIT0gbnVsbCAmJiBzdGVwLmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHN0ZXAubGlzdF9vZl9maWVsZHMubGVuZ3RoOyBrKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gc3RlcC5saXN0X29mX2ZpZWxkc1trXTtcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGEuZGF0YXR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX29iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNoaXBzXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2hpcHNfd2l0aF9tYXNrXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRGaWVsZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0gIT0gXCJcIiAmJiBmb3JtVmFsdWVbZGF0YS5maWVsZF9uYW1lXSAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7J21zZyc6J0VudGVyZWQgdmFsdWUgZm9yICcrZGF0YS5sYWJlbCsnIGlzIG5vdCB2YWxpZC4gISEhJ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmFwcGxpY2FibGVGb3JWYWxpZGF0aW9uKGRhdGEpICYmICF0aGlzLmlzQXJyYXkoZm9ybVZhbHVlV2l0aEN1c3RbZGF0YS5maWVsZF9uYW1lXSkgJiYgZm9ybVZhbHVlV2l0aEN1c3RbZGF0YS5maWVsZF9uYW1lXS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7J21zZyc6J1BsZWFzZSBFbnRlciAnKyBkYXRhLmxhYmVsICsgJy4gISEhJ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChmb3JtVmFsdWVbZGF0YS5maWVsZF9uYW1lXSA9PSBcIlwiICYmICF0aGlzLmlzQXJyYXkoZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih2YWxpZGF0RmllbGQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVtkYXRhLmZpZWxkX25hbWVdICE9IFwiXCIgJiYgZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0gIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geydtc2cnOidFbnRlcmVkIHZhbHVlIGZvciAnK2RhdGEubGFiZWwrJyBpcyBub3QgdmFsaWQuICEhISd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodGhpcy5hcHBsaWNhYmxlRm9yVmFsaWRhdGlvbihkYXRhKSAmJiB0eXBlb2YgZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0gIT0gJ29iamVjdCcpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzonUGxlYXNlIEVudGVyICcrIGRhdGEubGFiZWwgKyAnLiAhISEnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYgKGZvcm1WYWx1ZVtkYXRhLmZpZWxkX25hbWVdID09IFwiXCIgJiYgdHlwZW9mIGZvcm1WYWx1ZVtkYXRhLmZpZWxkX25hbWVdICE9ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU51bWJlcihmb3JtVmFsdWVbZGF0YS5maWVsZF9uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZGF0YS5maWVsZF9uYW1lXSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX3N0cmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih2YWxpZGF0RmllbGQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVtkYXRhLmZpZWxkX25hbWVdICE9IFwiXCIgJiYgZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0gIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geydtc2cnOidFbnRlcmVkIHZhbHVlIGZvciAnK2RhdGEubGFiZWwrJyBpcyBub3QgdmFsaWQuICEhISd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodGhpcy5hcHBsaWNhYmxlRm9yVmFsaWRhdGlvbihkYXRhKSAmJiAhdGhpcy5pc0FycmF5KGZvcm1WYWx1ZVdpdGhDdXN0W2RhdGEuZmllbGRfbmFtZV0pICYmIGZvcm1WYWx1ZVdpdGhDdXN0W2RhdGEuZmllbGRfbmFtZV0ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geydtc2cnOidQbGVhc2UgRW50ZXIgJysgZGF0YS5sYWJlbCArICcuICEhISd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZiAoZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0gPT0gXCJcIiAmJiAhdGhpcy5pc0FycmF5KGZvcm1WYWx1ZVtkYXRhLmZpZWxkX25hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX2NoZWNrYm94XCI6XHJcbiAgICAgICAgICAgICAgaWYodmFsaWRhdEZpZWxkICYmIGVsZW1lbnQuaXNfbWFuZGF0b3J5KXtcclxuICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0gJiYgdGhpcy5pc0FycmF5KGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0pICYmIGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0ubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzogZWxlbWVudC5sYWJlbCArICcgaXMgbWFuZGF0b3J5LiAhISEnfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgaWYodmFsaWRhdEZpZWxkKXtcclxuXHJcbiAgICAgICAgICAgICAgfWVsc2UgaWYgKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdID09IFwiXCIgfHwgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYodmFsaWRhdEZpZWxkKXtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuIHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5jaGVja0JsYW5rUHJvcGVydGllcyhmb3JtVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGFwcGxpY2FibGVGb3JWYWxpZGF0aW9uKGZpZWxkOmFueSl7XHJcbiAgICBpZihmaWVsZC5pc19tYW5kYXRvcnkpe1xyXG4gICAgICBpZihmaWVsZC5zaG93X2lmICE9ICcnICYmIGZpZWxkLnNob3dfaWYgIT0gbnVsbCl7XHJcbiAgICAgICAgaWYoZmllbGRbJ2Rpc3BsYXknXSB8fCBmaWVsZFsnc2hvdyddKXtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1lbHNle1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0RGF0ZUluU3RyaW5nRnVuY3Rpb24odGVtcGxhdGVWYWx1ZTphbnkpe1xyXG4gICAgbGV0IHJlc3VsdDphbnkgPSB7fVxyXG4gICAgbGV0IG1vbnRoTnVtYmVyOmFueTtcclxuICAgIGxldCBtb250aE5hbWU6YW55O1xyXG4gICAgbGV0IHllYXI6IGFueTtcclxuICAgIGNvbnN0IGZyb21EYXRlID0gdGVtcGxhdGVWYWx1ZVsnZnJvbURhdGUnXTtcclxuICAgICAgaWYoZnJvbURhdGUgJiYgZnJvbURhdGUgIT0gXCJcIikge1xyXG4gICAgICBjb25zdCBtb250aHMgPSBbXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiXTtcclxuICAgICAgbW9udGhOdW1iZXIgPSBuZXcgRGF0ZShmcm9tRGF0ZSkuZ2V0TW9udGgoKTtcclxuICAgICAgbW9udGhOYW1lID0gbW9udGhzW21vbnRoTnVtYmVyXTtcclxuICAgICAgeWVhciA9IG5ldyBEYXRlKGZyb21EYXRlKS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICBsZXQgbGFiZWwgPSBtb250aE5hbWUrJy0nK3llYXI7XHJcbiAgICAgIHJlc3VsdFsnbGFiZWxOYW1lJ10gPSBsYWJlbDtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgcG9wdWxhdGVmaWVsZHModmFsdWU6YW55LCBwb3B1bGF0ZV9maWVsZHM6YW55LGZpZWxkOmFueSxtdWx0aXBsZUZvcm1Db2xsZWN0aW9uPzphbnkpIHtcclxuICAgIGxldCBvYmo6YW55ID0ge31cclxuICAgIGxldCBjaGVjayA9IGZhbHNlO1xyXG4gICAgaWYoZmllbGQgJiYgZmllbGQuZmllbGRfbmFtZSl7XHJcbiAgICAgIGxldCBmaWVsZE5hbWUgPSBcIlwiO1xyXG4gICAgICBpZihmaWVsZC5wYXJlbnQgICYmIGZpZWxkLnBhcmVudCAhPSAnJyl7XHJcbiAgICAgICAgZmllbGROYW1lID0gZmllbGQucGFyZW50KycuJytmaWVsZC5maWVsZF9uYW1lO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBmaWVsZE5hbWUgPSBmaWVsZC5maWVsZF9uYW1lO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGZpZWxkLnR5cGUgPT0gXCJjaGVja2JveFwiICYmIHRoaXMuZ2V0T2JqZWN0VmFsdWUoZmllbGROYW1lLHZhbHVlKSl7XHJcbiAgICAgICAgY2hlY2sgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihwb3B1bGF0ZV9maWVsZHMgJiYgcG9wdWxhdGVfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICBwb3B1bGF0ZV9maWVsZHMuZm9yRWFjaCgoZWw6YW55KSA9PntcclxuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmdldEZvcm1EYXRhSW5NdWx0aWZvcm1Db2xsZWN0aW9uKG11bHRpcGxlRm9ybUNvbGxlY3Rpb24sIHZhbHVlKTtcclxuICAgICAgICBsZXQgdG9MaXN0ID0gZWwudG8uc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGlmKHRvTGlzdCAmJiB0b0xpc3QubGVuZ3RoID4gMSl7XHJcbiAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0b0xpc3RbMF07XHJcbiAgICAgICAgICBpZiAoIW9ialtwYXJlbnRdKSBvYmpbcGFyZW50XSA9IHt9O1xyXG4gICAgICAgICAgY29uc3QgY2hpbGQgPSB0b0xpc3RbMV07XHJcbiAgICAgICAgICBpZihjaGVjayl7XHJcbiAgICAgICAgICAgIG9ialtwYXJlbnRdW2NoaWxkXSA9dGhpcy5tZXJnZU11bHRpRmllbGRzVmFsdWVzKGVsLmZyb20sIHZhbHVlKTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBvYmpbcGFyZW50XVtjaGlsZF0gPSBcIlwiO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgY29uc3QgZmllbGQgPSB0b0xpc3RbMF07XHJcbiAgICAgICAgICBpZihjaGVjayl7XHJcbiAgICAgICAgICAgIG9ialtmaWVsZF0gPXRoaXMubWVyZ2VNdWx0aUZpZWxkc1ZhbHVlcyhlbC5mcm9tLCB2YWx1ZSk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgb2JqW2ZpZWxkXSA9IFwiXCI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICBtZXJnZU11bHRpRmllbGRzVmFsdWVzKGZpZWxkOmFueSwgb2JqZWN0OmFueSl7XHJcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcclxuICAgIGlmKGZpZWxkICYmIGZpZWxkICE9IG51bGwgJiYgZmllbGQgIT0gJycgJiYgZmllbGQgIT0gXCIgXCIpe1xyXG4gICAgICBsZXQgbGlzdCA9IGZpZWxkLnNwbGl0KFwiK1wiKVxyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBpZihyZXN1bHQgIT0gXCJcIil7XHJcbiAgICAgICAgICBsZXQgbGFzdEluZGV4ID0gbGlzdC5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbGlzdFtsYXN0SW5kZXhdICsgdGhpcy5nZXRPYmplY3RWYWx1ZShsaXN0W2luZGV4XSwgb2JqZWN0KTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0T2JqZWN0VmFsdWUobGlzdFtpbmRleF0sIG9iamVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcG9wdWxhdGVfZmllbGRzX2Zvcl9yZXBvcnQodGVtcGxhdGVGb3JtOiBVbnR5cGVkRm9ybUdyb3VwKSB7XHJcbiAgICAvLyB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbJ3JlcG9ydGluZ19mYXgnXS5zZXRWYWx1ZSh0ZW1wbGF0ZUZvcm0udmFsdWVbJ2ZheCddKTtcclxuICAgIHRlbXBsYXRlRm9ybS5jb250cm9sc1sncmVwb3J0aW5nX21vYmlsZSddLnNldFZhbHVlKHRlbXBsYXRlRm9ybS52YWx1ZVsnbW9iaWxlJ10pO1xyXG4gICAgdGVtcGxhdGVGb3JtLmNvbnRyb2xzWydyZXBvcnRpbmdfdGVsJ10uc2V0VmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlWydwaG9uZSddKTtcclxuXHJcbiAgICB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbJ3JlcG9ydGluZ19jaXR5J10uc2V0VmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlWydjaXR5J10pO1xyXG4gICAgdGVtcGxhdGVGb3JtLmNvbnRyb2xzWydyZXBvcnRpbmdfc3RhdGUnXS5zZXRWYWx1ZSh0ZW1wbGF0ZUZvcm0udmFsdWVbJ3N0YXRlJ10pO1xyXG4gICAgdGVtcGxhdGVGb3JtLmNvbnRyb2xzWydyZXBvcnRpbmdfY291bnRyeSddLnNldFZhbHVlKHRlbXBsYXRlRm9ybS52YWx1ZVsnY291bnRyeSddKTtcclxuXHJcbiAgICAvLyB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbJ3JlcG9ydGluZ19hZGRyZXNzX2xpbmUyJ10uc2V0VmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlWydhZGRyZXNzX2xpbmUyJ10pO1xyXG4gICAgdGVtcGxhdGVGb3JtLmNvbnRyb2xzWydyZXBvcnRpbmdfZ3N0J10uc2V0VmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlWydnc3Rfbm8nXSk7XHJcbiAgICB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbJ3JlcG9ydGluZ19jb250YWN0X3BlcnNvbl9lbWFpbCddLnNldFZhbHVlKHRlbXBsYXRlRm9ybS52YWx1ZVsnZW1haWwnXSk7XHJcbiAgICB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbJ3JlcG9ydGluZ19hZGRyZXNzJ10uc2V0VmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlWydhZGRyZXNzX2xpbmUxJ10pO1xyXG4gICAgdGVtcGxhdGVGb3JtLmNvbnRyb2xzWydyZXBvcnRpbmdfcGluY29kZSddLnNldFZhbHVlKHRlbXBsYXRlRm9ybS52YWx1ZVsncGluY29kZSddKTtcclxuICAgIHRlbXBsYXRlRm9ybS5jb250cm9sc1sncmVwb3J0aW5nX2NvbnRhY3RfcGVyc29uJ10uc2V0VmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlWydmaXJzdF9uYW1lJ10rXCIgXCIrdGVtcGxhdGVGb3JtLnZhbHVlWydsYXN0X25hbWUnXSk7XHJcbiAgICB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbJ3JlcG9ydGluZ19jb21wYW55J10uc2V0VmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlLmFjY291bnQubmFtZSk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8vIGdldE5ldEFtb3VudFdpdGhQZXJjZW50KHRvdGFsOm51bWJlciwgcGVyY2VudDpudW1iZXIpIHtcclxuICAvLyAgIGxldCBwZXJjZW50QW1vdW50ID0gMDtcclxuICAvLyAgIGxldCBuZXRBbW91bnQgPSAwO1xyXG4gIC8vICAgcGVyY2VudEFtb3VudCA9IHRvdGFsICogcGVyY2VudCAvIDEwMDtcclxuICAvLyAgIG5ldEFtb3VudCA9IHRvdGFsIC0gcGVyY2VudEFtb3VudDtcclxuICAvLyAgIHJldHVybiB7IHBfYW1vdW50OiBwZXJjZW50QW1vdW50LCBuZXRfYW1vdW50OiBuZXRBbW91bnQgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gY2xhaW1BbW91bnRDYWxjdWxhdGlvbihmaWVsZDE6YW55LCBmaWVsZDI6YW55LCBmaWVsZDM6YW55KSB7XHJcbiAgLy8gICBsZXQgdG90YWwgPSAwO1xyXG4gIC8vICAgaWYgKGZpZWxkMSAmJiBmaWVsZDEgIT0gXCJcIikge1xyXG4gIC8vICAgICB0b3RhbCA9IHRvdGFsICsgZmllbGQxXHJcbiAgLy8gICB9XHJcbiAgLy8gICBpZiAoZmllbGQyICYmIGZpZWxkMiAhPSBcIlwiKSB7XHJcbiAgLy8gICAgIHRvdGFsID0gdG90YWwgKyBmaWVsZDI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBpZiAoZmllbGQzICYmIGZpZWxkMyAhPSBcIlwiKSB7XHJcbiAgLy8gICAgIHRvdGFsID0gdG90YWwgKyBmaWVsZDM7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gdG90YWw7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBhcnJheV9tb3ZlKGFycjphbnksIG9sZF9pbmRleDpudW1iZXIsIG5ld19pbmRleDpudW1iZXIpIHtcclxuICAvLyAgIGlmIChuZXdfaW5kZXggPj0gYXJyLmxlbmd0aCkge1xyXG4gIC8vICAgICB2YXIgayA9IG5ld19pbmRleCAtIGFyci5sZW5ndGggKyAxO1xyXG4gIC8vICAgICB3aGlsZSAoay0tKSB7XHJcbiAgLy8gICAgICAgYXJyLnB1c2godW5kZWZpbmVkKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgYXJyLnNwbGljZShuZXdfaW5kZXgsIDAsIGFyci5zcGxpY2Uob2xkX2luZGV4LCAxKVswXSk7XHJcbiAgLy8gICByZXR1cm4gYXJyOyAvLyBmb3IgdGVzdGluZ1xyXG4gIC8vIH07XHJcblxyXG4gIG9wZW5GaWxlVXBsb2FkKGZpZWxkTmFtZTphbnksIG1vZGFsTmFtZTphbnksIGZvcm1WYWx1ZTphbnksIGZpbGVEYXRhOmFueSkge1xyXG4gICAgY29uc3QgYWxlcnREYXRhID0ge1xyXG4gICAgICBcImZpZWxkXCIgOmZpZWxkTmFtZSxcclxuICAgICAgXCJldmVudFwiOiB0cnVlLFxyXG4gICAgICBcImZpZWxkTmFtZVwiOiBmaWVsZE5hbWUuZmllbGRfbmFtZSxcclxuICAgICAgXCJkZG5GaWVsZE5hbWVcIjogZmllbGROYW1lLmRkbl9maWVsZCxcclxuICAgICAgXCJmaWxlc1wiIDogZmlsZURhdGEsXHJcbiAgICAgIFwidGFibGVGaWVsZHNcIjpudWxsLFxyXG4gICAgICBcImRlZmF1bHRCdWNrZXRcIjpudWxsICxcclxuICAgICAgXCJkZWZhdWx0UzNLZXlcIjogbnVsbFxyXG4gICAgfVxyXG4gICAgaWYgKGZpZWxkTmFtZS50YWJsZUZpZWxkcykge1xyXG4gICAgICBhbGVydERhdGFbJ3RhYmxlRmllbGRzJ10gPSBmaWVsZE5hbWUudGFibGVGaWVsZHM7XHJcbiAgICB9XHJcbiAgICBpZiAoZmllbGROYW1lLmRlZmF1bHRCdWNrZXQpIHtcclxuICAgICAgYWxlcnREYXRhWydkZWZhdWx0QnVja2V0J10gPSBmaWVsZE5hbWUuZGVmYXVsdEJ1Y2tldDtcclxuICAgIH1cclxuICAgIGlmIChmaWVsZE5hbWUuZGVmYXVsdFMzS2V5KSB7XHJcbiAgICAgIGFsZXJ0RGF0YVsnZGVmYXVsdFMzS2V5J10gPSBmaWVsZE5hbWUuZGVmYXVsdFMzS2V5O1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbihtb2RhbE5hbWUsIGFsZXJ0RGF0YSk7XHJcbiAgfVxyXG4gIG9wZW5BbGVydE1vZGFsKGlkOnN0cmluZywgdHlwZTphbnksIGhlYWRlck1lc3NhZ2U6YW55LCBib2R5TWVzc2FnZTphbnkpIHtcclxuICAgIGNvbnN0IGFsZXJ0RGF0YSA9IHtcclxuICAgICAgXCJ0eXBlXCI6IHR5cGUsXHJcbiAgICAgIFwiYm9keU1lc3NhZ2VcIjogYm9keU1lc3NhZ2UsXHJcbiAgICAgIFwiaGVhZGVyTWVzc2FnZVwiOiBoZWFkZXJNZXNzYWdlXHJcbiAgICB9XHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKGlkLCBhbGVydERhdGEpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybShmb3JtczphbnksIGZvcm1OYW1lOmFueSxncmlkQnV0dG9uczphbnkpIHtcclxuICAgIGlmIChmb3Jtc1tmb3JtTmFtZV0gJiYgZm9ybXNbZm9ybU5hbWVdICE9IHVuZGVmaW5lZCAmJiBmb3Jtc1tmb3JtTmFtZV0gIT0gbnVsbCAmJiBmb3Jtc1tmb3JtTmFtZV0gIT0gJycpIHtcclxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZm9ybXNbZm9ybU5hbWVdKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoZm9ybXNbJ2RlZmF1bHQnXSAmJiBmb3Jtc1snZGVmYXVsdCddICE9IHVuZGVmaW5lZCAmJiBmb3Jtc1snZGVmYXVsdCddICE9IG51bGwpIHtcclxuICAgICAgICBpZihmb3JtTmFtZSA9PSAnVVBEQVRFJyl7XHJcbiAgICAgICAgICBpZihncmlkQnV0dG9ucyAmJiBncmlkQnV0dG9ucy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgbGV0IGNoZWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyaWRCdXR0b25zLmZvckVhY2goKGJ1dHRvbjphbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZihidXR0b24gJiYgYnV0dG9uLm9uY2xpY2sgJiYgYnV0dG9uLm9uY2xpY2suYWN0aW9uX25hbWUgJiYgYnV0dG9uLm9uY2xpY2suYWN0aW9uX25hbWUudG9VcHBlckNhc2UoKSA9PSAnVVBEQVRFJyl7XHJcbiAgICAgICAgICAgICAgICBjaGVjayA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYoY2hlY2spe1xyXG4gICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZvcm1zWydkZWZhdWx0J10pKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7fTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZvcm1zWydkZWZhdWx0J10pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHt9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLy8gZ2V0VGl0bGVjYXNlKHZhbHVlKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy50aXRsZWNhc2VQaXBlLnRyYW5zZm9ybSh2YWx1ZSk7XHJcbiAgLy8gfVxyXG5cclxuXHJcblxyXG4gIGdvdG9Ib21lUGFnZSgpIHtcclxuICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgIGFwcE5hbWU6IHRoaXMuZW52U2VydmljZS5nZXRBcHBOYW1lKCksXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICBhY2Nlc3NUb2tlbjogdGhpcy5zdG9yYWdlU2VydmljZS5HZXRBY2Nlc3NUb2tlbigpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwYXlsb2FkO1xyXG4gIH1cclxuICBkb3dubG9hZF9maWxlKHBheWxvYWQ6b2JqZWN0KXtcclxuICAgIHRoaXMuYXBpU2VydmljZS5HZXRGaWxlRGF0YShwYXlsb2FkKTtcclxuICB9XHJcbiAgZ2V0UVJDb2RlKGRhdGE6b2JqZWN0KXtcclxuICAgIHRoaXMuYXBpU2VydmljZS5HZXRRcihkYXRhKTtcclxuICB9XHJcbiAgZ2V0QXVkaXRIaXN0b3J5KGRhdGE6b2JqZWN0KXtcclxuICAgIHRoaXMuYXBpU2VydmljZS5nZXRBdWRpdEhpc3RvcnkoZGF0YSk7XHJcbiAgfVxyXG4gIGRvd25sb2FkRmlsZShmaWxlOnN0cmluZykge1xyXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgcGF0aDogJ2Rvd25sb2FkJyxcclxuICAgICAgZGF0YTogZmlsZVxyXG4gICAgfVxyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLkRvd25sb2FkRmlsZShwYXlsb2FkKTtcclxuICB9XHJcbiAgbnVtYmVyT25seShldmVudDphbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNoYXJDb2RlID0gKGV2ZW50LndoaWNoKSA/IGV2ZW50LndoaWNoIDogZXZlbnQua2V5Q29kZTtcclxuICAgIGlmIChjaGFyQ29kZSA+IDMxICYmIChjaGFyQ29kZSA8IDQ4IHx8IGNoYXJDb2RlID4gNTcpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG5cclxuICB9XHJcbiAgdmlld01vZGFsKGlkOmFueSwgb2JqZWN0OmFueSwgZmllbGQ6YW55LCBjdXJyZW50TWVudTphbnksIGVkaXRlbW9kZTphbnkpIHtcclxuICAgIGNvbnN0IGFsZXJ0RGF0YSA9IHtcclxuICAgICAgXCJmaWVsZFwiOiBmaWVsZCxcclxuICAgICAgXCJkYXRhXCI6IG9iamVjdCxcclxuICAgICAgXCJtZW51X25hbWVcIjogY3VycmVudE1lbnUubmFtZSxcclxuICAgICAgJ2VkaXRlbW9kZSc6IGVkaXRlbW9kZVxyXG4gICAgfVxyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihpZCwgYWxlcnREYXRhKTtcclxuICB9XHJcbiAgY3VzdG1pemVkS2V5KHBhcmVudGZpZWxkOmFueSl7XHJcbiAgICBsZXQgY3VzdG1pemVkS2V5ID0gcGFyZW50ZmllbGQuZmllbGRfbmFtZTtcclxuICAgIHN3aXRjaCAocGFyZW50ZmllbGQudHlwZSkge1xyXG4gICAgICBjYXNlIFwibGlzdF9vZl9maWVsZHNcIjpcclxuICAgICAgY2FzZSBcImdyb3VwX29mX2ZpZWxkc1wiOlxyXG4gICAgICAgIGN1c3RtaXplZEtleSA9IHBhcmVudGZpZWxkLmZpZWxkX25hbWUrJ18nK3BhcmVudGZpZWxkLnR5cGVcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBjdXN0bWl6ZWRLZXkgPSBwYXJlbnRmaWVsZC5maWVsZF9uYW1lO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1c3RtaXplZEtleTtcclxuICB9XHJcbiAgY2hlY2tTdG9yYWdlVmFsdWUob2JqZWN0OmFueSxwYXJlbnQ6YW55LGNoaWVsZDphbnkpe1xyXG4gICAgbGV0IGNoZWNrID0gZmFsc2U7XHJcbiAgICBpZihwYXJlbnQgIT0gJycgJiYgcGFyZW50ICE9IHVuZGVmaW5lZCAmJiBwYXJlbnQgIT0gbnVsbCl7XHJcbiAgICAgIGNvbnN0IHBhcmVudEtleSA9IHRoaXMuY3VzdG1pemVkS2V5KHBhcmVudCk7XHJcbiAgICAgIGlmKG9iamVjdFtwYXJlbnRLZXldICYmIG9iamVjdFtwYXJlbnRLZXldW2NoaWVsZC5maWVsZF9uYW1lXSAmJiBvYmplY3RbcGFyZW50S2V5XVtjaGllbGQuZmllbGRfbmFtZV0ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgY2hlY2sgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9ZWxzZXtcclxuICAgICAgaWYob2JqZWN0W2NoaWVsZC5maWVsZF9uYW1lXSl7XHJcbiAgICAgICAgY2hlY2sgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hlY2s7XHJcbiAgfVxyXG4gIGdldFZhcmlhYmxlU3RvcmFnZVZhbHVlKG9iamVjdDphbnkscGFyZW50OmFueSxjaGllbGQ6YW55KTogQXJyYXk8YW55PntcclxuICAgIGxldCBkYXRhOmFueSA9IFtdO1xyXG4gICAgaWYocGFyZW50ICE9ICcnICYmIHBhcmVudCAhPSB1bmRlZmluZWQgJiYgcGFyZW50ICE9IG51bGwpe1xyXG4gICAgICBjb25zdCBwYXJlbnRLZXkgPSB0aGlzLmN1c3RtaXplZEtleShwYXJlbnQpO1xyXG4gICAgICBpZih0aGlzLmNoZWNrU3RvcmFnZVZhbHVlKG9iamVjdCxwYXJlbnQsY2hpZWxkKSl7XHJcbiAgICAgICAgZGF0YSA9IG9iamVjdFtwYXJlbnRLZXldW2NoaWVsZC5maWVsZF9uYW1lXVxyXG4gICAgICB9XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIGlmKHRoaXMuY2hlY2tTdG9yYWdlVmFsdWUob2JqZWN0LCcnLGNoaWVsZCkpe1xyXG4gICAgICAgIGRhdGEgPSBvYmplY3RbY2hpZWxkLmZpZWxkX25hbWVdXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcbiAgZm9ybVNpemUoZXZ0OmFueSxmaWVsZExhbmd0aDpudW1iZXIpe1xyXG4gICAgaWYoZXZ0ICYmIGV2dC5jbGFzcyAmJiBldnQuY2xhc3MhPSAnJyl7XHJcbiAgICAgIHJldHVybiBldnQuY2xhc3M7XHJcbiAgICB9ZWxzZSBpZihmaWVsZExhbmd0aCA8PSA1KXtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfWVsc2UgaWYoZmllbGRMYW5ndGggPD0gMTApe1xyXG4gICAgICByZXR1cm4gJ21vZGFsLWxnJztcclxuICAgIH1cclxuICAgIGVsc2V7XHJcbiAgICAgIHJldHVybiAnbW9kYWwtZGlhbG9nLWZ1bGwtd2lkdGgnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gcHJpY2VfYWZ0ZXJfZGlzY19oZWFsdGhfdGVzdCh0ZW1wbGF0ZUZvcm06YW55KXtcclxuICAvLyAgIGxldCB0ZW1wbGF0ZVZhbHVlID0gdGVtcGxhdGVGb3JtLmdldFJhd1ZhbHVlKCk7XHJcbiAgLy8gICBsZXQgZGlzY291bnQgPSAwO1xyXG4gIC8vICAgZGlzY291bnQgPSB0ZW1wbGF0ZVZhbHVlLmRpc2NvdW50O1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0UGFnZU51bXZlckFuZFNpemUocGF5bG9hZDphbnkscGFnZTpudW1iZXIsKXtcclxuICAvLyAgIHBheWxvYWRbJ3BhZ2VObyddID0gcGFnZSAtIDE7XHJcbiAgLy8gICBwYXlsb2FkWydwYWdlU2l6ZSddID0gdGhpcy5pdGVtTnVtT2ZHcmlkO1xyXG4gIC8vICAgcmV0dXJuIHBheWxvYWQ7XHJcbiAgLy8gfVxyXG4gIGdldE1hdGNoaW5nSW5MaXN0KGxpc3Q6YW55LEluY29taW5nRGF0YTphbnksZXhpc3REYXRhOmFueSl7XHJcbiAgICB2YXIgdmFsaWRpdHkgPSB0cnVlO1xyXG4gICAgbGlzdC5mb3JFYWNoKChtYXRjaGNyaXRlcmlhOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHRoaXMuZ2V0T2JqZWN0VmFsdWUobWF0Y2hjcml0ZXJpYSwgSW5jb21pbmdEYXRhKSA9PSB0aGlzLmdldE9iamVjdFZhbHVlKG1hdGNoY3JpdGVyaWEsIGV4aXN0RGF0YSkpIHtcclxuICAgICAgICB2YWxpZGl0eSA9IHZhbGlkaXR5ICYmIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdmFsaWRpdHkgPSB2YWxpZGl0eSAmJiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdmFsaWRpdHk7XHJcbiAgfVxyXG4gIGdldENvcnJlY3RJbmRleChkYXRhOmFueSwgaW5keDpudW1iZXIsZmllbGQ6YW55LGdyaWREYXRhOmFueSxmaWx0ZXJWYWx1ZTphbnkpe1xyXG4gICAgbGV0IGluZGV4O1xyXG4gICAgaWYgKGZpZWxkLm1hdGNoaW5nX2ZpZWxkc19mb3JfZ3JpZF9zZWxlY3Rpb24gJiYgZmllbGQubWF0Y2hpbmdfZmllbGRzX2Zvcl9ncmlkX3NlbGVjdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGdyaWREYXRhLmZvckVhY2goKHJvdzphbnksIGk6bnVtYmVyKSA9PiB7XHJcbiAgICAgICAgdmFyIHZhbGlkaXR5ID0gdHJ1ZTtcclxuICAgICAgICBmaWVsZC5tYXRjaGluZ19maWVsZHNfZm9yX2dyaWRfc2VsZWN0aW9uLmZvckVhY2goKG1hdGNoY3JpdGVyaWE6YW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5nZXRPYmplY3RWYWx1ZShtYXRjaGNyaXRlcmlhLCBkYXRhKSA9PSB0aGlzLmdldE9iamVjdFZhbHVlKG1hdGNoY3JpdGVyaWEsIHJvdykpIHtcclxuICAgICAgICAgICAgdmFsaWRpdHkgPSB2YWxpZGl0eSAmJiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZhbGlkaXR5ID0gdmFsaWRpdHkgJiYgZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHZhbGlkaXR5ID09IHRydWUpIHtcclxuICAgICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfWVsc2UgaWYgKGRhdGEuX2lkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBpbmRleCA9IHRoaXMuZ2V0SW5kZXhJbkFycmF5QnlJZChncmlkRGF0YSwgZGF0YS5faWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaW5kZXggPSBpbmR4O1xyXG4gICAgfVxyXG4gICAgaWYoaW5kZXggJiYgaW5kZXggIT0gaW5keCAmJiBmaWx0ZXJWYWx1ZSA9PSAnJyl7XHJcbiAgICAgIGluZGV4ID0gaW5keDtcclxuICAgIH1cclxuICAgIHJldHVybiBpbmRleDtcclxuICB9XHJcbiAgZ2V0SW5kZXhJbkFycmF5QnlJZChhcnJheTphbnksaWQ6YW55LGtleT86YW55KXtcclxuICAgIGxldCBpbmRleCA9IC0xO1xyXG4gICAgaWYoYXJyYXkgJiYgYXJyYXkubGVuZ3RoID4gMCl7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaV07XHJcbiAgICAgICAgaWYoa2V5ICE9IHVuZGVmaW5lZCAmJiBrZXkgIT0gbnVsbCl7XHJcbiAgICAgICAgICBpZih0aGlzLmlzQXJyYXkoa2V5KSAmJiBrZXkubGVuZ3RoID4gMCAmJiBPYmplY3Qua2V5cyhpZCkubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldE1hdGNoaW5nSW5MaXN0KGtleSxpZCxlbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkVmFsdWUgPSB0aGlzLmdldE9iamVjdFZhbHVlKGtleSxlbGVtZW50KTtcclxuICAgICAgICAgICAgaWYoaWQgJiYgaWQgPT0gaWRWYWx1ZSl7XHJcbiAgICAgICAgICAgICAgaW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2UgaWYoZWxlbWVudC5faWQgJiYgZWxlbWVudC5faWQgPT0gaWQpe1xyXG4gICAgICAgICAgaW5kZXggPSBpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGluZGV4O1xyXG4gIH1cclxuICBvcGVuTW9kYWwoaWQ6YW55LCBkYXRhOmFueSl7XHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKGlkLCBkYXRhKTtcclxuICB9XHJcbiAgZ2V0T3BlcmF0b3JTeW1ib2wob3BlcmF0b3I6YW55KXtcclxuICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcclxuICAgICAgY2FzZSAnZXEnOlxyXG4gICAgICAgIHJldHVybiAnPSc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICc9JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdldFJvdXRoUXVlcnlUb1JlZGlyZWN0VXJsKCl7XHJcbiAgLy8gICBjb25zdCByZWRpcmVjdFVybDphbnkgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFJlZGlyZWN0VXJsKCk7XHJcbiAgLy8gICAgIGxldCBzZWFyY2hLZXkgPSAnJztcclxuICAvLyAgICAgaWYocmVkaXJlY3RVcmwuaW5kZXhPZignPycpICE9IC0xICl7XHJcbiAgLy8gICAgICAgc2VhcmNoS2V5ID0gJz8nO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGlmKHJlZGlyZWN0VXJsLmluZGV4T2YoJyUnKSAhPSAtMSl7XHJcbiAgLy8gICAgICAgc2VhcmNoS2V5ID0gJyUnO1xyXG4gIC8vICAgICB9XHJcblxyXG4gIC8vICAgICBsZXQgbmV3VXJsV2l0aFF1ZXJ5ID0gJyc7XHJcbiAgLy8gICAgIGlmKHNlYXJjaEtleSAhPSAnJyl7XHJcbiAgLy8gICAgICAgY29uc3QgaW5kZXggPSByZWRpcmVjdFVybC5pbmRleE9mKHNlYXJjaEtleSk7XHJcbiAgLy8gICAgICAgY29uc3Qgc3RyaW5nTGVuZ3RoID0gcmVkaXJlY3RVcmwubGVuZ3RoO1xyXG4gIC8vICAgICAgIGNvbnN0IHF1ZXJ5UHJhbXMgPSByZWRpcmVjdFVybC5zdWJzdHJpbmcoaW5kZXgsc3RyaW5nTGVuZ3RoKTtcclxuICAvLyAgICAgICBjb25zdCBuZXdQYXJhbSA9IHF1ZXJ5UHJhbXMucmVwbGFjZSgnJTNGJywnJyk7XHJcbiAgLy8gICAgICAgbmV3VXJsV2l0aFF1ZXJ5ID0gbmV3UGFyYW0ucmVwbGFjZSgnJTNEJywnOicpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIHJldHVybiB7bmV3VXJsV2l0aFF1ZXJ5fTtcclxuICAvLyB9XHJcblxyXG4gIGdldEZvcm1EYXRhSW5NdWx0aWZvcm1Db2xsZWN0aW9uKG11bHRpZm9ybUNvbGxlY3Rpb246YW55LGZvcm1WYWx1ZTphbnksaW5kZXg/OmFueSl7XHJcbiAgICBsZXQgZGF0YTphbnkgPSB7fTtcclxuICAgICAgaWYoaW5kZXg+PTAgJiYgbXVsdGlmb3JtQ29sbGVjdGlvbiAmJiBtdWx0aWZvcm1Db2xsZWN0aW9uLmxlbmd0aCA+PSAxICYmIG11bHRpZm9ybUNvbGxlY3Rpb25baW5kZXhdICYmIG11bHRpZm9ybUNvbGxlY3Rpb25baW5kZXhdWydkYXRhJ10pe1xyXG4gICAgICAgICBkYXRhID0gbXVsdGlmb3JtQ29sbGVjdGlvbltpbmRleF1bJ2RhdGEnXTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgbGV0IGR1bW15RGF0YTphbnkgPSB7fTtcclxuICAgICAgICBpZihtdWx0aWZvcm1Db2xsZWN0aW9uICYmIG11bHRpZm9ybUNvbGxlY3Rpb24ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIG11bHRpZm9ybUNvbGxlY3Rpb24uZm9yRWFjaCgoZWxlbWVudDphbnksaW5kZXg6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgbGV0IGN1cnJlbnREYXRhOmFueSA9e307XHJcbiAgICAgICAgICAgICAgaWYoZWxlbWVudC5kYXRhKXtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhID0gZWxlbWVudC5kYXRhO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZihpbmRleCA9PSAwKXtcclxuICAgICAgICAgICAgICAgIGR1bW15RGF0YSA9IGN1cnJlbnREYXRhO1xyXG4gICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY3VycmVudERhdGEpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgZHVtbXlEYXRhW2tleV0gPSBjdXJyZW50RGF0YVtrZXldO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKE9iamVjdC5rZXlzKGZvcm1WYWx1ZSkubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICBPYmplY3Qua2V5cyhmb3JtVmFsdWUpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgZHVtbXlEYXRhW2tleV0gPSBmb3JtVmFsdWVba2V5XTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkYXRhID0gZHVtbXlEYXRhO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgY29udmVydExpc3RPZlN0cmluZ1RvTGlzdE9iamVjdChsaXN0X29mX3BvcHVsYXRlZF9maWVsZHM6YW55LGtleXNMaXN0OmFueSxzZXByYXRvcjphbnkpe1xyXG4gICAgbGV0IGxpc3RPZk9iamVjdHM6YW55ID0gW107XHJcbiAgICBsaXN0X29mX3BvcHVsYXRlZF9maWVsZHMuZm9yRWFjaCgoZWxlbWVudDogc3RyaW5nKSA9PiB7XHJcbiAgICBsZXQgb2JqZWN0OmFueSA9IHt9XHJcbiAgICBsZXQgc291cmNlX3RhcmdldExpc3Q6YW55ID0gZWxlbWVudC5zcGxpdChzZXByYXRvcik7XHJcbiAgICBrZXlzTGlzdC5mb3JFYWNoKChrZXk6IHN0cmluZyxpOiBzdHJpbmcpID0+IHtcclxuICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2VfdGFyZ2V0TGlzdFtpXTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxpc3RPZk9iamVjdHMucHVzaChvYmplY3QpO1xyXG4gIH0pO1xyXG4gICByZXR1cm4gbGlzdE9mT2JqZWN0cztcclxuICB9XHJcblxyXG4gIC8vIENvbW1lbnRpbmcgdW51c2VkIEZ1bmN0aW9uXHJcbiAgLy8gdXBkYXRlVXNlclByZWZlcmVuY2UoZGF0YTpvYmplY3QsZmllbGROYW1lOnN0cmluZyxwYXJlbnQ/OnN0cmluZyl7XHJcbiAgLy8gICBsZXQgcGF5bG9hZERhdGEgPSB0aGlzLmdldFVzZXJQcmVmZXJlbmNlT2JqKGRhdGEsZmllbGROYW1lLHBhcmVudCk7XHJcbiAgLy8gICBsZXQgcGF5bG9hZCA9IHtcclxuICAvLyAgICAgXCJjdXJUZW1wXCIgOiBcInVzZXJfcHJlZmVyZW5jZVwiLFxyXG4gIC8vICAgICBcImRhdGFcIiA6IHBheWxvYWREYXRhXHJcbiAgLy8gICB9XHJcbiAgLy8gICB0aGlzLmFwaVNlcnZpY2UuU2F2ZUZvcm1EYXRhKHBheWxvYWQpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0VXNlclByZWZlcmVuY2VCeUZpZWxkTmFtZShmaWVsZE5hbWU6c3RyaW5nKXtcclxuICAvLyAgIGxldCBkYXRhID0gW107XHJcbiAgLy8gICBsZXQgdXNlclByZWZlcmVuY2UgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJQcmVmZXJlbmNlKCk7XHJcbiAgLy8gICBpZih1c2VyUHJlZmVyZW5jZSAmJiB1c2VyUHJlZmVyZW5jZVtmaWVsZE5hbWVdKXtcclxuICAvLyAgICAgZGF0YSA9IHVzZXJQcmVmZXJlbmNlW2ZpZWxkTmFtZV07XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gZGF0YTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldFVzZXJQcmVmZXJlbmNlT2JqKGRhdGE6YW55LGZpZWxkTmFtZTpzdHJpbmcscGFyZW50PzpzdHJpbmcpe1xyXG4gIC8vICAgbGV0IHJlZk9iajphbnkgPSB0aGlzLmdldFJlZmVyZW5jZU9iamVjdChkYXRhKTtcclxuICAvLyAgIGlmKHBhcmVudCAhPSAnJyl7XHJcbiAgLy8gICAgIHJlZk9iaiA9IHBhcmVudDtcclxuICAvLyAgIH1cclxuICAvLyAgIGlmKGZpZWxkTmFtZSA9PSBcImZhdm9yaXRlTWVudXNcIil7XHJcbiAgLy8gICAgIHJlZk9iaiA9IGRhdGE7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgdVJlZjphbnkgPSB7fTtcclxuICAvLyAgIGxldCB1c2VyUHJlZmVyZW5jZSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlclByZWZlcmVuY2UoKTtcclxuICAvLyAgIGlmKHVzZXJQcmVmZXJlbmNlICYmIHVzZXJQcmVmZXJlbmNlLl9pZCAmJiB1c2VyUHJlZmVyZW5jZS5faWQgIT0gbnVsbCAmJiB1c2VyUHJlZmVyZW5jZS5faWQgIT0gJycpe1xyXG4gIC8vICAgICBsZXQgZmllbGREYXRhID0gdXNlclByZWZlcmVuY2VbZmllbGROYW1lXTtcclxuICAvLyAgICAgaWYoZmllbGREYXRhICYmIGZpZWxkRGF0YS5sZW5ndGggPiAwKXtcclxuICAvLyAgICAgICBsZXQgbWF0Y2hJbmRleCA9IC0xO1xyXG4gIC8vICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmaWVsZERhdGEubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgLy8gICAgICAgICBjb25zdCBlbGVtZW50ID0gZmllbGREYXRhW2luZGV4XTtcclxuICAvLyAgICAgICAgIGlmKGVsZW1lbnQuX2lkID09IHJlZk9iai5faWQpe1xyXG4gIC8vICAgICAgICAgICBtYXRjaEluZGV4ID0gaW5kZXg7XHJcbiAgLy8gICAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBpZihtYXRjaEluZGV4ICA+IC0xKXtcclxuICAvLyAgICAgICAgIGlmKHBhcmVudCAhPSAnJyl7XHJcbiAgLy8gICAgICAgICAgIGxldCBzdWJtZW51ID0gZmllbGREYXRhW21hdGNoSW5kZXhdLnN1Ym1lbnU7XHJcbiAgLy8gICAgICAgICAgIGxldCBzdWJtZW51TWF0Y2hJbmRleCA9IC0xO1xyXG4gIC8vICAgICAgICAgICBpZihzdWJtZW51ICYmIHN1Ym1lbnUubGVuZ3RoID4gMCl7XHJcbiAgLy8gICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzdWJtZW51Lmxlbmd0aDsgaisrKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBjb25zdCBzdWJNZW51ID0gc3VibWVudVtqXTtcclxuICAvLyAgICAgICAgICAgICAgIGlmKHN1Yk1lbnUuX2lkID09IGRhdGEuX2lkKXtcclxuICAvLyAgICAgICAgICAgICAgICAgc3VibWVudU1hdGNoSW5kZXggPSBqO1xyXG4gIC8vICAgICAgICAgICAgICAgICBicmVhaztcclxuICAvLyAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgaWYoc3VibWVudU1hdGNoSW5kZXggPiAtMSl7XHJcbiAgLy8gICAgICAgICAgICAgc3VibWVudS5zcGxpY2Uoc3VibWVudU1hdGNoSW5kZXgpO1xyXG4gIC8vICAgICAgICAgICAgIGlmKGZpZWxkRGF0YVttYXRjaEluZGV4XS5zdWJtZW51Lmxlbmd0aCA9PSAwKXtcclxuICAvLyAgICAgICAgICAgICAgIGZpZWxkRGF0YS5zcGxpY2UobWF0Y2hJbmRleCk7XHJcbiAgLy8gICAgICAgICAgICAgfWVsc2V7XHJcbiAgLy8gICAgICAgICAgICAgICBmaWVsZERhdGFbbWF0Y2hJbmRleF0uc3VibWVudSA9IHN1Ym1lbnU7XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgICAgICBpZihzdWJtZW51Lmxlbmd0aCA+IDApe1xyXG4gIC8vICAgICAgICAgICAgICAgZmllbGREYXRhW21hdGNoSW5kZXhdLnN1Ym1lbnUucHVzaChkYXRhKTtcclxuICAvLyAgICAgICAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgICAgICAgIGZpZWxkRGF0YVttYXRjaEluZGV4XS5zdWJtZW51ID0gW11cclxuICAvLyAgICAgICAgICAgICAgIGZpZWxkRGF0YVttYXRjaEluZGV4XS5zdWJtZW51LnB1c2goZGF0YSk7XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgICAgZmllbGREYXRhLnNwbGljZShtYXRjaEluZGV4LCAxKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgIGlmKHBhcmVudCAhPSAnJyl7XHJcbiAgLy8gICAgICAgICAgIHJlZk9ialsnc3VibWVudSddID0gW107XHJcbiAgLy8gICAgICAgICAgIHJlZk9ialsnc3VibWVudSddLnB1c2goZGF0YSk7XHJcbiAgLy8gICAgICAgICAgIGZpZWxkRGF0YS5wdXNoKHJlZk9iaik7XHJcbiAgLy8gICAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgICAgZmllbGREYXRhLnB1c2gocmVmT2JqKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1lbHNle1xyXG4gIC8vICAgICAgIGZpZWxkRGF0YSA9IFtdO1xyXG4gIC8vICAgICAgIGZpZWxkRGF0YS5wdXNoKHJlZk9iaik7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgdXNlclByZWZlcmVuY2VbZmllbGROYW1lXSA9IGZpZWxkRGF0YTtcclxuICAvLyAgICAgdVJlZiA9IHVzZXJQcmVmZXJlbmNlO1xyXG4gIC8vICAgfWVsc2V7XHJcbiAgLy8gICAgIGxldCB1c2VyID0gdGhpcy5zdG9yYWdlU2VydmljZS5HZXRVc2VySW5mbygpO1xyXG4gIC8vICAgICBsZXQgdXNlclJlZiA9IHRoaXMuZ2V0UmVmZXJlbmNlT2JqZWN0KHVzZXIpO1xyXG4gIC8vICAgICBsZXQgZGF0YUxpc3QgPSBbXTtcclxuICAvLyAgICAgZGF0YUxpc3QucHVzaChyZWZPYmopO1xyXG4gIC8vICAgICB1UmVmWyd1c2VySWQnXSA9IHVzZXJSZWY7XHJcbiAgLy8gICAgIHVSZWZbZmllbGROYW1lXSA9IGRhdGFMaXN0O1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIHVSZWZcclxuICAvLyB9XHJcbiAgZ2V0UmVmZXJlbmNlT2JqZWN0KG9iajphbnkpe1xyXG4gICAgbGV0IHJlZjphbnkgPSB7fVxyXG4gICAgcmVmW1wiX2lkXCJdPW9iai5faWQ7XHJcbiAgICByZWZbXCJjb2RlXCJdID0gb2JqLmNvZGU7XHJcbiAgICByZWZbXCJuYW1lXCJdID0gb2JqLm5hbWU7XHJcbiAgICBpZihvYmoudmVyc2lvbiAhPSBudWxsKXtcclxuICAgICAgcmVmW1widmVyc2lvblwiXSA9IG9iai52ZXJzaW9uXHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVmO1xyXG4gIH1cclxuICBkYXRlRGlmZihkYXRlU2VudDphbnkpe1xyXG4gICAgbGV0IG9iajphbnk9e307XHJcbiAgICBsZXQgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgZGF0ZVNlbnQgPSBuZXcgRGF0ZShkYXRlU2VudCk7XHJcbiAgICAvLyBsZXQgZGlmZiA9IERhdGUuVVRDKGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksIGN1cnJlbnREYXRlLmdldE1vbnRoKCksIGN1cnJlbnREYXRlLmdldERhdGUoKSkgLSBEYXRlLlVUQyhkYXRlU2VudC5nZXRGdWxsWWVhcigpLCBkYXRlU2VudC5nZXRNb250aCgpLCBkYXRlU2VudC5nZXREYXRlKCkpO1xyXG4gICAgbGV0IGRpZmYgPSBjdXJyZW50RGF0ZS5nZXRUaW1lKCkgLSBkYXRlU2VudC5nZXRUaW1lKCk7XHJcbiAgICBsZXQgZGF5cyA9IE1hdGguZmxvb3IoZGlmZiAvICg2MCAqIDYwICogMjQgKiAxMDAwKSk7XHJcbiAgICBsZXQgaG91cnMgPSBNYXRoLmZsb29yKGRpZmYgLyAoNjAgKiA2MCAqIDEwMDApKSAtIChkYXlzICogMjQpO1xyXG4gICAgbGV0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKGRpZmYgLyAoNjAgKiAxMDAwKSkgLSAoKGRheXMgKiAyNCAqIDYwKSArIChob3VycyAqIDYwKSk7XHJcbiAgICBsZXQgc2Vjb25kcyA9IE1hdGguZmxvb3IoZGlmZiAvIDEwMDApIC0gKChkYXlzICogMjQgKiA2MCAqIDYwKSArIChob3VycyAqIDYwICogNjApICsgKG1pbnV0ZXMgKiA2MCkpO1xyXG4gICAgb2JqWydkYXlzJ10gPSBkYXlzO1xyXG4gICAgb2JqWydob3VycyddID0gaG91cnM7XHJcbiAgICBvYmpbJ21pbnV0ZXMnXSA9IG1pbnV0ZXM7XHJcbiAgICBvYmpbJ3NlY29uZHMnXSA9IHNlY29uZHM7XHJcblxyXG4gICAgIHJldHVybiBvYmo7XHJcbiAgIH1cclxuICAgZ2V0RGF5KGRhdGE6YW55KTpTdHJpbmd7XHJcbiAgICBsZXQgY3JlYXRlZERhdGUgPSBkYXRhLmNyZWF0ZWREYXRlO1xyXG4gICAgaWYoY3JlYXRlZERhdGUpe1xyXG4gICAgICBsZXQgb2JqID0gdGhpcy5kYXRlRGlmZihjcmVhdGVkRGF0ZSk7XHJcbiAgICAgIGlmKG9iaiAmJiBvYmpbJ2RheXMnXSA9PSAwKXtcclxuICAgICAgICBpZihvYmpbJ2hvdXJzJ10gPT0gMCl7XHJcbiAgICAgICAgICByZXR1cm4gb2JqWydtaW51dGVzJ10rXCIgTWludXRlcyBhZ29cIjtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiBvYmpbJ2hvdXJzJ10gK1wiIGhvdXJzIFwiK29ialsnbWludXRlcyddK1wiIE1pbnV0ZXMgYWdvXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICByZXR1cm4gb2JqWydkYXlzJ10gK1wiIGRheXMgYWdvXCI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cclxuICB1cGRhdGVGaWVsZEluTGlzdChmaWVsZE5hbWU6YW55LGxpc3Q6YW55KXtcclxuICAgIGxldCBtb2RpZnlMaXN0OmFueSA9IFtdO1xyXG4gICAgaWYobGlzdCAmJiBsaXN0Lmxlbmd0aCA+IDApe1xyXG4gICAgICBsaXN0LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpO1xyXG4gICAgICAgIHZhbHVlW2ZpZWxkTmFtZV0gPSB0cnVlO1xyXG4gICAgICAgIG1vZGlmeUxpc3QucHVzaCh2YWx1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1vZGlmeUxpc3Q7XHJcbiAgfVxyXG4gIC8vIG1hbnVmYWN0dXJlZF9hc19jdXN0b21lcih0ZW1wbGF0ZUZvcm06IEZvcm1Hcm91cCkge1xyXG4gIC8vICAgKDxGb3JtR3JvdXA+dGVtcGxhdGVGb3JtLmNvbnRyb2xzW1wic2FtcGxlX2RldGFpbHNcIl0pLmNvbnRyb2xzW1wibWZnX2J5XCJdLnBhdGNoVmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlLmFjY291bnQubmFtZSk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzdXBwbGllZF9hc19jdXN0b21lcih0ZW1wbGF0ZUZvcm06IEZvcm1Hcm91cCkge1xyXG4gIC8vICAgKDxGb3JtR3JvdXA+dGVtcGxhdGVGb3JtLmNvbnRyb2xzW1wic2FtcGxlX2RldGFpbHNcIl0pLmNvbnRyb2xzW1wic3VwcGxpZWRfYnlcIl0ucGF0Y2hWYWx1ZSh0ZW1wbGF0ZUZvcm0udmFsdWUuYWNjb3VudC5uYW1lKTtcclxuICAvLyB9XHJcblxyXG4gIGZ1bk1vZGVUcmF2ZWxDaGFuZ2UodmFsdWU6YW55KXtcclxuXHJcbiAgICBsZXQgb2JqMSA9IHtcclxuICAgICAgZGlzdGFuY2VJbkttOicnLFxyXG4gICAgICBsb2NhbFRhOicnXHJcbiAgICB9XHJcbiAgICBsZXQgb2JqID0ge1xyXG4gICAgICBjbGFpbVNoZWV0Om9iajFcclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG4gIHByaW50KGRhdGE6YW55KTogdm9pZCB7XHJcbiAgICBsZXQgcG9wdXBXaW47XHJcbiAgICBwb3B1cFdpbiA9IHdpbmRvdy5vcGVuKCcnLCAnX2JsYW5rJywgJ3RvcD0wLGxlZnQ9MCxoZWlnaHQ9MTAwJSx3aWR0aD1hdXRvJyk7XHJcbiAgICBwb3B1cFdpbiEuZG9jdW1lbnQud3JpdGUoJzxkaXYgY2xhc3M9XCJub3ByaW50XCIgc3R5bGU9XCJ0ZXh0LWFsaWduOnJpZ2h0O1wiPjxhIG9uQ2xpY2s9XCJ3aW5kb3cucHJpbnQoKVwiIHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7ZGlzcGxheTogaW5saW5lLWJsb2NrO2N1cnNvcjogcG9pbnRlcjtib3JkZXI6IDJweCBzb2xpZCAjNDI4NWY0IWltcG9ydGFudDtiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudCFpbXBvcnRhbnQ7Y29sb3I6ICM0Mjg1ZjQhaW1wb3J0YW50O2JveC1zaGFkb3c6IDAgMnB4IDVweCAwIHJnYmEoMCwwLDAsLjE2KSwgMCAycHggMTBweCAwIHJnYmEoMCwwLDAsLjEyKTtwYWRkaW5nOiA3cHggMjVweDtmb250LXNpemU6IC44MXJlbTt0cmFuc2l0aW9uOiAuMnMgZWFzZS1pbi1vdXQ7bWFyZ2luOiAuMzc1cmVtO3RleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XCI+UHJpbnQ8L2E+PC9kaXY+PHN0eWxlPkBtZWRpYSBwcmludHsubm9wcmludHtkaXNwbGF5Om5vbmU7fX08L3N0eWxlPicrZGF0YSk7XHJcbiAgICBwb3B1cFdpbiEuZG9jdW1lbnQuY2xvc2UoKTtcclxuICAgIHBvcHVwV2luIS5wcmludCgpXHJcbiAgfVxyXG4gIGlzQXJyYXkob2JqIDogYW55ICkge1xyXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob2JqKVxyXG4gIH1cclxuXHJcbiAgZG9ub3RSZXNldEZpZWxkKHRhYmxlRmllbGRzOmFueSxGb3JtVmFsdWU6YW55KXtcclxuICAgIGxldCBkb25vdFJlc2V0RmllbGRMaXN0czphbnk9e307XHJcbiAgICB0YWJsZUZpZWxkcy5mb3JFYWNoKCh0YWJsZWZpZWxkOmFueSkgPT4ge1xyXG4gICAgICBpZih0YWJsZWZpZWxkLmRvX25vdF9yZWZyZXNoX29uX2FkZCAmJiB0YWJsZWZpZWxkLnR5cGUgIT0gXCJsaXN0X29mX2ZpZWxkc1wiICYmIHRhYmxlZmllbGQudHlwZSAhPSBcImdyb3VwX29mX2ZpZWxkc1wiICYmIHRhYmxlZmllbGQudHlwZSAhPSBcInN0ZXBwZXJcIil7XHJcbiAgICAgICAgZG9ub3RSZXNldEZpZWxkTGlzdHNbdGFibGVmaWVsZC5maWVsZF9uYW1lXSA9IEZvcm1WYWx1ZVt0YWJsZWZpZWxkLmZpZWxkX25hbWVdO1xyXG4gICAgICB9ZWxzZSBpZih0YWJsZWZpZWxkLnR5cGUgPT0gXCJncm91cF9vZl9maWVsZHNcIil7XHJcbiAgICAgICAgaWYodGFibGVmaWVsZC5saXN0X29mX2ZpZWxkcyAmJiB0YWJsZWZpZWxkLmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgdGFibGVmaWVsZC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChmaWVsZDphbnkpID0+IHtcclxuICAgICAgICAgICAgaWYoZmllbGQuZG9fbm90X3JlZnJlc2hfb25fYWRkKXtcclxuICAgICAgICAgICAgICBkb25vdFJlc2V0RmllbGRMaXN0c1t0YWJsZWZpZWxkLmZpZWxkX25hbWVdW2ZpZWxkLmZpZWxkX25hbWVdID0gRm9ybVZhbHVlW3RhYmxlZmllbGQuZmllbGRfbmFtZV1bZmllbGQuZmllbGRfbmFtZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfWVsc2UgaWYodGFibGVmaWVsZC50eXBlID09IFwic3RlcHBlclwiKXtcclxuICAgICAgICBpZih0YWJsZWZpZWxkLmxpc3Rfb2ZfZmllbGRzICYmIHRhYmxlZmllbGQubGlzdF9vZl9maWVsZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICB0YWJsZWZpZWxkLmxpc3Rfb2ZfZmllbGRzLmZvckVhY2goKHN0ZXA6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmKHN0ZXAubGlzdF9vZl9maWVsZHMgJiYgc3RlcC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICBzdGVwLmxpc3Rfb2ZfZmllbGRzLmZvckVhY2goKGZpZWxkOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoZmllbGQuZG9fbm90X3JlZnJlc2hfb25fYWRkKXtcclxuICAgICAgICAgICAgICAgICAgZG9ub3RSZXNldEZpZWxkTGlzdHNbc3RlcC5maWVsZF9uYW1lXVtmaWVsZC5maWVsZF9uYW1lXSA9IEZvcm1WYWx1ZVtzdGVwLmZpZWxkX25hbWVdW2ZpZWxkLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRvbm90UmVzZXRGaWVsZExpc3RzO1xyXG4gIH1cclxuXHJcbiAgLy8gbW9kaWZ5RmlsZVNldFZhbHVlKGZpbGVzOmFueSl7XHJcbiAgLy8gICBsZXQgZmlsZU5hbWUgPSAnJztcclxuICAvLyAgIGxldCBmaWxlTGVuZ3RoID0gZmlsZXMubGVuZ3RoO1xyXG4gIC8vICAgbGV0IGZpbGUgPSBmaWxlc1swXTtcclxuICAvLyAgIGlmKGZpbGVMZW5ndGggPT0gMSAmJiAoZmlsZS5maWxlTmFtZSB8fCBmaWxlLnJvbGxOYW1lKSl7XHJcbiAgLy8gICAgIGZpbGVOYW1lID0gZmlsZS5maWxlTmFtZSB8fCBmaWxlLnJvbGxOYW1lO1xyXG4gIC8vICAgfWVsc2UgaWYoZmlsZUxlbmd0aCA+IDEpe1xyXG4gIC8vICAgICBmaWxlTmFtZSA9IGZpbGVMZW5ndGggKyBcIiBGaWxlc1wiO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIGZpbGVOYW1lO1xyXG4gIC8vIH1cclxuICAvLyBtb2RpZnlVcGxvYWRGaWxlcyhmaWxlczphbnkpe1xyXG4gIC8vICAgY29uc3QgZmlsZUxpc3Q6YW55ID0gW107XHJcbiAgLy8gICBpZihmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwKXtcclxuICAvLyAgICAgZmlsZXMuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAvLyAgICAgICBpZihlbGVtZW50Ll9pZCl7XHJcbiAgLy8gICAgICAgICBmaWxlTGlzdC5wdXNoKGVsZW1lbnQpXHJcbiAgLy8gICAgICAgfWVsc2V7XHJcbiAgLy8gICAgICAgICBpZighZWxlbWVudC51cGxvYWREYXRhKXtcclxuICAvLyAgICAgICAgICAgZmlsZUxpc3QucHVzaCh7dXBsb2FkRGF0YTpbZWxlbWVudF19KTtcclxuICAvLyAgICAgICAgIH1lbHNle1xyXG4gIC8vICAgICAgICAgICBmaWxlTGlzdC5wdXNoKGVsZW1lbnQpO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gZmlsZUxpc3Q7XHJcbiAgLy8gfVxyXG4gIGdldEZpcnN0Q2hhck9mU3RyaW5nKGNoYXI6YW55KXtcclxuICAgIGlmKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGNoYXIpKXtcclxuICAgICAgcmV0dXJuIGNoYXIuY2hhckF0KDApXHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gIH1cclxuICByZW1vdmVJdGVtKGRhdGE6YW55LGNvbHVtbjphbnksaTpudW1iZXIpe1xyXG4gICAgZGF0YVtjb2x1bW4uZmllbGRfbmFtZV0uc3BsaWNlKGksMSk7XHJcbiAgICByZXR1cm4gZGF0YVtjb2x1bW4uZmllbGRfbmFtZV07XHJcbiAgfVxyXG4gIGNoZWNrT2JqZWNPclN0cmluZyhkYXRhOmFueSl7XHJcbiAgICBpZihkYXRhLl9pZCl7XHJcbiAgICAgIHJldHVybiBkYXRhLl9pZDtcclxuICAgIH1lbHNle1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvcHlHcmlkQ2VsbFRleHQodmFsdWU6YW55KXtcclxuICAgIGlmKHZhbHVlKXtcclxuICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodmFsdWUpO1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KFwiYmctc3VjY2Vzc1wiLFwiVGV4dCBDb3BpZWRcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb3B5R3JpZENvbHVtblRleHQoaGVhZDphbnksZGF0YTphbnksZWxlbWVudHM/OmFueSl7XHJcbiAgICBsZXQgY29sdW1uRGF0YSA9IFwiXCI7XHJcbiAgICBpZihkYXRhLmxlbmd0aD4wKXtcclxuICAgICAgbGV0IGZpZWxkX25hbWU9aGVhZC5maWVsZF9uYW1lO1xyXG4gICAgICBpZihoZWFkLnR5cGUgPT0gXCJpbmZvXCIgJiYgZWxlbWVudHMgJiYgZWxlbWVudHMubGVuZ3RoPjApe1xyXG4gICAgICAgIGlmKGhlYWQuZ3JpZENvbHVtbnMpe1xyXG4gICAgICAgICAgbGV0IGNoaWxkR3JpZENvbHVtbiA9IGhlYWQuZ3JpZENvbHVtbnM7XHJcbiAgICAgICAgICBsZXQgY2hpbGRGaWVsZE5hbWUgPSBjaGlsZEdyaWRDb2x1bW5bMF1bJ2ZpZWxkX25hbWUnXTtcclxuICAgICAgICAgIGNvbHVtbkRhdGE9ZWxlbWVudHMubWFwKChlbGU6YW55KT0+e1xyXG4gICAgICAgICAgICBsZXQgY2hpbGREYXRhO1xyXG4gICAgICAgICAgICBpZihlbGVbZmllbGRfbmFtZV0gJiYgdGhpcy5pc0FycmF5KGVsZVtmaWVsZF9uYW1lXSkgJiYgZWxlW2ZpZWxkX25hbWVdLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgIGNoaWxkRGF0YT0gZWxlW2ZpZWxkX25hbWVdLm1hcCgoY2hpZERhdGE6YW55KSA9PntcclxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlkRGF0YVtjaGlsZEZpZWxkTmFtZV07XHJcbiAgICAgICAgICAgICAgfSkuam9pbignXFxuJykudHJpbSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjaGlsZERhdGE7XHJcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS50cmltKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBjb2x1bW5EYXRhPWRhdGEubWFwKChlbGU6YW55KT0+e1xyXG4gICAgICAgICAgaWYoZWxlW2ZpZWxkX25hbWVdIT11bmRlZmluZWQpIHJldHVybiBlbGVbZmllbGRfbmFtZV07XHJcbiAgICAgICAgfSkuam9pbignXFxuJykudHJpbSgpO1xyXG4gICAgICB9XHJcbiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvbHVtbkRhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|