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,875 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../../common-utils/common-function.service";
|
|
4
|
+
import * as i2 from "../../common-utils/core-function/core-function.service";
|
|
5
|
+
import * as i3 from "../../fileHandler/file-handler.service";
|
|
6
|
+
import * as i4 from "../../check-if/check-if.service";
|
|
7
|
+
import * as i5 from "../../storage/storage.service";
|
|
8
|
+
import * as i6 from "@angular/common";
|
|
9
|
+
import * as i7 from "../../data-share/data-share.service";
|
|
10
|
+
import * as i8 from "../../api/api-call/api-call.service";
|
|
11
|
+
import * as i9 from "../../api/api.service";
|
|
12
|
+
export class GridCommonFunctionService {
|
|
13
|
+
constructor(CommonFunctionService, coreFunctionService, fileHandlerService, checkIfService, storageService, datePipe, CurrencyPipe, dataShareService, apiCallService, apiService) {
|
|
14
|
+
this.CommonFunctionService = CommonFunctionService;
|
|
15
|
+
this.coreFunctionService = coreFunctionService;
|
|
16
|
+
this.fileHandlerService = fileHandlerService;
|
|
17
|
+
this.checkIfService = checkIfService;
|
|
18
|
+
this.storageService = storageService;
|
|
19
|
+
this.datePipe = datePipe;
|
|
20
|
+
this.CurrencyPipe = CurrencyPipe;
|
|
21
|
+
this.dataShareService = dataShareService;
|
|
22
|
+
this.apiCallService = apiCallService;
|
|
23
|
+
this.apiService = apiService;
|
|
24
|
+
}
|
|
25
|
+
modifyGridData(gridData, gridColumns, field, editableGridColumns, typographyCrList) {
|
|
26
|
+
let modifiedData = [];
|
|
27
|
+
if (gridColumns.length > 0) {
|
|
28
|
+
for (let i = 0; i < gridData.length; i++) {
|
|
29
|
+
const row = gridData[i];
|
|
30
|
+
let modifyRow = this.rowModify(row, field, gridColumns, editableGridColumns, typographyCrList);
|
|
31
|
+
modifiedData.push(modifyRow);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return modifiedData;
|
|
35
|
+
}
|
|
36
|
+
rowModify(row, field, gridColumns, editableGridColumns, typographyCrList) {
|
|
37
|
+
let modifyRow = JSON.parse(JSON.stringify(row));
|
|
38
|
+
modifyRow["disabled"] = this.checkIfService.checkRowIf(row, field);
|
|
39
|
+
for (let j = 0; j < gridColumns.length; j++) {
|
|
40
|
+
const column = gridColumns[j];
|
|
41
|
+
if (!column.editable || editableGridColumns.length == 0) {
|
|
42
|
+
modifyRow[column.field_name] = this.getValueForGrid(column, row);
|
|
43
|
+
}
|
|
44
|
+
modifyRow[column.field_name + "_tooltip"] = this.getValueForGridTooltip(column, row);
|
|
45
|
+
if (column.editable) {
|
|
46
|
+
modifyRow[column.field_name + "_disabled"] = this.checkIfService.isDisableRow(column, row);
|
|
47
|
+
if (column.type == 'file' && editableGridColumns.length > 0) {
|
|
48
|
+
if (row && row[column.field_name] && this.CommonFunctionService.isArray(row[column.field_name]) && row[column.field_name].length > 0) {
|
|
49
|
+
modifyRow[column.field_name] = this.fileHandlerService.modifyUploadFiles(row[column.field_name]);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
modifyRow[column.field_name] = row[column.field_name];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (editableGridColumns && (editableGridColumns.length == 1 || (field && !field.grid_row_selection) || row.selected)) {
|
|
58
|
+
modifyRow["column_edit"] = true;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
modifyRow["column_edit"] = false;
|
|
62
|
+
}
|
|
63
|
+
if (editableGridColumns && editableGridColumns.length == 0 && field && Object.keys(field).length > 0) {
|
|
64
|
+
modifyRow['actionBtnDisplay'] = this.checkRowDisabledIf(field, row);
|
|
65
|
+
}
|
|
66
|
+
if (typographyCrList && typographyCrList.length > 0) {
|
|
67
|
+
modifyRow['background-color'] = this.checkTypgraphCondition(typographyCrList, row, 'background-color');
|
|
68
|
+
}
|
|
69
|
+
return modifyRow;
|
|
70
|
+
}
|
|
71
|
+
getListByKeyValueToList(list, key, value) {
|
|
72
|
+
let getlist = [];
|
|
73
|
+
for (let i = 0; i < list.length; i++) {
|
|
74
|
+
const element = list[i];
|
|
75
|
+
if (element && element[key] == value) {
|
|
76
|
+
getlist.push(element);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return getlist;
|
|
80
|
+
}
|
|
81
|
+
modifyGridColumns(gridColumns, parentObject) {
|
|
82
|
+
let modifyGridColumns = [];
|
|
83
|
+
if (gridColumns && gridColumns.length > 0) {
|
|
84
|
+
modifyGridColumns = this.CommonFunctionService.updateFieldInList('display', gridColumns);
|
|
85
|
+
for (let i = 0; i < modifyGridColumns.length; i++) {
|
|
86
|
+
const field = modifyGridColumns[i];
|
|
87
|
+
if (this.coreFunctionService.isNotBlank(field.show_if)) {
|
|
88
|
+
if (!this.checkIfService.showIf(field, parentObject)) {
|
|
89
|
+
field['display'] = false;
|
|
90
|
+
field['show'] = true;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
if (field.hide != undefined && field.hide) {
|
|
94
|
+
field['display'] = false;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
field['display'] = true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
if (field && field.hide) {
|
|
103
|
+
field['display'] = false;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
field['display'] = true;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (field['field_class']) {
|
|
110
|
+
field['field_class'] = field['field_class'].trim();
|
|
111
|
+
}
|
|
112
|
+
field['width'] = this.getGridColumnWidth(field, gridColumns);
|
|
113
|
+
if (field && field.type && field.type != '') {
|
|
114
|
+
switch (field.type.toLowerCase()) {
|
|
115
|
+
case "info":
|
|
116
|
+
case "html":
|
|
117
|
+
case "file":
|
|
118
|
+
case "template":
|
|
119
|
+
case "image":
|
|
120
|
+
case "icon":
|
|
121
|
+
case "download_file":
|
|
122
|
+
case "redirect":
|
|
123
|
+
case "color":
|
|
124
|
+
field['hideCopy'] = true;
|
|
125
|
+
break;
|
|
126
|
+
default:
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
;
|
|
132
|
+
}
|
|
133
|
+
return modifyGridColumns;
|
|
134
|
+
}
|
|
135
|
+
getGridColumnWidth(column, listOfGridFieldName) {
|
|
136
|
+
if (column.width && column.width != '0') {
|
|
137
|
+
return column.width;
|
|
138
|
+
}
|
|
139
|
+
// else {
|
|
140
|
+
// if (listOfGridFieldName.length > 8) {
|
|
141
|
+
// return '150px';
|
|
142
|
+
// }
|
|
143
|
+
else {
|
|
144
|
+
return '';
|
|
145
|
+
}
|
|
146
|
+
// }
|
|
147
|
+
}
|
|
148
|
+
updateGridDataToModifiedData(grid_row_selection, gridData, modifiedGridData, listOfGridFieldName) {
|
|
149
|
+
let gridSelectedData = [];
|
|
150
|
+
let modifiedSelectedData = [];
|
|
151
|
+
if (grid_row_selection == false) {
|
|
152
|
+
gridSelectedData = [...gridData];
|
|
153
|
+
modifiedSelectedData = [...modifiedGridData];
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
gridSelectedData = this.getListByKeyValueToList(gridData, "selected", true);
|
|
157
|
+
modifiedSelectedData = this.getListByKeyValueToList(modifiedGridData, "selected", true);
|
|
158
|
+
}
|
|
159
|
+
if (listOfGridFieldName.length > 0) {
|
|
160
|
+
gridSelectedData.forEach((data, i) => {
|
|
161
|
+
listOfGridFieldName.forEach((column) => {
|
|
162
|
+
if (column.editable || column.type == 'number') {
|
|
163
|
+
switch (column.type) {
|
|
164
|
+
case 'file':
|
|
165
|
+
gridSelectedData[i][column.field_name] = this.fileHandlerService.modifyUploadFiles(modifiedSelectedData[i][column.field_name]);
|
|
166
|
+
break;
|
|
167
|
+
default:
|
|
168
|
+
gridSelectedData[i][column.field_name] = modifiedSelectedData[i][column.field_name];
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
return gridSelectedData;
|
|
176
|
+
}
|
|
177
|
+
applyOnGridFilter(field) {
|
|
178
|
+
if (field && field.etc_fields && field.etc_fields.on_grid_filter === 'false') {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
applyOnGridFilterLabel(field) {
|
|
184
|
+
if (field && field.etc_fields && field.etc_fields.on_grid_filter_label != '') {
|
|
185
|
+
return field.etc_fields.on_grid_filter_label;
|
|
186
|
+
}
|
|
187
|
+
return "Search Parameter ...";
|
|
188
|
+
}
|
|
189
|
+
modifyTableFields(tablefields) {
|
|
190
|
+
}
|
|
191
|
+
gridDataModify(modifyData, data, fields, field_name, key, object) {
|
|
192
|
+
let modifyObject = {
|
|
193
|
+
"modifyData": modifyData,
|
|
194
|
+
"fields": fields,
|
|
195
|
+
"field_index": -1
|
|
196
|
+
};
|
|
197
|
+
if (fields && fields.length > 0) {
|
|
198
|
+
for (let i = 0; i < fields.length; i++) {
|
|
199
|
+
const element = fields[i];
|
|
200
|
+
const type = element.type;
|
|
201
|
+
const fieldName = element.field_name;
|
|
202
|
+
if (type && type.startsWith(key) && field_name == fieldName) {
|
|
203
|
+
if (element && fieldName && data && data[fieldName]) {
|
|
204
|
+
const cData = data[fieldName];
|
|
205
|
+
if (Array.isArray(cData) && cData.length > 0) {
|
|
206
|
+
const gridColumns = element.gridColumns;
|
|
207
|
+
let typographyCrList = [];
|
|
208
|
+
if (element['colorCriteria'] && element['colorCriteria'].length > 0) {
|
|
209
|
+
typographyCrList = element['colorCriteria'];
|
|
210
|
+
}
|
|
211
|
+
const modifyList = this.modifyGridData(cData, gridColumns, element, [], typographyCrList);
|
|
212
|
+
modifyData[fieldName] = modifyList;
|
|
213
|
+
element.gridColumns = this.modifyGridColumns(gridColumns, object);
|
|
214
|
+
modifyObject.field_index = i;
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
modifyData[fieldName] = cData;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else if (type && type.startsWith('list_of_fields') && element.datatype == "list_of_object_with_popup" && field_name == fieldName) {
|
|
222
|
+
if (element && fieldName && data && data[fieldName]) {
|
|
223
|
+
const cData = data[fieldName];
|
|
224
|
+
if (Array.isArray(cData) && cData.length > 0) {
|
|
225
|
+
const gridColumns = element.list_of_fields;
|
|
226
|
+
const modifyList = this.modifyListofFieldsData({}, cData, gridColumns)['data'];
|
|
227
|
+
modifyData[fieldName] = modifyList;
|
|
228
|
+
modifyObject.field_index = i;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
modifyObject.modifyData = modifyData;
|
|
235
|
+
modifyObject.fields = fields;
|
|
236
|
+
return modifyObject;
|
|
237
|
+
}
|
|
238
|
+
modifyListofFieldsData(parentField, data, fields) {
|
|
239
|
+
let modifyListoffieldObject = {};
|
|
240
|
+
let modifyData = [];
|
|
241
|
+
if (fields && fields.length > 0 && data && data.length > 0) {
|
|
242
|
+
for (let index = 0; index < data.length; index++) {
|
|
243
|
+
const object = data[index];
|
|
244
|
+
const mObject = this.getModifyListOfFieldsObject(parentField, object, fields);
|
|
245
|
+
modifyData.push(mObject);
|
|
246
|
+
}
|
|
247
|
+
modifyListoffieldObject['data'] = modifyData;
|
|
248
|
+
}
|
|
249
|
+
return modifyListoffieldObject;
|
|
250
|
+
}
|
|
251
|
+
getModifyListOfFieldsObject(parentField, object, fields) {
|
|
252
|
+
let mObject = {};
|
|
253
|
+
if (fields && fields.length > 0) {
|
|
254
|
+
for (let index = 0; index < fields.length; index++) {
|
|
255
|
+
const element = fields[index];
|
|
256
|
+
let fieldName = element.field_name;
|
|
257
|
+
mObject[fieldName] = this.showListFieldValue(object, element);
|
|
258
|
+
}
|
|
259
|
+
mObject['actionBtnDisplay'] = this.checkRowDisabledIf(parentField, object);
|
|
260
|
+
}
|
|
261
|
+
return mObject;
|
|
262
|
+
}
|
|
263
|
+
showListFieldValue(listOfField, item) {
|
|
264
|
+
switch (item.type) {
|
|
265
|
+
case "typeahead":
|
|
266
|
+
if (item.datatype == "list_of_object") {
|
|
267
|
+
if (Array.isArray(listOfField[item.field_name]) && listOfField[item.field_name].length > 0 && listOfField[item.field_name] != null && listOfField[item.field_name] != undefined && listOfField[item.field_name] != '') {
|
|
268
|
+
item['hideCopy'] = true;
|
|
269
|
+
return '<i class="fa fa-eye cursor-pointer"></i>';
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
return '-';
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
else if (item.datatype == "object") {
|
|
276
|
+
if (item.display_name && item.display_name != "") {
|
|
277
|
+
return this.CommonFunctionService.getObjectValue(item.display_name, listOfField);
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
return listOfField[item.field_name];
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
else if (item.datatype == "text") {
|
|
284
|
+
if (item.display_name && item.display_name != "") {
|
|
285
|
+
return this.CommonFunctionService.getObjectValue(item.display_name, listOfField);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
return listOfField[item.field_name];
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
break;
|
|
292
|
+
case "list_of_string":
|
|
293
|
+
case "list_of_checkbox":
|
|
294
|
+
case "grid_selection":
|
|
295
|
+
case "list_of_fields":
|
|
296
|
+
if (Array.isArray(listOfField[item.field_name]) && listOfField[item.field_name].length > 0 && listOfField[item.field_name] != null && listOfField[item.field_name] != undefined && listOfField[item.field_name] != '') {
|
|
297
|
+
item['hideCopy'] = true;
|
|
298
|
+
if (this.storageService.checkPlatForm() == 'mobile') {
|
|
299
|
+
return '<span class="material-symbols-outlined cursor-pointer">visibility</span>';
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
return '<i class="fa fa-eye cursor-pointer"></i>';
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
return '-';
|
|
307
|
+
}
|
|
308
|
+
case "checkbox":
|
|
309
|
+
let value = false;
|
|
310
|
+
if (item.display_name && item.display_name != "") {
|
|
311
|
+
value = this.CommonFunctionService.getObjectValue(item.display_name, listOfField);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
value = this.getValueForGrid(item, listOfField);
|
|
315
|
+
}
|
|
316
|
+
return value ? "Yes" : "No";
|
|
317
|
+
default:
|
|
318
|
+
if (item.display_name && item.display_name != "") {
|
|
319
|
+
return this.CommonFunctionService.getObjectValue(item.display_name, listOfField);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
return this.getValueForGrid(item, listOfField);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
checkRowDisabledIf(field, data) {
|
|
327
|
+
if (field && field.disableRowIf && field.disableRowIf != '') {
|
|
328
|
+
const condition = field.disableRowIf;
|
|
329
|
+
if (condition) {
|
|
330
|
+
if (field.disableRowIfOnlySelection) {
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
return !this.checkIfService.checkDisableRowIf(condition, data);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return true;
|
|
339
|
+
}
|
|
340
|
+
checkTypgraphCondition(typographyCrList, object, name) {
|
|
341
|
+
let background = '';
|
|
342
|
+
if (typographyCrList && typographyCrList.length >= 1) {
|
|
343
|
+
let criteriaMatched = false;
|
|
344
|
+
let matchedelement = {};
|
|
345
|
+
for (let index = 0; index < typographyCrList.length; index++) {
|
|
346
|
+
const element = typographyCrList[index];
|
|
347
|
+
let crList = element['crList'];
|
|
348
|
+
let childConditionsMatched = false;
|
|
349
|
+
for (let j = 0; j < crList.length; j++) {
|
|
350
|
+
const child = crList[j];
|
|
351
|
+
let modify = child.replaceAll(';', "#");
|
|
352
|
+
if (!this.checkIfService.checkIfConditionForArrayListValue(modify, object)) {
|
|
353
|
+
childConditionsMatched = false;
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
childConditionsMatched = true;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
if (childConditionsMatched) {
|
|
361
|
+
matchedelement = typographyCrList[index];
|
|
362
|
+
criteriaMatched = true;
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
criteriaMatched = false;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
if (criteriaMatched) {
|
|
370
|
+
let typograpy = matchedelement['typoGraphy'];
|
|
371
|
+
let value = '';
|
|
372
|
+
switch (name) {
|
|
373
|
+
case 'background-color':
|
|
374
|
+
value = typograpy['background_color'];
|
|
375
|
+
break;
|
|
376
|
+
default:
|
|
377
|
+
break;
|
|
378
|
+
}
|
|
379
|
+
background = value;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return background;
|
|
383
|
+
}
|
|
384
|
+
modifiedGridColumns(gridColumns, selectedRow, formValue) {
|
|
385
|
+
if (gridColumns.length > 0) {
|
|
386
|
+
gridColumns.forEach((field) => {
|
|
387
|
+
if (this.coreFunctionService.isNotBlank(field.show_if)) {
|
|
388
|
+
if (!this.checkIfService.checkShowIf(field, selectedRow, formValue)) {
|
|
389
|
+
field['display'] = false;
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
field['display'] = true;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
field['display'] = true;
|
|
397
|
+
}
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
return gridColumns;
|
|
401
|
+
}
|
|
402
|
+
checkGridSelectionMendetory(gridSelectionMendetoryList, selectedRow, formValue, custmizedFormValue) {
|
|
403
|
+
let validation = {
|
|
404
|
+
'status': true,
|
|
405
|
+
'msg': ''
|
|
406
|
+
};
|
|
407
|
+
if (gridSelectionMendetoryList && gridSelectionMendetoryList.length > 0) {
|
|
408
|
+
let check = 0;
|
|
409
|
+
gridSelectionMendetoryList.forEach((field) => {
|
|
410
|
+
let data = [];
|
|
411
|
+
if (custmizedFormValue[field.field_name]) {
|
|
412
|
+
data = custmizedFormValue[field.field_name];
|
|
413
|
+
}
|
|
414
|
+
if (field.mendetory_fields && field.mendetory_fields.length > 0) {
|
|
415
|
+
field.mendetory_fields = this.modifiedGridColumns(field.mendetory_fields, selectedRow, formValue);
|
|
416
|
+
if (data && data.length > 0) {
|
|
417
|
+
field.mendetory_fields.forEach((mField) => {
|
|
418
|
+
const fieldName = mField.field_name;
|
|
419
|
+
if (mField.display) {
|
|
420
|
+
data.forEach((row) => {
|
|
421
|
+
if (row && row[fieldName] == undefined || row[fieldName] == '' || row[fieldName] == null) {
|
|
422
|
+
if (validation.msg == '') {
|
|
423
|
+
validation.msg = mField.label + ' of ' + field.label + ' is required.';
|
|
424
|
+
}
|
|
425
|
+
check = 1;
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
if (check != 0) {
|
|
434
|
+
validation.status = false;
|
|
435
|
+
return validation;
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
return validation;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
else {
|
|
442
|
+
return validation;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
getGridSelectedData(data, field) {
|
|
446
|
+
let responce = {
|
|
447
|
+
gridSelectedData: [],
|
|
448
|
+
customEntryData: []
|
|
449
|
+
};
|
|
450
|
+
if (data && data.length > 0 && field.add_new_enabled) {
|
|
451
|
+
data.forEach((grid) => {
|
|
452
|
+
if (grid && grid.customEntry) {
|
|
453
|
+
responce.customEntryData[field.field_name].push(grid);
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
responce.gridSelectedData.push(grid);
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
responce.gridSelectedData = data;
|
|
462
|
+
}
|
|
463
|
+
return responce;
|
|
464
|
+
}
|
|
465
|
+
getModifiedGridColumns(gridColumns, object) {
|
|
466
|
+
if (gridColumns.length > 0) {
|
|
467
|
+
gridColumns.forEach((field) => {
|
|
468
|
+
if (this.coreFunctionService.isNotBlank(field.show_if)) {
|
|
469
|
+
if (!this.checkIfService.showIf(field, object)) {
|
|
470
|
+
field['display'] = false;
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
field['display'] = true;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
field['display'] = true;
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
return gridColumns;
|
|
482
|
+
}
|
|
483
|
+
isDate(date) {
|
|
484
|
+
let dateValue = new Date(date);
|
|
485
|
+
return (dateValue !== "Invalid Date") && !isNaN(dateValue);
|
|
486
|
+
}
|
|
487
|
+
getValueForGrid(field, object) {
|
|
488
|
+
let value = '';
|
|
489
|
+
let fieldName = '';
|
|
490
|
+
if (field) {
|
|
491
|
+
if (this.coreFunctionService.isNotBlank(field.display_name)) {
|
|
492
|
+
fieldName = field.display_name;
|
|
493
|
+
}
|
|
494
|
+
else if (this.coreFunctionService.isNotBlank(field.field_name)) {
|
|
495
|
+
fieldName = field.field_name;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
if (fieldName != '') {
|
|
499
|
+
value = this.CommonFunctionService.getObjectValue(fieldName, object);
|
|
500
|
+
}
|
|
501
|
+
if (!field.type)
|
|
502
|
+
field.type = "Text";
|
|
503
|
+
let returnValue = '';
|
|
504
|
+
switch (field.type.toLowerCase()) {
|
|
505
|
+
case 'datetime':
|
|
506
|
+
if (value && value != '') {
|
|
507
|
+
if (this.storageService.checkPlatForm() == 'mobile') {
|
|
508
|
+
returnValue = this.datePipe.transform(value, 'medium');
|
|
509
|
+
}
|
|
510
|
+
else {
|
|
511
|
+
returnValue = this.datePipe.transform(value, 'dd/MM/yyyy h:mm a');
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
return returnValue;
|
|
515
|
+
case 'date':
|
|
516
|
+
case 'daterange':
|
|
517
|
+
if (value && value != '') {
|
|
518
|
+
if (this.storageService.checkPlatForm() == 'mobile') {
|
|
519
|
+
returnValue = this.datePipe.transform(value, 'mediumDate');
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
returnValue = this.datePipe.transform(value, 'dd/MM/yyyy');
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
return returnValue;
|
|
526
|
+
case 'time': return this.isDate(value) ? this.datePipe.transform(value, 'h:mm a') : value;
|
|
527
|
+
case "boolean": return value ? "Yes" : "No";
|
|
528
|
+
case "currency": return this.CurrencyPipe.transform(value, 'INR');
|
|
529
|
+
case "dropdown": return value && value.name ? value.name : value;
|
|
530
|
+
case "typeahead": return value && value.name ? value.name : value;
|
|
531
|
+
case "info":
|
|
532
|
+
if (value && value != '') {
|
|
533
|
+
if (this.storageService.checkPlatForm() == 'mobile') {
|
|
534
|
+
return '<span class="material-symbols-outlined cursor-pointer">visibility</span>';
|
|
535
|
+
}
|
|
536
|
+
else {
|
|
537
|
+
return '<i class="fa fa-eye cursor-pointer"></i>';
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
return '-';
|
|
542
|
+
}
|
|
543
|
+
case "html":
|
|
544
|
+
if (value && value != '') {
|
|
545
|
+
return '<span class="material-icons cursor-pointer">preview</span>';
|
|
546
|
+
}
|
|
547
|
+
else {
|
|
548
|
+
return '-';
|
|
549
|
+
}
|
|
550
|
+
case "file":
|
|
551
|
+
case "file_with_preview":
|
|
552
|
+
case "file_with_print":
|
|
553
|
+
if (value && value != '') {
|
|
554
|
+
if (this.storageService.checkPlatForm() == 'mobile') {
|
|
555
|
+
return '<span class="material-symbols-outlined cursor-pointer">text_snippet</span>';
|
|
556
|
+
}
|
|
557
|
+
else {
|
|
558
|
+
return '<span class="material-icons cursor-pointer">text_snippet</span>';
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
else {
|
|
562
|
+
return '-';
|
|
563
|
+
}
|
|
564
|
+
case "template":
|
|
565
|
+
if (value && value != '') {
|
|
566
|
+
if (this.storageService.checkPlatForm() == 'mobile') {
|
|
567
|
+
return '<span class="material-symbols-outlined">description</span>';
|
|
568
|
+
}
|
|
569
|
+
else {
|
|
570
|
+
return '<i class="fa fa-file cursor-pointer" aria-hidden="true"></i>';
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
else {
|
|
574
|
+
return '-';
|
|
575
|
+
}
|
|
576
|
+
case "image":
|
|
577
|
+
return '<img src="data:image/jpg;base64,' + value + '" />';
|
|
578
|
+
case "icon":
|
|
579
|
+
if (this.storageService.checkPlatForm() == 'mobile') {
|
|
580
|
+
return '<span class="material-symbols-outlined cursor-pointer">' + field.field_class + '</span>';
|
|
581
|
+
}
|
|
582
|
+
else {
|
|
583
|
+
return '<span class="material-icons cursor-pointer">' + field.field_class + '</span>';
|
|
584
|
+
}
|
|
585
|
+
case "redirect":
|
|
586
|
+
if (value) {
|
|
587
|
+
if (this.storageService.checkPlatForm() == 'mobile') {
|
|
588
|
+
return '<span class="fa fa-external-link" aria-hidden="true"></span>';
|
|
589
|
+
}
|
|
590
|
+
else {
|
|
591
|
+
return '<i class="fa fa-external-link" aria-hidden="true"></i>';
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
else {
|
|
595
|
+
return '-';
|
|
596
|
+
}
|
|
597
|
+
case "download_file":
|
|
598
|
+
if (value && value != '') {
|
|
599
|
+
if (this.storageService.checkPlatForm() == 'mobile') {
|
|
600
|
+
return '<span class="material-symbols-outlined cursor-pointer">' + field.field_class + '</span>';
|
|
601
|
+
}
|
|
602
|
+
else {
|
|
603
|
+
return '<span class="material-icons cursor-pointer">' + field.field_class + '</span>';
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
else {
|
|
607
|
+
return '-';
|
|
608
|
+
}
|
|
609
|
+
case "trim_of_string":
|
|
610
|
+
if (value != undefined && value != null && value != '') {
|
|
611
|
+
if (typeof value == 'string') {
|
|
612
|
+
let stringObject = value.split('/');
|
|
613
|
+
if (stringObject.length > 0) {
|
|
614
|
+
return stringObject[0];
|
|
615
|
+
}
|
|
616
|
+
else {
|
|
617
|
+
return value;
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
else {
|
|
621
|
+
return value;
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
else {
|
|
625
|
+
return value;
|
|
626
|
+
}
|
|
627
|
+
case "color":
|
|
628
|
+
break;
|
|
629
|
+
case "pattern":
|
|
630
|
+
if (object != null) {
|
|
631
|
+
return this.CommonFunctionService.getConvertedString(object, field.field_name);
|
|
632
|
+
}
|
|
633
|
+
break;
|
|
634
|
+
case "chips":
|
|
635
|
+
if (this.coreFunctionService.isNotBlank(value) && this.CommonFunctionService.isArray(value)) {
|
|
636
|
+
let name = "";
|
|
637
|
+
for (let i = 0; i < value.length; i++) {
|
|
638
|
+
if (this.coreFunctionService.isNotBlank(value[i]['name'])) {
|
|
639
|
+
name = name + ', ' + value[i]['name'];
|
|
640
|
+
}
|
|
641
|
+
else {
|
|
642
|
+
name = name + ', ' + value[i];
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
return name.substring(2);
|
|
646
|
+
;
|
|
647
|
+
}
|
|
648
|
+
return "-";
|
|
649
|
+
case "reference_names":
|
|
650
|
+
if (this.coreFunctionService.isNotBlank(value) && this.CommonFunctionService.isArray(value)) {
|
|
651
|
+
let name = '';
|
|
652
|
+
for (let i = 0; i < value.length; i++) {
|
|
653
|
+
if (this.coreFunctionService.isNotBlank(value[i]['name'])) {
|
|
654
|
+
name = name + ', ' + value[i]['name'];
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
if (name.length > 1) {
|
|
658
|
+
name = name.substring(2);
|
|
659
|
+
}
|
|
660
|
+
return name;
|
|
661
|
+
}
|
|
662
|
+
else {
|
|
663
|
+
return "-";
|
|
664
|
+
}
|
|
665
|
+
default: return value;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
getValueForGridTooltip(field, object) {
|
|
669
|
+
let value = '';
|
|
670
|
+
if (field.field_name != undefined && field.field_name != null && field.field_name != '') {
|
|
671
|
+
value = this.CommonFunctionService.getObjectValue(field.field_name, object);
|
|
672
|
+
}
|
|
673
|
+
if (!field.type)
|
|
674
|
+
field.type = "Text";
|
|
675
|
+
switch (field.type.toLowerCase()) {
|
|
676
|
+
case 'datetime': return this.datePipe.transform(value, 'dd/MM/yyyy h:mm a');
|
|
677
|
+
case 'date': return this.datePipe.transform(value, 'dd/MM/yyyy');
|
|
678
|
+
case 'time': return this.isDate(value) ? this.datePipe.transform(value, 'h:mm a') : value;
|
|
679
|
+
case "boolean": return value ? "Yes" : "No";
|
|
680
|
+
case "currency": return this.CurrencyPipe.transform(value, 'INR');
|
|
681
|
+
case "info":
|
|
682
|
+
case "file":
|
|
683
|
+
case "template":
|
|
684
|
+
case "image":
|
|
685
|
+
case "icon":
|
|
686
|
+
case "html":
|
|
687
|
+
return '';
|
|
688
|
+
default: return value;
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
getNoOfItems(grid, defaultNoOfItem) {
|
|
692
|
+
if (grid && grid.details && grid.details.numberOfItems) {
|
|
693
|
+
defaultNoOfItem = grid.details.numberOfItems;
|
|
694
|
+
}
|
|
695
|
+
return defaultNoOfItem;
|
|
696
|
+
}
|
|
697
|
+
setOldTabCount(tab) {
|
|
698
|
+
let dataCount = {};
|
|
699
|
+
let count = {};
|
|
700
|
+
let totalDataCount = {};
|
|
701
|
+
const currentTabName = this.storageService.GetActiveMenu()['name'];
|
|
702
|
+
const key = currentTabName + "_" + tab.name;
|
|
703
|
+
totalDataCount = this.dataShareService.getGridCountData();
|
|
704
|
+
let oldDataSize = totalDataCount[key];
|
|
705
|
+
count[key] = oldDataSize;
|
|
706
|
+
dataCount['count'] = count;
|
|
707
|
+
dataCount['gridCountData'] = totalDataCount;
|
|
708
|
+
this.dataShareService.shareGridCountData(dataCount);
|
|
709
|
+
}
|
|
710
|
+
compareAuditHistoryData(formFieldsData, currentObjectData, previousObjectData) {
|
|
711
|
+
let formFields = formFieldsData;
|
|
712
|
+
let currentObj = {};
|
|
713
|
+
let previousObject = {};
|
|
714
|
+
for (let i = 0; i < formFields.length; i++) {
|
|
715
|
+
let field = formFields[i];
|
|
716
|
+
let isChanged = false;
|
|
717
|
+
if (field && field.field_name) {
|
|
718
|
+
currentObj = currentObjectData[field.field_name];
|
|
719
|
+
previousObject = previousObjectData[field.field_name];
|
|
720
|
+
if (currentObj != null && currentObj != undefined && typeof currentObj == 'object') {
|
|
721
|
+
currentObj = currentObjectData[field.field_name].name;
|
|
722
|
+
previousObject = previousObjectData[field.field_name].name;
|
|
723
|
+
if (currentObj != previousObject) {
|
|
724
|
+
isChanged = true;
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
else {
|
|
728
|
+
if (currentObj != previousObject) {
|
|
729
|
+
isChanged = true;
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
field['isChanged'] = isChanged;
|
|
733
|
+
formFieldsData[i] = field;
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
copmareListOfFields(fields, currentObjectData, previousObjectData) {
|
|
738
|
+
let currentData = currentObjectData[fields.field_name];
|
|
739
|
+
let previousData = previousObjectData[fields.field_name];
|
|
740
|
+
let currentObj;
|
|
741
|
+
let previousObject;
|
|
742
|
+
if (currentObjectData[fields.field_name] && currentObjectData[fields.field_name].length > 0) {
|
|
743
|
+
for (let i = 0; i < fields.list_of_fields.length; i++) {
|
|
744
|
+
let isChanged = false;
|
|
745
|
+
const field = fields.list_of_fields[i];
|
|
746
|
+
for (let j = 0; j < currentData.length; j++) {
|
|
747
|
+
let comparecurrentObj = currentData[j];
|
|
748
|
+
comparecurrentObj = comparecurrentObj[field.field_name];
|
|
749
|
+
let comparepreviousObject = previousData[j];
|
|
750
|
+
comparepreviousObject = comparepreviousObject[field.field_name];
|
|
751
|
+
if (comparecurrentObj != null && comparecurrentObj != undefined && typeof comparecurrentObj == 'object') {
|
|
752
|
+
currentObj = comparecurrentObj[field.field_name].name;
|
|
753
|
+
previousObject = comparepreviousObject[field.field_name].name;
|
|
754
|
+
if (comparecurrentObj != comparepreviousObject) {
|
|
755
|
+
isChanged = true;
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
else {
|
|
759
|
+
if (comparecurrentObj != comparepreviousObject) {
|
|
760
|
+
if (comparecurrentObj != null && comparecurrentObj != undefined && comparepreviousObject != null && comparepreviousObject != undefined) {
|
|
761
|
+
isChanged = true;
|
|
762
|
+
}
|
|
763
|
+
else {
|
|
764
|
+
isChanged = false;
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
field['isChanged'] = isChanged;
|
|
770
|
+
fields[i] = field;
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
getPage(page, selectContact, tabFilterData, tab, currentMenu, headElements, filterFormValue, sortingColumnName, recordId, rowId, queryParams, itemNumOfGrid, gridDisable, modifyGridData, elements) {
|
|
775
|
+
let responce = {
|
|
776
|
+
"pageNumber": page,
|
|
777
|
+
"modifyGridData": modifyGridData,
|
|
778
|
+
"elements": elements
|
|
779
|
+
};
|
|
780
|
+
// this.pageNumber = page;
|
|
781
|
+
let contact = {};
|
|
782
|
+
let leadId = '';
|
|
783
|
+
if (selectContact != '') {
|
|
784
|
+
tabFilterData.forEach((element) => {
|
|
785
|
+
if (element._id == selectContact['_id']) {
|
|
786
|
+
contact = element;
|
|
787
|
+
}
|
|
788
|
+
});
|
|
789
|
+
if (contact['lead'] && contact['lead']._id) {
|
|
790
|
+
leadId = contact['lead']._id;
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
const pagePayload = this.apiCallService.getPage(page, tab, currentMenu, headElements, filterFormValue, leadId);
|
|
794
|
+
if (sortingColumnName) {
|
|
795
|
+
pagePayload["path"] = sortingColumnName;
|
|
796
|
+
}
|
|
797
|
+
let crList = pagePayload.data.crList;
|
|
798
|
+
let criteriaList = [];
|
|
799
|
+
if (recordId) {
|
|
800
|
+
let criteria = "_id;eq;" + recordId + ";STATIC";
|
|
801
|
+
criteriaList.push(criteria);
|
|
802
|
+
}
|
|
803
|
+
if (rowId) {
|
|
804
|
+
let criteria = "serialId;eq;" + rowId + ";STATIC";
|
|
805
|
+
criteriaList.push(criteria);
|
|
806
|
+
}
|
|
807
|
+
if (Object.keys(queryParams).length > 0) {
|
|
808
|
+
Object.keys(queryParams).forEach(key => {
|
|
809
|
+
let criteria = key + ";eq;" + queryParams[key] + ";STATIC";
|
|
810
|
+
criteriaList.push(criteria);
|
|
811
|
+
});
|
|
812
|
+
}
|
|
813
|
+
if (criteriaList.length > 0) {
|
|
814
|
+
this.apiCallService.getCriteriaList(criteriaList, {}).forEach((element) => {
|
|
815
|
+
crList.push(element);
|
|
816
|
+
});
|
|
817
|
+
pagePayload.data.crList = crList;
|
|
818
|
+
}
|
|
819
|
+
pagePayload.data.pageSize = itemNumOfGrid;
|
|
820
|
+
this.getGridPayloadData(pagePayload, filterFormValue, gridDisable, tab, responce);
|
|
821
|
+
return responce;
|
|
822
|
+
}
|
|
823
|
+
onSort(columnObject, filterFormValue, gridDisable, tab, sortingColumnName, sortIcon, orderBy, headElements, currentMenu, pageNumber) {
|
|
824
|
+
let responce = {
|
|
825
|
+
"sortingColumnName": sortingColumnName,
|
|
826
|
+
"sortIcon": sortIcon,
|
|
827
|
+
"orderBy": orderBy
|
|
828
|
+
};
|
|
829
|
+
responce.sortingColumnName = responce.orderBy + columnObject.field_name;
|
|
830
|
+
const getSortData = this.apiCallService.getDataForGridFilter(pageNumber, tab, currentMenu, headElements, filterFormValue);
|
|
831
|
+
getSortData['path'] = responce.sortingColumnName;
|
|
832
|
+
this.getGridPayloadData(getSortData, filterFormValue, gridDisable, tab, responce);
|
|
833
|
+
if (responce.orderBy == '-') {
|
|
834
|
+
responce.orderBy = '';
|
|
835
|
+
}
|
|
836
|
+
else {
|
|
837
|
+
responce.orderBy = '-';
|
|
838
|
+
}
|
|
839
|
+
responce.sortIcon == "down" ? (responce.sortIcon = "up-alt") : (responce.sortIcon = "down");
|
|
840
|
+
return responce;
|
|
841
|
+
}
|
|
842
|
+
applyFilter(modifyGridData, elements, tab, currentMenu, headElements, filterValue, selectContact, itemNumOfGrid, gridDisable, sortingColumnName) {
|
|
843
|
+
let responce = {
|
|
844
|
+
"modifyGridData": modifyGridData,
|
|
845
|
+
"elements": elements,
|
|
846
|
+
"pageNumber": 1
|
|
847
|
+
};
|
|
848
|
+
let pagePayload = this.apiCallService.getDataForGrid(responce.pageNumber, tab, currentMenu, headElements, filterValue, selectContact);
|
|
849
|
+
if (sortingColumnName) {
|
|
850
|
+
pagePayload["path"] = sortingColumnName;
|
|
851
|
+
}
|
|
852
|
+
pagePayload.data.pageSize = itemNumOfGrid;
|
|
853
|
+
this.getGridPayloadData(pagePayload, filterValue, gridDisable, tab, responce);
|
|
854
|
+
return responce;
|
|
855
|
+
}
|
|
856
|
+
getGridPayloadData(pagePayload, value, gridDisable, tab, responce) {
|
|
857
|
+
if (this.checkIfService.checkCallGridData(value, gridDisable)) {
|
|
858
|
+
this.apiService.getGridData(pagePayload);
|
|
859
|
+
}
|
|
860
|
+
else {
|
|
861
|
+
responce.modifyGridData = [];
|
|
862
|
+
responce.elements = [];
|
|
863
|
+
this.setOldTabCount(tab);
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
GridCommonFunctionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GridCommonFunctionService, deps: [{ token: i1.CommonFunctionService }, { token: i2.CoreFunctionService }, { token: i3.FileHandlerService }, { token: i4.CheckIfService }, { token: i5.StorageService }, { token: i6.DatePipe }, { token: i6.CurrencyPipe }, { token: i7.DataShareService }, { token: i8.ApiCallService }, { token: i9.ApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
868
|
+
GridCommonFunctionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GridCommonFunctionService, providedIn: 'root' });
|
|
869
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GridCommonFunctionService, decorators: [{
|
|
870
|
+
type: Injectable,
|
|
871
|
+
args: [{
|
|
872
|
+
providedIn: 'root'
|
|
873
|
+
}]
|
|
874
|
+
}], ctorParameters: function () { return [{ type: i1.CommonFunctionService }, { type: i2.CoreFunctionService }, { type: i3.FileHandlerService }, { type: i4.CheckIfService }, { type: i5.StorageService }, { type: i6.DatePipe }, { type: i6.CurrencyPipe }, { type: i7.DataShareService }, { type: i8.ApiCallService }, { type: i9.ApiService }]; } });
|
|
875
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1jb21tb24tZnVuY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZXMvZ3JpZC9ncmlkLWNvbW1vbi1mdW5jdGlvbi9ncmlkLWNvbW1vbi1mdW5jdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7O0FBYTNDLE1BQU0sT0FBTyx5QkFBeUI7SUFFdEMsWUFDVSxxQkFBMkMsRUFDM0MsbUJBQXVDLEVBQ3ZDLGtCQUFzQyxFQUN0QyxjQUE2QixFQUM3QixjQUE2QixFQUM3QixRQUFrQixFQUNsQixZQUEwQixFQUMxQixnQkFBa0MsRUFDbEMsY0FBNkIsRUFDN0IsVUFBcUI7UUFUckIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFzQjtRQUMzQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQW9CO1FBQ3ZDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLGVBQVUsR0FBVixVQUFVLENBQVc7SUFDM0IsQ0FBQztJQUNILGNBQWMsQ0FBQyxRQUFZLEVBQUMsV0FBZSxFQUFDLEtBQVMsRUFBQyxtQkFBdUIsRUFBQyxnQkFBb0I7UUFDaEcsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7WUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FB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USxHQUFHLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQzs7dUhBNXlCVSx5QkFBeUI7MkhBQXpCLHlCQUF5QixjQUZ4QixNQUFNOzRGQUVQLHlCQUF5QjtrQkFIckMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvcmVGdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24tdXRpbHMvY29yZS1mdW5jdGlvbi9jb3JlLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tb25GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24tdXRpbHMvY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWxlSGFuZGxlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9maWxlSGFuZGxlci9maWxlLWhhbmRsZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IENoZWNrSWZTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY2hlY2staWYvY2hlY2staWYuc2VydmljZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRlUGlwZSxDdXJyZW5jeVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBEYXRhU2hhcmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZGF0YS1zaGFyZS9kYXRhLXNoYXJlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcGlDYWxsU2VydmljZSB9IGZyb20gJy4uLy4uL2FwaS9hcGktY2FsbC9hcGktY2FsbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL2FwaS9hcGkuc2VydmljZSc7XHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEdyaWRDb21tb25GdW5jdGlvblNlcnZpY2Uge1xyXG5cclxuY29uc3RydWN0b3IoXHJcbiAgcHJpdmF0ZSBDb21tb25GdW5jdGlvblNlcnZpY2U6Q29tbW9uRnVuY3Rpb25TZXJ2aWNlLFxyXG4gIHByaXZhdGUgY29yZUZ1bmN0aW9uU2VydmljZTpDb3JlRnVuY3Rpb25TZXJ2aWNlLFxyXG4gIHByaXZhdGUgZmlsZUhhbmRsZXJTZXJ2aWNlOiBGaWxlSGFuZGxlclNlcnZpY2UsXHJcbiAgcHJpdmF0ZSBjaGVja0lmU2VydmljZTpDaGVja0lmU2VydmljZSxcclxuICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOlN0b3JhZ2VTZXJ2aWNlLFxyXG4gIHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlLFxyXG4gIHByaXZhdGUgQ3VycmVuY3lQaXBlOiBDdXJyZW5jeVBpcGUsXHJcbiAgcHJpdmF0ZSBkYXRhU2hhcmVTZXJ2aWNlOiBEYXRhU2hhcmVTZXJ2aWNlLFxyXG4gIHByaXZhdGUgYXBpQ2FsbFNlcnZpY2U6QXBpQ2FsbFNlcnZpY2UsXHJcbiAgcHJpdmF0ZSBhcGlTZXJ2aWNlOkFwaVNlcnZpY2VcclxuKSB7IH1cclxuICBtb2RpZnlHcmlkRGF0YShncmlkRGF0YTphbnksZ3JpZENvbHVtbnM6YW55LGZpZWxkOmFueSxlZGl0YWJsZUdyaWRDb2x1bW5zOmFueSx0eXBvZ3JhcGh5Q3JMaXN0OmFueSl7XHJcbiAgICBsZXQgbW9kaWZpZWREYXRhID0gW107XHJcbiAgICBpZihncmlkQ29sdW1ucy5sZW5ndGggPiAwKXtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncmlkRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IGdyaWREYXRhW2ldO1xyXG4gICAgICAgIGxldCBtb2RpZnlSb3cgPSB0aGlzLnJvd01vZGlmeShyb3csZmllbGQsZ3JpZENvbHVtbnMsZWRpdGFibGVHcmlkQ29sdW1ucyx0eXBvZ3JhcGh5Q3JMaXN0KTtcclxuICAgICAgICBtb2RpZmllZERhdGEucHVzaChtb2RpZnlSb3cpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbW9kaWZpZWREYXRhO1xyXG4gIH1cclxuICByb3dNb2RpZnkocm93OmFueSxmaWVsZDphbnksZ3JpZENvbHVtbnM6YW55LGVkaXRhYmxlR3JpZENvbHVtbnM6YW55LHR5cG9ncmFwaHlDckxpc3Q6YW55KXtcclxuICAgIGxldCBtb2RpZnlSb3cgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJvdykpO1xyXG4gICAgbW9kaWZ5Um93W1wiZGlzYWJsZWRcIl0gPSB0aGlzLmNoZWNrSWZTZXJ2aWNlLmNoZWNrUm93SWYocm93LGZpZWxkKTtcclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZ3JpZENvbHVtbnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgY29uc3QgY29sdW1uID0gZ3JpZENvbHVtbnNbal07XHJcbiAgICAgIGlmKCFjb2x1bW4uZWRpdGFibGUgfHwgZWRpdGFibGVHcmlkQ29sdW1ucy5sZW5ndGggPT0gMCl7XHJcbiAgICAgICAgbW9kaWZ5Um93W2NvbHVtbi5maWVsZF9uYW1lXSA9IHRoaXMuZ2V0VmFsdWVGb3JHcmlkKGNvbHVtbixyb3cpO1xyXG4gICAgICB9XHJcbiAgICAgIG1vZGlmeVJvd1tjb2x1bW4uZmllbGRfbmFtZStcIl90b29sdGlwXCJdID0gdGhpcy5nZXRWYWx1ZUZvckdyaWRUb29sdGlwKGNvbHVtbixyb3cpO1xyXG4gICAgICBpZihjb2x1bW4uZWRpdGFibGUpe1xyXG4gICAgICAgIG1vZGlmeVJvd1tjb2x1bW4uZmllbGRfbmFtZStcIl9kaXNhYmxlZFwiXSA9IHRoaXMuY2hlY2tJZlNlcnZpY2UuaXNEaXNhYmxlUm93KGNvbHVtbixyb3cpO1xyXG4gICAgICAgIGlmKGNvbHVtbi50eXBlID09ICdmaWxlJyAmJiBlZGl0YWJsZUdyaWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGlmKHJvdyAmJiByb3dbY29sdW1uLmZpZWxkX25hbWVdICYmIHRoaXMuQ29tbW9uRnVuY3Rpb25TZXJ2aWNlLmlzQXJyYXkocm93W2NvbHVtbi5maWVsZF9uYW1lXSkgJiYgcm93W2NvbHVtbi5maWVsZF9uYW1lXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG1vZGlmeVJvd1tjb2x1bW4uZmllbGRfbmFtZV0gPSB0aGlzLmZpbGVIYW5kbGVyU2VydmljZS5tb2RpZnlVcGxvYWRGaWxlcyhyb3dbY29sdW1uLmZpZWxkX25hbWVdKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1vZGlmeVJvd1tjb2x1bW4uZmllbGRfbmFtZV0gPSByb3dbY29sdW1uLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYoZWRpdGFibGVHcmlkQ29sdW1ucyAmJiAoZWRpdGFibGVHcmlkQ29sdW1ucy5sZW5ndGggPT0gMSB8fCAoZmllbGQgJiYgIWZpZWxkLmdyaWRfcm93X3NlbGVjdGlvbikgfHwgcm93LnNlbGVjdGVkKSl7XHJcbiAgICAgIG1vZGlmeVJvd1tcImNvbHVtbl9lZGl0XCJdID0gdHJ1ZTtcclxuICAgIH1lbHNle1xyXG4gICAgICBtb2RpZnlSb3dbXCJjb2x1bW5fZWRpdFwiXSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYoZWRpdGFibGVHcmlkQ29sdW1ucyAmJiBlZGl0YWJsZUdyaWRDb2x1bW5zLmxlbmd0aCA9PSAwICYmIGZpZWxkICYmIE9iamVjdC5rZXlzKGZpZWxkKS5sZW5ndGggPiAwKXtcclxuICAgICAgbW9kaWZ5Um93WydhY3Rpb25CdG5EaXNwbGF5J10gPSB0aGlzLmNoZWNrUm93RGlzYWJsZWRJZihmaWVsZCxyb3cpO1xyXG4gICAgfVxyXG4gICAgaWYodHlwb2dyYXBoeUNyTGlzdCAmJiB0eXBvZ3JhcGh5Q3JMaXN0Lmxlbmd0aCA+IDApe1xyXG4gICAgICBtb2RpZnlSb3dbJ2JhY2tncm91bmQtY29sb3InXSA9IHRoaXMuY2hlY2tUeXBncmFwaENvbmRpdGlvbih0eXBvZ3JhcGh5Q3JMaXN0LHJvdywnYmFja2dyb3VuZC1jb2xvcicpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1vZGlmeVJvdztcclxuICB9XHJcblxyXG4gIGdldExpc3RCeUtleVZhbHVlVG9MaXN0KGxpc3Q6YW55LGtleTpzdHJpbmcsdmFsdWU6YW55KXtcclxuICAgIGxldCBnZXRsaXN0ID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IGxpc3RbaV07XHJcbiAgICAgIGlmKGVsZW1lbnQgJiYgZWxlbWVudFtrZXldID09IHZhbHVlKXtcclxuICAgICAgICBnZXRsaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBnZXRsaXN0O1xyXG4gIH1cclxuICBtb2RpZnlHcmlkQ29sdW1ucyhncmlkQ29sdW1uczphbnkscGFyZW50T2JqZWN0OmFueSl7XHJcbiAgICBsZXQgbW9kaWZ5R3JpZENvbHVtbnMgPSBbXTtcclxuICAgIGlmKGdyaWRDb2x1bW5zICYmIGdyaWRDb2x1bW5zLmxlbmd0aCA+IDApe1xyXG4gICAgICBtb2RpZnlHcmlkQ29sdW1ucyA9IHRoaXMuQ29tbW9uRnVuY3Rpb25TZXJ2aWNlLnVwZGF0ZUZpZWxkSW5MaXN0KCdkaXNwbGF5JyxncmlkQ29sdW1ucyk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kaWZ5R3JpZENvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IG1vZGlmeUdyaWRDb2x1bW5zW2ldO1xyXG4gICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhmaWVsZC5zaG93X2lmKSkge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSWZTZXJ2aWNlLnNob3dJZihmaWVsZCwgcGFyZW50T2JqZWN0KSkge1xyXG4gICAgICAgICAgICBmaWVsZFsnZGlzcGxheSddID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZpZWxkWydzaG93J10gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYoZmllbGQuaGlkZSAhPSB1bmRlZmluZWQgJiYgZmllbGQuaGlkZSl7XHJcbiAgICAgICAgICAgICAgZmllbGRbJ2Rpc3BsYXknXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBmaWVsZFsnZGlzcGxheSddID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmKGZpZWxkICYmICBmaWVsZC5oaWRlKSB7XHJcbiAgICAgICAgICAgICAgZmllbGRbJ2Rpc3BsYXknXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgZmllbGRbJ2Rpc3BsYXknXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoZmllbGRbJ2ZpZWxkX2NsYXNzJ10pe1xyXG4gICAgICAgICAgZmllbGRbJ2ZpZWxkX2NsYXNzJ10gPSBmaWVsZFsnZmllbGRfY2xhc3MnXS50cmltKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpZWxkWyd3aWR0aCddID0gdGhpcy5nZXRHcmlkQ29sdW1uV2lkdGgoZmllbGQsZ3JpZENvbHVtbnMpO1xyXG4gICAgICAgIGlmKGZpZWxkICYmIGZpZWxkLnR5cGUgJiYgZmllbGQudHlwZSAhPScnKXtcclxuICAgICAgICAgIHN3aXRjaChmaWVsZC50eXBlLnRvTG93ZXJDYXNlKCkpe1xyXG4gICAgICAgICAgICBjYXNlIFwiaW5mb1wiOlxyXG4gICAgICAgICAgICBjYXNlIFwiaHRtbFwiIDpcclxuICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcclxuICAgICAgICAgICAgY2FzZSBcInRlbXBsYXRlXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJpbWFnZVwiOlxyXG4gICAgICAgICAgICBjYXNlIFwiaWNvblwiOlxyXG4gICAgICAgICAgICBjYXNlIFwiZG93bmxvYWRfZmlsZVwiOlxyXG4gICAgICAgICAgICBjYXNlIFwicmVkaXJlY3RcIjpcclxuICAgICAgICAgICAgY2FzZSBcImNvbG9yXCI6XHJcbiAgICAgICAgICAgICAgZmllbGRbJ2hpZGVDb3B5J109dHJ1ZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBtb2RpZnlHcmlkQ29sdW1ucztcclxuICB9XHJcbiAgZ2V0R3JpZENvbHVtbldpZHRoKGNvbHVtbjphbnksbGlzdE9mR3JpZEZpZWxkTmFtZTphbnkpIHtcclxuICAgIGlmIChjb2x1bW4ud2lkdGggJiYgY29sdW1uLndpZHRoICE9ICcwJykge1xyXG4gICAgICByZXR1cm4gY29sdW1uLndpZHRoO1xyXG4gICAgfVxyXG4gICAgLy8gZWxzZSB7XHJcbiAgICAvLyAgIGlmIChsaXN0T2ZHcmlkRmllbGROYW1lLmxlbmd0aCA+IDgpIHtcclxuICAgIC8vICAgICByZXR1cm4gJzE1MHB4JztcclxuICAgIC8vICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgIH1cclxuICAgIC8vIH1cclxuICB9XHJcbiAgdXBkYXRlR3JpZERhdGFUb01vZGlmaWVkRGF0YShncmlkX3Jvd19zZWxlY3Rpb246YW55LGdyaWREYXRhOmFueSxtb2RpZmllZEdyaWREYXRhOmFueSxsaXN0T2ZHcmlkRmllbGROYW1lOmFueSl7XHJcbiAgICBsZXQgZ3JpZFNlbGVjdGVkRGF0YTphbnkgPSBbXTtcclxuICAgIGxldCBtb2RpZmllZFNlbGVjdGVkRGF0YTphbnkgPSBbXTtcclxuICAgIGlmIChncmlkX3Jvd19zZWxlY3Rpb24gPT0gZmFsc2UpIHtcclxuICAgICAgZ3JpZFNlbGVjdGVkRGF0YSA9IFsuLi5ncmlkRGF0YV07XHJcbiAgICAgIG1vZGlmaWVkU2VsZWN0ZWREYXRhID0gWy4uLm1vZGlmaWVkR3JpZERhdGFdO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGdyaWRTZWxlY3RlZERhdGEgPSB0aGlzLmdldExpc3RCeUtleVZhbHVlVG9MaXN0KGdyaWREYXRhLFwic2VsZWN0ZWRcIix0cnVlKTtcclxuICAgICAgbW9kaWZpZWRTZWxlY3RlZERhdGEgPSB0aGlzLmdldExpc3RCeUtleVZhbHVlVG9MaXN0KG1vZGlmaWVkR3JpZERhdGEsXCJzZWxlY3RlZFwiLHRydWUpO1xyXG4gICAgfVxyXG4gICAgaWYobGlzdE9mR3JpZEZpZWxkTmFtZS5sZW5ndGggPiAwKXtcclxuICAgICAgZ3JpZFNlbGVjdGVkRGF0YS5mb3JFYWNoKChkYXRhOmFueSxpOm51bWJlcikgPT4ge1xyXG4gICAgICAgIGxpc3RPZkdyaWRGaWVsZE5hbWUuZm9yRWFjaCgoY29sdW1uOmFueSkgPT4ge1xyXG4gICAgICAgICAgaWYoY29sdW1uLmVkaXRhYmxlIHx8IGNvbHVtbi50eXBlID09ICdudW1iZXInKXtcclxuICAgICAgICAgICAgc3dpdGNoIChjb2x1bW4udHlwZSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgJ2ZpbGUnOlxyXG4gICAgICAgICAgICAgICAgZ3JpZFNlbGVjdGVkRGF0YVtpXVtjb2x1bW4uZmllbGRfbmFtZV0gPSB0aGlzLmZpbGVIYW5kbGVyU2VydmljZS5tb2RpZnlVcGxvYWRGaWxlcyhtb2RpZmllZFNlbGVjdGVkRGF0YVtpXVtjb2x1bW4uZmllbGRfbmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgZ3JpZFNlbGVjdGVkRGF0YVtpXVtjb2x1bW4uZmllbGRfbmFtZV0gPSBtb2RpZmllZFNlbGVjdGVkRGF0YVtpXVtjb2x1bW4uZmllbGRfbmFtZV07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncmlkU2VsZWN0ZWREYXRhO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlPbkdyaWRGaWx0ZXIoZmllbGQ6YW55KSB7XHJcbiAgICBpZiAoZmllbGQgJiYgZmllbGQuZXRjX2ZpZWxkcyAmJiBmaWVsZC5ldGNfZmllbGRzLm9uX2dyaWRfZmlsdGVyID09PSAnZmFsc2UnKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuICBhcHBseU9uR3JpZEZpbHRlckxhYmVsKGZpZWxkOmFueSkge1xyXG4gICAgaWYgKGZpZWxkICYmIGZpZWxkLmV0Y19maWVsZHMgJiYgZmllbGQuZXRjX2ZpZWxkcy5vbl9ncmlkX2ZpbHRlcl9sYWJlbCAhPSAnJykge1xyXG4gICAgICByZXR1cm4gZmllbGQuZXRjX2ZpZWxkcy5vbl9ncmlkX2ZpbHRlcl9sYWJlbDtcclxuICAgIH1cclxuICAgIHJldHVybiBcIlNlYXJjaCBQYXJhbWV0ZXIgLi4uXCI7XHJcbiAgfVxyXG4gIG1vZGlmeVRhYmxlRmllbGRzKHRhYmxlZmllbGRzOmFueSl7XHJcblxyXG4gIH1cclxuICBncmlkRGF0YU1vZGlmeShtb2RpZnlEYXRhOmFueSxkYXRhOmFueSxmaWVsZHM6YW55LGZpZWxkX25hbWU6YW55LGtleTphbnksb2JqZWN0OmFueSl7XHJcbiAgICBsZXQgbW9kaWZ5T2JqZWN0ID0ge1xyXG4gICAgICBcIm1vZGlmeURhdGFcIiA6IG1vZGlmeURhdGEsXHJcbiAgICAgIFwiZmllbGRzXCIgOiBmaWVsZHMsXHJcbiAgICAgIFwiZmllbGRfaW5kZXhcIiA6IC0xXHJcbiAgICB9O1xyXG4gICAgaWYoZmllbGRzICYmIGZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZmllbGRzW2ldO1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtZW50LnR5cGU7XHJcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gZWxlbWVudC5maWVsZF9uYW1lO1xyXG4gICAgICAgIGlmKHR5cGUgJiYgdHlwZS5zdGFydHNXaXRoKGtleSkgJiYgZmllbGRfbmFtZSA9PSBmaWVsZE5hbWUpe1xyXG4gICAgICAgICAgaWYoZWxlbWVudCAmJiBmaWVsZE5hbWUgJiYgZGF0YSAmJiBkYXRhW2ZpZWxkTmFtZV0pe1xyXG4gICAgICAgICAgICBjb25zdCBjRGF0YSA9IGRhdGFbZmllbGROYW1lXTtcclxuICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShjRGF0YSkgJiYgY0RhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgY29uc3QgZ3JpZENvbHVtbnMgPSBlbGVtZW50LmdyaWRDb2x1bW5zO1xyXG4gICAgICAgICAgICAgIGxldCB0eXBvZ3JhcGh5Q3JMaXN0ID0gW107XHJcbiAgICAgICAgICAgICAgaWYoZWxlbWVudFsnY29sb3JDcml0ZXJpYSddICYmIGVsZW1lbnRbJ2NvbG9yQ3JpdGVyaWEnXS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgIHR5cG9ncmFwaHlDckxpc3QgPSBlbGVtZW50Wydjb2xvckNyaXRlcmlhJ107XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNvbnN0IG1vZGlmeUxpc3QgPSB0aGlzLm1vZGlmeUdyaWREYXRhKGNEYXRhLGdyaWRDb2x1bW5zLGVsZW1lbnQsW10sdHlwb2dyYXBoeUNyTGlzdCk7XHJcbiAgICAgICAgICAgICAgbW9kaWZ5RGF0YVtmaWVsZE5hbWVdID0gbW9kaWZ5TGlzdDtcclxuICAgICAgICAgICAgICBlbGVtZW50LmdyaWRDb2x1bW5zID0gdGhpcy5tb2RpZnlHcmlkQ29sdW1ucyhncmlkQ29sdW1ucyxvYmplY3QpO1xyXG4gICAgICAgICAgICAgIG1vZGlmeU9iamVjdC5maWVsZF9pbmRleCA9IGk7XHJcbiAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICBtb2RpZnlEYXRhW2ZpZWxkTmFtZV0gPSBjRGF0YTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNlIGlmKHR5cGUgJiYgdHlwZS5zdGFydHNXaXRoKCdsaXN0X29mX2ZpZWxkcycpICYmIGVsZW1lbnQuZGF0YXR5cGUgPT0gXCJsaXN0X29mX29iamVjdF93aXRoX3BvcHVwXCIgJiYgZmllbGRfbmFtZSA9PSBmaWVsZE5hbWUpe1xyXG4gICAgICAgICAgaWYoZWxlbWVudCAmJiBmaWVsZE5hbWUgJiYgZGF0YSAmJiBkYXRhW2ZpZWxkTmFtZV0pe1xyXG4gICAgICAgICAgICBjb25zdCBjRGF0YSA9IGRhdGFbZmllbGROYW1lXTtcclxuICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShjRGF0YSkgJiYgY0RhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgY29uc3QgZ3JpZENvbHVtbnMgPSBlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzO1xyXG4gICAgICAgICAgICAgIGNvbnN0IG1vZGlmeUxpc3QgPSB0aGlzLm1vZGlmeUxpc3RvZkZpZWxkc0RhdGEoe30sY0RhdGEsZ3JpZENvbHVtbnMpWydkYXRhJ107XHJcbiAgICAgICAgICAgICAgbW9kaWZ5RGF0YVtmaWVsZE5hbWVdID0gbW9kaWZ5TGlzdDtcclxuICAgICAgICAgICAgICBtb2RpZnlPYmplY3QuZmllbGRfaW5kZXggPSBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBtb2RpZnlPYmplY3QubW9kaWZ5RGF0YSA9IG1vZGlmeURhdGE7XHJcbiAgICBtb2RpZnlPYmplY3QuZmllbGRzID0gZmllbGRzO1xyXG4gICAgcmV0dXJuIG1vZGlmeU9iamVjdDtcclxuICB9XHJcblxyXG4gIG1vZGlmeUxpc3RvZkZpZWxkc0RhdGEocGFyZW50RmllbGQ6YW55LGRhdGE6YW55LGZpZWxkczphbnkpe1xyXG4gICAgbGV0IG1vZGlmeUxpc3RvZmZpZWxkT2JqZWN0OmFueSA9IHt9O1xyXG4gICAgbGV0IG1vZGlmeURhdGEgPSBbXTtcclxuICAgIGlmKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCAmJiBkYXRhICYmIGRhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkYXRhLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IGRhdGFbaW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IG1PYmplY3QgPSB0aGlzLmdldE1vZGlmeUxpc3RPZkZpZWxkc09iamVjdChwYXJlbnRGaWVsZCxvYmplY3QsZmllbGRzKTtcclxuICAgICAgICBtb2RpZnlEYXRhLnB1c2gobU9iamVjdCk7XHJcbiAgICAgIH1cclxuICAgICAgbW9kaWZ5TGlzdG9mZmllbGRPYmplY3RbJ2RhdGEnXSA9IG1vZGlmeURhdGE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbW9kaWZ5TGlzdG9mZmllbGRPYmplY3Q7XHJcbiAgfVxyXG4gIGdldE1vZGlmeUxpc3RPZkZpZWxkc09iamVjdChwYXJlbnRGaWVsZDphbnksb2JqZWN0OmFueSxmaWVsZHM6YW55KXtcclxuICAgIGxldCBtT2JqZWN0OmFueSA9IHt9O1xyXG4gICAgaWYoZmllbGRzICYmIGZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGZpZWxkcy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZmllbGRzW2luZGV4XTtcclxuICAgICAgICBsZXQgZmllbGROYW1lID0gZWxlbWVudC5maWVsZF9uYW1lO1xyXG4gICAgICAgIG1PYmplY3RbZmllbGROYW1lXSA9IHRoaXMuc2hvd0xpc3RGaWVsZFZhbHVlKG9iamVjdCxlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgICBtT2JqZWN0WydhY3Rpb25CdG5EaXNwbGF5J10gPSB0aGlzLmNoZWNrUm93RGlzYWJsZWRJZihwYXJlbnRGaWVsZCxvYmplY3QpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1PYmplY3Q7XHJcbiAgfVxyXG4gIHNob3dMaXN0RmllbGRWYWx1ZShsaXN0T2ZGaWVsZDphbnksIGl0ZW06YW55KSB7XHJcbiAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xyXG4gICAgICBjYXNlIFwidHlwZWFoZWFkXCI6XHJcbiAgICAgICAgaWYoaXRlbS5kYXRhdHlwZSA9PSBcImxpc3Rfb2Zfb2JqZWN0XCIpe1xyXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdE9mRmllbGRbaXRlbS5maWVsZF9uYW1lXSkgJiYgbGlzdE9mRmllbGRbaXRlbS5maWVsZF9uYW1lXS5sZW5ndGggPiAwICYmIGxpc3RPZkZpZWxkW2l0ZW0uZmllbGRfbmFtZV0gIT0gbnVsbCAmJiBsaXN0T2ZGaWVsZFtpdGVtLmZpZWxkX25hbWVdICE9IHVuZGVmaW5lZCAmJiBsaXN0T2ZGaWVsZFtpdGVtLmZpZWxkX25hbWVdICE9ICcnKSB7XHJcbiAgICAgICAgICAgIGl0ZW1bJ2hpZGVDb3B5J109dHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuICc8aSBjbGFzcz1cImZhIGZhLWV5ZSBjdXJzb3ItcG9pbnRlclwiPjwvaT4nO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICctJztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZSBpZihpdGVtLmRhdGF0eXBlID09IFwib2JqZWN0XCIpe1xyXG4gICAgICAgICAgaWYgKGl0ZW0uZGlzcGxheV9uYW1lICYmIGl0ZW0uZGlzcGxheV9uYW1lICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldE9iamVjdFZhbHVlKGl0ZW0uZGlzcGxheV9uYW1lLCBsaXN0T2ZGaWVsZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbGlzdE9mRmllbGRbaXRlbS5maWVsZF9uYW1lXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihpdGVtLmRhdGF0eXBlID09IFwidGV4dFwiKXtcclxuICAgICAgICAgIGlmIChpdGVtLmRpc3BsYXlfbmFtZSAmJiBpdGVtLmRpc3BsYXlfbmFtZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRPYmplY3RWYWx1ZShpdGVtLmRpc3BsYXlfbmFtZSwgbGlzdE9mRmllbGQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxpc3RPZkZpZWxkW2l0ZW0uZmllbGRfbmFtZV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwibGlzdF9vZl9zdHJpbmdcIjpcclxuICAgICAgY2FzZSBcImxpc3Rfb2ZfY2hlY2tib3hcIjpcclxuICAgICAgY2FzZSBcImdyaWRfc2VsZWN0aW9uXCI6XHJcbiAgICAgIGNhc2UgXCJsaXN0X29mX2ZpZWxkc1wiOlxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3RPZkZpZWxkW2l0ZW0uZmllbGRfbmFtZV0pICYmIGxpc3RPZkZpZWxkW2l0ZW0uZmllbGRfbmFtZV0ubGVuZ3RoID4gMCAmJiBsaXN0T2ZGaWVsZFtpdGVtLmZpZWxkX25hbWVdICE9IG51bGwgJiYgbGlzdE9mRmllbGRbaXRlbS5maWVsZF9uYW1lXSAhPSB1bmRlZmluZWQgJiYgbGlzdE9mRmllbGRbaXRlbS5maWVsZF9uYW1lXSAhPSAnJykge1xyXG4gICAgICAgICAgaXRlbVsnaGlkZUNvcHknXT10cnVlO1xyXG4gICAgICAgICAgaWYodGhpcy5zdG9yYWdlU2VydmljZS5jaGVja1BsYXRGb3JtKCkgPT0gJ21vYmlsZScpe1xyXG4gICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBjdXJzb3ItcG9pbnRlclwiPnZpc2liaWxpdHk8L3NwYW4+JztcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJzxpIGNsYXNzPVwiZmEgZmEtZXllIGN1cnNvci1wb2ludGVyXCI+PC9pPic7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiAnLSc7XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlIFwiY2hlY2tib3hcIjpcclxuICAgICAgICBsZXQgdmFsdWU6YW55ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGl0ZW0uZGlzcGxheV9uYW1lICYmIGl0ZW0uZGlzcGxheV9uYW1lICE9IFwiXCIpIHtcclxuICAgICAgICAgIHZhbHVlID0gdGhpcy5Db21tb25GdW5jdGlvblNlcnZpY2UuZ2V0T2JqZWN0VmFsdWUoaXRlbS5kaXNwbGF5X25hbWUsIGxpc3RPZkZpZWxkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLmdldFZhbHVlRm9yR3JpZChpdGVtLGxpc3RPZkZpZWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlID8gXCJZZXNcIiA6IFwiTm9cIjtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBpZiAoaXRlbS5kaXNwbGF5X25hbWUgJiYgaXRlbS5kaXNwbGF5X25hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuQ29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldE9iamVjdFZhbHVlKGl0ZW0uZGlzcGxheV9uYW1lLCBsaXN0T2ZGaWVsZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlRm9yR3JpZChpdGVtLGxpc3RPZkZpZWxkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuICBjaGVja1Jvd0Rpc2FibGVkSWYoZmllbGQ6YW55LGRhdGE6YW55KXtcclxuICAgIGlmKGZpZWxkICYmIGZpZWxkLmRpc2FibGVSb3dJZiAmJiBmaWVsZC5kaXNhYmxlUm93SWYgIT0gJycpe1xyXG4gICAgICBjb25zdCBjb25kaXRpb24gPSBmaWVsZC5kaXNhYmxlUm93SWY7XHJcbiAgICAgIGlmKGNvbmRpdGlvbil7XHJcbiAgICAgICAgaWYoZmllbGQuZGlzYWJsZVJvd0lmT25seVNlbGVjdGlvbil7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiAhdGhpcy5jaGVja0lmU2VydmljZS5jaGVja0Rpc2FibGVSb3dJZihjb25kaXRpb24sZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgY2hlY2tUeXBncmFwaENvbmRpdGlvbih0eXBvZ3JhcGh5Q3JMaXN0OmFueSxvYmplY3Q6YW55LG5hbWU6YW55KXtcclxuICAgIGxldCBiYWNrZ3JvdW5kID0gJyc7XHJcbiAgICBpZih0eXBvZ3JhcGh5Q3JMaXN0ICYmIHR5cG9ncmFwaHlDckxpc3QubGVuZ3RoID49IDEpe1xyXG4gICAgICBsZXQgY3JpdGVyaWFNYXRjaGVkID0gZmFsc2U7XHJcbiAgICAgIGxldCBtYXRjaGVkZWxlbWVudDphbnkgPSB7fTtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHR5cG9ncmFwaHlDckxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHR5cG9ncmFwaHlDckxpc3RbaW5kZXhdO1xyXG4gICAgICAgIGxldCBjckxpc3QgPSBlbGVtZW50Wydjckxpc3QnXTtcclxuICAgICAgICBsZXQgY2hpbGRDb25kaXRpb25zTWF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY3JMaXN0Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICBjb25zdCBjaGlsZCA9IGNyTGlzdFtqXTtcclxuICAgICAgICAgIGxldCBtb2RpZnkgPSBjaGlsZC5yZXBsYWNlQWxsKCc7JywgXCIjXCIpO1xyXG4gICAgICAgICAgaWYoIXRoaXMuY2hlY2tJZlNlcnZpY2UuY2hlY2tJZkNvbmRpdGlvbkZvckFycmF5TGlzdFZhbHVlKG1vZGlmeSxvYmplY3QpKXtcclxuICAgICAgICAgICAgY2hpbGRDb25kaXRpb25zTWF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjaGlsZENvbmRpdGlvbnNNYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoY2hpbGRDb25kaXRpb25zTWF0Y2hlZCl7XHJcbiAgICAgICAgICBtYXRjaGVkZWxlbWVudCA9IHR5cG9ncmFwaHlDckxpc3RbaW5kZXhdXHJcbiAgICAgICAgICBjcml0ZXJpYU1hdGNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBjcml0ZXJpYU1hdGNoZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYoY3JpdGVyaWFNYXRjaGVkKXtcclxuICAgICAgICBsZXQgdHlwb2dyYXB5ID0gbWF0Y2hlZGVsZW1lbnRbJ3R5cG9HcmFwaHknXTtcclxuICAgICAgICBsZXQgdmFsdWUgPSAnJztcclxuICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcclxuICAgICAgICAgIGNhc2UgJ2JhY2tncm91bmQtY29sb3InOlxyXG4gICAgICAgICAgICB2YWx1ZSA9IHR5cG9ncmFweVsnYmFja2dyb3VuZF9jb2xvciddO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBiYWNrZ3JvdW5kID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBiYWNrZ3JvdW5kO1xyXG4gIH1cclxuICBtb2RpZmllZEdyaWRDb2x1bW5zKGdyaWRDb2x1bW5zOmFueSxzZWxlY3RlZFJvdzphbnksZm9ybVZhbHVlOmFueSl7XHJcbiAgICBpZihncmlkQ29sdW1ucy5sZW5ndGggPiAwKXtcclxuICAgICAgZ3JpZENvbHVtbnMuZm9yRWFjaCgoZmllbGQ6YW55KSA9PiB7XHJcbiAgICAgICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZmllbGQuc2hvd19pZikpe1xyXG4gICAgICAgICAgaWYoIXRoaXMuY2hlY2tJZlNlcnZpY2UuY2hlY2tTaG93SWYoZmllbGQsc2VsZWN0ZWRSb3csZm9ybVZhbHVlKSl7XHJcbiAgICAgICAgICAgIGZpZWxkWydkaXNwbGF5J10gPSBmYWxzZTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBmaWVsZFsnZGlzcGxheSddID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIGZpZWxkWydkaXNwbGF5J10gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JpZENvbHVtbnM7XHJcbiAgfVxyXG4gIGNoZWNrR3JpZFNlbGVjdGlvbk1lbmRldG9yeShncmlkU2VsZWN0aW9uTWVuZGV0b3J5TGlzdDphbnksc2VsZWN0ZWRSb3c6YW55LGZvcm1WYWx1ZTphbnksY3VzdG1pemVkRm9ybVZhbHVlOmFueSl7XHJcbiAgICBsZXQgdmFsaWRhdGlvbiA9IHtcclxuICAgICAgJ3N0YXR1cycgOiB0cnVlLFxyXG4gICAgICAnbXNnJyA6ICcnXHJcbiAgICB9XHJcbiAgICBpZihncmlkU2VsZWN0aW9uTWVuZGV0b3J5TGlzdCAmJiBncmlkU2VsZWN0aW9uTWVuZGV0b3J5TGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgbGV0IGNoZWNrID0gMDtcclxuICAgICAgZ3JpZFNlbGVjdGlvbk1lbmRldG9yeUxpc3QuZm9yRWFjaCgoZmllbGQ6YW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGRhdGE6YW55ID0gW107XHJcbiAgICAgICAgaWYoY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkLmZpZWxkX25hbWVdKXtcclxuICAgICAgICAgIGRhdGEgPSBjdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGQuZmllbGRfbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGZpZWxkLm1lbmRldG9yeV9maWVsZHMgJiYgZmllbGQubWVuZGV0b3J5X2ZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIGZpZWxkLm1lbmRldG9yeV9maWVsZHMgPSB0aGlzLm1vZGlmaWVkR3JpZENvbHVtbnMoZmllbGQubWVuZGV0b3J5X2ZpZWxkcyxzZWxlY3RlZFJvdyxmb3JtVmFsdWUpXHJcbiAgICAgICAgICBpZihkYXRhICYmIGRhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGZpZWxkLm1lbmRldG9yeV9maWVsZHMuZm9yRWFjaCgobUZpZWxkOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IG1GaWVsZC5maWVsZF9uYW1lO1xyXG4gICAgICAgICAgICAgIGlmKG1GaWVsZC5kaXNwbGF5KXtcclxuICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgocm93OmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZihyb3cgJiYgcm93W2ZpZWxkTmFtZV0gPT0gdW5kZWZpbmVkIHx8IHJvd1tmaWVsZE5hbWVdID09ICcnIHx8IHJvd1tmaWVsZE5hbWVdID09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb24ubXNnID09ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb24ubXNnID0gbUZpZWxkLmxhYmVsICsgJyBvZiAnICsgZmllbGQubGFiZWwrJyBpcyByZXF1aXJlZC4nO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjaGVjayA9IDE7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaWYoY2hlY2sgIT0gMCl7XHJcbiAgICAgICAgdmFsaWRhdGlvbi5zdGF0dXMgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gdmFsaWRhdGlvbjtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25cclxuICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHJldHVybiB2YWxpZGF0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0R3JpZFNlbGVjdGVkRGF0YShkYXRhOmFueSxmaWVsZDphbnkpe1xyXG4gICAgbGV0IHJlc3BvbmNlOmFueSA9e1xyXG4gICAgICBncmlkU2VsZWN0ZWREYXRhOltdLFxyXG4gICAgICBjdXN0b21FbnRyeURhdGE6W11cclxuICAgIH1cclxuICAgIGlmKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwICYmIGZpZWxkLmFkZF9uZXdfZW5hYmxlZCl7XHJcbiAgICAgIGRhdGEuZm9yRWFjaCgoZ3JpZDphbnkpID0+IHtcclxuICAgICAgICBpZihncmlkICYmIGdyaWQuY3VzdG9tRW50cnkpe1xyXG4gICAgICAgICAgcmVzcG9uY2UuY3VzdG9tRW50cnlEYXRhW2ZpZWxkLmZpZWxkX25hbWVdLnB1c2goZ3JpZCk7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICByZXNwb25jZS5ncmlkU2VsZWN0ZWREYXRhLnB1c2goZ3JpZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1lbHNlIHtcclxuICAgICAgcmVzcG9uY2UuZ3JpZFNlbGVjdGVkRGF0YSA9IGRhdGE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzcG9uY2U7XHJcbiAgfVxyXG4gIGdldE1vZGlmaWVkR3JpZENvbHVtbnMoZ3JpZENvbHVtbnM6YW55LG9iamVjdDphbnkpe1xyXG4gICAgaWYoZ3JpZENvbHVtbnMubGVuZ3RoID4gMCl7XHJcbiAgICAgIGdyaWRDb2x1bW5zLmZvckVhY2goKGZpZWxkOmFueSkgPT4ge1xyXG4gICAgICAgIGlmKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGZpZWxkLnNob3dfaWYpKXtcclxuICAgICAgICAgIGlmKCF0aGlzLmNoZWNrSWZTZXJ2aWNlLnNob3dJZihmaWVsZCxvYmplY3QpKXtcclxuICAgICAgICAgICAgZmllbGRbJ2Rpc3BsYXknXSA9IGZhbHNlO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGZpZWxkWydkaXNwbGF5J10gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgZmllbGRbJ2Rpc3BsYXknXSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncmlkQ29sdW1ucztcclxuICB9XHJcblxyXG4gIGlzRGF0ZShkYXRlOmFueSkge1xyXG4gICAgbGV0IGRhdGVWYWx1ZTphbnkgPSBuZXcgRGF0ZShkYXRlKTtcclxuICAgIHJldHVybiAoZGF0ZVZhbHVlICE9PSBcIkludmFsaWQgRGF0ZVwiKSAmJiAhaXNOYU4oZGF0ZVZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldFZhbHVlRm9yR3JpZChmaWVsZDphbnksIG9iamVjdDphbnkpIHtcclxuICAgIGxldCB2YWx1ZTphbnkgPSAnJztcclxuICAgIGxldCBmaWVsZE5hbWU6IGFueT0gJyc7XHJcbiAgICBpZiAoZmllbGQpIHtcclxuICAgICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZmllbGQuZGlzcGxheV9uYW1lKSl7XHJcbiAgICAgICAgZmllbGROYW1lPSBmaWVsZC5kaXNwbGF5X25hbWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZih0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhmaWVsZC5maWVsZF9uYW1lKSl7XHJcbiAgICAgICAgZmllbGROYW1lPSBmaWVsZC5maWVsZF9uYW1lO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihmaWVsZE5hbWUgIT0nJyl7XHJcbiAgICAgIHZhbHVlPSB0aGlzLkNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRPYmplY3RWYWx1ZShmaWVsZE5hbWUsIG9iamVjdClcclxuICAgIH1cclxuICAgIGlmICghZmllbGQudHlwZSkgZmllbGQudHlwZSA9IFwiVGV4dFwiO1xyXG4gICAgbGV0IHJldHVyblZhbHVlOmFueSA9ICcnO1xyXG4gICAgc3dpdGNoIChmaWVsZC50eXBlLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgY2FzZSAnZGF0ZXRpbWUnOlxyXG4gICAgICAgIGlmKHZhbHVlICYmIHZhbHVlICE9ICcnKXtcclxuICAgICAgICAgIGlmKHRoaXMuc3RvcmFnZVNlcnZpY2UuY2hlY2tQbGF0Rm9ybSgpID09ICdtb2JpbGUnKXtcclxuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSAgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odmFsdWUsICdtZWRpdW0nKTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLCAnZGQvTU0veXl5eSBoOm1tIGEnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlXHJcbiAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICBjYXNlICdkYXRlcmFuZ2UnOlxyXG4gICAgICAgIGlmKHZhbHVlICYmIHZhbHVlICE9ICcnKXtcclxuICAgICAgICAgIGlmKHRoaXMuc3RvcmFnZVNlcnZpY2UuY2hlY2tQbGF0Rm9ybSgpID09ICdtb2JpbGUnKXtcclxuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSAgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odmFsdWUsICdtZWRpdW1EYXRlJyk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgJ2RkL01NL3l5eXknKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gICAgICBjYXNlICd0aW1lJzogcmV0dXJuIHRoaXMuaXNEYXRlKHZhbHVlKSA/IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLCAnaDptbSBhJykgOiB2YWx1ZTtcclxuICAgICAgY2FzZSBcImJvb2xlYW5cIjogcmV0dXJuIHZhbHVlID8gXCJZZXNcIiA6IFwiTm9cIjtcclxuICAgICAgY2FzZSBcImN1cnJlbmN5XCI6IHJldHVybiB0aGlzLkN1cnJlbmN5UGlwZS50cmFuc2Zvcm0odmFsdWUsICdJTlInKTtcclxuICBcdCAgY2FzZSBcImRyb3Bkb3duXCI6IHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5uYW1lID8gdmFsdWUubmFtZSA6IHZhbHVlO1xyXG4gICAgICBjYXNlIFwidHlwZWFoZWFkXCI6IHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5uYW1lID8gdmFsdWUubmFtZSA6IHZhbHVlO1xyXG4gICAgICBjYXNlIFwiaW5mb1wiOlxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgaWYodGhpcy5zdG9yYWdlU2VydmljZS5jaGVja1BsYXRGb3JtKCkgPT0gJ21vYmlsZScpe1xyXG4gICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBjdXJzb3ItcG9pbnRlclwiPnZpc2liaWxpdHk8L3NwYW4+JztcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJzxpIGNsYXNzPVwiZmEgZmEtZXllIGN1cnNvci1wb2ludGVyXCI+PC9pPic7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiAnLSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBcImh0bWxcIiA6XHJcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlICE9ICcnKSB7XHJcbiAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgY3Vyc29yLXBvaW50ZXJcIj5wcmV2aWV3PC9zcGFuPic7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiAnLSc7XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlIFwiZmlsZVwiOlxyXG4gICAgICBjYXNlIFwiZmlsZV93aXRoX3ByZXZpZXdcIjpcclxuICAgICAgY2FzZSBcImZpbGVfd2l0aF9wcmludFwiOlxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgaWYodGhpcy5zdG9yYWdlU2VydmljZS5jaGVja1BsYXRGb3JtKCkgPT0gJ21vYmlsZScpe1xyXG4gICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBjdXJzb3ItcG9pbnRlclwiPnRleHRfc25pcHBldDwvc3Bhbj4nO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBjdXJzb3ItcG9pbnRlclwiPnRleHRfc25pcHBldDwvc3Bhbj4nO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gJy0nO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSBcInRlbXBsYXRlXCI6XHJcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlICE9ICcnKSB7XHJcbiAgICAgICAgICBpZih0aGlzLnN0b3JhZ2VTZXJ2aWNlLmNoZWNrUGxhdEZvcm0oKSA9PSAnbW9iaWxlJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+ZGVzY3JpcHRpb248L3NwYW4+JztcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJzxpIGNsYXNzPVwiZmEgZmEtZmlsZSBjdXJzb3ItcG9pbnRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4nO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gJy0nO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSBcImltYWdlXCI6XHJcbiAgICAgICAgcmV0dXJuICc8aW1nIHNyYz1cImRhdGE6aW1hZ2UvanBnO2Jhc2U2NCwnICsgdmFsdWUgKyAnXCIgLz4nO1xyXG4gICAgICBjYXNlIFwiaWNvblwiOlxyXG4gICAgICAgIGlmKHRoaXMuc3RvcmFnZVNlcnZpY2UuY2hlY2tQbGF0Rm9ybSgpID09ICdtb2JpbGUnKXtcclxuICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGN1cnNvci1wb2ludGVyXCI+JyArIGZpZWxkLmZpZWxkX2NsYXNzICsgJzwvc3Bhbj4nO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGN1cnNvci1wb2ludGVyXCI+JyArIGZpZWxkLmZpZWxkX2NsYXNzICsgJzwvc3Bhbj4nO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSBcInJlZGlyZWN0XCI6XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICBpZih0aGlzLnN0b3JhZ2VTZXJ2aWNlLmNoZWNrUGxhdEZvcm0oKSA9PSAnbW9iaWxlJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9XCJmYSBmYS1leHRlcm5hbC1saW5rXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPic7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICc8aSBjbGFzcz1cImZhIGZhLWV4dGVybmFsLWxpbmtcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+JztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiAnLSc7XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlIFwiZG93bmxvYWRfZmlsZVwiOlxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgaWYodGhpcy5zdG9yYWdlU2VydmljZS5jaGVja1BsYXRGb3JtKCkgPT0gJ21vYmlsZScpe1xyXG4gICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBjdXJzb3ItcG9pbnRlclwiPicgKyBmaWVsZC5maWVsZF9jbGFzcyArICc8L3NwYW4+JztcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgY3Vyc29yLXBvaW50ZXJcIj4nICsgZmllbGQuZmllbGRfY2xhc3MgKyAnPC9zcGFuPic7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICByZXR1cm4gJy0nO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSBcInRyaW1fb2Zfc3RyaW5nXCI6XHJcbiAgICAgICAgaWYodmFsdWUgIT0gdW5kZWZpbmVkICYmIHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT0gJycpe1xyXG4gICAgICAgICAgaWYodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKXtcclxuICAgICAgICAgICAgbGV0IHN0cmluZ09iamVjdCA9IHZhbHVlLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgIGlmKHN0cmluZ09iamVjdC5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nT2JqZWN0WzBdXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICBjYXNlIFwiY29sb3JcIjpcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJwYXR0ZXJuXCI6XHJcbiAgICAgICAgaWYob2JqZWN0ICE9IG51bGwpe1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuQ29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldENvbnZlcnRlZFN0cmluZyhvYmplY3QsZmllbGQuZmllbGRfbmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImNoaXBzXCI6XHJcbiAgICAgICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodmFsdWUpICYmIHRoaXMuQ29tbW9uRnVuY3Rpb25TZXJ2aWNlLmlzQXJyYXkodmFsdWUpKXtcclxuICAgICAgICAgIGxldCBuYW1lID0gXCJcIjtcclxuICAgICAgICAgIGZvcihsZXQgaT0wIDtpPHZhbHVlLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodmFsdWVbaV1bJ25hbWUnXSkpe1xyXG4gICAgICAgICAgICAgIG5hbWUgPSBuYW1lKycsICcrdmFsdWVbaV1bJ25hbWUnXTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgbmFtZSA9IG5hbWUrJywgJyt2YWx1ZVtpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDIpOztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiLVwiO1xyXG4gICAgICBjYXNlIFwicmVmZXJlbmNlX25hbWVzXCI6XHJcbiAgICAgICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodmFsdWUpICYmIHRoaXMuQ29tbW9uRnVuY3Rpb25TZXJ2aWNlLmlzQXJyYXkodmFsdWUpKXtcclxuICAgICAgICAgIGxldCBuYW1lID0gJyc7XHJcbiAgICAgICAgICBmb3IobGV0IGk9MCA7aTx2YWx1ZS5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHZhbHVlW2ldWyduYW1lJ10pKXtcclxuICAgICAgICAgICAgICBuYW1lID0gbmFtZSsnLCAnK3ZhbHVlW2ldWyduYW1lJ107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKG5hbWUubGVuZ3RoID4gMSl7XHJcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgcmV0dXJuIFwiLVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgZGVmYXVsdDogcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXRWYWx1ZUZvckdyaWRUb29sdGlwKGZpZWxkOmFueSwgb2JqZWN0OmFueSkge1xyXG4gICAgbGV0IHZhbHVlID0gJyc7XHJcbiAgICBpZiAoZmllbGQuZmllbGRfbmFtZSAhPSB1bmRlZmluZWQgJiYgZmllbGQuZmllbGRfbmFtZSAhPSBudWxsICYmIGZpZWxkLmZpZWxkX25hbWUgIT0gJycpIHtcclxuICAgICAgdmFsdWUgPSB0aGlzLkNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRPYmplY3RWYWx1ZShmaWVsZC5maWVsZF9uYW1lLCBvYmplY3QpXHJcbiAgICB9XHJcbiAgICBpZiAoIWZpZWxkLnR5cGUpIGZpZWxkLnR5cGUgPSBcIlRleHRcIjtcclxuICAgIHN3aXRjaCAoZmllbGQudHlwZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIGNhc2UgJ2RhdGV0aW1lJzogcmV0dXJuIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLCAnZGQvTU0veXl5eSBoOm1tIGEnKTtcclxuICAgICAgY2FzZSAnZGF0ZSc6IHJldHVybiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgJ2RkL01NL3l5eXknKTtcclxuICAgICAgY2FzZSAndGltZSc6IHJldHVybiB0aGlzLmlzRGF0ZSh2YWx1ZSkgPyB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgJ2g6bW0gYScpIDogdmFsdWU7XHJcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6IHJldHVybiB2YWx1ZSA/IFwiWWVzXCIgOiBcIk5vXCI7XHJcbiAgICAgIGNhc2UgXCJjdXJyZW5jeVwiOiByZXR1cm4gdGhpcy5DdXJyZW5jeVBpcGUudHJhbnNmb3JtKHZhbHVlLCAnSU5SJyk7XHJcbiAgICAgIGNhc2UgXCJpbmZvXCI6XHJcbiAgICAgIGNhc2UgXCJmaWxlXCI6XHJcbiAgICAgIGNhc2UgXCJ0ZW1wbGF0ZVwiOlxyXG4gICAgICBjYXNlIFwiaW1hZ2VcIjpcclxuICAgICAgY2FzZSBcImljb25cIjpcclxuICAgICAgY2FzZSBcImh0bWxcIjpcclxuICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgZGVmYXVsdDogcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXROb09mSXRlbXMoZ3JpZDphbnksIGRlZmF1bHROb09mSXRlbTphbnkpIHtcclxuICAgIGlmKGdyaWQgJiYgZ3JpZC5kZXRhaWxzICYmIGdyaWQuZGV0YWlscy5udW1iZXJPZkl0ZW1zKSB7XHJcbiAgICAgIGRlZmF1bHROb09mSXRlbSA9IGdyaWQuZGV0YWlscy5udW1iZXJPZkl0ZW1zO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRlZmF1bHROb09mSXRlbTtcclxuICB9XHJcbiAgc2V0T2xkVGFiQ291bnQodGFiOmFueSkge1xyXG4gICAgbGV0IGRhdGFDb3VudDphbnkgPSB7fTtcclxuICAgIGxldCBjb3VudDphbnkgPSB7fTtcclxuICAgIGxldCB0b3RhbERhdGFDb3VudDphbnkgPSB7fTtcclxuICAgIGNvbnN0IGN1cnJlbnRUYWJOYW1lID0gdGhpcy5zdG9yYWdlU2VydmljZS5HZXRBY3RpdmVNZW51KClbJ25hbWUnXTtcclxuICAgIGNvbnN0IGtleSA9IGN1cnJlbnRUYWJOYW1lK1wiX1wiK3RhYi5uYW1lO1xyXG4gICAgdG90YWxEYXRhQ291bnQgPSB0aGlzLmRhdGFTaGFyZVNlcnZpY2UuZ2V0R3JpZENvdW50RGF0YSgpO1xyXG4gICAgbGV0IG9sZERhdGFTaXplID0gdG90YWxEYXRhQ291bnRba2V5XTtcclxuICAgIGNvdW50W2tleV0gPSBvbGREYXRhU2l6ZTtcclxuICAgIGRhdGFDb3VudFsnY291bnQnXSA9IGNvdW50O1xyXG4gICAgZGF0YUNvdW50WydncmlkQ291bnREYXRhJ10gPSB0b3RhbERhdGFDb3VudDtcclxuICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZUdyaWRDb3VudERhdGEoZGF0YUNvdW50KTtcclxuICB9XHJcbiAgY29tcGFyZUF1ZGl0SGlzdG9yeURhdGEoZm9ybUZpZWxkc0RhdGE6YW55LGN1cnJlbnRPYmplY3REYXRhOmFueSxwcmV2aW91c09iamVjdERhdGE6YW55KXtcclxuICAgICAgbGV0IGZvcm1GaWVsZHMgPSBmb3JtRmllbGRzRGF0YTtcclxuICAgICAgbGV0IGN1cnJlbnRPYmogPSB7fTtcclxuICAgICAgbGV0IHByZXZpb3VzT2JqZWN0ID0ge307XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9ybUZpZWxkcy5sZW5ndGg7IGkrKyApIHtcclxuICAgICAgICBsZXQgZmllbGQgPSBmb3JtRmllbGRzW2ldO1xyXG4gICAgICAgIGxldCBpc0NoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICBpZihmaWVsZCAmJiBmaWVsZC5maWVsZF9uYW1lKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRPYmogPSBjdXJyZW50T2JqZWN0RGF0YVtmaWVsZC5maWVsZF9uYW1lXTtcclxuICAgICAgICAgICAgcHJldmlvdXNPYmplY3QgPSBwcmV2aW91c09iamVjdERhdGFbZmllbGQuZmllbGRfbmFtZV07XHJcbiAgICAgICAgICAgIGlmKGN1cnJlbnRPYmogIT0gbnVsbCAmJiBjdXJyZW50T2JqICE9IHVuZGVmaW5lZCAmJiB0eXBlb2YgY3VycmVudE9iaiA9PSAnb2JqZWN0Jyl7XHJcbiAgICAgICAgICAgICAgY3VycmVudE9iaiA9IGN1cnJlbnRPYmplY3REYXRhW2ZpZWxkLmZpZWxkX25hbWVdLm5hbWU7XHJcbiAgICAgICAgICAgICAgcHJldmlvdXNPYmplY3QgPSBwcmV2aW91c09iamVjdERhdGFbZmllbGQuZmllbGRfbmFtZV0ubmFtZTtcclxuICAgICAgICAgICAgICBpZihjdXJyZW50T2JqICE9IHByZXZpb3VzT2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBpc0NoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmKGN1cnJlbnRPYmogIT0gcHJldmlvdXNPYmplY3Qpe1xyXG4gICAgICAgICAgICAgICAgaXNDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZmllbGRbJ2lzQ2hhbmdlZCddID0gaXNDaGFuZ2VkO1xyXG4gICAgICAgICAgICBmb3JtRmllbGRzRGF0YVtpXSA9IGZpZWxkO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gIH1cclxuICBjb3BtYXJlTGlzdE9mRmllbGRzKGZpZWxkczphbnksY3VycmVudE9iamVjdERhdGE6YW55LHByZXZpb3VzT2JqZWN0RGF0YTphbnkpe1xyXG4gICAgbGV0IGN1cnJlbnREYXRhOmFueVtdID0gY3VycmVudE9iamVjdERhdGFbZmllbGRzLmZpZWxkX25hbWVdO1xyXG4gICAgbGV0IHByZXZpb3VzRGF0YTphbnlbXSA9IHByZXZpb3VzT2JqZWN0RGF0YVtmaWVsZHMuZmllbGRfbmFtZV07XHJcbiAgICBsZXQgY3VycmVudE9iajphbnk7XHJcbiAgICBsZXQgcHJldmlvdXNPYmplY3Q6YW55O1xyXG4gICAgaWYoY3VycmVudE9iamVjdERhdGFbZmllbGRzLmZpZWxkX25hbWVdICYmIGN1cnJlbnRPYmplY3REYXRhW2ZpZWxkcy5maWVsZF9uYW1lXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmllbGRzLmxpc3Rfb2ZfZmllbGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGlzQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRzLmxpc3Rfb2ZfZmllbGRzW2ldXHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjdXJyZW50RGF0YS5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgbGV0IGNvbXBhcmVjdXJyZW50T2JqID0gY3VycmVudERhdGFbal07XHJcbiAgICAgICAgICAgIGNvbXBhcmVjdXJyZW50T2JqID0gY29tcGFyZWN1cnJlbnRPYmpbZmllbGQuZmllbGRfbmFtZV07XHJcbiAgICAgICAgICBsZXQgY29tcGFyZXByZXZpb3VzT2JqZWN0ID0gcHJldmlvdXNEYXRhW2pdO1xyXG4gICAgICAgICAgICBjb21wYXJlcHJldmlvdXNPYmplY3QgPSBjb21wYXJlcHJldmlvdXNPYmplY3RbZmllbGQuZmllbGRfbmFtZV07XHJcblxyXG4gICAgICAgICAgaWYoY29tcGFyZWN1cnJlbnRPYmogIT0gbnVsbCAmJiBjb21wYXJlY3VycmVudE9iaiAhPSB1bmRlZmluZWQgJiYgdHlwZW9mIGNvbXBhcmVjdXJyZW50T2JqID09ICdvYmplY3QnKXtcclxuICAgICAgICAgICAgY3VycmVudE9iaiA9IGNvbXBhcmVjdXJyZW50T2JqW2ZpZWxkLmZpZWxkX25hbWVdLm5hbWU7XHJcbiAgICAgICAgICAgIHByZXZpb3VzT2JqZWN0ID0gY29tcGFyZXByZXZpb3VzT2JqZWN0W2ZpZWxkLmZpZWxkX25hbWVdLm5hbWU7XHJcbiAgICAgICAgICAgIGlmKGNvbXBhcmVjdXJyZW50T2JqICE9IGNvbXBhcmVwcmV2aW91c09iamVjdCkge1xyXG4gICAgICAgICAgICAgIGlzQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgaWYoY29tcGFyZWN1cnJlbnRPYmogIT0gY29tcGFyZXByZXZpb3VzT2JqZWN0KXtcclxuICAgICAgICAgICAgICBpZihjb21wYXJlY3VycmVudE9iaiAhPSBudWxsICYmIGNvbXBhcmVjdXJyZW50T2JqICE9IHVuZGVmaW5lZCAmJiBjb21wYXJlcHJldmlvdXNPYmplY3QgIT0gbnVsbCAmJiBjb21wYXJlcHJldmlvdXNPYmplY3QgIT0gdW5kZWZpbmVkICkge1xyXG4gICAgICAgICAgICAgICAgaXNDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpc0NoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZmllbGRbJ2lzQ2hhbmdlZCddID0gaXNDaGFuZ2VkO1xyXG4gICAgICAgIGZpZWxkc1tpXSA9IGZpZWxkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldFBhZ2UocGFnZTogbnVtYmVyLHNlbGVjdENvbnRhY3Q6YW55LHRhYkZpbHRlckRhdGE6YW55LHRhYjphbnksY3VycmVudE1lbnU6YW55LGhlYWRFbGVtZW50czphbnksZmlsdGVyRm9ybVZhbHVlOmFueSxzb3J0aW5nQ29sdW1uTmFtZTpzdHJpbmcscmVjb3JkSWQ6YW55LHJvd0lkOmFueSxxdWVyeVBhcmFtczphbnksaXRlbU51bU9mR3JpZDphbnksZ3JpZERpc2FibGU6YW55LG1vZGlmeUdyaWREYXRhOmFueSxlbGVtZW50czphbnkpIHtcclxuICAgIGxldCByZXNwb25jZSA9IHtcclxuICAgICAgXCJwYWdlTnVtYmVyXCI6cGFnZSxcclxuICAgICAgXCJtb2RpZnlHcmlkRGF0YVwiOm1vZGlmeUdyaWREYXRhLFxyXG4gICAgICBcImVsZW1lbnRzXCI6ZWxlbWVudHNcclxuICAgIH1cclxuICAgIC8vIHRoaXMucGFnZU51bWJlciA9IHBhZ2U7XHJcbiAgICBsZXQgY29udGFjdDphbnkgPSB7fTtcclxuICAgIGxldCBsZWFkSWQgPSAnJztcclxuICAgIGlmKHNlbGVjdENvbnRhY3QgIT0gJycpe1xyXG4gICAgICB0YWJGaWx0ZXJEYXRhLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgaWYoZWxlbWVudC5faWQgPT0gc2VsZWN0Q29udGFjdFsnX2lkJ10pe1xyXG4gICAgICAgICAgY29udGFjdCAgPSBlbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmKGNvbnRhY3RbJ2xlYWQnXSAmJiBjb250YWN0WydsZWFkJ10uX2lkKXtcclxuICAgICAgICBsZWFkSWQgPSBjb250YWN0WydsZWFkJ10uX2lkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYWdlUGF5bG9hZDphbnkgPSB0aGlzLmFwaUNhbGxTZXJ2aWNlLmdldFBhZ2UocGFnZSx0YWIsY3VycmVudE1lbnUsaGVhZEVsZW1lbnRzLGZpbHRlckZvcm1WYWx1ZSxsZWFkSWQpXHJcbiAgICBpZihzb3J0aW5nQ29sdW1uTmFtZSl7XHJcbiAgICAgIHBhZ2VQYXlsb2FkW1wicGF0aFwiXSA9IHNvcnRpbmdDb2x1bW5OYW1lO1xyXG4gICAgfVxyXG4gICAgbGV0IGNyTGlzdCA9IHBhZ2VQYXlsb2FkLmRhdGEuY3JMaXN0O1xyXG4gICAgbGV0IGNyaXRlcmlhTGlzdCA9IFtdO1xyXG4gICAgaWYocmVjb3JkSWQpe1xyXG4gICAgICBsZXQgY3JpdGVyaWEgPSBcIl9pZDtlcTtcIityZWNvcmRJZCtcIjtTVEFUSUNcIjtcclxuICAgICAgY3JpdGVyaWFMaXN0LnB1c2goY3JpdGVyaWEpO1xyXG4gICAgfVxyXG4gICAgaWYocm93SWQpe1xyXG4gICAgICBsZXQgY3JpdGVyaWEgPSBcInNlcmlhbElkO2VxO1wiK3Jvd0lkK1wiO1NUQVRJQ1wiO1xyXG4gICAgICBjcml0ZXJpYUxpc3QucHVzaChjcml0ZXJpYSk7XHJcbiAgICB9XHJcbiAgICBpZihPYmplY3Qua2V5cyhxdWVyeVBhcmFtcykubGVuZ3RoID4gMCl7XHJcbiAgICAgIE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1zKS5mb3JFYWNoKGtleSA9PntcclxuICAgICAgICBsZXQgY3JpdGVyaWEgPSBrZXkrXCI7ZXE7XCIrcXVlcnlQYXJhbXNba2V5XStcIjtTVEFUSUNcIjtcclxuICAgICAgICBjcml0ZXJpYUxpc3QucHVzaChjcml0ZXJpYSk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBpZihjcml0ZXJpYUxpc3QubGVuZ3RoID4gMCl7XHJcbiAgICAgIHRoaXMuYXBpQ2FsbFNlcnZpY2UuZ2V0Q3JpdGVyaWFMaXN0KGNyaXRlcmlhTGlzdCx7fSkuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICBjckxpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgfSk7XHJcbiAgICAgIHBhZ2VQYXlsb2FkLmRhdGEuY3JMaXN0ID0gY3JMaXN0O1xyXG4gICAgfVxyXG4gICAgcGFnZVBheWxvYWQuZGF0YS5wYWdlU2l6ZSA9IGl0ZW1OdW1PZkdyaWQ7XHJcbiAgICB0aGlzLmdldEdyaWRQYXlsb2FkRGF0YShwYWdlUGF5bG9hZCxmaWx0ZXJGb3JtVmFsdWUsZ3JpZERpc2FibGUsdGFiLHJlc3BvbmNlKTtcclxuICAgIHJldHVybiByZXNwb25jZTtcclxuICB9XHJcbiAgb25Tb3J0KGNvbHVtbk9iamVjdDphbnksZmlsdGVyRm9ybVZhbHVlOmFueSxncmlkRGlzYWJsZTpib29sZWFuLHRhYjphbnksc29ydGluZ0NvbHVtbk5hbWU6YW55LHNvcnRJY29uOmFueSxvcmRlckJ5OmFueSxoZWFkRWxlbWVudHM6YW55LGN1cnJlbnRNZW51OmFueSxwYWdlTnVtYmVyOm51bWJlcikge1xyXG4gICAgbGV0IHJlc3BvbmNlID0ge1xyXG4gICAgICBcInNvcnRpbmdDb2x1bW5OYW1lXCI6c29ydGluZ0NvbHVtbk5hbWUsXHJcbiAgICAgIFwic29ydEljb25cIjpzb3J0SWNvbixcclxuICAgICAgXCJvcmRlckJ5XCI6b3JkZXJCeVxyXG4gICAgfVxyXG4gICAgcmVzcG9uY2Uuc29ydGluZ0NvbHVtbk5hbWUgPSByZXNwb25jZS5vcmRlckJ5ICsgY29sdW1uT2JqZWN0LmZpZWxkX25hbWU7XHJcbiAgICBjb25zdCBnZXRTb3J0RGF0YSA9IHRoaXMuYXBpQ2FsbFNlcnZpY2UuZ2V0RGF0YUZvckdyaWRGaWx0ZXIocGFnZU51bWJlcix0YWIsY3VycmVudE1lbnUsaGVhZEVsZW1lbnRzLGZpbHRlckZvcm1WYWx1ZSk7XHJcbiAgICBnZXRTb3J0RGF0YVsncGF0aCddID0gcmVzcG9uY2Uuc29ydGluZ0NvbHVtbk5hbWU7XHJcbiAgICB0aGlzLmdldEdyaWRQYXlsb2FkRGF0YShnZXRTb3J0RGF0YSxmaWx0ZXJGb3JtVmFsdWUsZ3JpZERpc2FibGUsdGFiLHJlc3BvbmNlKTtcclxuICAgIGlmIChyZXNwb25jZS5vcmRlckJ5ID09ICctJykge1xyXG4gICAgICByZXNwb25jZS5vcmRlckJ5ID0gJyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXNwb25jZS5vcmRlckJ5ID0gJy0nO1xyXG4gICAgfVxyXG4gICAgcmVzcG9uY2Uuc29ydEljb249PVwiZG93blwiPyAocmVzcG9uY2Uuc29ydEljb249XCJ1cC1hbHRcIik6IChyZXNwb25jZS5zb3J0SWNvbj1cImRvd25cIik7XHJcbiAgICByZXR1cm4gcmVzcG9uY2U7XHJcbiAgfVxyXG4gIGFwcGx5RmlsdGVyKG1vZGlmeUdyaWREYXRhOmFueSxlbGVtZW50czphbnksdGFiOmFueSxjdXJyZW50TWVudTphbnksaGVhZEVsZW1lbnRzOmFueSxmaWx0ZXJWYWx1ZTphbnksc2VsZWN0Q29udGFjdDphbnksaXRlbU51bU9mR3JpZDphbnksZ3JpZERpc2FibGU6Ym9vbGVhbixzb3J0aW5nQ29sdW1uTmFtZTphbnkpIHtcclxuICAgIGxldCByZXNwb25jZSA9IHtcclxuICAgICAgXCJtb2RpZnlHcmlkRGF0YVwiOm1vZGlmeUdyaWREYXRhLFxyXG4gICAgICBcImVsZW1lbnRzXCI6ZWxlbWVudHMsXHJcbiAgICAgIFwicGFnZU51bWJlclwiOjFcclxuICAgIH1cclxuICAgIGxldCBwYWdlUGF5bG9hZCA9IHRoaXMuYXBpQ2FsbFNlcnZpY2UuZ2V0RGF0YUZvckdyaWQocmVzcG9uY2UucGFnZU51bWJlcix0YWIsY3VycmVudE1lbnUsaGVhZEVsZW1lbnRzLGZpbHRlclZhbHVlLHNlbGVjdENvbnRhY3QpO1xyXG4gICAgaWYoc29ydGluZ0NvbHVtbk5hbWUpe1xyXG4gICAgICBwYWdlUGF5bG9hZFtcInBhdGhcIl0gPSBzb3J0aW5nQ29sdW1uTmFtZTtcclxuICAgIH1cclxuICAgIHBhZ2VQYXlsb2FkLmRhdGEucGFnZVNpemUgPSBpdGVtTnVtT2ZHcmlkO1xyXG4gICAgdGhpcy5nZXRHcmlkUGF5bG9hZERhdGEocGFnZVBheWxvYWQsZmlsdGVyVmFsdWUsZ3JpZERpc2FibGUsdGFiLHJlc3BvbmNlKTtcclxuICAgIHJldHVybiByZXNwb25jZTtcclxuICB9XHJcbiAgZ2V0R3JpZFBheWxvYWREYXRhKHBhZ2VQYXlsb2FkOmFueSx2YWx1ZTphbnksZ3JpZERpc2FibGU6Ym9vbGVhbix0YWI6YW55LHJlc3BvbmNlOmFueSkge1xyXG4gICAgaWYodGhpcy5jaGVja0lmU2VydmljZS5jaGVja0NhbGxHcmlkRGF0YSh2YWx1ZSxncmlkRGlzYWJsZSkpe1xyXG4gICAgICB0aGlzLmFwaVNlcnZpY2UuZ2V0R3JpZERhdGEocGFnZVBheWxvYWQpO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICByZXNwb25jZS5tb2RpZnlHcmlkRGF0YSA9IFtdO1xyXG4gICAgICByZXNwb25jZS5lbGVtZW50cyA9IFtdO1xyXG4gICAgICB0aGlzLnNldE9sZFRhYkNvdW50KHRhYik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|