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,611 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { mergeMap } from 'rxjs/operators';
|
|
3
|
+
import { from } from 'rxjs'; //fromPromise
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../data-share/data-share.service";
|
|
6
|
+
import * as i2 from "@angular/common/http";
|
|
7
|
+
import * as i3 from "../env/env.service";
|
|
8
|
+
import * as i4 from "../model/model.service";
|
|
9
|
+
import * as i5 from "../storage/storage.service";
|
|
10
|
+
import * as i6 from "./../common-utils/core-function/core-function.service";
|
|
11
|
+
export class ApiService {
|
|
12
|
+
constructor(dataShareService, http, envService, modalService, stroageService, coreFunctionService) {
|
|
13
|
+
this.dataShareService = dataShareService;
|
|
14
|
+
this.http = http;
|
|
15
|
+
this.envService = envService;
|
|
16
|
+
this.modalService = modalService;
|
|
17
|
+
this.stroageService = stroageService;
|
|
18
|
+
this.coreFunctionService = coreFunctionService;
|
|
19
|
+
this.serverReq = false;
|
|
20
|
+
}
|
|
21
|
+
getStatiData(payloads) {
|
|
22
|
+
this.dataShareService.setReqResponce(true);
|
|
23
|
+
let reqLength = payloads.length;
|
|
24
|
+
let responceCount = 0;
|
|
25
|
+
from(payloads)
|
|
26
|
+
.pipe(mergeMap((payload) => this.staticDataCall([payload])))
|
|
27
|
+
.subscribe((res) => {
|
|
28
|
+
this.setStaticData(res['success']);
|
|
29
|
+
responceCount = responceCount + 1;
|
|
30
|
+
if (responceCount == reqLength) {
|
|
31
|
+
this.dataShareService.setReqResponce(false);
|
|
32
|
+
}
|
|
33
|
+
}, (error) => {
|
|
34
|
+
console.log(error);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
staticDataCall(payload) {
|
|
38
|
+
let api = this.envService.getApi('GET_STATIC_DATA');
|
|
39
|
+
return this.http.post(api, payload);
|
|
40
|
+
}
|
|
41
|
+
setStaticData(data) {
|
|
42
|
+
const staticData = this.dataShareService.getStatiData();
|
|
43
|
+
const currentData = {};
|
|
44
|
+
if (data && data.length > 0) {
|
|
45
|
+
data.forEach((element) => {
|
|
46
|
+
if (element.adkeys) {
|
|
47
|
+
if (element.adkeys.totalRows && element.adkeys.totalRows != '') {
|
|
48
|
+
staticData[element.field] = [];
|
|
49
|
+
currentData[element.field] = [];
|
|
50
|
+
for (let index = 0; index < element.adkeys.totalRows; index++) {
|
|
51
|
+
staticData[element.field].push(element.data);
|
|
52
|
+
currentData[element.field].push(element.data);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (element.adkeys.index && element.adkeys.index != '') {
|
|
56
|
+
if (staticData[element.field] && staticData[element.field].length > 0) {
|
|
57
|
+
const index = element.adkeys.index;
|
|
58
|
+
staticData[element.field][index] = element.data;
|
|
59
|
+
currentData[element.field][index] = element.data;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
staticData[element.field] = element.data;
|
|
65
|
+
currentData[element.field] = element.data;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (data && data['staticDataMessgae'] != null && data['staticDataMessgae'] != '') {
|
|
70
|
+
staticData['staticDataMessgae'] = data['staticDataMessgae'];
|
|
71
|
+
currentData['staticDataMessgae'] = data['staticDataMessgae'];
|
|
72
|
+
}
|
|
73
|
+
this.dataShareService.shareStaticData(staticData, currentData);
|
|
74
|
+
}
|
|
75
|
+
ResetStaticData(keyName) {
|
|
76
|
+
let staticData = this.dataShareService.getStatiData();
|
|
77
|
+
staticData[keyName.field] = null;
|
|
78
|
+
this.dataShareService.shareStaticData(staticData, {});
|
|
79
|
+
}
|
|
80
|
+
resetStaticAllData() {
|
|
81
|
+
this.dataShareService.shareStaticData({}, {});
|
|
82
|
+
}
|
|
83
|
+
getGridCountData(payloads) {
|
|
84
|
+
from(payloads)
|
|
85
|
+
.pipe(mergeMap((payload) => this.gridCountDataCall([payload])))
|
|
86
|
+
.subscribe((res) => {
|
|
87
|
+
this.setGridCountData(res['success']);
|
|
88
|
+
}, (error) => {
|
|
89
|
+
console.log(error);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
getTabCountData(payloads) {
|
|
93
|
+
let api = this.envService.getApi('GET_COUNT_DATA');
|
|
94
|
+
this.http.post(api, payloads).subscribe((respData) => {
|
|
95
|
+
this.setGridCountData(respData['success']);
|
|
96
|
+
}, (error) => {
|
|
97
|
+
console.log(error);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
gridCountDataCall(payload) {
|
|
101
|
+
let api = this.envService.getApi('GET_COUNT_DATA');
|
|
102
|
+
return this.http.post(api, payload);
|
|
103
|
+
}
|
|
104
|
+
setGridCountData(data) {
|
|
105
|
+
const localGridCount = this.stroageService.GetTabCounts();
|
|
106
|
+
const gridCountData = this.dataShareService.getGridCountData();
|
|
107
|
+
const count = {};
|
|
108
|
+
const dataCount = {};
|
|
109
|
+
if (data.length > 0) {
|
|
110
|
+
data.forEach((element) => {
|
|
111
|
+
gridCountData[element.field] = element.data_size;
|
|
112
|
+
count[element.field] = element.data_size;
|
|
113
|
+
localGridCount[element.field] = element.data_size;
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
dataCount['gridCountData'] = gridCountData;
|
|
117
|
+
dataCount['count'] = count;
|
|
118
|
+
this.stroageService.SetTabCounts(localGridCount);
|
|
119
|
+
this.dataShareService.shareGridCountData(dataCount);
|
|
120
|
+
}
|
|
121
|
+
resetGridCountAllData() {
|
|
122
|
+
this.dataShareService.shareGridCountData({ count: {}, gridCountData: {} });
|
|
123
|
+
}
|
|
124
|
+
getGridData(payload) {
|
|
125
|
+
let api = this.envService.getApi('GET_GRID_DATA');
|
|
126
|
+
this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
|
|
127
|
+
this.dataShareService.shareGridData(respData);
|
|
128
|
+
}, (error) => {
|
|
129
|
+
console.log(error);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
resetGridData() {
|
|
133
|
+
this.dataShareService.shareGridData([]);
|
|
134
|
+
}
|
|
135
|
+
getDashletMster(payload) {
|
|
136
|
+
let api = this.envService.getApi('GET_GRID_DATA');
|
|
137
|
+
this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
|
|
138
|
+
this.dataShareService.shareDashletMaster(respData);
|
|
139
|
+
}, (error) => {
|
|
140
|
+
console.log(error);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
getMongoDashletMster(payload) {
|
|
144
|
+
let api = this.envService.getApi('GET_GRID_DATA');
|
|
145
|
+
this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
|
|
146
|
+
this.dataShareService.shareMongoChart(respData);
|
|
147
|
+
}, (error) => {
|
|
148
|
+
console.log(error);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
getMongoDashbord(payload) {
|
|
152
|
+
let api = this.envService.getApi('GET_GRID_DATA');
|
|
153
|
+
this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
|
|
154
|
+
this.dataShareService.shareMongoDashbord(respData);
|
|
155
|
+
}, (error) => {
|
|
156
|
+
console.log(error);
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
GetTempMenu(payload) {
|
|
160
|
+
let api = this.envService.getApi('GET_CUSTOM_TEMPLATE');
|
|
161
|
+
this.http.post(api, payload).subscribe((respData) => {
|
|
162
|
+
this.dataShareService.shareMenuData(respData);
|
|
163
|
+
}, (error) => {
|
|
164
|
+
console.log(error);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
resetMenuData() {
|
|
168
|
+
this.dataShareService.shareMenuData([]);
|
|
169
|
+
}
|
|
170
|
+
GetTempData(payload) {
|
|
171
|
+
let moduleName = payload['module'];
|
|
172
|
+
let name = this.coreFunctionService.getTempNameFromPayload(payload);
|
|
173
|
+
let template = this.stroageService.getTemplate(name, moduleName);
|
|
174
|
+
if (template) {
|
|
175
|
+
this.dataShareService.shareTempData([template]);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
let api = this.envService.getApi('GET_CUSTOM_TEMPLATE');
|
|
179
|
+
this.http.post(api, payload).subscribe((respData) => {
|
|
180
|
+
this.dataShareService.shareTempData(respData);
|
|
181
|
+
let preparedTempList = this.coreFunctionService.prepareTemplate(respData, moduleName);
|
|
182
|
+
this.stroageService.storeAllTemplate(preparedTempList);
|
|
183
|
+
}, (error) => {
|
|
184
|
+
console.log(error);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
resetTempData() {
|
|
189
|
+
this.dataShareService.shareTempData([]);
|
|
190
|
+
}
|
|
191
|
+
deleteGridRow(payload) {
|
|
192
|
+
let api = this.envService.getApi('DELETE_GRID_ROW');
|
|
193
|
+
this.http.post(api + '/' + payload.curTemp, payload).subscribe((response) => {
|
|
194
|
+
this.dataShareService.setDeleteGridRowResponce(response);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
SaveFormData(payload) {
|
|
198
|
+
let api = this.envService.getApi('SAVE_FORM_DATA');
|
|
199
|
+
this.saveCall(api + '/' + payload.curTemp, payload);
|
|
200
|
+
}
|
|
201
|
+
SendEmail(payload) {
|
|
202
|
+
let api = this.envService.getApi('SEND_EMAIL');
|
|
203
|
+
this.saveCall(api + '/' + payload.curTemp, payload);
|
|
204
|
+
}
|
|
205
|
+
DynamicApiCall(payload) {
|
|
206
|
+
let api = this.envService.getBaseUrl();
|
|
207
|
+
let list = payload.path.split("/");
|
|
208
|
+
let callName = list[list.length - 1];
|
|
209
|
+
switch (callName) {
|
|
210
|
+
case "gsd":
|
|
211
|
+
this.getStatiData(payload.data);
|
|
212
|
+
break;
|
|
213
|
+
default:
|
|
214
|
+
this.saveCall(api + payload.path, payload);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
saveCall(api, payload) {
|
|
218
|
+
this.http.post(api, payload.data).subscribe((respData) => {
|
|
219
|
+
this.dataShareService.setSaveResponce(respData);
|
|
220
|
+
}, (error) => {
|
|
221
|
+
console.log(error);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
ResetSaveResponce() {
|
|
225
|
+
this.dataShareService.setSaveResponce('');
|
|
226
|
+
}
|
|
227
|
+
GetFilterGridData(payload) {
|
|
228
|
+
let api = this.envService.getApi('GET_GRID_DATA');
|
|
229
|
+
this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
|
|
230
|
+
this.dataShareService.shareGridData(respData);
|
|
231
|
+
}, (error) => {
|
|
232
|
+
console.log(error);
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
GetTypeaheadData(payload) {
|
|
236
|
+
let api = this.envService.getApi('GET_STATIC_DATA');
|
|
237
|
+
this.http.post(api, payload).subscribe((respData) => {
|
|
238
|
+
let currentstaticData = [];
|
|
239
|
+
let result = [];
|
|
240
|
+
currentstaticData = respData['success'];
|
|
241
|
+
if (currentstaticData.length > 0) {
|
|
242
|
+
result = currentstaticData[0].data;
|
|
243
|
+
}
|
|
244
|
+
this.dataShareService.setTypeAheadData(result);
|
|
245
|
+
}, (error) => {
|
|
246
|
+
console.log(error);
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
clearTypeaheadData() {
|
|
250
|
+
this.dataShareService.setTypeAheadData([]);
|
|
251
|
+
}
|
|
252
|
+
GetForm(payload) {
|
|
253
|
+
let endPoint = '';
|
|
254
|
+
if (this.envService.getRequestType() == 'PUBLIC') {
|
|
255
|
+
endPoint = 'GET_FORM_PUBLIC';
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
endPoint = 'GET_FORM';
|
|
259
|
+
}
|
|
260
|
+
let api = this.envService.getApi(endPoint);
|
|
261
|
+
if (payload._id && payload._id != undefined && payload._id != null && payload._id != '') {
|
|
262
|
+
api = api + '/' + payload._id;
|
|
263
|
+
}
|
|
264
|
+
this.http.post(api, payload.data).subscribe((respData) => {
|
|
265
|
+
let dinamicForm;
|
|
266
|
+
if (respData && respData['success'] != null) {
|
|
267
|
+
const object = JSON.parse(JSON.stringify(respData['success']));
|
|
268
|
+
object['view_mode'] = "inlineFormView";
|
|
269
|
+
dinamicForm = {
|
|
270
|
+
DINAMIC_FORM: object
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
this.dataShareService.setForm(dinamicForm);
|
|
274
|
+
}, (error) => {
|
|
275
|
+
console.log(error);
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
GetNestedForm(payload) {
|
|
279
|
+
let api = this.envService.getApi('GET_CUSTOM_TEMPLATE');
|
|
280
|
+
this.http.post(api, payload).subscribe((respData) => {
|
|
281
|
+
this.dataShareService.setNestedForm(respData[0]);
|
|
282
|
+
}, (error) => {
|
|
283
|
+
console.log(error);
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
GetHostName(payload) {
|
|
287
|
+
let api = this.envService.getApi('GET_GRID_DATA');
|
|
288
|
+
this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
|
|
289
|
+
this.dataShareService.setHostData(respData['data']);
|
|
290
|
+
}, (error) => {
|
|
291
|
+
console.log(error);
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
GetDashletData(payloads) {
|
|
295
|
+
//this.dataShareService.setDashletData({});
|
|
296
|
+
from(payloads)
|
|
297
|
+
.pipe(mergeMap((payload) => this.dashletDataCall(payload)))
|
|
298
|
+
.subscribe((res) => {
|
|
299
|
+
this.SetDashletData(res);
|
|
300
|
+
}, (error) => {
|
|
301
|
+
console.log(error);
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
dashletDataCall(payload) {
|
|
305
|
+
let api = this.envService.getApi('GET_DASHLET_DATA');
|
|
306
|
+
return this.http.post(api + '/' + payload._id, payload.data);
|
|
307
|
+
}
|
|
308
|
+
SetDashletData(respData) {
|
|
309
|
+
let currentStaticData = [];
|
|
310
|
+
let getDashletData = this.dataShareService.getDashletData();
|
|
311
|
+
const dashletData = JSON.parse(JSON.stringify(getDashletData));
|
|
312
|
+
currentStaticData.push(respData);
|
|
313
|
+
if (currentStaticData.length > 0) {
|
|
314
|
+
currentStaticData.forEach(element => {
|
|
315
|
+
if (element && element.field != undefined && element.field != null) {
|
|
316
|
+
dashletData[element.field] = element.data;
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
this.dataShareService.setDashletData(dashletData);
|
|
321
|
+
}
|
|
322
|
+
GetExportExclLink(payload) {
|
|
323
|
+
let api = this.envService.getApi('EXPORT_GRID_DATA');
|
|
324
|
+
this.http.post(api, payload.data, payload.responce).subscribe((respData) => {
|
|
325
|
+
this.dataShareService.setExportExcelLink(respData);
|
|
326
|
+
}, (error) => {
|
|
327
|
+
this.modalService.close('download-progress-modal');
|
|
328
|
+
console.log(error);
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
GetExportCVSLink(payload) {
|
|
332
|
+
let api = this.envService.getApi('CSV_EXPORT_GRID_DATA');
|
|
333
|
+
this.http.post(api, payload.data, payload.responce).subscribe((respData) => {
|
|
334
|
+
this.dataShareService.setExportCVSLink(respData);
|
|
335
|
+
}, (error) => {
|
|
336
|
+
this.modalService.close('download-progress-modal');
|
|
337
|
+
console.log(error);
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
resetGetExportExclLink() {
|
|
341
|
+
this.dataShareService.setExportExcelLink('');
|
|
342
|
+
}
|
|
343
|
+
GetProductList(payload) {
|
|
344
|
+
let api = this.envService.getApi('GET_PARAMETER_LIST');
|
|
345
|
+
this.http.post(api, payload).subscribe((respData) => {
|
|
346
|
+
this.dataShareService.setProductList(respData);
|
|
347
|
+
}, (error) => {
|
|
348
|
+
console.log(error);
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
GetPreviewHtml(payload) {
|
|
352
|
+
let api = this.envService.getApi('GET_PREVIEW_HTML');
|
|
353
|
+
this.http.post(api + '/' + payload._id, payload.data).subscribe((respData) => {
|
|
354
|
+
this.dataShareService.setPreviewHtml(respData['success']);
|
|
355
|
+
}, (error) => {
|
|
356
|
+
console.log(error);
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
resetPreviewHtml() {
|
|
360
|
+
this.dataShareService.setPreviewHtml('');
|
|
361
|
+
}
|
|
362
|
+
UpdateProductBranch(payload) {
|
|
363
|
+
let api = this.envService.getApi('SAVE_PARAMETER_LIST');
|
|
364
|
+
this.http.post(api + '/' + payload._id, payload.data).subscribe((respData) => {
|
|
365
|
+
this.dataShareService.setUpdateProductBranch(respData);
|
|
366
|
+
}, (error) => {
|
|
367
|
+
console.log(error);
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
GetJobSchedules(payload) {
|
|
371
|
+
let api = this.envService.getApi('GET_GRID_DATA');
|
|
372
|
+
this.http.post(api + '/' + payload._id, payload.data).subscribe((respData) => {
|
|
373
|
+
this.dataShareService.setJobScheduleData(respData);
|
|
374
|
+
}, (error) => {
|
|
375
|
+
console.log(error);
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
GetPdfData(payload) {
|
|
379
|
+
let api = this.envService.getApi('GET_PDF');
|
|
380
|
+
this.http.post(api + '/' + payload._id, payload.data, { responseType: 'arraybuffer', observe: 'response' }).subscribe((respData) => {
|
|
381
|
+
var contentDisposition = respData.headers.get('Content-Disposition');
|
|
382
|
+
var filename = "";
|
|
383
|
+
let matches = /filename="(.*?)"/g.exec(contentDisposition);
|
|
384
|
+
if (matches != null && matches[1]) {
|
|
385
|
+
filename = matches[1].replace(/['"]/g, '');
|
|
386
|
+
filename = filename.substring(filename.indexOf("=") + 1, filename.length);
|
|
387
|
+
}
|
|
388
|
+
this.dataShareService.setDownloadPdfData({ data: respData.body, filename: filename });
|
|
389
|
+
}, (error) => {
|
|
390
|
+
console.log(error);
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
ResetPdfData() {
|
|
394
|
+
this.dataShareService.setDownloadPdfData('');
|
|
395
|
+
}
|
|
396
|
+
GetFileData(payload) {
|
|
397
|
+
let api = this.envService.getApi('GET_FILE');
|
|
398
|
+
this.http.post(api + '/' + payload._id, payload.data, { responseType: 'arraybuffer', observe: 'response' }).subscribe((respData) => {
|
|
399
|
+
var contentDisposition = respData.headers.get('Content-Disposition');
|
|
400
|
+
var filename = "";
|
|
401
|
+
let matches = /filename="(.*?)"/g.exec(contentDisposition);
|
|
402
|
+
if (matches != null && matches[1]) {
|
|
403
|
+
filename = matches[1].replace(/['"]/g, '');
|
|
404
|
+
filename = filename.substring(filename.indexOf("=") + 1, filename.length);
|
|
405
|
+
}
|
|
406
|
+
this.dataShareService.setFileData({ data: respData.body, filename: filename });
|
|
407
|
+
}, (error) => {
|
|
408
|
+
console.log(error);
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
PrintTemplate(payload) {
|
|
412
|
+
let api = this.envService.getApi('GET_FILE');
|
|
413
|
+
this.http.post(api + '/' + payload._id, payload.data, { responseType: 'arraybuffer', observe: 'response' }).subscribe((respData) => {
|
|
414
|
+
var contentDisposition = respData.headers.get('Content-Disposition');
|
|
415
|
+
var filename = "";
|
|
416
|
+
let matches = /filename="(.*?)"/g.exec(contentDisposition);
|
|
417
|
+
if (matches != null && matches[1]) {
|
|
418
|
+
filename = matches[1].replace(/['"]/g, '');
|
|
419
|
+
filename = filename.substring(filename.indexOf("=") + 1, filename.length);
|
|
420
|
+
}
|
|
421
|
+
this.dataShareService.setPrintTemplate({ data: respData.body, filename: filename });
|
|
422
|
+
}, (error) => {
|
|
423
|
+
console.log(error);
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
ResetFileData() {
|
|
427
|
+
this.dataShareService.setFileData('');
|
|
428
|
+
}
|
|
429
|
+
DownloadFile(payload) {
|
|
430
|
+
let api = this.envService.getApi('DOWNLOAD_PDF');
|
|
431
|
+
this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
|
|
432
|
+
this.dataShareService.setFileDownloadUrl(respData['success']);
|
|
433
|
+
}, (error) => {
|
|
434
|
+
console.log(error);
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
ResetDownloadUrl() {
|
|
438
|
+
this.dataShareService.setFileDownloadUrl('');
|
|
439
|
+
}
|
|
440
|
+
FileUpload(payload) {
|
|
441
|
+
let api = this.envService.getApi('GET_PDF');
|
|
442
|
+
this.http.post(api + '/' + payload._id, payload.data, payload.responce).subscribe((respData) => {
|
|
443
|
+
console.log(respData);
|
|
444
|
+
}, (error) => {
|
|
445
|
+
console.log(error);
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
GetChartData(payload) {
|
|
449
|
+
let api = this.envService.getApi('GET_CHART_DATA');
|
|
450
|
+
this.http.post(api, payload).subscribe((respData) => {
|
|
451
|
+
this.dataShareService.setChartData(respData);
|
|
452
|
+
}, (error) => {
|
|
453
|
+
console.log(error);
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
GetQr(payload) {
|
|
457
|
+
let api = this.envService.getApi('GET_QR_CODE');
|
|
458
|
+
this.http.post(api + payload['number'], payload, { responseType: 'blob' }).subscribe((respData) => {
|
|
459
|
+
this.dataShareService.setFileData({ data: respData, filename: "qr-" + payload['from'] + "-" + (payload['to'] - 1) });
|
|
460
|
+
}, (error) => {
|
|
461
|
+
console.log(error);
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
getAuditVersionList(payload) {
|
|
465
|
+
let api = this.envService.getApi('AUDIT_VERSION_LIST');
|
|
466
|
+
this.http.get(api + "/" + payload).subscribe((respData) => {
|
|
467
|
+
this.dataShareService.setAuditVersionList(respData);
|
|
468
|
+
}, (error) => {
|
|
469
|
+
console.log(error);
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
getAuditHistory(payload) {
|
|
473
|
+
let api = this.envService.getApi('AUDIT_HISTORY');
|
|
474
|
+
this.http.post(api + "/" + payload['path'], payload.data).subscribe((respData) => {
|
|
475
|
+
this.dataShareService.setAuditHistoryData(respData);
|
|
476
|
+
}, (error) => {
|
|
477
|
+
console.log(error);
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
getAplicationsThemeSetting(payload) {
|
|
481
|
+
let api = this.envService.getApi('GET_CUSTOM_TEMPLATE');
|
|
482
|
+
this.http.post(api, payload).subscribe((respData) => {
|
|
483
|
+
if (JSON.stringify(respData) != "{}") {
|
|
484
|
+
this.dataShareService.setThemeSetting(respData);
|
|
485
|
+
}
|
|
486
|
+
}, (error) => {
|
|
487
|
+
console.log(error);
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
getAplicationsSetting(payload) {
|
|
491
|
+
let api = this.envService.getApi('GET_CUSTOM_TEMPLATE');
|
|
492
|
+
this.http.post(api, payload).subscribe((respData) => {
|
|
493
|
+
if (JSON.stringify(respData) != "{}") {
|
|
494
|
+
this.dataShareService.setApplicationSetting(respData);
|
|
495
|
+
}
|
|
496
|
+
}, (error) => {
|
|
497
|
+
console.log(error);
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
fieldDinamicApi(api, payload) {
|
|
501
|
+
const host = this.envService.getBaseUrl();
|
|
502
|
+
this.http.post(host + api, payload).subscribe((respData) => {
|
|
503
|
+
this.dataShareService.setFieldDinamicApiResponce(respData);
|
|
504
|
+
}, (error) => {
|
|
505
|
+
console.log(error);
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
getNextFormData(payload) {
|
|
509
|
+
let api = this.envService.getApi('GET_GRID_DATA');
|
|
510
|
+
this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
|
|
511
|
+
if (JSON.stringify(respData) != "{}") {
|
|
512
|
+
this.dataShareService.setNextFormData(respData);
|
|
513
|
+
}
|
|
514
|
+
}, (error) => {
|
|
515
|
+
console.log(error);
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
gitVersion(payload) {
|
|
519
|
+
let api = this.envService.getApi('GIT_VERSION');
|
|
520
|
+
this.http.get(api).subscribe((respData) => {
|
|
521
|
+
this.dataShareService.setGitVersion(respData);
|
|
522
|
+
}, (error) => {
|
|
523
|
+
console.log(error);
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
getReportLoadGridData(payload) {
|
|
527
|
+
let api = this.envService.getApi('GET_GRID_DATA');
|
|
528
|
+
this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
|
|
529
|
+
this.dataShareService.setReportLoadGridData(respData);
|
|
530
|
+
}, (error) => {
|
|
531
|
+
console.log(error);
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
getFavouriteData(payload) {
|
|
535
|
+
let api = this.envService.getApi('GET_GRID_DATA');
|
|
536
|
+
this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
|
|
537
|
+
if (respData && respData['data'] && respData['data'].length > 0) {
|
|
538
|
+
const userPreference = respData['data'][0];
|
|
539
|
+
this.stroageService.setUserPreference(userPreference);
|
|
540
|
+
this.dataShareService.setUserPreference(userPreference);
|
|
541
|
+
}
|
|
542
|
+
else {
|
|
543
|
+
this.dataShareService.setUserPreference(respData['data']);
|
|
544
|
+
}
|
|
545
|
+
}, (error) => {
|
|
546
|
+
console.log(error);
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
getUserNotification(payload) {
|
|
550
|
+
let api = this.envService.getApi('GET_GRID_DATA');
|
|
551
|
+
this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
|
|
552
|
+
this.dataShareService.shareUserNotification(respData);
|
|
553
|
+
}, (error) => {
|
|
554
|
+
console.log(error);
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
getUserNotificationSetting() {
|
|
558
|
+
let api = this.envService.getApi('GET_NOTIFICATION_SETTING');
|
|
559
|
+
this.http.post(api, {}).subscribe((respData) => {
|
|
560
|
+
this.dataShareService.shareUserNotificationSetting(respData);
|
|
561
|
+
}, (error) => {
|
|
562
|
+
console.log(error);
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
resetUserNotification() {
|
|
566
|
+
this.dataShareService.shareUserNotification([]);
|
|
567
|
+
}
|
|
568
|
+
getDownloadManual(payload) {
|
|
569
|
+
let api = this.envService.getApi('DOWNLOAD_MANUAL');
|
|
570
|
+
this.http.post(api, payload).subscribe((respData) => {
|
|
571
|
+
const url = respData.fileUrl;
|
|
572
|
+
this.dataShareService.sharePublicUrlFromS3(url);
|
|
573
|
+
}, (error) => {
|
|
574
|
+
console.log(error);
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
getGridRunningData(payload) {
|
|
578
|
+
let api = this.envService.getApi('GET_GRID_DATA');
|
|
579
|
+
this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
|
|
580
|
+
this.dataShareService.shareGridRunningData(respData);
|
|
581
|
+
}, (error) => {
|
|
582
|
+
console.log(error);
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
// For app
|
|
586
|
+
getDatabyCollectionName(payload) {
|
|
587
|
+
let api = this.envService.getApi('GET_GRID_DATA');
|
|
588
|
+
this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
|
|
589
|
+
this.dataShareService.collectionData(respData);
|
|
590
|
+
}, (error) => {
|
|
591
|
+
console.log(error);
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
GetChildGrid(payload) {
|
|
595
|
+
let api = this.envService.getApi('GET_CUSTOM_TEMPLATE');
|
|
596
|
+
this.http.post(api, payload).subscribe((respData) => {
|
|
597
|
+
this.dataShareService.setChildGrid(respData[0]);
|
|
598
|
+
}, (error) => {
|
|
599
|
+
console.log(error);
|
|
600
|
+
});
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
ApiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ApiService, deps: [{ token: i1.DataShareService }, { token: i2.HttpClient }, { token: i3.EnvService }, { token: i4.ModelService }, { token: i5.StorageService }, { token: i6.CoreFunctionService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
604
|
+
ApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ApiService, providedIn: 'root' });
|
|
605
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ApiService, decorators: [{
|
|
606
|
+
type: Injectable,
|
|
607
|
+
args: [{
|
|
608
|
+
providedIn: 'root'
|
|
609
|
+
}]
|
|
610
|
+
}], ctorParameters: function () { return [{ type: i1.DataShareService }, { type: i2.HttpClient }, { type: i3.EnvService }, { type: i4.ModelService }, { type: i5.StorageService }, { type: i6.CoreFunctionService }]; } });
|
|
611
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtY29yZS9zcmMvbGliL3NlcnZpY2VzL2FwaS9hcGkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBdUIsUUFBUSxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0UsT0FBTyxFQUFFLElBQUksRUFBa0IsTUFBTSxNQUFNLENBQUMsQ0FBQSxhQUFhOzs7Ozs7OztBQVN6RCxNQUFNLE9BQU8sVUFBVTtJQUd2QixZQUNVLGdCQUFrQyxFQUNsQyxJQUFlLEVBQ2YsVUFBc0IsRUFDdEIsWUFBMEIsRUFDMUIsY0FBOEIsRUFDOUIsbUJBQXVDO1FBTHZDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsU0FBSSxHQUFKLElBQUksQ0FBVztRQUNmLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFSL0MsY0FBUyxHQUFXLEtBQUssQ0FBQztJQVN2QixDQUFDO0lBRU4sWUFBWSxDQUFDLFFBQVk7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ2hDLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ2IsSUFBSSxDQUNILFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBQyxFQUFFLENBQ2xCLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQ2hDO2FBQ0EsU0FBUyxDQUNS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cG9ydCB7IENvcmVGdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLy4uL2NvbW1vbi11dGlscy9jb3JlLWZ1bmN0aW9uL2NvcmUtZnVuY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBtYXAsIHRhcCwgc3dpdGNoTWFwLCBtZXJnZU1hcCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgZnJvbSwgb2YsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJzsvL2Zyb21Qcm9taXNlXHJcbmltcG9ydCB7IERhdGFTaGFyZVNlcnZpY2UgfSBmcm9tICcuLi9kYXRhLXNoYXJlL2RhdGEtc2hhcmUuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudlNlcnZpY2UgfSBmcm9tICcuLi9lbnYvZW52LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb2RlbFNlcnZpY2UgfSBmcm9tICcuLi9tb2RlbC9tb2RlbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zdG9yYWdlL3N0b3JhZ2Uuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBcGlTZXJ2aWNlIHtcclxuICBzZXJ2ZXJSZXE6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuY29uc3RydWN0b3IoXHJcbiAgcHJpdmF0ZSBkYXRhU2hhcmVTZXJ2aWNlOiBEYXRhU2hhcmVTZXJ2aWNlLFxyXG4gIHByaXZhdGUgaHR0cDpIdHRwQ2xpZW50LFxyXG4gIHByaXZhdGUgZW52U2VydmljZTogRW52U2VydmljZSxcclxuICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kZWxTZXJ2aWNlLFxyXG4gIHByaXZhdGUgc3Ryb2FnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxyXG4gIHByaXZhdGUgY29yZUZ1bmN0aW9uU2VydmljZTpDb3JlRnVuY3Rpb25TZXJ2aWNlXHJcbiApIHsgfVxyXG5cclxuZ2V0U3RhdGlEYXRhKHBheWxvYWRzOmFueSl7XHJcbiAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldFJlcVJlc3BvbmNlKHRydWUpO1xyXG4gIGxldCByZXFMZW5ndGggPSBwYXlsb2Fkcy5sZW5ndGg7XHJcbiAgbGV0IHJlc3BvbmNlQ291bnQgPSAwO1xyXG4gIGZyb20ocGF5bG9hZHMpXHJcbiAgLnBpcGUoXHJcbiAgICBtZXJnZU1hcCgocGF5bG9hZCk9PlxyXG4gICAgICB0aGlzLnN0YXRpY0RhdGFDYWxsKFtwYXlsb2FkXSkpXHJcbiAgICApXHJcbiAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOmFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGljRGF0YShyZXNbJ3N1Y2Nlc3MnXSlcclxuICAgICAgICByZXNwb25jZUNvdW50ID0gcmVzcG9uY2VDb3VudCArIDE7XHJcbiAgICAgICAgaWYocmVzcG9uY2VDb3VudCA9PSByZXFMZW5ndGgpe1xyXG4gICAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldFJlcVJlc3BvbmNlKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcik9PntcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuc3RhdGljRGF0YUNhbGwocGF5bG9hZDpvYmplY3Qpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfU1RBVElDX0RBVEEnKTtcclxuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYXBpLCBwYXlsb2FkKVxyXG59XHJcbnNldFN0YXRpY0RhdGEoZGF0YTphbnkpe1xyXG4gIGNvbnN0IHN0YXRpY0RhdGE6YW55ID0gdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLmdldFN0YXRpRGF0YSgpO1xyXG4gIGNvbnN0IGN1cnJlbnREYXRhOmFueSA9IHt9O1xyXG4gIGlmKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKXtcclxuICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgaWYoZWxlbWVudC5hZGtleXMpe1xyXG4gICAgICAgICAgaWYoZWxlbWVudC5hZGtleXMudG90YWxSb3dzICYmIGVsZW1lbnQuYWRrZXlzLnRvdGFsUm93cyAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgc3RhdGljRGF0YVtlbGVtZW50LmZpZWxkXSA9IFtdO1xyXG4gICAgICAgICAgICAgIGN1cnJlbnREYXRhW2VsZW1lbnQuZmllbGRdID0gW107XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGVsZW1lbnQuYWRrZXlzLnRvdGFsUm93czsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICAgICAgICBzdGF0aWNEYXRhW2VsZW1lbnQuZmllbGRdLnB1c2goZWxlbWVudC5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgY3VycmVudERhdGFbZWxlbWVudC5maWVsZF0ucHVzaChlbGVtZW50LmRhdGEpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGVsZW1lbnQuYWRrZXlzLmluZGV4ICYmIGVsZW1lbnQuYWRrZXlzLmluZGV4ICE9ICcnKXtcclxuICAgICAgICAgICAgICBpZihzdGF0aWNEYXRhW2VsZW1lbnQuZmllbGRdICYmIHN0YXRpY0RhdGFbZWxlbWVudC5maWVsZF0ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZWxlbWVudC5hZGtleXMuaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0RhdGFbZWxlbWVudC5maWVsZF1baW5kZXhdID0gZWxlbWVudC5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICBjdXJyZW50RGF0YVtlbGVtZW50LmZpZWxkXVtpbmRleF0gPSBlbGVtZW50LmRhdGE7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICAgIHN0YXRpY0RhdGFbZWxlbWVudC5maWVsZF0gPSBlbGVtZW50LmRhdGE7XHJcbiAgICAgICAgICBjdXJyZW50RGF0YVtlbGVtZW50LmZpZWxkXSA9IGVsZW1lbnQuZGF0YTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGlmKGRhdGEgJiYgZGF0YVsnc3RhdGljRGF0YU1lc3NnYWUnXSAhPSBudWxsICYmIGRhdGFbJ3N0YXRpY0RhdGFNZXNzZ2FlJ10gIT0gJycpe1xyXG4gICAgc3RhdGljRGF0YVsnc3RhdGljRGF0YU1lc3NnYWUnXSA9IGRhdGFbJ3N0YXRpY0RhdGFNZXNzZ2FlJ107XHJcbiAgICBjdXJyZW50RGF0YVsnc3RhdGljRGF0YU1lc3NnYWUnXSA9IGRhdGFbJ3N0YXRpY0RhdGFNZXNzZ2FlJ107XHJcbiAgfVxyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZVN0YXRpY0RhdGEoc3RhdGljRGF0YSxjdXJyZW50RGF0YSk7XHJcbn1cclxuXHJcblJlc2V0U3RhdGljRGF0YShrZXlOYW1lOmFueSl7XHJcbiAgbGV0IHN0YXRpY0RhdGE6YW55ID0gdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLmdldFN0YXRpRGF0YSgpO1xyXG4gIHN0YXRpY0RhdGFba2V5TmFtZS5maWVsZF0gPSBudWxsO1xyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZVN0YXRpY0RhdGEoc3RhdGljRGF0YSx7fSk7XHJcbn1cclxuXHJcbnJlc2V0U3RhdGljQWxsRGF0YSgpe1xyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZVN0YXRpY0RhdGEoe30se30pXHJcbn1cclxuXHJcbmdldEdyaWRDb3VudERhdGEocGF5bG9hZHM6c3RyaW5nKXtcclxuICBmcm9tKHBheWxvYWRzKVxyXG4gIC5waXBlKFxyXG4gICAgbWVyZ2VNYXAoKHBheWxvYWQpPT5cclxuICAgICAgdGhpcy5ncmlkQ291bnREYXRhQ2FsbChbcGF5bG9hZF0pKVxyXG4gICAgKVxyXG4gICAgLnN1YnNjcmliZShcclxuICAgICAgKHJlczphbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNldEdyaWRDb3VudERhdGEocmVzWydzdWNjZXNzJ10pXHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcik9PntcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuZ2V0VGFiQ291bnREYXRhKHBheWxvYWRzOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9DT1VOVF9EQVRBJyk7XHJcbiAgdGhpcy5odHRwLnBvc3QoYXBpLCBwYXlsb2Fkcykuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhOmFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNldEdyaWRDb3VudERhdGEocmVzcERhdGFbJ3N1Y2Nlc3MnXSlcclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5cclxuZ3JpZENvdW50RGF0YUNhbGwocGF5bG9hZDpvYmplY3Qpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfQ09VTlRfREFUQScpO1xyXG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChhcGksIHBheWxvYWQpXHJcbn1cclxuXHJcbnNldEdyaWRDb3VudERhdGEoZGF0YTphbnkpe1xyXG4gIGNvbnN0IGxvY2FsR3JpZENvdW50OmFueSA9IHRoaXMuc3Ryb2FnZVNlcnZpY2UuR2V0VGFiQ291bnRzKCk7XHJcbiAgY29uc3QgZ3JpZENvdW50RGF0YTphbnkgPSB0aGlzLmRhdGFTaGFyZVNlcnZpY2UuZ2V0R3JpZENvdW50RGF0YSgpO1xyXG4gIGNvbnN0IGNvdW50OmFueSA9IHt9O1xyXG4gIGNvbnN0IGRhdGFDb3VudDphbnkgPSB7fTtcclxuICBpZihkYXRhLmxlbmd0aCA+IDApe1xyXG4gICAgZGF0YS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICBncmlkQ291bnREYXRhW2VsZW1lbnQuZmllbGRdID0gZWxlbWVudC5kYXRhX3NpemU7XHJcbiAgICAgIGNvdW50W2VsZW1lbnQuZmllbGRdID0gZWxlbWVudC5kYXRhX3NpemU7XHJcbiAgICAgIGxvY2FsR3JpZENvdW50W2VsZW1lbnQuZmllbGRdID0gZWxlbWVudC5kYXRhX3NpemU7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgZGF0YUNvdW50WydncmlkQ291bnREYXRhJ10gPSBncmlkQ291bnREYXRhO1xyXG4gIGRhdGFDb3VudFsnY291bnQnXSA9IGNvdW50O1xyXG4gIHRoaXMuc3Ryb2FnZVNlcnZpY2UuU2V0VGFiQ291bnRzKGxvY2FsR3JpZENvdW50KVxyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZUdyaWRDb3VudERhdGEoZGF0YUNvdW50KTtcclxufVxyXG5yZXNldEdyaWRDb3VudEFsbERhdGEoKXtcclxuICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2hhcmVHcmlkQ291bnREYXRhKHsgY291bnQ6IHt9LCBncmlkQ291bnREYXRhOiB7fX0pXHJcbn1cclxuZ2V0R3JpZERhdGEocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfR1JJRF9EQVRBJyk7XHJcbiAgdGhpcy5odHRwLnBvc3QoYXBpICsgJy8nICsgcGF5bG9hZC5wYXRoLCBwYXlsb2FkLmRhdGEpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZUdyaWREYXRhKHJlc3BEYXRhKVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcblxyXG5yZXNldEdyaWREYXRhKCl7XHJcbiAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNoYXJlR3JpZERhdGEoW10pXHJcbn1cclxuZ2V0RGFzaGxldE1zdGVyKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0dSSURfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQucGF0aCwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2hhcmVEYXNobGV0TWFzdGVyKHJlc3BEYXRhKVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbmdldE1vbmdvRGFzaGxldE1zdGVyKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0dSSURfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQucGF0aCwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2hhcmVNb25nb0NoYXJ0KHJlc3BEYXRhKVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbmdldE1vbmdvRGFzaGJvcmQocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfR1JJRF9EQVRBJyk7XHJcbiAgdGhpcy5odHRwLnBvc3QoYXBpICsgJy8nICsgcGF5bG9hZC5wYXRoLCBwYXlsb2FkLmRhdGEpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZU1vbmdvRGFzaGJvcmQocmVzcERhdGEpXHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuXHJcbkdldFRlbXBNZW51KHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0NVU1RPTV9URU1QTEFURScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNoYXJlTWVudURhdGEocmVzcERhdGEpXHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxucmVzZXRNZW51RGF0YSgpe1xyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZU1lbnVEYXRhKFtdKVxyXG59XHJcbkdldFRlbXBEYXRhKHBheWxvYWQ6YW55KXtcclxuICBsZXQgbW9kdWxlTmFtZSA9IHBheWxvYWRbJ21vZHVsZSddO1xyXG4gIGxldCBuYW1lID0gdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmdldFRlbXBOYW1lRnJvbVBheWxvYWQocGF5bG9hZCk7XHJcbiAgbGV0IHRlbXBsYXRlID0gdGhpcy5zdHJvYWdlU2VydmljZS5nZXRUZW1wbGF0ZShuYW1lLG1vZHVsZU5hbWUpO1xyXG4gIGlmKHRlbXBsYXRlKXtcclxuICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZVRlbXBEYXRhKFt0ZW1wbGF0ZV0pO1xyXG4gIH1lbHNle1xyXG4gICAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9DVVNUT01fVEVNUExBVEUnKTtcclxuICAgIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZVRlbXBEYXRhKHJlc3BEYXRhKTtcclxuICAgICAgICAgIGxldCBwcmVwYXJlZFRlbXBMaXN0ID0gdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLnByZXBhcmVUZW1wbGF0ZShyZXNwRGF0YSxtb2R1bGVOYW1lKTtcclxuICAgICAgICAgIHRoaXMuc3Ryb2FnZVNlcnZpY2Uuc3RvcmVBbGxUZW1wbGF0ZShwcmVwYXJlZFRlbXBMaXN0KVxyXG4gICAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgIClcclxuICB9XHJcbn1cclxucmVzZXRUZW1wRGF0YSgpe1xyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZVRlbXBEYXRhKFtdKVxyXG59XHJcbmRlbGV0ZUdyaWRSb3cocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdERUxFVEVfR1JJRF9ST1cnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkrICcvJyArIHBheWxvYWQuY3VyVGVtcCxwYXlsb2FkKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcG9uc2UpID0+IHtcclxuICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldERlbGV0ZUdyaWRSb3dSZXNwb25jZShyZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgKVxyXG59XHJcblxyXG5TYXZlRm9ybURhdGEocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdTQVZFX0ZPUk1fREFUQScpO1xyXG4gIHRoaXMuc2F2ZUNhbGwoYXBpKyAnLycgKyBwYXlsb2FkLmN1clRlbXAscGF5bG9hZClcclxufVxyXG5TZW5kRW1haWwocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdTRU5EX0VNQUlMJyk7XHJcbiAgdGhpcy5zYXZlQ2FsbChhcGkrICcvJyArIHBheWxvYWQuY3VyVGVtcCxwYXlsb2FkKVxyXG59XHJcbkR5bmFtaWNBcGlDYWxsKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEJhc2VVcmwoKTtcclxuICBsZXQgbGlzdCA9IHBheWxvYWQucGF0aC5zcGxpdChcIi9cIik7XHJcbiAgbGV0IGNhbGxOYW1lID0gbGlzdFtsaXN0Lmxlbmd0aC0xXTtcclxuICBzd2l0Y2goY2FsbE5hbWUpe1xyXG4gICAgY2FzZSBcImdzZFwiOlxyXG4gICAgICB0aGlzLmdldFN0YXRpRGF0YShwYXlsb2FkLmRhdGEpO1xyXG4gICAgYnJlYWs7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICB0aGlzLnNhdmVDYWxsKGFwaStwYXlsb2FkLnBhdGgscGF5bG9hZClcclxuICB9XHJcblxyXG59XHJcbnNhdmVDYWxsKGFwaTpzdHJpbmcscGF5bG9hZDphbnkpe1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0U2F2ZVJlc3BvbmNlKHJlc3BEYXRhKVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcblJlc2V0U2F2ZVJlc3BvbmNlKCl7XHJcbiAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldFNhdmVSZXNwb25jZSgnJylcclxufVxyXG5HZXRGaWx0ZXJHcmlkRGF0YShwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9HUklEX0RBVEEnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkgKyAnLycgKyBwYXlsb2FkLnBhdGgsIHBheWxvYWQuZGF0YSkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNoYXJlR3JpZERhdGEocmVzcERhdGEpXHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuR2V0VHlwZWFoZWFkRGF0YShwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9TVEFUSUNfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhOmFueSkgPT4ge1xyXG4gICAgICBsZXQgY3VycmVudHN0YXRpY0RhdGE6YW55PVtdO1xyXG4gICAgICBsZXQgcmVzdWx0ID1bXTtcclxuICAgICAgY3VycmVudHN0YXRpY0RhdGE9cmVzcERhdGFbJ3N1Y2Nlc3MnXTtcclxuICAgICAgaWYoY3VycmVudHN0YXRpY0RhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICByZXN1bHQgPSBjdXJyZW50c3RhdGljRGF0YVswXS5kYXRhXHJcbiAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldFR5cGVBaGVhZERhdGEocmVzdWx0KVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbmNsZWFyVHlwZWFoZWFkRGF0YSgpe1xyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRUeXBlQWhlYWREYXRhKFtdKVxyXG59XHJcbkdldEZvcm0ocGF5bG9hZDphbnkpe1xyXG4gIGxldCBlbmRQb2ludCA9ICcnO1xyXG4gIGlmKHRoaXMuZW52U2VydmljZS5nZXRSZXF1ZXN0VHlwZSgpID09ICdQVUJMSUMnKXtcclxuICAgIGVuZFBvaW50ID0gJ0dFVF9GT1JNX1BVQkxJQyc7XHJcbiAgfWVsc2V7XHJcbiAgICBlbmRQb2ludCA9ICdHRVRfRk9STSc7XHJcbiAgfVxyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKGVuZFBvaW50KTtcclxuICBpZihwYXlsb2FkLl9pZCAmJiBwYXlsb2FkLl9pZCAhPSB1bmRlZmluZWQgJiYgcGF5bG9hZC5faWQgIT0gbnVsbCAmJnBheWxvYWQuX2lkICE9ICcnKXtcclxuICAgICAgYXBpID0gYXBpICsgJy8nICsgcGF5bG9hZC5faWQ7XHJcbiAgfVxyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGE6YW55KSA9PiB7XHJcbiAgICAgIGxldCBkaW5hbWljRm9ybTtcclxuICAgICAgaWYocmVzcERhdGEgJiYgcmVzcERhdGFbJ3N1Y2Nlc3MnXSAhPSBudWxsKXtcclxuICAgICAgICAgIGNvbnN0IG9iamVjdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzcERhdGFbJ3N1Y2Nlc3MnXSkpO1xyXG4gICAgICAgICAgb2JqZWN0Wyd2aWV3X21vZGUnXSA9IFwiaW5saW5lRm9ybVZpZXdcIjtcclxuICAgICAgICAgIGRpbmFtaWNGb3JtID0ge1xyXG4gICAgICAgICAgICAgIERJTkFNSUNfRk9STSA6IG9iamVjdFxyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldEZvcm0oZGluYW1pY0Zvcm0pXHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuXHJcbkdldE5lc3RlZEZvcm0ocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfQ1VTVE9NX1RFTVBMQVRFJyk7XHJcbiAgdGhpcy5odHRwLnBvc3QoYXBpLCBwYXlsb2FkKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldE5lc3RlZEZvcm0ocmVzcERhdGFbMF0pO1xyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcblxyXG5HZXRIb3N0TmFtZShwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9HUklEX0RBVEEnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkgKyAnLycgKyBwYXlsb2FkLnBhdGgsIHBheWxvYWQuZGF0YSkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhOmFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRIb3N0RGF0YShyZXNwRGF0YVsnZGF0YSddKVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbkdldERhc2hsZXREYXRhKHBheWxvYWRzOmFueSl7XHJcbiAgLy90aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0RGFzaGxldERhdGEoe30pO1xyXG4gIGZyb20ocGF5bG9hZHMpXHJcbiAgLnBpcGUoXHJcbiAgICBtZXJnZU1hcCgocGF5bG9hZCk9PlxyXG4gICAgICB0aGlzLmRhc2hsZXREYXRhQ2FsbChwYXlsb2FkKSlcclxuICAgIClcclxuICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLlNldERhc2hsZXREYXRhKHJlcylcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKT0+e1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5kYXNobGV0RGF0YUNhbGwocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfREFTSExFVF9EQVRBJyk7XHJcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQuX2lkLCBwYXlsb2FkLmRhdGEpO1xyXG59XHJcblNldERhc2hsZXREYXRhKHJlc3BEYXRhOmFueSl7XHJcbiAgbGV0IGN1cnJlbnRTdGF0aWNEYXRhPVtdO1xyXG4gIGxldCBnZXREYXNobGV0RGF0YSA9IHRoaXMuZGF0YVNoYXJlU2VydmljZS5nZXREYXNobGV0RGF0YSgpO1xyXG4gIGNvbnN0IGRhc2hsZXREYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnZXREYXNobGV0RGF0YSkpO1xyXG4gIGN1cnJlbnRTdGF0aWNEYXRhLnB1c2gocmVzcERhdGEpO1xyXG4gIGlmKGN1cnJlbnRTdGF0aWNEYXRhLmxlbmd0aCA+IDApe1xyXG4gICAgICBjdXJyZW50U3RhdGljRGF0YS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgaWYoZWxlbWVudCAmJiBlbGVtZW50LmZpZWxkICE9IHVuZGVmaW5lZCAmJiBlbGVtZW50LmZpZWxkICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgIGRhc2hsZXREYXRhW2VsZW1lbnQuZmllbGRdID0gZWxlbWVudC5kYXRhXHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICB9XHJcbiAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldERhc2hsZXREYXRhKGRhc2hsZXREYXRhKTtcclxufVxyXG5cclxuR2V0RXhwb3J0RXhjbExpbmsocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdFWFBPUlRfR1JJRF9EQVRBJyk7XHJcbiAgdGhpcy5odHRwLnBvc3QoYXBpLCBwYXlsb2FkLmRhdGEsIHBheWxvYWQucmVzcG9uY2UpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRFeHBvcnRFeGNlbExpbmsocmVzcERhdGEpXHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuY2xvc2UoJ2Rvd25sb2FkLXByb2dyZXNzLW1vZGFsJyk7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbkdldEV4cG9ydENWU0xpbmsocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdDU1ZfRVhQT1JUX0dSSURfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZC5kYXRhLCBwYXlsb2FkLnJlc3BvbmNlKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0RXhwb3J0Q1ZTTGluayhyZXNwRGF0YSlcclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICB0aGlzLm1vZGFsU2VydmljZS5jbG9zZSgnZG93bmxvYWQtcHJvZ3Jlc3MtbW9kYWwnKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuXHJcbnJlc2V0R2V0RXhwb3J0RXhjbExpbmsoKXtcclxuICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0RXhwb3J0RXhjZWxMaW5rKCcnKTtcclxufVxyXG5HZXRQcm9kdWN0TGlzdChwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9QQVJBTUVURVJfTElTVCcpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldFByb2R1Y3RMaXN0KHJlc3BEYXRhKVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbkdldFByZXZpZXdIdG1sKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX1BSRVZJRVdfSFRNTCcpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQuX2lkLCBwYXlsb2FkLmRhdGEpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YTphbnkpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0UHJldmlld0h0bWwocmVzcERhdGFbJ3N1Y2Nlc3MnXSk7XHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxucmVzZXRQcmV2aWV3SHRtbCgpe1xyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRQcmV2aWV3SHRtbCgnJyk7XHJcbn1cclxuVXBkYXRlUHJvZHVjdEJyYW5jaChwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ1NBVkVfUEFSQU1FVEVSX0xJU1QnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkgKyAnLycgKyBwYXlsb2FkLl9pZCwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0VXBkYXRlUHJvZHVjdEJyYW5jaChyZXNwRGF0YSk7XHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuR2V0Sm9iU2NoZWR1bGVzKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0dSSURfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQuX2lkLCBwYXlsb2FkLmRhdGEpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRKb2JTY2hlZHVsZURhdGEocmVzcERhdGEpO1xyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbkdldFBkZkRhdGEocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfUERGJyk7XHJcbiAgdGhpcy5odHRwLnBvc3Q8SHR0cFJlc3BvbnNlPGFueT4+KGFwaSArICcvJyArIHBheWxvYWQuX2lkLCBwYXlsb2FkLmRhdGEsIHsgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIGFzICdqc29uJywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyBhcyAnYm9keScgfSkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgICAgdmFyIGNvbnRlbnREaXNwb3NpdGlvbjphbnkgPSByZXNwRGF0YS5oZWFkZXJzLmdldCgnQ29udGVudC1EaXNwb3NpdGlvbicpO1xyXG4gICAgICAgIHZhciBmaWxlbmFtZSA9IFwiXCI7XHJcbiAgICAgICAgbGV0IG1hdGNoZXMgPSAvZmlsZW5hbWU9XCIoLio/KVwiL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pO1xyXG4gICAgICAgIGlmIChtYXRjaGVzICE9IG51bGwgJiYgbWF0Y2hlc1sxXSkge1xyXG4gICAgICAgICAgICBmaWxlbmFtZSA9IG1hdGNoZXNbMV0ucmVwbGFjZSgvWydcIl0vZywgJycpO1xyXG4gICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5pbmRleE9mKFwiPVwiKSArIDEsIGZpbGVuYW1lLmxlbmd0aClcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldERvd25sb2FkUGRmRGF0YSh7IGRhdGE6IHJlc3BEYXRhLmJvZHksIGZpbGVuYW1lOiBmaWxlbmFtZSB9KTtcclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5SZXNldFBkZkRhdGEoKXtcclxuICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0RG93bmxvYWRQZGZEYXRhKCcnKTtcclxufVxyXG5HZXRGaWxlRGF0YShwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9GSUxFJyk7XHJcbiAgdGhpcy5odHRwLnBvc3Q8SHR0cFJlc3BvbnNlPGFueT4+KGFwaSArICcvJyArIHBheWxvYWQuX2lkLCBwYXlsb2FkLmRhdGEsIHsgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIGFzICdqc29uJywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyBhcyAnYm9keScgfSkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgICAgdmFyIGNvbnRlbnREaXNwb3NpdGlvbjphbnkgPSByZXNwRGF0YS5oZWFkZXJzLmdldCgnQ29udGVudC1EaXNwb3NpdGlvbicpO1xyXG4gICAgICAgIHZhciBmaWxlbmFtZSA9IFwiXCI7XHJcbiAgICAgICAgbGV0IG1hdGNoZXMgPSAvZmlsZW5hbWU9XCIoLio/KVwiL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pO1xyXG4gICAgICAgIGlmIChtYXRjaGVzICE9IG51bGwgJiYgbWF0Y2hlc1sxXSkge1xyXG4gICAgICAgICAgICBmaWxlbmFtZSA9IG1hdGNoZXNbMV0ucmVwbGFjZSgvWydcIl0vZywgJycpO1xyXG4gICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5pbmRleE9mKFwiPVwiKSArIDEsIGZpbGVuYW1lLmxlbmd0aClcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldEZpbGVEYXRhKHsgZGF0YTogcmVzcERhdGEuYm9keSwgZmlsZW5hbWU6IGZpbGVuYW1lIH0pO1xyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcblByaW50VGVtcGxhdGUocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfRklMRScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0PEh0dHBSZXNwb25zZTxhbnk+PihhcGkgKyAnLycgKyBwYXlsb2FkLl9pZCwgcGF5bG9hZC5kYXRhLCB7IHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyBhcyAnanNvbicsIG9ic2VydmU6ICdyZXNwb25zZScgYXMgJ2JvZHknIH0pLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICAgIHZhciBjb250ZW50RGlzcG9zaXRpb246YW55ID0gcmVzcERhdGEuaGVhZGVycy5nZXQoJ0NvbnRlbnQtRGlzcG9zaXRpb24nKTtcclxuICAgICAgICB2YXIgZmlsZW5hbWUgPSBcIlwiO1xyXG4gICAgICAgIGxldCBtYXRjaGVzID0gL2ZpbGVuYW1lPVwiKC4qPylcIi9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKTtcclxuICAgICAgICBpZiAobWF0Y2hlcyAhPSBudWxsICYmIG1hdGNoZXNbMV0pIHtcclxuICAgICAgICAgICAgZmlsZW5hbWUgPSBtYXRjaGVzWzFdLnJlcGxhY2UoL1snXCJdL2csICcnKTtcclxuICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoZmlsZW5hbWUuaW5kZXhPZihcIj1cIikgKyAxLCBmaWxlbmFtZS5sZW5ndGgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRQcmludFRlbXBsYXRlKHsgZGF0YTogcmVzcERhdGEuYm9keSwgZmlsZW5hbWU6IGZpbGVuYW1lIH0pO1xyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcblJlc2V0RmlsZURhdGEoKXtcclxuICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0RmlsZURhdGEoJycpO1xyXG59XHJcbkRvd25sb2FkRmlsZShwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0RPV05MT0FEX1BERicpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQucGF0aCwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldEZpbGVEb3dubG9hZFVybChyZXNwRGF0YVsnc3VjY2VzcyddKTtcclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5SZXNldERvd25sb2FkVXJsKCl7XHJcbiAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldEZpbGVEb3dubG9hZFVybCgnJyk7XHJcbn1cclxuRmlsZVVwbG9hZChwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9QREYnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkgKyAnLycgKyBwYXlsb2FkLl9pZCwgcGF5bG9hZC5kYXRhLCBwYXlsb2FkLnJlc3BvbmNlKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhyZXNwRGF0YSk7XHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuR2V0Q2hhcnREYXRhKHBheWxvYWQ6b2JqZWN0KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0NIQVJUX0RBVEEnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGksIHBheWxvYWQpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRDaGFydERhdGEocmVzcERhdGEpO1xyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbkdldFFyKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX1FSX0NPREUnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkgKyBwYXlsb2FkWydudW1iZXInXSwgcGF5bG9hZCx7cmVzcG9uc2VUeXBlOiAnYmxvYid9ICkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRGaWxlRGF0YSh7IGRhdGE6IHJlc3BEYXRhLCBmaWxlbmFtZTogXCJxci1cIitwYXlsb2FkWydmcm9tJ10rXCItXCIrKHBheWxvYWRbJ3RvJ10tMSkgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuXHJcbmdldEF1ZGl0VmVyc2lvbkxpc3QocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdBVURJVF9WRVJTSU9OX0xJU1QnKTtcclxuICB0aGlzLmh0dHAuZ2V0KGFwaSArXCIvXCIrIHBheWxvYWQpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0QXVkaXRWZXJzaW9uTGlzdChyZXNwRGF0YSk7XHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuXHJcbmdldEF1ZGl0SGlzdG9yeShwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0FVRElUX0hJU1RPUlknKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkgK1wiL1wiKyBwYXlsb2FkWydwYXRoJ10sIHBheWxvYWQuZGF0YSkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRBdWRpdEhpc3RvcnlEYXRhKHJlc3BEYXRhKTtcclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5cclxuZ2V0QXBsaWNhdGlvbnNUaGVtZVNldHRpbmcocGF5bG9hZDpvYmplY3QpIHtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0NVU1RPTV9URU1QTEFURScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgIGlmKEpTT04uc3RyaW5naWZ5KHJlc3BEYXRhKSAhPSBcInt9XCIpe1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRUaGVtZVNldHRpbmcocmVzcERhdGEpXHJcbiAgICAgIH1cclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5nZXRBcGxpY2F0aW9uc1NldHRpbmcocGF5bG9hZDpvYmplY3QpIHtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0NVU1RPTV9URU1QTEFURScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgIGlmKEpTT04uc3RyaW5naWZ5KHJlc3BEYXRhKSAhPSBcInt9XCIpe1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRBcHBsaWNhdGlvblNldHRpbmcocmVzcERhdGEpXHJcbiAgICAgIH1cclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5maWVsZERpbmFtaWNBcGkoYXBpOmFueSxwYXlsb2FkOm9iamVjdCl7XHJcbiAgY29uc3QgaG9zdCA9IHRoaXMuZW52U2VydmljZS5nZXRCYXNlVXJsKCk7XHJcbiAgdGhpcy5odHRwLnBvc3QoaG9zdCthcGksIHBheWxvYWQpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0RmllbGREaW5hbWljQXBpUmVzcG9uY2UocmVzcERhdGEpXHJcbiAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcblxyXG5nZXROZXh0Rm9ybURhdGEocGF5bG9hZDphbnkpIHtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0dSSURfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQucGF0aCwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgaWYoSlNPTi5zdHJpbmdpZnkocmVzcERhdGEpICE9IFwie31cIil7XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldE5leHRGb3JtRGF0YShyZXNwRGF0YSlcclxuICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcblxyXG5cclxuZ2l0VmVyc2lvbihwYXlsb2FkOnN0cmluZykge1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHSVRfVkVSU0lPTicpO1xyXG4gIHRoaXMuaHR0cC5nZXQ8YW55PihhcGkpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0R2l0VmVyc2lvbihyZXNwRGF0YSk7XHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuXHJcblxyXG5nZXRSZXBvcnRMb2FkR3JpZERhdGEocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfR1JJRF9EQVRBJyk7XHJcbiAgdGhpcy5odHRwLnBvc3QoYXBpICsgJy8nICsgcGF5bG9hZC5wYXRoLCBwYXlsb2FkLmRhdGEpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRSZXBvcnRMb2FkR3JpZERhdGEocmVzcERhdGEpXHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuXHJcblxyXG5nZXRGYXZvdXJpdGVEYXRhKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0dSSURfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQucGF0aCwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgaWYocmVzcERhdGEgJiYgcmVzcERhdGFbJ2RhdGEnXSAmJiByZXNwRGF0YVsnZGF0YSddLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgY29uc3QgdXNlclByZWZlcmVuY2UgPSByZXNwRGF0YVsnZGF0YSddWzBdO1xyXG4gICAgICAgICAgdGhpcy5zdHJvYWdlU2VydmljZS5zZXRVc2VyUHJlZmVyZW5jZSh1c2VyUHJlZmVyZW5jZSk7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0VXNlclByZWZlcmVuY2UodXNlclByZWZlcmVuY2UpO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldFVzZXJQcmVmZXJlbmNlKHJlc3BEYXRhWydkYXRhJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5cclxuZ2V0VXNlck5vdGlmaWNhdGlvbihwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9HUklEX0RBVEEnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkgKyAnLycgKyBwYXlsb2FkLnBhdGgsIHBheWxvYWQuZGF0YSkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNoYXJlVXNlck5vdGlmaWNhdGlvbihyZXNwRGF0YSlcclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5cclxuZ2V0VXNlck5vdGlmaWNhdGlvblNldHRpbmcoKXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX05PVElGSUNBVElPTl9TRVRUSU5HJyk7XHJcbiAgdGhpcy5odHRwLnBvc3QoYXBpLHt9KS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2hhcmVVc2VyTm90aWZpY2F0aW9uU2V0dGluZyhyZXNwRGF0YSlcclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5yZXNldFVzZXJOb3RpZmljYXRpb24oKXtcclxuICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2hhcmVVc2VyTm90aWZpY2F0aW9uKFtdKVxyXG59XHJcblxyXG5nZXREb3dubG9hZE1hbnVhbChwYXlsb2FkOm9iamVjdCl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0RPV05MT0FEX01BTlVBTCcpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSxwYXlsb2FkKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGE6YW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHVybD0gcmVzcERhdGEuZmlsZVVybDtcclxuICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNoYXJlUHVibGljVXJsRnJvbVMzKHVybCk7XHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuZ2V0R3JpZFJ1bm5pbmdEYXRhKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0dSSURfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQucGF0aCwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2hhcmVHcmlkUnVubmluZ0RhdGEocmVzcERhdGEpO1xyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbiAgLy8gRm9yIGFwcFxyXG4gIGdldERhdGFieUNvbGxlY3Rpb25OYW1lKHBheWxvYWQ6YW55KXtcclxuICAgIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfR1JJRF9EQVRBJyk7XHJcbiAgICB0aGlzLmh0dHAucG9zdChhcGkgKyAnLycgKyBwYXlsb2FkLnBhdGgsIHBheWxvYWQuZGF0YSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5jb2xsZWN0aW9uRGF0YShyZXNwRGF0YSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxuICBHZXRDaGlsZEdyaWQocGF5bG9hZDphbnkpe1xyXG4gICAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9DVVNUT01fVEVNUExBVEUnKTtcclxuICAgIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcERhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0Q2hpbGRHcmlkKHJlc3BEYXRhWzBdKTtcclxuICAgICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG4gIC8vRW5kIEZvciBhcHAgZnVuY3Rpb25zXHJcblxyXG5cclxufVxyXG4iXX0=
|