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,558 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../storage/storage.service";
|
|
4
|
+
import * as i2 from "../permission/permission.service";
|
|
5
|
+
import * as i3 from "../common-utils/common-function.service";
|
|
6
|
+
import * as i4 from "../data-share/data-share.service";
|
|
7
|
+
import * as i5 from "../api/api.service";
|
|
8
|
+
import * as i6 from "@angular/router";
|
|
9
|
+
import * as i7 from "../data-share/common-app-data-share/common-app-data-share.service";
|
|
10
|
+
import * as i8 from "../userPrefrence/user-prefrence.service";
|
|
11
|
+
import * as i9 from "../common-utils/core-function/core-function.service";
|
|
12
|
+
export class MenuOrModuleCommonService {
|
|
13
|
+
constructor(storageService, permissionService, commonFunctionService, dataShareService, apiService, router, commonAppDataShareService, userPrefrenceService, coreFunctionService) {
|
|
14
|
+
this.storageService = storageService;
|
|
15
|
+
this.permissionService = permissionService;
|
|
16
|
+
this.commonFunctionService = commonFunctionService;
|
|
17
|
+
this.dataShareService = dataShareService;
|
|
18
|
+
this.apiService = apiService;
|
|
19
|
+
this.router = router;
|
|
20
|
+
this.commonAppDataShareService = commonAppDataShareService;
|
|
21
|
+
this.userPrefrenceService = userPrefrenceService;
|
|
22
|
+
this.coreFunctionService = coreFunctionService;
|
|
23
|
+
this.getMenuList = (menus) => {
|
|
24
|
+
let menuList = [];
|
|
25
|
+
if (menus) {
|
|
26
|
+
Object.entries(menus).forEach(([menuKey, menu]) => {
|
|
27
|
+
let menuObj = { keyName: menuKey };
|
|
28
|
+
if (menu.reference) {
|
|
29
|
+
menuObj = { ...menuObj, ...menu.reference };
|
|
30
|
+
}
|
|
31
|
+
menuObj.submenu = this.getMenuList(menu.submenus);
|
|
32
|
+
if (!menuObj?.submenu) {
|
|
33
|
+
menuObj.templateTabs = this.getTabList(menu.templateTabs);
|
|
34
|
+
}
|
|
35
|
+
menuList.push(menuObj);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return menuList.length > 0 ? this.coreFunctionService.sortMenu(menuList) : null;
|
|
39
|
+
};
|
|
40
|
+
this.getTabList = (tabs) => {
|
|
41
|
+
let tabList = [];
|
|
42
|
+
if (tabs) {
|
|
43
|
+
Object.entries(tabs).forEach(([tabKey, tab]) => {
|
|
44
|
+
let tabObj = { keyName: tabKey };
|
|
45
|
+
if (tab.reference) {
|
|
46
|
+
tabObj = { ...tabObj, ...tab.reference };
|
|
47
|
+
}
|
|
48
|
+
tabObj.email = tab.activeAlerts?.includes("EMAIL") || false;
|
|
49
|
+
tabObj.whatsapp = tab.activeAlerts?.includes("WHATSAPP") || false;
|
|
50
|
+
tabObj.sms = tab.activeAlerts?.includes("SMS") || false;
|
|
51
|
+
tabList.push(tabObj);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return tabList;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// modifyModuleListWithPermission(moduleList:any){
|
|
58
|
+
// let modifyModuleList:any = [];
|
|
59
|
+
// if(moduleList && moduleList.length > 0){
|
|
60
|
+
// moduleList.forEach((module:any) => {
|
|
61
|
+
// if(module && module.menu_list && module.menu_list.length > 0){
|
|
62
|
+
// let menuList = module.menu_list;
|
|
63
|
+
// module.menu_list = this.setDisplayInMenuWithPermission(menuList);
|
|
64
|
+
// if(this.setDisplayInModuleWithPermission(module.menu_list)){
|
|
65
|
+
// module['display'] = true;
|
|
66
|
+
// }else{
|
|
67
|
+
// module['display'] = false;
|
|
68
|
+
// }
|
|
69
|
+
// modifyModuleList.push(module);
|
|
70
|
+
// }else{
|
|
71
|
+
// modifyModuleList.push(module);
|
|
72
|
+
// }
|
|
73
|
+
// });
|
|
74
|
+
// }
|
|
75
|
+
// return modifyModuleList;
|
|
76
|
+
// }
|
|
77
|
+
getDefaultMenuIndex(menuList) {
|
|
78
|
+
let defaultmenuIndex = 0;
|
|
79
|
+
let defaultSubmenuIndex = -1;
|
|
80
|
+
let defaultIndexs = {
|
|
81
|
+
'defaultmenuIndex': defaultmenuIndex,
|
|
82
|
+
'defaultSubmenuIndex': defaultSubmenuIndex
|
|
83
|
+
};
|
|
84
|
+
if (menuList && menuList.length > 0) {
|
|
85
|
+
defaultmenuIndex = this.getDefaultIndex(menuList);
|
|
86
|
+
const defaultMenu = menuList[defaultmenuIndex];
|
|
87
|
+
if (defaultMenu.submenu && defaultMenu.submenu.length > 0) {
|
|
88
|
+
defaultSubmenuIndex = this.getDefaultIndex(defaultMenu.submenu);
|
|
89
|
+
if (defaultSubmenuIndex == -1) {
|
|
90
|
+
defaultSubmenuIndex = 0;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
defaultIndexs.defaultmenuIndex = defaultmenuIndex;
|
|
95
|
+
defaultIndexs.defaultSubmenuIndex = defaultSubmenuIndex;
|
|
96
|
+
return defaultIndexs;
|
|
97
|
+
}
|
|
98
|
+
getDefaultIndex(menuList) {
|
|
99
|
+
let defaultmenuIndex = 0;
|
|
100
|
+
if (menuList && menuList.length > 0) {
|
|
101
|
+
for (let index = 0; index < menuList.length; index++) {
|
|
102
|
+
if (menuList[index].defaultMenu) {
|
|
103
|
+
defaultmenuIndex = index;
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return defaultmenuIndex;
|
|
109
|
+
}
|
|
110
|
+
// setDisplayInMenuWithPermission(menuList:any){
|
|
111
|
+
// let modifyMenuList = [];
|
|
112
|
+
// if(menuList && menuList.length > 0){
|
|
113
|
+
// for (let index = 0; index < menuList.length; index++) {
|
|
114
|
+
// const menu = menuList[index];
|
|
115
|
+
// if(menu.submenu && menu.submenu != null){
|
|
116
|
+
// let modifySubMenuList = [];
|
|
117
|
+
// let check = 0;
|
|
118
|
+
// for (let j = 0; j < menu.submenu.length; j++) {
|
|
119
|
+
// const submenu = menu.submenu[j];
|
|
120
|
+
// if(!this.checkPermission(submenu)){
|
|
121
|
+
// submenu['display'] = true;
|
|
122
|
+
// modifySubMenuList.push(submenu);
|
|
123
|
+
// check = 1;
|
|
124
|
+
// }else{
|
|
125
|
+
// submenu['display'] = false;
|
|
126
|
+
// modifySubMenuList.push(submenu);
|
|
127
|
+
// }
|
|
128
|
+
// }
|
|
129
|
+
// if(check == 1){
|
|
130
|
+
// menu['display'] = true;
|
|
131
|
+
// }else{
|
|
132
|
+
// menu['display'] = false;
|
|
133
|
+
// }
|
|
134
|
+
// menu.submenu = modifySubMenuList;
|
|
135
|
+
// modifyMenuList.push(menu);
|
|
136
|
+
// }else{
|
|
137
|
+
// if(!this.checkPermission(menu)){
|
|
138
|
+
// menu['display'] = true;
|
|
139
|
+
// modifyMenuList.push(menu);
|
|
140
|
+
// }else{
|
|
141
|
+
// menu['display'] = false;
|
|
142
|
+
// modifyMenuList.push(menu);
|
|
143
|
+
// }
|
|
144
|
+
// }
|
|
145
|
+
// }
|
|
146
|
+
// }
|
|
147
|
+
// return modifyMenuList;
|
|
148
|
+
// }
|
|
149
|
+
// setDisplayInModuleWithPermission(menuList:any){
|
|
150
|
+
// let check = false;
|
|
151
|
+
// if(menuList && menuList.length > 0){
|
|
152
|
+
// for (let index = 0; index < menuList.length; index++) {
|
|
153
|
+
// const menu = menuList[index];
|
|
154
|
+
// if(menu.submenu && menu.submenu != null){
|
|
155
|
+
// for (let j = 0; j < menu.submenu.length; j++) {
|
|
156
|
+
// const submenu = menu.submenu[j];
|
|
157
|
+
// if(submenu.display){
|
|
158
|
+
// check = true;
|
|
159
|
+
// break;
|
|
160
|
+
// }
|
|
161
|
+
// }
|
|
162
|
+
// }else{
|
|
163
|
+
// if(menu.display){
|
|
164
|
+
// check = true;
|
|
165
|
+
// break;
|
|
166
|
+
// }
|
|
167
|
+
// }
|
|
168
|
+
// }
|
|
169
|
+
// }
|
|
170
|
+
// return check;
|
|
171
|
+
// }
|
|
172
|
+
getDefaultMenu(menuList) {
|
|
173
|
+
let menu = {};
|
|
174
|
+
let defaultMenu = {};
|
|
175
|
+
let defaultMenuIndexs = this.getDefaultMenuIndex(menuList);
|
|
176
|
+
menu['indexs'] = defaultMenuIndexs;
|
|
177
|
+
if (defaultMenuIndexs.defaultSubmenuIndex > -1) {
|
|
178
|
+
defaultMenu = menuList[defaultMenuIndexs.defaultmenuIndex].submenu[defaultMenuIndexs.defaultSubmenuIndex];
|
|
179
|
+
defaultMenu['child'] = true;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
defaultMenu = menuList[defaultMenuIndexs.defaultmenuIndex];
|
|
183
|
+
defaultMenu['child'] = false;
|
|
184
|
+
}
|
|
185
|
+
defaultMenu['menuIndex'] = defaultMenuIndexs.defaultmenuIndex;
|
|
186
|
+
menu['menu'] = defaultMenu;
|
|
187
|
+
// if(defaultMenu.display){
|
|
188
|
+
// }else{
|
|
189
|
+
// menu['menu'] = this.findMenuWithPermission(menuList);
|
|
190
|
+
// }
|
|
191
|
+
return menu;
|
|
192
|
+
}
|
|
193
|
+
// findMenuWithPermission(menuList:any){
|
|
194
|
+
// let modifyMenu = {};
|
|
195
|
+
// if(menuList && menuList.length > 0){
|
|
196
|
+
// for (let index = 0; index < menuList.length; index++) {
|
|
197
|
+
// const menu = menuList[index];
|
|
198
|
+
// if(menu.display && menu.submenu && menu.submenu != null){
|
|
199
|
+
// for (let j = 0; j < menu.submenu.length; j++) {
|
|
200
|
+
// const submenu = menu.submenu[j];
|
|
201
|
+
// if(submenu.display){
|
|
202
|
+
// modifyMenu = submenu;
|
|
203
|
+
// break;
|
|
204
|
+
// }
|
|
205
|
+
// }
|
|
206
|
+
// }else{
|
|
207
|
+
// if(menu.display){
|
|
208
|
+
// modifyMenu = menu;
|
|
209
|
+
// break;
|
|
210
|
+
// }
|
|
211
|
+
// }
|
|
212
|
+
// }
|
|
213
|
+
// }
|
|
214
|
+
// return modifyMenu;
|
|
215
|
+
// }
|
|
216
|
+
setModuleName(moduleName) {
|
|
217
|
+
this.storageService.setModule(moduleName);
|
|
218
|
+
}
|
|
219
|
+
getModuleIndexById(moduleId) {
|
|
220
|
+
let moduleList = this.storageService.GetModules();
|
|
221
|
+
return this.commonFunctionService.getIndexInArrayById(moduleList, moduleId);
|
|
222
|
+
}
|
|
223
|
+
shareMenuIndex(menuIndex, subMenuIndex, moduleIndex) {
|
|
224
|
+
let indexs = {};
|
|
225
|
+
indexs['menuIndex'] = menuIndex;
|
|
226
|
+
indexs['submenuIndex'] = subMenuIndex;
|
|
227
|
+
indexs['moduleIndex'] = moduleIndex;
|
|
228
|
+
this.dataShareService.setMenuIndexs(indexs);
|
|
229
|
+
}
|
|
230
|
+
getIndexsByMenuName(menuList, menuName) {
|
|
231
|
+
let indexs = {
|
|
232
|
+
'menuindex': -1,
|
|
233
|
+
'submenuindex': -1
|
|
234
|
+
};
|
|
235
|
+
for (let index = 0; index < menuList.length; index++) {
|
|
236
|
+
const menu = menuList[index];
|
|
237
|
+
if (!menu.submenu && menu.name == menuName) {
|
|
238
|
+
indexs.menuindex = index;
|
|
239
|
+
indexs.submenuindex = -1;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
if (menu.submenu && menu.submenu.length > 0) {
|
|
243
|
+
for (let j = 0; j < menu.submenu.length; j++) {
|
|
244
|
+
const subMenu = menu.submenu[j];
|
|
245
|
+
if (subMenu.name == menuName) {
|
|
246
|
+
indexs.menuindex = index;
|
|
247
|
+
indexs.submenuindex = j;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return indexs;
|
|
254
|
+
}
|
|
255
|
+
getMenuNameById(module, menuId, submenuId, key) {
|
|
256
|
+
let menuName = {};
|
|
257
|
+
let menuList = module.menu_list;
|
|
258
|
+
let menuIndex = this.commonFunctionService.getIndexInArrayById(menuList, menuId, key);
|
|
259
|
+
menuName['menuIndex'] = menuIndex;
|
|
260
|
+
let menu = menuList[menuIndex];
|
|
261
|
+
if (submenuId != "") {
|
|
262
|
+
if (menu.submenu) {
|
|
263
|
+
let subMenuList = menu.submenu;
|
|
264
|
+
if (subMenuList && subMenuList.length > 0) {
|
|
265
|
+
let subMenuIndex = this.commonFunctionService.getIndexInArrayById(subMenuList, submenuId, key);
|
|
266
|
+
menuName['subMenuIndex'] = subMenuIndex;
|
|
267
|
+
let submenu = subMenuList[subMenuIndex];
|
|
268
|
+
menuName['name'] = submenu.name;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
menuName['name'] = menu.name;
|
|
274
|
+
}
|
|
275
|
+
return menuName;
|
|
276
|
+
}
|
|
277
|
+
// checkPermission(menu:any){
|
|
278
|
+
// return !this.permissionService.checkPermission(menu.name, 'view')
|
|
279
|
+
// }
|
|
280
|
+
getTemplateData(module, submenu) {
|
|
281
|
+
if (submenu && submenu.name) {
|
|
282
|
+
this.storageService.SetActiveMenu(submenu);
|
|
283
|
+
if (submenu.label == "Navigation") {
|
|
284
|
+
this.router.navigate(['Navigation']);
|
|
285
|
+
}
|
|
286
|
+
else if (submenu.label == "Permissions") {
|
|
287
|
+
this.router.navigate(['permissions']);
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
const menu = submenu;
|
|
291
|
+
if (menu.name == "document_library") {
|
|
292
|
+
this.router.navigate(['vdr']);
|
|
293
|
+
}
|
|
294
|
+
else if (menu.name == "report") {
|
|
295
|
+
this.router.navigate(['report']);
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
this.apiService.resetTempData();
|
|
299
|
+
this.apiService.resetGridData();
|
|
300
|
+
this.GoToSelectedModule(module);
|
|
301
|
+
const route = 'browse/' + module.name + "/" + submenu.name;
|
|
302
|
+
//console.log(route);
|
|
303
|
+
this.router.navigate([route]);
|
|
304
|
+
//this.router.navigate(['template']);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
this.permissionService.checkTokenStatusForPermission();
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
GoToSelectedModule(item) {
|
|
313
|
+
if (item && item.name) {
|
|
314
|
+
this.setModuleName(item.name);
|
|
315
|
+
}
|
|
316
|
+
this.dataShareService.sendCurrentPage('DASHBOARD');
|
|
317
|
+
}
|
|
318
|
+
goToMOdule() {
|
|
319
|
+
this.dataShareService.sendCurrentPage('MODULE');
|
|
320
|
+
this.dataShareService.resetHeaderMenu([]);
|
|
321
|
+
this.dataShareService.setModuleIndex(-1);
|
|
322
|
+
this.dataShareService.setMenuIndexs({ menuIndex: -1, submenuIndex: -1 });
|
|
323
|
+
const menuType = this.storageService.GetMenuType();
|
|
324
|
+
if (menuType == 'Horizontal') {
|
|
325
|
+
this.router.navigate(['/home']);
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
this.router.navigate(['/dashboard']);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
viewPermissionInTabs(tabs) {
|
|
332
|
+
tabs.forEach((tab) => {
|
|
333
|
+
let tab_name = tab.tab_name;
|
|
334
|
+
let check = this.permissionService.checkPermission(tab_name, 'view');
|
|
335
|
+
tab['display'] = check;
|
|
336
|
+
tab['febMenu'] = this.checkFebMenuAddOrNot(tab, '');
|
|
337
|
+
});
|
|
338
|
+
return tabs;
|
|
339
|
+
}
|
|
340
|
+
addPermissionInTab(tab) {
|
|
341
|
+
if (tab && tab.tab_name) {
|
|
342
|
+
let name = tab.tab_name;
|
|
343
|
+
let check = this.permissionService.checkPermission(name, 'add');
|
|
344
|
+
tab['addForm'] = check;
|
|
345
|
+
}
|
|
346
|
+
return tab;
|
|
347
|
+
}
|
|
348
|
+
checkFebMenuAddOrNot(tab, parent) {
|
|
349
|
+
let tabId = tab._id;
|
|
350
|
+
if (parent != '') {
|
|
351
|
+
tabId = parent._id;
|
|
352
|
+
}
|
|
353
|
+
let userFebTab = this.userPrefrenceService.getUserPreferenceByFieldName('favoriteTabs');
|
|
354
|
+
if (userFebTab && userFebTab != null && userFebTab.length > 0) {
|
|
355
|
+
let match = -1;
|
|
356
|
+
for (let index = 0; index < userFebTab.length; index++) {
|
|
357
|
+
const element = userFebTab[index];
|
|
358
|
+
if (element._id == tabId) {
|
|
359
|
+
match = index;
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (match > -1) {
|
|
364
|
+
if (parent != '') {
|
|
365
|
+
const submenu = userFebTab[match]['tab'];
|
|
366
|
+
let subMatchIndex = -1;
|
|
367
|
+
if (submenu && submenu.length > 0) {
|
|
368
|
+
for (let j = 0; j < submenu.length; j++) {
|
|
369
|
+
const subMenu = submenu[j];
|
|
370
|
+
if (subMenu._id == tab._id) {
|
|
371
|
+
subMatchIndex = j;
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
if (subMatchIndex > -1) {
|
|
377
|
+
return true;
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
return false;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
return true;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
return false;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
return false;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// for App
|
|
396
|
+
getModuleBySelectedIndex() {
|
|
397
|
+
const moduleList = this.commonAppDataShareService.getModuleList();
|
|
398
|
+
const clickedModuleIndex = this.commonAppDataShareService.getModuleIndex();
|
|
399
|
+
let module = {};
|
|
400
|
+
if (clickedModuleIndex >= 0) {
|
|
401
|
+
module = moduleList[clickedModuleIndex];
|
|
402
|
+
}
|
|
403
|
+
return module;
|
|
404
|
+
}
|
|
405
|
+
getCard(index) {
|
|
406
|
+
const moduleList = this.commonAppDataShareService.getModuleList();
|
|
407
|
+
const clickedModuleIndex = this.commonAppDataShareService.getModuleIndex();
|
|
408
|
+
let card = {};
|
|
409
|
+
let tabs = [];
|
|
410
|
+
let selectedTabIndex = -1;
|
|
411
|
+
let popoverTabbing = false;
|
|
412
|
+
if (clickedModuleIndex >= 0) {
|
|
413
|
+
card = moduleList[clickedModuleIndex];
|
|
414
|
+
}
|
|
415
|
+
if (card && card.tab_menu && card.tab_menu.length > 0 && card.popoverTabbing) {
|
|
416
|
+
popoverTabbing = true;
|
|
417
|
+
}
|
|
418
|
+
if (card && card.tab_menu && card.tab_menu.length > 0) {
|
|
419
|
+
const clickedtabIndex = this.commonAppDataShareService.getSelectdTabIndex();
|
|
420
|
+
tabs = card.tab_menu;
|
|
421
|
+
let tab = {};
|
|
422
|
+
if (index == -1) {
|
|
423
|
+
tab = tabs[0];
|
|
424
|
+
selectedTabIndex = 0;
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
tab = tabs[clickedtabIndex];
|
|
428
|
+
selectedTabIndex = clickedtabIndex;
|
|
429
|
+
}
|
|
430
|
+
const tabIndex = this.commonFunctionService.getIndexInArrayById(moduleList, tab._id, "_id");
|
|
431
|
+
card = moduleList[tabIndex];
|
|
432
|
+
}
|
|
433
|
+
let object = {
|
|
434
|
+
'tabs': tabs,
|
|
435
|
+
"card": card,
|
|
436
|
+
"selectedTabIndex": selectedTabIndex,
|
|
437
|
+
"popoverTabbing": popoverTabbing
|
|
438
|
+
};
|
|
439
|
+
return object;
|
|
440
|
+
}
|
|
441
|
+
getUserAutherisedCards(cardMasterList) {
|
|
442
|
+
const userAuthModules = this.storageService.GetModules();
|
|
443
|
+
const cardList = [];
|
|
444
|
+
if (userAuthModules && userAuthModules != null) {
|
|
445
|
+
userAuthModules.forEach((module, i) => {
|
|
446
|
+
if (module && module['_id']) {
|
|
447
|
+
cardMasterList.forEach((card, j) => {
|
|
448
|
+
if (card && card.userAutherisedModule && card['userAutherisedModule']['_id']) {
|
|
449
|
+
if (module['_id'] == card['userAutherisedModule']['_id']) {
|
|
450
|
+
cardList.push(card);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
return cardList;
|
|
457
|
+
}
|
|
458
|
+
return null;
|
|
459
|
+
}
|
|
460
|
+
getNestedCard(cardGrid, cardGridName) {
|
|
461
|
+
if (cardGrid[cardGridName] && cardGrid[cardGridName] != undefined && cardGrid[cardGridName] != null && cardGrid[cardGridName] != '') {
|
|
462
|
+
return JSON.parse(JSON.stringify(cardGrid[cardGridName]));
|
|
463
|
+
}
|
|
464
|
+
else {
|
|
465
|
+
return {};
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
getModulesFromObject(obj) {
|
|
469
|
+
let modules = [];
|
|
470
|
+
const processModule = (moduleKey, module) => {
|
|
471
|
+
let moduleObj = { keyName: moduleKey };
|
|
472
|
+
if (module.reference) {
|
|
473
|
+
moduleObj = { ...moduleObj, ...module.reference };
|
|
474
|
+
}
|
|
475
|
+
moduleObj.notification = module.notification || false;
|
|
476
|
+
moduleObj.menu_list = this.getMenuList(module.menus);
|
|
477
|
+
modules.push(moduleObj);
|
|
478
|
+
};
|
|
479
|
+
if (obj.notifications) {
|
|
480
|
+
obj = obj.notifications;
|
|
481
|
+
if (obj && Object.keys(obj).length > 0) {
|
|
482
|
+
Object.entries(obj).forEach(([moduleKey, module]) => {
|
|
483
|
+
processModule(moduleKey, module);
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
return modules;
|
|
488
|
+
}
|
|
489
|
+
getMenuDetails(module) {
|
|
490
|
+
let obj = {};
|
|
491
|
+
if (module) {
|
|
492
|
+
module.forEach((menu) => {
|
|
493
|
+
let menuName = menu?.keyName;
|
|
494
|
+
let menuDetails = {};
|
|
495
|
+
let reference = {
|
|
496
|
+
name: menu?.name,
|
|
497
|
+
_id: menu?._id
|
|
498
|
+
};
|
|
499
|
+
if (menu) {
|
|
500
|
+
if (menu?.templateTabs) {
|
|
501
|
+
menuDetails = {
|
|
502
|
+
reference,
|
|
503
|
+
templateTabs: this.getTempDetails(menu.templateTabs)
|
|
504
|
+
};
|
|
505
|
+
obj[menuName] = menuDetails;
|
|
506
|
+
}
|
|
507
|
+
else if (menu?.submenu) {
|
|
508
|
+
menuDetails = {
|
|
509
|
+
reference,
|
|
510
|
+
submenus: this.getMenuDetails(menu.submenu)
|
|
511
|
+
};
|
|
512
|
+
obj[menuName] = menuDetails;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
});
|
|
516
|
+
return obj;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
getTempDetails(tabs) {
|
|
520
|
+
let obj = {};
|
|
521
|
+
tabs.forEach((tab) => {
|
|
522
|
+
if (tab) {
|
|
523
|
+
let tabName = tab?.keyName;
|
|
524
|
+
let tabDetails = {
|
|
525
|
+
reference: {
|
|
526
|
+
name: tab?.name,
|
|
527
|
+
_id: tab?._id
|
|
528
|
+
},
|
|
529
|
+
activeAlerts: this.getActiveAlerts(tab)
|
|
530
|
+
};
|
|
531
|
+
obj[tabName] = tabDetails;
|
|
532
|
+
}
|
|
533
|
+
});
|
|
534
|
+
return obj;
|
|
535
|
+
}
|
|
536
|
+
getActiveAlerts(tab) {
|
|
537
|
+
let arr = [];
|
|
538
|
+
if (tab?.email) {
|
|
539
|
+
arr.push('EMAIL');
|
|
540
|
+
}
|
|
541
|
+
if (tab?.whatsapp) {
|
|
542
|
+
arr.push('WHATSAPP');
|
|
543
|
+
}
|
|
544
|
+
if (tab?.sms) {
|
|
545
|
+
arr.push('SMS');
|
|
546
|
+
}
|
|
547
|
+
return arr;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
MenuOrModuleCommonService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MenuOrModuleCommonService, deps: [{ token: i1.StorageService }, { token: i2.PermissionService }, { token: i3.CommonFunctionService }, { token: i4.DataShareService }, { token: i5.ApiService }, { token: i6.Router }, { token: i7.CommonAppDataShareService }, { token: i8.UserPrefrenceService }, { token: i9.CoreFunctionService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
551
|
+
MenuOrModuleCommonService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MenuOrModuleCommonService, providedIn: 'root' });
|
|
552
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MenuOrModuleCommonService, decorators: [{
|
|
553
|
+
type: Injectable,
|
|
554
|
+
args: [{
|
|
555
|
+
providedIn: 'root'
|
|
556
|
+
}]
|
|
557
|
+
}], ctorParameters: function () { return [{ type: i1.StorageService }, { type: i2.PermissionService }, { type: i3.CommonFunctionService }, { type: i4.DataShareService }, { type: i5.ApiService }, { type: i6.Router }, { type: i7.CommonAppDataShareService }, { type: i8.UserPrefrenceService }, { type: i9.CoreFunctionService }]; } });
|
|
558
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1vci1tb2R1bGUtY29tbW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtY29yZS9zcmMvbGliL3NlcnZpY2VzL21lbnUtb3ItbW9kdWxlLWNvbW1vbi9tZW51LW9yLW1vZHVsZS1jb21tb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7OztBQWEzQyxNQUFNLE9BQU8seUJBQXlCO0lBRXRDLFlBQ1UsY0FBOEIsRUFDOUIsaUJBQW1DLEVBQ25DLHFCQUEyQyxFQUMzQyxnQkFBaUMsRUFDakMsVUFBcUIsRUFDckIsTUFBYSxFQUNiLHlCQUFvRCxFQUNwRCxvQkFBMEMsRUFDMUMsbUJBQXdDO1FBUnhDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ25DLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBc0I7UUFDM0MscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUNqQyxlQUFVLEdBQVYsVUFBVSxDQUFXO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQU87UUFDYiw4QkFBeUIsR0FBekIseUJBQXlCLENBQTJCO1FBQ3BELHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQWliaEQsZ0JBQVcsR0FBRyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQzNCLElBQUksUUFBUSxHQUFVLEVBQUUsQ0FBQztZQUN6QixJQUFJLEtBQUssRUFBRTtnQkFDVCxNQUFNLENBQUMsT0FBTyxDQUFNLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7b0JBQ3JELElBQUksT0FBTyxHQUFRLEVBQUUsT0FBTyxFQUFFLE9B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Q0FBQzs7dUhBM2hCWSx5QkFBeUI7MkhBQXpCLHlCQUF5QixjQUZ4QixNQUFNOzRGQUVQLHlCQUF5QjtrQkFIckMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuLi9hcGkvYXBpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tb25GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24tdXRpbHMvY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRhU2hhcmVTZXJ2aWNlIH0gZnJvbSAnLi4vZGF0YS1zaGFyZS9kYXRhLXNoYXJlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gJy4uL3Blcm1pc3Npb24vcGVybWlzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zdG9yYWdlL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbW1vbkFwcERhdGFTaGFyZVNlcnZpY2UgfSBmcm9tICcuLi9kYXRhLXNoYXJlL2NvbW1vbi1hcHAtZGF0YS1zaGFyZS9jb21tb24tYXBwLWRhdGEtc2hhcmUuc2VydmljZSc7XHJcbmltcG9ydCB7IFVzZXJQcmVmcmVuY2VTZXJ2aWNlIH0gZnJvbSAnLi4vdXNlclByZWZyZW5jZS91c2VyLXByZWZyZW5jZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29yZUZ1bmN0aW9uU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi11dGlscy9jb3JlLWZ1bmN0aW9uL2NvcmUtZnVuY3Rpb24uc2VydmljZSc7XHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE1lbnVPck1vZHVsZUNvbW1vblNlcnZpY2Uge1xyXG5cclxuY29uc3RydWN0b3IoXHJcbiAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXHJcbiAgcHJpdmF0ZSBwZXJtaXNzaW9uU2VydmljZTpQZXJtaXNzaW9uU2VydmljZSxcclxuICBwcml2YXRlIGNvbW1vbkZ1bmN0aW9uU2VydmljZTpDb21tb25GdW5jdGlvblNlcnZpY2UsXHJcbiAgcHJpdmF0ZSBkYXRhU2hhcmVTZXJ2aWNlOkRhdGFTaGFyZVNlcnZpY2UsXHJcbiAgcHJpdmF0ZSBhcGlTZXJ2aWNlOkFwaVNlcnZpY2UsXHJcbiAgcHJpdmF0ZSByb3V0ZXI6Um91dGVyLFxyXG4gIHByaXZhdGUgY29tbW9uQXBwRGF0YVNoYXJlU2VydmljZTogQ29tbW9uQXBwRGF0YVNoYXJlU2VydmljZSxcclxuICBwcml2YXRlIHVzZXJQcmVmcmVuY2VTZXJ2aWNlOiBVc2VyUHJlZnJlbmNlU2VydmljZSxcclxuICBwcml2YXRlIGNvcmVGdW5jdGlvblNlcnZpY2U6IENvcmVGdW5jdGlvblNlcnZpY2UsXHJcbikgeyB9XHJcblxyXG4gIC8vIG1vZGlmeU1vZHVsZUxpc3RXaXRoUGVybWlzc2lvbihtb2R1bGVMaXN0OmFueSl7XHJcbiAgLy8gICBsZXQgbW9kaWZ5TW9kdWxlTGlzdDphbnkgPSBbXTtcclxuICAvLyAgIGlmKG1vZHVsZUxpc3QgJiYgbW9kdWxlTGlzdC5sZW5ndGggPiAwKXtcclxuICAvLyAgICAgbW9kdWxlTGlzdC5mb3JFYWNoKChtb2R1bGU6YW55KSA9PiB7XHJcbiAgLy8gICAgICAgaWYobW9kdWxlICYmIG1vZHVsZS5tZW51X2xpc3QgJiYgbW9kdWxlLm1lbnVfbGlzdC5sZW5ndGggPiAwKXtcclxuICAvLyAgICAgICAgIGxldCBtZW51TGlzdCA9IG1vZHVsZS5tZW51X2xpc3Q7XHJcbiAgLy8gICAgICAgICBtb2R1bGUubWVudV9saXN0ID0gdGhpcy5zZXREaXNwbGF5SW5NZW51V2l0aFBlcm1pc3Npb24obWVudUxpc3QpO1xyXG4gIC8vICAgICAgICAgaWYodGhpcy5zZXREaXNwbGF5SW5Nb2R1bGVXaXRoUGVybWlzc2lvbihtb2R1bGUubWVudV9saXN0KSl7XHJcbiAgLy8gICAgICAgICAgIG1vZHVsZVsnZGlzcGxheSddID0gdHJ1ZTtcclxuICAvLyAgICAgICAgIH1lbHNle1xyXG4gIC8vICAgICAgICAgICBtb2R1bGVbJ2Rpc3BsYXknXSA9IGZhbHNlO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgbW9kaWZ5TW9kdWxlTGlzdC5wdXNoKG1vZHVsZSk7XHJcbiAgLy8gICAgICAgfWVsc2V7XHJcbiAgLy8gICAgICAgICBtb2RpZnlNb2R1bGVMaXN0LnB1c2gobW9kdWxlKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIG1vZGlmeU1vZHVsZUxpc3Q7XHJcbiAgLy8gfVxyXG4gIGdldERlZmF1bHRNZW51SW5kZXgobWVudUxpc3Q6YW55KXtcclxuICAgIGxldCBkZWZhdWx0bWVudUluZGV4ID0gMDtcclxuICAgIGxldCBkZWZhdWx0U3VibWVudUluZGV4ID0gLTE7XHJcbiAgICBsZXQgZGVmYXVsdEluZGV4cyA9IHtcclxuICAgICAgJ2RlZmF1bHRtZW51SW5kZXgnOmRlZmF1bHRtZW51SW5kZXgsXHJcbiAgICAgICdkZWZhdWx0U3VibWVudUluZGV4JyA6ZGVmYXVsdFN1Ym1lbnVJbmRleFxyXG4gICAgfTtcclxuICAgIGlmKG1lbnVMaXN0ICYmIG1lbnVMaXN0Lmxlbmd0aCA+IDApe1xyXG4gICAgICBkZWZhdWx0bWVudUluZGV4ID0gdGhpcy5nZXREZWZhdWx0SW5kZXgobWVudUxpc3QpXHJcbiAgICAgIGNvbnN0IGRlZmF1bHRNZW51ID1tZW51TGlzdFtkZWZhdWx0bWVudUluZGV4XTtcclxuICAgICAgaWYoZGVmYXVsdE1lbnUuc3VibWVudSAmJiBkZWZhdWx0TWVudS5zdWJtZW51Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgIGRlZmF1bHRTdWJtZW51SW5kZXggPSB0aGlzLmdldERlZmF1bHRJbmRleChkZWZhdWx0TWVudS5zdWJtZW51KTtcclxuICAgICAgICBpZihkZWZhdWx0U3VibWVudUluZGV4ID09IC0xKXtcclxuICAgICAgICAgIGRlZmF1bHRTdWJtZW51SW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZGVmYXVsdEluZGV4cy5kZWZhdWx0bWVudUluZGV4ID0gZGVmYXVsdG1lbnVJbmRleDtcclxuICAgIGRlZmF1bHRJbmRleHMuZGVmYXVsdFN1Ym1lbnVJbmRleCA9IGRlZmF1bHRTdWJtZW51SW5kZXg7XHJcbiAgICByZXR1cm4gZGVmYXVsdEluZGV4cztcclxuICB9XHJcbiAgZ2V0RGVmYXVsdEluZGV4KG1lbnVMaXN0OmFueSl7XHJcbiAgICBsZXQgZGVmYXVsdG1lbnVJbmRleCA9IDA7XHJcbiAgICBpZihtZW51TGlzdCAmJiBtZW51TGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8ICBtZW51TGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBpZihtZW51TGlzdFtpbmRleF0uZGVmYXVsdE1lbnUpe1xyXG4gICAgICAgICAgZGVmYXVsdG1lbnVJbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGVmYXVsdG1lbnVJbmRleDtcclxuICB9XHJcbiAgLy8gc2V0RGlzcGxheUluTWVudVdpdGhQZXJtaXNzaW9uKG1lbnVMaXN0OmFueSl7XHJcbiAgLy8gICBsZXQgbW9kaWZ5TWVudUxpc3QgPSBbXTtcclxuICAvLyAgIGlmKG1lbnVMaXN0ICYmIG1lbnVMaXN0Lmxlbmd0aCA+IDApe1xyXG4gIC8vICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtZW51TGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAvLyAgICAgICAgICAgY29uc3QgbWVudSA9IG1lbnVMaXN0W2luZGV4XTtcclxuICAvLyAgICAgICAgICAgaWYobWVudS5zdWJtZW51ICYmIG1lbnUuc3VibWVudSAhPSBudWxsKXtcclxuICAvLyAgICAgICAgICAgICAgIGxldCBtb2RpZnlTdWJNZW51TGlzdCA9IFtdO1xyXG4gIC8vICAgICAgICAgICAgICAgbGV0IGNoZWNrID0gMDtcclxuICAvLyAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWVudS5zdWJtZW51Lmxlbmd0aDsgaisrKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgY29uc3Qgc3VibWVudSA9IG1lbnUuc3VibWVudVtqXTtcclxuICAvLyAgICAgICAgICAgICAgICAgICBpZighdGhpcy5jaGVja1Blcm1pc3Npb24oc3VibWVudSkpe1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBzdWJtZW51WydkaXNwbGF5J10gPSB0cnVlO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlTdWJNZW51TGlzdC5wdXNoKHN1Ym1lbnUpO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBjaGVjayA9IDE7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIHN1Ym1lbnVbJ2Rpc3BsYXknXSA9IGZhbHNlO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlTdWJNZW51TGlzdC5wdXNoKHN1Ym1lbnUpO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgIGlmKGNoZWNrID09IDEpe1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIG1lbnVbJ2Rpc3BsYXknXSA9IHRydWU7XHJcbiAgLy8gICAgICAgICAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgICAgICAgICAgICBtZW51WydkaXNwbGF5J10gPSBmYWxzZTtcclxuICAvLyAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgIG1lbnUuc3VibWVudSA9IG1vZGlmeVN1Yk1lbnVMaXN0O1xyXG4gIC8vICAgICAgICAgICAgICAgbW9kaWZ5TWVudUxpc3QucHVzaChtZW51KTtcclxuICAvLyAgICAgICAgICAgfWVsc2V7XHJcbiAgLy8gICAgICAgICAgICAgICBpZighdGhpcy5jaGVja1Blcm1pc3Npb24obWVudSkpe1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIG1lbnVbJ2Rpc3BsYXknXSA9IHRydWU7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgbW9kaWZ5TWVudUxpc3QucHVzaChtZW51KTtcclxuICAvLyAgICAgICAgICAgICAgIH1lbHNle1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIG1lbnVbJ2Rpc3BsYXknXSA9IGZhbHNlO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIG1vZGlmeU1lbnVMaXN0LnB1c2gobWVudSk7XHJcbiAgLy8gICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gbW9kaWZ5TWVudUxpc3Q7XHJcbiAgLy8gfVxyXG4gIC8vIHNldERpc3BsYXlJbk1vZHVsZVdpdGhQZXJtaXNzaW9uKG1lbnVMaXN0OmFueSl7XHJcbiAgLy8gICBsZXQgY2hlY2sgPSBmYWxzZTtcclxuICAvLyAgIGlmKG1lbnVMaXN0ICYmIG1lbnVMaXN0Lmxlbmd0aCA+IDApe1xyXG4gIC8vICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWVudUxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgLy8gICAgICAgY29uc3QgbWVudSA9IG1lbnVMaXN0W2luZGV4XTtcclxuICAvLyAgICAgICBpZihtZW51LnN1Ym1lbnUgJiYgbWVudS5zdWJtZW51ICE9IG51bGwpe1xyXG4gIC8vICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtZW51LnN1Ym1lbnUubGVuZ3RoOyBqKyspIHtcclxuICAvLyAgICAgICAgICAgY29uc3Qgc3VibWVudSA9IG1lbnUuc3VibWVudVtqXTtcclxuICAvLyAgICAgICAgICAgaWYoc3VibWVudS5kaXNwbGF5KXtcclxuICAvLyAgICAgICAgICAgICBjaGVjayA9IHRydWU7XHJcbiAgLy8gICAgICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgIGlmKG1lbnUuZGlzcGxheSl7XHJcbiAgLy8gICAgICAgICAgIGNoZWNrID0gdHJ1ZTtcclxuICAvLyAgICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gY2hlY2s7XHJcbiAgLy8gfVxyXG4gIGdldERlZmF1bHRNZW51KG1lbnVMaXN0OmFueSl7XHJcbiAgICAgIGxldCBtZW51OmFueSA9IHt9O1xyXG4gICAgICBsZXQgZGVmYXVsdE1lbnU6YW55ID0ge307XHJcbiAgICAgIGxldCBkZWZhdWx0TWVudUluZGV4cyA9IHRoaXMuZ2V0RGVmYXVsdE1lbnVJbmRleChtZW51TGlzdCk7XHJcbiAgICAgIG1lbnVbJ2luZGV4cyddID0gZGVmYXVsdE1lbnVJbmRleHM7XHJcbiAgICAgIGlmKGRlZmF1bHRNZW51SW5kZXhzLmRlZmF1bHRTdWJtZW51SW5kZXggPiAtMSl7XHJcbiAgICAgICAgICBkZWZhdWx0TWVudSA9IG1lbnVMaXN0W2RlZmF1bHRNZW51SW5kZXhzLmRlZmF1bHRtZW51SW5kZXhdLnN1Ym1lbnVbZGVmYXVsdE1lbnVJbmRleHMuZGVmYXVsdFN1Ym1lbnVJbmRleF07XHJcbiAgICAgICAgICBkZWZhdWx0TWVudVsnY2hpbGQnXSA9IHRydWU7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgICAgZGVmYXVsdE1lbnUgPSBtZW51TGlzdFtkZWZhdWx0TWVudUluZGV4cy5kZWZhdWx0bWVudUluZGV4XTtcclxuICAgICAgICAgIGRlZmF1bHRNZW51WydjaGlsZCddID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgZGVmYXVsdE1lbnVbJ21lbnVJbmRleCddID0gZGVmYXVsdE1lbnVJbmRleHMuZGVmYXVsdG1lbnVJbmRleDtcclxuICAgICAgbWVudVsnbWVudSddID0gZGVmYXVsdE1lbnU7XHJcbiAgICAgIC8vIGlmKGRlZmF1bHRNZW51LmRpc3BsYXkpe1xyXG5cclxuICAgICAgLy8gfWVsc2V7XHJcbiAgICAgIC8vICAgICBtZW51WydtZW51J10gPSB0aGlzLmZpbmRNZW51V2l0aFBlcm1pc3Npb24obWVudUxpc3QpO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIHJldHVybiBtZW51O1xyXG4gIH1cclxuICAvLyBmaW5kTWVudVdpdGhQZXJtaXNzaW9uKG1lbnVMaXN0OmFueSl7XHJcbiAgLy8gICAgIGxldCBtb2RpZnlNZW51ID0ge307XHJcbiAgLy8gICAgIGlmKG1lbnVMaXN0ICYmIG1lbnVMaXN0Lmxlbmd0aCA+IDApe1xyXG4gIC8vICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG1lbnVMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gIC8vICAgICAgICAgICAgIGNvbnN0IG1lbnUgPSBtZW51TGlzdFtpbmRleF07XHJcbiAgLy8gICAgICAgICAgICAgaWYobWVudS5kaXNwbGF5ICYmIG1lbnUuc3VibWVudSAmJiBtZW51LnN1Ym1lbnUgIT0gbnVsbCl7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWVudS5zdWJtZW51Lmxlbmd0aDsgaisrKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJtZW51ID0gbWVudS5zdWJtZW51W2pdO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgaWYoc3VibWVudS5kaXNwbGF5KXtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlNZW51ID0gc3VibWVudTtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIH1lbHNle1xyXG4gIC8vICAgICAgICAgICAgICAgICBpZihtZW51LmRpc3BsYXkpe1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgbW9kaWZ5TWVudSA9IG1lbnU7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgICByZXR1cm4gbW9kaWZ5TWVudTtcclxuICAvLyB9XHJcbiAgc2V0TW9kdWxlTmFtZShtb2R1bGVOYW1lOnN0cmluZyl7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldE1vZHVsZShtb2R1bGVOYW1lKTtcclxuICB9XHJcbiAgZ2V0TW9kdWxlSW5kZXhCeUlkKG1vZHVsZUlkOmFueSl7XHJcbiAgICBsZXQgbW9kdWxlTGlzdCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuR2V0TW9kdWxlcygpO1xyXG4gICAgcmV0dXJuIHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldEluZGV4SW5BcnJheUJ5SWQobW9kdWxlTGlzdCxtb2R1bGVJZCk7XHJcbiAgfVxyXG4gIHNoYXJlTWVudUluZGV4KG1lbnVJbmRleDpudW1iZXIsc3ViTWVudUluZGV4Om51bWJlcixtb2R1bGVJbmRleD86bnVtYmVyKXtcclxuICAgIGxldCBpbmRleHM6YW55ID0ge307XHJcbiAgICBpbmRleHNbJ21lbnVJbmRleCddID0gbWVudUluZGV4O1xyXG4gICAgaW5kZXhzWydzdWJtZW51SW5kZXgnXSA9IHN1Yk1lbnVJbmRleDtcclxuICAgIGluZGV4c1snbW9kdWxlSW5kZXgnXSA9IG1vZHVsZUluZGV4O1xyXG4gICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldE1lbnVJbmRleHMoaW5kZXhzKTtcclxufVxyXG4gIGdldEluZGV4c0J5TWVudU5hbWUobWVudUxpc3Q6YW55LG1lbnVOYW1lOmFueSl7XHJcbiAgICBsZXQgaW5kZXhzPSB7XHJcbiAgICAgICdtZW51aW5kZXgnOi0xLFxyXG4gICAgICAnc3VibWVudWluZGV4JzotMVxyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG1lbnVMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBtZW51ID0gbWVudUxpc3RbaW5kZXhdO1xyXG4gICAgICBpZighbWVudS5zdWJtZW51ICYmIG1lbnUubmFtZSA9PSBtZW51TmFtZSl7XHJcbiAgICAgICAgaW5kZXhzLm1lbnVpbmRleCA9IGluZGV4O1xyXG4gICAgICAgIGluZGV4cy5zdWJtZW51aW5kZXggPSAtMTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgaWYobWVudS5zdWJtZW51ICYmIG1lbnUuc3VibWVudS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWVudS5zdWJtZW51Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1Yk1lbnUgPSBtZW51LnN1Ym1lbnVbal07XHJcbiAgICAgICAgICAgIGlmKHN1Yk1lbnUubmFtZSA9PSBtZW51TmFtZSl7XHJcbiAgICAgICAgICAgICAgaW5kZXhzLm1lbnVpbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgICAgIGluZGV4cy5zdWJtZW51aW5kZXggPSBqO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5kZXhzO1xyXG4gIH1cclxuICBnZXRNZW51TmFtZUJ5SWQobW9kdWxlOmFueSxtZW51SWQ6YW55LHN1Ym1lbnVJZDphbnksa2V5Pzphbnkpe1xyXG4gICAgbGV0IG1lbnVOYW1lOmFueSA9IHt9O1xyXG4gICAgbGV0IG1lbnVMaXN0ID0gbW9kdWxlLm1lbnVfbGlzdDtcclxuICAgIGxldCBtZW51SW5kZXggPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRJbmRleEluQXJyYXlCeUlkKG1lbnVMaXN0LG1lbnVJZCxrZXkpO1xyXG4gICAgbWVudU5hbWVbJ21lbnVJbmRleCddID0gbWVudUluZGV4O1xyXG4gICAgbGV0IG1lbnUgPSBtZW51TGlzdFttZW51SW5kZXhdO1xyXG4gICAgaWYoc3VibWVudUlkICE9IFwiXCIpe1xyXG4gICAgICBpZihtZW51LnN1Ym1lbnUpe1xyXG4gICAgICAgIGxldCBzdWJNZW51TGlzdCA9IG1lbnUuc3VibWVudTtcclxuICAgICAgICBpZihzdWJNZW51TGlzdCAmJiBzdWJNZW51TGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgbGV0IHN1Yk1lbnVJbmRleCA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldEluZGV4SW5BcnJheUJ5SWQoc3ViTWVudUxpc3Qsc3VibWVudUlkLGtleSk7XHJcbiAgICAgICAgICAgIG1lbnVOYW1lWydzdWJNZW51SW5kZXgnXSA9IHN1Yk1lbnVJbmRleDtcclxuICAgICAgICAgICAgbGV0IHN1Ym1lbnUgPSBzdWJNZW51TGlzdFtzdWJNZW51SW5kZXhdO1xyXG4gICAgICAgICAgICBtZW51TmFtZVsnbmFtZSddID0gc3VibWVudS5uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIG1lbnVOYW1lWyduYW1lJ10gPSBtZW51Lm5hbWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWVudU5hbWU7XHJcbiAgfVxyXG4gIC8vIGNoZWNrUGVybWlzc2lvbihtZW51OmFueSl7XHJcbiAgLy8gICAgIHJldHVybiAhdGhpcy5wZXJtaXNzaW9uU2VydmljZS5jaGVja1Blcm1pc3Npb24obWVudS5uYW1lLCAndmlldycpXHJcbiAgLy8gfVxyXG4gIGdldFRlbXBsYXRlRGF0YShtb2R1bGU6YW55LHN1Ym1lbnU6YW55KSB7XHJcbiAgICBpZihzdWJtZW51ICYmIHN1Ym1lbnUubmFtZSl7XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5TZXRBY3RpdmVNZW51KHN1Ym1lbnUpO1xyXG4gICAgICAgIGlmIChzdWJtZW51LmxhYmVsID09IFwiTmF2aWdhdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnTmF2aWdhdGlvbiddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc3VibWVudS5sYWJlbCA9PSBcIlBlcm1pc3Npb25zXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydwZXJtaXNzaW9ucyddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBtZW51ID0gc3VibWVudTtcclxuICAgICAgICAgIGlmKG1lbnUubmFtZSA9PSBcImRvY3VtZW50X2xpYnJhcnlcIil7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsndmRyJ10pO1xyXG4gICAgICAgICAgfWVsc2UgaWYobWVudS5uYW1lID09IFwicmVwb3J0XCIpe1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ3JlcG9ydCddKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMuYXBpU2VydmljZS5yZXNldFRlbXBEYXRhKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBpU2VydmljZS5yZXNldEdyaWREYXRhKCk7XHJcbiAgICAgICAgICAgIHRoaXMuR29Ub1NlbGVjdGVkTW9kdWxlKG1vZHVsZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlID0gJ2Jyb3dzZS8nK21vZHVsZS5uYW1lK1wiL1wiK3N1Ym1lbnUubmFtZTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhyb3V0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtyb3V0ZV0pO1xyXG4gICAgICAgICAgICAvL3RoaXMucm91dGVyLm5hdmlnYXRlKFsndGVtcGxhdGUnXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2UuY2hlY2tUb2tlblN0YXR1c0ZvclBlcm1pc3Npb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEdvVG9TZWxlY3RlZE1vZHVsZShpdGVtOmFueSl7XHJcbiAgICBpZihpdGVtICYmIGl0ZW0ubmFtZSl7XHJcbiAgICAgICAgdGhpcy5zZXRNb2R1bGVOYW1lKGl0ZW0ubmFtZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2VuZEN1cnJlbnRQYWdlKCdEQVNIQk9BUkQnKTtcclxuICB9XHJcbiAgZ29Ub01PZHVsZSgpIHtcclxuICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZW5kQ3VycmVudFBhZ2UoJ01PRFVMRScpO1xyXG4gICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnJlc2V0SGVhZGVyTWVudShbXSk7XHJcbiAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0TW9kdWxlSW5kZXgoLTEpO1xyXG4gICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldE1lbnVJbmRleHMoe21lbnVJbmRleDotMSxzdWJtZW51SW5kZXg6LTF9KTtcclxuICAgIGNvbnN0IG1lbnVUeXBlID0gdGhpcy5zdG9yYWdlU2VydmljZS5HZXRNZW51VHlwZSgpXHJcbiAgICBpZiAobWVudVR5cGUgPT0gJ0hvcml6b250YWwnKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvaG9tZSddKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvZGFzaGJvYXJkJ10pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmlld1Blcm1pc3Npb25JblRhYnModGFiczphbnkpe1xyXG4gICAgdGFicy5mb3JFYWNoKCh0YWI6YW55KSA9PiB7XHJcbiAgICAgIGxldCB0YWJfbmFtZSA9IHRhYi50YWJfbmFtZTtcclxuICAgICAgbGV0IGNoZWNrID0gdGhpcy5wZXJtaXNzaW9uU2VydmljZS5jaGVja1Blcm1pc3Npb24odGFiX25hbWUsJ3ZpZXcnKTtcclxuICAgICAgdGFiWydkaXNwbGF5J10gPSBjaGVjaztcclxuICAgICAgdGFiWydmZWJNZW51J10gPSB0aGlzLmNoZWNrRmViTWVudUFkZE9yTm90KHRhYiwnJyk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0YWJzO1xyXG4gIH1cclxuXHJcbiAgYWRkUGVybWlzc2lvbkluVGFiKHRhYjphbnkpe1xyXG4gICAgaWYodGFiICYmIHRhYi50YWJfbmFtZSl7XHJcbiAgICAgIGxldCBuYW1lID0gdGFiLnRhYl9uYW1lO1xyXG4gICAgICBsZXQgY2hlY2sgPSB0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLmNoZWNrUGVybWlzc2lvbihuYW1lLCdhZGQnKTtcclxuICAgICAgdGFiWydhZGRGb3JtJ10gPSBjaGVjaztcclxuICAgIH1cclxuICAgIHJldHVybiB0YWI7XHJcbiAgfVxyXG4gIGNoZWNrRmViTWVudUFkZE9yTm90KHRhYjphbnkscGFyZW50OmFueSl7XHJcbiAgICBsZXQgdGFiSWQgPSB0YWIuX2lkO1xyXG4gICAgaWYocGFyZW50ICE9ICcnKXtcclxuICAgICAgdGFiSWQgPSBwYXJlbnQuX2lkO1xyXG4gICAgfVxyXG4gICAgbGV0IHVzZXJGZWJUYWIgPSB0aGlzLnVzZXJQcmVmcmVuY2VTZXJ2aWNlLmdldFVzZXJQcmVmZXJlbmNlQnlGaWVsZE5hbWUoJ2Zhdm9yaXRlVGFicycpO1xyXG4gICAgaWYodXNlckZlYlRhYiAmJiB1c2VyRmViVGFiICE9IG51bGwgJiYgdXNlckZlYlRhYi5sZW5ndGggPiAwKXtcclxuICAgICAgbGV0IG1hdGNoID0gLTE7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB1c2VyRmViVGFiLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB1c2VyRmViVGFiW2luZGV4XTtcclxuICAgICAgICBpZihlbGVtZW50Ll9pZCA9PSB0YWJJZCApe1xyXG4gICAgICAgICAgbWF0Y2ggPSBpbmRleDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZihtYXRjaCA+IC0xKXtcclxuICAgICAgICBpZihwYXJlbnQgIT0gJycpe1xyXG4gICAgICAgICAgY29uc3Qgc3VibWVudSA9IHVzZXJGZWJUYWJbbWF0Y2hdWyd0YWInXTtcclxuICAgICAgICAgIGxldCBzdWJNYXRjaEluZGV4ID0gLTE7XHJcbiAgICAgICAgICBpZihzdWJtZW51ICYmIHN1Ym1lbnUubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3VibWVudS5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHN1Yk1lbnUgPSBzdWJtZW51W2pdO1xyXG4gICAgICAgICAgICAgIGlmKHN1Yk1lbnUuX2lkID09IHRhYi5faWQpe1xyXG4gICAgICAgICAgICAgICAgc3ViTWF0Y2hJbmRleCA9IGo7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZihzdWJNYXRjaEluZGV4ID4gLTEpe1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZm9yIEFwcFxyXG4gIGdldE1vZHVsZUJ5U2VsZWN0ZWRJbmRleCgpe1xyXG4gICAgY29uc3QgbW9kdWxlTGlzdCA9IHRoaXMuY29tbW9uQXBwRGF0YVNoYXJlU2VydmljZS5nZXRNb2R1bGVMaXN0KCk7XHJcbiAgICBjb25zdCBjbGlja2VkTW9kdWxlSW5kZXggPSB0aGlzLmNvbW1vbkFwcERhdGFTaGFyZVNlcnZpY2UuZ2V0TW9kdWxlSW5kZXgoKTtcclxuICAgIGxldCBtb2R1bGU6YW55ICA9IHt9O1xyXG4gICAgaWYoY2xpY2tlZE1vZHVsZUluZGV4ID49IDApe1xyXG4gICAgICBtb2R1bGUgPSBtb2R1bGVMaXN0W2NsaWNrZWRNb2R1bGVJbmRleF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbW9kdWxlO1xyXG4gIH1cclxuICBnZXRDYXJkKGluZGV4OmFueSl7XHJcbiAgICBjb25zdCBtb2R1bGVMaXN0ID0gdGhpcy5jb21tb25BcHBEYXRhU2hhcmVTZXJ2aWNlLmdldE1vZHVsZUxpc3QoKTtcclxuICAgIGNvbnN0IGNsaWNrZWRNb2R1bGVJbmRleCA9IHRoaXMuY29tbW9uQXBwRGF0YVNoYXJlU2VydmljZS5nZXRNb2R1bGVJbmRleCgpO1xyXG4gICAgbGV0IGNhcmQ6YW55ICA9IHt9O1xyXG4gICAgbGV0IHRhYnM6YW55ID1bXTtcclxuICAgIGxldCBzZWxlY3RlZFRhYkluZGV4Om51bWJlciA9IC0xO1xyXG4gICAgbGV0IHBvcG92ZXJUYWJiaW5nID0gZmFsc2U7XHJcbiAgICBpZihjbGlja2VkTW9kdWxlSW5kZXggPj0gMCl7XHJcbiAgICAgIGNhcmQgPSBtb2R1bGVMaXN0W2NsaWNrZWRNb2R1bGVJbmRleF07XHJcbiAgICB9XHJcbiAgICBpZihjYXJkICYmIGNhcmQudGFiX21lbnUgJiYgY2FyZC50YWJfbWVudS5sZW5ndGggPiAwICYmIGNhcmQucG9wb3ZlclRhYmJpbmcpe1xyXG4gICAgICBwb3BvdmVyVGFiYmluZyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZihjYXJkICYmIGNhcmQudGFiX21lbnUgJiYgY2FyZC50YWJfbWVudS5sZW5ndGggPiAwKXtcclxuICAgIGNvbnN0IGNsaWNrZWR0YWJJbmRleD0gdGhpcy5jb21tb25BcHBEYXRhU2hhcmVTZXJ2aWNlLmdldFNlbGVjdGRUYWJJbmRleCgpO1xyXG4gICAgICB0YWJzID0gY2FyZC50YWJfbWVudTtcclxuICAgICAgbGV0IHRhYjphbnkgPSB7fTtcclxuICAgICAgaWYoaW5kZXggPT0gLTEpe1xyXG4gICAgICAgIHRhYiA9IHRhYnNbMF07XHJcbiAgICAgICAgc2VsZWN0ZWRUYWJJbmRleCA9IDA7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRhYiA9IHRhYnNbY2xpY2tlZHRhYkluZGV4XTtcclxuICAgICAgICBzZWxlY3RlZFRhYkluZGV4ID0gY2xpY2tlZHRhYkluZGV4O1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHRhYkluZGV4ID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0SW5kZXhJbkFycmF5QnlJZChtb2R1bGVMaXN0LHRhYi5faWQsXCJfaWRcIik7XHJcbiAgICAgIGNhcmQgPSBtb2R1bGVMaXN0W3RhYkluZGV4XTtcclxuICAgIH1cclxuICAgIGxldCBvYmplY3QgPSB7XHJcbiAgICAgICd0YWJzJyA6IHRhYnMsXHJcbiAgICAgIFwiY2FyZFwiIDogY2FyZCxcclxuICAgICAgXCJzZWxlY3RlZFRhYkluZGV4XCIgOiBzZWxlY3RlZFRhYkluZGV4LFxyXG4gICAgICBcInBvcG92ZXJUYWJiaW5nXCIgOiBwb3BvdmVyVGFiYmluZ1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iamVjdDtcclxuICB9XHJcbiAgZ2V0VXNlckF1dGhlcmlzZWRDYXJkcyhjYXJkTWFzdGVyTGlzdDphbnkpe1xyXG4gICAgY29uc3QgdXNlckF1dGhNb2R1bGVzOmFueSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuR2V0TW9kdWxlcygpO1xyXG4gICAgY29uc3QgY2FyZExpc3Q6YW55ID0gW107XHJcbiAgICBpZih1c2VyQXV0aE1vZHVsZXMgJiYgdXNlckF1dGhNb2R1bGVzICE9IG51bGwpe1xyXG4gICAgICB1c2VyQXV0aE1vZHVsZXMuZm9yRWFjaCgobW9kdWxlOmFueSwgaTpudW1iZXIpID0+IHtcclxuICAgICAgICBpZihtb2R1bGUgJiYgbW9kdWxlWydfaWQnXSl7XHJcbiAgICAgICAgICBjYXJkTWFzdGVyTGlzdC5mb3JFYWNoKChjYXJkOmFueSwgajpudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgaWYoY2FyZCAmJiBjYXJkLnVzZXJBdXRoZXJpc2VkTW9kdWxlICYmIGNhcmRbJ3VzZXJBdXRoZXJpc2VkTW9kdWxlJ11bJ19pZCddKXtcclxuICAgICAgICAgICAgICBpZihtb2R1bGVbJ19pZCddID09IGNhcmRbJ3VzZXJBdXRoZXJpc2VkTW9kdWxlJ11bJ19pZCddKXtcclxuICAgICAgICAgICAgICAgIGNhcmRMaXN0LnB1c2goY2FyZCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBjYXJkTGlzdDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBnZXROZXN0ZWRDYXJkKGNhcmRHcmlkOmFueSwgY2FyZEdyaWROYW1lOmFueSkge1xyXG4gICAgaWYgKGNhcmRHcmlkW2NhcmRHcmlkTmFtZV0gJiYgY2FyZEdyaWRbY2FyZEdyaWROYW1lXSAhPSB1bmRlZmluZWQgJiYgY2FyZEdyaWRbY2FyZEdyaWROYW1lXSAhPSBudWxsICYmIGNhcmRHcmlkW2NhcmRHcmlkTmFtZV0gIT0gJycpIHtcclxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY2FyZEdyaWRbY2FyZEdyaWROYW1lXSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXRNb2R1bGVzRnJvbU9iamVjdChvYmo6IGFueSkge1xyXG4gICAgbGV0IG1vZHVsZXM6IGFueVtdID0gW107XHJcblxyXG4gICAgY29uc3QgcHJvY2Vzc01vZHVsZSA9IChtb2R1bGVLZXk6IHN0cmluZywgbW9kdWxlOiBhbnkpID0+IHtcclxuICAgICAgbGV0IG1vZHVsZU9iajogYW55ID0geyBrZXlOYW1lOiBtb2R1bGVLZXkgfTtcclxuICAgICAgaWYgKG1vZHVsZS5yZWZlcmVuY2UpIHtcclxuICAgICAgICBtb2R1bGVPYmogPSB7IC4uLm1vZHVsZU9iaiwgLi4ubW9kdWxlLnJlZmVyZW5jZSB9O1xyXG4gICAgICB9XHJcbiAgICAgIG1vZHVsZU9iai5ub3RpZmljYXRpb24gPSBtb2R1bGUubm90aWZpY2F0aW9uIHx8IGZhbHNlO1xyXG4gICAgICBtb2R1bGVPYmoubWVudV9saXN0ID0gdGhpcy5nZXRNZW51TGlzdChtb2R1bGUubWVudXMpO1xyXG4gICAgICBtb2R1bGVzLnB1c2gobW9kdWxlT2JqKTtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKG9iai5ub3RpZmljYXRpb25zKSB7XHJcbiAgICAgIG9iaiA9IG9iai5ub3RpZmljYXRpb25zO1xyXG4gICAgICBpZiAob2JqICYmIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIE9iamVjdC5lbnRyaWVzPGFueT4ob2JqKS5mb3JFYWNoKChbbW9kdWxlS2V5LCBtb2R1bGVdKSA9PiB7XHJcbiAgICAgICAgICBwcm9jZXNzTW9kdWxlKG1vZHVsZUtleSwgbW9kdWxlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtb2R1bGVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWVudUxpc3QgPSAobWVudXM6IGFueSkgPT4ge1xyXG4gICAgbGV0IG1lbnVMaXN0OiBhbnlbXSA9IFtdO1xyXG4gICAgaWYgKG1lbnVzKSB7XHJcbiAgICAgIE9iamVjdC5lbnRyaWVzPGFueT4obWVudXMpLmZvckVhY2goKFttZW51S2V5LCBtZW51XSkgPT4ge1xyXG4gICAgICAgIGxldCBtZW51T2JqOiBhbnkgPSB7IGtleU5hbWU6IG1lbnVLZXkgfTtcclxuICAgICAgICBpZiAobWVudS5yZWZlcmVuY2UpIHtcclxuICAgICAgICAgIG1lbnVPYmogPSB7IC4uLm1lbnVPYmosIC4uLm1lbnUucmVmZXJlbmNlIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1lbnVPYmouc3VibWVudSA9IHRoaXMuZ2V0TWVudUxpc3QobWVudS5zdWJtZW51cyk7XHJcbiAgICAgICAgaWYoIW1lbnVPYmo/LnN1Ym1lbnUpe21lbnVPYmoudGVtcGxhdGVUYWJzID0gdGhpcy5nZXRUYWJMaXN0KG1lbnUudGVtcGxhdGVUYWJzKTt9XHJcbiAgICAgICAgbWVudUxpc3QucHVzaChtZW51T2JqKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWVudUxpc3QubGVuZ3RoID4gMCA/IHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5zb3J0TWVudShtZW51TGlzdCkgOiBudWxsO1xyXG4gIH07XHJcblxyXG4gIGdldFRhYkxpc3QgPSAodGFiczogYW55KSA9PiB7XHJcbiAgICBsZXQgdGFiTGlzdDogYW55W10gPSBbXTtcclxuICAgIGlmICh0YWJzKSB7XHJcbiAgICAgIE9iamVjdC5lbnRyaWVzPGFueT4odGFicykuZm9yRWFjaCgoW3RhYktleSwgdGFiXSkgPT4ge1xyXG4gICAgICAgIGxldCB0YWJPYmo6IGFueSA9IHsga2V5TmFtZTogdGFiS2V5IH07XHJcbiAgICAgICAgaWYgKHRhYi5yZWZlcmVuY2UpIHtcclxuICAgICAgICAgIHRhYk9iaiA9IHsgLi4udGFiT2JqLCAuLi50YWIucmVmZXJlbmNlIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRhYk9iai5lbWFpbCA9IHRhYi5hY3RpdmVBbGVydHM/LmluY2x1ZGVzKFwiRU1BSUxcIikgfHwgZmFsc2U7XHJcbiAgICAgICAgdGFiT2JqLndoYXRzYXBwID0gdGFiLmFjdGl2ZUFsZXJ0cz8uaW5jbHVkZXMoXCJXSEFUU0FQUFwiKSB8fCBmYWxzZTtcclxuICAgICAgICB0YWJPYmouc21zID0gdGFiLmFjdGl2ZUFsZXJ0cz8uaW5jbHVkZXMoXCJTTVNcIikgfHwgZmFsc2U7XHJcbiAgICAgICAgdGFiTGlzdC5wdXNoKHRhYk9iaik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhYkxpc3Q7XHJcbiAgfTtcclxuXHJcbiAgZ2V0TWVudURldGFpbHMobW9kdWxlOiBhbnkpIHtcclxuICAgIGxldCBvYmo6IGFueSA9IHt9O1xyXG4gICAgaWYgKG1vZHVsZSkge1xyXG4gICAgICAgIG1vZHVsZS5mb3JFYWNoKChtZW51OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IG1lbnVOYW1lID0gbWVudT8ua2V5TmFtZTtcclxuICAgICAgICAgICAgbGV0IG1lbnVEZXRhaWxzOiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgbGV0IHJlZmVyZW5jZTogYW55ID0ge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogbWVudT8ubmFtZSxcclxuICAgICAgICAgICAgICAgIF9pZDogbWVudT8uX2lkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG1lbnUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtZW51Py50ZW1wbGF0ZVRhYnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51RGV0YWlscyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVRhYnM6IHRoaXMuZ2V0VGVtcERldGFpbHMobWVudS50ZW1wbGF0ZVRhYnMpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG9ialttZW51TmFtZV0gPSBtZW51RGV0YWlscztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVudT8uc3VibWVudSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lbnVEZXRhaWxzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1lbnVzOiB0aGlzLmdldE1lbnVEZXRhaWxzKG1lbnUuc3VibWVudSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIG9ialttZW51TmFtZV0gPSBtZW51RGV0YWlscztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5nZXRUZW1wRGV0YWlscyh0YWJzOmFueSl7XHJcbiAgbGV0IG9iajphbnk9e307XHJcbiAgdGFicy5mb3JFYWNoKCh0YWI6YW55KT0+e1xyXG4gICAgaWYodGFiKXtcclxuICAgICAgbGV0IHRhYk5hbWU9dGFiPy5rZXlOYW1lO1xyXG4gICAgICBsZXQgdGFiRGV0YWlscz17XHJcbiAgICAgICAgcmVmZXJlbmNlOntcclxuICAgICAgICAgIG5hbWU6dGFiPy5uYW1lLFxyXG4gICAgICAgICAgX2lkOnRhYj8uX2lkXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhY3RpdmVBbGVydHM6dGhpcy5nZXRBY3RpdmVBbGVydHModGFiKVxyXG4gICAgICB9XHJcbiAgICAgIG9ialt0YWJOYW1lXT10YWJEZXRhaWxzO1xyXG4gICAgfVxyXG4gIH0pXHJcbiAgcmV0dXJuIG9iajtcclxufVxyXG5cclxuZ2V0QWN0aXZlQWxlcnRzKHRhYjphbnkpe1xyXG4gIGxldCBhcnI9W107XHJcbiAgaWYodGFiPy5lbWFpbCl7XHJcbiAgICBhcnIucHVzaCgnRU1BSUwnKTtcclxuICB9XHJcbiAgaWYodGFiPy53aGF0c2FwcCl7XHJcbiAgICBhcnIucHVzaCgnV0hBVFNBUFAnKTtcclxuICB9XHJcbiAgaWYodGFiPy5zbXMpe1xyXG4gICAgYXJyLnB1c2goJ1NNUycpO1xyXG4gIH1cclxuICByZXR1cm4gYXJyO1xyXG59XHJcbiAgLy8gRW5kIEZvciBBUFBcclxuXHJcbn1cclxuIl19
|