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,830 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../common-utils/common-function.service";
|
|
5
|
+
import * as i2 from "./../storage/storage.service";
|
|
6
|
+
import * as i3 from "../notify/notification.service";
|
|
7
|
+
export class CheckIfService {
|
|
8
|
+
constructor(commonFunctionService, storageService, notificationService) {
|
|
9
|
+
this.commonFunctionService = commonFunctionService;
|
|
10
|
+
this.storageService = storageService;
|
|
11
|
+
this.notificationService = notificationService;
|
|
12
|
+
}
|
|
13
|
+
checkIsDisable(parent, chield, updateMode, formValue, templateForm) {
|
|
14
|
+
let responce = {
|
|
15
|
+
tobedesabled: '',
|
|
16
|
+
templateForm: templateForm
|
|
17
|
+
};
|
|
18
|
+
if (parent == '') {
|
|
19
|
+
responce.tobedesabled = this.isDisable(chield, updateMode, formValue);
|
|
20
|
+
if (responce.tobedesabled) {
|
|
21
|
+
if (!responce.templateForm.controls[chield.field_name].disabled) {
|
|
22
|
+
responce.templateForm.controls[chield.field_name].disable();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
if (responce.templateForm.controls[chield.field_name].disabled) {
|
|
27
|
+
responce.templateForm.controls[chield.field_name].enable();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
responce.tobedesabled = this.isDisable(chield, updateMode, formValue);
|
|
33
|
+
if (responce.tobedesabled) {
|
|
34
|
+
responce.templateForm.controls[parent].controls[chield.field_name].disable();
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
responce.templateForm.controls[parent].controls[chield.field_name].enable();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return responce;
|
|
41
|
+
}
|
|
42
|
+
checkIsMendetory(parent, chield, formValue, templateForm) {
|
|
43
|
+
let responce = {
|
|
44
|
+
tobedesabled: '',
|
|
45
|
+
templateForm: templateForm
|
|
46
|
+
};
|
|
47
|
+
if (parent == '') {
|
|
48
|
+
responce.tobedesabled = this.isMendetory(chield, formValue);
|
|
49
|
+
if (responce.tobedesabled) {
|
|
50
|
+
if (responce.templateForm.controls[chield.field_name].status == 'VALID') {
|
|
51
|
+
responce.templateForm.controls[chield.field_name].setValidators([Validators.required]);
|
|
52
|
+
responce.templateForm.controls[chield.field_name].updateValueAndValidity();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
if (responce.templateForm.controls[chield.field_name].status == 'INVALID') {
|
|
57
|
+
responce.templateForm.controls[chield.field_name].clearValidators();
|
|
58
|
+
responce.templateForm.controls[chield.field_name].updateValueAndValidity();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
responce.tobedesabled = this.isMendetory(chield, formValue);
|
|
64
|
+
if (responce.tobedesabled) {
|
|
65
|
+
if (responce.templateForm.controls[parent].controls[chield.field_name].status == 'VALID') {
|
|
66
|
+
responce.templateForm.controls[parent].controls[chield.field_name].setValidators([Validators.required]);
|
|
67
|
+
responce.templateForm.controls[parent].controls[chield.field_name].updateValueAndValidity();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
if (responce.templateForm.controls[parent].controls[chield.field_name].status == 'INVALID') {
|
|
72
|
+
responce.templateForm.controls[parent].controls[chield.field_name].clearValidators();
|
|
73
|
+
responce.templateForm.controls[parent].controls[chield.field_name].updateValueAndValidity();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return responce;
|
|
78
|
+
}
|
|
79
|
+
checkShowIfListOfFiedlds(parent, field, formValue) {
|
|
80
|
+
//let formValue = this.getFormValue(true);
|
|
81
|
+
let fieldValue = formValue[parent];
|
|
82
|
+
if (fieldValue && fieldValue.length > 0 && field && field.show_if && field.show_if != null && field.show_if != '') {
|
|
83
|
+
let check = 0;
|
|
84
|
+
for (let index = 0; index < fieldValue.length; index++) {
|
|
85
|
+
const value = fieldValue[index];
|
|
86
|
+
formValue[parent] = value;
|
|
87
|
+
if (this.showIf(field, formValue)) {
|
|
88
|
+
check = 1;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (check == 1) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
checkAddNewButtonOnGridSelection(buttons) {
|
|
104
|
+
let check = false;
|
|
105
|
+
if (buttons && buttons.length > 0) {
|
|
106
|
+
for (let i = 0; i < buttons.length; i++) {
|
|
107
|
+
const btn = buttons[i];
|
|
108
|
+
if (btn && btn.onclick && btn.onclick.api && btn.onclick.api == "save") {
|
|
109
|
+
check = true;
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return check;
|
|
115
|
+
}
|
|
116
|
+
checkFieldShowOrHide(field, showIfFieldList) {
|
|
117
|
+
let check = false;
|
|
118
|
+
for (let index = 0; index < showIfFieldList.length; index++) {
|
|
119
|
+
const element = showIfFieldList[index];
|
|
120
|
+
if (element.field_name == field.field_name) {
|
|
121
|
+
if (element.show) {
|
|
122
|
+
check = true;
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
check = false;
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return check;
|
|
132
|
+
}
|
|
133
|
+
checkDublicateOnForm(fields, value, list, i, showIfFieldList, custmizedFormValue, dataListForUpload, templateForm, parent) {
|
|
134
|
+
let checkDublic = {
|
|
135
|
+
status: false,
|
|
136
|
+
msg: ""
|
|
137
|
+
};
|
|
138
|
+
if (fields && fields.length > 0) {
|
|
139
|
+
let checkValue = 0;
|
|
140
|
+
let field_control = "";
|
|
141
|
+
let list_of_field_data = value;
|
|
142
|
+
for (let index = 0; index < fields.length; index++) {
|
|
143
|
+
const element = fields[index];
|
|
144
|
+
let custmizedKey = '';
|
|
145
|
+
let custmizedData = '';
|
|
146
|
+
if (parent && parent != '') {
|
|
147
|
+
custmizedKey = this.commonFunctionService.custmizedKey(parent);
|
|
148
|
+
field_control = templateForm.controls[parent.field_name];
|
|
149
|
+
}
|
|
150
|
+
if (custmizedKey && custmizedKey != '') {
|
|
151
|
+
if (custmizedFormValue[custmizedKey] && custmizedFormValue[custmizedKey][element.field_name]) {
|
|
152
|
+
custmizedData = custmizedFormValue[custmizedKey][element.field_name];
|
|
153
|
+
}
|
|
154
|
+
if (dataListForUpload[custmizedKey] && dataListForUpload[custmizedKey][element.field_name]) {
|
|
155
|
+
custmizedData = dataListForUpload[custmizedKey][element.field_name];
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
if (custmizedFormValue[element.field_name] && custmizedFormValue[element.field_name].length > 0) {
|
|
160
|
+
custmizedData = custmizedFormValue[element.field_name];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
let mendatory = false;
|
|
164
|
+
if (element.is_mandatory) {
|
|
165
|
+
if (element && element.show_if && element.show_if != '') {
|
|
166
|
+
if (this.checkFieldShowOrHide(element, showIfFieldList)) {
|
|
167
|
+
mendatory = true;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
mendatory = false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
mendatory = true;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
switch (element.datatype) {
|
|
178
|
+
case 'list_of_object':
|
|
179
|
+
if (list_of_field_data[element.field_name] == '' || list_of_field_data[element.field_name] == null) {
|
|
180
|
+
if (mendatory && custmizedData == '') {
|
|
181
|
+
if (custmizedData.length == 0) {
|
|
182
|
+
checkValue = 1;
|
|
183
|
+
checkDublic.status = true;
|
|
184
|
+
checkDublic.msg = "Please Enter " + element.label;
|
|
185
|
+
//this.notificationService.notify("bg-danger", "Please Enter " + element.label);
|
|
186
|
+
return checkDublic;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
checkDublic.status = true;
|
|
192
|
+
checkDublic.msg = 'Entered value for ' + element.label + ' is not valid. !!!';
|
|
193
|
+
//this.notificationService.notify('bg-danger','Entered value for '+element.label+' is not valid. !!!');
|
|
194
|
+
return checkDublic;
|
|
195
|
+
}
|
|
196
|
+
break;
|
|
197
|
+
case 'object':
|
|
198
|
+
if (list_of_field_data[element.field_name] == '' || list_of_field_data[element.field_name] == null) {
|
|
199
|
+
if (mendatory) {
|
|
200
|
+
checkValue = 1;
|
|
201
|
+
checkDublic.status = true;
|
|
202
|
+
checkDublic.msg = "Please Enter " + element.label;
|
|
203
|
+
//this.notificationService.notify("bg-danger", "Please Enter " + element.label);
|
|
204
|
+
return checkDublic;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else if (typeof list_of_field_data[element.field_name] != 'object') {
|
|
208
|
+
checkDublic.status = true;
|
|
209
|
+
checkDublic.msg = 'Entered value for ' + element.label + ' is not valid. !!!';
|
|
210
|
+
//this.notificationService.notify('bg-danger','Entered value for '+element.label+' is not valid. !!!');
|
|
211
|
+
return checkDublic;
|
|
212
|
+
}
|
|
213
|
+
break;
|
|
214
|
+
default:
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
switch (element.type) {
|
|
218
|
+
case 'list_of_string':
|
|
219
|
+
if (list_of_field_data[element.field_name] == '' || list_of_field_data[element.field_name] == null) {
|
|
220
|
+
if (mendatory && custmizedData == '') {
|
|
221
|
+
if (custmizedData.length == 0) {
|
|
222
|
+
checkValue = 1;
|
|
223
|
+
checkDublic.status = true;
|
|
224
|
+
checkDublic.msg = "Please Enter " + element.label;
|
|
225
|
+
//this.notificationService.notify("bg-danger", "Please Enter " + element.label);
|
|
226
|
+
return checkDublic;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
checkDublic.status = true;
|
|
232
|
+
checkDublic.msg = 'Entered value for ' + element.label + ' is not valid. !!!';
|
|
233
|
+
//this.notificationService.notify('bg-danger','Entered value for '+element.label+' is not valid. !!!');
|
|
234
|
+
return checkDublic;
|
|
235
|
+
}
|
|
236
|
+
break;
|
|
237
|
+
case 'file':
|
|
238
|
+
if (mendatory && custmizedData == '') {
|
|
239
|
+
if (custmizedData.length == 0) {
|
|
240
|
+
checkValue = 1;
|
|
241
|
+
checkDublic.status = true;
|
|
242
|
+
checkDublic.msg = "Please Enter " + element.label;
|
|
243
|
+
//this.notificationService.notify("bg-danger", "Please Enter " + element.label);
|
|
244
|
+
return checkDublic;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
break;
|
|
248
|
+
case 'typeahead':
|
|
249
|
+
if (element.datatype == "text") {
|
|
250
|
+
if (list_of_field_data[element.field_name] == '' || list_of_field_data[element.field_name] == null) {
|
|
251
|
+
if (mendatory) {
|
|
252
|
+
if (custmizedData.length == 0) {
|
|
253
|
+
checkValue = 1;
|
|
254
|
+
checkDublic.status = true;
|
|
255
|
+
checkDublic.msg = "Please Enter " + element.label;
|
|
256
|
+
//this.notificationService.notify("bg-danger", "Please Enter " + element.label);
|
|
257
|
+
return checkDublic;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
else if (field_control && field_control != "") {
|
|
262
|
+
if (field_control.get(element.field_name).errors?.required || field_control.get(element.field_name).errors?.validDataText) {
|
|
263
|
+
checkDublic.status = true;
|
|
264
|
+
checkDublic.msg = 'Entered value for ' + element.label + ' is invalidData. !!!';
|
|
265
|
+
//this.notificationService.notify('bg-danger','Entered value for '+element.label+' is invalidData. !!!');
|
|
266
|
+
return checkDublic;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
break;
|
|
271
|
+
default:
|
|
272
|
+
if (list_of_field_data[element.field_name] == '' || list_of_field_data[element.field_name] == null) {
|
|
273
|
+
if (mendatory) {
|
|
274
|
+
checkValue = 1;
|
|
275
|
+
checkDublic.msg = "Please Enter " + element.label;
|
|
276
|
+
//this.notificationService.notify("bg-danger", "Please Enter " + element.label);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
if (element.primary_key_for_list) {
|
|
282
|
+
let primary_key_field_value = value[element.field_name];
|
|
283
|
+
let alreadyAdded = {
|
|
284
|
+
status: false,
|
|
285
|
+
msg: ""
|
|
286
|
+
};
|
|
287
|
+
if (list && list.length > 0) {
|
|
288
|
+
alreadyAdded = this.checkDataAlreadyAddedInListOrNot(element, primary_key_field_value, list, i);
|
|
289
|
+
}
|
|
290
|
+
if (alreadyAdded && alreadyAdded.status) {
|
|
291
|
+
checkDublic.status = true;
|
|
292
|
+
if (alreadyAdded.msg && alreadyAdded.msg != "") {
|
|
293
|
+
checkDublic.msg = alreadyAdded.msg;
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
checkDublic.msg = "Entered value for " + element.label + " is already added. !!!";
|
|
297
|
+
}
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
;
|
|
303
|
+
if (checkValue == 1) {
|
|
304
|
+
checkDublic.status = true;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return checkDublic;
|
|
308
|
+
}
|
|
309
|
+
isGridFieldExist(tab, fieldName) {
|
|
310
|
+
if (tab.grid && tab.grid[fieldName] && tab.grid[fieldName] != undefined && tab.grid[fieldName] != null && tab.grid[fieldName] != '') {
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
return false;
|
|
314
|
+
}
|
|
315
|
+
checkShowIf(field, selectedRow, formValue) {
|
|
316
|
+
const objectc = selectedRow ? selectedRow : {};
|
|
317
|
+
const object = JSON.parse(JSON.stringify(objectc));
|
|
318
|
+
if (formValue && typeof formValue == 'object' && Object.keys(formValue).length > 0) {
|
|
319
|
+
Object.keys(formValue).forEach(key => {
|
|
320
|
+
object[key] = formValue[key];
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
const display = this.showIf(field, object);
|
|
324
|
+
const modifiedField = JSON.parse(JSON.stringify(field));
|
|
325
|
+
modifiedField['display'] = display;
|
|
326
|
+
field = modifiedField;
|
|
327
|
+
return display;
|
|
328
|
+
}
|
|
329
|
+
showIf(field, formValue) {
|
|
330
|
+
if (field.show_if && field.show_if != null && field.show_if != '') {
|
|
331
|
+
const showIf = field.show_if.split(';');
|
|
332
|
+
let checkIf = true;
|
|
333
|
+
for (let index = 0; index < showIf.length; index++) {
|
|
334
|
+
checkIf = this.checkIfConditionForArrayListValue(showIf[index], formValue);
|
|
335
|
+
if (!checkIf) {
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (checkIf) {
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
checkIfConditionForArrayListValue(data, formValue) {
|
|
351
|
+
let condition = [];
|
|
352
|
+
condition = data.split('#');
|
|
353
|
+
if (condition.length == 4 && condition[3] != 'dynamic' && condition[3] != 'STATIC') {
|
|
354
|
+
let check = "";
|
|
355
|
+
let checkList = [];
|
|
356
|
+
let setValue = formValue ? this.commonFunctionService.getObjectValue(condition[0], formValue) : "";
|
|
357
|
+
if (setValue && setValue.length > 0) {
|
|
358
|
+
for (let index = 0; index < setValue.length; index++) {
|
|
359
|
+
const element = setValue[index];
|
|
360
|
+
let value = this.commonFunctionService.getObjectValue(condition[3], element);
|
|
361
|
+
if (value && value != '') {
|
|
362
|
+
check = check + value + "#";
|
|
363
|
+
for (let index = 0; index < condition.length; index++) {
|
|
364
|
+
const conditons = condition[index];
|
|
365
|
+
if (index == 1) {
|
|
366
|
+
check = check + conditons + '#';
|
|
367
|
+
}
|
|
368
|
+
else if (index == 2) {
|
|
369
|
+
check = check + conditons + '#STATIC';
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
checkList.push(check);
|
|
373
|
+
check = "";
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
if (checkList && checkList.length > 0) {
|
|
384
|
+
for (let index = 0; index < checkList.length; index++) {
|
|
385
|
+
const condition = checkList[index];
|
|
386
|
+
let result = this.checkIfCondition(condition, formValue);
|
|
387
|
+
if (result) {
|
|
388
|
+
return true;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
return false;
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
return this.checkIfCondition(data, formValue);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
isDisable(tableField, updateMode, formValue) {
|
|
402
|
+
if (tableField.is_disabled) {
|
|
403
|
+
return true;
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
if (tableField.disable_if && tableField.disable_if != '') {
|
|
407
|
+
return this.checkIfCondition(tableField.disable_if, formValue);
|
|
408
|
+
}
|
|
409
|
+
if (updateMode) {
|
|
410
|
+
if (tableField.disable_on_update != undefined && tableField.disable_on_update) {
|
|
411
|
+
return this.checkAddUpdateIf(tableField, 'can_update_if');
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
return false;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
if (tableField.disable_on_add != undefined && tableField.disable_on_add) {
|
|
419
|
+
return this.checkAddUpdateIf(tableField, 'can_add_if');
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
return false;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
is_check_role(id) {
|
|
428
|
+
const userInfo = this.storageService.GetUserInfo();
|
|
429
|
+
let check = 0;
|
|
430
|
+
if (userInfo.roles && userInfo.roles != null && userInfo.roles != "" && this.commonFunctionService.isArray(userInfo.roles) && userInfo.roles.length > 0) {
|
|
431
|
+
for (let index = 0; index < userInfo.roles.length; index++) {
|
|
432
|
+
const element = userInfo.roles[index];
|
|
433
|
+
if (element._id == id) {
|
|
434
|
+
check = 1;
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
check = 0;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
check = 0;
|
|
444
|
+
}
|
|
445
|
+
if (check == 1) {
|
|
446
|
+
return true;
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
return false;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
isMendetory(tableField, formValue) {
|
|
453
|
+
if (tableField.is_mandatory) {
|
|
454
|
+
return true;
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
if (tableField.mandatory_if && tableField.mandatory_if != '') {
|
|
458
|
+
return this.checkIfCondition(tableField.mandatory_if, formValue);
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
return false;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
checkIfCondition(data, formValue, datatype) {
|
|
466
|
+
let condition = [];
|
|
467
|
+
condition = data.split('#');
|
|
468
|
+
if (condition.length >= 2) {
|
|
469
|
+
if (condition[3] != null && condition[3] != "" && condition[3] == 'dynamic') {
|
|
470
|
+
condition[2] = this.commonFunctionService.getObjectValue(condition[2], formValue) + "";
|
|
471
|
+
}
|
|
472
|
+
let setValue = "";
|
|
473
|
+
if (condition.length > 3 && condition[3] == 'STATIC') {
|
|
474
|
+
setValue = condition[0];
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
setValue = formValue ? this.commonFunctionService.getObjectValue(condition[0], formValue) : "";
|
|
478
|
+
}
|
|
479
|
+
if (setValue === undefined || setValue === "") {
|
|
480
|
+
setValue = "";
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
setValue = setValue + "";
|
|
484
|
+
}
|
|
485
|
+
if (datatype) {
|
|
486
|
+
switch (datatype) {
|
|
487
|
+
case "date":
|
|
488
|
+
setValue = this.commonFunctionService.dateFormat(setValue);
|
|
489
|
+
condition[2] = this.commonFunctionService.dateFormat(condition[2]);
|
|
490
|
+
break;
|
|
491
|
+
default:
|
|
492
|
+
break;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
switch (condition[1]) {
|
|
496
|
+
case 'eq':
|
|
497
|
+
case 'equal':
|
|
498
|
+
if (condition.length > 2) {
|
|
499
|
+
//console.log('setValue');
|
|
500
|
+
return setValue === condition[2];
|
|
501
|
+
}
|
|
502
|
+
else {
|
|
503
|
+
return JSON.parse(setValue);
|
|
504
|
+
}
|
|
505
|
+
case 'in':
|
|
506
|
+
if ((condition[2].split(":")).includes(setValue)) {
|
|
507
|
+
return true;
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
return false;
|
|
511
|
+
}
|
|
512
|
+
case 'nin':
|
|
513
|
+
if (!(condition[2].split(":")).includes(setValue)) {
|
|
514
|
+
return true;
|
|
515
|
+
}
|
|
516
|
+
else {
|
|
517
|
+
return false;
|
|
518
|
+
}
|
|
519
|
+
case 'gte':
|
|
520
|
+
return parseFloat(setValue) >= parseFloat(condition[2]);
|
|
521
|
+
case 'lte':
|
|
522
|
+
return parseFloat(setValue) <= parseFloat(condition[2]);
|
|
523
|
+
case 'exists':
|
|
524
|
+
if (setValue != null && setValue != undefined && setValue != '' && setValue != 'null') {
|
|
525
|
+
return true;
|
|
526
|
+
}
|
|
527
|
+
else {
|
|
528
|
+
return false;
|
|
529
|
+
}
|
|
530
|
+
case 'notexist':
|
|
531
|
+
if (setValue == null || setValue == undefined || setValue == '' || setValue == 'null') {
|
|
532
|
+
return true;
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
return false;
|
|
536
|
+
}
|
|
537
|
+
case "neq":
|
|
538
|
+
case "notequal":
|
|
539
|
+
if (condition.length > 2) {
|
|
540
|
+
//console.log('setValue');
|
|
541
|
+
return !(setValue === condition[2]);
|
|
542
|
+
}
|
|
543
|
+
else {
|
|
544
|
+
return !JSON.parse(setValue);
|
|
545
|
+
}
|
|
546
|
+
default:
|
|
547
|
+
return false;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
else {
|
|
551
|
+
return true;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
checkAddUpdateIf(tableField, fieldName) {
|
|
555
|
+
let fieldValue = tableField[fieldName];
|
|
556
|
+
if (fieldValue != undefined && fieldValue.has_role != null && fieldValue.has_role != undefined && this.commonFunctionService.isArray(fieldValue.has_role) && fieldValue.has_role.length > 0) {
|
|
557
|
+
let check = 0;
|
|
558
|
+
for (let index = 0; index < fieldValue.has_role.length; index++) {
|
|
559
|
+
const element = fieldValue.has_role[index];
|
|
560
|
+
if (this.is_check_role(element._id)) {
|
|
561
|
+
check = 1;
|
|
562
|
+
break;
|
|
563
|
+
}
|
|
564
|
+
else {
|
|
565
|
+
check = 0;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
if (check == 1) {
|
|
569
|
+
return false;
|
|
570
|
+
}
|
|
571
|
+
else {
|
|
572
|
+
return true;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
else {
|
|
576
|
+
return true;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
checkDisableRowIf(field, formValue) {
|
|
580
|
+
let check = false;
|
|
581
|
+
if (this.checkIfCondition(field, formValue)) {
|
|
582
|
+
check = true;
|
|
583
|
+
}
|
|
584
|
+
else {
|
|
585
|
+
check = false;
|
|
586
|
+
}
|
|
587
|
+
return check;
|
|
588
|
+
}
|
|
589
|
+
checkRowIf(data, field) {
|
|
590
|
+
let check = false;
|
|
591
|
+
if (data.selected || field.checkDisableRowIf) {
|
|
592
|
+
let condition = '';
|
|
593
|
+
if (field.disableRowIf && field.disableRowIf != '') {
|
|
594
|
+
condition = field.disableRowIf;
|
|
595
|
+
}
|
|
596
|
+
if (condition != '') {
|
|
597
|
+
if (this.checkDisableRowIf(condition, data)) {
|
|
598
|
+
check = true;
|
|
599
|
+
}
|
|
600
|
+
else {
|
|
601
|
+
check = false;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
return check;
|
|
606
|
+
}
|
|
607
|
+
checkDisableInRow(editedColumns, row) {
|
|
608
|
+
for (let index = 0; index < editedColumns.length; index++) {
|
|
609
|
+
const column = editedColumns[index];
|
|
610
|
+
row[column.field_name + "_disabled"] = this.isDisableRow(column, row);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
isDisableRow(field, data) {
|
|
614
|
+
const updateMode = false;
|
|
615
|
+
if (field.is_disabled) {
|
|
616
|
+
return true;
|
|
617
|
+
}
|
|
618
|
+
if (data.disabled) {
|
|
619
|
+
return data.disabled;
|
|
620
|
+
}
|
|
621
|
+
if (field.etc_fields && field.etc_fields.disable_if && field.etc_fields.disable_if != '') {
|
|
622
|
+
return this.isDisable(field.etc_fields, updateMode, data);
|
|
623
|
+
}
|
|
624
|
+
return false;
|
|
625
|
+
}
|
|
626
|
+
isDisableRuntime(column, data, i, gridData, field, filterData) {
|
|
627
|
+
const updateMode = false;
|
|
628
|
+
if (column.is_disabled) {
|
|
629
|
+
return true;
|
|
630
|
+
}
|
|
631
|
+
if (data.disabled) {
|
|
632
|
+
return data.disabled;
|
|
633
|
+
}
|
|
634
|
+
if (column.etc_fields && column.etc_fields.disable_if && column.etc_fields.disable_if != '') {
|
|
635
|
+
let indx = this.commonFunctionService.getCorrectIndex(data, i, field, gridData, filterData);
|
|
636
|
+
data = gridData[indx];
|
|
637
|
+
return this.isDisable(field.etc_fields, updateMode, data);
|
|
638
|
+
}
|
|
639
|
+
return false;
|
|
640
|
+
}
|
|
641
|
+
checkDataAlreadyAddedInListOrNot(field, incomingData, alreadyDataAddedlist, i) {
|
|
642
|
+
if (field && field.type && field.type == "date") {
|
|
643
|
+
incomingData = "" + incomingData;
|
|
644
|
+
}
|
|
645
|
+
let checkStatus = {
|
|
646
|
+
status: false,
|
|
647
|
+
msg: ""
|
|
648
|
+
};
|
|
649
|
+
if (field && field.allowDuplicacy) {
|
|
650
|
+
checkStatus.status = false;
|
|
651
|
+
return checkStatus;
|
|
652
|
+
}
|
|
653
|
+
else {
|
|
654
|
+
let primary_key = field.field_name;
|
|
655
|
+
let criteria = primary_key + "#eq#" + incomingData;
|
|
656
|
+
let primaryCriteriaList = [];
|
|
657
|
+
primaryCriteriaList.push(criteria);
|
|
658
|
+
if (field && field.primaryKeyCriteria && Array.isArray(field.primaryKeyCriteria) && field.primaryKeyCriteria.length > 0) {
|
|
659
|
+
field.primaryKeyCriteria.forEach((criteria) => {
|
|
660
|
+
const crList = criteria.split("#");
|
|
661
|
+
const cr = crList[0] + "#" + crList[1] + "#" + incomingData;
|
|
662
|
+
primaryCriteriaList.push(cr);
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
if (alreadyDataAddedlist == undefined) {
|
|
666
|
+
alreadyDataAddedlist = [];
|
|
667
|
+
}
|
|
668
|
+
let alreadyExist = false;
|
|
669
|
+
if (typeof incomingData == 'object') {
|
|
670
|
+
alreadyDataAddedlist.forEach((element) => {
|
|
671
|
+
if (element._id && element._id == incomingData._id) {
|
|
672
|
+
alreadyExist = true;
|
|
673
|
+
}
|
|
674
|
+
});
|
|
675
|
+
}
|
|
676
|
+
else if (typeof incomingData == 'string') {
|
|
677
|
+
for (let index = 0; index < alreadyDataAddedlist.length; index++) {
|
|
678
|
+
const element = alreadyDataAddedlist[index];
|
|
679
|
+
if (i == undefined || i == -1) {
|
|
680
|
+
if (typeof element == 'string') {
|
|
681
|
+
if (element == incomingData) {
|
|
682
|
+
alreadyExist = true;
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
else {
|
|
686
|
+
if (primaryCriteriaList && primaryCriteriaList.length > 0) {
|
|
687
|
+
for (let index = 0; index < primaryCriteriaList.length; index++) {
|
|
688
|
+
const cri = primaryCriteriaList[index];
|
|
689
|
+
alreadyExist = this.checkIfCondition(cri, element, field.type);
|
|
690
|
+
if (alreadyExist) {
|
|
691
|
+
const crList = cri.split("#");
|
|
692
|
+
switch (crList[1]) {
|
|
693
|
+
case "lte":
|
|
694
|
+
checkStatus.msg = "Entered value for " + (field.label ? field.label : '') + " is gretter than to " + crList[0] + ". !!!";
|
|
695
|
+
break;
|
|
696
|
+
case "gte":
|
|
697
|
+
checkStatus.msg = "Entered value for " + (field.label ? field.label : '') + " is less than to " + crList[0] + ". !!!";
|
|
698
|
+
break;
|
|
699
|
+
default:
|
|
700
|
+
checkStatus.msg = "Entered value for " + (field.label ? field.label : '') + " is already added. !!!";
|
|
701
|
+
break;
|
|
702
|
+
}
|
|
703
|
+
break;
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
if (alreadyExist) {
|
|
709
|
+
break;
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
else {
|
|
713
|
+
break;
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
;
|
|
717
|
+
}
|
|
718
|
+
else {
|
|
719
|
+
alreadyExist = false;
|
|
720
|
+
}
|
|
721
|
+
if (alreadyExist) {
|
|
722
|
+
checkStatus.status = true;
|
|
723
|
+
return checkStatus;
|
|
724
|
+
}
|
|
725
|
+
else {
|
|
726
|
+
checkStatus.status = false;
|
|
727
|
+
return checkStatus;
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
checkCustmizedValuValidation(fields, value) {
|
|
732
|
+
let validate = [];
|
|
733
|
+
let response = {
|
|
734
|
+
status: false,
|
|
735
|
+
msg: ""
|
|
736
|
+
};
|
|
737
|
+
fields.forEach((element) => {
|
|
738
|
+
switch (element.type) {
|
|
739
|
+
case "grid_selection":
|
|
740
|
+
case "list_of_string":
|
|
741
|
+
if (element.is_mandatory) {
|
|
742
|
+
if (value[element.field_name] === undefined || value[element.field_name] === '' || value[element.field_name] === null || !this.commonFunctionService.isArray(value[element.field_name])) {
|
|
743
|
+
validate.push(element);
|
|
744
|
+
}
|
|
745
|
+
else if (this.commonFunctionService.isArray(value[element.field_name])) {
|
|
746
|
+
if (value[element.field_name].length <= 0) {
|
|
747
|
+
validate.push(element);
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
break;
|
|
752
|
+
default:
|
|
753
|
+
validate = validate;
|
|
754
|
+
}
|
|
755
|
+
});
|
|
756
|
+
if (validate.length > 0) {
|
|
757
|
+
let fieldName = '';
|
|
758
|
+
validate.forEach((element) => {
|
|
759
|
+
if (fieldName == '') {
|
|
760
|
+
fieldName += element.label;
|
|
761
|
+
}
|
|
762
|
+
else {
|
|
763
|
+
fieldName += ', ' + element.label;
|
|
764
|
+
}
|
|
765
|
+
});
|
|
766
|
+
response.msg = fieldName + ' Required.';
|
|
767
|
+
response.status = false;
|
|
768
|
+
// this.notificationService.notify('bg-danger', fieldName + ' Required.')
|
|
769
|
+
}
|
|
770
|
+
else {
|
|
771
|
+
response.status = true;
|
|
772
|
+
}
|
|
773
|
+
return response;
|
|
774
|
+
}
|
|
775
|
+
checkCallGridData(ObjectValue, gridDisable) {
|
|
776
|
+
let check = false;
|
|
777
|
+
if (gridDisable) {
|
|
778
|
+
let list = Object.values(ObjectValue);
|
|
779
|
+
for (let index = 0; index < list.length; index++) {
|
|
780
|
+
const val = list[index];
|
|
781
|
+
if (val != '') {
|
|
782
|
+
check = true;
|
|
783
|
+
break;
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
else {
|
|
788
|
+
check = true;
|
|
789
|
+
}
|
|
790
|
+
return check;
|
|
791
|
+
}
|
|
792
|
+
checkUpdatePermission(rowdata, details) {
|
|
793
|
+
if (details && details.permission_key && details.permission_key != '' && details.permission_value && details.permission_value != '') {
|
|
794
|
+
const value = this.commonFunctionService.getObjectValue(details.permission_key, rowdata);
|
|
795
|
+
if (value == details.permission_value) {
|
|
796
|
+
this.notificationService.notify("btn-danger", "Cannot be update!!!");
|
|
797
|
+
return true;
|
|
798
|
+
}
|
|
799
|
+
else {
|
|
800
|
+
return false;
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
else {
|
|
804
|
+
return false;
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
checkFieldsAvailability(formName, tab, gridButtons) {
|
|
808
|
+
if (tab && tab?.forms) {
|
|
809
|
+
let form = this.commonFunctionService.getForm(tab.forms, formName, gridButtons);
|
|
810
|
+
if (form && form?.['tableFields'] && form?.['tableFields']?.length > 0) {
|
|
811
|
+
return true;
|
|
812
|
+
}
|
|
813
|
+
else {
|
|
814
|
+
return false;
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
else {
|
|
818
|
+
return false;
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
CheckIfService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CheckIfService, deps: [{ token: i1.CommonFunctionService }, { token: i2.StorageService }, { token: i3.NotificationService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
823
|
+
CheckIfService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CheckIfService, providedIn: 'root' });
|
|
824
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CheckIfService, decorators: [{
|
|
825
|
+
type: Injectable,
|
|
826
|
+
args: [{
|
|
827
|
+
providedIn: 'root'
|
|
828
|
+
}]
|
|
829
|
+
}], ctorParameters: function () { return [{ type: i1.CommonFunctionService }, { type: i2.StorageService }, { type: i3.NotificationService }]; } });
|
|
830
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2staWYuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZXMvY2hlY2staWYvY2hlY2staWYuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBb0IsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBTzlELE1BQU0sT0FBTyxjQUFjO0lBRXpCLFlBQ1UscUJBQTJDLEVBQzNDLGNBQTZCLEVBQzdCLG1CQUF1QztRQUZ2QywwQkFBcUIsR0FBckIscUJBQXFCLENBQXNCO1FBQzNDLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7SUFDN0MsQ0FBQztJQUNMLGNBQWMsQ0FBQyxNQUFVLEVBQUMsTUFBVSxFQUFDLFVBQWtCLEVBQUMsU0FBYSxFQUFDLFlBQTZCO1FBQ2pHLElBQUksUUFBUSxHQUFHO1lBQ2IsWUFBWSxFQUFDLEVBQUU7WUFDZixZQUFZLEVBQUMsWUFBWTtTQUMxQixDQUFBO1FBQ0QsSUFBRyxNQUFNLElBQUksRUFBRSxFQUFDO1lBQ2QsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBQyxVQUFVLEVBQUMsU0FBUyxDQUFDLENBQUE7WUFDbkUsSUFBRyxRQUFRLENBQUMsWUFBWSxFQUFDO2dCQUN2QixJQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsRUFBQztvQkFDN0QsUUFBUSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBO2lCQUM1RDthQUNGO2lCQUFJO2dCQUNILElBQUcsUUFB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YUFDZDtTQUNGO2FBQUk7WUFDSCxPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0gsQ0FBQzs7NEdBaHdCVSxjQUFjO2dIQUFkLGNBQWMsY0FGYixNQUFNOzRGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLy4uL3N0b3JhZ2Uvc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb21tb25GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24tdXRpbHMvY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZ5L25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENoZWNrSWZTZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNvbW1vbkZ1bmN0aW9uU2VydmljZTpDb21tb25GdW5jdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOlN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOk5vdGlmaWNhdGlvblNlcnZpY2VcclxuICApIHsgfVxyXG4gIGNoZWNrSXNEaXNhYmxlKHBhcmVudDphbnksY2hpZWxkOmFueSx1cGRhdGVNb2RlOmJvb2xlYW4sZm9ybVZhbHVlOmFueSx0ZW1wbGF0ZUZvcm06VW50eXBlZEZvcm1Hcm91cCl7XHJcbiAgICBsZXQgcmVzcG9uY2UgPSB7XHJcbiAgICAgIHRvYmVkZXNhYmxlZDonJyxcclxuICAgICAgdGVtcGxhdGVGb3JtOnRlbXBsYXRlRm9ybVxyXG4gICAgfVxyXG4gICAgaWYocGFyZW50ID09ICcnKXtcclxuICAgICAgcmVzcG9uY2UudG9iZWRlc2FibGVkID0gdGhpcy5pc0Rpc2FibGUoY2hpZWxkLHVwZGF0ZU1vZGUsZm9ybVZhbHVlKVxyXG4gICAgICBpZihyZXNwb25jZS50b2JlZGVzYWJsZWQpe1xyXG4gICAgICAgIGlmKCFyZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbY2hpZWxkLmZpZWxkX25hbWVdLmRpc2FibGVkKXtcclxuICAgICAgICAgIHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tjaGllbGQuZmllbGRfbmFtZV0uZGlzYWJsZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBpZihyZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbY2hpZWxkLmZpZWxkX25hbWVdLmRpc2FibGVkKXtcclxuICAgICAgICAgIHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tjaGllbGQuZmllbGRfbmFtZV0uZW5hYmxlKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1lbHNle1xyXG4gICAgICByZXNwb25jZS50b2JlZGVzYWJsZWQgPSB0aGlzLmlzRGlzYWJsZShjaGllbGQsdXBkYXRlTW9kZSxmb3JtVmFsdWUpXHJcbiAgICAgIGlmKHJlc3BvbmNlLnRvYmVkZXNhYmxlZCl7XHJcbiAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1twYXJlbnRdKS5jb250cm9sc1tjaGllbGQuZmllbGRfbmFtZV0uZGlzYWJsZSgpXHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbcGFyZW50XSkuY29udHJvbHNbY2hpZWxkLmZpZWxkX25hbWVdLmVuYWJsZSgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25jZTtcclxuICB9XHJcbiAgY2hlY2tJc01lbmRldG9yeShwYXJlbnQ6YW55LGNoaWVsZDphbnksZm9ybVZhbHVlOmFueSx0ZW1wbGF0ZUZvcm06VW50eXBlZEZvcm1Hcm91cCl7XHJcbiAgICBsZXQgcmVzcG9uY2UgPSB7XHJcbiAgICAgIHRvYmVkZXNhYmxlZDonJyxcclxuICAgICAgdGVtcGxhdGVGb3JtOnRlbXBsYXRlRm9ybVxyXG4gICAgfVxyXG4gICAgaWYocGFyZW50ID09ICcnKXtcclxuICAgICAgcmVzcG9uY2UudG9iZWRlc2FibGVkID0gdGhpcy5pc01lbmRldG9yeShjaGllbGQsZm9ybVZhbHVlKVxyXG4gICAgICBpZihyZXNwb25jZS50b2JlZGVzYWJsZWQpe1xyXG4gICAgICAgIGlmKHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tjaGllbGQuZmllbGRfbmFtZV0uc3RhdHVzID09ICdWQUxJRCcpe1xyXG4gICAgICAgICAgcmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2NoaWVsZC5maWVsZF9uYW1lXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcbiAgICAgICAgICByZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbY2hpZWxkLmZpZWxkX25hbWVdLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIGlmKHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tjaGllbGQuZmllbGRfbmFtZV0uc3RhdHVzID09ICdJTlZBTElEJyl7XHJcbiAgICAgICAgICByZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbY2hpZWxkLmZpZWxkX25hbWVdLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgcmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2NoaWVsZC5maWVsZF9uYW1lXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmVzcG9uY2UudG9iZWRlc2FibGVkID0gdGhpcy5pc01lbmRldG9yeShjaGllbGQsZm9ybVZhbHVlKVxyXG4gICAgICBpZihyZXNwb25jZS50b2JlZGVzYWJsZWQpe1xyXG4gICAgICAgIGlmKCg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbcGFyZW50XSkuY29udHJvbHNbY2hpZWxkLmZpZWxkX25hbWVdLnN0YXR1cyA9PSAnVkFMSUQnKXtcclxuICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbcGFyZW50XSkuY29udHJvbHNbY2hpZWxkLmZpZWxkX25hbWVdLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcclxuICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbcGFyZW50XSkuY29udHJvbHNbY2hpZWxkLmZpZWxkX25hbWVdLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIGlmKCg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbcGFyZW50XSkuY29udHJvbHNbY2hpZWxkLmZpZWxkX25hbWVdLnN0YXR1cyA9PSAnSU5WQUxJRCcpe1xyXG4gICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1twYXJlbnRdKS5jb250cm9sc1tjaGllbGQuZmllbGRfbmFtZV0uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAoPFVudHlwZWRGb3JtR3JvdXA+cmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW3BhcmVudF0pLmNvbnRyb2xzW2NoaWVsZC5maWVsZF9uYW1lXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzcG9uY2U7XHJcbiAgfVxyXG4gIGNoZWNrU2hvd0lmTGlzdE9mRmllZGxkcyhwYXJlbnQ6YW55LGZpZWxkOmFueSxmb3JtVmFsdWU6YW55KXtcclxuICAgIC8vbGV0IGZvcm1WYWx1ZSA9IHRoaXMuZ2V0Rm9ybVZhbHVlKHRydWUpO1xyXG4gICAgbGV0IGZpZWxkVmFsdWUgPSBmb3JtVmFsdWVbcGFyZW50XTtcclxuICAgIGlmKGZpZWxkVmFsdWUgJiYgZmllbGRWYWx1ZS5sZW5ndGggPiAwICYmIGZpZWxkICYmIGZpZWxkLnNob3dfaWYgJiYgZmllbGQuc2hvd19pZiAhPSBudWxsICYmIGZpZWxkLnNob3dfaWYgIT0gJycpe1xyXG4gICAgICBsZXQgY2hlY2sgPSAwO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZmllbGRWYWx1ZS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkVmFsdWVbaW5kZXhdO1xyXG4gICAgICAgIGZvcm1WYWx1ZVtwYXJlbnRdID0gdmFsdWU7XHJcbiAgICAgICAgaWYodGhpcy5zaG93SWYoZmllbGQsZm9ybVZhbHVlKSl7XHJcbiAgICAgICAgICBjaGVjayA9IDE7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYoY2hlY2sgPT0gMSl7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgY2hlY2tBZGROZXdCdXR0b25PbkdyaWRTZWxlY3Rpb24oYnV0dG9uczphbnkpe1xyXG4gICAgbGV0IGNoZWNrID0gZmFsc2U7XHJcbiAgICBpZihidXR0b25zICYmIGJ1dHRvbnMubGVuZ3RoID4wKXtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1dHRvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IGJ0biA9IGJ1dHRvbnNbaV07XHJcbiAgICAgICAgICBpZihidG4gJiYgYnRuLm9uY2xpY2sgJiYgYnRuLm9uY2xpY2suYXBpICYmIGJ0bi5vbmNsaWNrLmFwaSA9PSBcInNhdmVcIil7XHJcbiAgICAgICAgICAgIGNoZWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoZWNrO1xyXG4gIH1cclxuICBjaGVja0ZpZWxkU2hvd09ySGlkZShmaWVsZDphbnksc2hvd0lmRmllbGRMaXN0OmFueSl7XHJcbiAgICBsZXQgY2hlY2sgPSBmYWxzZTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzaG93SWZGaWVsZExpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBzaG93SWZGaWVsZExpc3RbaW5kZXhdO1xyXG4gICAgICBpZihlbGVtZW50LmZpZWxkX25hbWUgPT0gZmllbGQuZmllbGRfbmFtZSl7XHJcbiAgICAgICAgaWYoZWxlbWVudC5zaG93KXtcclxuICAgICAgICAgIGNoZWNrID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgY2hlY2s9ZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hlY2s7XHJcbiAgfVxyXG4gIGNoZWNrRHVibGljYXRlT25Gb3JtKGZpZWxkczphbnksdmFsdWU6YW55LGxpc3Q6YW55LGk6YW55LHNob3dJZkZpZWxkTGlzdDphbnksY3VzdG1pemVkRm9ybVZhbHVlOmFueSxkYXRhTGlzdEZvclVwbG9hZDphbnksdGVtcGxhdGVGb3JtOlVudHlwZWRGb3JtR3JvdXAscGFyZW50Pzphbnkpe1xyXG4gICAgbGV0IGNoZWNrRHVibGljID0ge1xyXG4gICAgICBzdGF0dXMgOiBmYWxzZSxcclxuICAgICAgbXNnIDogXCJcIlxyXG4gICAgfVxyXG4gICAgaWYoZmllbGRzICYmIGZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgbGV0IGNoZWNrVmFsdWUgPSAwO1xyXG4gICAgICBsZXQgZmllbGRfY29udHJvbDphbnkgPSBcIlwiO1xyXG4gICAgICBsZXQgbGlzdF9vZl9maWVsZF9kYXRhID0gdmFsdWU7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmaWVsZHMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGZpZWxkc1tpbmRleF07XHJcbiAgICAgICAgbGV0IGN1c3RtaXplZEtleSA9ICcnO1xyXG4gICAgICAgIGxldCBjdXN0bWl6ZWREYXRhID0gJyc7XHJcbiAgICAgICAgaWYocGFyZW50ICYmIHBhcmVudCAhPSAnJyl7XHJcbiAgICAgICAgICBjdXN0bWl6ZWRLZXkgPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5jdXN0bWl6ZWRLZXkocGFyZW50KTtcclxuICAgICAgICAgIGZpZWxkX2NvbnRyb2wgPSB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbcGFyZW50LmZpZWxkX25hbWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihjdXN0bWl6ZWRLZXkgJiYgY3VzdG1pemVkS2V5ICE9ICcnKXtcclxuICAgICAgICAgIGlmKGN1c3RtaXplZEZvcm1WYWx1ZVtjdXN0bWl6ZWRLZXldICYmIGN1c3RtaXplZEZvcm1WYWx1ZVtjdXN0bWl6ZWRLZXldW2VsZW1lbnQuZmllbGRfbmFtZV0pIHtcclxuICAgICAgICAgICAgY3VzdG1pemVkRGF0YSA9IGN1c3RtaXplZEZvcm1WYWx1ZVtjdXN0bWl6ZWRLZXldW2VsZW1lbnQuZmllbGRfbmFtZV1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGRhdGFMaXN0Rm9yVXBsb2FkW2N1c3RtaXplZEtleV0gJiYgZGF0YUxpc3RGb3JVcGxvYWRbY3VzdG1pemVkS2V5XVtlbGVtZW50LmZpZWxkX25hbWVdKSB7XHJcbiAgICAgICAgICAgIGN1c3RtaXplZERhdGEgPSBkYXRhTGlzdEZvclVwbG9hZFtjdXN0bWl6ZWRLZXldW2VsZW1lbnQuZmllbGRfbmFtZV1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIGlmKGN1c3RtaXplZEZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdICYmIGN1c3RtaXplZEZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICBjdXN0bWl6ZWREYXRhID0gY3VzdG1pemVkRm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG1lbmRhdG9yeSA9IGZhbHNlO1xyXG4gICAgICAgIGlmKGVsZW1lbnQuaXNfbWFuZGF0b3J5KXtcclxuICAgICAgICAgIGlmKGVsZW1lbnQgJiYgZWxlbWVudC5zaG93X2lmICYmIGVsZW1lbnQuc2hvd19pZiAhPSAnJyl7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY2hlY2tGaWVsZFNob3dPckhpZGUoZWxlbWVudCxzaG93SWZGaWVsZExpc3QpKXtcclxuICAgICAgICAgICAgICBtZW5kYXRvcnkgPSB0cnVlO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBtZW5kYXRvcnkgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIG1lbmRhdG9yeSA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCAoZWxlbWVudC5kYXRhdHlwZSkge1xyXG4gICAgICAgICAgY2FzZSAnbGlzdF9vZl9vYmplY3QnOlxyXG4gICAgICAgICAgICBpZiAobGlzdF9vZl9maWVsZF9kYXRhW2VsZW1lbnQuZmllbGRfbmFtZV0gPT0gJycgfHwgbGlzdF9vZl9maWVsZF9kYXRhW2VsZW1lbnQuZmllbGRfbmFtZV0gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIGlmKG1lbmRhdG9yeSAmJiBjdXN0bWl6ZWREYXRhID09ICcnKXtcclxuICAgICAgICAgICAgICAgIGlmKGN1c3RtaXplZERhdGEubGVuZ3RoID09IDApe1xyXG4gICAgICAgICAgICAgICAgICBjaGVja1ZhbHVlID0gMTtcclxuICAgICAgICAgICAgICAgICAgY2hlY2tEdWJsaWMuc3RhdHVzID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICBjaGVja0R1YmxpYy5tc2cgPSBcIlBsZWFzZSBFbnRlciBcIiArIGVsZW1lbnQubGFiZWw7XHJcbiAgICAgICAgICAgICAgICAgIC8vdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLm5vdGlmeShcImJnLWRhbmdlclwiLCBcIlBsZWFzZSBFbnRlciBcIiArIGVsZW1lbnQubGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tEdWJsaWM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBjaGVja0R1YmxpYy5zdGF0dXMgPSB0cnVlXHJcbiAgICAgICAgICAgICAgY2hlY2tEdWJsaWMubXNnID0gJ0VudGVyZWQgdmFsdWUgZm9yICcrZWxlbWVudC5sYWJlbCsnIGlzIG5vdCB2YWxpZC4gISEhJztcclxuICAgICAgICAgICAgICAvL3RoaXMubm90aWZpY2F0aW9uU2VydmljZS5ub3RpZnkoJ2JnLWRhbmdlcicsJ0VudGVyZWQgdmFsdWUgZm9yICcrZWxlbWVudC5sYWJlbCsnIGlzIG5vdCB2YWxpZC4gISEhJyk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrRHVibGljO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnb2JqZWN0JzpcclxuICAgICAgICAgICAgaWYgKGxpc3Rfb2ZfZmllbGRfZGF0YVtlbGVtZW50LmZpZWxkX25hbWVdID09ICcnIHx8IGxpc3Rfb2ZfZmllbGRfZGF0YVtlbGVtZW50LmZpZWxkX25hbWVdID09IG51bGwpIHtcclxuICAgICAgICAgICAgICBpZihtZW5kYXRvcnkpe1xyXG4gICAgICAgICAgICAgICAgY2hlY2tWYWx1ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICBjaGVja0R1YmxpYy5zdGF0dXMgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICBjaGVja0R1YmxpYy5tc2cgPSBcIlBsZWFzZSBFbnRlciBcIiArIGVsZW1lbnQubGFiZWw7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMubm90aWZpY2F0aW9uU2VydmljZS5ub3RpZnkoXCJiZy1kYW5nZXJcIiwgXCJQbGVhc2UgRW50ZXIgXCIgKyBlbGVtZW50LmxhYmVsKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjaGVja0R1YmxpYztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiBsaXN0X29mX2ZpZWxkX2RhdGFbZWxlbWVudC5maWVsZF9uYW1lXSAhPSAnb2JqZWN0Jyl7XHJcbiAgICAgICAgICAgICAgY2hlY2tEdWJsaWMuc3RhdHVzID0gdHJ1ZVxyXG4gICAgICAgICAgICAgIGNoZWNrRHVibGljLm1zZyA9ICdFbnRlcmVkIHZhbHVlIGZvciAnK2VsZW1lbnQubGFiZWwrJyBpcyBub3QgdmFsaWQuICEhISc7XHJcbiAgICAgICAgICAgICAgLy90aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KCdiZy1kYW5nZXInLCdFbnRlcmVkIHZhbHVlIGZvciAnK2VsZW1lbnQubGFiZWwrJyBpcyBub3QgdmFsaWQuICEhIScpO1xyXG4gICAgICAgICAgICAgIHJldHVybiBjaGVja0R1YmxpYztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xyXG4gICAgICAgICAgY2FzZSAnbGlzdF9vZl9zdHJpbmcnOlxyXG4gICAgICAgICAgICBpZiAobGlzdF9vZl9maWVsZF9kYXRhW2VsZW1lbnQuZmllbGRfbmFtZV0gPT0gJycgfHwgbGlzdF9vZl9maWVsZF9kYXRhW2VsZW1lbnQuZmllbGRfbmFtZV0gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIGlmKG1lbmRhdG9yeSAmJiBjdXN0bWl6ZWREYXRhID09ICcnKXtcclxuICAgICAgICAgICAgICAgIGlmKGN1c3RtaXplZERhdGEubGVuZ3RoID09IDApe1xyXG4gICAgICAgICAgICAgICAgICBjaGVja1ZhbHVlID0gMTtcclxuICAgICAgICAgICAgICAgICAgY2hlY2tEdWJsaWMuc3RhdHVzID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICBjaGVja0R1YmxpYy5tc2cgPSBcIlBsZWFzZSBFbnRlciBcIiArIGVsZW1lbnQubGFiZWw7XHJcbiAgICAgICAgICAgICAgICAgIC8vdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLm5vdGlmeShcImJnLWRhbmdlclwiLCBcIlBsZWFzZSBFbnRlciBcIiArIGVsZW1lbnQubGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tEdWJsaWM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBjaGVja0R1YmxpYy5zdGF0dXMgPSB0cnVlXHJcbiAgICAgICAgICAgICAgY2hlY2tEdWJsaWMubXNnID0gJ0VudGVyZWQgdmFsdWUgZm9yICcrZWxlbWVudC5sYWJlbCsnIGlzIG5vdCB2YWxpZC4gISEhJztcclxuICAgICAgICAgICAgICAvL3RoaXMubm90aWZpY2F0aW9uU2VydmljZS5ub3RpZnkoJ2JnLWRhbmdlcicsJ0VudGVyZWQgdmFsdWUgZm9yICcrZWxlbWVudC5sYWJlbCsnIGlzIG5vdCB2YWxpZC4gISEhJyk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrRHVibGljO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnZmlsZSc6XHJcbiAgICAgICAgICAgIGlmKG1lbmRhdG9yeSAmJiBjdXN0bWl6ZWREYXRhID09ICcnKXtcclxuICAgICAgICAgICAgICBpZihjdXN0bWl6ZWREYXRhLmxlbmd0aCA9PSAwKXtcclxuICAgICAgICAgICAgICAgIGNoZWNrVmFsdWUgPSAxO1xyXG4gICAgICAgICAgICAgICAgY2hlY2tEdWJsaWMuc3RhdHVzID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgY2hlY2tEdWJsaWMubXNnID0gXCJQbGVhc2UgRW50ZXIgXCIgKyBlbGVtZW50LmxhYmVsO1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KFwiYmctZGFuZ2VyXCIsIFwiUGxlYXNlIEVudGVyIFwiICsgZWxlbWVudC5sYWJlbCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tEdWJsaWM7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAndHlwZWFoZWFkJzpcclxuICAgICAgICAgICAgaWYoZWxlbWVudC5kYXRhdHlwZSA9PSBcInRleHRcIil7XHJcbiAgICAgICAgICAgICAgaWYgKGxpc3Rfb2ZfZmllbGRfZGF0YVtlbGVtZW50LmZpZWxkX25hbWVdID09ICcnIHx8IGxpc3Rfb2ZfZmllbGRfZGF0YVtlbGVtZW50LmZpZWxkX25hbWVdID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmKG1lbmRhdG9yeSl7XHJcbiAgICAgICAgICAgICAgICAgIGlmKGN1c3RtaXplZERhdGEubGVuZ3RoID09IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrVmFsdWUgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrRHVibGljLnN0YXR1cyA9IHRydWVcclxuICAgICAgICAgICAgICAgICAgICBjaGVja0R1YmxpYy5tc2cgPSBcIlBsZWFzZSBFbnRlciBcIiArIGVsZW1lbnQubGFiZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KFwiYmctZGFuZ2VyXCIsIFwiUGxlYXNlIEVudGVyIFwiICsgZWxlbWVudC5sYWJlbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrRHVibGljO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfWVsc2UgaWYoZmllbGRfY29udHJvbCAmJiBmaWVsZF9jb250cm9sICE9IFwiXCIgKXtcclxuICAgICAgICAgICAgICAgIGlmKCBmaWVsZF9jb250cm9sLmdldChlbGVtZW50LmZpZWxkX25hbWUpLmVycm9ycz8ucmVxdWlyZWQgfHwgZmllbGRfY29udHJvbC5nZXQoZWxlbWVudC5maWVsZF9uYW1lKS5lcnJvcnM/LnZhbGlkRGF0YVRleHQpe1xyXG4gICAgICAgICAgICAgICAgICBjaGVja0R1YmxpYy5zdGF0dXMgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgIGNoZWNrRHVibGljLm1zZyA9ICdFbnRlcmVkIHZhbHVlIGZvciAnK2VsZW1lbnQubGFiZWwrJyBpcyBpbnZhbGlkRGF0YS4gISEhJztcclxuICAgICAgICAgICAgICAgICAgLy90aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KCdiZy1kYW5nZXInLCdFbnRlcmVkIHZhbHVlIGZvciAnK2VsZW1lbnQubGFiZWwrJyBpcyBpbnZhbGlkRGF0YS4gISEhJyk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBjaGVja0R1YmxpYztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgaWYgKGxpc3Rfb2ZfZmllbGRfZGF0YVtlbGVtZW50LmZpZWxkX25hbWVdID09ICcnIHx8IGxpc3Rfb2ZfZmllbGRfZGF0YVtlbGVtZW50LmZpZWxkX25hbWVdID09IG51bGwpIHtcclxuICAgICAgICAgICAgICBpZihtZW5kYXRvcnkgKXtcclxuICAgICAgICAgICAgICAgIGNoZWNrVmFsdWUgPSAxO1xyXG4gICAgICAgICAgICAgICAgY2hlY2tEdWJsaWMubXNnID0gXCJQbGVhc2UgRW50ZXIgXCIgKyBlbGVtZW50LmxhYmVsO1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KFwiYmctZGFuZ2VyXCIsIFwiUGxlYXNlIEVudGVyIFwiICsgZWxlbWVudC5sYWJlbCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihlbGVtZW50LnByaW1hcnlfa2V5X2Zvcl9saXN0KXtcclxuICAgICAgICAgIGxldCBwcmltYXJ5X2tleV9maWVsZF92YWx1ZSA9IHZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV07XHJcbiAgICAgICAgICBsZXQgYWxyZWFkeUFkZGVkID0ge1xyXG4gICAgICAgICAgICBzdGF0dXMgOiBmYWxzZSxcclxuICAgICAgICAgICAgbXNnIDogXCJcIlxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIGlmKGxpc3QgJiYgbGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgYWxyZWFkeUFkZGVkID0gdGhpcy5jaGVja0RhdGFBbHJlYWR5QWRkZWRJbkxpc3RPck5vdChlbGVtZW50LHByaW1hcnlfa2V5X2ZpZWxkX3ZhbHVlLGxpc3QsaSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZihhbHJlYWR5QWRkZWQgJiYgYWxyZWFkeUFkZGVkLnN0YXR1cyl7XHJcbiAgICAgICAgICAgIGNoZWNrRHVibGljLnN0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmKGFscmVhZHlBZGRlZC5tc2cgJiYgYWxyZWFkeUFkZGVkLm1zZyAhPSBcIlwiKXtcclxuICAgICAgICAgICAgICBjaGVja0R1YmxpYy5tc2cgPSBhbHJlYWR5QWRkZWQubXNnO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBjaGVja0R1YmxpYy5tc2cgPSBcIkVudGVyZWQgdmFsdWUgZm9yIFwiK2VsZW1lbnQubGFiZWwrXCIgaXMgYWxyZWFkeSBhZGRlZC4gISEhXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBpZiAoY2hlY2tWYWx1ZSA9PSAxKSB7XHJcbiAgICAgICAgY2hlY2tEdWJsaWMuc3RhdHVzID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoZWNrRHVibGljO1xyXG4gIH1cclxuICBpc0dyaWRGaWVsZEV4aXN0KHRhYjphbnksZmllbGROYW1lOmFueSl7XHJcbiAgICBpZih0YWIuZ3JpZCAmJiB0YWIuZ3JpZFtmaWVsZE5hbWVdICYmIHRhYi5ncmlkW2ZpZWxkTmFtZV0gIT0gdW5kZWZpbmVkICYmIHRhYi5ncmlkW2ZpZWxkTmFtZV0gIT0gbnVsbCAmJiB0YWIuZ3JpZFtmaWVsZE5hbWVdICE9ICcnKXtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBjaGVja1Nob3dJZihmaWVsZDphbnksc2VsZWN0ZWRSb3c6YW55LGZvcm1WYWx1ZTphbnkpe1xyXG4gICAgY29uc3QgIG9iamVjdGMgPSBzZWxlY3RlZFJvdz9zZWxlY3RlZFJvdzp7fVxyXG4gICAgY29uc3Qgb2JqZWN0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmplY3RjKSk7XHJcbiAgICBpZihmb3JtVmFsdWUgJiYgdHlwZW9mIGZvcm1WYWx1ZSA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhmb3JtVmFsdWUpLmxlbmd0aCA+IDApe1xyXG4gICAgICBPYmplY3Qua2V5cyhmb3JtVmFsdWUpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICBvYmplY3Rba2V5XSA9IGZvcm1WYWx1ZVtrZXldO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgY29uc3QgZGlzcGxheSA9IHRoaXMuc2hvd0lmKGZpZWxkLG9iamVjdCk7XHJcbiAgICBjb25zdCBtb2RpZmllZEZpZWxkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShmaWVsZCkpO1xyXG4gICAgbW9kaWZpZWRGaWVsZFsnZGlzcGxheSddID0gZGlzcGxheTtcclxuICAgIGZpZWxkID0gbW9kaWZpZWRGaWVsZDtcclxuICAgIHJldHVybiBkaXNwbGF5O1xyXG4gIH1cclxuICBzaG93SWYoZmllbGQ6YW55LCBmb3JtVmFsdWU6YW55KSB7XHJcbiAgICBpZiAoZmllbGQuc2hvd19pZiAmJiBmaWVsZC5zaG93X2lmICE9IG51bGwgJiYgZmllbGQuc2hvd19pZiAhPSAnJykge1xyXG4gICAgICBjb25zdCBzaG93SWYgPSBmaWVsZC5zaG93X2lmLnNwbGl0KCc7JylcclxuICAgICAgbGV0IGNoZWNrSWYgPSB0cnVlO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2hvd0lmLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNoZWNrSWYgPSB0aGlzLmNoZWNrSWZDb25kaXRpb25Gb3JBcnJheUxpc3RWYWx1ZShzaG93SWZbaW5kZXhdLCBmb3JtVmFsdWUpO1xyXG4gICAgICAgIGlmICghY2hlY2tJZikge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoY2hlY2tJZikge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNoZWNrSWZDb25kaXRpb25Gb3JBcnJheUxpc3RWYWx1ZShkYXRhOmFueSwgZm9ybVZhbHVlOmFueSl7XHJcbiAgICBsZXQgY29uZGl0aW9uID0gW11cclxuICAgIGNvbmRpdGlvbiA9IGRhdGEuc3BsaXQoJyMnKTtcclxuICAgIGlmIChjb25kaXRpb24ubGVuZ3RoID09IDQgJiYgY29uZGl0aW9uWzNdICE9ICdkeW5hbWljJyAmJiBjb25kaXRpb25bM10gIT0gJ1NUQVRJQycpIHtcclxuICAgICAgbGV0IGNoZWNrID0gXCJcIjtcclxuICAgICAgbGV0IGNoZWNrTGlzdCA9IFtdO1xyXG4gICAgICBsZXQgc2V0VmFsdWUgPSBmb3JtVmFsdWUgPyB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRPYmplY3RWYWx1ZShjb25kaXRpb25bMF0sIGZvcm1WYWx1ZSkgOiBcIlwiO1xyXG4gICAgICBpZihzZXRWYWx1ZSAmJiBzZXRWYWx1ZS5sZW5ndGggPiAwKXtcclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2V0VmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc2V0VmFsdWVbaW5kZXhdO1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0T2JqZWN0VmFsdWUoY29uZGl0aW9uWzNdLGVsZW1lbnQpO1xyXG4gICAgICAgICAgaWYodmFsdWUgJiYgdmFsdWUgIT0gJycpe1xyXG4gICAgICAgICAgICBjaGVjayA9IGNoZWNrICsgdmFsdWUgKyBcIiNcIjtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvbmRpdGlvbi5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgICBjb25zdCBjb25kaXRvbnMgPSBjb25kaXRpb25baW5kZXhdO1xyXG4gICAgICAgICAgICAgIGlmKGluZGV4ID09IDEpe1xyXG4gICAgICAgICAgICAgICAgY2hlY2sgPSBjaGVjayArIGNvbmRpdG9ucyArICcjJztcclxuICAgICAgICAgICAgICB9ZWxzZSBpZihpbmRleCA9PSAyKXtcclxuICAgICAgICAgICAgICAgIGNoZWNrID0gY2hlY2sgKyBjb25kaXRvbnMgKyAnI1NUQVRJQyc7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNoZWNrTGlzdC5wdXNoKGNoZWNrKTtcclxuICAgICAgICAgICAgY2hlY2sgPSBcIlwiO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZihjaGVja0xpc3QgJiYgY2hlY2tMaXN0Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjaGVja0xpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBjb25kaXRpb24gPSBjaGVja0xpc3RbaW5kZXhdO1xyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuY2hlY2tJZkNvbmRpdGlvbihjb25kaXRpb24sZm9ybVZhbHVlKTtcclxuICAgICAgICAgIGlmKHJlc3VsdCl7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoZWNrSWZDb25kaXRpb24oZGF0YSxmb3JtVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG5cclxuICBpc0Rpc2FibGUodGFibGVGaWVsZDphbnksIHVwZGF0ZU1vZGU6YW55LCBmb3JtVmFsdWU6YW55KSB7XHJcbiAgICBpZiAodGFibGVGaWVsZC5pc19kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0YWJsZUZpZWxkLmRpc2FibGVfaWYgJiYgdGFibGVGaWVsZC5kaXNhYmxlX2lmICE9ICcnKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tJZkNvbmRpdGlvbih0YWJsZUZpZWxkLmRpc2FibGVfaWYsIGZvcm1WYWx1ZSlcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHVwZGF0ZU1vZGUpIHtcclxuICAgICAgICBpZiAodGFibGVGaWVsZC5kaXNhYmxlX29uX3VwZGF0ZSAhPSB1bmRlZmluZWQgJiYgdGFibGVGaWVsZC5kaXNhYmxlX29uX3VwZGF0ZSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tBZGRVcGRhdGVJZih0YWJsZUZpZWxkLCdjYW5fdXBkYXRlX2lmJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRhYmxlRmllbGQuZGlzYWJsZV9vbl9hZGQgIT0gdW5kZWZpbmVkICYmIHRhYmxlRmllbGQuZGlzYWJsZV9vbl9hZGQpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrQWRkVXBkYXRlSWYodGFibGVGaWVsZCwnY2FuX2FkZF9pZicpO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBpc19jaGVja19yb2xlKGlkOiBhbnkpIHtcclxuICAgIGNvbnN0IHVzZXJJbmZvID0gdGhpcy5zdG9yYWdlU2VydmljZS5HZXRVc2VySW5mbygpO1xyXG4gICAgbGV0IGNoZWNrID0gMDtcclxuICAgIGlmICh1c2VySW5mby5yb2xlcyAmJiB1c2VySW5mby5yb2xlcyAhPSBudWxsICYmIHVzZXJJbmZvLnJvbGVzICE9IFwiXCIgJiYgdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuaXNBcnJheSh1c2VySW5mby5yb2xlcykgJiYgdXNlckluZm8ucm9sZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdXNlckluZm8ucm9sZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHVzZXJJbmZvLnJvbGVzW2luZGV4XTtcclxuICAgICAgICBpZiAoZWxlbWVudC5faWQgPT0gaWQpIHtcclxuICAgICAgICAgIGNoZWNrID0gMTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjaGVjayA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjaGVjayA9IDA7XHJcbiAgICB9XHJcbiAgICBpZihjaGVjayA9PSAxKXtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICBpc01lbmRldG9yeSh0YWJsZUZpZWxkOmFueSwgZm9ybVZhbHVlOmFueSkge1xyXG4gICAgaWYgKHRhYmxlRmllbGQuaXNfbWFuZGF0b3J5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRhYmxlRmllbGQubWFuZGF0b3J5X2lmICYmIHRhYmxlRmllbGQubWFuZGF0b3J5X2lmICE9ICcnKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tJZkNvbmRpdGlvbih0YWJsZUZpZWxkLm1hbmRhdG9yeV9pZiwgZm9ybVZhbHVlKVxyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGVja0lmQ29uZGl0aW9uKGRhdGE6YW55LCBmb3JtVmFsdWU6YW55LGRhdGF0eXBlPzphbnkpIHtcclxuICAgIGxldCBjb25kaXRpb24gPSBbXVxyXG4gICAgY29uZGl0aW9uID0gZGF0YS5zcGxpdCgnIycpXHJcbiAgICBpZiAoY29uZGl0aW9uLmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgIGlmKGNvbmRpdGlvblszXSAhPSBudWxsICYmIGNvbmRpdGlvblszXSAhPSBcIlwiICYmIGNvbmRpdGlvblszXSA9PSAnZHluYW1pYycpe1xyXG4gICAgICAgIGNvbmRpdGlvblsyXSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldE9iamVjdFZhbHVlKGNvbmRpdGlvblsyXSwgZm9ybVZhbHVlKStcIlwiO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBzZXRWYWx1ZTphbnkgPSBcIlwiO1xyXG4gICAgICBpZihjb25kaXRpb24ubGVuZ3RoID4gMyAmJiBjb25kaXRpb25bM10gPT0gJ1NUQVRJQycpe1xyXG4gICAgICAgIHNldFZhbHVlID0gY29uZGl0aW9uWzBdO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBzZXRWYWx1ZSA9IGZvcm1WYWx1ZSA/IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldE9iamVjdFZhbHVlKGNvbmRpdGlvblswXSwgZm9ybVZhbHVlKSA6IFwiXCI7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNldFZhbHVlID09PSB1bmRlZmluZWQgfHwgc2V0VmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgICBzZXRWYWx1ZSA9IFwiXCI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0VmFsdWUgPSBzZXRWYWx1ZSArIFwiXCI7XHJcbiAgICAgIH1cclxuICAgICAgaWYoZGF0YXR5cGUpe1xyXG4gICAgICAgIHN3aXRjaCAoZGF0YXR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgXCJkYXRlXCI6XHJcbiAgICAgICAgICAgIHNldFZhbHVlID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZGF0ZUZvcm1hdChzZXRWYWx1ZSk7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvblsyXSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmRhdGVGb3JtYXQoY29uZGl0aW9uWzJdKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgc3dpdGNoIChjb25kaXRpb25bMV0pIHtcclxuICAgICAgICBjYXNlICdlcSc6XHJcbiAgICAgICAgY2FzZSAnZXF1YWwnOlxyXG4gICAgICAgICAgaWYgKGNvbmRpdGlvbi5sZW5ndGggPiAyKSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3NldFZhbHVlJyk7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRWYWx1ZSA9PT0gY29uZGl0aW9uWzJdO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc2V0VmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgJ2luJzpcclxuICAgICAgICAgIGlmICgoY29uZGl0aW9uWzJdLnNwbGl0KFwiOlwiKSkuaW5jbHVkZXMoc2V0VmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSAnbmluJzpcclxuICAgICAgICAgICAgaWYgKCEoY29uZGl0aW9uWzJdLnNwbGl0KFwiOlwiKSkuaW5jbHVkZXMoc2V0VmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBjYXNlICdndGUnOlxyXG4gICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoc2V0VmFsdWUpID49IHBhcnNlRmxvYXQoY29uZGl0aW9uWzJdKTtcclxuICAgICAgICBjYXNlICdsdGUnOlxyXG4gICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoc2V0VmFsdWUpIDw9IHBhcnNlRmxvYXQoY29uZGl0aW9uWzJdKTtcclxuICAgICAgICBjYXNlICdleGlzdHMnOlxyXG4gICAgICAgICAgaWYgKHNldFZhbHVlICE9IG51bGwgJiYgc2V0VmFsdWUgIT0gdW5kZWZpbmVkICYmIHNldFZhbHVlICE9ICcnICYmIHNldFZhbHVlICE9ICdudWxsJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICBjYXNlICdub3RleGlzdCc6XHJcbiAgICAgICAgICBpZiAoc2V0VmFsdWUgPT0gbnVsbCB8fCBzZXRWYWx1ZSA9PSB1bmRlZmluZWQgfHwgc2V0VmFsdWUgPT0gJycgfHwgc2V0VmFsdWUgPT0gJ251bGwnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJuZXFcIjpcclxuICAgICAgICBjYXNlIFwibm90ZXF1YWxcIjpcclxuICAgICAgICAgIGlmIChjb25kaXRpb24ubGVuZ3RoID4gMikge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdzZXRWYWx1ZScpO1xyXG4gICAgICAgICAgICByZXR1cm4gIShzZXRWYWx1ZSA9PT0gY29uZGl0aW9uWzJdKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAhSlNPTi5wYXJzZShzZXRWYWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGVja0FkZFVwZGF0ZUlmKHRhYmxlRmllbGQ6YW55LGZpZWxkTmFtZTphbnkpe1xyXG4gICAgbGV0IGZpZWxkVmFsdWUgPSB0YWJsZUZpZWxkW2ZpZWxkTmFtZV07XHJcbiAgICBpZiAoZmllbGRWYWx1ZSAhPSB1bmRlZmluZWQgJiYgZmllbGRWYWx1ZS5oYXNfcm9sZSAhPSBudWxsICYmIGZpZWxkVmFsdWUuaGFzX3JvbGUgIT0gdW5kZWZpbmVkICYmIHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmlzQXJyYXkoZmllbGRWYWx1ZS5oYXNfcm9sZSkgJiYgZmllbGRWYWx1ZS5oYXNfcm9sZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBjaGVjayA9IDA7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmaWVsZFZhbHVlLmhhc19yb2xlLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWVsZFZhbHVlLmhhc19yb2xlW2luZGV4XTtcclxuICAgICAgICBpZiAodGhpcy5pc19jaGVja19yb2xlKGVsZW1lbnQuX2lkKSkge1xyXG4gICAgICAgICAgY2hlY2sgPSAxO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNoZWNrID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYoY2hlY2sgPT0gMSl7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNoZWNrRGlzYWJsZVJvd0lmKGZpZWxkOnN0cmluZyxmb3JtVmFsdWU6c3RyaW5nKXtcclxuICAgIGxldCBjaGVjayA9IGZhbHNlO1xyXG4gICAgaWYodGhpcy5jaGVja0lmQ29uZGl0aW9uKGZpZWxkLGZvcm1WYWx1ZSkpe1xyXG4gICAgICBjaGVjayA9IHRydWU7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgY2hlY2sgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGVjaztcclxuICB9XHJcbiAgY2hlY2tSb3dJZihkYXRhOmFueSxmaWVsZDphbnkpe1xyXG4gICAgbGV0IGNoZWNrID0gZmFsc2U7XHJcbiAgICBpZihkYXRhLnNlbGVjdGVkIHx8IGZpZWxkLmNoZWNrRGlzYWJsZVJvd0lmKXtcclxuICAgICAgbGV0IGNvbmRpdGlvbiA9ICcnO1xyXG4gICAgICBpZihmaWVsZC5kaXNhYmxlUm93SWYgJiYgZmllbGQuZGlzYWJsZVJvd0lmICE9ICcnKXtcclxuICAgICAgICBjb25kaXRpb24gPSBmaWVsZC5kaXNhYmxlUm93SWY7XHJcbiAgICAgIH1cclxuICAgICAgaWYoY29uZGl0aW9uICE9ICcnKXtcclxuICAgICAgICBpZih0aGlzLmNoZWNrRGlzYWJsZVJvd0lmKGNvbmRpdGlvbixkYXRhKSl7XHJcbiAgICAgICAgICBjaGVjayA9IHRydWU7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBjaGVjayA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoZWNrO1xyXG4gIH1cclxuICBjaGVja0Rpc2FibGVJblJvdyhlZGl0ZWRDb2x1bW5zOmFueSxyb3c6YW55KXtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBlZGl0ZWRDb2x1bW5zLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBjb2x1bW4gPSBlZGl0ZWRDb2x1bW5zW2luZGV4XTtcclxuICAgICAgcm93W2NvbHVtbi5maWVsZF9uYW1lK1wiX2Rpc2FibGVkXCJdID0gdGhpcy5pc0Rpc2FibGVSb3coY29sdW1uLHJvdyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0Rpc2FibGVSb3coZmllbGQ6YW55LCBkYXRhOmFueSkge1xyXG4gICAgY29uc3QgdXBkYXRlTW9kZSA9IGZhbHNlO1xyXG4gICAgaWYgKGZpZWxkLmlzX2Rpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYoZGF0YS5kaXNhYmxlZCl7XHJcbiAgICAgIHJldHVybiBkYXRhLmRpc2FibGVkO1xyXG4gICAgfVxyXG4gICAgaWYgKGZpZWxkLmV0Y19maWVsZHMgJiYgZmllbGQuZXRjX2ZpZWxkcy5kaXNhYmxlX2lmICYmIGZpZWxkLmV0Y19maWVsZHMuZGlzYWJsZV9pZiAhPSAnJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5pc0Rpc2FibGUoZmllbGQuZXRjX2ZpZWxkcywgdXBkYXRlTW9kZSwgZGF0YSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIGlzRGlzYWJsZVJ1bnRpbWUoY29sdW1uOmFueSwgZGF0YTphbnksaTpudW1iZXIsZ3JpZERhdGE6YW55LGZpZWxkOmFueSxmaWx0ZXJEYXRhOmFueSkge1xyXG4gICAgY29uc3QgdXBkYXRlTW9kZSA9IGZhbHNlO1xyXG4gICAgaWYgKGNvbHVtbi5pc19kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmKGRhdGEuZGlzYWJsZWQpe1xyXG4gICAgICByZXR1cm4gZGF0YS5kaXNhYmxlZDtcclxuICAgIH1cclxuICAgIGlmIChjb2x1bW4uZXRjX2ZpZWxkcyAmJiBjb2x1bW4uZXRjX2ZpZWxkcy5kaXNhYmxlX2lmICYmIGNvbHVtbi5ldGNfZmllbGRzLmRpc2FibGVfaWYgIT0gJycpIHtcclxuICAgICAgbGV0IGluZHg6YW55ID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0Q29ycmVjdEluZGV4KGRhdGEsaSxmaWVsZCxncmlkRGF0YSxmaWx0ZXJEYXRhKTtcclxuICAgICAgZGF0YSA9IGdyaWREYXRhW2luZHhdO1xyXG4gICAgICByZXR1cm4gdGhpcy5pc0Rpc2FibGUoZmllbGQuZXRjX2ZpZWxkcywgdXBkYXRlTW9kZSwgZGF0YSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIGNoZWNrRGF0YUFscmVhZHlBZGRlZEluTGlzdE9yTm90KGZpZWxkOmFueSxpbmNvbWluZ0RhdGE6YW55LGFscmVhZHlEYXRhQWRkZWRsaXN0OmFueSxpPzphbnkpe1xyXG4gICAgaWYoZmllbGQgJiYgZmllbGQudHlwZSAmJiBmaWVsZC50eXBlID09IFwiZGF0ZVwiKXtcclxuICAgICAgaW5jb21pbmdEYXRhID0gXCJcIitpbmNvbWluZ0RhdGE7XHJcbiAgICB9XHJcbiAgICBsZXQgY2hlY2tTdGF0dXMgPSB7XHJcbiAgICAgIHN0YXR1cyA6IGZhbHNlLFxyXG4gICAgICBtc2cgOiBcIlwiXHJcbiAgICB9O1xyXG4gICAgaWYoZmllbGQgJiYgZmllbGQuYWxsb3dEdXBsaWNhY3kpe1xyXG4gICAgICBjaGVja1N0YXR1cy5zdGF0dXMgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIGNoZWNrU3RhdHVzO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIGxldCBwcmltYXJ5X2tleSA9IGZpZWxkLmZpZWxkX25hbWVcclxuICAgICAgbGV0IGNyaXRlcmlhID0gcHJpbWFyeV9rZXkrXCIjZXEjXCIraW5jb21pbmdEYXRhO1xyXG4gICAgICBsZXQgcHJpbWFyeUNyaXRlcmlhTGlzdD1bXTtcclxuICAgICAgcHJpbWFyeUNyaXRlcmlhTGlzdC5wdXNoKGNyaXRlcmlhKTtcclxuICAgICAgaWYoZmllbGQgJiYgZmllbGQucHJpbWFyeUtleUNyaXRlcmlhICYmIEFycmF5LmlzQXJyYXkoZmllbGQucHJpbWFyeUtleUNyaXRlcmlhKSAmJiBmaWVsZC5wcmltYXJ5S2V5Q3JpdGVyaWEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgZmllbGQucHJpbWFyeUtleUNyaXRlcmlhLmZvckVhY2goKGNyaXRlcmlhOmFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY3JMaXN0ID0gY3JpdGVyaWEuc3BsaXQoXCIjXCIpO1xyXG4gICAgICAgICAgY29uc3QgY3IgPSBjckxpc3RbMF0rXCIjXCIrY3JMaXN0WzFdK1wiI1wiK2luY29taW5nRGF0YTtcclxuICAgICAgICAgIHByaW1hcnlDcml0ZXJpYUxpc3QucHVzaChjcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoYWxyZWFkeURhdGFBZGRlZGxpc3QgPT0gdW5kZWZpbmVkKXtcclxuICAgICAgICBhbHJlYWR5RGF0YUFkZGVkbGlzdCA9IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBhbHJlYWR5RXhpc3QgPSBmYWxzZTtcclxuICAgICAgaWYodHlwZW9mIGluY29taW5nRGF0YSA9PSAnb2JqZWN0Jyl7XHJcbiAgICAgICAgYWxyZWFkeURhdGFBZGRlZGxpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICAgIGlmKGVsZW1lbnQuX2lkICYmIGVsZW1lbnQuX2lkID09IGluY29taW5nRGF0YS5faWQpe1xyXG4gICAgICAgICAgICBhbHJlYWR5RXhpc3QgPSAgdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmKHR5cGVvZiBpbmNvbWluZ0RhdGEgPT0gJ3N0cmluZycpe1xyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhbHJlYWR5RGF0YUFkZGVkbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhbHJlYWR5RGF0YUFkZGVkbGlzdFtpbmRleF07XHJcbiAgICAgICAgICBpZihpID09IHVuZGVmaW5lZCB8fCBpID09IC0xKXtcclxuICAgICAgICAgICAgaWYodHlwZW9mIGVsZW1lbnQgPT0gJ3N0cmluZycpe1xyXG4gICAgICAgICAgICAgIGlmKGVsZW1lbnQgPT0gaW5jb21pbmdEYXRhKXtcclxuICAgICAgICAgICAgICAgIGFscmVhZHlFeGlzdCA9ICB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgaWYocHJpbWFyeUNyaXRlcmlhTGlzdCAmJiBwcmltYXJ5Q3JpdGVyaWFMaXN0Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHByaW1hcnlDcml0ZXJpYUxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNyaSA9IHByaW1hcnlDcml0ZXJpYUxpc3RbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICBhbHJlYWR5RXhpc3QgPSB0aGlzLmNoZWNrSWZDb25kaXRpb24oY3JpLGVsZW1lbnQsZmllbGQudHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmKGFscmVhZHlFeGlzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JMaXN0ID0gY3JpLnNwbGl0KFwiI1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNyTGlzdFsxXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImx0ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1N0YXR1cy5tc2cgPSBcIkVudGVyZWQgdmFsdWUgZm9yIFwiKyAoZmllbGQubGFiZWw/ZmllbGQubGFiZWw6JycpICtcIiBpcyBncmV0dGVyIHRoYW4gdG8gXCIrY3JMaXN0WzBdK1wiLiAhISFcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZ3RlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhdHVzLm1zZyA9IFwiRW50ZXJlZCB2YWx1ZSBmb3IgXCIrIChmaWVsZC5sYWJlbD9maWVsZC5sYWJlbDonJykgK1wiIGlzIGxlc3MgdGhhbiB0byBcIitjckxpc3RbMF0rXCIuICEhIVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhdHVzLm1zZyA9IFwiRW50ZXJlZCB2YWx1ZSBmb3IgXCIrIChmaWVsZC5sYWJlbD9maWVsZC5sYWJlbDonJykgK1wiIGlzIGFscmVhZHkgYWRkZWQuICEhIVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoYWxyZWFkeUV4aXN0KXtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIGFscmVhZHlFeGlzdCA9ICBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZihhbHJlYWR5RXhpc3Qpe1xyXG4gICAgICAgIGNoZWNrU3RhdHVzLnN0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGNoZWNrU3RhdHVzO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBjaGVja1N0YXR1cy5zdGF0dXMgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gY2hlY2tTdGF0dXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG4gIGNoZWNrQ3VzdG1pemVkVmFsdVZhbGlkYXRpb24oZmllbGRzOmFueSwgdmFsdWU6YW55KSB7XHJcbiAgICBsZXQgdmFsaWRhdGU6YW55ID0gW107XHJcbiAgICBsZXQgcmVzcG9uc2U6YW55ID0ge1xyXG4gICAgICBzdGF0dXMgOiBmYWxzZSxcclxuICAgICAgbXNnIDogXCJcIlxyXG4gICAgfVxyXG4gICAgZmllbGRzLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBcImdyaWRfc2VsZWN0aW9uXCI6XHJcbiAgICAgICAgY2FzZSBcImxpc3Rfb2Zfc3RyaW5nXCI6XHJcbiAgICAgICAgICBpZiAoZWxlbWVudC5pc19tYW5kYXRvcnkpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPT09IHVuZGVmaW5lZCB8fCB2YWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdID09PSAnJyB8fCB2YWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdID09PSBudWxsIHx8ICF0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5pc0FycmF5KHZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgdmFsaWRhdGUucHVzaChlbGVtZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5pc0FycmF5KHZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0ubGVuZ3RoIDw9IDApIHtcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHZhbGlkYXRlID0gdmFsaWRhdGU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKHZhbGlkYXRlLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGZpZWxkTmFtZSA9ICcnO1xyXG4gICAgICB2YWxpZGF0ZS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgIGlmIChmaWVsZE5hbWUgPT0gJycpIHtcclxuICAgICAgICAgIGZpZWxkTmFtZSArPSBlbGVtZW50LmxhYmVsXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGZpZWxkTmFtZSArPSAnLCAnICsgZWxlbWVudC5sYWJlbFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXNwb25zZS5tc2cgPSBmaWVsZE5hbWUgKyAnIFJlcXVpcmVkLic7XHJcbiAgICAgIHJlc3BvbnNlLnN0YXR1cyA9IGZhbHNlO1xyXG4gICAgICAvLyB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KCdiZy1kYW5nZXInLCBmaWVsZE5hbWUgKyAnIFJlcXVpcmVkLicpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXNwb25zZS5zdGF0dXMgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tDYWxsR3JpZERhdGEoT2JqZWN0VmFsdWU6YW55LGdyaWREaXNhYmxlOmJvb2xlYW4pe1xyXG4gICAgbGV0IGNoZWNrID0gZmFsc2U7XHJcbiAgICBpZihncmlkRGlzYWJsZSl7XHJcbiAgICAgIGxldCBsaXN0ID0gT2JqZWN0LnZhbHVlcyhPYmplY3RWYWx1ZSk7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IHZhbCA9IGxpc3RbaW5kZXhdO1xyXG4gICAgICAgIGlmKHZhbCAhPSAnJykge1xyXG4gICAgICAgICAgY2hlY2sgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIGNoZWNrID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGVjaztcclxuICB9XHJcblxyXG4gIGNoZWNrVXBkYXRlUGVybWlzc2lvbihyb3dkYXRhOmFueSxkZXRhaWxzOmFueSl7XHJcbiAgICBpZihkZXRhaWxzICYmIGRldGFpbHMucGVybWlzc2lvbl9rZXkgJiYgZGV0YWlscy5wZXJtaXNzaW9uX2tleSAhPSAnJyAmJiBkZXRhaWxzLnBlcm1pc3Npb25fdmFsdWUgJiYgZGV0YWlscy5wZXJtaXNzaW9uX3ZhbHVlICE9ICcnKXtcclxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRPYmplY3RWYWx1ZShkZXRhaWxzLnBlcm1pc3Npb25fa2V5LHJvd2RhdGEpXHJcbiAgICAgIGlmKHZhbHVlID09IGRldGFpbHMucGVybWlzc2lvbl92YWx1ZSl7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLm5vdGlmeShcImJ0bi1kYW5nZXJcIixcIkNhbm5vdCBiZSB1cGRhdGUhISFcIilcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hlY2tGaWVsZHNBdmFpbGFiaWxpdHkoZm9ybU5hbWU6c3RyaW5nLHRhYjphbnksZ3JpZEJ1dHRvbnM6YW55KXtcclxuICAgIGlmKHRhYiAmJiB0YWI/LmZvcm1zKXtcclxuICAgICAgbGV0IGZvcm0gPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRGb3JtKHRhYi5mb3Jtcyxmb3JtTmFtZSxncmlkQnV0dG9ucyk7XHJcbiAgICAgIGlmKGZvcm0gJiYgZm9ybT8uWyd0YWJsZUZpZWxkcyddICYmIGZvcm0/LlsndGFibGVGaWVsZHMnXT8ubGVuZ3RoID4gMCApe1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1lbHNle1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
|