mmhglobal-dynamicform 1.3.13 → 2.0.0-beta.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 (115) hide show
  1. package/esm2020/lib/animations/component-animations.mjs +12 -0
  2. package/esm2020/lib/components/buttonfieldbase.component.mjs +62 -0
  3. package/esm2020/lib/components/containerfieldbase.component.mjs +42 -0
  4. package/esm2020/lib/components/datalistingfieldbase.component.mjs +138 -0
  5. package/esm2020/lib/components/fieldbase.component.mjs +90 -0
  6. package/esm2020/lib/components/inputfieldbase.component.mjs +78 -0
  7. package/esm2020/lib/directives/scrollbar.theme.directive.mjs +13 -11
  8. package/esm2020/lib/embed-components/input-field-addons/input-field-addons.component.mjs +69 -0
  9. package/esm2020/lib/input-error-message/input-error-message.component.mjs +33 -0
  10. package/esm2020/lib/kcard/kcard.component.mjs +84 -0
  11. package/esm2020/lib/mmhglobal-dynamicform.module.mjs +53 -12
  12. package/esm2020/lib/pipe/htmlSanitize.pipe.mjs +18 -0
  13. package/esm2020/lib/services/component-error-handler.service.mjs +84 -0
  14. package/esm2020/lib/services/main.service.mjs +171 -73
  15. package/esm2020/lib/services/zcomponent.debug.service.mjs +17 -8
  16. package/esm2020/lib/services/zcomponent.service.mjs +133 -9
  17. package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +15 -23
  18. package/esm2020/lib/uicontainer/uicontainer.component.mjs +2 -2
  19. package/esm2020/lib/uicontent/uicontent.component.mjs +21 -9
  20. package/esm2020/lib/uiheader/uiheader.component.mjs +61 -28
  21. package/esm2020/lib/uimenucontent/uimenucontent.component.mjs +3 -3
  22. package/esm2020/lib/uipage/uipage.component.mjs +41 -26
  23. package/esm2020/lib/uivalidationmessage/uivalidationmessage.component.mjs +2 -2
  24. package/esm2020/lib/zbullet/zbullet.component.mjs +3 -2
  25. package/esm2020/lib/zbuttons/zbuttons.component.mjs +45 -91
  26. package/esm2020/lib/zcard/zcard.component.mjs +13 -60
  27. package/esm2020/lib/zcheckbox/zcheckbox.component.mjs +14 -159
  28. package/esm2020/lib/zchip/zchip.component.mjs +34 -64
  29. package/esm2020/lib/zcodeeditor/zcodeeditor.component.mjs +4 -3
  30. package/esm2020/lib/zdaterange/zdaterange.component.mjs +3 -3
  31. package/esm2020/lib/zdatetime/zdatetime.component.mjs +22 -74
  32. package/esm2020/lib/zdiv/zdiv.component.mjs +63 -40
  33. package/esm2020/lib/zdiv/zdiv.pipe.mjs +2 -2
  34. package/esm2020/lib/zform/zform.component.mjs +9 -7
  35. package/esm2020/lib/zformcontrol/zformcontrol.component.mjs +5 -3
  36. package/esm2020/lib/zgauge/zgauge.component.mjs +34 -70
  37. package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +32 -30
  38. package/esm2020/lib/zgrid/zgrid.component.mjs +243 -135
  39. package/esm2020/lib/zimg/zimg.component.mjs +44 -108
  40. package/esm2020/lib/zinput-container/zinput-container.component.mjs +63 -0
  41. package/esm2020/lib/zinput-container/zinput-container.pipe.mjs +120 -0
  42. package/esm2020/lib/zkcard/zkcard.component.mjs +2 -2
  43. package/esm2020/lib/zlabel/zlabel.component.mjs +18 -94
  44. package/esm2020/lib/zmfb/zmfb.component.mjs +70 -91
  45. package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +15 -11
  46. package/esm2020/lib/zmodal/zmodal.component.mjs +14 -10
  47. package/esm2020/lib/znumeric/znumeric.component.mjs +18 -94
  48. package/esm2020/lib/zpostselectinput/zpostselectinput.component.mjs +35 -87
  49. package/esm2020/lib/zprogressbar/zprogressbar.component.mjs +59 -0
  50. package/esm2020/lib/zreport/zreport.component.mjs +25 -27
  51. package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +39 -194
  52. package/esm2020/lib/ztab/ztab.component.mjs +17 -45
  53. package/esm2020/lib/ztab/ztab.pipe.mjs +6 -4
  54. package/esm2020/lib/ztext/ztext.component.mjs +20 -180
  55. package/esm2020/lib/ztextarea/ztextarea.component.mjs +23 -101
  56. package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +3 -2
  57. package/esm2020/lib/ztree/ztree.component.mjs +25 -41
  58. package/esm2020/lib/ztreelist/ztreelist.component.mjs +104 -143
  59. package/esm2020/lib/zudf/zudf.component.mjs +12 -8
  60. package/esm2020/lib/zupload/zupload.component.mjs +18 -39
  61. package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +45 -77
  62. package/esm2020/public-api.mjs +15 -2
  63. package/fesm2015/mmhglobal-dynamicform.mjs +4491 -4359
  64. package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
  65. package/fesm2020/mmhglobal-dynamicform.mjs +4490 -4366
  66. package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
  67. package/lib/animations/component-animations.d.ts +1 -0
  68. package/lib/components/buttonfieldbase.component.d.ts +18 -0
  69. package/lib/components/containerfieldbase.component.d.ts +19 -0
  70. package/lib/components/datalistingfieldbase.component.d.ts +30 -0
  71. package/lib/components/fieldbase.component.d.ts +30 -0
  72. package/lib/components/inputfieldbase.component.d.ts +19 -0
  73. package/lib/embed-components/input-field-addons/input-field-addons.component.d.ts +16 -0
  74. package/lib/input-error-message/input-error-message.component.d.ts +15 -0
  75. package/lib/kcard/kcard.component.d.ts +21 -0
  76. package/lib/mmhglobal-dynamicform.module.d.ts +40 -32
  77. package/lib/pipe/htmlSanitize.pipe.d.ts +10 -0
  78. package/lib/services/component-error-handler.service.d.ts +14 -0
  79. package/lib/services/main.service.d.ts +23 -5
  80. package/lib/services/zcomponent.debug.service.d.ts +4 -1
  81. package/lib/services/zcomponent.service.d.ts +20 -4
  82. package/lib/uiappmenucontent/uiappmenucontent.component.d.ts +4 -3
  83. package/lib/uicontent/uicontent.component.d.ts +6 -2
  84. package/lib/uiheader/uiheader.component.d.ts +13 -9
  85. package/lib/zbuttons/zbuttons.component.d.ts +11 -20
  86. package/lib/zcard/zcard.component.d.ts +6 -20
  87. package/lib/zcheckbox/zcheckbox.component.d.ts +6 -36
  88. package/lib/zchip/zchip.component.d.ts +7 -16
  89. package/lib/zdatetime/zdatetime.component.d.ts +6 -14
  90. package/lib/zdiv/zdiv.component.d.ts +11 -18
  91. package/lib/zformcontrol/zformcontrol.component.d.ts +2 -1
  92. package/lib/zgauge/zgauge.component.d.ts +11 -14
  93. package/lib/zgrid/zgrid.binding.directive.d.ts +4 -2
  94. package/lib/zgrid/zgrid.component.d.ts +26 -27
  95. package/lib/zimg/zimg.component.d.ts +12 -31
  96. package/lib/zinput-container/zinput-container.component.d.ts +26 -0
  97. package/lib/zinput-container/zinput-container.pipe.d.ts +20 -0
  98. package/lib/zlabel/zlabel.component.d.ts +6 -25
  99. package/lib/zmfb/zmfb.component.d.ts +12 -20
  100. package/lib/zmodal/zmodal-mobile.component.d.ts +4 -1
  101. package/lib/zmodal/zmodal.component.d.ts +4 -1
  102. package/lib/znumeric/znumeric.component.d.ts +7 -29
  103. package/lib/zpostselectinput/zpostselectinput.component.d.ts +9 -19
  104. package/lib/zprogressbar/zprogressbar.component.d.ts +28 -0
  105. package/lib/zreport/zreport.component.d.ts +8 -11
  106. package/lib/zselectmultiple/zselectmultiple.component.d.ts +10 -35
  107. package/lib/ztab/ztab.component.d.ts +6 -19
  108. package/lib/ztext/ztext.component.d.ts +7 -35
  109. package/lib/ztextarea/ztextarea.component.d.ts +9 -27
  110. package/lib/ztree/ztree.component.d.ts +6 -12
  111. package/lib/ztreelist/ztreelist.component.d.ts +17 -27
  112. package/lib/zupload/zupload.component.d.ts +6 -13
  113. package/lib/zworkflowbuttons/zworkflowbuttons.component.d.ts +6 -20
  114. package/package.json +1 -1
  115. package/public-api.d.ts +14 -1
@@ -1,7 +1,8 @@
1
1
  /********** Angular **********/
2
2
  import { Injectable } from '@angular/core';
3
+ import { NavigationStart, NavigationEnd, NavigationError } from '@angular/router';
3
4
  /********** Plugin **********/
4
- import { BehaviorSubject, of } from 'rxjs';
5
+ import { BehaviorSubject, of, forkJoin } from 'rxjs';
5
6
  import { tap, switchMap, map } from 'rxjs/operators';
6
7
  /********** Component & Service **********/
7
8
  import { MESSAGETYPE, ZComponentHelper, ZGroup } from 'mmhglobal-zcore';
@@ -11,13 +12,14 @@ import * as i0 from "@angular/core";
11
12
  import * as i1 from "@angular/router";
12
13
  import * as i2 from "@ionic/angular";
13
14
  import * as i3 from "mmhglobal-zcore";
14
- import * as i4 from "mmhglobal-zmodal";
15
- import * as i5 from "./zcomponent.debug.service";
15
+ import * as i4 from "./component-error-handler.service";
16
+ import * as i5 from "mmhglobal-zmodal";
17
+ import * as i6 from "./zcomponent.debug.service";
16
18
  // import { ZmodalPage } from '../zmodal/zmodal.page';
17
19
  // import { ZComponentHelper, ZComponentOutputEvent, ModalPageParams, ZGrid } from '../dynamicform/zcomponent.model';
18
20
  // import { ZGroup, ZField } from '../model/zgroup.model';
19
21
  export class MainService {
20
- constructor(router, modalCtrl, navController, alertService, cacheService, fieldService, resourceApiService, toastService, webApiService, zcoreService, modalService, debugService) {
22
+ constructor(router, modalCtrl, navController, alertService, cacheService, fieldService, resourceApiService, componentErrorHandler, webApiService, zcoreService, modalService, storageService, debugService, translationService) {
21
23
  this.router = router;
22
24
  this.modalCtrl = modalCtrl;
23
25
  this.navController = navController;
@@ -25,13 +27,33 @@ export class MainService {
25
27
  this.cacheService = cacheService;
26
28
  this.fieldService = fieldService;
27
29
  this.resourceApiService = resourceApiService;
28
- this.toastService = toastService;
30
+ this.componentErrorHandler = componentErrorHandler;
29
31
  this.webApiService = webApiService;
30
32
  this.zcoreService = zcoreService;
31
33
  this.modalService = modalService;
34
+ this.storageService = storageService;
32
35
  this.debugService = debugService;
36
+ this.translationService = translationService;
37
+ this.backNaviagtionPath = [];
38
+ this.routeParam = [];
33
39
  console.log('MainService constructor');
34
- this.oauthEnvironmentUrl = this.zcoreService.getEnvironment().e1OauthUrl + '/';
40
+ this.environment = this.zcoreService.getEnvironment();
41
+ this.oauthEnvironmentUrl = this.environment.e1OauthUrl + '/';
42
+ this.router.events.subscribe((event) => {
43
+ if (event instanceof NavigationStart) {
44
+ // Show progress spinner or progress bar
45
+ console.log(event);
46
+ }
47
+ if (event instanceof NavigationEnd) {
48
+ // Hide progress spinner or progress bar
49
+ console.log(event);
50
+ }
51
+ if (event instanceof NavigationError) {
52
+ // Hide progress spinner or progress bar
53
+ // Present error to user
54
+ console.log(event.error);
55
+ }
56
+ });
35
57
  }
36
58
  startUp() {
37
59
  console.log('At main.service (StartUp) ...');
@@ -88,6 +110,7 @@ export class MainService {
88
110
  cloneNewModel: this.cloneNewModel.bind(this),
89
111
  deleteModel: this.deleteModel.bind(this),
90
112
  newModel: this.newModel.bind(this),
113
+ // updateEditMode: this.updateEditMode.bind(this),
91
114
  // _isDebugging: environment.debugSession || false,
92
115
  // _debug: {
93
116
  // zData: { collectedActivities: [], activityCount: 0 }
@@ -105,15 +128,17 @@ export class MainService {
105
128
  .httpGet$(group.resourceURL + "/" + recId, null)
106
129
  .pipe(tap((zmodel) => {
107
130
  group.zModel = zmodel;
108
- if (group.parentReferenceField &&
109
- Object.keys(zmodel).indexOf(group.parentReferenceField) !== -1 &&
110
- !group.backNavigationPage.endsWith(".edit")) {
111
- group.backNavigationPage =
112
- group.backNavigationPage +
113
- "/" +
114
- zmodel[group.parentReferenceField].toString() +
115
- "/edit";
116
- }
131
+ //if (
132
+ // group.parentReferenceField &&
133
+ // Object.keys(zmodel).indexOf(group.parentReferenceField) !== -1 &&
134
+ // !group.backNavigationPage.endsWith(".edit")
135
+ //) {
136
+ // group.backNavigationPage =
137
+ // group.backNavigationPage +
138
+ // "/" +
139
+ // zmodel[group.parentReferenceField].toString() +
140
+ // "/edit";
141
+ //}
117
142
  }), switchMap(() => {
118
143
  if (group.afterGetModelSuccess) {
119
144
  return this.afterGetModelSuccess(group);
@@ -188,8 +213,16 @@ export class MainService {
188
213
  // // this.
189
214
  // // });
190
215
  // }
191
- closeModalForm() {
192
- this.modalCtrl.dismiss();
216
+ closeModalForm(group) {
217
+ if (group && group.subject) {
218
+ group.subject.next({
219
+ type: "ModalService.close",
220
+ target: "modalGroup.modalCancel()"
221
+ });
222
+ }
223
+ else {
224
+ this.modalCtrl.dismiss();
225
+ }
193
226
  }
194
227
  subjectEvent(event, group, me) {
195
228
  if (!event || !event.target || event.target.startsWith("modalGroup.")) {
@@ -255,7 +288,9 @@ export class MainService {
255
288
  }
256
289
  }
257
290
  handleSuccess(res, successMsg) {
258
- this.group.isTriggered = false;
291
+ if (this.group) {
292
+ this.tryUpdateGroupTrigger(false);
293
+ }
259
294
  if (res) {
260
295
  if (res.ProcessingStatus) {
261
296
  this.webApiService.showHttpResponseMessage(MESSAGETYPE.Success, successMsg, null);
@@ -263,10 +298,49 @@ export class MainService {
263
298
  return res;
264
299
  }
265
300
  }
301
+ tryUpdateGroupTrigger(value) {
302
+ if (this.group) {
303
+ this.group.isTriggered = value;
304
+ }
305
+ }
266
306
  handleError(res) {
267
- this.group.isTriggered = false;
307
+ this.tryUpdateGroupTrigger(false);
268
308
  return this.webApiService.handleError(res);
269
309
  }
310
+ routeNavigate(pageName, pageParams) {
311
+ this.setNavigationParams(pageParams);
312
+ this.router.navigateByUrl(pageName, { skipLocationChange: false });
313
+ }
314
+ setNavigationParams(urlParams) {
315
+ this.backNaviagtionPath.push(this.router.url);
316
+ this.routeParam.push('/' + urlParams.filter(function (el) {
317
+ return el != '';
318
+ }).join('/'));
319
+ this.storageService.set("backNaviagtionPath", JSON.stringify(this.backNaviagtionPath));
320
+ this.storageService.set("routeParam", JSON.stringify(this.routeParam));
321
+ }
322
+ getNavigationParams() {
323
+ if (!this.routeParam) {
324
+ this.routeParam = JSON.parse(sessionStorage.getItem("routeParam"));
325
+ }
326
+ return this.routeParam;
327
+ }
328
+ getNavigationParentParam() {
329
+ const routeParams = this.getNavigationParams();
330
+ return routeParams[routeParams.length - 2];
331
+ }
332
+ getNavigationCurrentParam() {
333
+ const routeParams = this.getNavigationParams();
334
+ return routeParams[routeParams.length - 1];
335
+ }
336
+ removeLastNavigateRecord() {
337
+ this.backNaviagtionPath = JSON.parse(sessionStorage.getItem("backNaviagtionPath"));
338
+ this.routeParam = JSON.parse(sessionStorage.getItem("routeParam"));
339
+ this.backNaviagtionPath.pop();
340
+ this.routeParam.pop();
341
+ this.storageService.set("backNaviagtionPath", JSON.stringify(this.backNaviagtionPath));
342
+ this.storageService.set("routeParam", JSON.stringify(this.routeParam));
343
+ }
270
344
  backNavigation(event, group, me) {
271
345
  if (group['isEmbeddedPage']) {
272
346
  group['isTriggered'] = false;
@@ -275,29 +349,29 @@ export class MainService {
275
349
  }
276
350
  if (group.beforeBackNavigationPage) {
277
351
  group.beforeBackNavigationPage(group).subscribe(() => {
278
- group['isTriggered'] = false;
279
- this.router.navigate([group.backNavigationPage]);
280
- //if (group['reload']) {
281
- // group['isTriggered'] = false;
282
- // this.router.routeReuseStrategy.shouldReuseRoute = function () {
283
- // return false;
284
- // }
285
- // this.router.onSameUrlNavigation = 'reload';
286
- //}
287
- //this.router.navigate([group.backNavigationPage],);
352
+ this.routerBackNavigate(group);
288
353
  });
289
354
  }
290
355
  else {
291
- group['isTriggered'] = false;
292
- //this.router.routeReuseStrategy.shouldReuseRoute = function () {
293
- // return false;
294
- //}
295
- //this.router.onSameUrlNavigation = 'reload';
296
- this.router.navigate([group.backNavigationPage]);
356
+ this.routerBackNavigate(group);
357
+ }
358
+ }
359
+ routerBackNavigate(group) {
360
+ this.tryUpdateGroupTrigger(false);
361
+ const backNaviagtionPath = JSON.parse(sessionStorage.getItem("backNaviagtionPath"));
362
+ const backNavigationURL = group.backNavigationPage ? group.backNavigationPage : backNaviagtionPath[backNaviagtionPath.length - 1];
363
+ if (backNavigationURL) {
364
+ if (!group.backNavigationPage) {
365
+ this.removeLastNavigateRecord();
366
+ }
367
+ this.router.navigate([backNavigationURL], { skipLocationChange: false });
368
+ }
369
+ else {
370
+ console.log("BackNavigationPath not set.");
297
371
  }
298
372
  }
299
373
  historyBack() {
300
- this.group.isTriggered = false;
374
+ this.tryUpdateGroupTrigger(false);
301
375
  if (this.group['isEmbeddedPage']) {
302
376
  this.closeContainerView(this.group);
303
377
  return;
@@ -324,7 +398,7 @@ export class MainService {
324
398
  }
325
399
  refreshPage() {
326
400
  if (this.group) {
327
- this.group.isTriggered = false;
401
+ this.tryUpdateGroupTrigger(false);
328
402
  }
329
403
  location.reload();
330
404
  // this.router.routeReuseStrategy.shouldReuseRoute = () => false;
@@ -353,8 +427,8 @@ export class MainService {
353
427
  console.log("Before new, zModel:", zmodel);
354
428
  return this.beforeNewModel(_group);
355
429
  }), tap(() => {
356
- const referenceId = group.parentReferenceId || "0";
357
430
  console.log("current url: ", this.router.url);
431
+ const referenceId = group.parentReferenceId || "0";
358
432
  const pathSegment = this.router.url.split("/");
359
433
  const lastSegment = pathSegment[pathSegment.length - 1];
360
434
  if (lastSegment === "edit") {
@@ -386,8 +460,12 @@ export class MainService {
386
460
  group.zModel[group.parentReferenceField] = group.parentReferenceId.toString();
387
461
  }
388
462
  else {
389
- group.isTriggered = false;
390
- this.router.navigate([group.editModelURL, referenceId, "new"], {
463
+ this.tryUpdateGroupTrigger(false);
464
+ //this.router.navigate([group.editModelURL, referenceId, "new"], {
465
+ // relativeTo: group.ctrlScope.activatedRoute,
466
+ //});
467
+ this.setNavigationParams([referenceId, 'new']);
468
+ this.router.navigate([group.editModelURL], {
391
469
  relativeTo: group.ctrlScope.activatedRoute,
392
470
  });
393
471
  //this.router.navigate([group.editModelURL, referenceId, "new"]);
@@ -410,8 +488,7 @@ export class MainService {
410
488
  return;
411
489
  }
412
490
  if (!fg.valid) {
413
- const errors = ZComponentHelper.getFormGroupErrors(fg, this.alertService, group);
414
- console.warn("Form Validation got error(s):", errors);
491
+ this.componentErrorHandler.showFormGroupErrorMessage(group, fg);
415
492
  return;
416
493
  }
417
494
  of(_group.zModel)
@@ -437,7 +514,10 @@ export class MainService {
437
514
  .pipe(tap((resp) => {
438
515
  createModelres = resp;
439
516
  return resp;
440
- }), map((res) => this.handleSuccess(res, "Record is created successfully.")));
517
+ }), map((res) => {
518
+ const resMessage = event.data['SuccessCreatedMessage'] ? event.data['SuccessCreatedMessage'] : "Record is created successfully.";
519
+ this.handleSuccess(res, resMessage);
520
+ }));
441
521
  }), switchMap((zmodel) => {
442
522
  console.log("After created, zModel:", zmodel);
443
523
  if (zmodel) {
@@ -475,60 +555,53 @@ export class MainService {
475
555
  .subscribe();
476
556
  }
477
557
  updateModel(event, group) {
478
- let fg = group.form;
558
+ this.updateModelObservable(event, group).subscribe();
559
+ }
560
+ updateModelObservable(event, group, form = null, updateAPIObservable = null, isSkipDirty = false) {
561
+ let fg = form || group.form;
479
562
  let _group = group;
480
563
  if (event) {
481
564
  if (event.data && event.data.SubType) {
482
- fg = group['_' + event.data.SubType].form;
483
- _group = group['_' + event.data.SubType];
565
+ fg = _group['_' + event.data.SubType].form;
566
+ _group = _group['_' + event.data.SubType];
484
567
  }
485
568
  }
486
- if (!fg.dirty) {
487
- console.warn("Form is not dirty hence record is not save.");
488
- return;
569
+ if (!this.isFormDirtyAndValid(fg, _group, isSkipDirty)) {
570
+ if (isSkipDirty) {
571
+ fg.markAllAsTouched();
572
+ }
573
+ return of(false);
489
574
  }
490
- if (!fg.valid) {
491
- const errors = ZComponentHelper.getFormGroupErrors(fg, this.alertService, group);
492
- console.warn("Form Validation got error(s):", errors);
493
- return;
575
+ updateAPIObservable = updateAPIObservable || this.webApiService.httpPut$(_group.resourceURL + "/" + _group.zModel.Id, _group.zModel)
576
+ .pipe(map((res) => {
577
+ const resMessage = event.data['SuccessUpdatedMessage'] ? event.data['SuccessUpdatedMessage'] : "Record is updated successfully.";
578
+ this.handleSuccess(res, resMessage);
494
579
  }
495
- of(_group.zModel)
580
+ //this.handleSuccess(res, "Record is updated successfully.")
581
+ ));
582
+ return of(_group.zModel)
496
583
  .pipe(switchMap((zmodel) => {
497
584
  console.log("Before update, zModel:", zmodel);
498
585
  return this.beforeUpdateModel(_group);
499
586
  }), tap(() => {
500
587
  Object.assign(_group.zModel, fg.value);
501
588
  }), switchMap(() => {
502
- return this.webApiService
503
- .httpPut$(_group.resourceURL + "/" + _group.zModel.Id, _group.zModel)
504
- .pipe(map((res) => this.handleSuccess(res, "Record is updated successfully.")));
589
+ return updateAPIObservable;
505
590
  }), switchMap((zmodel) => {
506
591
  console.log("After updated, zModel:", zmodel);
507
592
  if (zmodel && zmodel.Data) {
508
593
  Object.assign(_group.zModel, zmodel.Data);
509
594
  fg.patchValue(zmodel.Data);
510
- // console.log("Done updateModel updated zModel:", fg.value);
511
595
  }
512
596
  else if (zmodel && zmodel["Id"]) {
513
597
  Object.assign(_group.zModel, zmodel);
514
598
  fg.patchValue(zmodel);
515
- // console.log("Done updateModel updated zModel:", fg.value);
516
599
  }
517
600
  group.isTriggered = false;
518
601
  _group.isTriggered = false;
519
602
  fg.markAsPristine();
520
603
  return this.afterUpdateModel(_group, zmodel);
521
- }))
522
- .subscribe();
523
- // Object.assign(group.zModel, fg.value);
524
- // this.webApiService
525
- // .httpPut$(group.resourceURL + "/" + group.zModel.Id, group.zModel)
526
- // .subscribe(resp => {
527
- // Object.assign(group.zModel, resp);
528
- // fg.patchValue(resp);
529
- // fg.markAsPristine();
530
- // console.log("Done updateModel updated zModel:", fg.value);
531
- // });
604
+ }));
532
605
  }
533
606
  cloneNewModel(event, group) {
534
607
  let _group = group;
@@ -589,6 +662,17 @@ export class MainService {
589
662
  }))
590
663
  .subscribe();
591
664
  }
665
+ isFormDirtyAndValid(fg, group, isSkipDirty = false) {
666
+ if (!isSkipDirty && !fg.dirty) {
667
+ console.warn("Form is not dirty hence record is not save.");
668
+ return false;
669
+ }
670
+ if (!fg.valid) {
671
+ this.componentErrorHandler.showFormGroupErrorMessage(group, fg);
672
+ return false;
673
+ }
674
+ return true;
675
+ }
592
676
  beforeUpdateModel(group) {
593
677
  if (!group.beforeUpdateModel) {
594
678
  console.warn("group.beforeUpdateModel is undefined");
@@ -742,6 +826,20 @@ export class MainService {
742
826
  }
743
827
  }));
744
828
  }
829
+ scrollToElementById(id) {
830
+ let el = document.getElementById(id);
831
+ el.scrollIntoView({ behavior: 'smooth' });
832
+ }
833
+ translationPageElement(group) {
834
+ const obsList = new Array();
835
+ if (group.formHeader) {
836
+ obsList.push(this.translationService.$translateSingleItem(group, "formHeader", this.environment.applicationShortName));
837
+ }
838
+ if (group.navItems && group.navItems.length > 0) {
839
+ obsList.push(this.translationService.$translateItemList(group.navItems, "text", this.environment.applicationShortName));
840
+ }
841
+ return forkJoin(obsList);
842
+ }
745
843
  async loadContainerView(elementContainer, containerPage, group) {
746
844
  if (!elementContainer) {
747
845
  console.log("ElementContainer is null.");
@@ -765,14 +863,14 @@ export class MainService {
765
863
  }
766
864
  }
767
865
  }
768
- MainService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: MainService, deps: [{ token: i1.Router }, { token: i2.ModalController }, { token: i2.NavController }, { token: i3.AlertService }, { token: i3.CacheService }, { token: i3.FieldService }, { token: i3.ResourceApiService }, { token: i3.ToastService }, { token: i3.WebApiService }, { token: i3.ZCoreService }, { token: i4.ModalService }, { token: i5.ZComponentDebugService }], target: i0.ɵɵFactoryTarget.Injectable });
866
+ MainService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: MainService, deps: [{ token: i1.Router }, { token: i2.ModalController }, { token: i2.NavController }, { token: i3.AlertService }, { token: i3.CacheService }, { token: i3.FieldService }, { token: i3.ResourceApiService }, { token: i4.ComponentErrorHandlerService }, { token: i3.WebApiService }, { token: i3.ZCoreService }, { token: i5.ModalService }, { token: i3.StorageSessionService }, { token: i6.ZComponentDebugService }, { token: i3.TranslationService }], target: i0.ɵɵFactoryTarget.Injectable });
769
867
  MainService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: MainService, providedIn: 'root' });
770
868
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: MainService, decorators: [{
771
869
  type: Injectable,
772
870
  args: [{
773
871
  providedIn: 'root',
774
872
  }]
775
- }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.ModalController }, { type: i2.NavController }, { type: i3.AlertService }, { type: i3.CacheService }, { type: i3.FieldService }, { type: i3.ResourceApiService }, { type: i3.ToastService }, { type: i3.WebApiService }, { type: i3.ZCoreService }, { type: i4.ModalService }, { type: i5.ZComponentDebugService }]; } });
873
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.ModalController }, { type: i2.NavController }, { type: i3.AlertService }, { type: i3.CacheService }, { type: i3.FieldService }, { type: i3.ResourceApiService }, { type: i4.ComponentErrorHandlerService }, { type: i3.WebApiService }, { type: i3.ZCoreService }, { type: i5.ModalService }, { type: i3.StorageSessionService }, { type: i6.ZComponentDebugService }, { type: i3.TranslationService }]; } });
776
874
  export function refreshGrid(group) {
777
875
  const zgridControl = group["gridOptions"];
778
876
  if (zgridControl) {
@@ -780,4 +878,4 @@ export function refreshGrid(group) {
780
878
  }
781
879
  group.isTriggered = false;
782
880
  }
783
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvc2VydmljZXMvbWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU96RCw4QkFBOEI7QUFDOUIsT0FBTyxFQUFjLGVBQWUsRUFBZ0IsRUFBRSxFQUF1QixNQUFNLE1BQU0sQ0FBQztBQUMxRixPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBUSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCwyQ0FBMkM7QUFDM0MsT0FBTyxFQUNRLFdBQVcsRUFFeEIsZ0JBQWdCLEVBQStELE1BQU0sRUFDdEYsTUFBTSxpQkFBaUIsQ0FBQztBQUl6QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7QUFFMUUsc0RBQXNEO0FBRXRELHFIQUFxSDtBQUNySCwwREFBMEQ7QUFLMUQsTUFBTSxPQUFPLFdBQVc7SUFJdEIsWUFDVSxNQUFjLEVBQ2QsU0FBMEIsRUFDMUIsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsa0JBQXNDLEVBQ3RDLFlBQTBCLEVBQzFCLGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLFlBQW9DO1FBWHBDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMx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cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnRSZWYsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBOYXZDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBvZiwgZnJvbSwgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YXAsIHN3aXRjaE1hcCwgdGFrZSwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQge1xyXG4gIEFsZXJ0QnV0dG9uLCBNRVNTQUdFVFlQRSwgTW9kYWxQYWdlUGFyYW1zLFxyXG4gIEFsZXJ0U2VydmljZSwgQ2FjaGVTZXJ2aWNlLCBGaWVsZFNlcnZpY2UsIFJlc291cmNlQXBpU2VydmljZSwgVG9hc3RTZXJ2aWNlLCBXZWJBcGlTZXJ2aWNlLFxyXG4gIFpDb21wb25lbnRIZWxwZXIsIFpDb21wb25lbnRPdXRwdXRFdmVudCwgWkNvbXBvbmVudFNpemUsIFpDb3JlU2VydmljZSwgWkZpZWxkLCBaR3JvdXBcclxufSBmcm9tICdtbWhnbG9iYWwtemNvcmUnO1xyXG5pbXBvcnQgeyBNb2RhbFNlcnZpY2UsIE1vZGFsUmVzcG9uc2UgfSBmcm9tICdtbWhnbG9iYWwtem1vZGFsJztcclxuLy8gaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vem1vZGFsL21vZGFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50RGVidWdTZXJ2aWNlIH0gZnJvbSAnLi96Y29tcG9uZW50LmRlYnVnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBabW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi96bW9kYWwvem1vZGFsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFptb2RhbE1vYmlsZUNvbXBvbmVudCB9IGZyb20gJy4uL3ptb2RhbC96bW9kYWwtbW9iaWxlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFpHcmlkIH0gZnJvbSAnLi4vemdyaWQvemdyaWQuY29tcG9uZW50JztcclxuLy8gaW1wb3J0IHsgWm1vZGFsUGFnZSB9IGZyb20gJy4uL3ptb2RhbC96bW9kYWwucGFnZSc7XHJcblxyXG4vLyBpbXBvcnQgeyBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIE1vZGFsUGFnZVBhcmFtcywgWkdyaWQgfSBmcm9tICcuLi9keW5hbWljZm9ybS96Y29tcG9uZW50Lm1vZGVsJztcclxuLy8gaW1wb3J0IHsgWkdyb3VwLCBaRmllbGQgfSBmcm9tICcuLi9tb2RlbC96Z3JvdXAubW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE1haW5TZXJ2aWNlIHtcclxuICBwcml2YXRlIGdyb3VwOiBaR3JvdXA7XHJcbiAgcHJpdmF0ZSBvYXV0aEVudmlyb25tZW50VXJsOiBzdHJpbmc7XHJcbiAgIFxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgbW9kYWxDdHJsOiBNb2RhbENvbnRyb2xsZXIsXHJcbiAgICBwcml2YXRlIG5hdkNvbnRyb2xsZXI6IE5hdkNvbnRyb2xsZXIsXHJcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjYWNoZVNlcnZpY2U6IENhY2hlU2VydmljZSxcclxuICAgIHByaXZhdGUgZmllbGRTZXJ2aWNlOiBGaWVsZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlc291cmNlQXBpU2VydmljZTogUmVzb3VyY2VBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgemNvcmVTZXJ2aWNlOiBaQ29yZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkZWJ1Z1NlcnZpY2U6IFpDb21wb25lbnREZWJ1Z1NlcnZpY2VcclxuICApIHtcclxuICAgIGNvbnNvbGUubG9nKCdNYWluU2VydmljZSBjb25zdHJ1Y3RvcicpO1xyXG4gICAgdGhpcy5vYXV0aEVudmlyb25tZW50VXJsID0gdGhpcy56Y29yZVNlcnZpY2UuZ2V0RW52aXJvbm1lbnQoKS5lMU9hdXRoVXJsICsgJy8nO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRVcCgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdBdCBtYWluLnNlcnZpY2UgKFN0YXJ0VXApIC4uLicpO1xyXG4gIH1cclxuXHJcbiAgc2V0R3JvdXAoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy5ncm91cCA9IGdyb3VwO1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy53ZWJBcGlTZXJ2aWNlLnNldEdyb3VwKGdyb3VwKTtcclxuICAgIGNvbnN0IGlzRGVidWdnaW5nID0gdGhpcy56Y29yZVNlcnZpY2UuaXNEZWJ1Z1Nlc3Npb24oKSB8fCBmYWxzZTtcclxuICAgIGlmIChpc0RlYnVnZ2luZykge1xyXG4gICAgICB0aGlzLmRlYnVnU2VydmljZS5vbkluaXREZWJ1Z2dlcihncm91cCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRSZXNvdXJjZVNlcnZlckRhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UubG9hZERhdGEoKTtcclxuICB9XHJcblxyXG4gIGdldEdyb3VwRmllbGRzKFxyXG4gICAgY3RybE5hbWU6IHN0cmluZyxcclxuICAgIGZvcm1UeXBlOiBcIkxpc3RGaWVsZFwiIHwgXCJGb3JtRmllbGRcIixcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoXHJcbiAgICAgIGN0cmxOYW1lLFxyXG4gICAgICBmb3JtVHlwZSxcclxuICAgICAgZ3JvdXAsXHJcbiAgICAgIHByb3BlcnR5TmFtZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVHcm91cChcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBjdHJsTmFtZTogc3RyaW5nLFxyXG4gICAgcGFnZU5hbWU6IHN0cmluZyxcclxuICAgIG1lOiBhbnlcclxuICApOiBTdWJzY3JpcHRpb24ge1xyXG4gICAgaWYgKG1lLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICBtZS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGdyb3VwLnJlc291cmNlVVJMTmFtZSB8fCBjdHJsTmFtZTtcclxuICAgIGdyb3VwLnJlc291cmNlVVJMTmFtZSA9IHJlc291cmNlTmFtZTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwLCB7XHJcbiAgICAgIHJlc291cmNlVVJMOiB0aGlzLnJlc291cmNlQXBpU2VydmljZS5nZXRVUkwocmVzb3VyY2VOYW1lKSxcclxuICAgICAgZ3JpZENvbHVtbkZpZWxkczogdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgICBjdHJsTmFtZSxcclxuICAgICAgICBcIkZvcm1GaWVsZFwiLFxyXG4gICAgICAgIG51bGwsXHJcbiAgICAgICAgbnVsbFxyXG4gICAgICApLFxyXG4gICAgICBjdHJsU2NvcGU6IG1lLFxyXG4gICAgICBwYWdlTmFtZSxcclxuICAgICAgY3RybE5hbWUsXHJcbiAgICAgIC8vIGNyZWF0ZU1vZGVsVVJMOiBcIi9jcmVhdGVcIiArIGN0cmxOYW1lLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIGVkaXRNb2RlbFVSTDogY3RybE5hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgLy8gbGlzdE1vZGVsVVJMOiBcIi9saXN0XCIgKyBjdHJsTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAvLyBmb3JtSGVhZGVyOiBcIi4uLlwiLFxyXG4gICAgICBpc0xvYWRpbmc6IHRydWUsXHJcbiAgICAgIGZpZWxkczogW10sXHJcbiAgICAgIHpNb2RlbDoge30sXHJcbiAgICAgIHpDb21wb25lbnRzOiB7fSxcclxuICAgICAgekRhdGE6IHt9LFxyXG4gICAgICBzdWJqZWN0OiBuZXcgQmVoYXZpb3JTdWJqZWN0PFpDb21wb25lbnRPdXRwdXRFdmVudD4obnVsbCksXHJcbiAgICAgIC8vIGZvcm06IG51bGwgYXMgRm9ybUdyb3VwLCAvLyByZW1vdmVkIGZvciBidWcgZml4LlxyXG4gICAgICBjYW5jZWxCdXR0b25OYW1lOiBcIkNsb3NlXCIsXHJcbiAgICAgIHpCdXR0b25zQ291bnQ6IDAsXHJcbiAgICAgIC8vIHRvcFJpZ2h0QWN0aW9uQnV0dG9uOiBbXSxcclxuICAgICAgLy8gb25BY3Rpb246IHRoaXMub25BY3Rpb24uYmluZCh0aGlzKSxcclxuICAgICAgYmFja05hdmlnYXRpb246IHRoaXMuYmFja05hdmlnYXRpb24uYmluZCh0aGlzKSxcclxuICAgICAgaGlzdG9yeUJhY2s6IHRoaXMuaGlzdG9yeUJhY2suYmluZCh0aGlzKSxcclxuICAgICAgcmVmcmVzaFBhZ2U6IHRoaXMucmVmcmVzaFBhZ2UsXHJcbiAgICAgIHJlZnJlc2hHcmlkOiB0aGlzLnJlZnJlc2hHcmlkLmJpbmQodGhpcyksXHJcbiAgICAgIHVwZGF0ZU1vZGVsOiB0aGlzLnVwZGF0ZU1vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIGNyZWF0ZU1vZGVsOiB0aGlzLmNyZWF0ZU1vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIGNsb25lTmV3TW9kZWw6IHRoaXMuY2xvbmVOZXdNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICBkZWxldGVNb2RlbDogdGhpcy5kZWxldGVNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICBuZXdNb2RlbDogdGhpcy5uZXdNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICAvLyBfaXNEZWJ1Z2dpbmc6IGVudmlyb25tZW50LmRlYnVnU2Vzc2lvbiB8fCBmYWxzZSxcclxuICAgICAgLy8gX2RlYnVnOiB7XHJcbiAgICAgIC8vICAgekRhdGE6ICB7IGNvbGxlY3RlZEFjdGl2aXRpZXM6IFtdLCBhY3Rpdml0eUNvdW50OiAwIH1cclxuICAgICAgLy8gfVxyXG4gICAgICAvLyBhZnRlckdldE1vZGVsU3VjY2VzczogbnVsbCxcclxuICAgICAgLy8gYmVmb3JlVXBkYXRlTW9kZWw6IG51bGwsXHJcbiAgICAgIC8vIGlzRWRpdDogZmFsc2VcclxuICAgIH0pO1xyXG5cclxuICAgIG1lLnN1YnNjcmlwdGlvbiA9IGdyb3VwLnN1YmplY3Quc3Vic2NyaWJlKChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50KSA9PlxyXG4gICAgICB0aGlzLnN1YmplY3RFdmVudChldmVudCwgZ3JvdXAsIG1lKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gbWUuc3Vic2NyaXB0aW9uO1xyXG4gIH1cclxuXHJcbiAgZ2V0TW9kZWwkKGdyb3VwOiBaR3JvdXAsIGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgcmVjSWQgPSBpZCB8fCBncm91cC5yZWZlcmVuY2VJZDtcclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2VcclxuICAgICAgLmh0dHBHZXQkKGdyb3VwLnJlc291cmNlVVJMICsgXCIvXCIgKyByZWNJZCwgbnVsbClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGdyb3VwLnpNb2RlbCA9IHptb2RlbDtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGQgJiZcclxuICAgICAgICAgICAgT2JqZWN0LmtleXMoem1vZGVsKS5pbmRleE9mKGdyb3VwLnBhcmVudFJlZmVyZW5jZUZpZWxkKSAhPT0gLTEgJiZcclxuICAgICAgICAgICAgIWdyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZS5lbmRzV2l0aChcIi5lZGl0XCIpXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlID1cclxuICAgICAgICAgICAgICBncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UgK1xyXG4gICAgICAgICAgICAgIFwiL1wiICtcclxuICAgICAgICAgICAgICB6bW9kZWxbZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGRdLnRvU3RyaW5nKCkgK1xyXG4gICAgICAgICAgICAgIFwiL2VkaXRcIjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIGNhbkV4aXQoZm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB8IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFmb3JtIHx8ICFmb3JtLmRpcnR5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmb3JtWydza2lwRGlydHlDaGVjayddKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmFsZXJ0U2VydmljZVxyXG4gICAgICAuc2hvdyhcIkRhdGEgbm90IHNhdmUgeWV0XCIsIFwiQXJlIHlvdSBzdXJlIHdhbnQgdG8gZGlzY2FyZCB0aGUgY2hhbmdlcz9cIiwgW1xyXG4gICAgICAgIFwiQ2FuY2VsXCIsXHJcbiAgICAgICAgXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgICAgXSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcGx5ID09PSBcIkRpc2NhcmQgQ2hhbmdlc1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIC8vIGNvbnN0IHJlcGx5U3ViID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICAgIC8vIHRoaXMuYWxlcnRDdHJsXHJcbiAgICAvLyAgIC5jcmVhdGUoe1xyXG4gICAgLy8gICAgIGhlYWRlcjogXCJEYXRhIG5vdCBzYXZlIHlldFwiLFxyXG4gICAgLy8gICAgIC8vIHN1YkhlYWRlcjogJ1N1YkhlYWRlciBzdGF0ZW1lbnQgaGVyZScsXHJcbiAgICAvLyAgICAgbWVzc2FnZTogXCJBcmUgeW91IHN1cmUgd2FudCB0byBkaXNjYXJkIHRoZSBjaGFuZ2VzP1wiLFxyXG4gICAgLy8gICAgIGJ1dHRvbnM6IFtcclxuICAgIC8vICAgICAgIHtcclxuICAgIC8vICAgICAgICAgdGV4dDogXCJDYW5jZWxcIixcclxuICAgIC8vICAgICAgICAgcm9sZTogXCJjYW5jZWxcIixcclxuICAgIC8vICAgICAgICAgY3NzQ2xhc3M6IFwic2Vjb25kYXJ5XCIsXHJcbiAgICAvLyAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcclxuICAgIC8vICAgICAgICAgICByZXBseVN1Yi5uZXh0KGZhbHNlKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfSxcclxuICAgIC8vICAgICAgIHtcclxuICAgIC8vICAgICAgICAgdGV4dDogXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgIC8vICAgICAgICAgY3NzQ2xhc3M6IFwid2FybmluZ1wiLFxyXG4gICAgLy8gICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgcmVwbHlTdWIubmV4dCh0cnVlKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIF1cclxuICAgIC8vICAgfSlcclxuICAgIC8vICAgLnRoZW4oYWxlcnRFbGVtZW50ID0+IHtcclxuICAgIC8vICAgICBhbGVydEVsZW1lbnQucHJlc2VudCgpO1xyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIHJldHVybiByZXBseVN1Yi5hc09ic2VydmFibGUoKS5waXBlKHRha2UoMSkpO1xyXG4gIH1cclxuXHJcbiAgLy8gYXN5bmMgb3Blbk1vZGFsRm9ybShtb2RhbFBhcmFtczogTW9kYWxQYWdlUGFyYW1zKSB7XHJcbiAgLy8gICAvLyBjb25zb2xlLmxvZyhcIm9wZW5Nb2RhbEZvcm1cIik7XHJcbiAgLy8gICBjb25zb2xlLmVycm9yKFxyXG4gIC8vICAgICBcIlBsZWFzZSB1c2UgTW9kYWxTZXJ2aWNlLnNob3cgaW5zdGVhZCBvZiBNYWluU2VydmljZS5vcGVuTW9kYWxGb3JtIVwiXHJcbiAgLy8gICApO1xyXG4gIC8vICAgLy8gY29uc3QgbW9kYWwgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KG1vZGFsUGFyYW1zLmNvbEZpZWxkcyQgfHwgbW9kYWxQYXJhbXMuY29udHJvbGxlck5hbWUsIG1vZGFsUGFyYW1zLnBhcmVudEdyb3VwLFxyXG4gIC8vICAgLy8gICBtb2RhbFBhcmFtcy5mb3JtSGVhZGVyLCBtb2RhbFBhcmFtcy56TW9kZWwsIG1vZGFsUGFyYW1zLnJlZmVySWQpO1xyXG4gIC8vICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xyXG4gIC8vICAgICBjb21wb25lbnQ6IFptb2RhbFBhZ2UsXHJcbiAgLy8gICAgIGJhY2tkcm9wRGlzbWlzczogdHJ1ZSxcclxuICAvLyAgICAgY29tcG9uZW50UHJvcHM6IHtcclxuICAvLyAgICAgICBtb2RhbFBhcmFtcyxcclxuICAvLyAgICAgfSxcclxuICAvLyAgIH0pO1xyXG4gIC8vICAgbW9kYWwucHJlc2VudCgpO1xyXG4gIC8vICAgcmV0dXJuIG1vZGFsO1xyXG4gIC8vICAgLy8gLm9uV2lsbERpc21pc3MoKHptb2RlbDogYW55KSA9PiB7XHJcbiAgLy8gICAvLyAgIHRoaXMuXHJcbiAgLy8gICAvLyB9KTtcclxuICAvLyB9XHJcblxyXG4gIGNsb3NlTW9kYWxGb3JtKCkge1xyXG4gICAgdGhpcy5tb2RhbEN0cmwuZGlzbWlzcygpO1xyXG4gIH1cclxuXHJcbiAgc3ViamVjdEV2ZW50KGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpIHtcclxuICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LnRhcmdldCB8fCBldmVudC50YXJnZXQuc3RhcnRzV2l0aChcIm1vZGFsR3JvdXAuXCIpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKFwiPj4gU3ViamVjdEV2ZW50XCIsIGV2ZW50KTtcclxuICAgIGxldCBjYWxsRnVuYztcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjYWxsRnVuYyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbChcclxuICAgICAgICBncm91cC5jdHJsU2NvcGUsXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LFxyXG4gICAgICAgIGdyb3VwXHJcbiAgICAgICk7XHJcbiAgICAgIC8vIFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShldmVudC5UYXJnZXQsIGdyb3VwKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBcIkVycm9yIHdoZW4gZ2V0R3JvdXBWYWx1ZTogXCIsXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LFxyXG4gICAgICAgIFwiID4gRXJyb3I6IFwiLFxyXG4gICAgICAgIGVycm9yXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2FsbEZ1bmMoZXZlbnQpO1xyXG4gICAgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIGNvbnN0IG5ld0Z1bmMgPSBjYWxsRnVuYy5iaW5kKG1lKTtcclxuICAgICAgbmV3RnVuYyhldmVudCwgZ3JvdXAsIG1lKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIGlmIChldmVudC50eXBlLmVuZHNXaXRoKFwib25OYXZpZ2F0ZVRvXCIpKSB7XHJcbiAgICAgICAgY29uc3QgblVybCA9IGV2ZW50LnRhcmdldC5yZXBsYWNlKFwiLzppZFwiLCBcIi9cIiArIGV2ZW50LmRhdGEpO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtuVXJsXSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJ6Z3JpZC1jZWxsQ2xpY2tcIikge1xyXG4gICAgICAgIC8vIChjYWxsRnVuYy5zdGFydHNXaXRoKCdlZGl0JykpIHsgIHpncmlkLWNlbGxDbGlja1xyXG4gICAgICAgIGNvbnN0IGNOYW1lID0gY2FsbEZ1bmMuc2xpY2UoNCk7XHJcbiAgICAgICAgLy8gLy8gZGVidWdnZXI7XHJcbiAgICAgICAgLy8gY29uc3QgbW9kYWxHcm91cFBhcmFtOiBNb2RhbFBhZ2VQYXJhbXMgPSB7fTtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0uY29udHJvbGxlck5hbWUgPSBjTmFtZTtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0ucmVmZXJJZCA9IGV2ZW50LmRhdGEuSWQ7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLmNvbEZpZWxkcyQgPSBldmVudC5jb2x1bW5GaWVsZHMkO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5wYXJlbnRHcm91cCA9IG1lLmdyb3VwO1xyXG5cclxuICAgICAgICAvLyB0aGlzLm9wZW5Nb2RhbEZvcm0obW9kYWxHcm91cFBhcmFtKTtcclxuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5zaG93KFxyXG4gICAgICAgICAgZXZlbnQuY29sdW1uRmllbGRzJCB8fCBjTmFtZSxcclxuICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgXCJcIixcclxuICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgZXZlbnQuZGF0YS5JZFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBcInpncmlkLWNlbGxDbGlja1wiKSB7XHJcbiAgICAgICAgaWYgKGNhbGxGdW5jLm5hdmlnYXRlVXJsKSB7XHJcbiAgICAgICAgICBjb25zdCB1cmwgPSBjYWxsRnVuYy5uYXZpZ2F0ZVVybC5yZXBsYWNlKFwiOmlkXCIsIGV2ZW50LmRhdGEuSWQpO1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3VybF0pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbW9kYWxHcm91cFBhcmFtOiBNb2RhbFBhZ2VQYXJhbXMgPSB7fTtcclxuICAgICAgICBtb2RhbEdyb3VwUGFyYW0uY29udHJvbGxlck5hbWUgPSBjYWxsRnVuYy5jdHJsTmFtZTtcclxuICAgICAgICBtb2RhbEdyb3VwUGFyYW0ucmVmZXJJZCA9IGV2ZW50LmRhdGEuSWQ7XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLmNvbEZpZWxkcyQgPSBldmVudC5jb2x1bW5GaWVsZHMkO1xyXG4gICAgICAgIG1vZGFsR3JvdXBQYXJhbS5wYXJlbnRHcm91cCA9IG1lLmdyb3VwO1xyXG4gICAgICAgIG1vZGFsR3JvdXBQYXJhbS5mb3JtSGVhZGVyID0gY2FsbEZ1bmMuZm9ybUhlYWRlcjtcclxuXHJcbiAgICAgICAgaWYgKGNhbGxGdW5jLmZvcm1IZWFkZXIpIHtcclxuICAgICAgICAgIC8vIHRoaXMub3Blbk1vZGFsRm9ybShtb2RhbEdyb3VwUGFyYW0pO1xyXG4gICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhcclxuICAgICAgICAgICAgZXZlbnQuY29sdW1uRmllbGRzJCB8fCBjYWxsRnVuYy5jdHJsTmFtZSxcclxuICAgICAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgICAgIGNhbGxGdW5jLmZvcm1IZWFkZXIsXHJcbiAgICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgICBldmVudC5kYXRhLklkXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICBcIkludmFsaWQgY2FsbEZ1bmMgdHlwZTogXCIsXHJcbiAgICAgICAgICBjYWxsRnVuYyxcclxuICAgICAgICAgIFwiIGV2ZW50LlRhcmdldDogXCIsXHJcbiAgICAgICAgICBldmVudC50YXJnZXRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHRoaXMub3Blbk1vZGFsRm9ybUJ5Q29tcG9uZW50KGNhbGxGdW5jLnR5cGUsIGV2ZW50LkRhdGEuSWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiRnVuY3Rpb24gbm90IGRlZmluZWQgaW4gZ3JvdXAgZm9yOiBcIixcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgXCIsIEV2ZW50OiBcIixcclxuICAgICAgICBldmVudFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlU3VjY2VzcyhyZXM6IFJlc3BvbnNlIHwgYW55LCBzdWNjZXNzTXNnOiBzdHJpbmcpOiBSZXNwb25zZSB7XHJcbiAgICB0aGlzLmdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHJlcykge1xyXG4gICAgICBpZiAocmVzLlByb2Nlc3NpbmdTdGF0dXMpIHtcclxuICAgICAgICB0aGlzLndlYkFwaVNlcnZpY2Uuc2hvd0h0dHBSZXNwb25zZU1lc3NhZ2UoXHJcbiAgICAgICAgICBNRVNTQUdFVFlQRS5TdWNjZXNzLFxyXG4gICAgICAgICAgc3VjY2Vzc01zZyxcclxuICAgICAgICAgIG51bGxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFcnJvcihyZXM6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICB0aGlzLmdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmhhbmRsZUVycm9yKHJlcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJhY2tOYXZpZ2F0aW9uKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpIHtcclxuICAgIGlmIChncm91cFsnaXNFbWJlZGRlZFBhZ2UnXSkge1xyXG4gICAgICBncm91cFsnaXNUcmlnZ2VyZWQnXSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNsb3NlQ29udGFpbmVyVmlldyhncm91cCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZ3JvdXAuYmVmb3JlQmFja05hdmlnYXRpb25QYWdlKSB7XHJcbiAgICAgIGdyb3VwLmJlZm9yZUJhY2tOYXZpZ2F0aW9uUGFnZShncm91cCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBncm91cFsnaXNUcmlnZ2VyZWQnXSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtncm91cC5iYWNrTmF2aWdhdGlvblBhZ2VdKTtcclxuXHJcbiAgICAgICAgLy9pZiAoZ3JvdXBbJ3JlbG9hZCddKSB7XHJcbiAgICAgICAgLy8gIGdyb3VwWydpc1RyaWdnZXJlZCddID0gZmFsc2U7XHJcbiAgICAgICAgLy8gIHRoaXMucm91dGVyLnJvdXRlUmV1c2VTdHJhdGVneS5zaG91bGRSZXVzZVJvdXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAvLyAgfVxyXG4gICAgICAgIC8vICB0aGlzLnJvdXRlci5vblNhbWVVcmxOYXZpZ2F0aW9uID0gJ3JlbG9hZCc7XHJcbiAgICAgICAgLy99XHJcbiAgICAgICAgLy90aGlzLnJvdXRlci5uYXZpZ2F0ZShbZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlXSwpO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGdyb3VwWydpc1RyaWdnZXJlZCddID0gZmFsc2U7XHJcblxyXG4gICAgICAvL3RoaXMucm91dGVyLnJvdXRlUmV1c2VTdHJhdGVneS5zaG91bGRSZXVzZVJvdXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAvLyAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAvL31cclxuICAgICAgLy90aGlzLnJvdXRlci5vblNhbWVVcmxOYXZpZ2F0aW9uID0gJ3JlbG9hZCc7XHJcblxyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhpc3RvcnlCYWNrKCkge1xyXG4gICAgdGhpcy5ncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLmdyb3VwWydpc0VtYmVkZGVkUGFnZSddKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VDb250YWluZXJWaWV3KHRoaXMuZ3JvdXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAgXHJcbiAgICB0aGlzLm5hdkNvbnRyb2xsZXIucG9wKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaEdyaWQoXHJcbiAgICBldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LFxyXG4gICAgZ3JvdXA6IFpHcm91cCxcclxuICAgIG1lOiBhbnksXHJcbiAgICBncmlkT3B0aW9uTmFtZT86IHN0cmluZ1xyXG4gICkge1xyXG4gICAgZ3JpZE9wdGlvbk5hbWUgPSBncmlkT3B0aW9uTmFtZSB8fCBcImdyaWRPcHRpb25zXCI7XHJcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgIGNvbnN0IGdyaWRPcHRpb24gPSBldmVudC50YXJnZXRcclxuICAgICAgICAudHJpbSgpXHJcbiAgICAgICAgLnJlcGxhY2UoXCIoXCIsIFwiXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoXCIpXCIsIFwiXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoXCJncm91cC5yZWZyZXNoR3JpZFwiLCBcIlwiKTtcclxuICAgICAgaWYgKGdyaWRPcHRpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGdyaWRPcHRpb25OYW1lID0gZ3JpZE9wdGlvbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHpncmlkQ29udHJvbCA9IGdyb3VwW2dyaWRPcHRpb25OYW1lXSBhcyBaR3JpZDtcclxuICAgIGlmICh6Z3JpZENvbnRyb2wpIHtcclxuICAgICAgemdyaWRDb250cm9sLmdldERhdGEoKTtcclxuICAgIH1cclxuICAgIGdyb3VwWydpc1RyaWdnZXJlZCddID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZnJlc2hQYWdlKCkge1xyXG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgdGhpcy5ncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAvLyB0aGlzLnJvdXRlci5yb3V0ZVJldXNlU3RyYXRlZ3kuc2hvdWxkUmV1c2VSb3V0ZSA9ICgpID0+IGZhbHNlO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIub25TYW1lVXJsTmF2aWdhdGlvbiA9ICdyZWxvYWQnO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ1BhdGg6ICcsIHRoaXMuYWN0aXZhdGVkUm91dGVbJ19yb3V0ZXJTdGF0ZSddLnNuYXBzaG90LnVybCk7XHJcbiAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9jcm0vY3VzdG9tZXInXSk7XHJcbiAgfVxyXG5cclxuICBnZXRDbG9uZU5ld0NhY2hlWk1vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IGNhY2hlWk1vZGVsID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUoXCJjbG9uZU5ld01vZGVsXCIpO1xyXG4gICAgaWYgKGNhY2hlWk1vZGVsKSB7XHJcbiAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyQ2FjaGUoXCJjbG9uZU5ld01vZGVsXCIpO1xyXG4gICAgICBncm91cC56TW9kZWwgPSBjYWNoZVpNb2RlbDtcclxuICAgICAgZ3JvdXAuek1vZGVsLklkID0gMDtcclxuICAgIH1cclxuICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5ld01vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGxldCBfZ3JvdXA6IFpHcm91cCA9IGdyb3VwO1xyXG5cclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBpZiAoZXZlbnQuZGF0YSAmJiBldmVudC5kYXRhLlN1YlR5cGUpIHtcclxuICAgICAgICBfZ3JvdXAgPSBncm91cFsnXycgKyBldmVudC5kYXRhLlN1YlR5cGVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb2YoW10pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSBuZXcsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmJlZm9yZU5ld01vZGVsKF9ncm91cCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZ3JvdXAucGFyZW50UmVmZXJlbmNlSWQgfHwgXCIwXCI7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImN1cnJlbnQgdXJsOiBcIiwgdGhpcy5yb3V0ZXIudXJsKTtcclxuICAgICAgICAgIGNvbnN0IHBhdGhTZWdtZW50ID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KFwiL1wiKTtcclxuICAgICAgICAgIGNvbnN0IGxhc3RTZWdtZW50ID0gcGF0aFNlZ21lbnRbcGF0aFNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICBpZiAobGFzdFNlZ21lbnQgPT09IFwiZWRpdFwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBwYXRoU2VnbWVudC5zbGljZSgwLCBwYXRoU2VnbWVudC5sZW5ndGggLSAyKTtcclxuICAgICAgICAgICAgbmV3UGF0aC5wdXNoKHJlZmVyZW5jZUlkKTtcclxuICAgICAgICAgICAgbmV3UGF0aC5wdXNoKFwibmV3XCIpO1xyXG4gICAgICAgICAgICBjb25zdCBjYWNoZVpNb2RlbCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldENhY2hlKFwiY2xvbmVOZXdNb2RlbFwiKTtcclxuICAgICAgICAgICAgaWYgKCFjYWNoZVpNb2RlbCkge1xyXG4gICAgICAgICAgICAgIC8vIFNraXAgaWYgaXQgQ2xvbmVOZXdcclxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlLCB7IHNraXBMb2NhdGlvbkNoYW5nZTogdHJ1ZSB9KS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAuek1vZGVsID0ge307XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwLmlzRWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cC5pc05ldyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShuZXdQYXRoKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShuZXdQYXRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmIChsYXN0U2VnbWVudCA9PT0gXCJuZXdcIikge1xyXG4gICAgICAgICAgICBncm91cC56TW9kZWwgPSB7fTtcclxuICAgICAgICAgICAgZ3JvdXAuZm9ybS5yZXNldCgpO1xyXG4gICAgICAgICAgICAvL2dyb3VwLmZvcm0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyb3VwLmlzTmV3ID0gdHJ1ZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgZ3JvdXAuek1vZGVsW1xyXG4gICAgICAgICAgICAgIGdyb3VwLnBhcmVudFJlZmVyZW5jZUZpZWxkXHJcbiAgICAgICAgICAgIF0gPSBncm91cC5wYXJlbnRSZWZlcmVuY2VJZC50b1N0cmluZygpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2dyb3VwLmVkaXRNb2RlbFVSTCwgcmVmZXJlbmNlSWQsIFwibmV3XCJdLCB7XHJcbiAgICAgICAgICAgICAgcmVsYXRpdmVUbzogZ3JvdXAuY3RybFNjb3BlLmFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy90aGlzLnJvdXRlci5uYXZpZ2F0ZShbZ3JvdXAuZWRpdE1vZGVsVVJMLCByZWZlcmVuY2VJZCwgXCJuZXdcIl0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZU1vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGxldCBjcmVhdGVNb2RlbHJlcyA9IG51bGw7XHJcbiAgICBsZXQgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgbGV0IF9ncm91cDogWkdyb3VwID0gZ3JvdXA7XHJcblxyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGlmIChldmVudC5kYXRhICYmIGV2ZW50LmRhdGEuU3ViVHlwZSkge1xyXG4gICAgICAgIGZnID0gZ3JvdXBbJ18nICsgZXZlbnQuZGF0YS5TdWJUeXBlXS5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBfZ3JvdXAgPSBncm91cFsnXycgKyBldmVudC5kYXRhLlN1YlR5cGVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmZy5kaXJ0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJGb3JtIGlzIG5vdCBkaXJ0eSBoZW5jZSByZWNvcmQgaXMgbm90IHNhdmUuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmZy52YWxpZCkge1xyXG4gICAgICBjb25zdCBlcnJvcnMgPSBaQ29tcG9uZW50SGVscGVyLmdldEZvcm1Hcm91cEVycm9ycyhmZywgdGhpcy5hbGVydFNlcnZpY2UsIGdyb3VwKTtcclxuICAgICAgY29uc29sZS53YXJuKFwiRm9ybSBWYWxpZGF0aW9uIGdvdCBlcnJvcihzKTpcIiwgZXJyb3JzKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIG9mKF9ncm91cC56TW9kZWwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSBjcmVhdGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmJlZm9yZUNyZWF0ZU1vZGVsKF9ncm91cCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oX2dyb3VwLnpNb2RlbCwgZmcudmFsdWUpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBuZXdNb2RlbCA9IE9iamVjdC5hc3NpZ24oe30sIF9ncm91cC56TW9kZWwpO1xyXG4gICAgICAgICAgWkNvbXBvbmVudEhlbHBlci5yZW1vdmVOdWxsRmllbGRzKG5ld01vZGVsKTtcclxuICAgICAgICAgIC8vIE9iamVjdC5rZXlzKG5ld01vZGVsKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgIC8vICAgaWYgKG5ld01vZGVsW2tleV0gPT09IG51bGwpIHtcclxuICAgICAgICAgIC8vICAgICBkZWxldGUgbmV3TW9kZWxba2V5XTtcclxuICAgICAgICAgIC8vICAgfVxyXG4gICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAvLyBpZiAoIW5ld01vZGVsLklkKSB7XHJcbiAgICAgICAgICAvLyAgIG5ld01vZGVsLklkID0gMDtcclxuICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5odHRwUG9zdCQoXHJcbiAgICAgICAgICAgICAgX2dyb3VwLnJlc291cmNlVVJMLCAvLyArIFwiL1wiICsgZ3JvdXAuek1vZGVsLklkLFxyXG4gICAgICAgICAgICAgIG5ld01vZGVsXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgdGFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjcmVhdGVNb2RlbHJlcyA9IHJlc3A7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICBtYXAoKHJlcykgPT5cclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIFwiUmVjb3JkIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LlwiKVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHptb2RlbDogYW55KSA9PiB7XHJcblxyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJBZnRlciBjcmVhdGVkLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgICBpZiAoem1vZGVsKSB7XHJcblxyXG4gICAgICAgICAgICAvL3N1cHBvcnQgb2xkIGFuZCBuZXcgd2ViYXBpIG1ldGhvZFxyXG4gICAgICAgICAgICBpZiAoem1vZGVsLkRhdGEpIHtcclxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKF9ncm91cC56TW9kZWwsIHptb2RlbC5EYXRhKTtcclxuICAgICAgICAgICAgICBmZy5wYXRjaFZhbHVlKHptb2RlbC5EYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh6bW9kZWxbXCJJZFwiXSkge1xyXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oX2dyb3VwLnpNb2RlbCwgem1vZGVsKTtcclxuICAgICAgICAgICAgICBmZy5wYXRjaFZhbHVlKHptb2RlbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIF9ncm91cC5yZWZlcmVuY2VJZCA9IF9ncm91cC56TW9kZWwuSWQ7XHJcbiAgICAgICAgICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJDcmVhdGVNb2RlbChfZ3JvdXAsIHptb2RlbCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICBpZiAoY3JlYXRlTW9kZWxyZXMuUHJvY2Vzc2luZ1N0YXR1cyA9PSBudWxsIHx8IGNyZWF0ZU1vZGVscmVzLlByb2Nlc3NpbmdTdGF0dXMgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAocmVzcCAmJiBfZ3JvdXAuek1vZGVsLklkICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgX2dyb3VwLmlzTmV3ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgX2dyb3VwLmlzRWRpdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgX2dyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgX2dyb3VwLmNhbmNlbEJ1dHRvbk5hbWUgPSBcIkNsb3NlXCI7XHJcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihfZ3JvdXAuek1vZGVsLCByZXNwKTtcclxuICAgICAgICAgICAgICBmZy5wYXRjaFZhbHVlKHJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmZy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJEb25lIHVwZGF0ZU1vZGVsIHVwZGF0ZWQgek1vZGVsOlwiLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgICAvLyB0aGlzLnRvYXN0U2VydmljZS5zaG93KFwiUmVjb3JkIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICBsZXQgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgbGV0IF9ncm91cDogWkdyb3VwID0gZ3JvdXA7XHJcblxyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGlmIChldmVudC5kYXRhICYmIGV2ZW50LmRhdGEuU3ViVHlwZSkge1xyXG4gICAgICAgIGZnID0gZ3JvdXBbJ18nICsgZXZlbnQuZGF0YS5TdWJUeXBlXS5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBfZ3JvdXAgPSBncm91cFsnXycgKyBldmVudC5kYXRhLlN1YlR5cGVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmZy5kaXJ0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJGb3JtIGlzIG5vdCBkaXJ0eSBoZW5jZSByZWNvcmQgaXMgbm90IHNhdmUuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmZy52YWxpZCkge1xyXG4gICAgICBjb25zdCBlcnJvcnMgPSBaQ29tcG9uZW50SGVscGVyLmdldEZvcm1Hcm91cEVycm9ycyhmZywgdGhpcy5hbGVydFNlcnZpY2UsIGdyb3VwKTtcclxuICAgICAgY29uc29sZS53YXJuKFwiRm9ybSBWYWxpZGF0aW9uIGdvdCBlcnJvcihzKTpcIiwgZXJyb3JzKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIG9mKF9ncm91cC56TW9kZWwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSB1cGRhdGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmJlZm9yZVVwZGF0ZU1vZGVsKF9ncm91cCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oX2dyb3VwLnpNb2RlbCwgZmcudmFsdWUpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5odHRwUHV0JChfZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIF9ncm91cC56TW9kZWwuSWQsIF9ncm91cC56TW9kZWwpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgIG1hcCgocmVzKSA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgXCJSZWNvcmQgaXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuXCIpXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgdXBkYXRlZCwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgaWYgKHptb2RlbCAmJiB6bW9kZWwuRGF0YSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKF9ncm91cC56TW9kZWwsIHptb2RlbC5EYXRhKTtcclxuICAgICAgICAgICAgZmcucGF0Y2hWYWx1ZSh6bW9kZWwuRGF0YSk7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRG9uZSB1cGRhdGVNb2RlbCB1cGRhdGVkIHpNb2RlbDpcIiwgZmcudmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoem1vZGVsICYmIHptb2RlbFtcIklkXCJdKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oX2dyb3VwLnpNb2RlbCwgem1vZGVsKTtcclxuICAgICAgICAgICAgZmcucGF0Y2hWYWx1ZSh6bW9kZWwpO1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRvbmUgdXBkYXRlTW9kZWwgdXBkYXRlZCB6TW9kZWw6XCIsIGZnLnZhbHVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgX2dyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgZmcubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyVXBkYXRlTW9kZWwoX2dyb3VwLCB6bW9kZWwpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gICAgLy8gT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgIC8vIHRoaXMud2ViQXBpU2VydmljZVxyXG4gICAgLy8gICAuaHR0cFB1dCQoZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIGdyb3VwLnpNb2RlbC5JZCwgZ3JvdXAuek1vZGVsKVxyXG4gICAgLy8gICAuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgLy8gICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCByZXNwKTtcclxuICAgIC8vICAgICBmZy5wYXRjaFZhbHVlKHJlc3ApO1xyXG4gICAgLy8gICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAvLyAgICAgY29uc29sZS5sb2coXCJEb25lIHVwZGF0ZU1vZGVsIHVwZGF0ZWQgek1vZGVsOlwiLCBmZy52YWx1ZSk7XHJcbiAgICAvLyAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9uZU5ld01vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGxldCBfZ3JvdXA6IFpHcm91cCA9IGdyb3VwO1xyXG5cclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBpZiAoZXZlbnQuZGF0YSAmJiBldmVudC5kYXRhLlN1YlR5cGUpIHtcclxuICAgICAgICBfZ3JvdXAgPSBncm91cFsnXycgKyBldmVudC5kYXRhLlN1YlR5cGVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihfZ3JvdXAuek1vZGVsLCBfZ3JvdXAuZm9ybS52YWx1ZSk7XHJcbiAgICBfZ3JvdXAuek1vZGVsLklkID0gMDtcclxuXHJcbiAgICBjb25zdCBjbGVhckZpZWxkcyA9IFtcIldGU19Eb2N1bWVudElkXCIsIFwiV0ZTX1N0YXR1c0NvZGVcIiwgXCJXRlNfU3RhdHVzTmFtZVwiXTtcclxuICAgIGNsZWFyRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgIGlmIChfZ3JvdXAuek1vZGVsLmhhc093blByb3BlcnR5KGZpZWxkKSkge1xyXG4gICAgICAgIF9ncm91cC56TW9kZWxbZmllbGRdID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWNoZVNlcnZpY2Uuc2V0Q2FjaGUoXCJjbG9uZU5ld01vZGVsXCIsIGdyb3VwLnpNb2RlbCk7XHJcbiAgICB0aGlzLm5ld01vZGVsKG51bGwsIGdyb3VwKTtcclxuICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICBfZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVsZXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgbGV0IGZnOiBGb3JtR3JvdXAgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGxldCBfZ3JvdXA6IFpHcm91cCA9IGdyb3VwO1xyXG5cclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBpZiAoZXZlbnQuZGF0YSAmJiBldmVudC5kYXRhLlN1YlR5cGUpIHtcclxuICAgICAgICBmZyA9IGdyb3VwWydfJyArIGV2ZW50LmRhdGEuU3ViVHlwZV0uZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgX2dyb3VwID0gZ3JvdXBbJ18nICsgZXZlbnQuZGF0YS5TdWJUeXBlXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9mKF9ncm91cC56TW9kZWwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSBkZWxldGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmJlZm9yZURlbGV0ZU1vZGVsKF9ncm91cCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICBfZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmFsZXJ0U2VydmljZS5zaG93KFwiRGVsZXRlIFJlY29yZFwiLCBcIkFyZSB5b3Ugc3VyZT9cIixcclxuICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgIHsgdGV4dDogXCJOb1wiLCBjc3NDbGFzczogXCJzZWNvbmRhcnlcIiB9IGFzIEFsZXJ0QnV0dG9uLFxyXG4gICAgICAgICAgICAgIHsgdGV4dDogXCJZZXNcIiwgY3NzQ2xhc3M6IFwicHJpbWFyeVwiIH0gYXMgQWxlcnRCdXR0b25cclxuICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXBseTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVwbHkgPT09IFwiWWVzXCIpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihfZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgICAgIF9ncm91cC56TW9kZWwuRGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZVxyXG4gICAgICAgICAgICAgIC5odHRwUHV0JChfZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIF9ncm91cC56TW9kZWwuSWQsIF9ncm91cC56TW9kZWwpXHJcbiAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXAoKHJlcykgPT5cclxuICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgXCJSZWNvcmQgaXMgZGVsZXRlZCBzdWNjZXNzZnVsbHkuXCIpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJBZnRlciBkZWxldGVkLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyRGVsZXRlTW9kZWwoX2dyb3VwLCB6bW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5QmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlVXBkYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVVcGRhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVVcGRhdGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVEZWxldGVNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZURlbGV0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZVVwZGF0ZU1vZGVsIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVEZWxldGVNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZU5ld01vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlTmV3b2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlTmV3TW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVDcmVhdGVNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZUNyZWF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZVVwZGF0ZU1vZGVsIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVDcmVhdGVNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBiZWZvcmVQYWdlSW5pdGlhbGlzZShncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZVBhZ2VJbml0aWFsaXNlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZVBhZ2VJbml0aWFsaXNlIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZShncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC56TW9kZWwuSWQpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiek1vZGVsLklkIGlzIG5vdCBkZWZpbmVkXCIsIGdyb3VwLnpNb2RlbCk7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIGFmdGVyTmV3TW9kZWwoZ3JvdXA6IFpHcm91cCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJOZXdNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlck5ld01vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJDcmVhdGVNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyQ3JlYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJDcmVhdGVNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckNyZWF0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlclVwZGF0ZU1vZGVsKGdyb3VwOiBaR3JvdXAsIHptb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJVcGRhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlclVwZGF0ZU1vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyVXBkYXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyRGVsZXRlTW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckRlbGV0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyRGVsZXRlTW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJEZWxldGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIGFmdGVyUGFnZUluaXRpYWxpc2UoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5hZnRlclBhZ2VJbml0aWFsaXNlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBvbkFjdGlvbihncm91cDogWkdyb3VwKSB7XHJcbiAgLy8gICB0aGlzLmFjdGlvblNoZWV0Q3RybFxyXG4gIC8vICAgICAuY3JlYXRlKHtcclxuICAvLyAgICAgICBoZWFkZXI6IFwiQ2hvb3NlIGFuIEFjdGlvblwiLFxyXG4gIC8vICAgICAgIGJ1dHRvbnM6IGdyb3VwLnRvcFJpZ2h0QWN0aW9uQnV0dG9uXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICAgIC50aGVuKGFjdGlvblNoZWV0RWwgPT4ge1xyXG4gIC8vICAgICAgIGFjdGlvblNoZWV0RWwucHJlc2VudCgpO1xyXG4gIC8vICAgICB9KTtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldE1vZGVsVmFsdWUocHJvcGVydHlOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGdyb3VwOiBaR3JvdXApIHtcclxuICAvLyAgIGdyb3VwLnpNb2RlbFtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XHJcbiAgLy8gICBpZiAoZ3JvdXAuaXNMb2FkaW5nKSB7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IGZnID0gZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgLy8gICBpZiAoIWZnKSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICwgbm8tZGVidWdnZXJcclxuICAvLyAgICAgZGVidWdnZXI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjb25zdCBmYyA9IGZnLmNvbnRyb2xzW3Byb3BlcnR5TmFtZV07XHJcbiAgLy8gICBpZiAoIWZjKSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyXHJcbiAgLy8gICAgIGRlYnVnZ2VyO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZmMuc2V0VmFsdWUodmFsdWUpO1xyXG4gIC8vICAgZmMubWFya0FzRGlydHkoKTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzaG93ek1vZGFsKFxyXG4gICAgY29sRmllbGRzJDogc3RyaW5nIHwgT2JzZXJ2YWJsZTxBcnJheTxaRmllbGQ+PixcclxuICAgIHBhcmVudEdyb3VwOiBaR3JvdXAsXHJcbiAgICBmb3JtSGVhZGVyOiBzdHJpbmcsXHJcbiAgICB6TW9kZWw/OiBhbnksXHJcbiAgICByZWZlcklkPzogc3RyaW5nLFxyXG4gICAgY29tcG9uZW50U2l6ZT86IFpDb21wb25lbnRTaXplLFxyXG4gICAgc2tpcElzRGlydHlDaGVjaz86IGJvb2xlYW5cclxuICApIHtcclxuICAgIGNvbnN0IG1vZGFsY29tcG9uZW50ID0gWm1vZGFsQ29tcG9uZW50O1xyXG4gICAgY29uc3QgbW9kYWxtb2JpbGVjb21wb25lbnQgPSBabW9kYWxNb2JpbGVDb21wb25lbnQ7XHJcblxyXG4gICAgaWYgKHBhcmVudEdyb3VwKSB7XHJcbiAgICAgIC8vIGRpc2FibGUgaXNUcmlnZ2VyZWQgYmVmb3JlIGRpc3BsYXkgdGhlIHBvcHVwLlxyXG4gICAgICBwYXJlbnRHcm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coY29sRmllbGRzJCwgcGFyZW50R3JvdXAsIGZvcm1IZWFkZXIsIG1vZGFsY29tcG9uZW50LCBtb2RhbG1vYmlsZWNvbXBvbmVudCwgek1vZGVsLCByZWZlcklkLCBjb21wb25lbnRTaXplLCBza2lwSXNEaXJ0eUNoZWNrKVxyXG4gICAgLy9jb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coKTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVQb3N0KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBmb3IgUG9zdCB0byBDb29raWVTdG9yZVxyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcImFwaS9Db29raWVTdG9yZXNcIjtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVmFsdWUgPSB7XHJcbiAgICAgICdOYW1lJzogbmFtZSxcclxuICAgICAgJ1ZhbHVlJzogSlNPTi5zdHJpbmdpZnkodmFsdWUpXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFBvc3QkKGNvb2tpZVN0b3JlVVJMLCBjb29raWVTdG9yZVZhbHVlKS5waXBlKG1hcChyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJncmlkIGNvbmZpZyBzYXZlZChcIiArIHJlcy5zdGF0dXMgKyBcIik6IFwiLCByZXMpO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb29raWVTdG9yZUdldChuYW1lOiBzdHJpbmcsIGFjY2Vzc1Rva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcImFwaS9Db29raWVTdG9yZXMvP25hbWU9XCIgKyBuYW1lO1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cEdldCQoY29va2llU3RvcmVVUkwsIHsgaGVhZGVyczogYWNjZXNzVG9rZW4gfSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb29raWVTdG9yZURlbGV0ZU11bHRpcGxlKG5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBmb3IgUG9zdCB0byBDb29raWVTdG9yZVxyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcIkFkbWluL0RlbGV0ZU11bHRpcGxlQ29va2llc1wiO1xyXG4gICAgY29uc3QgY29va2llU3RvcmVWYWx1ZSA9IHtcclxuICAgICAgJ2NvbnRhaW5OYW1lJzogbmFtZVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChjb29raWVTdG9yZVVSTCwgY29va2llU3RvcmVWYWx1ZSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvYWRDb250YWluZXJWaWV3KGVsZW1lbnRDb250YWluZXI6IGFueSwgY29udGFpbmVyUGFnZTogYW55LCBncm91cD86IFpHcm91cCkge1xyXG4gICAgaWYgKCFlbGVtZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRWxlbWVudENvbnRhaW5lciBpcyBudWxsLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29udGFpbmVyUGFnZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkNvbnRhaW5lclBhZ2UgaXMgbnVsbC5cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3Q29udGFpbmVyUmVmID0gZWxlbWVudENvbnRhaW5lci52aWV3Q29udGFpbmVyUmVmO1xyXG4gICAgdmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xyXG5cclxuICAgIGdyb3VwID0gZ3JvdXAgPyBncm91cCA6IG5ldyBaR3JvdXA7XHJcbiAgICBjb25zdCBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+ID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29udGFpbmVyUGFnZSk7XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihjb21wb25lbnRSZWYuaW5zdGFuY2VbXCJncm91cFwiXSwgZ3JvdXApO1xyXG5cclxuICAgIE9iamVjdC5hc3NpZ24oY29tcG9uZW50UmVmLmluc3RhbmNlW1wiZ3JvdXBcIl0sIHsgaXNFbWJlZGRlZFBhZ2U6IHRydWUsIGVsZW1lbnRDb250YWluZXI6IGVsZW1lbnRDb250YWluZXIgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY2xvc2VDb250YWluZXJWaWV3KGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IHZpZXdDb250YWluZXJSZWYgPSBncm91cC5lbGVtZW50Q29udGFpbmVyLnZpZXdDb250YWluZXJSZWY7XHJcbiAgICBpZiAodmlld0NvbnRhaW5lclJlZikge1xyXG4gICAgICB2aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XHJcbiAgICB9XHJcbiAgfSBcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlZnJlc2hHcmlkKGdyb3VwOiBaR3JvdXApIHtcclxuICBjb25zdCB6Z3JpZENvbnRyb2wgPSBncm91cFtcImdyaWRPcHRpb25zXCJdIGFzIFpHcmlkO1xyXG4gIGlmICh6Z3JpZENvbnRyb2wpIHtcclxuICAgIHpncmlkQ29udHJvbC5nZXREYXRhKCk7XHJcbiAgfVxyXG4gIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbn1cclxuIl19
881
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvc2VydmljZXMvbWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFLakcsOEJBQThCO0FBQzlCLE9BQU8sRUFBYyxlQUFlLEVBQWdCLEVBQUUsRUFBUSxRQUFRLEVBQWlCLE1BQU0sTUFBTSxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFRLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNELDJDQUEyQztBQUMzQyxPQUFPLEVBQ1EsV0FBVyxFQUFpQyxnQkFBZ0IsRUFFWixNQUFNLEVBQ3BFLE1BQU0saUJBQWlCLENBQUM7QUFJekIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7OztBQUcxRSxzREFBc0Q7QUFFdEQscUhBQXFIO0FBQ3JILDBEQUEwRDtBQUsxRCxNQUFNLE9BQU8sV0FBVztJQU90QixZQUNVLE1BQWMsRUFDZCxTQUEwQixFQUMxQixhQUE0QixFQUM1QixZQUEwQixFQUMxQixZQUEwQixFQUMxQixZQUEwQixFQUMxQixrQkFBc0MsRUFDdEMscUJBQW1ELEVBQ25ELGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLGNBQXFDLEVBQ3JDLFlBQW9DLEVBQ3BDLGtCQUFzQztRQWJ0QyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFDMUIsa0JBQWEs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QUNuQjs7QUEwaUNELE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN2QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFVLENBQUM7SUFDbkQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ3hCO0lBQ0QsS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmF2aWdhdGlvblN0YXJ0LCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uRXJyb3IsIFJvdXRlciwgRXZlbnQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBOYXZDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBvZiwgZnJvbSwgZm9ya0pvaW4sIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFwLCBzd2l0Y2hNYXAsIHRha2UsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHtcclxuICBBbGVydEJ1dHRvbiwgTUVTU0FHRVRZUEUsIE1vZGFsUGFnZVBhcmFtcywgQWxlcnRTZXJ2aWNlLCBaQ29tcG9uZW50SGVscGVyLFxyXG4gIENhY2hlU2VydmljZSwgRmllbGRTZXJ2aWNlLCBSZXNvdXJjZUFwaVNlcnZpY2UsIFRyYW5zbGF0aW9uU2VydmljZSwgV2ViQXBpU2VydmljZSwgU3RvcmFnZVNlc3Npb25TZXJ2aWNlLFxyXG4gIFpDb21wb25lbnRPdXRwdXRFdmVudCwgWkNvbXBvbmVudFNpemUsIFpDb3JlU2VydmljZSwgWkZpZWxkLCBaR3JvdXBcclxufSBmcm9tICdtbWhnbG9iYWwtemNvcmUnO1xyXG5pbXBvcnQgeyBNb2RhbFNlcnZpY2UsIE1vZGFsUmVzcG9uc2UgfSBmcm9tICdtbWhnbG9iYWwtem1vZGFsJztcclxuLy8gaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vem1vZGFsL21vZGFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50RGVidWdTZXJ2aWNlIH0gZnJvbSAnLi96Y29tcG9uZW50LmRlYnVnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBabW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi96bW9kYWwvem1vZGFsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFptb2RhbE1vYmlsZUNvbXBvbmVudCB9IGZyb20gJy4uL3ptb2RhbC96bW9kYWwtbW9iaWxlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFpHcmlkIH0gZnJvbSAnLi4vemdyaWQvemdyaWQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZSB9IGZyb20gJy4vY29tcG9uZW50LWVycm9yLWhhbmRsZXIuc2VydmljZSc7XHJcbi8vIGltcG9ydCB7IFptb2RhbFBhZ2UgfSBmcm9tICcuLi96bW9kYWwvem1vZGFsLnBhZ2UnO1xyXG5cclxuLy8gaW1wb3J0IHsgWkNvbXBvbmVudEhlbHBlciwgWkNvbXBvbmVudE91dHB1dEV2ZW50LCBNb2RhbFBhZ2VQYXJhbXMsIFpHcmlkIH0gZnJvbSAnLi4vZHluYW1pY2Zvcm0vemNvbXBvbmVudC5tb2RlbCc7XHJcbi8vIGltcG9ydCB7IFpHcm91cCwgWkZpZWxkIH0gZnJvbSAnLi4vbW9kZWwvemdyb3VwLm1vZGVsJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYWluU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBncm91cDogWkdyb3VwO1xyXG4gIHByaXZhdGUgb2F1dGhFbnZpcm9ubWVudFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgZW52aXJvbm1lbnQ7XHJcbiAgcHJpdmF0ZSBiYWNrTmF2aWFndGlvblBhdGg6IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSByb3V0ZVBhcmFtOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLFxyXG4gICAgcHJpdmF0ZSBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyLFxyXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOiBDYWNoZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpZWxkU2VydmljZTogRmllbGRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZXNvdXJjZUFwaVNlcnZpY2U6IFJlc291cmNlQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgY29tcG9uZW50RXJyb3JIYW5kbGVyOiBDb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB3ZWJBcGlTZXJ2aWNlOiBXZWJBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB6Y29yZVNlcnZpY2U6IFpDb3JlU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRlYnVnU2VydmljZTogWkNvbXBvbmVudERlYnVnU2VydmljZSxcclxuICAgIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2VcclxuICApIHtcclxuICAgIGNvbnNvbGUubG9nKCdNYWluU2VydmljZSBjb25zdHJ1Y3RvcicpO1xyXG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IHRoaXMuemNvcmVTZXJ2aWNlLmdldEVudmlyb25tZW50KCk7XHJcbiAgICB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgPSB0aGlzLmVudmlyb25tZW50LmUxT2F1dGhVcmwgKyAnLyc7XHJcbiAgICB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKChldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XHJcbiAgICAgICAgLy8gU2hvdyBwcm9ncmVzcyBzcGlubmVyIG9yIHByb2dyZXNzIGJhciBcclxuICAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyIFxyXG4gICAgICAgIC8vIFByZXNlbnQgZXJyb3IgdG8gdXNlclxyXG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LmVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdGFydFVwKCkge1xyXG4gICAgY29uc29sZS5sb2coJ0F0IG1haW4uc2VydmljZSAoU3RhcnRVcCkgLi4uJyk7XHJcbiAgfVxyXG5cclxuICBzZXRHcm91cChncm91cDogWkdyb3VwKSB7XHJcbiAgICB0aGlzLmdyb3VwID0gZ3JvdXA7XHJcbiAgICB0aGlzLmZpZWxkU2VydmljZS5zZXRHcm91cChncm91cCk7XHJcbiAgICB0aGlzLnJlc291cmNlQXBpU2VydmljZS5zZXRHcm91cChncm91cCk7XHJcbiAgICB0aGlzLndlYkFwaVNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgY29uc3QgaXNEZWJ1Z2dpbmcgPSB0aGlzLnpjb3JlU2VydmljZS5pc0RlYnVnU2Vzc2lvbigpIHx8IGZhbHNlO1xyXG4gICAgaWYgKGlzRGVidWdnaW5nKSB7XHJcbiAgICAgIHRoaXMuZGVidWdTZXJ2aWNlLm9uSW5pdERlYnVnZ2VyKGdyb3VwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJlc291cmNlU2VydmVyRGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLnJlc291cmNlQXBpU2VydmljZS5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JvdXBGaWVsZHMoXHJcbiAgICBjdHJsTmFtZTogc3RyaW5nLFxyXG4gICAgZm9ybVR5cGU6IFwiTGlzdEZpZWxkXCIgfCBcIkZvcm1GaWVsZFwiLFxyXG4gICAgZ3JvdXA6IFpHcm91cCxcclxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgY3RybE5hbWUsXHJcbiAgICAgIGZvcm1UeXBlLFxyXG4gICAgICBncm91cCxcclxuICAgICAgcHJvcGVydHlOYW1lXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZUdyb3VwKFxyXG4gICAgZ3JvdXA6IFpHcm91cCxcclxuICAgIGN0cmxOYW1lOiBzdHJpbmcsXHJcbiAgICBwYWdlTmFtZTogc3RyaW5nLFxyXG4gICAgbWU6IGFueVxyXG4gICk6IFN1YnNjcmlwdGlvbiB7XHJcbiAgICBpZiAobWUuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIG1lLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gZ3JvdXAucmVzb3VyY2VVUkxOYW1lIHx8IGN0cmxOYW1lO1xyXG4gICAgZ3JvdXAucmVzb3VyY2VVUkxOYW1lID0gcmVzb3VyY2VOYW1lO1xyXG5cclxuICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAsIHtcclxuICAgICAgcmVzb3VyY2VVUkw6IHRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLmdldFVSTChyZXNvdXJjZU5hbWUpLFxyXG4gICAgICBncmlkQ29sdW1uRmllbGRzOiB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKFxyXG4gICAgICAgIGN0cmxOYW1lLFxyXG4gICAgICAgIFwiRm9ybUZpZWxkXCIsXHJcbiAgICAgICAgbnVsbCxcclxuICAgICAgICBudWxsXHJcbiAgICAgICksXHJcbiAgICAgIGN0cmxTY29wZTogbWUsXHJcbiAgICAgIHBhZ2VOYW1lLFxyXG4gICAgICBjdHJsTmFtZSxcclxuICAgICAgLy8gY3JlYXRlTW9kZWxVUkw6IFwiL2NyZWF0ZVwiICsgY3RybE5hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgZWRpdE1vZGVsVVJMOiBjdHJsTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAvLyBsaXN0TW9kZWxVUkw6IFwiL2xpc3RcIiArIGN0cmxOYW1lLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIC8vIGZvcm1IZWFkZXI6IFwiLi4uXCIsXHJcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcclxuICAgICAgZmllbGRzOiBbXSxcclxuICAgICAgek1vZGVsOiB7fSxcclxuICAgICAgekNvbXBvbmVudHM6IHt9LFxyXG4gICAgICB6RGF0YToge30sXHJcbiAgICAgIHN1YmplY3Q6IG5ldyBCZWhhdmlvclN1YmplY3Q8WkNvbXBvbmVudE91dHB1dEV2ZW50PihudWxsKSxcclxuICAgICAgLy8gZm9ybTogbnVsbCBhcyBGb3JtR3JvdXAsIC8vIHJlbW92ZWQgZm9yIGJ1ZyBmaXguXHJcbiAgICAgIGNhbmNlbEJ1dHRvbk5hbWU6IFwiQ2xvc2VcIixcclxuICAgICAgekJ1dHRvbnNDb3VudDogMCxcclxuICAgICAgLy8gdG9wUmlnaHRBY3Rpb25CdXR0b246IFtdLFxyXG4gICAgICAvLyBvbkFjdGlvbjogdGhpcy5vbkFjdGlvbi5iaW5kKHRoaXMpLFxyXG4gICAgICBiYWNrTmF2aWdhdGlvbjogdGhpcy5iYWNrTmF2aWdhdGlvbi5iaW5kKHRoaXMpLFxyXG4gICAgICBoaXN0b3J5QmFjazogdGhpcy5oaXN0b3J5QmFjay5iaW5kKHRoaXMpLFxyXG4gICAgICByZWZyZXNoUGFnZTogdGhpcy5yZWZyZXNoUGFnZSxcclxuICAgICAgcmVmcmVzaEdyaWQ6IHRoaXMucmVmcmVzaEdyaWQuYmluZCh0aGlzKSxcclxuICAgICAgdXBkYXRlTW9kZWw6IHRoaXMudXBkYXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgY3JlYXRlTW9kZWw6IHRoaXMuY3JlYXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgY2xvbmVOZXdNb2RlbDogdGhpcy5jbG9uZU5ld01vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIGRlbGV0ZU1vZGVsOiB0aGlzLmRlbGV0ZU1vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIG5ld01vZGVsOiB0aGlzLm5ld01vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIC8vIHVwZGF0ZUVkaXRNb2RlOiB0aGlzLnVwZGF0ZUVkaXRNb2RlLmJpbmQodGhpcyksXHJcbiAgICAgIC8vIF9pc0RlYnVnZ2luZzogZW52aXJvbm1lbnQuZGVidWdTZXNzaW9uIHx8IGZhbHNlLFxyXG4gICAgICAvLyBfZGVidWc6IHtcclxuICAgICAgLy8gICB6RGF0YTogIHsgY29sbGVjdGVkQWN0aXZpdGllczogW10sIGFjdGl2aXR5Q291bnQ6IDAgfVxyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGFmdGVyR2V0TW9kZWxTdWNjZXNzOiBudWxsLFxyXG4gICAgICAvLyBiZWZvcmVVcGRhdGVNb2RlbDogbnVsbCxcclxuICAgICAgLy8gaXNFZGl0OiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgbWUuc3Vic2NyaXB0aW9uID0gZ3JvdXAuc3ViamVjdC5zdWJzY3JpYmUoKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpID0+XHJcbiAgICAgIHRoaXMuc3ViamVjdEV2ZW50KGV2ZW50LCBncm91cCwgbWUpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBtZS5zdWJzY3JpcHRpb247XHJcbiAgfVxyXG5cclxuICBnZXRNb2RlbCQoZ3JvdXA6IFpHcm91cCwgaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCByZWNJZCA9IGlkIHx8IGdyb3VwLnJlZmVyZW5jZUlkO1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZVxyXG4gICAgICAuaHR0cEdldCQoZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIHJlY0lkLCBudWxsKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgZ3JvdXAuek1vZGVsID0gem1vZGVsO1xyXG4gICAgICAgICAgLy9pZiAoXHJcbiAgICAgICAgICAvLyAgZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGQgJiZcclxuICAgICAgICAgIC8vICBPYmplY3Qua2V5cyh6bW9kZWwpLmluZGV4T2YoZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGQpICE9PSAtMSAmJlxyXG4gICAgICAgICAgLy8gICFncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UuZW5kc1dpdGgoXCIuZWRpdFwiKVxyXG4gICAgICAgICAgLy8pIHtcclxuICAgICAgICAgIC8vICBncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UgPVxyXG4gICAgICAgICAgLy8gICAgZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlICtcclxuICAgICAgICAgIC8vICAgIFwiL1wiICtcclxuICAgICAgICAgIC8vICAgIHptb2RlbFtncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZF0udG9TdHJpbmcoKSArXHJcbiAgICAgICAgICAvLyAgICBcIi9lZGl0XCI7XHJcbiAgICAgICAgICAvL31cclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIGNhbkV4aXQoZm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB8IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFmb3JtIHx8ICFmb3JtLmRpcnR5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmb3JtWydza2lwRGlydHlDaGVjayddKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmFsZXJ0U2VydmljZVxyXG4gICAgICAuc2hvdyhcIkRhdGEgbm90IHNhdmUgeWV0XCIsIFwiQXJlIHlvdSBzdXJlIHdhbnQgdG8gZGlzY2FyZCB0aGUgY2hhbmdlcz9cIiwgW1xyXG4gICAgICAgIFwiQ2FuY2VsXCIsXHJcbiAgICAgICAgXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgICAgXSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcGx5ID09PSBcIkRpc2NhcmQgQ2hhbmdlc1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIC8vIGNvbnN0IHJlcGx5U3ViID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICAgIC8vIHRoaXMuYWxlcnRDdHJsXHJcbiAgICAvLyAgIC5jcmVhdGUoe1xyXG4gICAgLy8gICAgIGhlYWRlcjogXCJEYXRhIG5vdCBzYXZlIHlldFwiLFxyXG4gICAgLy8gICAgIC8vIHN1YkhlYWRlcjogJ1N1YkhlYWRlciBzdGF0ZW1lbnQgaGVyZScsXHJcbiAgICAvLyAgICAgbWVzc2FnZTogXCJBcmUgeW91IHN1cmUgd2FudCB0byBkaXNjYXJkIHRoZSBjaGFuZ2VzP1wiLFxyXG4gICAgLy8gICAgIGJ1dHRvbnM6IFtcclxuICAgIC8vICAgICAgIHtcclxuICAgIC8vICAgICAgICAgdGV4dDogXCJDYW5jZWxcIixcclxuICAgIC8vICAgICAgICAgcm9sZTogXCJjYW5jZWxcIixcclxuICAgIC8vICAgICAgICAgY3NzQ2xhc3M6IFwic2Vjb25kYXJ5XCIsXHJcbiAgICAvLyAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcclxuICAgIC8vICAgICAgICAgICByZXBseVN1Yi5uZXh0KGZhbHNlKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfSxcclxuICAgIC8vICAgICAgIHtcclxuICAgIC8vICAgICAgICAgdGV4dDogXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgIC8vICAgICAgICAgY3NzQ2xhc3M6IFwid2FybmluZ1wiLFxyXG4gICAgLy8gICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgcmVwbHlTdWIubmV4dCh0cnVlKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIF1cclxuICAgIC8vICAgfSlcclxuICAgIC8vICAgLnRoZW4oYWxlcnRFbGVtZW50ID0+IHtcclxuICAgIC8vICAgICBhbGVydEVsZW1lbnQucHJlc2VudCgpO1xyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIHJldHVybiByZXBseVN1Yi5hc09ic2VydmFibGUoKS5waXBlKHRha2UoMSkpO1xyXG4gIH1cclxuXHJcbiAgLy8gYXN5bmMgb3Blbk1vZGFsRm9ybShtb2RhbFBhcmFtczogTW9kYWxQYWdlUGFyYW1zKSB7XHJcbiAgLy8gICAvLyBjb25zb2xlLmxvZyhcIm9wZW5Nb2RhbEZvcm1cIik7XHJcbiAgLy8gICBjb25zb2xlLmVycm9yKFxyXG4gIC8vICAgICBcIlBsZWFzZSB1c2UgTW9kYWxTZXJ2aWNlLnNob3cgaW5zdGVhZCBvZiBNYWluU2VydmljZS5vcGVuTW9kYWxGb3JtIVwiXHJcbiAgLy8gICApO1xyXG4gIC8vICAgLy8gY29uc3QgbW9kYWwgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KG1vZGFsUGFyYW1zLmNvbEZpZWxkcyQgfHwgbW9kYWxQYXJhbXMuY29udHJvbGxlck5hbWUsIG1vZGFsUGFyYW1zLnBhcmVudEdyb3VwLFxyXG4gIC8vICAgLy8gICBtb2RhbFBhcmFtcy5mb3JtSGVhZGVyLCBtb2RhbFBhcmFtcy56TW9kZWwsIG1vZGFsUGFyYW1zLnJlZmVySWQpO1xyXG4gIC8vICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xyXG4gIC8vICAgICBjb21wb25lbnQ6IFptb2RhbFBhZ2UsXHJcbiAgLy8gICAgIGJhY2tkcm9wRGlzbWlzczogdHJ1ZSxcclxuICAvLyAgICAgY29tcG9uZW50UHJvcHM6IHtcclxuICAvLyAgICAgICBtb2RhbFBhcmFtcyxcclxuICAvLyAgICAgfSxcclxuICAvLyAgIH0pO1xyXG4gIC8vICAgbW9kYWwucHJlc2VudCgpO1xyXG4gIC8vICAgcmV0dXJuIG1vZGFsO1xyXG4gIC8vICAgLy8gLm9uV2lsbERpc21pc3MoKHptb2RlbDogYW55KSA9PiB7XHJcbiAgLy8gICAvLyAgIHRoaXMuXHJcbiAgLy8gICAvLyB9KTtcclxuICAvLyB9XHJcblxyXG4gIGNsb3NlTW9kYWxGb3JtKGdyb3VwPzogWkdyb3VwKSB7XHJcbiAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAuc3ViamVjdCkge1xyXG4gICAgICBncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiTW9kYWxTZXJ2aWNlLmNsb3NlXCIsXHJcbiAgICAgICAgdGFyZ2V0OiBcIm1vZGFsR3JvdXAubW9kYWxDYW5jZWwoKVwiXHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm1vZGFsQ3RybC5kaXNtaXNzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdWJqZWN0RXZlbnQoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnRhcmdldC5zdGFydHNXaXRoKFwibW9kYWxHcm91cC5cIikpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coXCI+PiBTdWJqZWN0RXZlbnRcIiwgZXZlbnQpO1xyXG4gICAgbGV0IGNhbGxGdW5jO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNhbGxGdW5jID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKFxyXG4gICAgICAgIGdyb3VwLmN0cmxTY29wZSxcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgZ3JvdXBcclxuICAgICAgKTtcclxuICAgICAgLy8gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGV2ZW50LlRhcmdldCwgZ3JvdXApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiRXJyb3Igd2hlbiBnZXRHcm91cFZhbHVlOiBcIixcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgXCIgPiBFcnJvcjogXCIsXHJcbiAgICAgICAgZXJyb3JcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjYWxsRnVuYyhldmVudCk7XHJcbiAgICBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgY29uc3QgbmV3RnVuYyA9IGNhbGxGdW5jLmJpbmQobWUpO1xyXG4gICAgICBuZXdGdW5jKGV2ZW50LCBncm91cCwgbWUpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUuZW5kc1dpdGgoXCJvbk5hdmlnYXRlVG9cIikpIHtcclxuICAgICAgICBjb25zdCBuVXJsID0gZXZlbnQudGFyZ2V0LnJlcGxhY2UoXCIvOmlkXCIsIFwiL1wiICsgZXZlbnQuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW25VcmxdKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBcInpncmlkLWNlbGxDbGlja1wiKSB7XHJcbiAgICAgICAgLy8gKGNhbGxGdW5jLnN0YXJ0c1dpdGgoJ2VkaXQnKSkgeyAgemdyaWQtY2VsbENsaWNrXHJcbiAgICAgICAgY29uc3QgY05hbWUgPSBjYWxsRnVuYy5zbGljZSg0KTtcclxuICAgICAgICAvLyAvLyBkZWJ1Z2dlcjtcclxuICAgICAgICAvLyBjb25zdCBtb2RhbEdyb3VwUGFyYW06IE1vZGFsUGFnZVBhcmFtcyA9IHt9O1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5jb250cm9sbGVyTmFtZSA9IGNOYW1lO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5yZWZlcklkID0gZXZlbnQuZGF0YS5JZDtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0uY29sRmllbGRzJCA9IGV2ZW50LmNvbHVtbkZpZWxkcyQ7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLnBhcmVudEdyb3VwID0gbWUuZ3JvdXA7XHJcblxyXG4gICAgICAgIC8vIHRoaXMub3Blbk1vZGFsRm9ybShtb2RhbEdyb3VwUGFyYW0pO1xyXG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLnNob3coXHJcbiAgICAgICAgICBldmVudC5jb2x1bW5GaWVsZHMkIHx8IGNOYW1lLFxyXG4gICAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgICBcIlwiLFxyXG4gICAgICAgICAge30sXHJcbiAgICAgICAgICBldmVudC5kYXRhLklkXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiemdyaWQtY2VsbENsaWNrXCIpIHtcclxuICAgICAgICBpZiAoY2FsbEZ1bmMubmF2aWdhdGVVcmwpIHtcclxuICAgICAgICAgIGNvbnN0IHVybCA9IGNhbGxGdW5jLm5hdmlnYXRlVXJsLnJlcGxhY2UoXCI6aWRcIiwgZXZlbnQuZGF0YS5JZCk7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBtb2RhbEdyb3VwUGFyYW06IE1vZGFsUGFnZVBhcmFtcyA9IHt9O1xyXG4gICAgICAgIG1vZGFsR3JvdXBQYXJhbS5jb250cm9sbGVyTmFtZSA9IGNhbGxGdW5jLmN0cmxOYW1lO1xyXG4gICAgICAgIG1vZGFsR3JvdXBQYXJhbS5yZWZlcklkID0gZXZlbnQuZGF0YS5JZDtcclxuICAgICAgICBtb2RhbEdyb3VwUGFyYW0uY29sRmllbGRzJCA9IGV2ZW50LmNvbHVtbkZpZWxkcyQ7XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLnBhcmVudEdyb3VwID0gbWUuZ3JvdXA7XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLmZvcm1IZWFkZXIgPSBjYWxsRnVuYy5mb3JtSGVhZGVyO1xyXG5cclxuICAgICAgICBpZiAoY2FsbEZ1bmMuZm9ybUhlYWRlcikge1xyXG4gICAgICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtKG1vZGFsR3JvdXBQYXJhbSk7XHJcbiAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5zaG93KFxyXG4gICAgICAgICAgICBldmVudC5jb2x1bW5GaWVsZHMkIHx8IGNhbGxGdW5jLmN0cmxOYW1lLFxyXG4gICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgY2FsbEZ1bmMuZm9ybUhlYWRlcixcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuSWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgIFwiSW52YWxpZCBjYWxsRnVuYyB0eXBlOiBcIixcclxuICAgICAgICAgIGNhbGxGdW5jLFxyXG4gICAgICAgICAgXCIgZXZlbnQuVGFyZ2V0OiBcIixcclxuICAgICAgICAgIGV2ZW50LnRhcmdldFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtQnlDb21wb25lbnQoY2FsbEZ1bmMudHlwZSwgZXZlbnQuRGF0YS5JZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJGdW5jdGlvbiBub3QgZGVmaW5lZCBpbiBncm91cCBmb3I6IFwiLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBcIiwgRXZlbnQ6IFwiLFxyXG4gICAgICAgIGV2ZW50XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTdWNjZXNzKHJlczogUmVzcG9uc2UgfCBhbnksIHN1Y2Nlc3NNc2c6IHN0cmluZyk6IFJlc3BvbnNlIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGlmIChyZXMpIHtcclxuICAgICAgaWYgKHJlcy5Qcm9jZXNzaW5nU3RhdHVzKSB7XHJcbiAgICAgICAgdGhpcy53ZWJBcGlTZXJ2aWNlLnNob3dIdHRwUmVzcG9uc2VNZXNzYWdlKFxyXG4gICAgICAgICAgTUVTU0FHRVRZUEUuU3VjY2VzcyxcclxuICAgICAgICAgIHN1Y2Nlc3NNc2csXHJcbiAgICAgICAgICBudWxsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlVcGRhdGVHcm91cFRyaWdnZXIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXAuaXNUcmlnZ2VyZWQgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUVycm9yKHJlczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaGFuZGxlRXJyb3IocmVzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByb3V0ZU5hdmlnYXRlKHBhZ2VOYW1lOiBzdHJpbmcsIHBhZ2VQYXJhbXM6IHN0cmluZ1tdKSB7XHJcbiAgICB0aGlzLnNldE5hdmlnYXRpb25QYXJhbXMocGFnZVBhcmFtcyk7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHBhZ2VOYW1lLCB7IHNraXBMb2NhdGlvbkNoYW5nZTogZmFsc2UgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TmF2aWdhdGlvblBhcmFtcyh1cmxQYXJhbXM6IHN0cmluZ1tdKSB7XHJcbiAgICB0aGlzLmJhY2tOYXZpYWd0aW9uUGF0aC5wdXNoKHRoaXMucm91dGVyLnVybCk7XHJcbiAgICB0aGlzLnJvdXRlUGFyYW0ucHVzaCgnLycgKyB1cmxQYXJhbXMuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xyXG4gICAgICByZXR1cm4gZWwgIT0gJyc7XHJcbiAgICB9KS5qb2luKCcvJykpO1xyXG5cclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KFwiYmFja05hdmlhZ3Rpb25QYXRoXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuYmFja05hdmlhZ3Rpb25QYXRoKSk7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldChcInJvdXRlUGFyYW1cIiwgSlNPTi5zdHJpbmdpZnkodGhpcy5yb3V0ZVBhcmFtKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5hdmlnYXRpb25QYXJhbXMoKSB7XHJcbiAgICBpZiAoIXRoaXMucm91dGVQYXJhbSkge1xyXG4gICAgICB0aGlzLnJvdXRlUGFyYW0gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJyb3V0ZVBhcmFtXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5yb3V0ZVBhcmFtO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE5hdmlnYXRpb25QYXJlbnRQYXJhbSgpIHtcclxuICAgIGNvbnN0IHJvdXRlUGFyYW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uUGFyYW1zKCk7XHJcbiAgICByZXR1cm4gcm91dGVQYXJhbXNbcm91dGVQYXJhbXMubGVuZ3RoIC0gMl07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TmF2aWdhdGlvbkN1cnJlbnRQYXJhbSgpIHtcclxuICAgIGNvbnN0IHJvdXRlUGFyYW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uUGFyYW1zKCk7XHJcbiAgICByZXR1cm4gcm91dGVQYXJhbXNbcm91dGVQYXJhbXMubGVuZ3RoIC0gMV07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlTGFzdE5hdmlnYXRlUmVjb3JkKCkge1xyXG4gICAgdGhpcy5iYWNrTmF2aWFndGlvblBhdGggPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJiYWNrTmF2aWFndGlvblBhdGhcIikpO1xyXG4gICAgdGhpcy5yb3V0ZVBhcmFtID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwicm91dGVQYXJhbVwiKSk7XHJcblxyXG4gICAgdGhpcy5iYWNrTmF2aWFndGlvblBhdGgucG9wKCk7XHJcbiAgICB0aGlzLnJvdXRlUGFyYW0ucG9wKCk7XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQoXCJiYWNrTmF2aWFndGlvblBhdGhcIiwgSlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrTmF2aWFndGlvblBhdGgpKTtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KFwicm91dGVQYXJhbVwiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJvdXRlUGFyYW0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBiYWNrTmF2aWdhdGlvbihldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwLCBtZTogYW55KSB7XHJcbiAgICBpZiAoZ3JvdXBbJ2lzRW1iZWRkZWRQYWdlJ10pIHtcclxuICAgICAgZ3JvdXBbJ2lzVHJpZ2dlcmVkJ10gPSBmYWxzZTtcclxuICAgICAgdGhpcy5jbG9zZUNvbnRhaW5lclZpZXcoZ3JvdXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGdyb3VwLmJlZm9yZUJhY2tOYXZpZ2F0aW9uUGFnZSkge1xyXG4gICAgICBncm91cC5iZWZvcmVCYWNrTmF2aWdhdGlvblBhZ2UoZ3JvdXApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXJCYWNrTmF2aWdhdGUoZ3JvdXApO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucm91dGVyQmFja05hdmlnYXRlKGdyb3VwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcm91dGVyQmFja05hdmlnYXRlKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuXHJcbiAgICBjb25zdCBiYWNrTmF2aWFndGlvblBhdGg6IHN0cmluZ1tdID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiYmFja05hdmlhZ3Rpb25QYXRoXCIpKTtcclxuICAgIGNvbnN0IGJhY2tOYXZpZ2F0aW9uVVJMID0gZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlID8gZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlIDogYmFja05hdmlhZ3Rpb25QYXRoW2JhY2tOYXZpYWd0aW9uUGF0aC5sZW5ndGggLSAxXTtcclxuXHJcbiAgICBpZiAoYmFja05hdmlnYXRpb25VUkwpIHtcclxuICAgICAgaWYgKCFncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUxhc3ROYXZpZ2F0ZVJlY29yZCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYmFja05hdmlnYXRpb25VUkxdLCB7IHNraXBMb2NhdGlvbkNoYW5nZTogZmFsc2UgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coXCJCYWNrTmF2aWdhdGlvblBhdGggbm90IHNldC5cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhpc3RvcnlCYWNrKCkge1xyXG4gICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG5cclxuICAgIGlmICh0aGlzLmdyb3VwWydpc0VtYmVkZGVkUGFnZSddKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VDb250YWluZXJWaWV3KHRoaXMuZ3JvdXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5uYXZDb250cm9sbGVyLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2hHcmlkKFxyXG4gICAgZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCxcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBtZTogYW55LFxyXG4gICAgZ3JpZE9wdGlvbk5hbWU/OiBzdHJpbmdcclxuICApIHtcclxuICAgIGdyaWRPcHRpb25OYW1lID0gZ3JpZE9wdGlvbk5hbWUgfHwgXCJncmlkT3B0aW9uc1wiO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCkge1xyXG4gICAgICBjb25zdCBncmlkT3B0aW9uID0gZXZlbnQudGFyZ2V0XHJcbiAgICAgICAgLnRyaW0oKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiKFwiLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiKVwiLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiZ3JvdXAucmVmcmVzaEdyaWRcIiwgXCJcIik7XHJcbiAgICAgIGlmIChncmlkT3B0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBncmlkT3B0aW9uTmFtZSA9IGdyaWRPcHRpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB6Z3JpZENvbnRyb2wgPSBncm91cFtncmlkT3B0aW9uTmFtZV0gYXMgWkdyaWQ7XHJcbiAgICBpZiAoemdyaWRDb250cm9sKSB7XHJcbiAgICAgIHpncmlkQ29udHJvbC5nZXREYXRhKCk7XHJcbiAgICB9XHJcbiAgICBncm91cFsnaXNUcmlnZ2VyZWQnXSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoUGFnZSgpIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIucm91dGVSZXVzZVN0cmF0ZWd5LnNob3VsZFJldXNlUm91dGUgPSAoKSA9PiBmYWxzZTtcclxuICAgIC8vIHRoaXMucm91dGVyLm9uU2FtZVVybE5hdmlnYXRpb24gPSAncmVsb2FkJztcclxuICAgIC8vIGNvbnNvbGUubG9nKCdQYXRoOiAnLCB0aGlzLmFjdGl2YXRlZFJvdXRlWydfcm91dGVyU3RhdGUnXS5zbmFwc2hvdC51cmwpO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY3JtL2N1c3RvbWVyJ10pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xvbmVOZXdDYWNoZVpNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBjb25zdCBjYWNoZVpNb2RlbCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldENhY2hlKFwiY2xvbmVOZXdNb2RlbFwiKTtcclxuICAgIGlmIChjYWNoZVpNb2RlbCkge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKFwiY2xvbmVOZXdNb2RlbFwiKTtcclxuICAgICAgZ3JvdXAuek1vZGVsID0gY2FjaGVaTW9kZWw7XHJcbiAgICAgIGdyb3VwLnpNb2RlbC5JZCA9IDA7XHJcbiAgICB9XHJcbiAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuZXdNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICBsZXQgX2dyb3VwOiBaR3JvdXAgPSBncm91cDtcclxuXHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgaWYgKGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YS5TdWJUeXBlKSB7XHJcbiAgICAgICAgX2dyb3VwID0gZ3JvdXBbJ18nICsgZXZlbnQuZGF0YS5TdWJUeXBlXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9mKFtdKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJCZWZvcmUgbmV3LCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5iZWZvcmVOZXdNb2RlbChfZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImN1cnJlbnQgdXJsOiBcIiwgdGhpcy5yb3V0ZXIudXJsKTtcclxuXHJcbiAgICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGdyb3VwLnBhcmVudFJlZmVyZW5jZUlkIHx8IFwiMFwiO1xyXG4gICAgICAgICAgY29uc3QgcGF0aFNlZ21lbnQgPSB0aGlzLnJvdXRlci51cmwuc3BsaXQoXCIvXCIpO1xyXG4gICAgICAgICAgY29uc3QgbGFzdFNlZ21lbnQgPSBwYXRoU2VnbWVudFtwYXRoU2VnbWVudC5sZW5ndGggLSAxXTtcclxuICAgICAgICAgIGlmIChsYXN0U2VnbWVudCA9PT0gXCJlZGl0XCIpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3UGF0aCA9IHBhdGhTZWdtZW50LnNsaWNlKDAsIHBhdGhTZWdtZW50Lmxlbmd0aCAtIDIpO1xyXG4gICAgICAgICAgICBuZXdQYXRoLnB1c2gocmVmZXJlbmNlSWQpO1xyXG4gICAgICAgICAgICBuZXdQYXRoLnB1c2goXCJuZXdcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlWk1vZGVsID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUoXCJjbG9uZU5ld01vZGVsXCIpO1xyXG4gICAgICAgICAgICBpZiAoIWNhY2hlWk1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgLy8gU2tpcCBpZiBpdCBDbG9uZU5ld1xyXG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodGhpcy5ncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UsIHsgc2tpcExvY2F0aW9uQ2hhbmdlOiB0cnVlIH0pLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cC56TW9kZWwgPSB7fTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAuaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwLmlzTmV3ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKG5ld1BhdGgpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKG5ld1BhdGgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChsYXN0U2VnbWVudCA9PT0gXCJuZXdcIikge1xyXG4gICAgICAgICAgICBncm91cC56TW9kZWwgPSB7fTtcclxuICAgICAgICAgICAgZ3JvdXAuZm9ybS5yZXNldCgpO1xyXG4gICAgICAgICAgICAvL2dyb3VwLmZvcm0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyb3VwLmlzTmV3ID0gdHJ1ZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgZ3JvdXAuek1vZGVsW2dyb3VwLnBhcmVudFJlZmVyZW5jZUZpZWxkXSA9IGdyb3VwLnBhcmVudFJlZmVyZW5jZUlkLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgICAgICAgICAvL3RoaXMucm91dGVyLm5hdmlnYXRlKFtncm91cC5lZGl0TW9kZWxVUkwsIHJlZmVyZW5jZUlkLCBcIm5ld1wiXSwge1xyXG4gICAgICAgICAgICAvLyAgcmVsYXRpdmVUbzogZ3JvdXAuY3RybFNjb3BlLmFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICAvL30pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKFtyZWZlcmVuY2VJZCwgJ25ldyddKTsgXHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtncm91cC5lZGl0TW9kZWxVUkxdLCB7XHJcbiAgICAgICAgICAgICAgcmVsYXRpdmVUbzogZ3JvdXAuY3RybFNjb3BlLmFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy90aGlzLnJvdXRlci5uYXZpZ2F0ZShbZ3JvdXAuZWRpdE1vZGVsVVJMLCByZWZlcmVuY2VJZCwgXCJuZXdcIl0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZU1vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGxldCBjcmVhdGVNb2RlbHJlcyA9IG51bGw7XHJcbiAgICBsZXQgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgbGV0IF9ncm91cDogWkdyb3VwID0gZ3JvdXA7XHJcblxyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGlmIChldmVudC5kYXRhICYmIGV2ZW50LmRhdGEuU3ViVHlwZSkge1xyXG4gICAgICAgIGZnID0gZ3JvdXBbJ18nICsgZXZlbnQuZGF0YS5TdWJUeXBlXS5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBfZ3JvdXAgPSBncm91cFsnXycgKyBldmVudC5kYXRhLlN1YlR5cGVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmZy5kaXJ0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJGb3JtIGlzIG5vdCBkaXJ0eSBoZW5jZSByZWNvcmQgaXMgbm90IHNhdmUuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmZy52YWxpZCkge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudEVycm9ySGFuZGxlci5zaG93Rm9ybUdyb3VwRXJyb3JNZXNzYWdlKGdyb3VwLCBmZyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBvZihfZ3JvdXAuek1vZGVsKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJCZWZvcmUgY3JlYXRlLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5iZWZvcmVDcmVhdGVNb2RlbChfZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICBPYmplY3QuYXNzaWduKF9ncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmV3TW9kZWwgPSBPYmplY3QuYXNzaWduKHt9LCBfZ3JvdXAuek1vZGVsKTtcclxuICAgICAgICAgIFpDb21wb25lbnRIZWxwZXIucmVtb3ZlTnVsbEZpZWxkcyhuZXdNb2RlbCk7XHJcbiAgICAgICAgICAvLyBPYmplY3Qua2V5cyhuZXdNb2RlbCkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAvLyAgIGlmIChuZXdNb2RlbFtrZXldID09PSBudWxsKSB7XHJcbiAgICAgICAgICAvLyAgICAgZGVsZXRlIG5ld01vZGVsW2tleV07XHJcbiAgICAgICAgICAvLyAgIH1cclxuICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgLy8gaWYgKCFuZXdNb2RlbC5JZCkge1xyXG4gICAgICAgICAgLy8gICBuZXdNb2RlbC5JZCA9IDA7XHJcbiAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZVxyXG4gICAgICAgICAgICAuaHR0cFBvc3QkKFxyXG4gICAgICAgICAgICAgIF9ncm91cC5yZXNvdXJjZVVSTCwgLy8gKyBcIi9cIiArIGdyb3VwLnpNb2RlbC5JZCxcclxuICAgICAgICAgICAgICBuZXdNb2RlbFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY3JlYXRlTW9kZWxyZXMgPSByZXNwO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgbWFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc01lc3NhZ2UgPSBldmVudC5kYXRhWydTdWNjZXNzQ3JlYXRlZE1lc3NhZ2UnXSA/IGV2ZW50LmRhdGFbJ1N1Y2Nlc3NDcmVhdGVkTWVzc2FnZSddIDogXCJSZWNvcmQgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuXCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCByZXNNZXNzYWdlKVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWw6IGFueSkgPT4ge1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgY3JlYXRlZCwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgaWYgKHptb2RlbCkge1xyXG5cclxuICAgICAgICAgICAgLy9zdXBwb3J0IG9sZCBhbmQgbmV3IHdlYmFwaSBtZXRob2RcclxuICAgICAgICAgICAgaWYgKHptb2RlbC5EYXRhKSB7XHJcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihfZ3JvdXAuek1vZGVsLCB6bW9kZWwuRGF0YSk7XHJcbiAgICAgICAgICAgICAgZmcucGF0Y2hWYWx1ZSh6bW9kZWwuRGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoem1vZGVsW1wiSWRcIl0pIHtcclxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKF9ncm91cC56TW9kZWwsIHptb2RlbCk7XHJcbiAgICAgICAgICAgICAgZmcucGF0Y2hWYWx1ZSh6bW9kZWwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBfZ3JvdXAucmVmZXJlbmNlSWQgPSBfZ3JvdXAuek1vZGVsLklkO1xyXG4gICAgICAgICAgICBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyQ3JlYXRlTW9kZWwoX2dyb3VwLCB6bW9kZWwpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNyZWF0ZU1vZGVscmVzLlByb2Nlc3NpbmdTdGF0dXMgPT0gbnVsbCB8fCBjcmVhdGVNb2RlbHJlcy5Qcm9jZXNzaW5nU3RhdHVzID09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3AgJiYgX2dyb3VwLnpNb2RlbC5JZCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgIF9ncm91cC5pc05ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIF9ncm91cC5pc0VkaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIF9ncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIF9ncm91cC5jYW5jZWxCdXR0b25OYW1lID0gXCJDbG9zZVwiO1xyXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oX2dyb3VwLnpNb2RlbCwgcmVzcCk7XHJcbiAgICAgICAgICAgICAgZmcucGF0Y2hWYWx1ZShyZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZmcubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRG9uZSB1cGRhdGVNb2RlbCB1cGRhdGVkIHpNb2RlbDpcIiwgZmcudmFsdWUpO1xyXG4gICAgICAgICAgLy8gdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhcIlJlY29yZCBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5cIik7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG4gIHB1YmxpYyB1cGRhdGVNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICB0aGlzLnVwZGF0ZU1vZGVsT2JzZXJ2YWJsZShldmVudCwgZ3JvdXApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZU1vZGVsT2JzZXJ2YWJsZShldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwLCBmb3JtOiBGb3JtR3JvdXAgPSBudWxsLCB1cGRhdGVBUElPYnNlcnZhYmxlOiBPYnNlcnZhYmxlPGFueT4gPSBudWxsLCBpc1NraXBEaXJ0eSA9IGZhbHNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGxldCBmZyA9IGZvcm0gfHwgZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBsZXQgX2dyb3VwOiBaR3JvdXAgPSBncm91cDtcclxuXHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgaWYgKGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YS5TdWJUeXBlKSB7XHJcbiAgICAgICAgZmcgPSBfZ3JvdXBbJ18nICsgZXZlbnQuZGF0YS5TdWJUeXBlXS5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBfZ3JvdXAgPSBfZ3JvdXBbJ18nICsgZXZlbnQuZGF0YS5TdWJUeXBlXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5pc0Zvcm1EaXJ0eUFuZFZhbGlkKGZnLCBfZ3JvdXAsIGlzU2tpcERpcnR5KSkge1xyXG4gICAgICBpZiAoaXNTa2lwRGlydHkpIHtcclxuICAgICAgICBmZy5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVBUElPYnNlcnZhYmxlID0gdXBkYXRlQVBJT2JzZXJ2YWJsZSB8fCB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFB1dCQoX2dyb3VwLnJlc291cmNlVVJMICsgXCIvXCIgKyBfZ3JvdXAuek1vZGVsLklkLCBfZ3JvdXAuek1vZGVsKVxyXG4gICAgICAucGlwZShtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc01lc3NhZ2UgPSBldmVudC5kYXRhWydTdWNjZXNzVXBkYXRlZE1lc3NhZ2UnXSA/IGV2ZW50LmRhdGFbJ1N1Y2Nlc3NVcGRhdGVkTWVzc2FnZSddIDogXCJSZWNvcmQgaXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuXCI7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgcmVzTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgICAvL3RoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIFwiUmVjb3JkIGlzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiKVxyXG4gICAgICApKTtcclxuXHJcbiAgICByZXR1cm4gb2YoX2dyb3VwLnpNb2RlbClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIHVwZGF0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlVXBkYXRlTW9kZWwoX2dyb3VwKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihfZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIHJldHVybiB1cGRhdGVBUElPYnNlcnZhYmxlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgdXBkYXRlZCwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgaWYgKHptb2RlbCAmJiB6bW9kZWwuRGF0YSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKF9ncm91cC56TW9kZWwsIHptb2RlbC5EYXRhKTtcclxuICAgICAgICAgICAgZmcucGF0Y2hWYWx1ZSh6bW9kZWwuRGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmICh6bW9kZWwgJiYgem1vZGVsW1wiSWRcIl0pIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihfZ3JvdXAuek1vZGVsLCB6bW9kZWwpO1xyXG4gICAgICAgICAgICBmZy5wYXRjaFZhbHVlKHptb2RlbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgX2dyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgZmcubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyVXBkYXRlTW9kZWwoX2dyb3VwLCB6bW9kZWwpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsb25lTmV3TW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgbGV0IF9ncm91cDogWkdyb3VwID0gZ3JvdXA7XHJcblxyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGlmIChldmVudC5kYXRhICYmIGV2ZW50LmRhdGEuU3ViVHlwZSkge1xyXG4gICAgICAgIF9ncm91cCA9IGdyb3VwWydfJyArIGV2ZW50LmRhdGEuU3ViVHlwZV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBPYmplY3QuYXNzaWduKF9ncm91cC56TW9kZWwsIF9ncm91cC5mb3JtLnZhbHVlKTtcclxuICAgIF9ncm91cC56TW9kZWwuSWQgPSAwO1xyXG5cclxuICAgIGNvbnN0IGNsZWFyRmllbGRzID0gW1wiV0ZTX0RvY3VtZW50SWRcIiwgXCJXRlNfU3RhdHVzQ29kZVwiLCBcIldGU19TdGF0dXNOYW1lXCJdO1xyXG4gICAgY2xlYXJGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgaWYgKF9ncm91cC56TW9kZWwuaGFzT3duUHJvcGVydHkoZmllbGQpKSB7XHJcbiAgICAgICAgX2dyb3VwLnpNb2RlbFtmaWVsZF0gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhY2hlU2VydmljZS5zZXRDYWNoZShcImNsb25lTmV3TW9kZWxcIiwgZ3JvdXAuek1vZGVsKTtcclxuICAgIHRoaXMubmV3TW9kZWwobnVsbCwgZ3JvdXApO1xyXG4gICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgIF9ncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWxldGVNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICBsZXQgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgbGV0IF9ncm91cDogWkdyb3VwID0gZ3JvdXA7XHJcblxyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGlmIChldmVudC5kYXRhICYmIGV2ZW50LmRhdGEuU3ViVHlwZSkge1xyXG4gICAgICAgIGZnID0gZ3JvdXBbJ18nICsgZXZlbnQuZGF0YS5TdWJUeXBlXS5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBfZ3JvdXAgPSBncm91cFsnXycgKyBldmVudC5kYXRhLlN1YlR5cGVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb2YoX2dyb3VwLnpNb2RlbClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIGRlbGV0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlRGVsZXRlTW9kZWwoX2dyb3VwKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgICAgICAgIF9ncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3coXCJEZWxldGUgUmVjb3JkXCIsIFwiQXJlIHlvdSBzdXJlP1wiLFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIk5vXCIsIGNzc0NsYXNzOiBcInNlY29uZGFyeVwiIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIlllc1wiLCBjc3NDbGFzczogXCJwcmltYXJ5XCIgfSBhcyBBbGVydEJ1dHRvblxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlcGx5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmIChyZXBseSA9PT0gXCJZZXNcIikge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKF9ncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICAgICAgX2dyb3VwLnpNb2RlbC5EaXNhYmxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgLmh0dHBQdXQkKF9ncm91cC5yZXNvdXJjZVVSTCArIFwiL1wiICsgX2dyb3VwLnpNb2RlbC5JZCwgX2dyb3VwLnpNb2RlbClcclxuICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIG1hcCgocmVzKSA9PlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCBcIlJlY29yZCBpcyBkZWxldGVkIHN1Y2Nlc3NmdWxseS5cIilcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkFmdGVyIGRlbGV0ZWQsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJEZWxldGVNb2RlbChfZ3JvdXAsIHptb2RlbCk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmhpc3RvcnlCYWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzRm9ybURpcnR5QW5kVmFsaWQoZmc6IEZvcm1Hcm91cCwgZ3JvdXA6IFpHcm91cCwgaXNTa2lwRGlydHkgPSBmYWxzZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFpc1NraXBEaXJ0eSAmJiAhZmcuZGlydHkpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiRm9ybSBpcyBub3QgZGlydHkgaGVuY2UgcmVjb3JkIGlzIG5vdCBzYXZlLlwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZmcudmFsaWQpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRFcnJvckhhbmRsZXIuc2hvd0Zvcm1Hcm91cEVycm9yTWVzc2FnZShncm91cCwgZmcpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVEZWxldGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVVcGRhdGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVOZXdNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZU5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZU5ld29kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZU5ld01vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlQ3JlYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVDcmVhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVVcGRhdGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlQ3JlYXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgYmVmb3JlUGFnZUluaXRpYWxpc2UoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZSBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlUGFnZUluaXRpYWxpc2UoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckdldE1vZGVsU3VjY2Vzcyhncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuek1vZGVsLklkKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcInpNb2RlbC5JZCBpcyBub3QgZGVmaW5lZFwiLCBncm91cC56TW9kZWwpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgaWYgKCFncm91cC5hZnRlckdldE1vZGVsU3VjY2Vzcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckdldE1vZGVsU3VjY2VzcyBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckdldE1vZGVsU3VjY2Vzcyhncm91cCk7XHJcbiAgfVxyXG5cclxuICBhZnRlck5ld01vZGVsKGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlck5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyTmV3TW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJOZXdNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyQ3JlYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckNyZWF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyQ3JlYXRlTW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJDcmVhdGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJVcGRhdGVNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyVXBkYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJVcGRhdGVNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlclVwZGF0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckRlbGV0ZU1vZGVsKGdyb3VwOiBaR3JvdXAsIHptb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJEZWxldGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckRlbGV0ZU1vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyRGVsZXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgfVxyXG5cclxuICBhZnRlclBhZ2VJbml0aWFsaXNlKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJQYWdlSW5pdGlhbGlzZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlclBhZ2VJbml0aWFsaXNlIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlclBhZ2VJbml0aWFsaXNlKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIC8vIHByaXZhdGUgb25BY3Rpb24oZ3JvdXA6IFpHcm91cCkge1xyXG4gIC8vICAgdGhpcy5hY3Rpb25TaGVldEN0cmxcclxuICAvLyAgICAgLmNyZWF0ZSh7XHJcbiAgLy8gICAgICAgaGVhZGVyOiBcIkNob29zZSBhbiBBY3Rpb25cIixcclxuICAvLyAgICAgICBidXR0b25zOiBncm91cC50b3BSaWdodEFjdGlvbkJ1dHRvblxyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgICAudGhlbihhY3Rpb25TaGVldEVsID0+IHtcclxuICAvLyAgICAgICBhY3Rpb25TaGVldEVsLnByZXNlbnQoKTtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXRNb2RlbFZhbHVlKHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBncm91cDogWkdyb3VwKSB7XHJcbiAgLy8gICBncm91cC56TW9kZWxbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xyXG4gIC8vICAgaWYgKGdyb3VwLmlzTG9hZGluZykge1xyXG4gIC8vICAgICByZXR1cm47XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjb25zdCBmZyA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gIC8vICAgaWYgKCFmZykge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAsIG5vLWRlYnVnZ2VyXHJcbiAgLy8gICAgIGRlYnVnZ2VyO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgY29uc3QgZmMgPSBmZy5jb250cm9sc1twcm9wZXJ0eU5hbWVdO1xyXG4gIC8vICAgaWYgKCFmYykge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlclxyXG4gIC8vICAgICBkZWJ1Z2dlcjtcclxuICAvLyAgIH1cclxuICAvLyAgIGZjLnNldFZhbHVlKHZhbHVlKTtcclxuICAvLyAgIGZjLm1hcmtBc0RpcnR5KCk7XHJcbiAgLy8gfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2hvd3pNb2RhbChcclxuICAgIGNvbEZpZWxkcyQ6IHN0cmluZyB8IE9ic2VydmFibGU8QXJyYXk8WkZpZWxkPj4sXHJcbiAgICBwYXJlbnRHcm91cDogWkdyb3VwLFxyXG4gICAgZm9ybUhlYWRlcjogc3RyaW5nLFxyXG4gICAgek1vZGVsPzogYW55LFxyXG4gICAgcmVmZXJJZD86IHN0cmluZyxcclxuICAgIGNvbXBvbmVudFNpemU/OiBaQ29tcG9uZW50U2l6ZSxcclxuICAgIHNraXBJc0RpcnR5Q2hlY2s/OiBib29sZWFuXHJcbiAgKSB7XHJcbiAgICBjb25zdCBtb2RhbGNvbXBvbmVudCA9IFptb2RhbENvbXBvbmVudDtcclxuICAgIGNvbnN0IG1vZGFsbW9iaWxlY29tcG9uZW50ID0gWm1vZGFsTW9iaWxlQ29tcG9uZW50O1xyXG5cclxuICAgIGlmIChwYXJlbnRHcm91cCkge1xyXG4gICAgICAvLyBkaXNhYmxlIGlzVHJpZ2dlcmVkIGJlZm9yZSBkaXNwbGF5IHRoZSBwb3B1cC5cclxuICAgICAgcGFyZW50R3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5zaG93KGNvbEZpZWxkcyQsIHBhcmVudEdyb3VwLCBmb3JtSGVhZGVyLCBtb2RhbGNvbXBvbmVudCwgbW9kYWxtb2JpbGVjb21wb25lbnQsIHpNb2RlbCwgcmVmZXJJZCwgY29tcG9uZW50U2l6ZSwgc2tpcElzRGlydHlDaGVjaylcclxuICAgIC8vY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5zaG93KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGNvb2tpZVN0b3JlUG9zdChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgLy8gZm9yIFBvc3QgdG8gQ29va2llU3RvcmVcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVVJMID0gdGhpcy5vYXV0aEVudmlyb25tZW50VXJsICsgXCJhcGkvQ29va2llU3RvcmVzXCI7XHJcbiAgICBjb25zdCBjb29raWVTdG9yZVZhbHVlID0ge1xyXG4gICAgICAnTmFtZSc6IG5hbWUsXHJcbiAgICAgICdWYWx1ZSc6IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChjb29raWVTdG9yZVVSTCwgY29va2llU3RvcmVWYWx1ZSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZ3JpZCBjb25maWcgc2F2ZWQoXCIgKyByZXMuc3RhdHVzICsgXCIpOiBcIiwgcmVzKTtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVHZXQobmFtZTogc3RyaW5nLCBhY2Nlc3NUb2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVVJMID0gdGhpcy5vYXV0aEVudmlyb25tZW50VXJsICsgXCJhcGkvQ29va2llU3RvcmVzLz9uYW1lPVwiICsgbmFtZTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBHZXQkKGNvb2tpZVN0b3JlVVJMLCB7IGhlYWRlcnM6IGFjY2Vzc1Rva2VuIH0pLnBpcGUobWFwKHJlcyA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVEZWxldGVNdWx0aXBsZShuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgLy8gZm9yIFBvc3QgdG8gQ29va2llU3RvcmVcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVVJMID0gdGhpcy5vYXV0aEVudmlyb25tZW50VXJsICsgXCJBZG1pbi9EZWxldGVNdWx0aXBsZUNvb2tpZXNcIjtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVmFsdWUgPSB7XHJcbiAgICAgICdjb250YWluTmFtZSc6IG5hbWVcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwUG9zdCQoY29va2llU3RvcmVVUkwsIGNvb2tpZVN0b3JlVmFsdWUpLnBpcGUobWFwKHJlcyA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9FbGVtZW50QnlJZChpZDogc3RyaW5nKSB7XHJcbiAgICBsZXQgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcbiAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0cmFuc2xhdGlvblBhZ2VFbGVtZW50KGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3Qgb2JzTGlzdCA9IG5ldyBBcnJheTxPYnNlcnZhYmxlPGFueT4+KCk7XHJcbiAgICBpZiAoZ3JvdXAuZm9ybUhlYWRlcikge1xyXG4gICAgICBvYnNMaXN0LnB1c2godGhpcy50cmFuc2xhdGlvblNlcnZpY2UuJHRyYW5zbGF0ZVNpbmdsZUl0ZW0oZ3JvdXAsIFwiZm9ybUhlYWRlclwiLCB0aGlzLmVudmlyb25tZW50LmFwcGxpY2F0aW9uU2hvcnROYW1lKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGdyb3VwLm5hdkl0ZW1zICYmIGdyb3VwLm5hdkl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgb2JzTGlzdC5wdXNoKHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLiR0cmFuc2xhdGVJdGVtTGlzdChncm91cC5uYXZJdGVtcywgXCJ0ZXh0XCIsIHRoaXMuZW52aXJvbm1lbnQuYXBwbGljYXRpb25TaG9ydE5hbWUpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9ya0pvaW4ob2JzTGlzdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9hZENvbnRhaW5lclZpZXcoZWxlbWVudENvbnRhaW5lcjogYW55LCBjb250YWluZXJQYWdlOiBhbnksIGdyb3VwPzogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWVsZW1lbnRDb250YWluZXIpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJFbGVtZW50Q29udGFpbmVyIGlzIG51bGwuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFjb250YWluZXJQYWdlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQ29udGFpbmVyUGFnZSBpcyBudWxsLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZpZXdDb250YWluZXJSZWYgPSBlbGVtZW50Q29udGFpbmVyLnZpZXdDb250YWluZXJSZWY7XHJcbiAgICB2aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XHJcblxyXG4gICAgZ3JvdXAgPSBncm91cCA/IGdyb3VwIDogbmV3IFpHcm91cDtcclxuICAgIGNvbnN0IGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT4gPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb250YWluZXJQYWdlKTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtcImdyb3VwXCJdLCBncm91cCk7XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihjb21wb25lbnRSZWYuaW5zdGFuY2VbXCJncm91cFwiXSwgeyBpc0VtYmVkZGVkUGFnZTogdHJ1ZSwgZWxlbWVudENvbnRhaW5lcjogZWxlbWVudENvbnRhaW5lciB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjbG9zZUNvbnRhaW5lclZpZXcoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3Qgdmlld0NvbnRhaW5lclJlZiA9IGdyb3VwLmVsZW1lbnRDb250YWluZXIudmlld0NvbnRhaW5lclJlZjtcclxuICAgIGlmICh2aWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgIHZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZWZyZXNoR3JpZChncm91cDogWkdyb3VwKSB7XHJcbiAgY29uc3QgemdyaWRDb250cm9sID0gZ3JvdXBbXCJncmlkT3B0aW9uc1wiXSBhcyBaR3JpZDtcclxuICBpZiAoemdyaWRDb250cm9sKSB7XHJcbiAgICB6Z3JpZENvbnRyb2wuZ2V0RGF0YSgpO1xyXG4gIH1cclxuICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG59XHJcbiJdfQ==