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