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.
Files changed (120) hide show
  1. package/README.md +24 -0
  2. package/esm2020/client-core-services.mjs +5 -0
  3. package/esm2020/lib/my-lib.module.mjs +98 -0
  4. package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
  5. package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
  6. package/esm2020/lib/services/api/api.service.mjs +611 -0
  7. package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
  8. package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
  9. package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
  10. package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
  11. package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
  12. package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
  13. package/esm2020/lib/services/chart/chart.service.mjs +166 -0
  14. package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
  15. package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
  16. package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
  17. package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
  18. package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
  19. package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
  20. package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
  21. package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
  22. package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
  23. package/esm2020/lib/services/download/download.service.mjs +151 -0
  24. package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
  25. package/esm2020/lib/services/env/env.service.mjs +232 -0
  26. package/esm2020/lib/services/env/serverHostList.mjs +56 -0
  27. package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
  28. package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
  29. package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
  30. package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
  31. package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
  32. package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
  33. package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
  34. package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
  35. package/esm2020/lib/services/loader/loader.service.mjs +17 -0
  36. package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
  37. package/esm2020/lib/services/model/model.service.mjs +30 -0
  38. package/esm2020/lib/services/notify/notification.service.mjs +84 -0
  39. package/esm2020/lib/services/operator/operator.service.mjs +58 -0
  40. package/esm2020/lib/services/permission/permission.service.mjs +88 -0
  41. package/esm2020/lib/services/router/router.service.mjs +78 -0
  42. package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
  43. package/esm2020/lib/services/storage/storage.service.mjs +749 -0
  44. package/esm2020/lib/services/tree-component/interface.mjs +6 -0
  45. package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
  46. package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
  47. package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
  48. package/esm2020/lib/shared/configuration/config.mjs +76 -0
  49. package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
  50. package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
  51. package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
  52. package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
  53. package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
  54. package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
  55. package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
  56. package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
  57. package/esm2020/lib/shared/platform.mjs +2 -0
  58. package/esm2020/public-api.mjs +53 -0
  59. package/fesm2015/client-core-services.mjs +15487 -0
  60. package/fesm2015/client-core-services.mjs.map +1 -0
  61. package/fesm2020/client-core-services.mjs +15482 -0
  62. package/fesm2020/client-core-services.mjs.map +1 -0
  63. package/index.d.ts +5 -0
  64. package/lib/my-lib.module.d.ts +18 -0
  65. package/lib/services/api/api-call/api-call.service.d.ts +60 -0
  66. package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
  67. package/lib/services/api/api.service.d.ts +88 -0
  68. package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
  69. package/lib/services/api/auth/auth.service.d.ts +50 -0
  70. package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
  71. package/lib/services/api/common-api/common-api.service.d.ts +22 -0
  72. package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
  73. package/lib/services/api/public-api/public-api.service.d.ts +14 -0
  74. package/lib/services/chart/chart.service.d.ts +21 -0
  75. package/lib/services/check-if/check-if.service.d.ts +50 -0
  76. package/lib/services/common-utils/common-function.service.d.ts +84 -0
  77. package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
  78. package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
  79. package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
  80. package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
  81. package/lib/services/data-share/data-share.service.d.ts +174 -0
  82. package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
  83. package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
  84. package/lib/services/download/download.service.d.ts +35 -0
  85. package/lib/services/encryption/encryption.service.d.ts +8 -0
  86. package/lib/services/env/env.service.d.ts +44 -0
  87. package/lib/services/env/serverHostList.d.ts +9 -0
  88. package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
  89. package/lib/services/form/form-control/form-control.service.d.ts +44 -0
  90. package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
  91. package/lib/services/form/form-value/form-value.service.d.ts +32 -0
  92. package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
  93. package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
  94. package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
  95. package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
  96. package/lib/services/loader/loader.service.d.ts +8 -0
  97. package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
  98. package/lib/services/model/model.service.d.ts +11 -0
  99. package/lib/services/notify/notification.service.d.ts +22 -0
  100. package/lib/services/operator/operator.service.d.ts +27 -0
  101. package/lib/services/permission/permission.service.d.ts +18 -0
  102. package/lib/services/router/router.service.d.ts +14 -0
  103. package/lib/services/storage/cookies.service.d.ts +11 -0
  104. package/lib/services/storage/storage.service.d.ts +132 -0
  105. package/lib/services/tree-component/interface.d.ts +13 -0
  106. package/lib/services/tree-component/tree-component.service.d.ts +38 -0
  107. package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
  108. package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
  109. package/lib/shared/configuration/config.d.ts +144 -0
  110. package/lib/shared/configuration/editor-config.d.ts +72 -0
  111. package/lib/shared/enums/common.enum.d.ts +16 -0
  112. package/lib/shared/enums/config.enum.d.ts +54 -0
  113. package/lib/shared/enums/end-point.enum.d.ts +66 -0
  114. package/lib/shared/enums/flags.enum.d.ts +18 -0
  115. package/lib/shared/enums/keycodes.enum.d.ts +120 -0
  116. package/lib/shared/enums/operator_type.enum.d.ts +9 -0
  117. package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
  118. package/lib/shared/platform.d.ts +1 -0
  119. package/package.json +40 -0
  120. package/public-api.d.ts +49 -0
@@ -0,0 +1,767 @@
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 "../api/api.service";
5
+ import * as i3 from "../data-share/data-share.service";
6
+ import * as i4 from "../common-utils/common-function.service";
7
+ export class UserPrefrenceService {
8
+ constructor(storageService, apiService, dataShareService, commonFunctionService) {
9
+ this.storageService = storageService;
10
+ this.apiService = apiService;
11
+ this.dataShareService = dataShareService;
12
+ this.commonFunctionService = commonFunctionService;
13
+ }
14
+ updateUserPreference(data, fieldName, parent) {
15
+ return new Promise(async (resolve) => {
16
+ try {
17
+ let payloadData;
18
+ switch (fieldName) {
19
+ case 'preferenceMap':
20
+ payloadData = this.modifiedMenuObj(data, fieldName, parent);
21
+ break;
22
+ case 'tab':
23
+ payloadData = this.addOrRemoveTabs(data);
24
+ break;
25
+ case 'preference':
26
+ payloadData = this.saveColumn(data);
27
+ break;
28
+ default:
29
+ payloadData = this.storageService.getUserPreference();
30
+ break;
31
+ }
32
+ const payload = {
33
+ curTemp: 'user_preference',
34
+ data: payloadData,
35
+ };
36
+ this.apiService.SaveFormData(payload);
37
+ resolve({ success: true });
38
+ }
39
+ catch (error) {
40
+ resolve({ success: false });
41
+ }
42
+ });
43
+ }
44
+ addOrRemoveTabs(tab) {
45
+ let menuIndexs = this.dataShareService.getMenuOrSubmenuIndexs();
46
+ let modules = this.storageService.GetModules();
47
+ let extractedMenu = this.extractMenuDetails(tab, modules, menuIndexs);
48
+ // let userPreference = this.updateFavTabs(extractedMenu, tab);
49
+ let userPreference = this.createUserPreference('preferenceMap');
50
+ userPreference['preferenceMap'] = extractedMenu;
51
+ return userPreference;
52
+ }
53
+ // Modifies the user preference object with the provided data
54
+ modifiedMenuObj(data, fieldName, parent) {
55
+ let modifiedMenuObj = this.prepareMenuJson(data, fieldName, parent);
56
+ // let userPreference = this.storageService.getUserPreference();
57
+ // userPreference[fieldName] = this.mergeMenus(userPreference[fieldName],modifiedMenuObj,parent);
58
+ let userPreference = this.createUserPreference(fieldName);
59
+ userPreference[fieldName] = modifiedMenuObj;
60
+ return userPreference;
61
+ }
62
+ // Prepares a menu object from menu items
63
+ prepareMenuJson(menuItems, fieldName, parent) {
64
+ const menu = {};
65
+ const itemsArray = Array.isArray(menuItems) ? menuItems : [menuItems];
66
+ itemsArray.forEach((item) => {
67
+ const moduleName = this.storageService.getModule();
68
+ const menuReference = {
69
+ ...this.commonFunctionService.getReferenceObject(item),
70
+ allSelected: true,
71
+ };
72
+ let menuData;
73
+ // let menus = userPreference[fieldName];
74
+ if (parent) {
75
+ // If parent exists and has a submenu, add the current menu to the existing submenu
76
+ let refObj = {
77
+ favourite: item.favourite,
78
+ reference: {
79
+ ...this.commonFunctionService.getReferenceObject(menuItems),
80
+ allSelected: true,
81
+ },
82
+ };
83
+ let parObjRef = this.commonFunctionService.getReferenceObject(parent);
84
+ menuData = {
85
+ reference: parObjRef,
86
+ favourite: item.favourite,
87
+ submenus: {
88
+ [menuItems.name]: refObj,
89
+ },
90
+ };
91
+ if (moduleName != null) {
92
+ menu[moduleName] = {
93
+ favourite: item.favourite,
94
+ reference: this.getModuleRef(moduleName),
95
+ menus: {
96
+ [parent.name]: menuData
97
+ }
98
+ };
99
+ return menu;
100
+ }
101
+ }
102
+ else {
103
+ menuData = {
104
+ reference: menuReference,
105
+ favourite: item.favourite,
106
+ };
107
+ if (moduleName !== null) {
108
+ menu[moduleName] = {
109
+ reference: this.getModuleRef(moduleName),
110
+ favourite: item.favourite,
111
+ menus: {
112
+ [item.name]: menuData
113
+ }
114
+ };
115
+ return menu;
116
+ }
117
+ }
118
+ });
119
+ return menu;
120
+ }
121
+ //Create UserPreference when not exist
122
+ createUserPreference(fieldName) {
123
+ let uref = {};
124
+ let userRef = this.commonFunctionService.getReferenceObject(this.storageService.GetUserInfo());
125
+ uref['userId'] = userRef;
126
+ //set empty obj for required key
127
+ uref[fieldName] = {};
128
+ return uref;
129
+ }
130
+ //Get Module Reference by Module Name
131
+ getModuleRef(moduleName) {
132
+ let Allmodules = this.storageService.GetModules();
133
+ let module = Allmodules.filter((module) => {
134
+ return module.name == moduleName;
135
+ });
136
+ return this.commonFunctionService.getReferenceObject(module[0]);
137
+ }
138
+ // GetTemplateTabs in current Menu
139
+ getTemplateTabs() {
140
+ const tabsData = this.dataShareService.getTempData();
141
+ const templateTabs = tabsData?.[0]?.templateTabs ?? null;
142
+ return templateTabs;
143
+ }
144
+ // Gets all tab's reference Obj from the provided array of tabs
145
+ getAllTabs(tabs) {
146
+ if (!tabs) {
147
+ return {};
148
+ }
149
+ const allTabs = tabs.reduce((acc, tab) => {
150
+ const tabRef = this.getTabRef(tab);
151
+ if (tabRef && Object.keys(tabRef).length > 0) {
152
+ Object.assign(acc, tabRef);
153
+ }
154
+ return acc;
155
+ }, {});
156
+ return allTabs;
157
+ }
158
+ // Gets only the tab's reference Obj with favourite set to true from the provided array of tabs
159
+ getFebTabs(tabs) {
160
+ if (!tabs) {
161
+ return {};
162
+ }
163
+ return tabs
164
+ .filter((tab) => tab.favourite === true)
165
+ .reduce((acc, tab) => {
166
+ const tabRef = this.getTabRef(tab);
167
+ if (tabRef && Object.keys(tabRef).length > 0) {
168
+ Object.assign(acc, tabRef);
169
+ }
170
+ return acc;
171
+ }, {});
172
+ }
173
+ // Creates a reference object for a tab
174
+ getTabRef(tab, optKey) {
175
+ let res = {};
176
+ if (tab && tab.tab_name != '' && tab.tab_name != null) {
177
+ const tabReference = {
178
+ reference: this.commonFunctionService.getReferenceObject(tab),
179
+ };
180
+ if (optKey != '' && optKey != undefined) {
181
+ tabReference[optKey] = tab.favourite;
182
+ }
183
+ res[tab.tab_name] = tabReference;
184
+ }
185
+ return res;
186
+ }
187
+ // Merges existingMenus with newMenus
188
+ mergeMenus(existingMenus, newMenus, parent) {
189
+ const mergedMenus = { ...existingMenus };
190
+ const checkFeb = this.checkFebMenuAddOrNot(newMenus, parent);
191
+ const newMenukeys = Object.keys(newMenus);
192
+ if (!checkFeb) {
193
+ for (const key in newMenus) {
194
+ if (newMenus.hasOwnProperty(key)) {
195
+ if (mergedMenus.hasOwnProperty(key) &&
196
+ mergedMenus[key].hasOwnProperty('submenus')) {
197
+ // If the key exists and has submenus, merge the submenus
198
+ mergedMenus[key].submenus = {
199
+ ...mergedMenus[key].submenus,
200
+ ...newMenus[key].submenus,
201
+ };
202
+ }
203
+ else {
204
+ // If the key doesn't exist or doesn't have submenus, set submenus to newMenus
205
+ mergedMenus[key] = newMenus[key];
206
+ }
207
+ }
208
+ }
209
+ }
210
+ else {
211
+ for (const key in mergedMenus) {
212
+ if (mergedMenus.hasOwnProperty(key) &&
213
+ mergedMenus[key].hasOwnProperty('submenus')) {
214
+ const existingSubmenus = mergedMenus[key].submenus;
215
+ const newSubmenus = newMenus[key] && newMenus[key].submenus;
216
+ if (existingSubmenus && newSubmenus) {
217
+ for (const submenuKey in newSubmenus) {
218
+ if (newSubmenus.hasOwnProperty(submenuKey)) {
219
+ if (existingSubmenus.hasOwnProperty(submenuKey)) {
220
+ // Remove existing submenus
221
+ delete existingSubmenus[submenuKey];
222
+ }
223
+ else {
224
+ // Add new submenus
225
+ existingSubmenus[submenuKey] = newSubmenus[submenuKey];
226
+ }
227
+ }
228
+ }
229
+ }
230
+ else {
231
+ // If either existing or new submenus are missing, delete the menu
232
+ if (key === newMenukeys[0]) {
233
+ delete mergedMenus[key];
234
+ }
235
+ }
236
+ }
237
+ else {
238
+ if (key === newMenukeys[0] && parent == '') {
239
+ delete mergedMenus[key];
240
+ }
241
+ }
242
+ }
243
+ }
244
+ return this.deleteEmptyMenus(mergedMenus);
245
+ }
246
+ // Deletes empty menus from the provided menus object
247
+ deleteEmptyMenus(menus) {
248
+ const updatedMenus = { ...menus };
249
+ for (const key in updatedMenus) {
250
+ if (updatedMenus.hasOwnProperty(key) &&
251
+ updatedMenus[key].submenus != null) {
252
+ if (Object.keys(updatedMenus[key].submenus).length === 0) {
253
+ // Delete the menu if submenus is empty
254
+ delete updatedMenus[key];
255
+ }
256
+ else {
257
+ let subMenus = updatedMenus[key].submenus;
258
+ for (const subMenuKey in subMenus) {
259
+ // Check templateTabs condition
260
+ const templateTabs = updatedMenus[key]?.submenus[subMenuKey]?.templateTabs;
261
+ if (templateTabs != null &&
262
+ Object.keys(templateTabs).length === 0) {
263
+ // Delete the menu if templateTabs is empty
264
+ delete updatedMenus[key].submenus[subMenuKey];
265
+ }
266
+ }
267
+ }
268
+ }
269
+ else {
270
+ const templateTabs = updatedMenus[key].templateTabs;
271
+ if (templateTabs != null && Object.keys(templateTabs).length === 0) {
272
+ // Delete the menu if templateTabs is empty
273
+ delete updatedMenus[key];
274
+ }
275
+ }
276
+ }
277
+ return updatedMenus;
278
+ }
279
+ // Checks if a menu should be added based on the febMenu condition
280
+ checkFebMenuAddOrNot(menu, parent) {
281
+ let userFebMenu = this.getUserPreferenceByFieldName('preferenceMap');
282
+ if (!menu || typeof menu !== 'object' || Object.keys(menu).length === 0) {
283
+ return false;
284
+ }
285
+ if (parent &&
286
+ (typeof parent !== 'object' || Object.keys(parent).length === 0)) {
287
+ return false;
288
+ }
289
+ let menuId = Object.keys(menu).length > 0
290
+ ? menu[Object.keys(menu)[0]].reference?._id
291
+ : null;
292
+ // Check if parent and parent.reference are defined before accessing _id
293
+ if (parent && parent !== '' && typeof parent === 'object' && userFebMenu) {
294
+ for (const key in menu) {
295
+ if (menu.hasOwnProperty(key)) {
296
+ if (userFebMenu.hasOwnProperty(key) &&
297
+ userFebMenu[key].hasOwnProperty('submenus')) {
298
+ const menuSubmenus = menu[key].submenus;
299
+ for (const submenuKey in menuSubmenus) {
300
+ const submenuId = menuSubmenus[submenuKey].reference?._id;
301
+ if (!this.isIdExist(userFebMenu[key].submenus, submenuId)) {
302
+ return false;
303
+ }
304
+ else
305
+ return true;
306
+ }
307
+ }
308
+ else {
309
+ return false; // Return false if the key is missing or doesn't have submenus in userFebMenu
310
+ }
311
+ }
312
+ }
313
+ }
314
+ if (userFebMenu &&
315
+ userFebMenu !== null &&
316
+ typeof userFebMenu === 'object' &&
317
+ Object.keys(userFebMenu).length > 0) {
318
+ return this.isIdExist(userFebMenu, menuId);
319
+ }
320
+ else {
321
+ return false;
322
+ }
323
+ }
324
+ // Checks if a given ID exists in the provided object
325
+ isIdExist(obj, targetId) {
326
+ for (const key in obj) {
327
+ if (obj.hasOwnProperty(key) &&
328
+ obj[key].reference &&
329
+ obj[key].reference._id === targetId) {
330
+ return true;
331
+ }
332
+ }
333
+ return false;
334
+ }
335
+ // Checks is Menu already present or not - For fabMenu icon
336
+ isMenuAlreadyPresentOrNot(targetMenu, userFebMenu) {
337
+ for (const key in userFebMenu) {
338
+ if (userFebMenu.hasOwnProperty(key)) {
339
+ const menu = userFebMenu[key];
340
+ if (menu.reference && menu.reference._id === targetMenu._id) {
341
+ return true;
342
+ }
343
+ if (menu.submenus) {
344
+ for (const submenuKey in menu.submenus) {
345
+ if (menu.submenus.hasOwnProperty(submenuKey)) {
346
+ const submenu = menu.submenus[submenuKey];
347
+ if (submenu.reference &&
348
+ submenu.reference._id === targetMenu._id) {
349
+ return true;
350
+ }
351
+ }
352
+ }
353
+ }
354
+ }
355
+ }
356
+ return false;
357
+ }
358
+ getUserPreferenceByFieldName(fieldName) {
359
+ let data = [];
360
+ let userPreference = this.storageService.getUserPreference();
361
+ if (userPreference && userPreference[fieldName]) {
362
+ data = userPreference[fieldName];
363
+ }
364
+ return data;
365
+ }
366
+ // Extract the menu and submenu data for tab
367
+ extractMenuDetails(tab, data, indices) {
368
+ const { menuIndex, submenuIndex, moduleIndex } = indices;
369
+ let newMenu = {};
370
+ let tabRef = this.getTabRef(tab, 'favourite');
371
+ let moduleRef = this.commonFunctionService.getReferenceObject(data[moduleIndex]);
372
+ let isFavExist = tab.favourite;
373
+ if (submenuIndex != -1) {
374
+ let submenu = data[moduleIndex]?.['menu_list'][menuIndex]?.['submenu']?.[submenuIndex];
375
+ let parent = data[moduleIndex]?.['menu_list'][menuIndex];
376
+ newMenu[moduleRef.name] = {
377
+ favourite: isFavExist,
378
+ reference: moduleRef,
379
+ menus: {
380
+ [parent.name]: {
381
+ reference: this.commonFunctionService.getReferenceObject(parent),
382
+ favourite: isFavExist,
383
+ submenus: {
384
+ [submenu.name]: {
385
+ favourite: isFavExist,
386
+ reference: {
387
+ ...this.commonFunctionService.getReferenceObject(submenu),
388
+ },
389
+ templateTabs: tabRef,
390
+ },
391
+ }
392
+ },
393
+ }
394
+ };
395
+ }
396
+ else {
397
+ let menu = data[moduleIndex]?.['menu_list'][menuIndex];
398
+ newMenu[moduleRef.name] = {
399
+ favourite: isFavExist,
400
+ reference: moduleRef,
401
+ menus: {
402
+ [menu.name]: {
403
+ favourite: isFavExist,
404
+ reference: { ...this.commonFunctionService.getReferenceObject(menu) },
405
+ templateTabs: tabRef,
406
+ }
407
+ }
408
+ };
409
+ }
410
+ return newMenu;
411
+ }
412
+ //update tabs
413
+ updateFavTabs(newMenus, tab) {
414
+ let existingUserPreferences = this.storageService.getUserPreference();
415
+ if (!existingUserPreferences) {
416
+ existingUserPreferences = this.createUserPreference('preferenceMap');
417
+ }
418
+ let existingMenus = existingUserPreferences['preferenceMap'];
419
+ let updatedMenus = { ...existingMenus };
420
+ let favExist = !tab.favourite;
421
+ if (!favExist) {
422
+ for (let menuName in newMenus) {
423
+ if (newMenus.hasOwnProperty(menuName)) {
424
+ let newMenu = newMenus[menuName];
425
+ if (existingMenus.hasOwnProperty(menuName)) {
426
+ let existingMenu = existingMenus[menuName];
427
+ existingMenu.reference = newMenu.reference;
428
+ if (!existingMenu.submenus) {
429
+ if (existingMenu.templateTabs && newMenu.templateTabs) {
430
+ delete existingMenu.templateTabs[tab.tab_name];
431
+ if (existingMenu.submenus && newMenu.submenus) {
432
+ existingMenu.templateTabs = {
433
+ ...existingMenu.templateTabs,
434
+ ...newMenu.templateTabs,
435
+ };
436
+ }
437
+ else {
438
+ existingMenu.templateTabs = {
439
+ ...existingMenu.templateTabs,
440
+ ...newMenu.templateTabs,
441
+ };
442
+ }
443
+ }
444
+ }
445
+ else {
446
+ for (let subMenuKey in newMenu.submenus) {
447
+ if (newMenu.submenus.hasOwnProperty(subMenuKey)) {
448
+ let newSubMenu = newMenu.submenus[subMenuKey];
449
+ if (existingMenu.submenus.hasOwnProperty(subMenuKey)) {
450
+ let existingSubMenu = existingMenu.submenus[subMenuKey];
451
+ existingSubMenu.reference = newSubMenu.reference;
452
+ if (existingSubMenu.templateTabs &&
453
+ newSubMenu.templateTabs) {
454
+ existingSubMenu.templateTabs = {
455
+ ...existingSubMenu.templateTabs,
456
+ ...newSubMenu.templateTabs,
457
+ };
458
+ }
459
+ else {
460
+ existingSubMenu.templateTabs = newSubMenu.templateTabs;
461
+ }
462
+ }
463
+ else {
464
+ existingMenu.submenus[subMenuKey] = { ...newSubMenu };
465
+ }
466
+ }
467
+ }
468
+ }
469
+ }
470
+ else {
471
+ updatedMenus[menuName] = { ...newMenu };
472
+ }
473
+ }
474
+ }
475
+ }
476
+ else {
477
+ for (let menuName in existingMenus) {
478
+ if (newMenus.hasOwnProperty(menuName)) {
479
+ let newMenu = newMenus[menuName];
480
+ let existingMenu = existingMenus[menuName];
481
+ if (!existingMenu.submenus) {
482
+ existingMenu.reference = newMenu?.reference;
483
+ const favTabs = this.getFebTabs(this.getTemplateTabs());
484
+ existingMenu["templateTabs"] = favTabs;
485
+ if (existingMenu.templateTabs &&
486
+ existingMenu.templateTabs[tab.tab_name]) {
487
+ delete existingMenu.templateTabs[tab.tab_name];
488
+ }
489
+ }
490
+ else {
491
+ for (let subMenuKey in existingMenu.submenus) {
492
+ if (newMenu.submenus.hasOwnProperty(subMenuKey)) {
493
+ let existingSubMenu = existingMenu.submenus[subMenuKey];
494
+ const favTabs = this.getFebTabs(this.getTemplateTabs());
495
+ existingSubMenu["templateTabs"] = favTabs;
496
+ existingSubMenu.reference = newMenu?.submenus[subMenuKey]?.reference;
497
+ if (existingSubMenu.templateTabs &&
498
+ existingSubMenu.templateTabs[tab.tab_name]) {
499
+ delete existingSubMenu.templateTabs[tab.tab_name];
500
+ }
501
+ }
502
+ }
503
+ }
504
+ }
505
+ }
506
+ }
507
+ updatedMenus = this.deleteEmptyMenus(updatedMenus);
508
+ existingUserPreferences['preferenceMap'] = updatedMenus;
509
+ return existingUserPreferences;
510
+ }
511
+ // Check the tab id in local USER_PREF
512
+ checkFebTabAddOrNot(tab) {
513
+ const menus = this.storageService.getUserPreference()?.['preferenceMap'] || {};
514
+ return this.isIdExistInTemplateTabs(menus, tab._id);
515
+ }
516
+ isIdExistInTemplateTabs(obj, targetId) {
517
+ for (const key in obj) {
518
+ if (obj.hasOwnProperty(key)) {
519
+ const value = obj[key];
520
+ if (value && typeof value === 'object') {
521
+ // Recursively search in nested objects
522
+ if (this.isIdExistInTemplateTabs(value, targetId)) {
523
+ return true;
524
+ }
525
+ }
526
+ else if (key === '_id' && value === targetId) {
527
+ return true;
528
+ }
529
+ }
530
+ }
531
+ return false;
532
+ }
533
+ getUserPreferenceObj(data, fieldName, parent) {
534
+ let refObj = this.commonFunctionService.getReferenceObject(data);
535
+ if (parent != '') {
536
+ refObj = parent;
537
+ }
538
+ if (fieldName == "favoriteMenus") {
539
+ refObj = data;
540
+ }
541
+ let uRef = {};
542
+ let userPreference = this.storageService.getUserPreference();
543
+ if (userPreference && userPreference._id && userPreference._id != null && userPreference._id != '') {
544
+ let fieldData = userPreference[fieldName];
545
+ if (fieldData && fieldData.length > 0) {
546
+ let matchIndex = -1;
547
+ for (let index = 0; index < fieldData.length; index++) {
548
+ const element = fieldData[index];
549
+ if (element._id == refObj._id) {
550
+ matchIndex = index;
551
+ break;
552
+ }
553
+ }
554
+ if (matchIndex > -1) {
555
+ if (parent != '') {
556
+ let submenu = fieldData[matchIndex].submenu;
557
+ let submenuMatchIndex = -1;
558
+ if (submenu && submenu.length > 0) {
559
+ for (let j = 0; j < submenu.length; j++) {
560
+ const subMenu = submenu[j];
561
+ if (subMenu._id == data._id) {
562
+ submenuMatchIndex = j;
563
+ break;
564
+ }
565
+ }
566
+ }
567
+ if (submenuMatchIndex > -1) {
568
+ submenu.splice(submenuMatchIndex);
569
+ if (fieldData[matchIndex].submenu.length == 0) {
570
+ fieldData.splice(matchIndex);
571
+ }
572
+ else {
573
+ fieldData[matchIndex].submenu = submenu;
574
+ }
575
+ }
576
+ else {
577
+ if (submenu.length > 0) {
578
+ fieldData[matchIndex].submenu.push(data);
579
+ }
580
+ else {
581
+ fieldData[matchIndex].submenu = [];
582
+ fieldData[matchIndex].submenu.push(data);
583
+ }
584
+ }
585
+ }
586
+ else {
587
+ fieldData.splice(matchIndex, 1);
588
+ }
589
+ }
590
+ else {
591
+ if (parent != '') {
592
+ refObj['submenu'] = [];
593
+ refObj['submenu'].push(data);
594
+ fieldData.push(refObj);
595
+ }
596
+ else {
597
+ fieldData.push(refObj);
598
+ }
599
+ }
600
+ }
601
+ else {
602
+ fieldData = [];
603
+ fieldData.push(refObj);
604
+ }
605
+ userPreference[fieldName] = fieldData;
606
+ uRef = userPreference;
607
+ }
608
+ else {
609
+ let user = this.storageService.GetUserInfo();
610
+ let userRef = this.commonFunctionService.getReferenceObject(user);
611
+ let dataList = [];
612
+ dataList.push(refObj);
613
+ uRef['userId'] = userRef;
614
+ uRef[fieldName] = dataList;
615
+ }
616
+ return uRef;
617
+ }
618
+ saveColumn(data) {
619
+ let { columns, form, formTable } = data;
620
+ const checkedFields = columns.filter((col) => col.display == true);
621
+ let { menuIndex, submenuIndex, moduleIndex } = this.dataShareService.getMenuOrSubmenuIndexs();
622
+ const allModuleData = this.storageService.GetModules();
623
+ let selectedModule = allModuleData[moduleIndex];
624
+ let selectedMenu = allModuleData[moduleIndex]?.["menu_list"][menuIndex];
625
+ let selectedSubMenu = null;
626
+ let allTempleteTabs = this.dataShareService.getTempData()[0]?.["templateTabs"];
627
+ let activeMenu = this.storageService.GetActiveMenu(); ///get active tab
628
+ let selectedTab = allTempleteTabs?.find((tab) => tab.tab_name == activeMenu?.name);
629
+ let selectedGrid = selectedTab.grid;
630
+ if (submenuIndex != -1) {
631
+ selectedSubMenu = allModuleData[moduleIndex]?.["menu_list"][menuIndex]?.["submenu"][submenuIndex];
632
+ }
633
+ let forms;
634
+ let grids;
635
+ if (form && formTable) {
636
+ selectedGrid = formTable.grid;
637
+ forms = {
638
+ [form["name"]]: {
639
+ reference: this.commonFunctionService.getReferenceObject(form),
640
+ grids: {
641
+ [selectedGrid["name"]]: {
642
+ reference: this.commonFunctionService.getReferenceObject(selectedGrid),
643
+ "fields": checkedFields.map((col) => {
644
+ return { field_name: col.field_name,
645
+ };
646
+ })
647
+ }
648
+ }
649
+ }
650
+ };
651
+ }
652
+ else {
653
+ grids = {
654
+ [selectedGrid["name"]]: {
655
+ reference: this.commonFunctionService.getReferenceObject(selectedGrid),
656
+ "fields": checkedFields.map((col) => {
657
+ return { field_name: col.field_name,
658
+ };
659
+ })
660
+ }
661
+ };
662
+ }
663
+ let preference;
664
+ let templateTabs = {
665
+ [selectedTab["tab_name"]]: {
666
+ reference: {
667
+ _id: selectedTab["_id"],
668
+ name: selectedTab["tab_name"]
669
+ },
670
+ ...(form && { forms }),
671
+ ...(form == undefined && { grids })
672
+ }
673
+ };
674
+ if (submenuIndex != -1) {
675
+ preference = {
676
+ [selectedModule["name"]]: {
677
+ reference: this.commonFunctionService.getReferenceObject(selectedModule),
678
+ menus: {
679
+ [selectedMenu["name"]]: {
680
+ reference: this.commonFunctionService.getReferenceObject(selectedMenu),
681
+ submenus: {
682
+ [selectedSubMenu["name"]]: {
683
+ reference: this.commonFunctionService.getReferenceObject(selectedSubMenu),
684
+ templateTabs,
685
+ }
686
+ }
687
+ }
688
+ }
689
+ }
690
+ };
691
+ }
692
+ else {
693
+ preference = {
694
+ [selectedModule["name"]]: {
695
+ reference: this.commonFunctionService.getReferenceObject(selectedModule),
696
+ menus: {
697
+ [selectedMenu["name"]]: {
698
+ reference: this.commonFunctionService.getReferenceObject(selectedMenu),
699
+ templateTabs: {
700
+ [selectedTab["tab_name"]]: {
701
+ reference: {
702
+ _id: selectedTab["_id"],
703
+ name: selectedTab["tab_name"]
704
+ },
705
+ ...(form && { forms }),
706
+ ...(form == undefined && { grids })
707
+ }
708
+ }
709
+ }
710
+ }
711
+ }
712
+ };
713
+ }
714
+ let userRef = this.commonFunctionService.getReferenceObject(this.storageService.GetUserInfo());
715
+ let payload = {
716
+ preferenceMap: preference,
717
+ userId: userRef
718
+ };
719
+ return payload;
720
+ }
721
+ addHideKeyInExistingTab(columns, fId, fieldName) {
722
+ let tabName = this.storageService.GetActiveMenu().name;
723
+ let template = this.dataShareService.getTempData();
724
+ let tabs = template[0].templateTabs;
725
+ let selectTabIndex = this.commonFunctionService.getIndexInArrayById(tabs, tabName, 'tab_name');
726
+ let tab = tabs[selectTabIndex];
727
+ let grid = tab.grid;
728
+ let gridColumns = grid.gridColumns;
729
+ if (fId && fieldName) {
730
+ let forms = tab.forms;
731
+ if (typeof forms == 'object' && Object.keys(forms).length > 0) {
732
+ Object.keys(forms).forEach((key) => {
733
+ let form = forms[key];
734
+ if (form._id == fId) {
735
+ let formFields = form.tableFields;
736
+ formFields.forEach((field) => {
737
+ if (field.field_name == fieldName) {
738
+ if (field.gridColumns && field.gridColumns.length > 0) {
739
+ gridColumns = field.gridColumns;
740
+ }
741
+ }
742
+ });
743
+ }
744
+ });
745
+ }
746
+ }
747
+ if (gridColumns && gridColumns.length > 0 && columns.length > 0) {
748
+ columns.forEach((col, index) => {
749
+ if (col.display) {
750
+ gridColumns[index]['hide'] = false;
751
+ }
752
+ else {
753
+ gridColumns[index]['hide'] = true;
754
+ }
755
+ });
756
+ }
757
+ }
758
+ }
759
+ UserPrefrenceService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserPrefrenceService, deps: [{ token: i1.StorageService }, { token: i2.ApiService }, { token: i3.DataShareService }, { token: i4.CommonFunctionService }], target: i0.ɵɵFactoryTarget.Injectable });
760
+ UserPrefrenceService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserPrefrenceService, providedIn: 'root' });
761
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserPrefrenceService, decorators: [{
762
+ type: Injectable,
763
+ args: [{
764
+ providedIn: 'root',
765
+ }]
766
+ }], ctorParameters: function () { return [{ type: i1.StorageService }, { type: i2.ApiService }, { type: i3.DataShareService }, { type: i4.CommonFunctionService }]; } });
767
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1wcmVmcmVuY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZXMvdXNlclByZWZyZW5jZS91c2VyLXByZWZyZW5jZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQVMzQyxNQUFNLE9BQU8sb0JBQW9CO0lBQy9CLFlBQ1UsY0FBOEIsRUFDOUIsVUFBc0IsRUFDdEIsZ0JBQWtDLEVBQ2xDLHFCQUE0QztRQUg1QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7SUFDbkQsQ0FBQztJQUVKLG9CQUFvQixDQUFDLElBQVksRUFBRSxTQUFpQixFQUFFLE1BQWU7UUFDbkUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDbkMsSUFBSTtnQkFDRixJQUFJLFdBQVcsQ0FBQztnQkFFaEIsUUFBUSxTQUFTLEVBQUU7b0JBQ2pCLEtBQUssZUFBZTt3QkFDbEIsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQzt3QkFDNUQsTUFBTTtvQkFDUixLQUFLLEtBQUs7d0JBQ1IsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3pDLE1BQU07b0JBQ1IsS0FBSyxZQUFZO3dCQUNmLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNwQyxNQUFNO29CQUNSO3dCQUNFLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGlC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QUMsQ0FBQTthQUNIO1NBQ0Y7UUFDRCxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBQztZQUMxRCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBTyxFQUFDLEtBQVMsRUFBQyxFQUFFO2dCQUNuQyxJQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUM7b0JBQ2IsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFDLEtBQUssQ0FBQztpQkFFbEM7cUJBQ0c7b0JBQ0YsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFDLElBQUksQ0FBQztpQkFFakM7WUFDSCxDQUFDLENBQUMsQ0FBQTtTQUNIO0lBQ0gsQ0FBQzs7a0hBaHhCUSxvQkFBb0I7c0hBQXBCLG9CQUFvQixjQUZuQixNQUFNOzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vc3RvcmFnZS9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2FwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGF0YVNoYXJlU2VydmljZSB9IGZyb20gJy4uL2RhdGEtc2hhcmUvZGF0YS1zaGFyZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tbW9uRnVuY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uLXV0aWxzL2NvbW1vbi1mdW5jdGlvbi5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVc2VyUHJlZnJlbmNlU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgZGF0YVNoYXJlU2VydmljZTogRGF0YVNoYXJlU2VydmljZSxcclxuICAgIHByaXZhdGUgY29tbW9uRnVuY3Rpb25TZXJ2aWNlOiBDb21tb25GdW5jdGlvblNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIHVwZGF0ZVVzZXJQcmVmZXJlbmNlKGRhdGE6IG9iamVjdCwgZmllbGROYW1lOiBzdHJpbmcsIHBhcmVudD86IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuIH0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCBwYXlsb2FkRGF0YTtcclxuICBcclxuICAgICAgICBzd2l0Y2ggKGZpZWxkTmFtZSkge1xyXG4gICAgICAgICAgY2FzZSAncHJlZmVyZW5jZU1hcCc6XHJcbiAgICAgICAgICAgIHBheWxvYWREYXRhID0gdGhpcy5tb2RpZmllZE1lbnVPYmooZGF0YSwgZmllbGROYW1lLCBwYXJlbnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ3RhYic6XHJcbiAgICAgICAgICAgIHBheWxvYWREYXRhID0gdGhpcy5hZGRPclJlbW92ZVRhYnMoZGF0YSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAncHJlZmVyZW5jZSc6XHJcbiAgICAgICAgICAgIHBheWxvYWREYXRhID0gdGhpcy5zYXZlQ29sdW1uKGRhdGEpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHBheWxvYWREYXRhID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyUHJlZmVyZW5jZSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgICAgIGN1clRlbXA6ICd1c2VyX3ByZWZlcmVuY2UnLFxyXG4gICAgICAgICAgZGF0YTogcGF5bG9hZERhdGEsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmFwaVNlcnZpY2UuU2F2ZUZvcm1EYXRhKHBheWxvYWQpO1xyXG5cclxuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogdHJ1ZSB9KTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH0gXHJcblxyXG4gIGFkZE9yUmVtb3ZlVGFicyh0YWI6IGFueSkge1xyXG4gICAgbGV0IG1lbnVJbmRleHMgPSB0aGlzLmRhdGFTaGFyZVNlcnZpY2UuZ2V0TWVudU9yU3VibWVudUluZGV4cygpO1xyXG4gICAgbGV0IG1vZHVsZXMgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLkdldE1vZHVsZXMoKTtcclxuICAgIGxldCBleHRyYWN0ZWRNZW51ID0gdGhpcy5leHRyYWN0TWVudURldGFpbHModGFiLCBtb2R1bGVzLCBtZW51SW5kZXhzKTtcclxuICAgIC8vIGxldCB1c2VyUHJlZmVyZW5jZSA9IHRoaXMudXBkYXRlRmF2VGFicyhleHRyYWN0ZWRNZW51LCB0YWIpO1xyXG4gICAgbGV0IHVzZXJQcmVmZXJlbmNlID0gdGhpcy5jcmVhdGVVc2VyUHJlZmVyZW5jZSgncHJlZmVyZW5jZU1hcCcpXHJcbiAgICB1c2VyUHJlZmVyZW5jZVsncHJlZmVyZW5jZU1hcCddID0gZXh0cmFjdGVkTWVudTtcclxuICAgIHJldHVybiB1c2VyUHJlZmVyZW5jZTtcclxuICB9XHJcbiAgLy8gTW9kaWZpZXMgdGhlIHVzZXIgcHJlZmVyZW5jZSBvYmplY3Qgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YVxyXG4gIG1vZGlmaWVkTWVudU9iaihkYXRhOiBhbnksIGZpZWxkTmFtZTogc3RyaW5nLCBwYXJlbnQ/OiBzdHJpbmcpIHtcclxuICAgIGxldCBtb2RpZmllZE1lbnVPYmogPSB0aGlzLnByZXBhcmVNZW51SnNvbihkYXRhLCBmaWVsZE5hbWUsIHBhcmVudCk7XHJcbiAgICAvLyBsZXQgdXNlclByZWZlcmVuY2UgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJQcmVmZXJlbmNlKCk7XHJcbiAgICAvLyB1c2VyUHJlZmVyZW5jZVtmaWVsZE5hbWVdID0gdGhpcy5tZXJnZU1lbnVzKHVzZXJQcmVmZXJlbmNlW2ZpZWxkTmFtZV0sbW9kaWZpZWRNZW51T2JqLHBhcmVudCk7XHJcbiAgICBsZXQgdXNlclByZWZlcmVuY2UgPSAgdGhpcy5jcmVhdGVVc2VyUHJlZmVyZW5jZShmaWVsZE5hbWUpO1xyXG4gICAgdXNlclByZWZlcmVuY2VbZmllbGROYW1lXSA9IG1vZGlmaWVkTWVudU9iajtcclxuICAgIHJldHVybiB1c2VyUHJlZmVyZW5jZTtcclxuICB9XHJcbiAgLy8gUHJlcGFyZXMgYSBtZW51IG9iamVjdCBmcm9tIG1lbnUgaXRlbXNcclxuICBwcmVwYXJlTWVudUpzb24obWVudUl0ZW1zOiBhbnksIGZpZWxkTmFtZTogc3RyaW5nLCBwYXJlbnQ/OiBhbnkpIHtcclxuICAgIGNvbnN0IG1lbnU6IGFueSA9IHt9O1xyXG4gICAgY29uc3QgaXRlbXNBcnJheSA9IEFycmF5LmlzQXJyYXkobWVudUl0ZW1zKSA/IG1lbnVJdGVtcyA6IFttZW51SXRlbXNdO1xyXG4gICAgaXRlbXNBcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vZHVsZU5hbWU6c3RyaW5nIHwgbnVsbCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0TW9kdWxlKCk7XHJcbiAgICAgIGNvbnN0IG1lbnVSZWZlcmVuY2UgPSB7XHJcbiAgICAgICAgLi4udGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KGl0ZW0pLFxyXG4gICAgICAgIGFsbFNlbGVjdGVkOiB0cnVlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgbGV0IG1lbnVEYXRhOiBhbnk7XHJcbiAgICAgIC8vIGxldCBtZW51cyA9IHVzZXJQcmVmZXJlbmNlW2ZpZWxkTmFtZV07XHJcbiAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAvLyBJZiBwYXJlbnQgZXhpc3RzIGFuZCBoYXMgYSBzdWJtZW51LCBhZGQgdGhlIGN1cnJlbnQgbWVudSB0byB0aGUgZXhpc3Rpbmcgc3VibWVudVxyXG4gICAgICAgIGxldCByZWZPYmo6IGFueSA9IHtcclxuICAgICAgICAgIGZhdm91cml0ZTogaXRlbS5mYXZvdXJpdGUsXHJcbiAgICAgICAgICByZWZlcmVuY2U6IHtcclxuICAgICAgICAgICAgLi4udGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KG1lbnVJdGVtcyksXHJcbiAgICAgICAgICAgIGFsbFNlbGVjdGVkOiB0cnVlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGxldCBwYXJPYmpSZWY6IGFueSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldFJlZmVyZW5jZU9iamVjdChwYXJlbnQpO1xyXG4gICAgICAgIG1lbnVEYXRhID0ge1xyXG4gICAgICAgICAgcmVmZXJlbmNlOiBwYXJPYmpSZWYsXHJcbiAgICAgICAgICBmYXZvdXJpdGU6IGl0ZW0uZmF2b3VyaXRlLFxyXG4gICAgICAgICAgc3VibWVudXM6IHtcclxuICAgICAgICAgICAgW21lbnVJdGVtcy5uYW1lXTogcmVmT2JqLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmKG1vZHVsZU5hbWUhPW51bGwpe1xyXG4gICAgICAgICAgbWVudVttb2R1bGVOYW1lXT17XHJcbiAgICAgICAgICAgIGZhdm91cml0ZTogaXRlbS5mYXZvdXJpdGUsXHJcbiAgICAgICAgICAgIHJlZmVyZW5jZSA6IHRoaXMuZ2V0TW9kdWxlUmVmKG1vZHVsZU5hbWUpLFxyXG4gICAgICAgICAgICBtZW51czp7XHJcbiAgICAgICAgICAgICAgW3BhcmVudC5uYW1lXSA6IG1lbnVEYXRhXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBtZW51O1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtZW51RGF0YSA9IHtcclxuICAgICAgICAgIHJlZmVyZW5jZTogbWVudVJlZmVyZW5jZSxcclxuICAgICAgICAgIGZhdm91cml0ZTogaXRlbS5mYXZvdXJpdGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZihtb2R1bGVOYW1lIT09IG51bGwpe1xyXG4gICAgICAgICAgbWVudVttb2R1bGVOYW1lXT17XHJcbiAgICAgICAgICAgIHJlZmVyZW5jZSA6IHRoaXMuZ2V0TW9kdWxlUmVmKG1vZHVsZU5hbWUpLFxyXG4gICAgICAgICAgICBmYXZvdXJpdGU6IGl0ZW0uZmF2b3VyaXRlLFxyXG4gICAgICAgICAgICBtZW51czp7XHJcbiAgICAgICAgICAgICAgW2l0ZW0ubmFtZV0gOiBtZW51RGF0YVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gbWVudTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG1lbnU7XHJcbiAgfVxyXG4gIC8vQ3JlYXRlIFVzZXJQcmVmZXJlbmNlIHdoZW4gbm90IGV4aXN0XHJcbiAgY3JlYXRlVXNlclByZWZlcmVuY2UoZmllbGROYW1lOnN0cmluZyl7XHJcbiAgICBsZXQgdXJlZjogYW55ID0ge307XHJcbiAgICBsZXQgdXNlclJlZiA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldFJlZmVyZW5jZU9iamVjdChcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5HZXRVc2VySW5mbygpXHJcbiAgICApO1xyXG4gICAgdXJlZlsndXNlcklkJ10gPSB1c2VyUmVmO1xyXG4gICAgLy9zZXQgZW1wdHkgb2JqIGZvciByZXF1aXJlZCBrZXlcclxuICAgIHVyZWZbZmllbGROYW1lXSA9IHt9XHJcbiAgICByZXR1cm4gdXJlZjtcclxuICB9XHJcbiAgLy9HZXQgTW9kdWxlIFJlZmVyZW5jZSBieSBNb2R1bGUgTmFtZVxyXG4gIGdldE1vZHVsZVJlZihtb2R1bGVOYW1lOmFueSl7XHJcbiAgICBsZXQgQWxsbW9kdWxlcyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuR2V0TW9kdWxlcygpO1xyXG4gICAgbGV0IG1vZHVsZSA9IEFsbG1vZHVsZXMuZmlsdGVyKChtb2R1bGU6YW55KT0+e1xyXG4gICAgICByZXR1cm4gbW9kdWxlLm5hbWUgPT0gbW9kdWxlTmFtZTtcclxuICAgIH0pXHJcbiAgICByZXR1cm4gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KG1vZHVsZVswXSk7XHJcbiAgfVxyXG5cclxuICAvLyBHZXRUZW1wbGF0ZVRhYnMgaW4gY3VycmVudCBNZW51XHJcbiAgZ2V0VGVtcGxhdGVUYWJzKCl7XHJcbiAgICBjb25zdCB0YWJzRGF0YSA9IHRoaXMuZGF0YVNoYXJlU2VydmljZS5nZXRUZW1wRGF0YSgpO1xyXG4gICAgY29uc3QgdGVtcGxhdGVUYWJzID0gdGFic0RhdGE/LlswXT8udGVtcGxhdGVUYWJzID8/IG51bGw7XHJcbiAgICByZXR1cm4gdGVtcGxhdGVUYWJzO1xyXG4gIH1cclxuICAvLyBHZXRzIGFsbCB0YWIncyByZWZlcmVuY2UgT2JqIGZyb20gdGhlIHByb3ZpZGVkIGFycmF5IG9mIHRhYnNcclxuICBnZXRBbGxUYWJzKHRhYnM6IGFueSkge1xyXG4gICAgaWYgKCF0YWJzKSB7XHJcbiAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuICAgIGNvbnN0IGFsbFRhYnMgPSB0YWJzLnJlZHVjZSgoYWNjOiBhbnksIHRhYjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhYlJlZiA9IHRoaXMuZ2V0VGFiUmVmKHRhYik7XHJcbiAgICAgIGlmICh0YWJSZWYgJiYgT2JqZWN0LmtleXModGFiUmVmKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhY2MsIHRhYlJlZik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIHt9KTtcclxuXHJcbiAgICByZXR1cm4gYWxsVGFicztcclxuICB9XHJcbiAgIC8vIEdldHMgb25seSB0aGUgdGFiJ3MgcmVmZXJlbmNlIE9iaiB3aXRoIGZhdm91cml0ZSBzZXQgdG8gdHJ1ZSBmcm9tIHRoZSBwcm92aWRlZCBhcnJheSBvZiB0YWJzXHJcbiAgIGdldEZlYlRhYnModGFiczogYW55KSB7XHJcbiAgICBpZiAoIXRhYnMpIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhYnNcclxuICAgIC5maWx0ZXIoKHRhYjogYW55KSA9PiB0YWIuZmF2b3VyaXRlID09PSB0cnVlKVxyXG4gICAgLnJlZHVjZSgoYWNjOiBhbnksIHRhYjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhYlJlZiA9IHRoaXMuZ2V0VGFiUmVmKHRhYik7XHJcbiAgICAgIGlmICh0YWJSZWYgJiYgT2JqZWN0LmtleXModGFiUmVmKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhY2MsIHRhYlJlZik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIHt9KTtcclxuICB9XHJcbiAgLy8gQ3JlYXRlcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIGEgdGFiXHJcbiAgZ2V0VGFiUmVmKHRhYjogYW55LG9wdEtleT86c3RyaW5nKSB7XHJcbiAgICBsZXQgcmVzOiBhbnkgPSB7fTtcclxuICAgIGlmICh0YWIgJiYgdGFiLnRhYl9uYW1lICE9ICcnICYmIHRhYi50YWJfbmFtZSAhPSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IHRhYlJlZmVyZW5jZTphbnkgPSB7XHJcbiAgICAgICAgcmVmZXJlbmNlOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3QodGFiKSxcclxuICAgICAgfTtcclxuICAgICAgaWYob3B0S2V5IT0gJycgJiYgb3B0S2V5IT0gdW5kZWZpbmVkKXtcclxuICAgICAgICB0YWJSZWZlcmVuY2Vbb3B0S2V5XSA9IHRhYi5mYXZvdXJpdGU7XHJcbiAgICAgIH1cclxuICAgICAgcmVzW3RhYi50YWJfbmFtZV0gPSB0YWJSZWZlcmVuY2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuICAvLyBNZXJnZXMgZXhpc3RpbmdNZW51cyB3aXRoIG5ld01lbnVzXHJcbiAgbWVyZ2VNZW51cyhleGlzdGluZ01lbnVzOiBhbnksIG5ld01lbnVzOiBhbnksIHBhcmVudDogYW55KSB7XHJcbiAgICBjb25zdCBtZXJnZWRNZW51czogYW55ID0geyAuLi5leGlzdGluZ01lbnVzIH07XHJcbiAgICBjb25zdCBjaGVja0ZlYiA9IHRoaXMuY2hlY2tGZWJNZW51QWRkT3JOb3QobmV3TWVudXMsIHBhcmVudCk7XHJcbiAgICBjb25zdCBuZXdNZW51a2V5cyA9IE9iamVjdC5rZXlzKG5ld01lbnVzKTtcclxuICAgIGlmICghY2hlY2tGZWIpIHtcclxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbmV3TWVudXMpIHtcclxuICAgICAgICBpZiAobmV3TWVudXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBtZXJnZWRNZW51cy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmXHJcbiAgICAgICAgICAgIG1lcmdlZE1lbnVzW2tleV0uaGFzT3duUHJvcGVydHkoJ3N1Ym1lbnVzJylcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUga2V5IGV4aXN0cyBhbmQgaGFzIHN1Ym1lbnVzLCBtZXJnZSB0aGUgc3VibWVudXNcclxuICAgICAgICAgICAgbWVyZ2VkTWVudXNba2V5XS5zdWJtZW51cyA9IHtcclxuICAgICAgICAgICAgICAuLi5tZXJnZWRNZW51c1trZXldLnN1Ym1lbnVzLFxyXG4gICAgICAgICAgICAgIC4uLm5ld01lbnVzW2tleV0uc3VibWVudXMsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3Qgb3IgZG9lc24ndCBoYXZlIHN1Ym1lbnVzLCBzZXQgc3VibWVudXMgdG8gbmV3TWVudXNcclxuICAgICAgICAgICAgbWVyZ2VkTWVudXNba2V5XSA9IG5ld01lbnVzW2tleV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBtZXJnZWRNZW51cykge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIG1lcmdlZE1lbnVzLmhhc093blByb3BlcnR5KGtleSkgJiZcclxuICAgICAgICAgIG1lcmdlZE1lbnVzW2tleV0uaGFzT3duUHJvcGVydHkoJ3N1Ym1lbnVzJylcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nU3VibWVudXMgPSBtZXJnZWRNZW51c1trZXldLnN1Ym1lbnVzO1xyXG4gICAgICAgICAgY29uc3QgbmV3U3VibWVudXMgPSBuZXdNZW51c1trZXldICYmIG5ld01lbnVzW2tleV0uc3VibWVudXM7XHJcblxyXG4gICAgICAgICAgaWYgKGV4aXN0aW5nU3VibWVudXMgJiYgbmV3U3VibWVudXMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJtZW51S2V5IGluIG5ld1N1Ym1lbnVzKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5ld1N1Ym1lbnVzLmhhc093blByb3BlcnR5KHN1Ym1lbnVLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdTdWJtZW51cy5oYXNPd25Qcm9wZXJ0eShzdWJtZW51S2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZXhpc3Rpbmcgc3VibWVudXNcclxuICAgICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nU3VibWVudXNbc3VibWVudUtleV07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAvLyBBZGQgbmV3IHN1Ym1lbnVzXHJcbiAgICAgICAgICAgICAgICAgIGV4aXN0aW5nU3VibWVudXNbc3VibWVudUtleV0gPSBuZXdTdWJtZW51c1tzdWJtZW51S2V5XTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIElmIGVpdGhlciBleGlzdGluZyBvciBuZXcgc3VibWVudXMgYXJlIG1pc3NpbmcsIGRlbGV0ZSB0aGUgbWVudVxyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBuZXdNZW51a2V5c1swXSkge1xyXG4gICAgICAgICAgICAgIGRlbGV0ZSBtZXJnZWRNZW51c1trZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChrZXkgPT09IG5ld01lbnVrZXlzWzBdICYmIHBhcmVudCA9PSAnJykge1xyXG4gICAgICAgICAgICBkZWxldGUgbWVyZ2VkTWVudXNba2V5XTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmRlbGV0ZUVtcHR5TWVudXMobWVyZ2VkTWVudXMpO1xyXG4gIH1cclxuICAvLyBEZWxldGVzIGVtcHR5IG1lbnVzIGZyb20gdGhlIHByb3ZpZGVkIG1lbnVzIG9iamVjdFxyXG4gIGRlbGV0ZUVtcHR5TWVudXMobWVudXM6IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCB1cGRhdGVkTWVudXM6IGFueSA9IHsgLi4ubWVudXMgfTtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZWRNZW51cykge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdXBkYXRlZE1lbnVzLmhhc093blByb3BlcnR5KGtleSkgJiZcclxuICAgICAgICB1cGRhdGVkTWVudXNba2V5XS5zdWJtZW51cyAhPSBudWxsXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh1cGRhdGVkTWVudXNba2V5XS5zdWJtZW51cykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAvLyBEZWxldGUgdGhlIG1lbnUgaWYgc3VibWVudXMgaXMgZW1wdHlcclxuICAgICAgICAgIGRlbGV0ZSB1cGRhdGVkTWVudXNba2V5XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHN1Yk1lbnVzID0gdXBkYXRlZE1lbnVzW2tleV0uc3VibWVudXM7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IHN1Yk1lbnVLZXkgaW4gc3ViTWVudXMpIHtcclxuICAgICAgICAgICAgLy8gQ2hlY2sgdGVtcGxhdGVUYWJzIGNvbmRpdGlvblxyXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZVRhYnMgPVxyXG4gICAgICAgICAgICAgIHVwZGF0ZWRNZW51c1trZXldPy5zdWJtZW51c1tzdWJNZW51S2V5XT8udGVtcGxhdGVUYWJzO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgdGVtcGxhdGVUYWJzICE9IG51bGwgJiZcclxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0ZW1wbGF0ZVRhYnMpLmxlbmd0aCA9PT0gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAvLyBEZWxldGUgdGhlIG1lbnUgaWYgdGVtcGxhdGVUYWJzIGlzIGVtcHR5XHJcbiAgICAgICAgICAgICAgZGVsZXRlIHVwZGF0ZWRNZW51c1trZXldLnN1Ym1lbnVzW3N1Yk1lbnVLZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlVGFicyA9IHVwZGF0ZWRNZW51c1trZXldLnRlbXBsYXRlVGFicztcclxuICAgICAgICBpZiAodGVtcGxhdGVUYWJzICE9IG51bGwgJiYgT2JqZWN0LmtleXModGVtcGxhdGVUYWJzKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgbWVudSBpZiB0ZW1wbGF0ZVRhYnMgaXMgZW1wdHlcclxuICAgICAgICAgIGRlbGV0ZSB1cGRhdGVkTWVudXNba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB1cGRhdGVkTWVudXM7XHJcbiAgfVxyXG4gIC8vIENoZWNrcyBpZiBhIG1lbnUgc2hvdWxkIGJlIGFkZGVkIGJhc2VkIG9uIHRoZSBmZWJNZW51IGNvbmRpdGlvblxyXG4gIGNoZWNrRmViTWVudUFkZE9yTm90KG1lbnU6IGFueSwgcGFyZW50OiBhbnkpIHtcclxuICAgIGxldCB1c2VyRmViTWVudSA9IHRoaXMuZ2V0VXNlclByZWZlcmVuY2VCeUZpZWxkTmFtZSgncHJlZmVyZW5jZU1hcCcpO1xyXG4gICAgaWYgKCFtZW51IHx8IHR5cGVvZiBtZW51ICE9PSAnb2JqZWN0JyB8fCBPYmplY3Qua2V5cyhtZW51KS5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgcGFyZW50ICYmXHJcbiAgICAgICh0eXBlb2YgcGFyZW50ICE9PSAnb2JqZWN0JyB8fCBPYmplY3Qua2V5cyhwYXJlbnQpLmxlbmd0aCA9PT0gMClcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1lbnVJZCA9XHJcbiAgICAgIE9iamVjdC5rZXlzKG1lbnUpLmxlbmd0aCA+IDBcclxuICAgICAgICA/IG1lbnVbT2JqZWN0LmtleXMobWVudSlbMF1dLnJlZmVyZW5jZT8uX2lkXHJcbiAgICAgICAgOiBudWxsO1xyXG4gICAgLy8gQ2hlY2sgaWYgcGFyZW50IGFuZCBwYXJlbnQucmVmZXJlbmNlIGFyZSBkZWZpbmVkIGJlZm9yZSBhY2Nlc3NpbmcgX2lkXHJcbiAgICBpZiAocGFyZW50ICYmIHBhcmVudCAhPT0gJycgJiYgdHlwZW9mIHBhcmVudCA9PT0gJ29iamVjdCcgJiYgdXNlckZlYk1lbnUpIHtcclxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWVudSkge1xyXG4gICAgICAgIGlmIChtZW51Lmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgdXNlckZlYk1lbnUuaGFzT3duUHJvcGVydHkoa2V5KSAmJlxyXG4gICAgICAgICAgICB1c2VyRmViTWVudVtrZXldLmhhc093blByb3BlcnR5KCdzdWJtZW51cycpXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgbWVudVN1Ym1lbnVzID0gbWVudVtrZXldLnN1Ym1lbnVzO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1Ym1lbnVLZXkgaW4gbWVudVN1Ym1lbnVzKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3VibWVudUlkID0gbWVudVN1Ym1lbnVzW3N1Ym1lbnVLZXldLnJlZmVyZW5jZT8uX2lkO1xyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5pc0lkRXhpc3QodXNlckZlYk1lbnVba2V5XS5zdWJtZW51cywgc3VibWVudUlkKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBSZXR1cm4gZmFsc2UgaWYgdGhlIGtleSBpcyBtaXNzaW5nIG9yIGRvZXNuJ3QgaGF2ZSBzdWJtZW51cyBpbiB1c2VyRmViTWVudVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdXNlckZlYk1lbnUgJiZcclxuICAgICAgdXNlckZlYk1lbnUgIT09IG51bGwgJiZcclxuICAgICAgdHlwZW9mIHVzZXJGZWJNZW51ID09PSAnb2JqZWN0JyAmJlxyXG4gICAgICBPYmplY3Qua2V5cyh1c2VyRmViTWVudSkubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzSWRFeGlzdCh1c2VyRmViTWVudSwgbWVudUlkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gQ2hlY2tzIGlmIGEgZ2l2ZW4gSUQgZXhpc3RzIGluIHRoZSBwcm92aWRlZCBvYmplY3RcclxuICBpc0lkRXhpc3Qob2JqOiBhbnksIHRhcmdldElkOiBhbnkpIHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgb2JqLmhhc093blByb3BlcnR5KGtleSkgJiZcclxuICAgICAgICBvYmpba2V5XS5yZWZlcmVuY2UgJiZcclxuICAgICAgICBvYmpba2V5XS5yZWZlcmVuY2UuX2lkID09PSB0YXJnZXRJZFxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAvLyBDaGVja3MgaXMgTWVudSBhbHJlYWR5IHByZXNlbnQgb3Igbm90IC0gRm9yIGZhYk1lbnUgaWNvblxyXG4gIGlzTWVudUFscmVhZHlQcmVzZW50T3JOb3QodGFyZ2V0TWVudTogYW55LCB1c2VyRmViTWVudTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB1c2VyRmViTWVudSkge1xyXG4gICAgICBpZiAodXNlckZlYk1lbnUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgIGNvbnN0IG1lbnUgPSB1c2VyRmViTWVudVtrZXldO1xyXG4gICAgICAgIGlmIChtZW51LnJlZmVyZW5jZSAmJiBtZW51LnJlZmVyZW5jZS5faWQgPT09IHRhcmdldE1lbnUuX2lkKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1lbnUuc3VibWVudXMpIHtcclxuICAgICAgICAgIGZvciAoY29uc3Qgc3VibWVudUtleSBpbiBtZW51LnN1Ym1lbnVzKSB7XHJcbiAgICAgICAgICAgIGlmIChtZW51LnN1Ym1lbnVzLmhhc093blByb3BlcnR5KHN1Ym1lbnVLZXkpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3VibWVudSA9IG1lbnUuc3VibWVudXNbc3VibWVudUtleV07XHJcbiAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgc3VibWVudS5yZWZlcmVuY2UgJiZcclxuICAgICAgICAgICAgICAgIHN1Ym1lbnUucmVmZXJlbmNlLl9pZCA9PT0gdGFyZ2V0TWVudS5faWRcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBnZXRVc2VyUHJlZmVyZW5jZUJ5RmllbGROYW1lKGZpZWxkTmFtZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgZGF0YSA9IFtdO1xyXG4gICAgbGV0IHVzZXJQcmVmZXJlbmNlID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyUHJlZmVyZW5jZSgpO1xyXG4gICAgaWYgKHVzZXJQcmVmZXJlbmNlICYmIHVzZXJQcmVmZXJlbmNlW2ZpZWxkTmFtZV0pIHtcclxuICAgICAgZGF0YSA9IHVzZXJQcmVmZXJlbmNlW2ZpZWxkTmFtZV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcbiAgLy8gRXh0cmFjdCB0aGUgbWVudSBhbmQgc3VibWVudSBkYXRhIGZvciB0YWJcclxuICBleHRyYWN0TWVudURldGFpbHMoXHJcbiAgICB0YWI6IGFueSxcclxuICAgIGRhdGE6IGFueVtdLFxyXG4gICAgaW5kaWNlczogeyBtZW51SW5kZXg6IG51bWJlcjsgc3VibWVudUluZGV4OiBudW1iZXI7IG1vZHVsZUluZGV4OiBudW1iZXIgfVxyXG4gICkge1xyXG4gICAgY29uc3QgeyBtZW51SW5kZXgsIHN1Ym1lbnVJbmRleCwgbW9kdWxlSW5kZXggfSA9IGluZGljZXM7XHJcbiAgICBsZXQgbmV3TWVudTogYW55ID0ge307XHJcbiAgICBsZXQgdGFiUmVmID0gdGhpcy5nZXRUYWJSZWYodGFiLCdmYXZvdXJpdGUnKTtcclxuICAgIGxldCBtb2R1bGVSZWYgPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3QoZGF0YVttb2R1bGVJbmRleF0pO1xyXG4gICAgbGV0IGlzRmF2RXhpc3QgPSB0YWIuZmF2b3VyaXRlO1xyXG4gICAgaWYgKHN1Ym1lbnVJbmRleCAhPSAtMSkge1xyXG4gICAgICBsZXQgc3VibWVudSA9XHJcbiAgICAgICAgZGF0YVttb2R1bGVJbmRleF0/LlsnbWVudV9saXN0J11bbWVudUluZGV4XT8uWydzdWJtZW51J10/LltcclxuICAgICAgICAgIHN1Ym1lbnVJbmRleFxyXG4gICAgICAgIF07XHJcbiAgICAgIGxldCBwYXJlbnQgPSBkYXRhW21vZHVsZUluZGV4XT8uWydtZW51X2xpc3QnXVttZW51SW5kZXhdO1xyXG4gICAgICBuZXdNZW51W21vZHVsZVJlZi5uYW1lXSA9IHtcclxuICAgICAgICBmYXZvdXJpdGU6IGlzRmF2RXhpc3QsXHJcbiAgICAgICAgcmVmZXJlbmNlIDogbW9kdWxlUmVmLFxyXG4gICAgICAgIG1lbnVzOntcclxuICAgICAgICAgICAgW3BhcmVudC5uYW1lXSA6IHtcclxuICAgICAgICAgICAgICByZWZlcmVuY2U6IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldFJlZmVyZW5jZU9iamVjdChwYXJlbnQpLFxyXG4gICAgICAgICAgICAgIGZhdm91cml0ZTogaXNGYXZFeGlzdCxcclxuICAgICAgICAgICAgICBzdWJtZW51czoge1xyXG4gICAgICAgICAgICAgICAgW3N1Ym1lbnUubmFtZV06IHtcclxuICAgICAgICAgICAgICAgICAgZmF2b3VyaXRlOiBpc0ZhdkV4aXN0LFxyXG4gICAgICAgICAgICAgICAgICByZWZlcmVuY2U6IHtcclxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3Qoc3VibWVudSksXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVGFiczogdGFiUmVmLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IG1lbnUgPSBkYXRhW21vZHVsZUluZGV4XT8uWydtZW51X2xpc3QnXVttZW51SW5kZXhdO1xyXG4gICAgICBuZXdNZW51W21vZHVsZVJlZi5uYW1lXT17XHJcbiAgICAgICAgZmF2b3VyaXRlOiBpc0ZhdkV4aXN0LFxyXG4gICAgICAgIHJlZmVyZW5jZSA6IG1vZHVsZVJlZixcclxuICAgICAgICBtZW51czoge1xyXG4gICAgICAgIFttZW51Lm5hbWVdIDoge1xyXG4gICAgICAgIGZhdm91cml0ZTogaXNGYXZFeGlzdCxcclxuICAgICAgICByZWZlcmVuY2U6IHsgLi4udGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KG1lbnUpfSxcclxuICAgICAgICB0ZW1wbGF0ZVRhYnM6IHRhYlJlZixcclxuICAgICAgfX1cclxuICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3TWVudTtcclxuICB9XHJcbiAgLy91cGRhdGUgdGFic1xyXG4gIHVwZGF0ZUZhdlRhYnMobmV3TWVudXM6IGFueSwgdGFiOiBhbnkpIHtcclxuICAgIGxldCBleGlzdGluZ1VzZXJQcmVmZXJlbmNlcyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlclByZWZlcmVuY2UoKTtcclxuICAgIGlmKCFleGlzdGluZ1VzZXJQcmVmZXJlbmNlcyl7XHJcbiAgICAgIGV4aXN0aW5nVXNlclByZWZlcmVuY2VzID0gdGhpcy5jcmVhdGVVc2VyUHJlZmVyZW5jZSgncHJlZmVyZW5jZU1hcCcpO1xyXG4gICAgfVxyXG4gICAgbGV0IGV4aXN0aW5nTWVudXMgPSBleGlzdGluZ1VzZXJQcmVmZXJlbmNlc1sncHJlZmVyZW5jZU1hcCddO1xyXG4gICAgbGV0IHVwZGF0ZWRNZW51cyA9IHsgLi4uZXhpc3RpbmdNZW51cyB9O1xyXG4gICAgbGV0IGZhdkV4aXN0ID0gIXRhYi5mYXZvdXJpdGVcclxuXHJcbiAgICBpZiAoIWZhdkV4aXN0KSB7XHJcbiAgICAgIGZvciAobGV0IG1lbnVOYW1lIGluIG5ld01lbnVzKSB7XHJcbiAgICAgICAgaWYgKG5ld01lbnVzLmhhc093blByb3BlcnR5KG1lbnVOYW1lKSkge1xyXG4gICAgICAgICAgbGV0IG5ld01lbnUgPSBuZXdNZW51c1ttZW51TmFtZV07XHJcblxyXG4gICAgICAgICAgaWYgKGV4aXN0aW5nTWVudXMuaGFzT3duUHJvcGVydHkobWVudU5hbWUpKSB7XHJcbiAgICAgICAgICAgIGxldCBleGlzdGluZ01lbnUgPSBleGlzdGluZ01lbnVzW21lbnVOYW1lXTtcclxuXHJcbiAgICAgICAgICAgIGV4aXN0aW5nTWVudS5yZWZlcmVuY2UgPSBuZXdNZW51LnJlZmVyZW5jZTtcclxuICAgICAgICAgICAgaWYgKCFleGlzdGluZ01lbnUuc3VibWVudXMpIHtcclxuICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdNZW51LnRlbXBsYXRlVGFicyAmJiBuZXdNZW51LnRlbXBsYXRlVGFicykge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGV4aXN0aW5nTWVudS50ZW1wbGF0ZVRhYnNbdGFiLnRhYl9uYW1lXTtcclxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ01lbnUuc3VibWVudXMgJiYgbmV3TWVudS5zdWJtZW51cykge1xyXG4gICAgICAgICAgICAgICAgICBleGlzdGluZ01lbnUudGVtcGxhdGVUYWJzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLmV4aXN0aW5nTWVudS50ZW1wbGF0ZVRhYnMsXHJcbiAgICAgICAgICAgICAgICAgICAgLi4ubmV3TWVudS50ZW1wbGF0ZVRhYnMsXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBleGlzdGluZ01lbnUudGVtcGxhdGVUYWJzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLmV4aXN0aW5nTWVudS50ZW1wbGF0ZVRhYnMsXHJcbiAgICAgICAgICAgICAgICAgICAgLi4ubmV3TWVudS50ZW1wbGF0ZVRhYnMsXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IHN1Yk1lbnVLZXkgaW4gbmV3TWVudS5zdWJtZW51cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld01lbnUuc3VibWVudXMuaGFzT3duUHJvcGVydHkoc3ViTWVudUtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IG5ld1N1Yk1lbnUgPSBuZXdNZW51LnN1Ym1lbnVzW3N1Yk1lbnVLZXldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nTWVudS5zdWJtZW51cy5oYXNPd25Qcm9wZXJ0eShzdWJNZW51S2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBleGlzdGluZ1N1Yk1lbnUgPSBleGlzdGluZ01lbnUuc3VibWVudXNbc3ViTWVudUtleV07XHJcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdTdWJNZW51LnJlZmVyZW5jZSA9IG5ld1N1Yk1lbnUucmVmZXJlbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nU3ViTWVudS50ZW1wbGF0ZVRhYnMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIG5ld1N1Yk1lbnUudGVtcGxhdGVUYWJzXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1N1Yk1lbnUudGVtcGxhdGVUYWJzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5leGlzdGluZ1N1Yk1lbnUudGVtcGxhdGVUYWJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5uZXdTdWJNZW51LnRlbXBsYXRlVGFicyxcclxuICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nU3ViTWVudS50ZW1wbGF0ZVRhYnMgPSBuZXdTdWJNZW51LnRlbXBsYXRlVGFicztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdNZW51LnN1Ym1lbnVzW3N1Yk1lbnVLZXldID0geyAuLi5uZXdTdWJNZW51IH07XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZWRNZW51c1ttZW51TmFtZV0gPSB7IC4uLm5ld01lbnUgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZvciAobGV0IG1lbnVOYW1lIGluIGV4aXN0aW5nTWVudXMpIHtcclxuICAgICAgICBpZiAobmV3TWVudXMuaGFzT3duUHJvcGVydHkobWVudU5hbWUpKSB7XHJcbiAgICAgICAgICBsZXQgbmV3TWVudSA9IG5ld01lbnVzW21lbnVOYW1lXTtcclxuICAgICAgICAgIGxldCBleGlzdGluZ01lbnUgPSBleGlzdGluZ01lbnVzW21lbnVOYW1lXTsgICAgICAgICAgXHJcbiAgICAgICAgICBpZiAoIWV4aXN0aW5nTWVudS5zdWJtZW51cykge1xyXG4gICAgICAgICAgICAgIGV4aXN0aW5nTWVudS5yZWZlcmVuY2UgPSBuZXdNZW51Py5yZWZlcmVuY2U7XHJcbiAgICAgICAgICAgICAgY29uc3QgZmF2VGFicyA9IHRoaXMuZ2V0RmViVGFicyh0aGlzLmdldFRlbXBsYXRlVGFicygpKTtcclxuICAgICAgICAgICAgICBleGlzdGluZ01lbnVbXCJ0ZW1wbGF0ZVRhYnNcIl0gPSBmYXZUYWJzO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgZXhpc3RpbmdNZW51LnRlbXBsYXRlVGFicyAmJlxyXG4gICAgICAgICAgICAgIGV4aXN0aW5nTWVudS50ZW1wbGF0ZVRhYnNbdGFiLnRhYl9uYW1lXVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBkZWxldGUgZXhpc3RpbmdNZW51LnRlbXBsYXRlVGFic1t0YWIudGFiX25hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBzdWJNZW51S2V5IGluIGV4aXN0aW5nTWVudS5zdWJtZW51cykge1xyXG4gICAgICAgICAgICAgIGlmIChuZXdNZW51LnN1Ym1lbnVzLmhhc093blByb3BlcnR5KHN1Yk1lbnVLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmdTdWJNZW51ID0gZXhpc3RpbmdNZW51LnN1Ym1lbnVzW3N1Yk1lbnVLZXldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmF2VGFicyA9IHRoaXMuZ2V0RmViVGFicyh0aGlzLmdldFRlbXBsYXRlVGFicygpKTtcclxuICAgICAgICAgICAgICAgIGV4aXN0aW5nU3ViTWVudVtcInRlbXBsYXRlVGFic1wiXSA9IGZhdlRhYnM7XHJcbiAgICAgICAgICAgICAgICBleGlzdGluZ1N1Yk1lbnUucmVmZXJlbmNlID0gbmV3TWVudT8uc3VibWVudXNbc3ViTWVudUtleV0/LnJlZmVyZW5jZVxyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICBleGlzdGluZ1N1Yk1lbnUudGVtcGxhdGVUYWJzICYmXHJcbiAgICAgICAgICAgICAgICAgIGV4aXN0aW5nU3ViTWVudS50ZW1wbGF0ZVRhYnNbdGFiLnRhYl9uYW1lXVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBleGlzdGluZ1N1Yk1lbnUudGVtcGxhdGVUYWJzW3RhYi50YWJfbmFtZV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB1cGRhdGVkTWVudXMgPSB0aGlzLmRlbGV0ZUVtcHR5TWVudXModXBkYXRlZE1lbnVzKTtcclxuICAgIGV4aXN0aW5nVXNlclByZWZlcmVuY2VzWydwcmVmZXJlbmNlTWFwJ10gPSB1cGRhdGVkTWVudXM7XHJcblxyXG4gICAgcmV0dXJuIGV4aXN0aW5nVXNlclByZWZlcmVuY2VzO1xyXG4gIH1cclxuICAvLyBDaGVjayB0aGUgdGFiIGlkIGluIGxvY2FsIFVTRVJfUFJFRlxyXG4gIGNoZWNrRmViVGFiQWRkT3JOb3QodGFiOiBhbnkpIHtcclxuICAgIGNvbnN0IG1lbnVzID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyUHJlZmVyZW5jZSgpPy5bJ3ByZWZlcmVuY2VNYXAnXSB8fCB7fTtcclxuICAgIHJldHVybiB0aGlzLmlzSWRFeGlzdEluVGVtcGxhdGVUYWJzKG1lbnVzLCB0YWIuX2lkKTtcclxuICB9XHJcbiAgaXNJZEV4aXN0SW5UZW1wbGF0ZVRhYnMob2JqOiBhbnksIHRhcmdldElkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xyXG5cclxuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgc2VhcmNoIGluIG5lc3RlZCBvYmplY3RzXHJcbiAgICAgICAgICBpZiAodGhpcy5pc0lkRXhpc3RJblRlbXBsYXRlVGFicyh2YWx1ZSwgdGFyZ2V0SWQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnX2lkJyAmJiB2YWx1ZSA9PT0gdGFyZ2V0SWQpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBnZXRVc2VyUHJlZmVyZW5jZU9iaihkYXRhOmFueSxmaWVsZE5hbWU6c3RyaW5nLHBhcmVudD86c3RyaW5nKXtcclxuICAgIGxldCByZWZPYmo6YW55ID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KGRhdGEpO1xyXG4gICAgaWYocGFyZW50ICE9ICcnKXtcclxuICAgICAgcmVmT2JqID0gcGFyZW50O1xyXG4gICAgfVxyXG4gICAgaWYoZmllbGROYW1lID09IFwiZmF2b3JpdGVNZW51c1wiKXtcclxuICAgICAgcmVmT2JqID0gZGF0YTtcclxuICAgIH1cclxuICAgIGxldCB1UmVmOmFueSA9IHt9O1xyXG4gICAgbGV0IHVzZXJQcmVmZXJlbmNlID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyUHJlZmVyZW5jZSgpO1xyXG4gICAgaWYodXNlclByZWZlcmVuY2UgJiYgdXNlclByZWZlcmVuY2UuX2lkICYmIHVzZXJQcmVmZXJlbmNlLl9pZCAhPSBudWxsICYmIHVzZXJQcmVmZXJlbmNlLl9pZCAhPSAnJyl7XHJcbiAgICAgIGxldCBmaWVsZERhdGEgPSB1c2VyUHJlZmVyZW5jZVtmaWVsZE5hbWVdO1xyXG4gICAgICBpZihmaWVsZERhdGEgJiYgZmllbGREYXRhLmxlbmd0aCA+IDApe1xyXG4gICAgICAgIGxldCBtYXRjaEluZGV4ID0gLTE7XHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGZpZWxkRGF0YS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWVsZERhdGFbaW5kZXhdO1xyXG4gICAgICAgICAgaWYoZWxlbWVudC5faWQgPT0gcmVmT2JqLl9pZCl7XHJcbiAgICAgICAgICAgIG1hdGNoSW5kZXggPSBpbmRleDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKG1hdGNoSW5kZXggID4gLTEpe1xyXG4gICAgICAgICAgaWYocGFyZW50ICE9ICcnKXtcclxuICAgICAgICAgICAgbGV0IHN1Ym1lbnUgPSBmaWVsZERhdGFbbWF0Y2hJbmRleF0uc3VibWVudTtcclxuICAgICAgICAgICAgbGV0IHN1Ym1lbnVNYXRjaEluZGV4ID0gLTE7XHJcbiAgICAgICAgICAgIGlmKHN1Ym1lbnUgJiYgc3VibWVudS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN1Ym1lbnUubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1Yk1lbnUgPSBzdWJtZW51W2pdO1xyXG4gICAgICAgICAgICAgICAgaWYoc3ViTWVudS5faWQgPT0gZGF0YS5faWQpe1xyXG4gICAgICAgICAgICAgICAgICBzdWJtZW51TWF0Y2hJbmRleCA9IGo7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihzdWJtZW51TWF0Y2hJbmRleCA+IC0xKXtcclxuICAgICAgICAgICAgICBzdWJtZW51LnNwbGljZShzdWJtZW51TWF0Y2hJbmRleCk7XHJcbiAgICAgICAgICAgICAgaWYoZmllbGREYXRhW21hdGNoSW5kZXhdLnN1Ym1lbnUubGVuZ3RoID09IDApe1xyXG4gICAgICAgICAgICAgICAgZmllbGREYXRhLnNwbGljZShtYXRjaEluZGV4KTtcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGZpZWxkRGF0YVttYXRjaEluZGV4XS5zdWJtZW51ID0gc3VibWVudTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGlmKHN1Ym1lbnUubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICBmaWVsZERhdGFbbWF0Y2hJbmRleF0uc3VibWVudS5wdXNoKGRhdGEpO1xyXG4gICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgZmllbGREYXRhW21hdGNoSW5kZXhdLnN1Ym1lbnUgPSBbXVxyXG4gICAgICAgICAgICAgICAgZmllbGREYXRhW21hdGNoSW5kZXhdLnN1Ym1lbnUucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBmaWVsZERhdGEuc3BsaWNlKG1hdGNoSW5kZXgsIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgaWYocGFyZW50ICE9ICcnKXtcclxuICAgICAgICAgICAgcmVmT2JqWydzdWJtZW51J10gPSBbXTtcclxuICAgICAgICAgICAgcmVmT2JqWydzdWJtZW51J10ucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgZmllbGREYXRhLnB1c2gocmVmT2JqKTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBmaWVsZERhdGEucHVzaChyZWZPYmopO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgZmllbGREYXRhID0gW107XHJcbiAgICAgICAgZmllbGREYXRhLnB1c2gocmVmT2JqKTtcclxuICAgICAgfVxyXG4gICAgICB1c2VyUHJlZmVyZW5jZVtmaWVsZE5hbWVdID0gZmllbGREYXRhO1xyXG4gICAgICB1UmVmID0gdXNlclByZWZlcmVuY2U7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgbGV0IHVzZXIgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLkdldFVzZXJJbmZvKCk7XHJcbiAgICAgIGxldCB1c2VyUmVmID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KHVzZXIpO1xyXG4gICAgICBsZXQgZGF0YUxpc3QgPSBbXTtcclxuICAgICAgZGF0YUxpc3QucHVzaChyZWZPYmopO1xyXG4gICAgICB1UmVmWyd1c2VySWQnXSA9IHVzZXJSZWY7XHJcbiAgICAgIHVSZWZbZmllbGROYW1lXSA9IGRhdGFMaXN0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVSZWZcclxuICB9XHJcblxyXG4gIHNhdmVDb2x1bW4oZGF0YTphbnkpe1xyXG4gICAgbGV0IHtjb2x1bW5zLGZvcm0sZm9ybVRhYmxlfT1kYXRhO1xyXG4gICAgY29uc3QgY2hlY2tlZEZpZWxkcz1jb2x1bW5zLmZpbHRlcigoY29sOmFueSk9PmNvbC5kaXNwbGF5PT10cnVlKTtcclxuICAgIGxldCB7bWVudUluZGV4LCBzdWJtZW51SW5kZXgsIG1vZHVsZUluZGV4fT0gdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLmdldE1lbnVPclN1Ym1lbnVJbmRleHMoKTtcclxuICAgIGNvbnN0IGFsbE1vZHVsZURhdGE9dGhpcy5zdG9yYWdlU2VydmljZS5HZXRNb2R1bGVzKCk7XHJcbiAgICBsZXQgc2VsZWN0ZWRNb2R1bGU9IGFsbE1vZHVsZURhdGFbbW9kdWxlSW5kZXhdO1xyXG4gICAgbGV0IHNlbGVjdGVkTWVudT0gYWxsTW9kdWxlRGF0YVttb2R1bGVJbmRleF0/LltcIm1lbnVfbGlzdFwiXVttZW51SW5kZXhdO1xyXG4gICAgbGV0IHNlbGVjdGVkU3ViTWVudT0gbnVsbDtcclxuICAgIGxldCBhbGxUZW1wbGV0ZVRhYnM9IHRoaXMuZGF0YVNoYXJlU2VydmljZS5nZXRUZW1wRGF0YSgpWzBdPy5bXCJ0ZW1wbGF0ZVRhYnNcIl07XHJcbiAgICBsZXQgYWN0aXZlTWVudT10aGlzLnN0b3JhZ2VTZXJ2aWNlLkdldEFjdGl2ZU1lbnUoKSAvLy9nZXQgYWN0aXZlIHRhYiBcclxuICAgIGxldCBzZWxlY3RlZFRhYj0gYWxsVGVtcGxldGVUYWJzPy5maW5kKCh0YWI6YW55KT0+dGFiLnRhYl9uYW1lPT0gYWN0aXZlTWVudT8ubmFtZSk7XHJcbiAgICBsZXQgc2VsZWN0ZWRHcmlkPSBzZWxlY3RlZFRhYi5ncmlkXHJcblxyXG4gICAgaWYoc3VibWVudUluZGV4IT0gLTEpe1xyXG4gICAgICAgc2VsZWN0ZWRTdWJNZW51PSBhbGxNb2R1bGVEYXRhW21vZHVsZUluZGV4XT8uW1wibWVudV9saXN0XCJdW21lbnVJbmRleF0/LltcInN1Ym1lbnVcIl1bc3VibWVudUluZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZm9ybXM7XHJcbiAgICBsZXQgZ3JpZHM7XHJcbiAgICBpZihmb3JtICYmIGZvcm1UYWJsZSl7XHJcbiAgICAgIHNlbGVjdGVkR3JpZD1mb3JtVGFibGUuZ3JpZDtcclxuICAgICAgIGZvcm1zPSB7XHJcbiAgICAgICAgW2Zvcm1bXCJuYW1lXCJdXTp7XHJcbiAgICAgICAgICByZWZlcmVuY2UgOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3QoZm9ybSksXHJcbiAgICAgICAgICBncmlkczp7XHJcbiAgICAgICAgICAgIFtzZWxlY3RlZEdyaWRbXCJuYW1lXCJdXTp7XHJcbiAgICAgICAgICAgICAgcmVmZXJlbmNlIDogdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KHNlbGVjdGVkR3JpZCksXHJcbiAgICAgICAgICAgICAgXCJmaWVsZHNcIjpjaGVja2VkRmllbGRzLm1hcCgoY29sOmFueSkgPT57XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBmaWVsZF9uYW1lOiBjb2wuZmllbGRfbmFtZSwgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9ZWxzZXtcclxuICAgICAgICBncmlkcz17XHJcbiAgICAgICAgICBbc2VsZWN0ZWRHcmlkW1wibmFtZVwiXV06e1xyXG4gICAgICAgICAgICByZWZlcmVuY2UgOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3Qoc2VsZWN0ZWRHcmlkKSxcclxuICAgICAgICAgICAgXCJmaWVsZHNcIjpjaGVja2VkRmllbGRzLm1hcCgoY29sOmFueSkgPT57XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZmllbGRfbmFtZTogY29sLmZpZWxkX25hbWUsIFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHByZWZlcmVuY2U7XHJcbiAgICBsZXQgdGVtcGxhdGVUYWJzPXtcclxuICAgICAgW3NlbGVjdGVkVGFiW1widGFiX25hbWVcIl1dOntcclxuICAgICAgICByZWZlcmVuY2UgOiB7XHJcbiAgICAgICAgICBfaWQ6c2VsZWN0ZWRUYWJbXCJfaWRcIl0sXHJcbiAgICAgICAgICBuYW1lOiBzZWxlY3RlZFRhYltcInRhYl9uYW1lXCJdXHJcbiAgICAgICAgfSxcclxuICAgICAgICAuLi4oZm9ybSAmJiB7Zm9ybXN9KSxcclxuICAgICAgICAuLi4oZm9ybSA9PSB1bmRlZmluZWQgJiYge2dyaWRzfSlcclxuICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihzdWJtZW51SW5kZXggIT0gLTEpe1xyXG4gICAgICBwcmVmZXJlbmNlPXtcclxuICAgICAgICBbc2VsZWN0ZWRNb2R1bGVbXCJuYW1lXCJdXTp7XHJcbiAgICAgICAgICByZWZlcmVuY2UgOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3Qoc2VsZWN0ZWRNb2R1bGUpLFxyXG4gICAgICAgICAgbWVudXM6e1xyXG4gICAgICAgICAgICAgICBbc2VsZWN0ZWRNZW51W1wibmFtZVwiXV06e1xyXG4gICAgICAgICAgICAgICByZWZlcmVuY2UgOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3Qoc2VsZWN0ZWRNZW51KSxcclxuICAgICAgICAgICAgICAgc3VibWVudXM6IHtcclxuICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkU3ViTWVudVtcIm5hbWVcIl1dOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3Qoc2VsZWN0ZWRTdWJNZW51KSxcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVRhYnMsXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNle1xyXG4gICAgICBwcmVmZXJlbmNlPXtcclxuICAgICAgICBbc2VsZWN0ZWRNb2R1bGVbXCJuYW1lXCJdXTp7XHJcbiAgICAgICAgICByZWZlcmVuY2UgOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3Qoc2VsZWN0ZWRNb2R1bGUpLFxyXG4gICAgICAgICAgbWVudXM6e1xyXG4gICAgICAgICAgICAgICBbc2VsZWN0ZWRNZW51W1wibmFtZVwiXV06e1xyXG4gICAgICAgICAgICAgICByZWZlcmVuY2UgOiB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXRSZWZlcmVuY2VPYmplY3Qoc2VsZWN0ZWRNZW51KSxcclxuICAgICAgICAgICAgICAgdGVtcGxhdGVUYWJzOntcclxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZFRhYltcInRhYl9uYW1lXCJdXTp7XHJcbiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA6IHtcclxuICAgICAgICAgICAgICAgICAgICBfaWQ6c2VsZWN0ZWRUYWJbXCJfaWRcIl0sXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogc2VsZWN0ZWRUYWJbXCJ0YWJfbmFtZVwiXVxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAuLi4oZm9ybSAmJiB7Zm9ybXN9KSxcclxuICAgICAgICAgICAgICAgICAgLi4uKGZvcm0gPT0gdW5kZWZpbmVkICYmIHtncmlkc30pXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCB1c2VyUmVmID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0UmVmZXJlbmNlT2JqZWN0KFxyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLkdldFVzZXJJbmZvKClcclxuICAgICk7XHJcbiAgXHJcbiAgICBsZXQgcGF5bG9hZD17XHJcbiAgICAgIHByZWZlcmVuY2VNYXAgOiBwcmVmZXJlbmNlLFxyXG4gICAgICB1c2VySWQ6IHVzZXJSZWZcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHBheWxvYWQ7XHJcbiAgfVxyXG5cclxuICBhZGRIaWRlS2V5SW5FeGlzdGluZ1RhYihjb2x1bW5zOmFueSxmSWQ6U3RyaW5nLGZpZWxkTmFtZTpTdHJpbmcpe1xyXG4gICAgICBsZXQgdGFiTmFtZT10aGlzLnN0b3JhZ2VTZXJ2aWNlLkdldEFjdGl2ZU1lbnUoKS5uYW1lO1xyXG4gICAgICBsZXQgdGVtcGxhdGU9dGhpcy5kYXRhU2hhcmVTZXJ2aWNlLmdldFRlbXBEYXRhKCk7XHJcbiAgICAgIGxldCB0YWJzID0gdGVtcGxhdGVbMF0udGVtcGxhdGVUYWJzO1xyXG4gICAgICBsZXQgc2VsZWN0VGFiSW5kZXg9dGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0SW5kZXhJbkFycmF5QnlJZCh0YWJzLHRhYk5hbWUsJ3RhYl9uYW1lJylcclxuICAgICAgbGV0IHRhYiA9IHRhYnNbc2VsZWN0VGFiSW5kZXhdO1xyXG4gICAgICBsZXQgZ3JpZD10YWIuZ3JpZDtcclxuICAgICAgbGV0IGdyaWRDb2x1bW5zPWdyaWQuZ3JpZENvbHVtbnM7XHJcbiAgICAgIGlmKGZJZCAmJiBmaWVsZE5hbWUpe1xyXG4gICAgICAgIGxldCBmb3Jtcz10YWIuZm9ybXM7XHJcbiAgICAgICAgaWYodHlwZW9mIGZvcm1zPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoZm9ybXMpLmxlbmd0aD4wKXtcclxuICAgICAgICAgIE9iamVjdC5rZXlzKGZvcm1zKS5mb3JFYWNoKChrZXk6YW55KT0+e1xyXG4gICAgICAgICAgICBsZXQgZm9ybT1mb3Jtc1trZXldO1xyXG4gICAgICAgICAgICBpZihmb3JtLl9pZD09IGZJZCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgZm9ybUZpZWxkcz1mb3JtLnRhYmxlRmllbGRzO1xyXG4gICAgICAgICAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKChmaWVsZDphbnkpPT57XHJcbiAgICAgICAgICAgICAgICAgIGlmKGZpZWxkLmZpZWxkX25hbWUgPT0gZmllbGROYW1lKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmKGZpZWxkLmdyaWRDb2x1bW5zICYmIGZpZWxkLmdyaWRDb2x1bW5zLmxlbmd0aD4wKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZENvbHVtbnM9ZmllbGQuZ3JpZENvbHVtbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmKCBncmlkQ29sdW1ucyAmJiBncmlkQ29sdW1ucy5sZW5ndGg+MCAmJiBjb2x1bW5zLmxlbmd0aD4wKXtcclxuICAgICAgICBjb2x1bW5zLmZvckVhY2goKGNvbDphbnksaW5kZXg6YW55KT0+e1xyXG4gICAgICAgICAgaWYoY29sLmRpc3BsYXkpe1xyXG4gICAgICAgICAgICBncmlkQ29sdW1uc1tpbmRleF1bJ2hpZGUnXT1mYWxzZTtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBncmlkQ29sdW1uc1tpbmRleF1bJ2hpZGUnXT10cnVlO1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19