@smarterplan/ngx-smarterplan-core 1.4.21 → 1.4.22

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 (114) hide show
  1. package/README.md +24 -24
  2. package/esm2022/lib/components/csv-export/csv-export.component.mjs +3 -3
  3. package/esm2022/lib/components/loader/loader.component.mjs +3 -3
  4. package/esm2022/lib/components/menu-bar/avatar/avatar.component.mjs +1 -1
  5. package/esm2022/lib/components/menu-bar/menu-bar.component.mjs +3 -3
  6. package/esm2022/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +3 -3
  7. package/esm2022/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +3 -3
  8. package/esm2022/lib/components/search-bar/search-bar.component.mjs +3 -3
  9. package/esm2022/lib/components/splat-viewer/splat-viewer.component.mjs +361 -0
  10. package/esm2022/lib/components/support-modal/support-modal.component.mjs +3 -3
  11. package/esm2022/lib/config.mjs +1 -1
  12. package/esm2022/lib/helpers.service.mjs +1 -1
  13. package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +1 -1
  14. package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +1 -1
  15. package/esm2022/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +1 -1
  16. package/esm2022/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +1 -1
  17. package/esm2022/lib/matterport-extensions/scene-component/SceneComponent.mjs +1 -1
  18. package/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +22 -22
  19. package/esm2022/lib/matterport-extensions/tv-player/TvPlayer.mjs +1 -1
  20. package/esm2022/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +22 -22
  21. package/esm2022/lib/mattertagData.mjs +1 -1
  22. package/esm2022/lib/ngx-smarterplan-core.module.mjs +9 -4
  23. package/esm2022/lib/ngx-smarterplan-core.service.mjs +1 -1
  24. package/esm2022/lib/pipes/duration-to-string.pipe.mjs +1 -1
  25. package/esm2022/lib/pipes/format-date-number-to-digits.pipe.mjs +1 -1
  26. package/esm2022/lib/pipes/hashtag-from-id.pipe.mjs +1 -1
  27. package/esm2022/lib/pipes/safe-url.pipe.mjs +1 -1
  28. package/esm2022/lib/pipes/time-date-to-local-string.pipe.mjs +1 -1
  29. package/esm2022/lib/pipes/username-from-id.pipe.mjs +1 -1
  30. package/esm2022/lib/services/amplify-cache.service.mjs +1 -1
  31. package/esm2022/lib/services/base-tab.service.mjs +1 -1
  32. package/esm2022/lib/services/baseVisibility.service.mjs +1 -1
  33. package/esm2022/lib/services/content.service.mjs +1 -1
  34. package/esm2022/lib/services/filter.service.mjs +1 -1
  35. package/esm2022/lib/services/intervention.service.mjs +1 -1
  36. package/esm2022/lib/services/locale.service.mjs +1 -1
  37. package/esm2022/lib/services/matterport-import.service.mjs +1 -1
  38. package/esm2022/lib/services/matterport-measurement.service.mjs +1 -1
  39. package/esm2022/lib/services/matterport-navigation.service.mjs +1 -1
  40. package/esm2022/lib/services/matterport-pointer.service.mjs +6 -6
  41. package/esm2022/lib/services/matterport-tag-copy.service.mjs +1 -1
  42. package/esm2022/lib/services/matterport-tag.service.mjs +12 -7
  43. package/esm2022/lib/services/matterport.service.mjs +17 -17
  44. package/esm2022/lib/services/models/affectation.service.mjs +1 -1
  45. package/esm2022/lib/services/models/base-object.service.mjs +1 -1
  46. package/esm2022/lib/services/models/capture.service.mjs +1 -1
  47. package/esm2022/lib/services/models/comment.service.mjs +1 -1
  48. package/esm2022/lib/services/models/domain.service.mjs +1 -1
  49. package/esm2022/lib/services/models/equipment.service.mjs +1 -1
  50. package/esm2022/lib/services/models/event.service.mjs +1 -1
  51. package/esm2022/lib/services/models/feature.service.mjs +1 -1
  52. package/esm2022/lib/services/models/hashtag.service.mjs +1 -1
  53. package/esm2022/lib/services/models/layer.service.mjs +1 -1
  54. package/esm2022/lib/services/models/measurement.service.mjs +1 -1
  55. package/esm2022/lib/services/models/mission.service.mjs +1 -1
  56. package/esm2022/lib/services/models/navigation.service.mjs +1 -1
  57. package/esm2022/lib/services/models/node.service.mjs +1 -1
  58. package/esm2022/lib/services/models/object3D.service.mjs +1 -1
  59. package/esm2022/lib/services/models/operation.service.mjs +1 -1
  60. package/esm2022/lib/services/models/organisation.service.mjs +1 -1
  61. package/esm2022/lib/services/models/plan.service.mjs +1 -1
  62. package/esm2022/lib/services/models/poi.service.mjs +27 -27
  63. package/esm2022/lib/services/models/profile.service.mjs +1 -1
  64. package/esm2022/lib/services/models/property.service.mjs +1 -1
  65. package/esm2022/lib/services/models/space.service.mjs +1 -1
  66. package/esm2022/lib/services/models/template.service.mjs +1 -1
  67. package/esm2022/lib/services/models/ticket.service.mjs +1 -1
  68. package/esm2022/lib/services/models/visit.service.mjs +1 -1
  69. package/esm2022/lib/services/models/zone.service.mjs +1 -1
  70. package/esm2022/lib/services/navigator.service.mjs +1 -1
  71. package/esm2022/lib/services/obj-to-glb.mjs +649 -0
  72. package/esm2022/lib/services/s3.service.mjs +43 -3
  73. package/esm2022/lib/services/search.service.mjs +1 -1
  74. package/esm2022/lib/services/support.service.mjs +1 -1
  75. package/esm2022/lib/services/sweep-locator.service.mjs +1 -1
  76. package/esm2022/lib/services/tag.service.mjs +16 -16
  77. package/esm2022/lib/services/threejs-import.service.mjs +6 -4
  78. package/esm2022/lib/services/threejs.service.mjs +867 -95
  79. package/esm2022/lib/services/user.service.mjs +1 -1
  80. package/esm2022/lib/services/utils/matterport-transform.util.mjs +1 -1
  81. package/esm2022/lib/services/validators.service.mjs +1 -1
  82. package/esm2022/lib/services/viewer.service.mjs +189 -7
  83. package/esm2022/lib/services/zone-drawer.service.mjs +1 -1
  84. package/esm2022/lib/services/zoneChange.service.mjs +1 -1
  85. package/esm2022/lib/tokens/matterport-sdk-key.token.mjs +1 -1
  86. package/esm2022/lib/validators/email.directive.mjs +1 -1
  87. package/esm2022/lib/validators/no-empty.directive.mjs +1 -1
  88. package/esm2022/lib/validators/number.directive.mjs +1 -1
  89. package/esm2022/lib/validators/text.directive.mjs +1 -1
  90. package/esm2022/public-api.mjs +3 -1
  91. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +2239 -233
  92. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  93. package/lib/components/splat-viewer/splat-viewer.component.d.ts +98 -0
  94. package/lib/ngx-smarterplan-core.module.d.ts +7 -6
  95. package/lib/services/matterport-tag.service.d.ts +5 -5
  96. package/lib/services/obj-to-glb.d.ts +66 -0
  97. package/lib/services/s3.service.d.ts +7 -0
  98. package/lib/services/threejs.service.d.ts +336 -16
  99. package/lib/services/viewer.service.d.ts +110 -8
  100. package/package.json +1 -1
  101. package/public-api.d.ts +2 -0
  102. package/src/assets/viewers/splat/chunk-BYLI4YBI.js +17037 -0
  103. package/src/assets/viewers/splat/chunk-LDV6YPMG.js +1 -0
  104. package/src/assets/viewers/splat/chunk-WZ5Z4TU3.js +105719 -0
  105. package/src/assets/viewers/splat/convert-4DRLH77X.js +1 -0
  106. package/src/assets/viewers/splat/convert.html +11 -0
  107. package/src/assets/viewers/splat/converter-SLBB5MHG.js +1 -0
  108. package/src/assets/viewers/splat/index.html +90 -0
  109. package/src/assets/viewers/splat/spz-DEYRea_v-QE6YSGIB.js +5292 -0
  110. package/src/assets/viewers/splat/viewer-W4X3FWQJ.js +2704 -0
  111. package/src/assets/viewers/splat/viewer.css +1096 -0
  112. package/src/assets/viewers/splat/webp.wasm +0 -0
  113. package/src/assets/viewers/splat/worker.mjs +1383 -0
  114. package/src/assets/vs-app.json +67 -67
@@ -16,6 +16,39 @@ import * as i2 from "./matterport.service";
16
16
  import * as i3 from "./threejs.service";
17
17
  import * as i4 from "./sweep-locator.service";
18
18
  import * as i5 from "../config";
19
+ /**
20
+ * What a Gaussian splat file is named with, when it is a .ply: the content is what tells it from
21
+ * another .ply, and the key is all a visit stores (see isGaussianSplatPly).
22
+ */
23
+ export const GAUSSIAN_SPLAT_PLY_SUFFIX = '.splat.ply';
24
+ /**
25
+ * Whether a 3D model file holds Gaussian splats, which the Three.js viewer cannot draw: .spz,
26
+ * .splat, .ksplat, SuperSplat's .sog, a .ply named with GAUSSIAN_SPLAT_PLY_SUFFIX, or the
27
+ * lod-meta.json of a Streamed SOG - SuperSplat's levels of detail, in pieces beside it.
28
+ */
29
+ export function isGaussianSplatFile(name) {
30
+ return /\.(spz|splat|ksplat|sog|splat\.ply)($|\?)/i.test(name ?? '') || isStreamedSplatFile(name);
31
+ }
32
+ /**
33
+ * Whether a .ply holds Gaussian splats: what splat tools export carries, for each splat, its colour
34
+ * as spherical harmonics (f_dc_0...) and its size (scale_0...). Only the header is read.
35
+ */
36
+ export async function isGaussianSplatPly(file) {
37
+ const start = await file.slice(0, 64 * 1024).text();
38
+ const end = start.indexOf('end_header');
39
+ if (!start.startsWith('ply') || end < 0) {
40
+ return false;
41
+ }
42
+ const properties = start.slice(0, end).split(/\r?\n/)
43
+ .map((line) => line.trim().split(/\s+/))
44
+ .filter((words) => words[0] === 'property')
45
+ .map((words) => words[words.length - 1]);
46
+ return properties.includes('f_dc_0') && properties.includes('scale_0');
47
+ }
48
+ /** Whether a 3D model file is the lod-meta.json of a Streamed SOG; see isGaussianSplatFile. */
49
+ export function isStreamedSplatFile(name) {
50
+ return /(^|\/)lod-meta\.json($|\?)/i.test(name ?? '');
51
+ }
19
52
  export class ViewerService {
20
53
  sdkKey;
21
54
  config;
@@ -292,15 +325,35 @@ export class ViewerService {
292
325
  if (![position?.x, position?.y, position?.z].every((value) => typeof value === 'number')) {
293
326
  return;
294
327
  }
328
+ // A tag is its position; the icon is how it is dressed. One that cannot be fetched - a
329
+ // signature that expired, a file gone from the bucket - must not cost the tag itself.
330
+ let iconUrl;
331
+ try {
332
+ iconUrl = await this.resolveTagIconUrl(poi);
333
+ }
334
+ catch (error) {
335
+ console.warn(`ViewerService: no icon for the tag of element ${object.id}, using the default one.`, error);
336
+ iconUrl = this.defaultTagIconUrl(poi.type);
337
+ }
295
338
  const origin = getThreeJsPoiOrigin(poi);
339
+ // Matterport's stem, kept with the POI by both viewers that place tags.
340
+ let normal = null;
341
+ try {
342
+ const stored = poi.metadata ? JSON.parse(poi.metadata)?.normal : null;
343
+ normal = [stored?.x, stored?.y, stored?.z].every((value) => typeof value === 'number') ? stored : null;
344
+ }
345
+ catch {
346
+ normal = null;
347
+ }
296
348
  this.threeJsService.upsertTag({
297
349
  id: object.id,
298
350
  position,
299
351
  poiType: poi.type,
300
352
  label: object.name ?? object.title ?? null,
301
- iconUrl: await this.resolveTagIconUrl(poi),
353
+ iconUrl,
302
354
  originCaptureID: origin?.captureID ?? null,
303
355
  frame: origin?.frame ?? null,
356
+ normal,
304
357
  });
305
358
  }
306
359
  /**
@@ -418,6 +471,40 @@ export class ViewerService {
418
471
  this.threeJsService.goToTag(elementId);
419
472
  }
420
473
  }
474
+ /** The tag the Three.js camera is sent to, for the splat viewer to point out; see goToThreeJsTag. */
475
+ get threeJsTagFocused$() {
476
+ return this.threeJsService.tagFocused$;
477
+ }
478
+ /** A tag clicked in the splat viewer, said as threeJsTagClicked$ says one clicked in the scene. */
479
+ clickThreeJsTag(elementId) {
480
+ if (this.checkMode('threejs')) {
481
+ this.threeJsService.clickTag(elementId);
482
+ }
483
+ }
484
+ /** Whether the visit's 3D model has a calibration, from its capture's metadata. */
485
+ isThreeJsCalibrated() {
486
+ return this.threeJsCalibrated;
487
+ }
488
+ /** Whether the tags a calibration works with are on show; see ThreeJsService.showsCalibrationTags. */
489
+ isThreeJsShowingCalibrationTags() {
490
+ return this.checkMode('threejs') && this.threeJsService.showsCalibrationTags();
491
+ }
492
+ /** Whether a calibration is under way in the Three.js scene. */
493
+ isThreeJsAligningTags() {
494
+ return this.checkMode('threejs') && this.threeJsService.isAligningTags();
495
+ }
496
+ /** Whether a measurement is taking clicks in the Three.js scene. */
497
+ isThreeJsMeasuring() {
498
+ return this.checkMode('threejs') && this.threeJsService.isMeasuring();
499
+ }
500
+ /** True when a measurement starts taking clicks, false when it stops; see ThreeJsService.measuringChanged$. */
501
+ get threeJsMeasuringChanged$() {
502
+ return this.threeJsService.measuringChanged$;
503
+ }
504
+ /** Says a click in the splat viewer was of no use to the calibration, as one in the scene would. */
505
+ ignoreThreeJsAlignmentClick(expected) {
506
+ this.threeJsService.alignmentClickIgnored$.next(expected);
507
+ }
421
508
  /** Shows only tags of the given POI types; null clears the filter. */
422
509
  setVisibleThreeJsTagTypes(types) {
423
510
  if (this.checkMode('threejs')) {
@@ -440,6 +527,24 @@ export class ViewerService {
440
527
  this.threeJsService.cancelTagAlignment();
441
528
  }
442
529
  }
530
+ /**
531
+ * Says whether the 3D model on screen is the site's only visit. Then there is nowhere else for a
532
+ * tag to have come from, and the tags that do not record where they were placed are its own.
533
+ */
534
+ setThreeJsSoleVisit(sole) {
535
+ if (this.checkMode('threejs')) {
536
+ this.threeJsService.setSoleVisit(sole);
537
+ }
538
+ }
539
+ /**
540
+ * Shows the tags a calibration would work with, including those hidden for not landing on the
541
+ * model, before anything is armed. Cancelling or saving the calibration hides them again.
542
+ */
543
+ revealThreeJsCalibrationTags() {
544
+ if (this.checkMode('threejs')) {
545
+ this.threeJsService.revealCalibrationTags(true);
546
+ }
547
+ }
443
548
  get threeJsAlignmentProgress$() {
444
549
  return this.threeJsService.alignmentProgress$;
445
550
  }
@@ -614,17 +719,35 @@ export class ViewerService {
614
719
  get threeJsMeasurementProgress$() {
615
720
  return this.threeJsService.measurementProgress$;
616
721
  }
617
- /** Ends the Three.js measurement in progress, or returns null when it has fewer than two points. */
618
- finishThreeJsMeasurement() {
722
+ /**
723
+ * Ends the Three.js measurement in progress, or returns null when it has fewer than two points.
724
+ * `screenshot` is the picture of it, when the model is drawn by another viewer than the scene.
725
+ */
726
+ finishThreeJsMeasurement(screenshot) {
619
727
  if (!this.checkMode('threejs')) {
620
728
  return null;
621
729
  }
622
- const measurement = this.threeJsService.finishMeasuring();
730
+ const measurement = this.threeJsService.finishMeasuring(screenshot);
623
731
  if (measurement) {
624
732
  this.toolboxStates.mesure.stat = false;
625
733
  }
626
734
  return measurement;
627
735
  }
736
+ /** A measurement was taken off the model, finished or not; see ThreeJsService.measurementCleared$. */
737
+ get threeJsMeasurementCleared$() {
738
+ return this.threeJsService.measurementCleared$;
739
+ }
740
+ /**
741
+ * Adds a point to the measurement under way, picked on the model in another viewer - the splat
742
+ * viewer - in the model's own coordinates. False when no measurement is under way.
743
+ */
744
+ addThreeJsMeasurePointAtModelPoint(point) {
745
+ return this.checkMode('threejs') && this.threeJsService.addMeasurePointAtModelPoint(point);
746
+ }
747
+ /** The points of the measurement on the model, in the model's own coordinates, for another viewer to draw. */
748
+ getThreeJsMeasurePointsInModelFrame() {
749
+ return this.checkMode('threejs') ? this.threeJsService.getMeasurePointsInModelFrame() : [];
750
+ }
628
751
  /** The measurement last finished in the Three.js viewer, for the form that saves it. */
629
752
  getThreeJsLastMeasurement() {
630
753
  return this.checkMode('threejs') ? this.threeJsService.getLastMeasurement() : null;
@@ -686,6 +809,24 @@ export class ViewerService {
686
809
  selectThreeJsAlignmentTag(elementId) {
687
810
  return this.checkMode('threejs') && this.threeJsService.selectAlignmentTag(elementId);
688
811
  }
812
+ /**
813
+ * Gives the tag being matched in the calibration under way its real place, picked on the model in
814
+ * another viewer - the splat viewer - in the model's own coordinates. False when no tag was waiting.
815
+ */
816
+ matchThreeJsAlignmentTagAtModelPoint(point) {
817
+ return this.checkMode('threejs') && this.threeJsService.matchAlignmentTagAtModelPoint(point);
818
+ }
819
+ /**
820
+ * Takes back the last step of the calibration under way: the tag just chosen, or else the last
821
+ * pair matched. False when there was nothing to take back.
822
+ */
823
+ undoThreeJsAlignmentStep() {
824
+ return this.checkMode('threejs') && this.threeJsService.undoAlignmentStep();
825
+ }
826
+ /** Removes one matched pair of the calibration under way, by its place in the list. */
827
+ removeThreeJsAlignmentPair(index) {
828
+ return this.checkMode('threejs') && this.threeJsService.removeAlignmentPair(index);
829
+ }
689
830
  /** How far the visible tags sit from the 3D model, in model radii. Null without both. */
690
831
  getThreeJsTagDistanceFromModel() {
691
832
  return this.checkMode('threejs') ? this.threeJsService.getTagDistanceFromModel() : null;
@@ -760,6 +901,11 @@ export class ViewerService {
760
901
  position: placement.position,
761
902
  poiType: updatedPoi?.type ?? poi.type,
762
903
  iconUrl: updatedPoi?.tagIcon ? await getSignedFile(updatedPoi.tagIcon) : null,
904
+ normal: placement.normal,
905
+ // As it is stored (see buildThreeJsPoiMetadata): placed in this model, and in its own
906
+ // coordinates while it is not calibrated - so that it shows as the model's own straight away.
907
+ ...(this.currentCaptureID ? { originCaptureID: this.currentCaptureID } : {}),
908
+ ...(this.currentCaptureID && !this.threeJsCalibrated ? { frame: 'model' } : {}),
763
909
  });
764
910
  this.threeJsService.cancelTagPlacement();
765
911
  return updatedPoi;
@@ -774,7 +920,7 @@ export class ViewerService {
774
920
  *
775
921
  * Returns null when there is no pending placement, which is the normal case in Matterport mode.
776
922
  */
777
- async createPoiForThreeJsPlacement(element, poiType) {
923
+ async createPoiForThreeJsPlacement(element, poiType, extra = {}) {
778
924
  if (!this.checkMode('threejs')) {
779
925
  return null;
780
926
  }
@@ -786,6 +932,8 @@ export class ViewerService {
786
932
  // sweep - the floor plan most visibly, which only draws tags whose sweep belongs to it.
787
933
  const matterportSweepID = await this.findNearestSweepForThreeJs(placement.position);
788
934
  const poi = await this.poiService.createPOIForSpaceID({
935
+ // What a form asked for besides the place - the museum's, say - under what the placement says.
936
+ ...extra,
789
937
  coordinate: JSON.stringify(placement.position),
790
938
  type: poiType,
791
939
  elementID: element.id,
@@ -807,6 +955,35 @@ export class ViewerService {
807
955
  get threeJsAlignmentCancelled$() {
808
956
  return this.threeJsService.alignmentCancelled$;
809
957
  }
958
+ /** Emits when the Three.js tags change; see getThreeJsTagSnapshot. */
959
+ get threeJsTagsChanged$() {
960
+ return this.threeJsService.tagsChanged$;
961
+ }
962
+ /** The tags, and their calibration, as a viewer drawing the scene elsewhere needs them. */
963
+ getThreeJsTagSnapshot() {
964
+ return this.threeJsService.getTagSnapshot();
965
+ }
966
+ /** Stops drawing the Three.js scene while another viewer covers it, or starts again. */
967
+ setThreeJsRenderingPaused(paused) {
968
+ this.threeJsService.setRenderingPaused(paused);
969
+ }
970
+ /** Emits when a click during calibration landed on nothing it could use: a tag, or the model. */
971
+ get threeJsAlignmentClickIgnored$() {
972
+ return this.threeJsService.alignmentClickIgnored$;
973
+ }
974
+ /** Emits when Three.js tag placement is armed (true) and when it ends (false). */
975
+ get threeJsPlacementChanged$() {
976
+ return this.threeJsService.placementChanged$;
977
+ }
978
+ /**
979
+ * Completes an armed Three.js tag placement at a spot the splat viewer picked, in the model's own
980
+ * coordinates: the creation form then opens as for a click in the Three.js scene.
981
+ */
982
+ placeThreeJsTagAtModelPoint(point, normal = null) {
983
+ if (this.checkMode('threejs')) {
984
+ this.threeJsService.placeTagAtModelPoint(point, normal);
985
+ }
986
+ }
810
987
  /** Leaves Three.js tag placement mode without placing anything. */
811
988
  cancelThreeJsTagPlacement() {
812
989
  if (this.checkMode('threejs')) {
@@ -957,7 +1134,12 @@ export class ViewerService {
957
1134
  }
958
1135
  }
959
1136
  async initMatterportSdk(spaceID, model3D, tagService, module = SpModule.IMMO) {
960
- this.isLoaded = false;
1137
+ // A Three.js visit is announced as loaded by initThreeJs, and when one visit is swapped for
1138
+ // another that has already happened by the time this runs. Clearing the flag here left the
1139
+ // rest of the page believing no viewer was up - "show in 3D" greyed out on every panel.
1140
+ if (!this.checkMode('threejs')) {
1141
+ this.isLoaded = false;
1142
+ }
961
1143
  this.matterportService.currentSpaceID = spaceID;
962
1144
  if (this.matterportService.sdk) {
963
1145
  await this.clearAll();
@@ -1030,4 +1212,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1030
1212
  type: Inject,
1031
1213
  args: ['config']
1032
1214
  }] }, { type: i1.PoiService }, { type: i2.MatterportService }, { type: i3.ThreeJsService }, { type: i4.SweepLocatorService }] });
1033
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL3ZpZXdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUNyQyw4QkFBOEI7QUFDOUIseUNBQXlDO0FBQ3pDLDJDQUEyQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSy9CLE9BQU8sRUFHTCxrQkFBa0IsRUFDbEIsT0FBTyxFQUtQLFFBQVEsR0FDVCxNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQ2pILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBRXRILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixFQUFrQixNQUFNLG9CQUFvQixDQUFDOzs7Ozs7O0FBTTFILE1BQU0sT0FBTyxhQUFhO0lBOEV1QjtJQUNWO0lBQzNCO0lBQ0E7SUFDQTtJQUNBO0lBbEZGLFVBQVUsR0FBVyxZQUFZLENBQUM7SUFFbkMsY0FBYyxDQUFTO0lBRXRCLE9BQU8sQ0FBUztJQUVqQixVQUFVLEdBS1osSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUVaLFlBQVksR0FBcUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUUvQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRWpCLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFFN0I7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QyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBRTNCLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzNCLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxlQUF5QjtRQUM3QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFFRCwyQkFBMkIsQ0FBQyxZQUFxQjtRQUMvQyxJQUFJLENBQUMsY0FBYyxHQUFHLFlBQVksQ0FBQztJQUNyQyxDQUFDO0lBRUQsMEJBQTBCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO3dHQXpxQ1UsYUFBYSxrQkE4RWQsa0JBQWtCLGFBQ2xCLFFBQVE7NEdBL0VQLGFBQWEsY0FGWixNQUFNOzs0RkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBK0VJLE1BQU07MkJBQUMsa0JBQWtCOzswQkFDekIsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cclxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cclxuLyogZXNsaW50LWRpc2FibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAqL1xyXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTUFUVEVSUE9SVF9TREtfS0VZIH0gZnJvbSAnLi4vdG9rZW5zL21hdHRlcnBvcnQtc2RrLWtleS50b2tlbic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTWF0dGVycG9ydFNlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFRocmVlSnNNZWFzdXJlbWVudCwgVGhyZWVKc1NlcnZpY2UgfSBmcm9tICcuL3RocmVlanMuc2VydmljZSc7XHJcbmltcG9ydCB7IFN3ZWVwTG9jYXRvclNlcnZpY2UgfSBmcm9tICcuL3N3ZWVwLWxvY2F0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VUYWdTZXJ2aWNlIH0gZnJvbSAnLi90YWcuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgRGJPYmplY3RUeXBlLFxyXG4gIFBPSSxcclxuICBWaWV3ZXJJbnRlcmFjdGlvbnMsXHJcbiAgUG9pVHlwZSxcclxuICBDb21tZW50LFxyXG4gIEVxdWlwbWVudCxcclxuICBUaWNrZXQsXHJcbiAgRmVhdHVyZSxcclxuICBTcE1vZHVsZSxcclxufSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9pU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL3BvaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgbWFrZVNlY3VyaXR5Q2FtZXJhLCBzZWN1cml0eUNhbWVyYVR5cGUgfSBmcm9tIFwiLi4vbWF0dGVycG9ydC1leHRlbnNpb25zL3NlY3VyaXR5LWNhbWVyYS9TZWN1cml0eUNhbWVyYVwiO1xyXG5pbXBvcnQgeyBWaWV3RnJ1c3R1bU1lc2hUeXBlLCBtYWtlVmlld0ZydXN0dW1NZXNoIH0gZnJvbSBcIi4uL21hdHRlcnBvcnQtZXh0ZW5zaW9ucy92aWV3LWZydXN0dW0tbWVzaC9WaWV3RnJ1c3R1bU1lc2hcIjtcclxuaW1wb3J0IHsgTmF2aWdhdG9yU2VydmljZSB9IGZyb20gJy4vbmF2aWdhdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBnZXRTaWduZWRGaWxlIH0gZnJvbSAnLi9zMy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZ2V0VGhyZWVKc1BvaU9yaWdpbiwgcGFyc2VUaHJlZUpzUGxhY2VtZW50LCBUSFJFRUpTX01PREVMX1VQX09QVElPTlMsIFRocmVlSnNNb2RlbFVwIH0gZnJvbSAnLi4vaGVscGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWaWV3ZXJTZXJ2aWNlIHtcclxuICBwcml2YXRlIHZpZXdlck1vZGU6IHN0cmluZyA9ICdNYXR0ZXJwb3J0JztcclxuXHJcbiAgcHVibGljIGN1cnJlbnRNb2RlbDNEOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgdG91clVybDogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgdmlld2VySXNPbjogU3ViamVjdDx7XHJcbiAgICBzcGFjZUlEOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgbW9kZWwzRDogc3RyaW5nIHwgbnVsbDtcclxuICAgIHN3ZWVwOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcm90YXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IH0gfCBudWxsO1xyXG4gIH0+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgcHVibGljIGRhdGFJc0xvYWRlZDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHB1YmxpYyBpc0xvYWRlZCA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgc2hvd2luZ1ZpZXdlciA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgc3BhY2UgYmVpbmcgdmlld2VkLCB3aGljaGV2ZXIgdmlld2VyIGlzIHNob3dpbmcgaXQuXHJcbiAgICpcclxuICAgKiBNYXR0ZXJwb3J0U2VydmljZSBjYXJyaWVzIGl0cyBvd24gY29weSwgc2V0IHdoaWxlIGl0cyBTREsgY29ubmVjdHMgLSB3aGljaCBuZXZlciBoYXBwZW5zIGluXHJcbiAgICogVGhyZWUuanMgbW9kZS4gQW55dGhpbmcgdGhhdCByZWFkcyBvbmx5IHRoYXQgb25lIHNpbGVudGx5IGRvZXMgbm90aGluZyBmb3IgYSAzRCBtb2RlbCwgYW5kIHRoZVxyXG4gICAqIGxpc3RzIHRoYXQgZmVlZCB0YWdzIGFyZSBleGFjdGx5IHRoYXQuXHJcbiAgICovXHJcbiAgcHVibGljIGN1cnJlbnRTcGFjZUlEOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIFRocmVlLmpzIGNhcHR1cmUgb24gc2NyZWVuLCBvciBudWxsIGluIE1hdHRlcnBvcnQuXHJcbiAgICpcclxuICAgKiBBIHNwYWNlIGNhbiBob2xkIHNldmVyYWwgM0QgbW9kZWxzLiBBIHRhZyBwbGFjZWQgaW4gb25lIGlzIHJlY29yZGVkIHdpdGggaXQsIHNvIHRoYXQgbW9kZWxcclxuICAgKiBrZWVwcyBzaG93aW5nIHRoZSB0YWcgd2hhdGV2ZXIgc2VsZWN0aW9uIG9mIHRhZ3MgaXQgaXMgb3RoZXJ3aXNlIHJlc3RyaWN0ZWQgdG8uXHJcbiAgICovXHJcbiAgcHVibGljIGN1cnJlbnRDYXB0dXJlSUQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRoZSAzRCBtb2RlbCBvbiBzY3JlZW4gaGFzIGJlZW4gY2FsaWJyYXRlZCBhZ2FpbnN0IHRoZSB0YWdzJyBzaGFyZWQgc3BhY2UuXHJcbiAgICpcclxuICAgKiBDYWxpYnJhdGluZyBpcyB3aGF0IHNheXMgdGhlIG1vZGVsIGFuZCB0aGF0IHNwYWNlIG92ZXJsYXAuIFVudGlsIHRoZW4gYSB0YWcgcGxhY2VkIGluIHRoZSBtb2RlbFxyXG4gICAqIGlzIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlczogaXQgYmVsb25ncyB0byBubyBNYXR0ZXJwb3J0IHN3ZWVwIGFuZCB0byBubyBvdGhlciB2aXNpdC5cclxuICAgKi9cclxuICBwcml2YXRlIHRocmVlSnNDYWxpYnJhdGVkID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBzd2VlcFRvTW92ZTogc3RyaW5nIHwgbnVsbDtcclxuXHJcbiAgcHVibGljIHJvdGF0aW9uVG9Nb3ZlOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB9IHwgbnVsbDtcclxuXHJcbiAgcHVibGljIGdvVG9UcmlnZ2VyZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBwdWJsaWMgdG9vbGJveFN0YXRlcyA9IHtcclxuICAgIGRvbGxob3VzZToge1xyXG4gICAgICBzdGF0OiBmYWxzZSxcclxuICAgICAgaWNvbklkOiAndWktZG9sbGhvdXNlJyxcclxuICAgICAgc2hvdygpIHtcclxuICAgICAgfSxcclxuICAgICAgaGlkZSgpIHtcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBmbG9vcnBsYW46IHtcclxuICAgICAgc3RhdDogZmFsc2UsXHJcbiAgICB9LFxyXG4gICAgbWVzdXJlOiB7XHJcbiAgICAgIHN0YXQ6IGZhbHNlLFxyXG4gICAgICBpY29uSWQ6ICd1aS1tZXN1cmUnLFxyXG4gICAgICBzaG93KCkge1xyXG4gICAgICB9LFxyXG4gICAgICBoaWRlKCkge1xyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIGZpbHRlcjoge1xyXG4gICAgICBzdGF0OiBmYWxzZSxcclxuICAgIH0sXHJcbiAgfTtcclxuICBwcml2YXRlIGlzT2JqZWN0TG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChNQVRURVJQT1JUX1NES19LRVkpIHByaXZhdGUgcmVhZG9ubHkgc2RrS2V5OiBzdHJpbmcsXHJcbiAgICBASW5qZWN0KCdjb25maWcnKSBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogQ29uZmlnLFxyXG4gICAgcHJpdmF0ZSBwb2lTZXJ2aWNlOiBQb2lTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtYXR0ZXJwb3J0U2VydmljZTogTWF0dGVycG9ydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRocmVlSnNTZXJ2aWNlOiBUaHJlZUpzU2VydmljZSxcclxuICAgIHByaXZhdGUgc3dlZXBMb2NhdG9yOiBTd2VlcExvY2F0b3JTZXJ2aWNlLFxyXG4gICkge1xyXG4gICAgdGhpcy5zZXRNb2RlKCdNYXR0ZXJwb3J0Jyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgVXRpbHNcclxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbiAgY2hlY2tNb2RlKGluZGV4TW9kZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy52aWV3ZXJNb2RlID09PSBpbmRleE1vZGU7XHJcbiAgfVxyXG5cclxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICBTZXR0ZXJzXHJcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcblxyXG4gIHNldE1vZGUoaW5kZXhNb2RlOiBzdHJpbmcpIHtcclxuICAgIC8vIExlYXZpbmcgVGhyZWUuanMgbWVhbnMgbm8gVGhyZWUuanMgd29yayBzaG91bGQgc3RpbGwgYmUgcnVubmluZy4gVGhlIHNlcnZpY2UgYmVoaW5kIGl0IGlzIGFcclxuICAgIC8vIHNpbmdsZXRvbiBhbmQgb3V0bGl2ZXMgdGhlIGNvbXBvbmVudCwgc28gYSBkb3dubG9hZCBzdGFydGVkIGZvciBhIG1vZGVsIHRoZSB1c2VyIGhhcyBuYXZpZ2F0ZWRcclxuICAgIC8vIGF3YXkgZnJvbSB3b3VsZCBvdGhlcndpc2UgZmluaXNoIC0gYW5kIGl0cyBwYXJzZSB3b3VsZCBob2xkIHRoZSBtYWluIHRocmVhZCBmb3Igc2Vjb25kcyxcclxuICAgIC8vIHN0YWxsaW5nIHdoYXRldmVyIHZpZXdlciB0aGV5IGFjdHVhbGx5IG9wZW5lZC5cclxuICAgIGlmICh0aGlzLnZpZXdlck1vZGUgPT09ICd0aHJlZWpzJyAmJiBpbmRleE1vZGUgIT09ICd0aHJlZWpzJykge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmRlc3Ryb3koKTtcclxuICAgIH1cclxuICAgIHRoaXMudmlld2VyTW9kZSA9IGluZGV4TW9kZTtcclxuICB9XHJcblxyXG4gIHNldFRvdXJVcmwob3B0aW9uczoge1xyXG4gICAgbW9kZWwzZDogc3RyaW5nLFxyXG4gICAgc2hvd0ljb25QbGFuPzogYm9vbGVhbixcclxuICAgIHNob3dJY29uRG9sbGhvdXNlPzogYm9vbGVhbixcclxuICAgIHNob3dJY29uRmxvb3JzPzogYm9vbGVhbixcclxuICAgIHNob3dRdWlja1N0YXJ0PzogYm9vbGVhbixcclxuICAgIHNob3dGdWxsc2NyZWVuPzogYm9vbGVhbixcclxuICAgIHNob3dHdWlkZWRUb3VyPzogYm9vbGVhbixcclxuICAgIHNob3dIaWdobGlnaHRSZWVsPzogYm9vbGVhbixcclxuICAgIHNob3dEZWZ1cm5pc2g/OiBib29sZWFuLFxyXG4gICAgc2hvd1Jvb21NZWFzdXJlbWVudHM/OiBib29sZWFuXHJcbiAgfSkge1xyXG4gICAgY29uc3Qge1xyXG4gICAgICBtb2RlbDNkLFxyXG4gICAgICBzaG93SWNvblBsYW4gPSB0cnVlLFxyXG4gICAgICBzaG93SWNvbkRvbGxob3VzZSA9IHRydWUsXHJcbiAgICAgIHNob3dJY29uRmxvb3JzID0gdHJ1ZSxcclxuICAgICAgc2hvd1F1aWNrU3RhcnQgPSB0cnVlLFxyXG4gICAgICBzaG93RnVsbHNjcmVlbiA9IHRydWUsXHJcbiAgICAgIHNob3dHdWlkZWRUb3VyID0gdHJ1ZSxcclxuICAgICAgc2hvd0hpZ2hsaWdodFJlZWwgPSB0cnVlLFxyXG4gICAgICBzaG93RGVmdXJuaXNoID0gdHJ1ZSxcclxuICAgICAgc2hvd1Jvb21NZWFzdXJlbWVudHMgPSB0cnVlXHJcbiAgICB9ID0gb3B0aW9ucztcclxuXHJcbiAgICBjb25zdCBiYXNlVXJsID0gYC9hc3NldHMvYnVuZGxlL3Nob3djYXNlLmh0bWxgO1xyXG5cclxuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAvLyBNb2TDqGxlXHJcbiAgICBwYXJhbXMucHVzaChgbT0ke21vZGVsM2R9YCk7XHJcblxyXG4gICAgLy8gQ29tcG9ydGVtZW50IGfDqW7DqXJhbFxyXG4gICAgcGFyYW1zLnB1c2goYHBsYXk9MWApO1xyXG4gICAgcGFyYW1zLnB1c2goYHVpPTFgKTtcclxuICAgIHBhcmFtcy5wdXNoKGB0aXRsZT0wYCk7XHJcbiAgICBwYXJhbXMucHVzaChgbG9nPTBgKTtcclxuICAgIHBhcmFtcy5wdXNoKGBicmFuZD0wYCk7XHJcbiAgICBwYXJhbXMucHVzaChgc2VhcmNoPTBgKTtcclxuICAgIHBhcmFtcy5wdXNoKGBhcHBsaWNhdGlvbktleT0ke3RoaXMuc2RrS2V5fWApO1xyXG4gICAgcGFyYW1zLnB1c2goYG1kcz0wYCk7XHJcblxyXG4gICAgLy8gUXVpY2sgc3RhcnRcclxuICAgIGlmIChzaG93UXVpY2tTdGFydCkge1xyXG4gICAgICBwYXJhbXMucHVzaChgcXM9MWApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZsb29ycGxhbiAocGxhbilcclxuICAgIGlmICghc2hvd0ljb25QbGFuKSB7XHJcbiAgICAgIHBhcmFtcy5wdXNoKGBmcD0wYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRG9sbGhvdXNlIChtYWlzb24vcG91cMOpZSlcclxuICAgIGlmICghc2hvd0ljb25Eb2xsaG91c2UpIHtcclxuICAgICAgcGFyYW1zLnB1c2goYGRoPTBgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTw6lsZWN0ZXVyIGTigJnDqXRhZ2VzXHJcbiAgICBpZiAoIXNob3dJY29uRmxvb3JzKSB7XHJcbiAgICAgIHBhcmFtcy5wdXNoKGBzZj0wYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR3VpZGVkIHRvdXJcclxuICAgIGlmICghc2hvd0d1aWRlZFRvdXIpIHtcclxuICAgICAgcGFyYW1zLnB1c2goYGd0PTBgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIaWdobGlnaHQgcmVlbCAoYmFuZGUgZHUgYmFzKVxyXG4gICAgaWYgKCFzaG93SGlnaGxpZ2h0UmVlbCkge1xyXG4gICAgICAvLyBTZWxvbiB0b24gYnVuZGxlIDogaHI9MSBvdSBocj0wIG1hc3F1ZVxyXG4gICAgICBwYXJhbXMucHVzaChgaHI9MWApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFBsZWluIMOpY3JhblxyXG4gICAgaWYgKCFzaG93RnVsbHNjcmVlbikge1xyXG4gICAgICBwYXJhbXMucHVzaChgZnM9MGApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERlZnVybmlzaFxyXG4gICAgaWYgKHNob3dEZWZ1cm5pc2gpIHtcclxuICAgICAgcGFyYW1zLnB1c2goYGFkPTFgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSb29tIE1lYXN1cmVtZW50c1xyXG4gICAgaWYgKHNob3dSb29tTWVhc3VyZW1lbnRzKSB7XHJcbiAgICAgIHBhcmFtcy5wdXNoKGBtZWFzdXJlbWVudHM9MWApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudG91clVybCA9IGAke2Jhc2VVcmx9PyR7cGFyYW1zLmpvaW4oXCImXCIpfWA7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjbGVhckFsbCgpIHtcclxuICAgIC8vIHRoaXMuc3dlZXBUb01vdmUgPSBudWxsO1xyXG4gICAgLy8gdGhpcy5yb3RhdGlvblRvTW92ZSA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmRlc3Ryb3koKTtcclxuICAgICAgdGhpcy5zaG93aW5nVmlld2VyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgLy8gTWlycm9ycyB0aGUgTWF0dGVycG9ydCBicmFuY2g6IHRoZSBzcGFjZSBpcyBubyBsb25nZXIgb24gc2NyZWVuLCBzbyB3aGF0ZXZlciB3YXMgbG9hZGVkXHJcbiAgICAgIC8vIGZvciBpdCBoYXMgdG8gYmUgZHJvcHBlZCBiZWZvcmUgYW5vdGhlciB2aXNpdCBvcGVucy5cclxuICAgICAgdGhpcy52aWV3ZXJJc09uLm5leHQoe1xyXG4gICAgICAgIHNwYWNlSUQ6IG51bGwsXHJcbiAgICAgICAgbW9kZWwzRDogbnVsbCxcclxuICAgICAgICBzd2VlcDogbnVsbCxcclxuICAgICAgICByb3RhdGlvbjogbnVsbCxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgdGhpcy5zaG93aW5nVmlld2VyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5jbGVhckFsbCgpO1xyXG4gICAgICB0aGlzLnZpZXdlcklzT24ubmV4dCh7XHJcbiAgICAgICAgc3BhY2VJRDogbnVsbCxcclxuICAgICAgICBtb2RlbDNEOiBudWxsLFxyXG4gICAgICAgIHN3ZWVwOiBudWxsLFxyXG4gICAgICAgIHJvdGF0aW9uOiBudWxsLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgIEdldHRlcnNcclxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbiAgZ2V0TW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnZpZXdlck1vZGU7XHJcbiAgfVxyXG5cclxuICBnZXRWaWV3ZXJTZWxlY3RlZFNlcnZpY2UoKSB7XHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICAvLyBpZiAodGhpcy5jaGVja01vZGUoXCJNYXR0ZXJwb3J0XCIpKSB7XHJcbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuZ2V0TWF0dGVycG9ydFNlcnZpY2UoKTtcclxuICAgIC8vIH1cclxuICAgIHJldHVybiB0aGlzLmdldE1hdHRlcnBvcnRTZXJ2aWNlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRUb3VyVXJsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudG91clVybDtcclxuICB9XHJcblxyXG4gIGdldE1hdHRlcnBvcnRTZXJ2aWNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFNlcnZpY2U7XHJcbiAgfVxyXG5cclxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICBHZW5lcmljIE1haW4gYWN0aW9uIGZ1bmN0aW9uc1xyXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIHNldFN3ZWVwVG9Nb3ZlKHN3ZWVwOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc3dlZXBUb01vdmUgPSBzd2VlcDtcclxuICB9XHJcblxyXG4gIHNldFJvdGF0aW9uVG9Nb3ZlKHJvdGF0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB9KSB7XHJcbiAgICB0aGlzLnJvdGF0aW9uVG9Nb3ZlID0gcm90YXRpb247XHJcbiAgfVxyXG5cclxuXHJcbiAgYXN5bmMgYWN0aW9uX21vdmVfdG9fdGFnKGVsZW1lbnRJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElkKTtcclxuICAgICAgaWYgKHJlc3VsdC50YWcpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdvVG9UYWcocmVzdWx0LnRhZyk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlc3VsdC5zd2VlcCkge1xyXG4gICAgICAgIHRoaXMuc3dlZXBUb01vdmUgPSByZXN1bHQuc3dlZXA7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gV2l0aG91dCB0aGlzIHRoZSBjYWxsZXIgZmFsbHMgdGhyb3VnaCB0byBnZXRNb2RlbDNkQW5kU3dlZXAsIHdoaWNoIHJlc29sdmVzIGEgdmlzaXQgZnJvbSB0aGVcclxuICAgIC8vIFBPSSdzIHN3ZWVwIC0gYSBUaHJlZS5qcyBQT0kgaGFzIG5vbmUsIHNvIGl0IGZhaWxzIGFuZCByZXBvcnRzIHRoZSBtb2RlbCBhcyB1bnJlYWNoYWJsZSBldmVuXHJcbiAgICAvLyB0aG91Z2ggdGhlIHRhZyBpcyBvbiBzY3JlZW4uXHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSAmJiB0aGlzLnRocmVlSnNTZXJ2aWNlLmhhc1RhZyhlbGVtZW50SWQpKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuZ29Ub1RhZyhlbGVtZW50SWQpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZHMgTWF0dGVydGFncyB0byBWaWV3ZXJcclxuICAgKiBAcGFyYW0gb2JqZWN0cyBMaXN0IG9mIG9iamVjdHMgKHRpY2tldHMsIGVxdWlwbWVudHMpIGV0YyB0byBiZSBhZGRlZCBhcyBNYXR0ZXJ0YWdzXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkT2JqZWN0VGFnc1RvVmlld2VyKG9iamVjdHM6IERiT2JqZWN0VHlwZVtdKSB7XHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgb2JqZWN0cy5tYXAoYXN5bmMgKG9iamVjdCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBvaSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS5nZXRQb2lCeUVsZW1lbnRJZChvYmplY3QuaWQhKTtcclxuICAgICAgICBpZiAocG9pICYmIHBvaS5jb29yZGluYXRlKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmFjdGlvbkFkZE9iamVjdEZyb21QT0kob2JqZWN0LCBwb2kpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICAvLyBOZXdseSBjcmVhdGVkIHRhZ3MgaGF2ZSBubyBvcGFjaXR5L2FsbG93QWN0aW9uIGFwcGxpZWQgeWV0IChvbmx5IHNldCBieVxyXG4gICAgLy8gdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0LCB3aGljaCBydW5zIG9uIE1vZGUvU3dlZXAvRmxvb3IvUm9vbS9DYW1lcmFcclxuICAgIC8vIGV2ZW50cykuIElmIHRoaXMgYmF0Y2ggbG9hZGVkIGFmdGVyIHRob3NlIGZpcmVkLCB0aGUgdGFncyBzdGF5IGluIHdoYXRldmVyXHJcbiAgICAvLyBkZWZhdWx0IHN0YXRlIHRoZSBTREsgZ2F2ZSB0aGVtIHVudGlsIHNvbWV0aGluZyBlbHNlIG51ZGdlcyBhIHJlZnJlc2guXHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnJlZnJlc2hUYWdzVmlzaWJpbGl0eSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWN0aW9uQWRkT2JqZWN0RnJvbVBPSShvYmplY3Q6IERiT2JqZWN0VHlwZSwgcG9pOiBQT0kpIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmNyZWF0ZU1hdHRlcnRhZ0Zyb21QT0koXHJcbiAgICAgICAgcG9pLnR5cGUhLFxyXG4gICAgICAgIG9iamVjdCxcclxuICAgICAgICBwb2lcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFkZFRocmVlSnNUYWdGcm9tUE9JKG9iamVjdCwgcG9pKTtcclxuICAgIH1cclxuICAgIC8vIEN1cGl4XHJcbiAgICAvLyBUT0RPXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEcmF3cyBhIFBPSSBhcyBhIHRhZyBpbiB0aGUgVGhyZWUuanMgc2NlbmUuXHJcbiAgICpcclxuICAgKiBCb3RoIHZpZXdlcnMgYXJlIGZlZCBieSB0aGUgc2FtZSBzdWJzY3JpcHRpb25zIG9uIHRoZSBzYW1lIFBPSSByZWNvcmRzLCBzbyBhIHRhZyBjcmVhdGVkIGluXHJcbiAgICogZWl0aGVyIG9uZSBzaG93cyB1cCBpbiB0aGUgb3RoZXIgd2l0aG91dCBhbnkgc3luY2luZyBvZiBpdHMgb3duIC0gdGhpcyBpcyBqdXN0IHRoZSBUaHJlZS5qcyBlbmRcclxuICAgKiBvZiB0aGUgcGlwZWxpbmUgdGhhdCBhbHJlYWR5IGRyaXZlcyBNYXR0ZXJwb3J0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYWRkVGhyZWVKc1RhZ0Zyb21QT0kob2JqZWN0OiBEYk9iamVjdFR5cGUsIHBvaTogUE9JKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXBvaS5jb29yZGluYXRlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgICB0cnkge1xyXG4gICAgICBwb3NpdGlvbiA9IEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIGNvbnNvbGUud2FybihgVmlld2VyU2VydmljZTogdW5wYXJzZWFibGUgUE9JIGNvb3JkaW5hdGUgZm9yIGVsZW1lbnQgJHtvYmplY3QuaWR9OmAsIHBvaS5jb29yZGluYXRlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCFbcG9zaXRpb24/LngsIHBvc2l0aW9uPy55LCBwb3NpdGlvbj8uel0uZXZlcnkoKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb3JpZ2luID0gZ2V0VGhyZWVKc1BvaU9yaWdpbihwb2kpO1xyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS51cHNlcnRUYWcoe1xyXG4gICAgICBpZDogb2JqZWN0LmlkLFxyXG4gICAgICBwb3NpdGlvbixcclxuICAgICAgcG9pVHlwZTogcG9pLnR5cGUsXHJcbiAgICAgIGxhYmVsOiBvYmplY3QubmFtZSA/PyBvYmplY3QudGl0bGUgPz8gbnVsbCxcclxuICAgICAgaWNvblVybDogYXdhaXQgdGhpcy5yZXNvbHZlVGFnSWNvblVybChwb2kpLFxyXG4gICAgICBvcmlnaW5DYXB0dXJlSUQ6IG9yaWdpbj8uY2FwdHVyZUlEID8/IG51bGwsXHJcbiAgICAgIGZyYW1lOiBvcmlnaW4/LmZyYW1lID8/IG51bGwsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyB0aGUgdGFncyB0aGUgbGFzdCBjYWxpYnJhdGlvbiBoYWQgdG8gcmV3cml0ZSwgYW5kIHJldHVybnMgaG93IG1hbnkgaXQgY291bGQgbm90LlxyXG4gICAqXHJcbiAgICogQ2FsaWJyYXRpbmcga2VlcHMgdGhlIHRhZ3MgcGxhY2VkIGluIHRoaXMgbW9kZWwgd2hlcmUgdGhleSBhcmUgYnkgY2hhbmdpbmcgdGhlaXIgY29vcmRpbmF0ZXNcclxuICAgKiByYXRoZXIgdGhhbiB0aGVpciBwbGFjZSAoc2VlIFRocmVlSnNTZXJ2aWNlLmFwcGx5QWxpZ25tZW50S2VlcGluZ093blRhZ3MpLiBUaGUgc2NlbmUgYWxyZWFkeVxyXG4gICAqIHNob3dzIHRoZSByZXN1bHQ7IHRoaXMgd3JpdGVzIGl0IGRvd24uIENhbGwgaXQgb25jZSB0aGUgY2FsaWJyYXRpb24gaXRzZWxmIGlzIHN0b3JlZCAtIHdpdGggdGhlXHJcbiAgICogb2xkIGNhbGlicmF0aW9uIHN0aWxsIG9uIHJlY29yZCwgdGhlIG9sZCBjb29yZGluYXRlcyBhcmUgdGhlIG9uZXMgdGhhdCBtYXRjaCBpdC5cclxuICAgKi9cclxuICBhc3luYyBwZXJzaXN0UmViYXNlZFRocmVlSnNUYWdzKCk6IFByb21pc2U8eyBzdG9yZWQ6IG51bWJlcjsgZmFpbGVkOiBudW1iZXIgfT4ge1xyXG4gICAgY29uc3QgcmViYXNlZCA9IHRoaXMudGhyZWVKc1NlcnZpY2UudGFrZVJlYmFzZWRUYWdzKCk7XHJcbiAgICBsZXQgZmFpbGVkID0gMDtcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKHJlYmFzZWQubWFwKGFzeW5jICh0YWcpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwb2kgPSBhd2FpdCB0aGlzLnBvaVNlcnZpY2UuZ2V0UG9pQnlFbGVtZW50SWQodGFnLmlkKTtcclxuICAgICAgICBpZiAoIXBvaT8uaWQpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG1ldGFkYXRhOiBhbnkgPSB7fTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbWV0YWRhdGEgPSAocG9pLm1ldGFkYXRhID8gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpIDoge30pID8/IHt9O1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgbWV0YWRhdGEgPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSW4gdGhlIHNoYXJlZCBzcGFjZSBmcm9tIGhlcmUgb24sIHNvIG5vIGxvbmdlciBtYXJrZWQgYXMgYmVpbmcgaW4gdGhlIG1vZGVsJ3Mgb3duLlxyXG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5mcmFtZTtcclxuICAgICAgICBpZiAobWV0YWRhdGEubm9ybWFsKSB7XHJcbiAgICAgICAgICBtZXRhZGF0YS5ub3JtYWwgPSB0YWcucm90YXRlRGlyZWN0aW9uKG1ldGFkYXRhLm5vcm1hbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYXB0dXJlSUQpIHtcclxuICAgICAgICAgIG1ldGFkYXRhLmNhcHR1cmVJRCA9IHRoaXMuY3VycmVudENhcHR1cmVJRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLnVwZGF0ZVBvaSh7XHJcbiAgICAgICAgICBpZDogcG9pLmlkLFxyXG4gICAgICAgICAgY29vcmRpbmF0ZTogSlNPTi5zdHJpbmdpZnkodGFnLnBvc2l0aW9uKSxcclxuICAgICAgICAgIG1ldGFkYXRhOiBKU09OLnN0cmluZ2lmeShtZXRhZGF0YSksXHJcbiAgICAgICAgICAvLyBJdHMgcGxhY2UgaW4gdGhlIHRvdXIgbWF5IGhhdmUgY2hhbmdlZCB3aXRoIGl0cyBjb29yZGluYXRlcyAtIG9yIGl0IG1heSBoYXZlIG9uZSBmb3JcclxuICAgICAgICAgIC8vIHRoZSBmaXJzdCB0aW1lLCBub3cgdGhhdCB0aGUgbW9kZWwgaXMgY2FsaWJyYXRlZC5cclxuICAgICAgICAgIG1hdHRlcnBvcnRTd2VlcElEOiBhd2FpdCB0aGlzLmZpbmROZWFyZXN0U3dlZXBGb3JUaHJlZUpzKHRhZy5wb3NpdGlvbiksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgZmFpbGVkICs9IDE7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBWaWV3ZXJTZXJ2aWNlOiBjb3VsZCBub3Qgc3RvcmUgdGhlIG5ldyBjb29yZGluYXRlcyBvZiB0YWcgJHt0YWcuaWR9YCwgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgICByZXR1cm4geyBzdG9yZWQ6IHJlYmFzZWQubGVuZ3RoIC0gZmFpbGVkLCBmYWlsZWQgfTtcclxuICB9XHJcblxyXG4gIC8qKiBIb3cgbWFueSB0YWdzIHRoZSBjYWxpYnJhdGlvbiB3YWxrdGhyb3VnaCBjb3VsZCBzdGlsbCB1c2U6IHRoZSBvbmVzIGZyb20gZWxzZXdoZXJlLiAqL1xyXG4gIGdldFRocmVlSnNDYWxpYnJhdGlvbkNhbmRpZGF0ZUNvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSA/IHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0Q2FsaWJyYXRpb25DYW5kaWRhdGVDb3VudCgpIDogMDtcclxuICB9XHJcblxyXG4gIC8qKiBIb3cgbWFueSB0YWdzIGZyb20gZWxzZXdoZXJlIGFyZSBub3Qgb24gdGhlIDNEIG1vZGVsLCBhbmQgc28gYXJlIG5vdCBzaG93biBvbiBpdC4gKi9cclxuICBnZXRUaHJlZUpzT2ZmTW9kZWxUYWdDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykgPyB0aGlzLnRocmVlSnNTZXJ2aWNlLmdldE9mZk1vZGVsVGFnQ291bnQoKSA6IDA7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHRhZ3MgcmVnaXN0ZXJlZCBpbiB0aGUgVGhyZWUuanMgc2NlbmUsIHNob3duIG9yIG5vdC4gKi9cclxuICBnZXRUaHJlZUpzVGFncygpIHtcclxuICAgIHJldHVybiB0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpID8gdGhpcy50aHJlZUpzU2VydmljZS5nZXRUYWdzKCkgOiBbXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBpbWFnZSB0byBkcmF3IGEgdGFnIHdpdGgsIG1pcnJvcmluZyB3aGF0IE1hdHRlcnBvcnQgc2hvd3MgZm9yIHRoZSBzYW1lIFBPSS5cclxuICAgKlxyXG4gICAqIE1hdHRlcnBvcnQgcmVnaXN0ZXJzIG9uZSB0ZXh0dXJlIHBlciB0eXBlIChgaWNvbi10aWNrZXRgLCBgaWNvbi1lcXVpcG1lbnRgLi4uKSBmcm9tIHRoZSBzYW1lXHJcbiAgICogY29uZmlnIGVudHJpZXMgdXNlZCBoZXJlLCBhbmQgb3ZlcnJpZGVzIGl0IHdpdGggdGhlIFBPSSdzIG93biBpY29uIHdoZW4gaXQgaGFzIG9uZS4gUmVhZGluZyB0aGVcclxuICAgKiBzYW1lIHR3byBzb3VyY2VzIGlzIHdoYXQga2VlcHMgYSB0YWcgbG9va2luZyBsaWtlIGl0c2VsZiBhY3Jvc3MgdGhlIHR3byB2aWV3ZXJzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVRhZ0ljb25VcmwocG9pOiBQT0kpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuICAgIGlmIChwb2kudGFnSWNvbikge1xyXG4gICAgICAvLyBTdG9yZWQgYXMgSlNPTiAoeyBzcmMsIG9wYWNpdHkgfSkgYnkgdGhlIE1hdHRlcnBvcnQgcGF0aCwgYnV0IG9sZGVyIHJlY29yZHMgYXJlIGEgYmFyZSBrZXkuXHJcbiAgICAgIGxldCBzb3VyY2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocG9pLnRhZ0ljb24pO1xyXG4gICAgICAgIHNvdXJjZSA9IHR5cGVvZiBwYXJzZWQgPT09ICdzdHJpbmcnID8gcGFyc2VkIDogcGFyc2VkPy5zcmMgPz8gbnVsbDtcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgc291cmNlID0gcG9pLnRhZ0ljb247XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNvdXJjZSkge1xyXG4gICAgICAgIGNvbnN0IHNpZ25lZCA9IGF3YWl0IGdldFNpZ25lZEZpbGUoc291cmNlKTtcclxuICAgICAgICBpZiAoc2lnbmVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gc2lnbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFRhZ0ljb25VcmwocG9pLnR5cGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBjb25maWd1cmVkIGljb24gZm9yIGEgUE9JIHR5cGUsIG9yIG51bGwgd2hlbiB0aGF0IHR5cGUgaGFzIG5vbmUuICovXHJcbiAgcHJpdmF0ZSBkZWZhdWx0VGFnSWNvblVybChwb2lUeXBlOiBQb2lUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgaWNvbnMgPSB0aGlzLmNvbmZpZz8ubXlfY29uZmlnO1xyXG4gICAgaWYgKCFpY29ucykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHN3aXRjaCAocG9pVHlwZSkge1xyXG4gICAgICBjYXNlIFBvaVR5cGUuVElDS0VUOlxyXG4gICAgICAgIHJldHVybiBpY29ucy5pY29uX3RpY2tldCA/PyBudWxsO1xyXG4gICAgICBjYXNlIFBvaVR5cGUuRVFVSVBNRU5UOlxyXG4gICAgICAgIHJldHVybiBpY29ucy5pY29uX2VxdWlwbWVudCA/PyBudWxsO1xyXG4gICAgICBjYXNlIFBvaVR5cGUuTUVBU1VSRTpcclxuICAgICAgICByZXR1cm4gaWNvbnMuaWNvbl9tZWFzdXJlID8/IG51bGw7XHJcbiAgICAgIGNhc2UgUG9pVHlwZS5PQkpFQ1QzRDpcclxuICAgICAgICByZXR1cm4gaWNvbnMuaWNvbl9vYmplY3QzZCA/PyBudWxsO1xyXG4gICAgICBjYXNlIFBvaVR5cGUuREFUQTpcclxuICAgICAgY2FzZSBQb2lUeXBlLkRFU0s6XHJcbiAgICAgICAgcmV0dXJuIGljb25zLmljb25fZGF0YSA/PyBudWxsO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIE1vdmVzIHRoZSBUaHJlZS5qcyBjYW1lcmEgdG8gZnJhbWUgYSB0YWcsIG1pcnJvcmluZyBNYXR0ZXJwb3J0J3MgZ29Ub1RhZy4gKi9cclxuICBnb1RvVGhyZWVKc1RhZyhlbGVtZW50SWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5nb1RvVGFnKGVsZW1lbnRJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogU2hvd3Mgb25seSB0YWdzIG9mIHRoZSBnaXZlbiBQT0kgdHlwZXM7IG51bGwgY2xlYXJzIHRoZSBmaWx0ZXIuICovXHJcbiAgc2V0VmlzaWJsZVRocmVlSnNUYWdUeXBlcyh0eXBlczogUG9pVHlwZVtdIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRWaXNpYmxlVGFnVHlwZXModHlwZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWxpZ25tZW50IHdhbGt0aHJvdWdoOiBwaWNrIGEgdGFnLCB0aGVuIGNsaWNrIHdoZXJlIGl0IHJlYWxseSBzaXRzLCB0aHJlZSB0aW1lcyBvdmVyLlxyXG4gICAqXHJcbiAgICogVXNlcyB0YWdzIHRoYXQgYWxyZWFkeSBleGlzdCwgc28gbm90aGluZyBpcyBjcmVhdGVkIGFuZCBub3RoaW5nIGlzIHdyaXR0ZW4gdW50aWwgdGhlIGNhbGxlclxyXG4gICAqIHNhdmVzIHRoZSByZXN1bHQuIFNlZSB0aHJlZUpzQWxpZ25tZW50UHJvZ3Jlc3MkIGZvciB3aGF0IHRoZSBVSSBzaG91bGQgYmUgYXNraW5nIGZvci5cclxuICAgKi9cclxuICBzdGFydFRocmVlSnNUYWdBbGlnbm1lbnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnN0YXJ0VGFnQWxpZ25tZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5jZWxUaHJlZUpzVGFnQWxpZ25tZW50KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5jYW5jZWxUYWdBbGlnbm1lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB0aHJlZUpzQWxpZ25tZW50UHJvZ3Jlc3MkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UuYWxpZ25tZW50UHJvZ3Jlc3MkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU29sdmVzIHRoZSBhbGlnbm1lbnQgYW5kIGFwcGxpZXMgaXQgdG8gdGhlIHNjZW5lLCByZXR1cm5pbmcgaXQgYXMgdGhlIEpTT04gdG8gc3RvcmUgaW4gdGhlXHJcbiAgICogY2FwdHVyZSdzIG1ldGFkYXRhLiBOdWxsIG1lYW5zIHRoZSB0aHJlZSB0YWdzIHdlcmUgY29sbGluZWFyIGFuZCBub3RoaW5nIHdhcyBhcHBsaWVkLlxyXG4gICAqL1xyXG4gIHNvbHZlVGhyZWVKc1RhZ0FsaWdubWVudChleGlzdGluZ01ldGFkYXRhPzogc3RyaW5nKTogeyBhbGlnbm1lbnQ6IGFueTsgbWV0YWRhdGE6IHN0cmluZyB9IHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhbGlnbm1lbnQgPSB0aGlzLnRocmVlSnNTZXJ2aWNlLnNvbHZlQWxpZ25tZW50RnJvbVBhaXJzKCk7XHJcbiAgICBpZiAoIWFsaWdubWVudCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMudGhyZWVKc0NhbGlicmF0ZWQgPSB0cnVlO1xyXG4gICAgLy8gTWVyZ2VkIGludG8gd2hhdGV2ZXIgdGhlIGNhcHR1cmUgYWxyZWFkeSBzdG9yZXMsIHNvIGFuIGV4aXN0aW5nIGNhbWVyYSBwbGFjZW1lbnQgc3Vydml2ZXMuXHJcbiAgICBsZXQgc3RvcmVkOiBhbnkgPSB7fTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHN0b3JlZCA9IGV4aXN0aW5nTWV0YWRhdGEgPyBKU09OLnBhcnNlKGV4aXN0aW5nTWV0YWRhdGEpIDoge307XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgc3RvcmVkID0ge307XHJcbiAgICB9XHJcbiAgICBzdG9yZWQuYWxpZ25tZW50ID0gYWxpZ25tZW50O1xyXG4gICAgcmV0dXJuIHsgYWxpZ25tZW50LCBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkoc3RvcmVkKSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFNob3dzIG9yIGhpZGVzIGEgc2luZ2xlIFRocmVlLmpzIHRhZy4gKi9cclxuICBzZXRUaHJlZUpzVGFnVmlzaWJpbGl0eShlbGVtZW50SWQ6IHN0cmluZywgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRUYWdWaXNpYmlsaXR5KGVsZW1lbnRJZCwgdmlzaWJsZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBhY3Rpb25fZGVsZXRlX2VsZW1lbnQoZWxlbWVudDogRGJPYmplY3RUeXBlKSB7XHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmRlbGV0ZU1hdHRlcnRhZ0Zvck9iamVjdChlbGVtZW50LmlkKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UucmVtb3ZlVGFnKGVsZW1lbnQuaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEVtaXRzIHdoZW4gYSBUaHJlZS5qcyBtb2RlbCBsb2FkIGFjdHVhbGx5IHN0b3BwZWQgc2hvcnQsIHJhdGhlciB0aGFuIG1lcmVseSBiZWluZyBhc2tlZCB0by4gKi9cclxuICBnZXQgdGhyZWVKc01vZGVsTG9hZENhbmNlbGxlZCQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5tb2RlbExvYWRDYW5jZWxsZWQkO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3BzIHRoZSBUaHJlZS5qcyBtb2RlbCBkb3dubG9hZCBpbiBwcm9ncmVzcy4gKi9cclxuICBjYW5jZWxUaHJlZUpzTW9kZWxMb2FkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5jYW5jZWxNb2RlbExvYWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBFbWl0cyBhIHRhZydzIGxhYmVsIHdoaWxlIHRoZSBwb2ludGVyIGlzIG92ZXIgaXQgaW4gdGhlIFRocmVlLmpzIHNjZW5lLiAqL1xyXG4gIGdldCB0aHJlZUpzVGFnSG92ZXJlZCQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS50YWdIb3ZlcmVkJDtcclxuICB9XHJcblxyXG4gIC8qKiBFbWl0cyB0aGUgZWxlbWVudCBpZCBvZiBhIHRhZyBjbGlja2VkIGluIHRoZSBUaHJlZS5qcyBzY2VuZS4gKi9cclxuICBnZXQgdGhyZWVKc1RhZ0NsaWNrZWQkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UudGFnQ2xpY2tlZCQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBsaWVzIHRoZSB2aXNpdCdzIHN0b3JlZCB0YWcgYWxpZ25tZW50LCBtYXBwaW5nIGNhcHR1cmVkIHRhZyBjb29yZGluYXRlcyBvbnRvIHRoaXMgbW9kZWwuXHJcbiAgICpcclxuICAgKiBTYWZlIHRvIGNhbGwgYmVmb3JlIHRoZSBtb2RlbCBvciBhbnkgdGFnIGV4aXN0czogaXQgaXMgYSB0cmFuc2Zvcm0gb24gdGhlIGdyb3VwIGJvdGggZW5kIHVwXHJcbiAgICogdW5kZXIsIHNvIGl0IGFwcGxpZXMgdG8gd2hhdGV2ZXIgYXJyaXZlcyBsYXRlci5cclxuICAgKi9cclxuICBzZXRUaHJlZUpzVGFnQWxpZ25tZW50RnJvbU1ldGFkYXRhKG1ldGFkYXRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBhbGlnbm1lbnQgPSBwYXJzZVRocmVlSnNQbGFjZW1lbnQobWV0YWRhdGEpPy5hbGlnbm1lbnQgPz8gbnVsbDtcclxuICAgIHRoaXMudGhyZWVKc0NhbGlicmF0ZWQgPSAhIWFsaWdubWVudDtcclxuICAgIC8vIFdoaWNoIHRhZ3Mgd2VyZSBwbGFjZWQgaW4gdGhpcyBtb2RlbCBpcyBkZWNpZGVkIGFnYWluc3QgdGhlIGNhcHR1cmUgb24gc2NyZWVuLlxyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRDdXJyZW50Q2FwdHVyZSh0aGlzLmN1cnJlbnRDYXB0dXJlSUQpO1xyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRUYWdBbGlnbm1lbnQoYWxpZ25tZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuYWJsZSB0YWcgcGxhY2VtZW50IG1lbnUgdG8gYWRkIGEgbmV3IGVsZW1lbnQgZGVwZW5kaW5nIG9uIGl0cyB0eXBlIChUSUNLRVQsIERBVEEsIEVRVUlQTUVOVCBldGMpXHJcbiAgICovXHJcbiAgYXN5bmMgYWN0aW9uQWRkTmV3RWxlbWVudFRvVmlld2VyKHBvaVR5cGU6IFBvaVR5cGUpIHtcclxuICAgIHRoaXMuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcoKTtcclxuXHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykgJiZcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSA9PT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcclxuICAgICkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFkZE1hdHRlcnRhZ1doZW5BZGRpbmcocG9pVHlwZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnN0YXJ0VGFnUGxhY2VtZW50KHBvaVR5cGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTGF1bmNoZXMgdGhlIHJlcG9zaXRpb25pbmcgb2YgYW4gZXhpc3RpbmcgTWF0dGVydGFnIHJlbGF0ZWQgdG8gcGFyYW1ldGVyIG9iamVjdFxyXG4gICAqIEBwYXJhbSBlbGVtZW50IG9iamVjdCAoVElDS0VULCBFUVVJUE1FTlQsIEZFQVRVUkUsIGV0YylcclxuICAgKiBAcGFyYW0gcG9pVHlwZSB0eXBlIG9mIG9iamVjdFxyXG4gICAqL1xyXG4gIGFzeW5jIGFjdGlvblJlcG9zaXRpb25FbGVtZW50SW5WaWV3ZXIoXHJcbiAgICBlbGVtZW50OiBEYk9iamVjdFR5cGUsXHJcbiAgICBwb2lUeXBlOiBQb2lUeXBlXHJcbiAgKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykgJiZcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSA9PT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcclxuICAgICkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFkZE1hdHRlcnRhZ1doZW5SZXBvc2l0aW9uaW5nKHBvaVR5cGUsIGVsZW1lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlIHRpY2tldCBwbGFjZW1lbnQgbWVudSB0byBhZGQgYSBuZXcgdGlja2V0XHJcbiAgICovXHJcbiAgYWN0aW9uX2NhbmNlbGVkKCkge1xyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5jYW5jZWxGb2xsb3dpbmdDdXJzb3IoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuY2FuY2VsVGFnUGxhY2VtZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldygpIHtcclxuICAgIC8vIE1hdHRlcnBvcnRcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFjdGlvblNob3dBbGxGbG9vcnMoKSB7XHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFjdGlvblNob3dBbGxGbG9vcnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFjdGlvbl90b29sYm94X2RvbGxob3VzZSgpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSAhPT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcclxuICAgICkge1xyXG4gICAgICB0aGlzLmFjdGlvbl9jYW5jZWxlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWN0aW9uX3Rvb2xib3hfY2FuY2VsX21lc3VyZSgpO1xyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9kb2xsaG91c2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGFjdGlvbl9mbG9vcnBsYW4oKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0SW50ZXJhY3Rpb25Nb2RlKCkgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5hY3Rpb25fY2FuY2VsZWQoKTtcclxuICAgIH1cclxuICAgIC8vIE1hdHRlcnBvcnRcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfZmxvb3JwbGFuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhY3Rpb25fdG9vbGJveF9tZXN1cmUoKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0SW50ZXJhY3Rpb25Nb2RlKCkgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5hY3Rpb25fY2FuY2VsZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFjdGlvbl90b29sYm94X2luc2lkZV92aWV3KCk7XHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFjdGlvbl90b29sYm94X21lc3VyZSgpO1xyXG4gICAgfVxyXG4gICAgLy8gTWF0dGVycG9ydCdzIFNESyBicmluZ3MgaXRzIG93biBtZWFzdXJpbmcgdG9vbDsgdGhlIFRocmVlLmpzIHZpZXdlciBoYXMgdG8gcHJvdmlkZSBvbmUuXHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnN0YXJ0TWVhc3VyaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhY3Rpb25fdG9vbGJveF9jYW5jZWxfbWVzdXJlKCkge1xyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9jYW5jZWxfbWVzdXJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbE1lYXN1cmluZygpO1xyXG4gICAgICAvLyBUaGUgdG9vbGJhciB0b2dnbGVzIG9uIHRoaXMgZmxhZzsgbGVmdCBvbiwgdGhlIG5leHQgY2xpY2sgd291bGQgc3dpdGNoIG1lYXN1cmluZyBcIm9mZlwiXHJcbiAgICAgIC8vIGluc3RlYWQgb2Ygc3RhcnRpbmcgYSBuZXcgb25lLlxyXG4gICAgICB0aGlzLnRvb2xib3hTdGF0ZXMubWVzdXJlLnN0YXQgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBXaGlsZSBtZWFzdXJpbmcgaW4gdGhlIFRocmVlLmpzIHZpZXdlcjogcG9pbnRzIGFuZCBzZWdtZW50IGxlbmd0aHMgc28gZmFyLCBudWxsIGlmIGFiYW5kb25lZC4gKi9cclxuICBnZXQgdGhyZWVKc01lYXN1cmVtZW50UHJvZ3Jlc3MkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UubWVhc3VyZW1lbnRQcm9ncmVzcyQ7XHJcbiAgfVxyXG5cclxuICAvKiogRW5kcyB0aGUgVGhyZWUuanMgbWVhc3VyZW1lbnQgaW4gcHJvZ3Jlc3MsIG9yIHJldHVybnMgbnVsbCB3aGVuIGl0IGhhcyBmZXdlciB0aGFuIHR3byBwb2ludHMuICovXHJcbiAgZmluaXNoVGhyZWVKc01lYXN1cmVtZW50KCk6IFRocmVlSnNNZWFzdXJlbWVudCB8IG51bGwge1xyXG4gICAgaWYgKCF0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWVhc3VyZW1lbnQgPSB0aGlzLnRocmVlSnNTZXJ2aWNlLmZpbmlzaE1lYXN1cmluZygpO1xyXG4gICAgaWYgKG1lYXN1cmVtZW50KSB7XHJcbiAgICAgIHRoaXMudG9vbGJveFN0YXRlcy5tZXN1cmUuc3RhdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1lYXN1cmVtZW50O1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBtZWFzdXJlbWVudCBsYXN0IGZpbmlzaGVkIGluIHRoZSBUaHJlZS5qcyB2aWV3ZXIsIGZvciB0aGUgZm9ybSB0aGF0IHNhdmVzIGl0LiAqL1xyXG4gIGdldFRocmVlSnNMYXN0TWVhc3VyZW1lbnQoKTogVGhyZWVKc01lYXN1cmVtZW50IHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSA/IHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0TGFzdE1lYXN1cmVtZW50KCkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIE1hdHRlcnBvcnQgc3dlZXAgbmVhcmVzdCB0byBhIHBvaW50IHBpY2tlZCBpbiB0aGUgVGhyZWUuanMgdmlld2VyLCBvciBudWxsLlxyXG4gICAqXHJcbiAgICogRm9yIGNhbGxlcnMgdGhhdCB3cml0ZSB0aGVpciBvd24gUE9JLCBhcyB0aGUgbWVhc3VyZW1lbnQgZm9ybSBkb2VzIC0gYW55dGhpbmcgY3JlYXRlZCB0aHJvdWdoXHJcbiAgICogY3JlYXRlUG9pRm9yVGhyZWVKc1BsYWNlbWVudCBhbHJlYWR5IGdldHMgdGhpcy5cclxuICAgKi9cclxuICBmaW5kTmVhcmVzdFN3ZWVwRm9yVGhyZWVKcyhwb2ludDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuICAgIC8vIEFuIHVuY2FsaWJyYXRlZCBtb2RlbCdzIGNvb3JkaW5hdGVzIGFyZSBpdHMgb3duLiBNZWFzdXJlZCBhZ2FpbnN0IHRoZSBNYXR0ZXJwb3J0IHN3ZWVwcyB0aGV5XHJcbiAgICAvLyBjb3VsZCBsYW5kIG5lYXIgb25lIGJ5IGNvaW5jaWRlbmNlLCBhbmQgdGhlIHRhZyB3b3VsZCB0dXJuIHVwIGluIHRoZSB0b3VyIHNvbWV3aGVyZSBhcmJpdHJhcnkuXHJcbiAgICBpZiAoIXRoaXMudGhyZWVKc0NhbGlicmF0ZWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnN3ZWVwTG9jYXRvci5maW5kTmVhcmVzdFN3ZWVwKHBvaW50LCB0aGlzLmN1cnJlbnRTcGFjZUlEKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtZXRhZGF0YSBhIFBPSSBwbGFjZWQgaW4gdGhlIFRocmVlLmpzIHZpZXdlciBpcyBzdG9yZWQgd2l0aDogd2hpY2ggM0QgbW9kZWwgaXQgd2FzIHBsYWNlZFxyXG4gICAqIGluLCBhbmQgLSB3aGVuIHRoYXQgbW9kZWwgaXMgbm90IGNhbGlicmF0ZWQgLSB0aGF0IGl0cyBjb29yZGluYXRlcyBhcmUgdGhlIG1vZGVsJ3Mgb3duLlxyXG4gICAqL1xyXG4gIGJ1aWxkVGhyZWVKc1BvaU1ldGFkYXRhKGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgLi4uZXh0cmEsXHJcbiAgICAgIC4uLih0aGlzLmN1cnJlbnRDYXB0dXJlSUQgPyB7IGNhcHR1cmVJRDogdGhpcy5jdXJyZW50Q2FwdHVyZUlEIH0gOiB7fSksXHJcbiAgICAgIC4uLih0aGlzLmN1cnJlbnRDYXB0dXJlSUQgJiYgIXRoaXMudGhyZWVKc0NhbGlicmF0ZWQgPyB7IGZyYW1lOiAnbW9kZWwnIH0gOiB7fSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGljaCBvZiB0aGUgM0QgbW9kZWwncyBheGVzIGlzIGJlaW5nIHRyZWF0ZWQgYXMgdXAuICovXHJcbiAgZ2V0VGhyZWVKc01vZGVsVXAoKTogVGhyZWVKc01vZGVsVXAge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0TW9kZWxVcCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHVybnMgdGhlIDNEIG1vZGVsIHRvIHRoZSBuZXh0IGNhbmRpZGF0ZSBmb3IgXCJ3aGljaCBheGlzIGlzIHVwXCIsIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlXHJcbiAgICogbWV0YWRhdGEgd2l0aCB0aGF0IGNob2ljZSB3cml0dGVuIGluLCBmb3IgdGhlIGNhbGxlciB0byBzdG9yZS5cclxuICAgKlxyXG4gICAqIFRoZSB2ZXJ0aWNhbCBheGlzIGlzIHdvcmtlZCBvdXQgZnJvbSB0aGUgZ2VvbWV0cnkgd2hlbiBhIG1vZGVsIGxvYWRzLCBhbmQgdGhhdCBjYW4gYmUgd3Jvbmc6XHJcbiAgICogYSBuYXJyb3cgY29ycmlkb3IgYW5kIGEgbG93IHNsYWIgYXJlIHRoZSBzYW1lIHNoYXBlIHR1cm5lZCBvdmVyLiBUaGlzIGlzIHRoZSB3YXkgdG8gY29ycmVjdCBpdC5cclxuICAgKi9cclxuICBjeWNsZVRocmVlSnNNb2RlbFVwKGV4aXN0aW5nTWV0YWRhdGE6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiB7IHVwOiBUaHJlZUpzTW9kZWxVcDsgbWV0YWRhdGE6IHN0cmluZyB9IHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjdXJyZW50ID0gVEhSRUVKU19NT0RFTF9VUF9PUFRJT05TLmluZGV4T2YodGhpcy50aHJlZUpzU2VydmljZS5nZXRNb2RlbFVwKCkpO1xyXG4gICAgY29uc3QgdXAgPSBUSFJFRUpTX01PREVMX1VQX09QVElPTlNbKGN1cnJlbnQgKyAxKSAlIFRIUkVFSlNfTU9ERUxfVVBfT1BUSU9OUy5sZW5ndGhdO1xyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRNb2RlbFVwKHVwKTtcclxuXHJcbiAgICBsZXQgc3RvcmVkOiBhbnkgPSB7fTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHN0b3JlZCA9IGV4aXN0aW5nTWV0YWRhdGEgPyBKU09OLnBhcnNlKGV4aXN0aW5nTWV0YWRhdGEpIDoge307XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgc3RvcmVkID0ge307XHJcbiAgICB9XHJcbiAgICBzdG9yZWQudXAgPSB1cDtcclxuICAgIHJldHVybiB7IHVwLCBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkoc3RvcmVkKSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIENob29zZXMgdGhlIHRhZyBmb3IgdGhlIGNhbGlicmF0aW9uIHBhaXIgYmVpbmcgbWF0Y2hlZCBieSBpZCwgaW5zdGVhZCBvZiBieSBjbGlja2luZyBpdC4gKi9cclxuICBzZWxlY3RUaHJlZUpzQWxpZ25tZW50VGFnKGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSAmJiB0aGlzLnRocmVlSnNTZXJ2aWNlLnNlbGVjdEFsaWdubWVudFRhZyhlbGVtZW50SWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhvdyBmYXIgdGhlIHZpc2libGUgdGFncyBzaXQgZnJvbSB0aGUgM0QgbW9kZWwsIGluIG1vZGVsIHJhZGlpLiBOdWxsIHdpdGhvdXQgYm90aC4gKi9cclxuICBnZXRUaHJlZUpzVGFnRGlzdGFuY2VGcm9tTW9kZWwoKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSA/IHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0VGFnRGlzdGFuY2VGcm9tTW9kZWwoKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogSG93IG1hbnkgdGFncyB0aGUgVGhyZWUuanMgc2NlbmUgaXMgc2hvd2luZy4gKi9cclxuICBnZXRUaHJlZUpzVGFnQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpID8gdGhpcy50aHJlZUpzU2VydmljZS5nZXRUYWdDb3VudCgpIDogMDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFjdGlvbl91cGRhdGVfcG9pKFxyXG4gICAgcG9pOiBQT0ksXHJcbiAgICBpc1ZhbGlkOiBib29sZWFuLFxyXG4gICAgZWxlbWVudDogRGJPYmplY3RUeXBlXHJcbiAgKTogUHJvbWlzZTxQT0k+IHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIGlmIChpc1ZhbGlkKSB7XHJcbiAgICAgICAgY29uc3QgbGFzdFRhZyA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UubWF0dGVydGFnVG9Gb2xsb3dcclxuICAgICAgICAgID8gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5tYXR0ZXJ0YWdUb0ZvbGxvd1xyXG4gICAgICAgICAgOiB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldExhc3RUYWcoKTtcclxuICAgICAgICBpZiAoIWxhc3RUYWcpIHtcclxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGFnRGF0YSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0TWF0dGVyVGFnRGF0YUZvck1hdHRlcnRhZyhsYXN0VGFnKTtcclxuICAgICAgICBpZiAoIXRhZ0RhdGEpIHtcclxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9pKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBvaU1ldGFkYXRhID0gKCEhcG9pICYmIHBvaS5tZXRhZGF0YSkgPyBKU09OLnBhcnNlKHBvaS5tZXRhZGF0YSkgOiB7fTtcclxuICAgICAgICBwb2lNZXRhZGF0YS5ub3JtYWwgPSB0YWdEYXRhLmdldE5vcm1hbCgpO1xyXG4gICAgICAgIGlmICghcG9pKSB7XHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcG9pSW5wdXQgPSB7XHJcbiAgICAgICAgICBpZDogcG9pLmlkLFxyXG4gICAgICAgICAgY29vcmRpbmF0ZTogdGFnRGF0YS5nZXRDb29yZGluYXRlU3RyaW5nKCksXHJcbiAgICAgICAgICBtYXR0ZXJwb3J0U3dlZXBJRDogdGFnRGF0YS5nZXRTd2VlcElEKCksXHJcbiAgICAgICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkocG9pTWV0YWRhdGEpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgdXBkYXRlZFBvaTogUE9JID0gYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLnVwZGF0ZVBvaShwb2lJbnB1dCk7XHJcbiAgICAgICAgdGFnRGF0YS5zZXRQb2kodXBkYXRlZFBvaSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5zZXRPYmplY3RBbmRQb2lJblRhZyhsYXN0VGFnLCBlbGVtZW50LCBQb2lUeXBlLkRFU0ssIHVwZGF0ZWRQb2kpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuaW5qZWN0SHRtbEluVGFnKFxyXG4gICAgICAgICAgcG9pLnR5cGUhLFxyXG4gICAgICAgICAgZWxlbWVudCxcclxuICAgICAgICAgIGxhc3RUYWdcclxuICAgICAgICApO1xyXG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2V0VGFnSWNvbkFuZE9wYWNpdHkobGFzdFRhZywgdGFnRGF0YSk7XHJcbiAgICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nb1RvVGFnKGxhc3RUYWcpO1xyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVwZGF0ZWRQb2kpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZGVsZXRlTGFzdE1hdHRlcnRhZygpO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvaSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29tbWl0VGhyZWVKc1RhZ1BsYWNlbWVudChwb2ksIGlzVmFsaWQsIGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdyaXRlcyB0aGUgc3BvdCBwaWNrZWQgaW4gdGhlIFRocmVlLmpzIHNjZW5lIGludG8gdGhlIFBPSSwgbWlycm9yaW5nIHRoZSBNYXR0ZXJwb3J0IGJyYW5jaC5cclxuICAgKlxyXG4gICAqIFRoZSBjb29yZGluYXRlIGdvZXMgaW4gdGhlIHNhbWUgZmllbGQgYW5kIHRoZSBzYW1lIHNwYWNlIE1hdHRlcnBvcnQgd3JpdGVzLCB3aGljaCBpcyB3aGF0IG1ha2VzXHJcbiAgICogYSB0YWcgY3JlYXRlZCBoZXJlIHNob3cgdXAgaW4gdGhlIHJpZ2h0IHBsYWNlIHRoZXJlIC0gYW5kIHRoZSBvdGhlciB3YXkgcm91bmQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBjb21taXRUaHJlZUpzVGFnUGxhY2VtZW50KFxyXG4gICAgcG9pOiBQT0ksXHJcbiAgICBpc1ZhbGlkOiBib29sZWFuLFxyXG4gICAgZWxlbWVudDogRGJPYmplY3RUeXBlXHJcbiAgKTogUHJvbWlzZTxQT0k+IHtcclxuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0UGVuZGluZ1RhZ1BsYWNlbWVudCgpO1xyXG4gICAgaWYgKCFpc1ZhbGlkIHx8ICFwbGFjZW1lbnQgfHwgIXBvaSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvaSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcG9pTWV0YWRhdGEgPSBwb2kubWV0YWRhdGEgPyBKU09OLnBhcnNlKHBvaS5tZXRhZGF0YSkgOiB7fTtcclxuICAgIHBvaU1ldGFkYXRhLm5vcm1hbCA9IHBsYWNlbWVudC5ub3JtYWw7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlZFBvaSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS51cGRhdGVQb2koe1xyXG4gICAgICBpZDogcG9pLmlkLFxyXG4gICAgICBjb29yZGluYXRlOiBKU09OLnN0cmluZ2lmeShwbGFjZW1lbnQucG9zaXRpb24pLFxyXG4gICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkocG9pTWV0YWRhdGEpLFxyXG4gICAgICAvLyBtYXR0ZXJwb3J0U3dlZXBJRCBpcyBsZWZ0IGFzIGl0IHdhczogdGhpcyB2aWV3ZXIgaGFzIG5vIHN3ZWVwcywgYW5kIE1hdHRlcnBvcnQgZmlsdGVycyB0YWdcclxuICAgICAgLy8gdmlzaWJpbGl0eSBieSB0aGVtLCBzbyBjbGVhcmluZyBpdCB3b3VsZCBoaWRlIHRoZSB0YWcgb3ZlciB0aGVyZS5cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudGhyZWVKc1NlcnZpY2UudXBzZXJ0VGFnKHtcclxuICAgICAgaWQ6IGVsZW1lbnQuaWQsXHJcbiAgICAgIHBvc2l0aW9uOiBwbGFjZW1lbnQucG9zaXRpb24sXHJcbiAgICAgIHBvaVR5cGU6IHVwZGF0ZWRQb2k/LnR5cGUgPz8gcG9pLnR5cGUsXHJcbiAgICAgIGljb25Vcmw6IHVwZGF0ZWRQb2k/LnRhZ0ljb24gPyBhd2FpdCBnZXRTaWduZWRGaWxlKHVwZGF0ZWRQb2kudGFnSWNvbikgOiBudWxsLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xyXG5cclxuICAgIHJldHVybiB1cGRhdGVkUG9pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyB0aGUgUE9JIGZvciBhbiBlbGVtZW50IGp1c3QgcGxhY2VkIGluIHRoZSBUaHJlZS5qcyBzY2VuZS5cclxuICAgKlxyXG4gICAqIFRoZSBNYXR0ZXJwb3J0IHBhdGggcmVhY2hlcyB0aGUgc2FtZSByZXN1bHQgdGhyb3VnaCBpdHMgdGFnIGRpY3Rpb25hcnkgLSB0aGUgdGFnIGV4aXN0cyBmaXJzdFxyXG4gICAqIGFuZCBjYXJyaWVzIHRoZSBjb29yZGluYXRlcy4gVGhyZWUuanMgaGFzIG5vIHN1Y2ggb2JqZWN0LCBzbyB0aGUgcGxhY2VtZW50IGNhcHR1cmVkIGF0IGNsaWNrXHJcbiAgICogdGltZSBpcyB0aGUgb25seSByZWNvcmQgb2Ygd2hlcmUgdGhlIHVzZXIgcG9pbnRlZCwgYW5kIGl0IGhhcyB0byBiZWNvbWUgYSBQT0kgaGVyZSBvciBpdCBpc1xyXG4gICAqIGxvc3Qgd2hlbiB0aGUgZm9ybSBjbG9zZXMuXHJcbiAgICpcclxuICAgKiBSZXR1cm5zIG51bGwgd2hlbiB0aGVyZSBpcyBubyBwZW5kaW5nIHBsYWNlbWVudCwgd2hpY2ggaXMgdGhlIG5vcm1hbCBjYXNlIGluIE1hdHRlcnBvcnQgbW9kZS5cclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVQb2lGb3JUaHJlZUpzUGxhY2VtZW50KGVsZW1lbnQ6IERiT2JqZWN0VHlwZSwgcG9pVHlwZTogUG9pVHlwZSk6IFByb21pc2U8UE9JIHwgbnVsbD4ge1xyXG4gICAgaWYgKCF0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy50aHJlZUpzU2VydmljZS5nZXRQZW5kaW5nVGFnUGxhY2VtZW50KCk7XHJcbiAgICBpZiAoIXBsYWNlbWVudCB8fCAhZWxlbWVudD8uaWQpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2l0aG91dCBhIHN3ZWVwIHRoZSB0YWcgaXMgbGVmdCBvZmYgZXZlcnl0aGluZyBvbiB0aGUgTWF0dGVycG9ydCBzaWRlIHRoYXQgaXMgb3JnYW5pc2VkIGJ5XHJcbiAgICAvLyBzd2VlcCAtIHRoZSBmbG9vciBwbGFuIG1vc3QgdmlzaWJseSwgd2hpY2ggb25seSBkcmF3cyB0YWdzIHdob3NlIHN3ZWVwIGJlbG9uZ3MgdG8gaXQuXHJcbiAgICBjb25zdCBtYXR0ZXJwb3J0U3dlZXBJRCA9IGF3YWl0IHRoaXMuZmluZE5lYXJlc3RTd2VlcEZvclRocmVlSnMocGxhY2VtZW50LnBvc2l0aW9uKTtcclxuICAgIGNvbnN0IHBvaSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS5jcmVhdGVQT0lGb3JTcGFjZUlEKHtcclxuICAgICAgY29vcmRpbmF0ZTogSlNPTi5zdHJpbmdpZnkocGxhY2VtZW50LnBvc2l0aW9uKSxcclxuICAgICAgdHlwZTogcG9pVHlwZSxcclxuICAgICAgZWxlbWVudElEOiBlbGVtZW50LmlkLFxyXG4gICAgICBtZXRhZGF0YTogdGhpcy5idWlsZFRocmVlSnNQb2lNZXRhZGF0YSh7IG5vcm1hbDogcGxhY2VtZW50Lm5vcm1hbCB9KSxcclxuICAgICAgLi4uKG1hdHRlcnBvcnRTd2VlcElEID8geyBtYXR0ZXJwb3J0U3dlZXBJRCB9IDoge30pLFxyXG4gICAgfSBhcyBQT0kpO1xyXG5cclxuICAgIC8vIERyYXcgaXQgc3RyYWlnaHQgYXdheSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgbmV4dCByZWZyZXNoLCBzbyB0aGUgdXNlciBzZWVzIHdoZXJlIHRoZVxyXG4gICAgLy8gdGhpbmcgdGhleSBqdXN0IGNyZWF0ZWQgZW5kZWQgdXAuIFRocm91Z2ggdGhlIHNhbWUgcGF0aCB0aGUgcmVmcmVzaCB1c2VzLCBzbyBpdCBhcnJpdmVzIHdpdGhcclxuICAgIC8vIHRoZSB0eXBlJ3MgaWNvbiBpbnN0ZWFkIG9mIHRoZSBiYXJlIG1hcmtlciAtIHRoZSBkaWZmZXJlbmNlIHdhcyB2aXNpYmxlIHVudGlsIHRoZSBuZXh0IHJlbG9hZC5cclxuICAgIGF3YWl0IHRoaXMuYWRkVGhyZWVKc1RhZ0Zyb21QT0koZWxlbWVudCwgcG9pKTtcclxuICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuY2FuY2VsVGFnUGxhY2VtZW50KCk7XHJcbiAgICByZXR1cm4gcG9pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEVtaXRzIHdoZW4gYSB0YWcgaXMgZHJvcHBlZCBvbiB0aGUgbW9kZWwgaW4gdGhlIFRocmVlLmpzIHNjZW5lLiAqL1xyXG4gIGdldCB0aHJlZUpzVGFnUGxhY2VkJCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLnRhZ1BsYWNlZCQ7XHJcbiAgfVxyXG5cclxuICAvKiogRW1pdHMgd2hlbiB0aGUgY2FsaWJyYXRpb24gd2Fsa3Rocm91Z2ggaXMgYWJhbmRvbmVkLCBpbmNsdWRpbmcgdmlhIEVzY2FwZS4gKi9cclxuICBnZXQgdGhyZWVKc0FsaWdubWVudENhbmNlbGxlZCQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5hbGlnbm1lbnRDYW5jZWxsZWQkO1xyXG4gIH1cclxuXHJcbiAgLyoqIExlYXZlcyBUaHJlZS5qcyB0YWcgcGxhY2VtZW50IG1vZGUgd2l0aG91dCBwbGFjaW5nIGFueXRoaW5nLiAqL1xyXG4gIGNhbmNlbFRocmVlSnNUYWdQbGFjZW1lbnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZWRpdE9ubHlUYWdTdHlsZUZvclBvaShwb2k6IFBPSSwgb2JqZWN0OiBEYk9iamVjdFR5cGUpIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQocG9pLmVsZW1lbnRJRCk7XHJcbiAgICAgIGlmICh0YWdEYXRhLnRhZykge1xyXG4gICAgICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldE1hdHRlclRhZ0RhdGFGb3JNYXR0ZXJ0YWcoXHJcbiAgICAgICAgICB0YWdEYXRhLnRhZ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3Qob2JqZWN0LCBQb2lUeXBlLlJPT00pO1xyXG4gICAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2V0VGFnSWNvbkFuZE9wYWNpdHkodGFnRGF0YS50YWcsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRJY29uQW5kU2V0Rm9yUG9pKHBvaTogUE9JLCBpY29uUGF0aDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xyXG4gICAgICBpZiAodGFnRGF0YS50YWcpIHtcclxuICAgICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFkZE5ld0ljb25BbmRTZXRGb3JUYWcodGFnRGF0YS50YWcsIGljb25QYXRoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVG9SZWdpc3RyZWRJY29uRm9yUG9pKHBvaTogUE9JLCBpY29uTmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xyXG4gICAgICBpZiAodGFnRGF0YS50YWcpIHtcclxuICAgICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnNldFJlZ2lzdHJlZEljb25Gb3JUYWcodGFnRGF0YS50YWcsIGljb25OYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlSHRtbFRhZ0ZvclBvaVdpdGhPYmplY3QocG9pOiBQT0ksIG9iamVjdDogRGJPYmplY3RUeXBlKSB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xyXG4gICAgICBpZiAodGFnRGF0YS50YWcpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnVwZGF0ZUluamVjdGVkSHRtbEZvclRhZ0lEKFxyXG4gICAgICAgICAgdGFnRGF0YS50YWcsXHJcbiAgICAgICAgICBvYmplY3QsXHJcbiAgICAgICAgICBwb2kudHlwZVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vdmUgYW4gZXhpc3RpbmcgcG9pIGluIE1hdHRlcnBvcnRcclxuICAgKiBAcGFyYW0gcG9pXHJcbiAgICogQHBhcmFtIGVsZW1lbnRcclxuICAgKi9cclxuICBhc3luYyBhY3Rpb25fbW92ZV9wb2lfdmlzdWFsbHkoXHJcbiAgICBwb2k6IFBPSSxcclxuICAgIGVsZW1lbnQ6IFRpY2tldCB8IEZlYXR1cmUgfCBFcXVpcG1lbnQgfCBDb21tZW50XHJcbiAgKSB7XHJcbiAgICBhd2FpdCB0aGlzLmFjdGlvbl9kZWxldGVfZWxlbWVudChlbGVtZW50KTtcclxuICAgIGF3YWl0IHRoaXMuYWN0aW9uQWRkT2JqZWN0RnJvbVBPSShlbGVtZW50LCBwb2kpO1xyXG4gIH1cclxuXHJcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgQ3VwaXhcclxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgTWF0dGVycG9ydFxyXG4gICAgaHR0cHM6Ly9tYXR0ZXJwb3J0LmdpdGh1Yi5pby9zaG93Y2FzZS1zZGsvZG9jcy9zZGsvcmVmZXJlbmNlL2N1cnJlbnQvbW9kdWxlcy9tYXR0ZXJ0YWcuaHRtbCNhZGRcclxuICAgIGh0dHBzOi8vbWF0dGVycG9ydC5naXRodWIuaW8vc2hvd2Nhc2Utc2RrL2RvY3Mvc2RrL3JlZmVyZW5jZS9jdXJyZW50L21vZHVsZXMvbWF0dGVydGFnLmh0bWwjcmVtb3ZlXHJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbiAgaW5pdFRocmVlSnMoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuaW5pdChjYW52YXMpO1xyXG4gICAgLy8gVGhlIHRhZyBwaXBlbGluZSBpcyBnYXRlZCBvbiB0aGlzIGZsYWcsIHdoaWNoIHVudGlsIG5vdyBvbmx5IHRoZSBNYXR0ZXJwb3J0IFNESyBzZXQuIEFcclxuICAgIC8vIFRocmVlLmpzIHZpc2l0IG5ldmVyIHJlYWNoZXMgdGhhdCBjb2RlLCBzbyBldmVyeSB0YWcgd2FzIGRyb3BwZWQgYmVmb3JlIGl0IGNvdWxkIGJlIGRyYXduLlxyXG4gICAgdGhpcy5zaG93aW5nVmlld2VyID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBFdmVyeXRoaW5nIHRoYXQgbG9hZHMgZGF0YSBmb3IgYSBzcGFjZSAtIHRpY2tldHMsIGVxdWlwbWVudHMsIGZlYXR1cmVzLCBtZWFzdXJlbWVudHMgLSBoYW5nc1xyXG4gICAgLy8gb2ZmIHRoaXMgZXZlbnQsIHdoaWNoIE1hdHRlcnBvcnQgcmFpc2VzIG9uY2UgaXRzIFNESyBzdGFydHMgcGxheWluZy4gQSBUaHJlZS5qcyB2aXNpdCBuZXZlclxyXG4gICAgLy8gdG91Y2hlcyB0aGUgU0RLLCBzbyBub3RoaW5nIGV2ZXIgYW5ub3VuY2VkIHRoZSBzcGFjZSBhbmQgZXZlcnkgbGlzdCBjYW1lIGJhY2sgZW1wdHkuXHJcbiAgICBpZiAodGhpcy5jdXJyZW50U3BhY2VJRCkge1xyXG4gICAgICB0aGlzLnZpZXdlcklzT24ubmV4dCh7XHJcbiAgICAgICAgc3BhY2VJRDogdGhpcy5jdXJyZW50U3BhY2VJRCxcclxuICAgICAgICBtb2RlbDNEOiBudWxsLFxyXG4gICAgICAgIHN3ZWVwOiBudWxsLFxyXG4gICAgICAgIHJvdGF0aW9uOiBudWxsLFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5kYXRhSXNMb2FkZWQubmV4dCh0cnVlKTtcclxuICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkcyBhIDNEIG1vZGVsIGludG8gdGhlIFRocmVlLmpzIHNjZW5lIChHTFRGKS5cclxuICAgKiBPbmx5IHdvcmtzIHdoZW4gdGhlIHZpZXdlciBpcyBpbiAndGhyZWVqcycgbW9kZS5cclxuICAgKi9cclxuICBsb2FkR0xURk1vZGVsKHVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UubG9hZEdMVEZNb2RlbCh1cmwsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkcyBhIEdMQiBzdG9yZWQgaW4gUzMsIGdpdmVuIGl0cyBrZXkgKGUuZy4gYHZpc2l0cy88aWQ+L21vZGVsLmdsYmApLlxyXG4gICAqXHJcbiAgICogUmVzb2x2ZXMgdGhlIGtleSB0byBhIHNpZ25lZCBVUkwgZmlyc3QsIHRoZW4gbG9hZHMgaXQgbGlrZSBhbnkgb3RoZXIuIFRoZSBzaWduZWQgVVJMIG9ubHlcclxuICAgKiBjb3ZlcnMgYXV0aGVudGljYXRpb24gLSB0aGUgYnVja2V0IHN0aWxsIG5lZWRzIGEgQ09SUyBydWxlIGFsbG93aW5nIEdFVCBmcm9tIHRoZSBhcHAncyBvcmlnaW4sXHJcbiAgICogb3IgdGhlIGJyb3dzZXIgYmxvY2tzIHRoZSBkb3dubG9hZCBiZWZvcmUgaXQgc3RhcnRzLlxyXG4gICAqXHJcbiAgICogYHBsYWNlbWVudE1ldGFkYXRhYCBpcyB0aGUgY2FwdHVyZSdzIHN0b3JlZCBwbGFjZW1lbnQ7IHdoZW4gYWJzZW50IG9yIHVudXNhYmxlIHRoZSB2aWV3ZXIgZmFsbHNcclxuICAgKiBiYWNrIHRvIGZyYW1pbmcgdGhlIG1vZGVsIGF1dG9tYXRpY2FsbHkuXHJcbiAgICovXHJcbiAgYXN5bmMgbG9hZEdMVEZNb2RlbEZyb21TMyhrZXk6IHN0cmluZywgcGxhY2VtZW50TWV0YWRhdGE/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBBIGtleSB1bmRlciBhc3NldHMvIGlzIHNlcnZlZCBieSB0aGUgYXBwIGl0c2VsZiwgc28gaXQgbmVlZHMgbm8gc2lnbmluZy4gVGhpcyBpcyB3aGF0IGxldHMgYVxyXG4gICAgLy8gbW9kZWwgYnVuZGxlZCB3aXRoIHRoZSBidWlsZCBzdGFuZCBpbiBmb3Igb25lIGluIFMzIHdoaWxlIHRoZSB0d28gYXJlIG90aGVyd2lzZSBpZGVudGljYWwuXHJcbiAgICBjb25zdCBpc0xvY2FsQXNzZXQgPSBrZXkuc3RhcnRzV2l0aCgnYXNzZXRzLycpO1xyXG4gICAgY29uc3QgdXJsID0gaXNMb2NhbEFzc2V0ID8ga2V5IDogYXdhaXQgZ2V0U2lnbmVkRmlsZShrZXkpO1xyXG4gICAgaWYgKCF1cmwpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgVmlld2VyU2VydmljZTogY291bGQgbm90IHJlc29sdmUgYSBzaWduZWQgVVJMIGZvciB0aGUgM0QgbW9kZWwgYXQgXCIke2tleX1cIi5gKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGxhY2VtZW50ID0gcGFyc2VUaHJlZUpzUGxhY2VtZW50KHBsYWNlbWVudE1ldGFkYXRhKTtcclxuICAgIC8vIFRoZSBrZXksIG5vdCB0aGUgc2lnbmVkIFVSTCwgaXMgd2hhdCBpZGVudGlmaWVzIHRoZSBtb2RlbCBhY3Jvc3MgbG9hZHMgLSB0aGUgc2lnbmF0dXJlIG1ha2VzXHJcbiAgICAvLyBldmVyeSBVUkwgdW5pcXVlLCB3aGljaCBpcyBleGFjdGx5IHdoeSB0aGUgYnJvd3NlcidzIG93biBjYWNoZSBuZXZlciBoZWxwcyBoZXJlLlxyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5sb2FkR0xURk1vZGVsKHVybCwgcGxhY2VtZW50Py5jYW1lcmFQb3NpdGlvbiwgcGxhY2VtZW50Py5yb3RhdGlvbiwga2V5LCBwbGFjZW1lbnQ/LnVwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWRzIGEgM0QgbW9kZWwgaW50byB0aGUgVGhyZWUuanMgc2NlbmUgKE9CSikuXHJcbiAgICovXHJcbiAgbG9hZE9iak1vZGVsKG10bFVybDogc3RyaW5nLCBvYmpVcmw6IHN0cmluZywgY2FtZXJhUG9zaXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIHJvdGF0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmxvYWRPYmpNb2RlbChtdGxVcmwsIG9ialVybCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB0aHJlZUpzT2JqZWN0SG92ZXJlZCQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5vYmplY3RIb3ZlcmVkJDtcclxuICB9XHJcblxyXG4gIGdldCB0aHJlZUpzT2JqZWN0Q2xpY2tlZCQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5vYmplY3RDbGlja2VkJDtcclxuICB9XHJcblxyXG4gIC8qKiBFbWl0cyB0cnVlIHdoaWxlIGEgaGVhdnkgLm9iaiBmaWxlIGlzIGJlaW5nIHBhcnNlZCAoaW4gYSB3b3JrZXIsIHdoZW4gYXZhaWxhYmxlKSwgZmFsc2Ugb25jZSBkb25lLiAqL1xyXG4gIGdldCB0aHJlZUpzTW9kZWxMb2FkaW5nJCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLm1vZGVsTG9hZGluZyQ7XHJcbiAgfVxyXG5cclxuICAvKiogRG93bmxvYWQgcHJvZ3Jlc3MgZm9yIEdMQiBtb2RlbHMgYXMgYSAwLTEgZnJhY3Rpb24sIG9yIG51bGwgd2hlbiB0aGUgc2l6ZSBpc24ndCBrbm93biB1cGZyb250LiAqL1xyXG4gIGdldCB0aHJlZUpzTW9kZWxMb2FkUHJvZ3Jlc3MkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UubW9kZWxMb2FkUHJvZ3Jlc3MkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXJzIHRoZSBXZWIgV29ya2VyIHVzZWQgdG8gcGFyc2UgaGVhdnkgLm9iaiBmaWxlcyBvZmYgdGhlIG1haW4gdGhyZWFkLlxyXG4gICAqIE11c3QgYmUgY3JlYXRlZCBieSB0aGUgYXBwIChzZWUgb2JqLXBhcnNlci53b3JrZXIudHMpLCBzaW5jZSB0aGlzIGxpYnJhcnkgY2FuJ3QgYnVuZGxlIHdvcmtlciBmaWxlcy5cclxuICAgKi9cclxuICBzZXRPYmpQYXJzZXJXb3JrZXIod29ya2VyOiBXb3JrZXIpOiB2b2lkIHtcclxuICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc2V0T2JqUGFyc2VyV29ya2VyKHdvcmtlcik7XHJcbiAgfVxyXG5cclxuICBhZGRUaHJlZUpzT2JqZWN0cyhvYmpzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS51cGRhdGVPYmpzVG9TY2VuZShvYmpzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGluaXRNYXR0ZXJwb3J0U2RrKFxyXG4gICAgc3BhY2VJRDogc3RyaW5nLFxyXG4gICAgbW9kZWwzRDogc3RyaW5nLFxyXG4gICAgdGFnU2VydmljZTogQmFzZVRhZ1NlcnZpY2UsXHJcbiAgICBtb2R1bGU6IFNwTW9kdWxlID0gU3BNb2R1bGUuSU1NT1xyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5jdXJyZW50U3BhY2VJRCA9IHNwYWNlSUQ7XHJcbiAgICBpZiAodGhpcy5tYXR0ZXJwb3J0U2VydmljZS5zZGspIHtcclxuICAgICAgYXdhaXQgdGhpcy5jbGVhckFsbCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFNlcnZpY2VcclxuICAgICAgLmluaXRTZGsodGFnU2VydmljZSwgbW9kdWxlKVxyXG4gICAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgY29uc3QgeyBzZGsgfSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2U7XHJcblxyXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICBzZGsuU2NlbmUucmVnaXN0ZXIoc2VjdXJpdHlDYW1lcmFUeXBlLCBtYWtlU2VjdXJpdHlDYW1lcmEuYmluZChzZGsuU2NlbmUpKSxcclxuICAgICAgICAgICAgc2RrLlNjZW5lLnJlZ2lzdGVyKFZpZXdGcnVzdHVtTWVzaFR5cGUsIG1ha2VWaWV3RnJ1c3R1bU1lc2guYmluZChzZGsuU2NlbmUpKVxyXG4gICAgICAgICAgXSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5zaG93aW5nVmlld2VyID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICBzZGsuQXBwLnN0YXRlLnN1YnNjcmliZShcclxuICAgICAgICAgICAgZnVuY3Rpb24gKGFwcFN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnVGhlIGN1cnJlbnQgcGhhc2U6ICcsIGFwcFN0YXRlLnBoYXNlKTtcclxuICAgICAgICAgICAgICBpZiAoYXBwU3RhdGUucGhhc2UgPT09IHNkay5BcHAuUGhhc2UuUExBWUlORykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1RoZSBhcHAgaXMgcGxheWluZycpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93aW5nVmlld2VyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlld2VySXNPbi5uZXh0KHtcclxuICAgICAgICAgICAgICAgICAgc3BhY2VJRCxcclxuICAgICAgICAgICAgICAgICAgbW9kZWwzRCxcclxuICAgICAgICAgICAgICAgICAgc3dlZXA6IHRoaXMuc3dlZXBUb01vdmUsXHJcbiAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uVG9Nb3ZlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFJc0xvYWRlZC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN3ZWVwVG9Nb3ZlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMucm90YXRpb25Ub01vdmUgPSBudWxsO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIHRoaXMudmlld2VySXNPbi5uZXh0KHtcclxuICAgICAgICAgICAgc3BhY2VJRCxcclxuICAgICAgICAgICAgbW9kZWwzRCxcclxuICAgICAgICAgICAgc3dlZXA6IHRoaXMuc3dlZXBUb01vdmUsXHJcbiAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uVG9Nb3ZlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmRhdGFJc0xvYWRlZC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnN3ZWVwVG9Nb3ZlID0gbnVsbDtcclxuICAgICAgICAgIHRoaXMucm90YXRpb25Ub01vdmUgPSBudWxsO1xyXG5cclxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRm9yYmlkZGVuU3dlZXBzKGZvcmJpZGRlblN3ZWVwczogc3RyaW5nW10pIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UucmVtb3ZlRm9yYmlkZGVuU3dlZXBzKGZvcmJpZGRlblN3ZWVwcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRPYmplY3QzRExvYWRlZEluUG9zaXRpb24ob2JqZWN0TG9hZGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzT2JqZWN0TG9hZGVkID0gb2JqZWN0TG9hZGVkO1xyXG4gIH1cclxuXHJcbiAgaXNPYmplY3QzRExvYWRlZEluUG9zaXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc09iamVjdExvYWRlZDtcclxuICB9XHJcbn1cclxuIl19
1215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL3ZpZXdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUNyQyw4QkFBOEI7QUFDOUIseUNBQXlDO0FBQ3pDLDJDQUEyQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSy9CLE9BQU8sRUFHTCxrQkFBa0IsRUFDbEIsT0FBTyxFQUtQLFFBQVEsR0FDVCxNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQ2pILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBRXRILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixFQUFrQixNQUFNLG9CQUFvQixDQUFDOzs7Ozs7O0FBRzFIOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLFlBQVksQ0FBQztBQUV0RDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBQVk7SUFDOUMsT0FBTyw0Q0FBNEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BHLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixD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a0I7OzBCQUN6QixNQUFNOzJCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1hd2FpdC1pbi1sb29wICovXG4vKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1BVFRFUlBPUlRfU0RLX0tFWSB9IGZyb20gJy4uL3Rva2Vucy9tYXR0ZXJwb3J0LXNkay1rZXkudG9rZW4nO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWF0dGVycG9ydFNlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBUaHJlZUpzTWVhc3VyZW1lbnQsIFRocmVlSnNTZXJ2aWNlIH0gZnJvbSAnLi90aHJlZWpzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3dlZXBMb2NhdG9yU2VydmljZSB9IGZyb20gJy4vc3dlZXAtbG9jYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VUYWdTZXJ2aWNlIH0gZnJvbSAnLi90YWcuc2VydmljZSc7XG5pbXBvcnQge1xuICBEYk9iamVjdFR5cGUsXG4gIFBPSSxcbiAgVmlld2VySW50ZXJhY3Rpb25zLFxuICBQb2lUeXBlLFxuICBDb21tZW50LFxuICBFcXVpcG1lbnQsXG4gIFRpY2tldCxcbiAgRmVhdHVyZSxcbiAgU3BNb2R1bGUsXG59IGZyb20gJy4uL3R5cGVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9pU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL3BvaS5zZXJ2aWNlJztcbmltcG9ydCB7IG1ha2VTZWN1cml0eUNhbWVyYSwgc2VjdXJpdHlDYW1lcmFUeXBlIH0gZnJvbSBcIi4uL21hdHRlcnBvcnQtZXh0ZW5zaW9ucy9zZWN1cml0eS1jYW1lcmEvU2VjdXJpdHlDYW1lcmFcIjtcbmltcG9ydCB7IFZpZXdGcnVzdHVtTWVzaFR5cGUsIG1ha2VWaWV3RnJ1c3R1bU1lc2ggfSBmcm9tIFwiLi4vbWF0dGVycG9ydC1leHRlbnNpb25zL3ZpZXctZnJ1c3R1bS1tZXNoL1ZpZXdGcnVzdHVtTWVzaFwiO1xuaW1wb3J0IHsgTmF2aWdhdG9yU2VydmljZSB9IGZyb20gJy4vbmF2aWdhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0U2lnbmVkRmlsZSB9IGZyb20gJy4vczMuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRUaHJlZUpzUG9pT3JpZ2luLCBwYXJzZVRocmVlSnNQbGFjZW1lbnQsIFRIUkVFSlNfTU9ERUxfVVBfT1BUSU9OUywgVGhyZWVKc01vZGVsVXAgfSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcblxuLyoqXG4gKiBXaGF0IGEgR2F1c3NpYW4gc3BsYXQgZmlsZSBpcyBuYW1lZCB3aXRoLCB3aGVuIGl0IGlzIGEgLnBseTogdGhlIGNvbnRlbnQgaXMgd2hhdCB0ZWxscyBpdCBmcm9tXG4gKiBhbm90aGVyIC5wbHksIGFuZCB0aGUga2V5IGlzIGFsbCBhIHZpc2l0IHN0b3JlcyAoc2VlIGlzR2F1c3NpYW5TcGxhdFBseSkuXG4gKi9cbmV4cG9ydCBjb25zdCBHQVVTU0lBTl9TUExBVF9QTFlfU1VGRklYID0gJy5zcGxhdC5wbHknO1xuXG4vKipcbiAqIFdoZXRoZXIgYSAzRCBtb2RlbCBmaWxlIGhvbGRzIEdhdXNzaWFuIHNwbGF0cywgd2hpY2ggdGhlIFRocmVlLmpzIHZpZXdlciBjYW5ub3QgZHJhdzogLnNweixcbiAqIC5zcGxhdCwgLmtzcGxhdCwgU3VwZXJTcGxhdCdzIC5zb2csIGEgLnBseSBuYW1lZCB3aXRoIEdBVVNTSUFOX1NQTEFUX1BMWV9TVUZGSVgsIG9yIHRoZVxuICogbG9kLW1ldGEuanNvbiBvZiBhIFN0cmVhbWVkIFNPRyAtIFN1cGVyU3BsYXQncyBsZXZlbHMgb2YgZGV0YWlsLCBpbiBwaWVjZXMgYmVzaWRlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHYXVzc2lhblNwbGF0RmlsZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXC4oc3B6fHNwbGF0fGtzcGxhdHxzb2d8c3BsYXRcXC5wbHkpKCR8XFw/KS9pLnRlc3QobmFtZSA/PyAnJykgfHwgaXNTdHJlYW1lZFNwbGF0RmlsZShuYW1lKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgLnBseSBob2xkcyBHYXVzc2lhbiBzcGxhdHM6IHdoYXQgc3BsYXQgdG9vbHMgZXhwb3J0IGNhcnJpZXMsIGZvciBlYWNoIHNwbGF0LCBpdHMgY29sb3VyXG4gKiBhcyBzcGhlcmljYWwgaGFybW9uaWNzIChmX2RjXzAuLi4pIGFuZCBpdHMgc2l6ZSAoc2NhbGVfMC4uLikuIE9ubHkgdGhlIGhlYWRlciBpcyByZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNHYXVzc2lhblNwbGF0UGx5KGZpbGU6IEJsb2IpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgc3RhcnQgPSBhd2FpdCBmaWxlLnNsaWNlKDAsIDY0ICogMTAyNCkudGV4dCgpO1xuICBjb25zdCBlbmQgPSBzdGFydC5pbmRleE9mKCdlbmRfaGVhZGVyJyk7XG4gIGlmICghc3RhcnQuc3RhcnRzV2l0aCgncGx5JykgfHwgZW5kIDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcm9wZXJ0aWVzID0gc3RhcnQuc2xpY2UoMCwgZW5kKS5zcGxpdCgvXFxyP1xcbi8pXG4gICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkuc3BsaXQoL1xccysvKSlcbiAgICAuZmlsdGVyKCh3b3JkcykgPT4gd29yZHNbMF0gPT09ICdwcm9wZXJ0eScpXG4gICAgLm1hcCgod29yZHMpID0+IHdvcmRzW3dvcmRzLmxlbmd0aCAtIDFdKTtcbiAgcmV0dXJuIHByb3BlcnRpZXMuaW5jbHVkZXMoJ2ZfZGNfMCcpICYmIHByb3BlcnRpZXMuaW5jbHVkZXMoJ3NjYWxlXzAnKTtcbn1cblxuLyoqIFdoZXRoZXIgYSAzRCBtb2RlbCBmaWxlIGlzIHRoZSBsb2QtbWV0YS5qc29uIG9mIGEgU3RyZWFtZWQgU09HOyBzZWUgaXNHYXVzc2lhblNwbGF0RmlsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmVhbWVkU3BsYXRGaWxlKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gLyhefFxcLylsb2QtbWV0YVxcLmpzb24oJHxcXD8pL2kudGVzdChuYW1lID8/ICcnKTtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFZpZXdlclNlcnZpY2Uge1xuICBwcml2YXRlIHZpZXdlck1vZGU6IHN0cmluZyA9ICdNYXR0ZXJwb3J0JztcblxuICBwdWJsaWMgY3VycmVudE1vZGVsM0Q6IHN0cmluZztcblxuICBwcml2YXRlIHRvdXJVcmw6IHN0cmluZztcblxuICBwdWJsaWMgdmlld2VySXNPbjogU3ViamVjdDx7XG4gICAgc3BhY2VJRDogc3RyaW5nIHwgbnVsbDtcbiAgICBtb2RlbDNEOiBzdHJpbmcgfCBudWxsO1xuICAgIHN3ZWVwOiBzdHJpbmcgfCBudWxsO1xuICAgIHJvdGF0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB9IHwgbnVsbDtcbiAgfT4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHB1YmxpYyBkYXRhSXNMb2FkZWQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHB1YmxpYyBpc0xvYWRlZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyBzaG93aW5nVmlld2VyID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBzcGFjZSBiZWluZyB2aWV3ZWQsIHdoaWNoZXZlciB2aWV3ZXIgaXMgc2hvd2luZyBpdC5cbiAgICpcbiAgICogTWF0dGVycG9ydFNlcnZpY2UgY2FycmllcyBpdHMgb3duIGNvcHksIHNldCB3aGlsZSBpdHMgU0RLIGNvbm5lY3RzIC0gd2hpY2ggbmV2ZXIgaGFwcGVucyBpblxuICAgKiBUaHJlZS5qcyBtb2RlLiBBbnl0aGluZyB0aGF0IHJlYWRzIG9ubHkgdGhhdCBvbmUgc2lsZW50bHkgZG9lcyBub3RoaW5nIGZvciBhIDNEIG1vZGVsLCBhbmQgdGhlXG4gICAqIGxpc3RzIHRoYXQgZmVlZCB0YWdzIGFyZSBleGFjdGx5IHRoYXQuXG4gICAqL1xuICBwdWJsaWMgY3VycmVudFNwYWNlSUQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgVGhyZWUuanMgY2FwdHVyZSBvbiBzY3JlZW4sIG9yIG51bGwgaW4gTWF0dGVycG9ydC5cbiAgICpcbiAgICogQSBzcGFjZSBjYW4gaG9sZCBzZXZlcmFsIDNEIG1vZGVscy4gQSB0YWcgcGxhY2VkIGluIG9uZSBpcyByZWNvcmRlZCB3aXRoIGl0LCBzbyB0aGF0IG1vZGVsXG4gICAqIGtlZXBzIHNob3dpbmcgdGhlIHRhZyB3aGF0ZXZlciBzZWxlY3Rpb24gb2YgdGFncyBpdCBpcyBvdGhlcndpc2UgcmVzdHJpY3RlZCB0by5cbiAgICovXG4gIHB1YmxpYyBjdXJyZW50Q2FwdHVyZUlEOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgM0QgbW9kZWwgb24gc2NyZWVuIGhhcyBiZWVuIGNhbGlicmF0ZWQgYWdhaW5zdCB0aGUgdGFncycgc2hhcmVkIHNwYWNlLlxuICAgKlxuICAgKiBDYWxpYnJhdGluZyBpcyB3aGF0IHNheXMgdGhlIG1vZGVsIGFuZCB0aGF0IHNwYWNlIG92ZXJsYXAuIFVudGlsIHRoZW4gYSB0YWcgcGxhY2VkIGluIHRoZSBtb2RlbFxuICAgKiBpcyBpbiB0aGUgbW9kZWwncyBvd24gY29vcmRpbmF0ZXM6IGl0IGJlbG9uZ3MgdG8gbm8gTWF0dGVycG9ydCBzd2VlcCBhbmQgdG8gbm8gb3RoZXIgdmlzaXQuXG4gICAqL1xuICBwcml2YXRlIHRocmVlSnNDYWxpYnJhdGVkID0gZmFsc2U7XG5cbiAgcHVibGljIHN3ZWVwVG9Nb3ZlOiBzdHJpbmcgfCBudWxsO1xuXG4gIHB1YmxpYyByb3RhdGlvblRvTW92ZTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgfSB8IG51bGw7XG5cbiAgcHVibGljIGdvVG9UcmlnZ2VyZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHB1YmxpYyB0b29sYm94U3RhdGVzID0ge1xuICAgIGRvbGxob3VzZToge1xuICAgICAgc3RhdDogZmFsc2UsXG4gICAgICBpY29uSWQ6ICd1aS1kb2xsaG91c2UnLFxuICAgICAgc2hvdygpIHtcbiAgICAgIH0sXG4gICAgICBoaWRlKCkge1xuICAgICAgfSxcbiAgICB9LFxuICAgIGZsb29ycGxhbjoge1xuICAgICAgc3RhdDogZmFsc2UsXG4gICAgfSxcbiAgICBtZXN1cmU6IHtcbiAgICAgIHN0YXQ6IGZhbHNlLFxuICAgICAgaWNvbklkOiAndWktbWVzdXJlJyxcbiAgICAgIHNob3coKSB7XG4gICAgICB9LFxuICAgICAgaGlkZSgpIHtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBmaWx0ZXI6IHtcbiAgICAgIHN0YXQ6IGZhbHNlLFxuICAgIH0sXG4gIH07XG4gIHByaXZhdGUgaXNPYmplY3RMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE1BVFRFUlBPUlRfU0RLX0tFWSkgcHJpdmF0ZSByZWFkb25seSBzZGtLZXk6IHN0cmluZyxcbiAgICBASW5qZWN0KCdjb25maWcnKSBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogQ29uZmlnLFxuICAgIHByaXZhdGUgcG9pU2VydmljZTogUG9pU2VydmljZSxcbiAgICBwcml2YXRlIG1hdHRlcnBvcnRTZXJ2aWNlOiBNYXR0ZXJwb3J0U2VydmljZSxcbiAgICBwcml2YXRlIHRocmVlSnNTZXJ2aWNlOiBUaHJlZUpzU2VydmljZSxcbiAgICBwcml2YXRlIHN3ZWVwTG9jYXRvcjogU3dlZXBMb2NhdG9yU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5zZXRNb2RlKCdNYXR0ZXJwb3J0Jyk7XG4gIH1cblxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICBVdGlsc1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICBjaGVja01vZGUoaW5kZXhNb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3ZXJNb2RlID09PSBpbmRleE1vZGU7XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgU2V0dGVyc1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICBzZXRNb2RlKGluZGV4TW9kZTogc3RyaW5nKSB7XG4gICAgLy8gTGVhdmluZyBUaHJlZS5qcyBtZWFucyBubyBUaHJlZS5qcyB3b3JrIHNob3VsZCBzdGlsbCBiZSBydW5uaW5nLiBUaGUgc2VydmljZSBiZWhpbmQgaXQgaXMgYVxuICAgIC8vIHNpbmdsZXRvbiBhbmQgb3V0bGl2ZXMgdGhlIGNvbXBvbmVudCwgc28gYSBkb3dubG9hZCBzdGFydGVkIGZvciBhIG1vZGVsIHRoZSB1c2VyIGhhcyBuYXZpZ2F0ZWRcbiAgICAvLyBhd2F5IGZyb20gd291bGQgb3RoZXJ3aXNlIGZpbmlzaCAtIGFuZCBpdHMgcGFyc2Ugd291bGQgaG9sZCB0aGUgbWFpbiB0aHJlYWQgZm9yIHNlY29uZHMsXG4gICAgLy8gc3RhbGxpbmcgd2hhdGV2ZXIgdmlld2VyIHRoZXkgYWN0dWFsbHkgb3BlbmVkLlxuICAgIGlmICh0aGlzLnZpZXdlck1vZGUgPT09ICd0aHJlZWpzJyAmJiBpbmRleE1vZGUgIT09ICd0aHJlZWpzJykge1xuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMudmlld2VyTW9kZSA9IGluZGV4TW9kZTtcbiAgfVxuXG4gIHNldFRvdXJVcmwob3B0aW9uczoge1xuICAgIG1vZGVsM2Q6IHN0cmluZyxcbiAgICBzaG93SWNvblBsYW4/OiBib29sZWFuLFxuICAgIHNob3dJY29uRG9sbGhvdXNlPzogYm9vbGVhbixcbiAgICBzaG93SWNvbkZsb29ycz86IGJvb2xlYW4sXG4gICAgc2hvd1F1aWNrU3RhcnQ/OiBib29sZWFuLFxuICAgIHNob3dGdWxsc2NyZWVuPzogYm9vbGVhbixcbiAgICBzaG93R3VpZGVkVG91cj86IGJvb2xlYW4sXG4gICAgc2hvd0hpZ2hsaWdodFJlZWw/OiBib29sZWFuLFxuICAgIHNob3dEZWZ1cm5pc2g/OiBib29sZWFuLFxuICAgIHNob3dSb29tTWVhc3VyZW1lbnRzPzogYm9vbGVhblxuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgbW9kZWwzZCxcbiAgICAgIHNob3dJY29uUGxhbiA9IHRydWUsXG4gICAgICBzaG93SWNvbkRvbGxob3VzZSA9IHRydWUsXG4gICAgICBzaG93SWNvbkZsb29ycyA9IHRydWUsXG4gICAgICBzaG93UXVpY2tTdGFydCA9IHRydWUsXG4gICAgICBzaG93RnVsbHNjcmVlbiA9IHRydWUsXG4gICAgICBzaG93R3VpZGVkVG91ciA9IHRydWUsXG4gICAgICBzaG93SGlnaGxpZ2h0UmVlbCA9IHRydWUsXG4gICAgICBzaG93RGVmdXJuaXNoID0gdHJ1ZSxcbiAgICAgIHNob3dSb29tTWVhc3VyZW1lbnRzID0gdHJ1ZVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgYmFzZVVybCA9IGAvYXNzZXRzL2J1bmRsZS9zaG93Y2FzZS5odG1sYDtcblxuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIE1vZMOobGVcbiAgICBwYXJhbXMucHVzaChgbT0ke21vZGVsM2R9YCk7XG5cbiAgICAvLyBDb21wb3J0ZW1lbnQgZ8OpbsOpcmFsXG4gICAgcGFyYW1zLnB1c2goYHBsYXk9MWApO1xuICAgIHBhcmFtcy5wdXNoKGB1aT0xYCk7XG4gICAgcGFyYW1zLnB1c2goYHRpdGxlPTBgKTtcbiAgICBwYXJhbXMucHVzaChgbG9nPTBgKTtcbiAgICBwYXJhbXMucHVzaChgYnJhbmQ9MGApO1xuICAgIHBhcmFtcy5wdXNoKGBzZWFyY2g9MGApO1xuICAgIHBhcmFtcy5wdXNoKGBhcHBsaWNhdGlvbktleT0ke3RoaXMuc2RrS2V5fWApO1xuICAgIHBhcmFtcy5wdXNoKGBtZHM9MGApO1xuXG4gICAgLy8gUXVpY2sgc3RhcnRcbiAgICBpZiAoc2hvd1F1aWNrU3RhcnQpIHtcbiAgICAgIHBhcmFtcy5wdXNoKGBxcz0xYCk7XG4gICAgfVxuXG4gICAgLy8gRmxvb3JwbGFuIChwbGFuKVxuICAgIGlmICghc2hvd0ljb25QbGFuKSB7XG4gICAgICBwYXJhbXMucHVzaChgZnA9MGApO1xuICAgIH1cblxuICAgIC8vIERvbGxob3VzZSAobWFpc29uL3BvdXDDqWUpXG4gICAgaWYgKCFzaG93SWNvbkRvbGxob3VzZSkge1xuICAgICAgcGFyYW1zLnB1c2goYGRoPTBgKTtcbiAgICB9XG5cbiAgICAvLyBTw6lsZWN0ZXVyIGTigJnDqXRhZ2VzXG4gICAgaWYgKCFzaG93SWNvbkZsb29ycykge1xuICAgICAgcGFyYW1zLnB1c2goYHNmPTBgKTtcbiAgICB9XG5cbiAgICAvLyBHdWlkZWQgdG91clxuICAgIGlmICghc2hvd0d1aWRlZFRvdXIpIHtcbiAgICAgIHBhcmFtcy5wdXNoKGBndD0wYCk7XG4gICAgfVxuXG4gICAgLy8gSGlnaGxpZ2h0IHJlZWwgKGJhbmRlIGR1IGJhcylcbiAgICBpZiAoIXNob3dIaWdobGlnaHRSZWVsKSB7XG4gICAgICAvLyBTZWxvbiB0b24gYnVuZGxlIDogaHI9MSBvdSBocj0wIG1hc3F1ZVxuICAgICAgcGFyYW1zLnB1c2goYGhyPTFgKTtcbiAgICB9XG5cbiAgICAvLyBQbGVpbiDDqWNyYW5cbiAgICBpZiAoIXNob3dGdWxsc2NyZWVuKSB7XG4gICAgICBwYXJhbXMucHVzaChgZnM9MGApO1xuICAgIH1cblxuICAgIC8vIERlZnVybmlzaFxuICAgIGlmIChzaG93RGVmdXJuaXNoKSB7XG4gICAgICBwYXJhbXMucHVzaChgYWQ9MWApO1xuICAgIH1cblxuICAgIC8vIFJvb20gTWVhc3VyZW1lbnRzXG4gICAgaWYgKHNob3dSb29tTWVhc3VyZW1lbnRzKSB7XG4gICAgICBwYXJhbXMucHVzaChgbWVhc3VyZW1lbnRzPTFgKTtcbiAgICB9XG5cbiAgICB0aGlzLnRvdXJVcmwgPSBgJHtiYXNlVXJsfT8ke3BhcmFtcy5qb2luKFwiJlwiKX1gO1xuICB9XG5cbiAgYXN5bmMgY2xlYXJBbGwoKSB7XG4gICAgLy8gdGhpcy5zd2VlcFRvTW92ZSA9IG51bGw7XG4gICAgLy8gdGhpcy5yb3RhdGlvblRvTW92ZSA9IG51bGw7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuZGVzdHJveSgpO1xuICAgICAgdGhpcy5zaG93aW5nVmlld2VyID0gZmFsc2U7XG4gICAgICB0aGlzLmlzTG9hZGVkID0gZmFsc2U7XG4gICAgICAvLyBNaXJyb3JzIHRoZSBNYXR0ZXJwb3J0IGJyYW5jaDogdGhlIHNwYWNlIGlzIG5vIGxvbmdlciBvbiBzY3JlZW4sIHNvIHdoYXRldmVyIHdhcyBsb2FkZWRcbiAgICAgIC8vIGZvciBpdCBoYXMgdG8gYmUgZHJvcHBlZCBiZWZvcmUgYW5vdGhlciB2aXNpdCBvcGVucy5cbiAgICAgIHRoaXMudmlld2VySXNPbi5uZXh0KHtcbiAgICAgICAgc3BhY2VJRDogbnVsbCxcbiAgICAgICAgbW9kZWwzRDogbnVsbCxcbiAgICAgICAgc3dlZXA6IG51bGwsXG4gICAgICAgIHJvdGF0aW9uOiBudWxsLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICB0aGlzLnNob3dpbmdWaWV3ZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuY2xlYXJBbGwoKTtcbiAgICAgIHRoaXMudmlld2VySXNPbi5uZXh0KHtcbiAgICAgICAgc3BhY2VJRDogbnVsbCxcbiAgICAgICAgbW9kZWwzRDogbnVsbCxcbiAgICAgICAgc3dlZXA6IG51bGwsXG4gICAgICAgIHJvdGF0aW9uOiBudWxsLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgIEdldHRlcnNcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgZ2V0TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3ZXJNb2RlO1xuICB9XG5cbiAgZ2V0Vmlld2VyU2VsZWN0ZWRTZXJ2aWNlKCkge1xuICAgIC8vIE1hdHRlcnBvcnRcbiAgICAvLyBpZiAodGhpcy5jaGVja01vZGUoXCJNYXR0ZXJwb3J0XCIpKSB7XG4gICAgLy8gICAgIHJldHVybiB0aGlzLmdldE1hdHRlcnBvcnRTZXJ2aWNlKCk7XG4gICAgLy8gfVxuICAgIHJldHVybiB0aGlzLmdldE1hdHRlcnBvcnRTZXJ2aWNlKCk7XG4gIH1cblxuICBnZXRUb3VyVXJsKCkge1xuICAgIHJldHVybiB0aGlzLnRvdXJVcmw7XG4gIH1cblxuICBnZXRNYXR0ZXJwb3J0U2VydmljZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0U2VydmljZTtcbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICBHZW5lcmljIE1haW4gYWN0aW9uIGZ1bmN0aW9uc1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbiAgc2V0U3dlZXBUb01vdmUoc3dlZXA6IHN0cmluZykge1xuICAgIHRoaXMuc3dlZXBUb01vdmUgPSBzd2VlcDtcbiAgfVxuXG4gIHNldFJvdGF0aW9uVG9Nb3ZlKHJvdGF0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB9KSB7XG4gICAgdGhpcy5yb3RhdGlvblRvTW92ZSA9IHJvdGF0aW9uO1xuICB9XG5cblxuICBhc3luYyBhY3Rpb25fbW92ZV90b190YWcoZWxlbWVudElkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0VGFnRnJvbUVsZW1lbnRJZChlbGVtZW50SWQpO1xuICAgICAgaWYgKHJlc3VsdC50YWcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nb1RvVGFnKHJlc3VsdC50YWcpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQuc3dlZXApIHtcbiAgICAgICAgdGhpcy5zd2VlcFRvTW92ZSA9IHJlc3VsdC5zd2VlcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gV2l0aG91dCB0aGlzIHRoZSBjYWxsZXIgZmFsbHMgdGhyb3VnaCB0byBnZXRNb2RlbDNkQW5kU3dlZXAsIHdoaWNoIHJlc29sdmVzIGEgdmlzaXQgZnJvbSB0aGVcbiAgICAvLyBQT0kncyBzd2VlcCAtIGEgVGhyZWUuanMgUE9JIGhhcyBub25lLCBzbyBpdCBmYWlscyBhbmQgcmVwb3J0cyB0aGUgbW9kZWwgYXMgdW5yZWFjaGFibGUgZXZlblxuICAgIC8vIHRob3VnaCB0aGUgdGFnIGlzIG9uIHNjcmVlbi5cbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSAmJiB0aGlzLnRocmVlSnNTZXJ2aWNlLmhhc1RhZyhlbGVtZW50SWQpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmdvVG9UYWcoZWxlbWVudElkKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBNYXR0ZXJ0YWdzIHRvIFZpZXdlclxuICAgKiBAcGFyYW0gb2JqZWN0cyBMaXN0IG9mIG9iamVjdHMgKHRpY2tldHMsIGVxdWlwbWVudHMpIGV0YyB0byBiZSBhZGRlZCBhcyBNYXR0ZXJ0YWdzXG4gICAqL1xuICBhc3luYyBhZGRPYmplY3RUYWdzVG9WaWV3ZXIob2JqZWN0czogRGJPYmplY3RUeXBlW10pIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG9iamVjdHMubWFwKGFzeW5jIChvYmplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcG9pID0gYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLmdldFBvaUJ5RWxlbWVudElkKG9iamVjdC5pZCEpO1xuICAgICAgICBpZiAocG9pICYmIHBvaS5jb29yZGluYXRlKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hY3Rpb25BZGRPYmplY3RGcm9tUE9JKG9iamVjdCwgcG9pKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIC8vIE5ld2x5IGNyZWF0ZWQgdGFncyBoYXZlIG5vIG9wYWNpdHkvYWxsb3dBY3Rpb24gYXBwbGllZCB5ZXQgKG9ubHkgc2V0IGJ5XG4gICAgLy8gdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0LCB3aGljaCBydW5zIG9uIE1vZGUvU3dlZXAvRmxvb3IvUm9vbS9DYW1lcmFcbiAgICAvLyBldmVudHMpLiBJZiB0aGlzIGJhdGNoIGxvYWRlZCBhZnRlciB0aG9zZSBmaXJlZCwgdGhlIHRhZ3Mgc3RheSBpbiB3aGF0ZXZlclxuICAgIC8vIGRlZmF1bHQgc3RhdGUgdGhlIFNESyBnYXZlIHRoZW0gdW50aWwgc29tZXRoaW5nIGVsc2UgbnVkZ2VzIGEgcmVmcmVzaC5cbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5yZWZyZXNoVGFnc1Zpc2liaWxpdHkoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhY3Rpb25BZGRPYmplY3RGcm9tUE9JKG9iamVjdDogRGJPYmplY3RUeXBlLCBwb2k6IFBPSSkge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5jcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxuICAgICAgICBwb2kudHlwZSEsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcG9pXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYWRkVGhyZWVKc1RhZ0Zyb21QT0kob2JqZWN0LCBwb2kpO1xuICAgIH1cbiAgICAvLyBDdXBpeFxuICAgIC8vIFRPRE9cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgYSBQT0kgYXMgYSB0YWcgaW4gdGhlIFRocmVlLmpzIHNjZW5lLlxuICAgKlxuICAgKiBCb3RoIHZpZXdlcnMgYXJlIGZlZCBieSB0aGUgc2FtZSBzdWJzY3JpcHRpb25zIG9uIHRoZSBzYW1lIFBPSSByZWNvcmRzLCBzbyBhIHRhZyBjcmVhdGVkIGluXG4gICAqIGVpdGhlciBvbmUgc2hvd3MgdXAgaW4gdGhlIG90aGVyIHdpdGhvdXQgYW55IHN5bmNpbmcgb2YgaXRzIG93biAtIHRoaXMgaXMganVzdCB0aGUgVGhyZWUuanMgZW5kXG4gICAqIG9mIHRoZSBwaXBlbGluZSB0aGF0IGFscmVhZHkgZHJpdmVzIE1hdHRlcnBvcnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFkZFRocmVlSnNUYWdGcm9tUE9JKG9iamVjdDogRGJPYmplY3RUeXBlLCBwb2k6IFBPSSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghcG9pLmNvb3JkaW5hdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcbiAgICB0cnkge1xuICAgICAgcG9zaXRpb24gPSBKU09OLnBhcnNlKHBvaS5jb29yZGluYXRlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnNvbGUud2FybihgVmlld2VyU2VydmljZTogdW5wYXJzZWFibGUgUE9JIGNvb3JkaW5hdGUgZm9yIGVsZW1lbnQgJHtvYmplY3QuaWR9OmAsIHBvaS5jb29yZGluYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFbcG9zaXRpb24/LngsIHBvc2l0aW9uPy55LCBwb3NpdGlvbj8uel0uZXZlcnkoKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgdGFnIGlzIGl0cyBwb3NpdGlvbjsgdGhlIGljb24gaXMgaG93IGl0IGlzIGRyZXNzZWQuIE9uZSB0aGF0IGNhbm5vdCBiZSBmZXRjaGVkIC0gYVxuICAgIC8vIHNpZ25hdHVyZSB0aGF0IGV4cGlyZWQsIGEgZmlsZSBnb25lIGZyb20gdGhlIGJ1Y2tldCAtIG11c3Qgbm90IGNvc3QgdGhlIHRhZyBpdHNlbGYuXG4gICAgbGV0IGljb25Vcmw6IHN0cmluZyB8IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGljb25VcmwgPSBhd2FpdCB0aGlzLnJlc29sdmVUYWdJY29uVXJsKHBvaSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgVmlld2VyU2VydmljZTogbm8gaWNvbiBmb3IgdGhlIHRhZyBvZiBlbGVtZW50ICR7b2JqZWN0LmlkfSwgdXNpbmcgdGhlIGRlZmF1bHQgb25lLmAsIGVycm9yKTtcbiAgICAgIGljb25VcmwgPSB0aGlzLmRlZmF1bHRUYWdJY29uVXJsKHBvaS50eXBlKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW4gPSBnZXRUaHJlZUpzUG9pT3JpZ2luKHBvaSk7XG4gICAgLy8gTWF0dGVycG9ydCdzIHN0ZW0sIGtlcHQgd2l0aCB0aGUgUE9JIGJ5IGJvdGggdmlld2VycyB0aGF0IHBsYWNlIHRhZ3MuXG4gICAgbGV0IG5vcm1hbDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gcG9pLm1ldGFkYXRhID8gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpPy5ub3JtYWwgOiBudWxsO1xuICAgICAgbm9ybWFsID0gW3N0b3JlZD8ueCwgc3RvcmVkPy55LCBzdG9yZWQ/LnpdLmV2ZXJ5KCh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgPyBzdG9yZWQgOiBudWxsO1xuICAgIH0gY2F0Y2gge1xuICAgICAgbm9ybWFsID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy50aHJlZUpzU2VydmljZS51cHNlcnRUYWcoe1xuICAgICAgaWQ6IG9iamVjdC5pZCxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgcG9pVHlwZTogcG9pLnR5cGUsXG4gICAgICBsYWJlbDogb2JqZWN0Lm5hbWUgPz8gb2JqZWN0LnRpdGxlID8/IG51bGwsXG4gICAgICBpY29uVXJsLFxuICAgICAgb3JpZ2luQ2FwdHVyZUlEOiBvcmlnaW4/LmNhcHR1cmVJRCA/PyBudWxsLFxuICAgICAgZnJhbWU6IG9yaWdpbj8uZnJhbWUgPz8gbnVsbCxcbiAgICAgIG5vcm1hbCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZXMgdGhlIHRhZ3MgdGhlIGxhc3QgY2FsaWJyYXRpb24gaGFkIHRvIHJld3JpdGUsIGFuZCByZXR1cm5zIGhvdyBtYW55IGl0IGNvdWxkIG5vdC5cbiAgICpcbiAgICogQ2FsaWJyYXRpbmcga2VlcHMgdGhlIHRhZ3MgcGxhY2VkIGluIHRoaXMgbW9kZWwgd2hlcmUgdGhleSBhcmUgYnkgY2hhbmdpbmcgdGhlaXIgY29vcmRpbmF0ZXNcbiAgICogcmF0aGVyIHRoYW4gdGhlaXIgcGxhY2UgKHNlZSBUaHJlZUpzU2VydmljZS5hcHBseUFsaWdubWVudEtlZXBpbmdPd25UYWdzKS4gVGhlIHNjZW5lIGFscmVhZHlcbiAgICogc2hvd3MgdGhlIHJlc3VsdDsgdGhpcyB3cml0ZXMgaXQgZG93bi4gQ2FsbCBpdCBvbmNlIHRoZSBjYWxpYnJhdGlvbiBpdHNlbGYgaXMgc3RvcmVkIC0gd2l0aCB0aGVcbiAgICogb2xkIGNhbGlicmF0aW9uIHN0aWxsIG9uIHJlY29yZCwgdGhlIG9sZCBjb29yZGluYXRlcyBhcmUgdGhlIG9uZXMgdGhhdCBtYXRjaCBpdC5cbiAgICovXG4gIGFzeW5jIHBlcnNpc3RSZWJhc2VkVGhyZWVKc1RhZ3MoKTogUHJvbWlzZTx7IHN0b3JlZDogbnVtYmVyOyBmYWlsZWQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgcmViYXNlZCA9IHRoaXMudGhyZWVKc1NlcnZpY2UudGFrZVJlYmFzZWRUYWdzKCk7XG4gICAgbGV0IGZhaWxlZCA9IDA7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocmViYXNlZC5tYXAoYXN5bmMgKHRhZykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcG9pID0gYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLmdldFBvaUJ5RWxlbWVudElkKHRhZy5pZCk7XG4gICAgICAgIGlmICghcG9pPy5pZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWV0YWRhdGE6IGFueSA9IHt9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1ldGFkYXRhID0gKHBvaS5tZXRhZGF0YSA/IEpTT04ucGFyc2UocG9pLm1ldGFkYXRhKSA6IHt9KSA/PyB7fTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgbWV0YWRhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbiB0aGUgc2hhcmVkIHNwYWNlIGZyb20gaGVyZSBvbiwgc28gbm8gbG9uZ2VyIG1hcmtlZCBhcyBiZWluZyBpbiB0aGUgbW9kZWwncyBvd24uXG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5mcmFtZTtcbiAgICAgICAgaWYgKG1ldGFkYXRhLm5vcm1hbCkge1xuICAgICAgICAgIG1ldGFkYXRhLm5vcm1hbCA9IHRhZy5yb3RhdGVEaXJlY3Rpb24obWV0YWRhdGEubm9ybWFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2FwdHVyZUlEKSB7XG4gICAgICAgICAgbWV0YWRhdGEuY2FwdHVyZUlEID0gdGhpcy5jdXJyZW50Q2FwdHVyZUlEO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucG9pU2VydmljZS51cGRhdGVQb2koe1xuICAgICAgICAgIGlkOiBwb2kuaWQsXG4gICAgICAgICAgY29vcmRpbmF0ZTogSlNPTi5zdHJpbmdpZnkodGFnLnBvc2l0aW9uKSxcbiAgICAgICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpLFxuICAgICAgICAgIC8vIEl0cyBwbGFjZSBpbiB0aGUgdG91ciBtYXkgaGF2ZSBjaGFuZ2VkIHdpdGggaXRzIGNvb3JkaW5hdGVzIC0gb3IgaXQgbWF5IGhhdmUgb25lIGZvclxuICAgICAgICAgIC8vIHRoZSBmaXJzdCB0aW1lLCBub3cgdGhhdCB0aGUgbW9kZWwgaXMgY2FsaWJyYXRlZC5cbiAgICAgICAgICBtYXR0ZXJwb3J0U3dlZXBJRDogYXdhaXQgdGhpcy5maW5kTmVhcmVzdFN3ZWVwRm9yVGhyZWVKcyh0YWcucG9zaXRpb24pLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGZhaWxlZCArPSAxO1xuICAgICAgICBjb25zb2xlLndhcm4oYFZpZXdlclNlcnZpY2U6IGNvdWxkIG5vdCBzdG9yZSB0aGUgbmV3IGNvb3JkaW5hdGVzIG9mIHRhZyAke3RhZy5pZH1gLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSkpO1xuICAgIHJldHVybiB7IHN0b3JlZDogcmViYXNlZC5sZW5ndGggLSBmYWlsZWQsIGZhaWxlZCB9O1xuICB9XG5cbiAgLyoqIEhvdyBtYW55IHRhZ3MgdGhlIGNhbGlicmF0aW9uIHdhbGt0aHJvdWdoIGNvdWxkIHN0aWxsIHVzZTogdGhlIG9uZXMgZnJvbSBlbHNld2hlcmUuICovXG4gIGdldFRocmVlSnNDYWxpYnJhdGlvbkNhbmRpZGF0ZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykgPyB0aGlzLnRocmVlSnNTZXJ2aWNlLmdldENhbGlicmF0aW9uQ2FuZGlkYXRlQ291bnQoKSA6IDA7XG4gIH1cblxuICAvKiogSG93IG1hbnkgdGFncyBmcm9tIGVsc2V3aGVyZSBhcmUgbm90IG9uIHRoZSAzRCBtb2RlbCwgYW5kIHNvIGFyZSBub3Qgc2hvd24gb24gaXQuICovXG4gIGdldFRocmVlSnNPZmZNb2RlbFRhZ0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykgPyB0aGlzLnRocmVlSnNTZXJ2aWNlLmdldE9mZk1vZGVsVGFnQ291bnQoKSA6IDA7XG4gIH1cblxuICAvKiogVGhlIHRhZ3MgcmVnaXN0ZXJlZCBpbiB0aGUgVGhyZWUuanMgc2NlbmUsIHNob3duIG9yIG5vdC4gKi9cbiAgZ2V0VGhyZWVKc1RhZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykgPyB0aGlzLnRocmVlSnNTZXJ2aWNlLmdldFRhZ3MoKSA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSB0byBkcmF3IGEgdGFnIHdpdGgsIG1pcnJvcmluZyB3aGF0IE1hdHRlcnBvcnQgc2hvd3MgZm9yIHRoZSBzYW1lIFBPSS5cbiAgICpcbiAgICogTWF0dGVycG9ydCByZWdpc3RlcnMgb25lIHRleHR1cmUgcGVyIHR5cGUgKGBpY29uLXRpY2tldGAsIGBpY29uLWVxdWlwbWVudGAuLi4pIGZyb20gdGhlIHNhbWVcbiAgICogY29uZmlnIGVudHJpZXMgdXNlZCBoZXJlLCBhbmQgb3ZlcnJpZGVzIGl0IHdpdGggdGhlIFBPSSdzIG93biBpY29uIHdoZW4gaXQgaGFzIG9uZS4gUmVhZGluZyB0aGVcbiAgICogc2FtZSB0d28gc291cmNlcyBpcyB3aGF0IGtlZXBzIGEgdGFnIGxvb2tpbmcgbGlrZSBpdHNlbGYgYWNyb3NzIHRoZSB0d28gdmlld2Vycy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVRhZ0ljb25VcmwocG9pOiBQT0kpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBpZiAocG9pLnRhZ0ljb24pIHtcbiAgICAgIC8vIFN0b3JlZCBhcyBKU09OICh7IHNyYywgb3BhY2l0eSB9KSBieSB0aGUgTWF0dGVycG9ydCBwYXRoLCBidXQgb2xkZXIgcmVjb3JkcyBhcmUgYSBiYXJlIGtleS5cbiAgICAgIGxldCBzb3VyY2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShwb2kudGFnSWNvbik7XG4gICAgICAgIHNvdXJjZSA9IHR5cGVvZiBwYXJzZWQgPT09ICdzdHJpbmcnID8gcGFyc2VkIDogcGFyc2VkPy5zcmMgPz8gbnVsbDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBzb3VyY2UgPSBwb2kudGFnSWNvbjtcbiAgICAgIH1cbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgY29uc3Qgc2lnbmVkID0gYXdhaXQgZ2V0U2lnbmVkRmlsZShzb3VyY2UpO1xuICAgICAgICBpZiAoc2lnbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHNpZ25lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0VGFnSWNvblVybChwb2kudHlwZSk7XG4gIH1cblxuICAvKiogVGhlIGNvbmZpZ3VyZWQgaWNvbiBmb3IgYSBQT0kgdHlwZSwgb3IgbnVsbCB3aGVuIHRoYXQgdHlwZSBoYXMgbm9uZS4gKi9cbiAgcHJpdmF0ZSBkZWZhdWx0VGFnSWNvblVybChwb2lUeXBlOiBQb2lUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGljb25zID0gdGhpcy5jb25maWc/Lm15X2NvbmZpZztcbiAgICBpZiAoIWljb25zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc3dpdGNoIChwb2lUeXBlKSB7XG4gICAgICBjYXNlIFBvaVR5cGUuVElDS0VUOlxuICAgICAgICByZXR1cm4gaWNvbnMuaWNvbl90aWNrZXQgPz8gbnVsbDtcbiAgICAgIGNhc2UgUG9pVHlwZS5FUVVJUE1FTlQ6XG4gICAgICAgIHJldHVybiBpY29ucy5pY29uX2VxdWlwbWVudCA/PyBudWxsO1xuICAgICAgY2FzZSBQb2lUeXBlLk1FQVNVUkU6XG4gICAgICAgIHJldHVybiBpY29ucy5pY29uX21lYXN1cmUgPz8gbnVsbDtcbiAgICAgIGNhc2UgUG9pVHlwZS5PQkpFQ1QzRDpcbiAgICAgICAgcmV0dXJuIGljb25zLmljb25fb2JqZWN0M2QgPz8gbnVsbDtcbiAgICAgIGNhc2UgUG9pVHlwZS5EQVRBOlxuICAgICAgY2FzZSBQb2lUeXBlLkRFU0s6XG4gICAgICAgIHJldHVybiBpY29ucy5pY29uX2RhdGEgPz8gbnVsbDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBNb3ZlcyB0aGUgVGhyZWUuanMgY2FtZXJhIHRvIGZyYW1lIGEgdGFnLCBtaXJyb3JpbmcgTWF0dGVycG9ydCdzIGdvVG9UYWcuICovXG4gIGdvVG9UaHJlZUpzVGFnKGVsZW1lbnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuZ29Ub1RhZyhlbGVtZW50SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgdGFnIHRoZSBUaHJlZS5qcyBjYW1lcmEgaXMgc2VudCB0bywgZm9yIHRoZSBzcGxhdCB2aWV3ZXIgdG8gcG9pbnQgb3V0OyBzZWUgZ29Ub1RocmVlSnNUYWcuICovXG4gIGdldCB0aHJlZUpzVGFnRm9jdXNlZCQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UudGFnRm9jdXNlZCQ7XG4gIH1cblxuICAvKiogQSB0YWcgY2xpY2tlZCBpbiB0aGUgc3BsYXQgdmlld2VyLCBzYWlkIGFzIHRocmVlSnNUYWdDbGlja2VkJCBzYXlzIG9uZSBjbGlja2VkIGluIHRoZSBzY2VuZS4gKi9cbiAgY2xpY2tUaHJlZUpzVGFnKGVsZW1lbnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuY2xpY2tUYWcoZWxlbWVudElkKTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgdmlzaXQncyAzRCBtb2RlbCBoYXMgYSBjYWxpYnJhdGlvbiwgZnJvbSBpdHMgY2FwdHVyZSdzIG1ldGFkYXRhLiAqL1xuICBpc1RocmVlSnNDYWxpYnJhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNDYWxpYnJhdGVkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHRhZ3MgYSBjYWxpYnJhdGlvbiB3b3JrcyB3aXRoIGFyZSBvbiBzaG93OyBzZWUgVGhyZWVKc1NlcnZpY2Uuc2hvd3NDYWxpYnJhdGlvblRhZ3MuICovXG4gIGlzVGhyZWVKc1Nob3dpbmdDYWxpYnJhdGlvblRhZ3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykgJiYgdGhpcy50aHJlZUpzU2VydmljZS5zaG93c0NhbGlicmF0aW9uVGFncygpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYSBjYWxpYnJhdGlvbiBpcyB1bmRlciB3YXkgaW4gdGhlIFRocmVlLmpzIHNjZW5lLiAqL1xuICBpc1RocmVlSnNBbGlnbmluZ1RhZ3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykgJiYgdGhpcy50aHJlZUpzU2VydmljZS5pc0FsaWduaW5nVGFncygpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYSBtZWFzdXJlbWVudCBpcyB0YWtpbmcgY2xpY2tzIGluIHRoZSBUaHJlZS5qcyBzY2VuZS4gKi9cbiAgaXNUaHJlZUpzTWVhc3VyaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpICYmIHRoaXMudGhyZWVKc1NlcnZpY2UuaXNNZWFzdXJpbmcoKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gYSBtZWFzdXJlbWVudCBzdGFydHMgdGFraW5nIGNsaWNrcywgZmFsc2Ugd2hlbiBpdCBzdG9wczsgc2VlIFRocmVlSnNTZXJ2aWNlLm1lYXN1cmluZ0NoYW5nZWQkLiAqL1xuICBnZXQgdGhyZWVKc01lYXN1cmluZ0NoYW5nZWQkKCkge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLm1lYXN1cmluZ0NoYW5nZWQkO1xuICB9XG5cbiAgLyoqIFNheXMgYSBjbGljayBpbiB0aGUgc3BsYXQgdmlld2VyIHdhcyBvZiBubyB1c2UgdG8gdGhlIGNhbGlicmF0aW9uLCBhcyBvbmUgaW4gdGhlIHNjZW5lIHdvdWxkLiAqL1xuICBpZ25vcmVUaHJlZUpzQWxpZ25tZW50Q2xpY2soZXhwZWN0ZWQ6ICd0YWcnIHwgJ3BvaW50Jyk6IHZvaWQge1xuICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuYWxpZ25tZW50Q2xpY2tJZ25vcmVkJC5uZXh0KGV4cGVjdGVkKTtcbiAgfVxuXG4gIC8qKiBTaG93cyBvbmx5IHRhZ3Mgb2YgdGhlIGdpdmVuIFBPSSB0eXBlczsgbnVsbCBjbGVhcnMgdGhlIGZpbHRlci4gKi9cbiAgc2V0VmlzaWJsZVRocmVlSnNUYWdUeXBlcyh0eXBlczogUG9pVHlwZVtdIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnNldFZpc2libGVUYWdUeXBlcyh0eXBlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsaWdubWVudCB3YWxrdGhyb3VnaDogcGljayBhIHRhZywgdGhlbiBjbGljayB3aGVyZSBpdCByZWFsbHkgc2l0cywgdGhyZWUgdGltZXMgb3Zlci5cbiAgICpcbiAgICogVXNlcyB0YWdzIHRoYXQgYWxyZWFkeSBleGlzdCwgc28gbm90aGluZyBpcyBjcmVhdGVkIGFuZCBub3RoaW5nIGlzIHdyaXR0ZW4gdW50aWwgdGhlIGNhbGxlclxuICAgKiBzYXZlcyB0aGUgcmVzdWx0LiBTZWUgdGhyZWVKc0FsaWdubWVudFByb2dyZXNzJCBmb3Igd2hhdCB0aGUgVUkgc2hvdWxkIGJlIGFza2luZyBmb3IuXG4gICAqL1xuICBzdGFydFRocmVlSnNUYWdBbGlnbm1lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc3RhcnRUYWdBbGlnbm1lbnQoKTtcbiAgICB9XG4gIH1cblxuICBjYW5jZWxUaHJlZUpzVGFnQWxpZ25tZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ0FsaWdubWVudCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXlzIHdoZXRoZXIgdGhlIDNEIG1vZGVsIG9uIHNjcmVlbiBpcyB0aGUgc2l0ZSdzIG9ubHkgdmlzaXQuIFRoZW4gdGhlcmUgaXMgbm93aGVyZSBlbHNlIGZvciBhXG4gICAqIHRhZyB0byBoYXZlIGNvbWUgZnJvbSwgYW5kIHRoZSB0YWdzIHRoYXQgZG8gbm90IHJlY29yZCB3aGVyZSB0aGV5IHdlcmUgcGxhY2VkIGFyZSBpdHMgb3duLlxuICAgKi9cbiAgc2V0VGhyZWVKc1NvbGVWaXNpdChzb2xlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc2V0U29sZVZpc2l0KHNvbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyB0aGUgdGFncyBhIGNhbGlicmF0aW9uIHdvdWxkIHdvcmsgd2l0aCwgaW5jbHVkaW5nIHRob3NlIGhpZGRlbiBmb3Igbm90IGxhbmRpbmcgb24gdGhlXG4gICAqIG1vZGVsLCBiZWZvcmUgYW55dGhpbmcgaXMgYXJtZWQuIENhbmNlbGxpbmcgb3Igc2F2aW5nIHRoZSBjYWxpYnJhdGlvbiBoaWRlcyB0aGVtIGFnYWluLlxuICAgKi9cbiAgcmV2ZWFsVGhyZWVKc0NhbGlicmF0aW9uVGFncygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5yZXZlYWxDYWxpYnJhdGlvblRhZ3ModHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRocmVlSnNBbGlnbm1lbnRQcm9ncmVzcyQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UuYWxpZ25tZW50UHJvZ3Jlc3MkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvbHZlcyB0aGUgYWxpZ25tZW50IGFuZCBhcHBsaWVzIGl0IHRvIHRoZSBzY2VuZSwgcmV0dXJuaW5nIGl0IGFzIHRoZSBKU09OIHRvIHN0b3JlIGluIHRoZVxuICAgKiBjYXB0dXJlJ3MgbWV0YWRhdGEuIE51bGwgbWVhbnMgdGhlIHRocmVlIHRhZ3Mgd2VyZSBjb2xsaW5lYXIgYW5kIG5vdGhpbmcgd2FzIGFwcGxpZWQuXG4gICAqL1xuICBzb2x2ZVRocmVlSnNUYWdBbGlnbm1lbnQoZXhpc3RpbmdNZXRhZGF0YT86IHN0cmluZyk6IHsgYWxpZ25tZW50OiBhbnk7IG1ldGFkYXRhOiBzdHJpbmcgfSB8IG51bGwge1xuICAgIGlmICghdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGFsaWdubWVudCA9IHRoaXMudGhyZWVKc1NlcnZpY2Uuc29sdmVBbGlnbm1lbnRGcm9tUGFpcnMoKTtcbiAgICBpZiAoIWFsaWdubWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRoaXMudGhyZWVKc0NhbGlicmF0ZWQgPSB0cnVlO1xuICAgIC8vIE1lcmdlZCBpbnRvIHdoYXRldmVyIHRoZSBjYXB0dXJlIGFscmVhZHkgc3RvcmVzLCBzbyBhbiBleGlzdGluZyBjYW1lcmEgcGxhY2VtZW50IHN1cnZpdmVzLlxuICAgIGxldCBzdG9yZWQ6IGFueSA9IHt9O1xuICAgIHRyeSB7XG4gICAgICBzdG9yZWQgPSBleGlzdGluZ01ldGFkYXRhID8gSlNPTi5wYXJzZShleGlzdGluZ01ldGFkYXRhKSA6IHt9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgc3RvcmVkID0ge307XG4gICAgfVxuICAgIHN0b3JlZC5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7XG4gICAgcmV0dXJuIHsgYWxpZ25tZW50LCBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkoc3RvcmVkKSB9O1xuICB9XG5cbiAgLyoqIFNob3dzIG9yIGhpZGVzIGEgc2luZ2xlIFRocmVlLmpzIHRhZy4gKi9cbiAgc2V0VGhyZWVKc1RhZ1Zpc2liaWxpdHkoZWxlbWVudElkOiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRUYWdWaXNpYmlsaXR5KGVsZW1lbnRJZCwgdmlzaWJsZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWN0aW9uX2RlbGV0ZV9lbGVtZW50KGVsZW1lbnQ6IERiT2JqZWN0VHlwZSkge1xuICAgIC8vIE1hdHRlcnBvcnRcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5kZWxldGVNYXR0ZXJ0YWdGb3JPYmplY3QoZWxlbWVudC5pZCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnJlbW92ZVRhZyhlbGVtZW50LmlkKTtcbiAgICB9XG4gIH1cblxuICAvKiogRW1pdHMgd2hlbiBhIFRocmVlLmpzIG1vZGVsIGxvYWQgYWN0dWFsbHkgc3RvcHBlZCBzaG9ydCwgcmF0aGVyIHRoYW4gbWVyZWx5IGJlaW5nIGFza2VkIHRvLiAqL1xuICBnZXQgdGhyZWVKc01vZGVsTG9hZENhbmNlbGxlZCQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UubW9kZWxMb2FkQ2FuY2VsbGVkJDtcbiAgfVxuXG4gIC8qKiBTdG9wcyB0aGUgVGhyZWUuanMgbW9kZWwgZG93bmxvYWQgaW4gcHJvZ3Jlc3MuICovXG4gIGNhbmNlbFRocmVlSnNNb2RlbExvYWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuY2FuY2VsTW9kZWxMb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEVtaXRzIGEgdGFnJ3MgbGFiZWwgd2hpbGUgdGhlIHBvaW50ZXIgaXMgb3ZlciBpdCBpbiB0aGUgVGhyZWUuanMgc2NlbmUuICovXG4gIGdldCB0aHJlZUpzVGFnSG92ZXJlZCQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UudGFnSG92ZXJlZCQ7XG4gIH1cblxuICAvKiogRW1pdHMgdGhlIGVsZW1lbnQgaWQgb2YgYSB0YWcgY2xpY2tlZCBpbiB0aGUgVGhyZWUuanMgc2NlbmUuICovXG4gIGdldCB0aHJlZUpzVGFnQ2xpY2tlZCQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UudGFnQ2xpY2tlZCQ7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgdmlzaXQncyBzdG9yZWQgdGFnIGFsaWdubWVudCwgbWFwcGluZyBjYXB0dXJlZCB0YWcgY29vcmRpbmF0ZXMgb250byB0aGlzIG1vZGVsLlxuICAgKlxuICAgKiBTYWZlIHRvIGNhbGwgYmVmb3JlIHRoZSBtb2RlbCBvciBhbnkgdGFnIGV4aXN0czogaXQgaXMgYSB0cmFuc2Zvcm0gb24gdGhlIGdyb3VwIGJvdGggZW5kIHVwXG4gICAqIHVuZGVyLCBzbyBpdCBhcHBsaWVzIHRvIHdoYXRldmVyIGFycml2ZXMgbGF0ZXIuXG4gICAqL1xuICBzZXRUaHJlZUpzVGFnQWxpZ25tZW50RnJvbU1ldGFkYXRhKG1ldGFkYXRhOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYWxpZ25tZW50ID0gcGFyc2VUaHJlZUpzUGxhY2VtZW50KG1ldGFkYXRhKT8uYWxpZ25tZW50ID8/IG51bGw7XG4gICAgdGhpcy50aHJlZUpzQ2FsaWJyYXRlZCA9ICEhYWxpZ25tZW50O1xuICAgIC8vIFdoaWNoIHRhZ3Mgd2VyZSBwbGFjZWQgaW4gdGhpcyBtb2RlbCBpcyBkZWNpZGVkIGFnYWluc3QgdGhlIGNhcHR1cmUgb24gc2NyZWVuLlxuICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc2V0Q3VycmVudENhcHR1cmUodGhpcy5jdXJyZW50Q2FwdHVyZUlEKTtcbiAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnNldFRhZ0FsaWdubWVudChhbGlnbm1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0YWcgcGxhY2VtZW50IG1lbnUgdG8gYWRkIGEgbmV3IGVsZW1lbnQgZGVwZW5kaW5nIG9uIGl0cyB0eXBlIChUSUNLRVQsIERBVEEsIEVRVUlQTUVOVCBldGMpXG4gICAqL1xuICBhc3luYyBhY3Rpb25BZGROZXdFbGVtZW50VG9WaWV3ZXIocG9pVHlwZTogUG9pVHlwZSkge1xuICAgIHRoaXMuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcoKTtcblxuICAgIC8vIE1hdHRlcnBvcnRcbiAgICBpZiAoXG4gICAgICB0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpICYmXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldEludGVyYWN0aW9uTW9kZSgpID09PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVFxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hZGRNYXR0ZXJ0YWdXaGVuQWRkaW5nKHBvaVR5cGUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5zdGFydFRhZ1BsYWNlbWVudChwb2lUeXBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgdGhlIHJlcG9zaXRpb25pbmcgb2YgYW4gZXhpc3RpbmcgTWF0dGVydGFnIHJlbGF0ZWQgdG8gcGFyYW1ldGVyIG9iamVjdFxuICAgKiBAcGFyYW0gZWxlbWVudCBvYmplY3QgKFRJQ0tFVCwgRVFVSVBNRU5ULCBGRUFUVVJFLCBldGMpXG4gICAqIEBwYXJhbSBwb2lUeXBlIHR5cGUgb2Ygb2JqZWN0XG4gICAqL1xuICBhc3luYyBhY3Rpb25SZXBvc2l0aW9uRWxlbWVudEluVmlld2VyKFxuICAgIGVsZW1lbnQ6IERiT2JqZWN0VHlwZSxcbiAgICBwb2lUeXBlOiBQb2lUeXBlXG4gICkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykgJiZcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0SW50ZXJhY3Rpb25Nb2RlKCkgPT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXG4gICAgKSB7XG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFkZE1hdHRlcnRhZ1doZW5SZXBvc2l0aW9uaW5nKHBvaVR5cGUsIGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgdGlja2V0IHBsYWNlbWVudCBtZW51IHRvIGFkZCBhIG5ldyB0aWNrZXRcbiAgICovXG4gIGFjdGlvbl9jYW5jZWxlZCgpIHtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuY2FuY2VsRm9sbG93aW5nQ3Vyc29yKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xuICAgIH1cbiAgfVxuXG4gIGFjdGlvbl90b29sYm94X2luc2lkZV92aWV3KCkge1xuICAgIC8vIE1hdHRlcnBvcnRcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldygpO1xuICAgIH1cbiAgfVxuXG4gIGFjdGlvblNob3dBbGxGbG9vcnMoKSB7XG4gICAgLy8gTWF0dGVycG9ydFxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFjdGlvblNob3dBbGxGbG9vcnMoKTtcbiAgICB9XG4gIH1cblxuICBhY3Rpb25fdG9vbGJveF9kb2xsaG91c2UoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSAhPT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcbiAgICApIHtcbiAgICAgIHRoaXMuYWN0aW9uX2NhbmNlbGVkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5hY3Rpb25fdG9vbGJveF9jYW5jZWxfbWVzdXJlKCk7XG4gICAgLy8gTWF0dGVycG9ydFxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFjdGlvbl90b29sYm94X2RvbGxob3VzZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFjdGlvbl9mbG9vcnBsYW4oKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSAhPT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcbiAgICApIHtcbiAgICAgIHRoaXMuYWN0aW9uX2NhbmNlbGVkKCk7XG4gICAgfVxuICAgIC8vIE1hdHRlcnBvcnRcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9mbG9vcnBsYW4oKTtcbiAgICB9XG4gIH1cblxuICBhY3Rpb25fdG9vbGJveF9tZXN1cmUoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSAhPT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcbiAgICApIHtcbiAgICAgIHRoaXMuYWN0aW9uX2NhbmNlbGVkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5hY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldygpO1xuICAgIC8vIE1hdHRlcnBvcnRcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9tZXN1cmUoKTtcbiAgICB9XG4gICAgLy8gTWF0dGVycG9ydCdzIFNESyBicmluZ3MgaXRzIG93biBtZWFzdXJpbmcgdG9vbDsgdGhlIFRocmVlLmpzIHZpZXdlciBoYXMgdG8gcHJvdmlkZSBvbmUuXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc3RhcnRNZWFzdXJpbmcoKTtcbiAgICB9XG4gIH1cblxuICBhY3Rpb25fdG9vbGJveF9jYW5jZWxfbWVzdXJlKCkge1xuICAgIC8vIE1hdHRlcnBvcnRcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9jYW5jZWxfbWVzdXJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbE1lYXN1cmluZygpO1xuICAgICAgLy8gVGhlIHRvb2xiYXIgdG9nZ2xlcyBvbiB0aGlzIGZsYWc7IGxlZnQgb24sIHRoZSBuZXh0IGNsaWNrIHdvdWxkIHN3aXRjaCBtZWFzdXJpbmcgXCJvZmZcIlxuICAgICAgLy8gaW5zdGVhZCBvZiBzdGFydGluZyBhIG5ldyBvbmUuXG4gICAgICB0aGlzLnRvb2xib3hTdGF0ZXMubWVzdXJlLnN0YXQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hpbGUgbWVhc3VyaW5nIGluIHRoZSBUaHJlZS5qcyB2aWV3ZXI6IHBvaW50cyBhbmQgc2VnbWVudCBsZW5ndGhzIHNvIGZhciwgbnVsbCBpZiBhYmFuZG9uZWQuICovXG4gIGdldCB0aHJlZUpzTWVhc3VyZW1lbnRQcm9ncmVzcyQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UubWVhc3VyZW1lbnRQcm9ncmVzcyQ7XG4gIH1cblxuICAvKipcbiAgICogRW5kcyB0aGUgVGhyZWUuanMgbWVhc3VyZW1lbnQgaW4gcHJvZ3Jlc3MsIG9yIHJldHVybnMgbnVsbCB3aGVuIGl0IGhhcyBmZXdlciB0aGFuIHR3byBwb2ludHMuXG4gICAqIGBzY3JlZW5zaG90YCBpcyB0aGUgcGljdHVyZSBvZiBpdCwgd2hlbiB0aGUgbW9kZWwgaXMgZHJhd24gYnkgYW5vdGhlciB2aWV3ZXIgdGhhbiB0aGUgc2NlbmUuXG4gICAqL1xuICBmaW5pc2hUaHJlZUpzTWVhc3VyZW1lbnQoc2NyZWVuc2hvdD86IHN0cmluZyk6IFRocmVlSnNNZWFzdXJlbWVudCB8IG51bGwge1xuICAgIGlmICghdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1lYXN1cmVtZW50ID0gdGhpcy50aHJlZUpzU2VydmljZS5maW5pc2hNZWFzdXJpbmcoc2NyZWVuc2hvdCk7XG4gICAgaWYgKG1lYXN1cmVtZW50KSB7XG4gICAgICB0aGlzLnRvb2xib3hTdGF0ZXMubWVzdXJlLnN0YXQgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG1lYXN1cmVtZW50O1xuICB9XG5cbiAgLyoqIEEgbWVhc3VyZW1lbnQgd2FzIHRha2VuIG9mZiB0aGUgbW9kZWwsIGZpbmlzaGVkIG9yIG5vdDsgc2VlIFRocmVlSnNTZXJ2aWNlLm1lYXN1cmVtZW50Q2xlYXJlZCQuICovXG4gIGdldCB0aHJlZUpzTWVhc3VyZW1lbnRDbGVhcmVkJCgpIHtcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5tZWFzdXJlbWVudENsZWFyZWQkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwb2ludCB0byB0aGUgbWVhc3VyZW1lbnQgdW5kZXIgd2F5LCBwaWNrZWQgb24gdGhlIG1vZGVsIGluIGFub3RoZXIgdmlld2VyIC0gdGhlIHNwbGF0XG4gICAqIHZpZXdlciAtIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlcy4gRmFsc2Ugd2hlbiBubyBtZWFzdXJlbWVudCBpcyB1bmRlciB3YXkuXG4gICAqL1xuICBhZGRUaHJlZUpzTWVhc3VyZVBvaW50QXRNb2RlbFBvaW50KHBvaW50OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpICYmIHRoaXMudGhyZWVKc1NlcnZpY2UuYWRkTWVhc3VyZVBvaW50QXRNb2RlbFBvaW50KHBvaW50KTtcbiAgfVxuXG4gIC8qKiBUaGUgcG9pbnRzIG9mIHRoZSBtZWFzdXJlbWVudCBvbiB0aGUgbW9kZWwsIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlcywgZm9yIGFub3RoZXIgdmlld2VyIHRvIGRyYXcuICovXG4gIGdldFRocmVlSnNNZWFzdXJlUG9pbnRzSW5Nb2RlbEZyYW1lKCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9W10ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpID8gdGhpcy50aHJlZUpzU2VydmljZS5nZXRNZWFzdXJlUG9pbnRzSW5Nb2RlbEZyYW1lKCkgOiBbXTtcbiAgfVxuXG4gIC8qKiBUaGUgbWVhc3VyZW1lbnQgbGFzdCBmaW5pc2hlZCBpbiB0aGUgVGhyZWUuanMgdmlld2VyLCBmb3IgdGhlIGZvcm0gdGhhdCBzYXZlcyBpdC4gKi9cbiAgZ2V0VGhyZWVKc0xhc3RNZWFzdXJlbWVudCgpOiBUaHJlZUpzTWVhc3VyZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSA/IHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0TGFzdE1lYXN1cmVtZW50KCkgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBNYXR0ZXJwb3J0IHN3ZWVwIG5lYXJlc3QgdG8gYSBwb2ludCBwaWNrZWQgaW4gdGhlIFRocmVlLmpzIHZpZXdlciwgb3IgbnVsbC5cbiAgICpcbiAgICogRm9yIGNhbGxlcnMgdGhhdCB3cml0ZSB0aGVpciBvd24gUE9JLCBhcyB0aGUgbWVhc3VyZW1lbnQgZm9ybSBkb2VzIC0gYW55dGhpbmcgY3JlYXRlZCB0aHJvdWdoXG4gICAqIGNyZWF0ZVBvaUZvclRocmVlSnNQbGFjZW1lbnQgYWxyZWFkeSBnZXRzIHRoaXMuXG4gICAqL1xuICBmaW5kTmVhcmVzdFN3ZWVwRm9yVGhyZWVKcyhwb2ludDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAvLyBBbiB1bmNhbGlicmF0ZWQgbW9kZWwncyBjb29yZGluYXRlcyBhcmUgaXRzIG93bi4gTWVhc3VyZWQgYWdhaW5zdCB0aGUgTWF0dGVycG9ydCBzd2VlcHMgdGhleVxuICAgIC8vIGNvdWxkIGxhbmQgbmVhciBvbmUgYnkgY29pbmNpZGVuY2UsIGFuZCB0aGUgdGFnIHdvdWxkIHR1cm4gdXAgaW4gdGhlIHRvdXIgc29tZXdoZXJlIGFyYml0cmFyeS5cbiAgICBpZiAoIXRoaXMudGhyZWVKc0NhbGlicmF0ZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN3ZWVwTG9jYXRvci5maW5kTmVhcmVzdFN3ZWVwKHBvaW50LCB0aGlzLmN1cnJlbnRTcGFjZUlEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWV0YWRhdGEgYSBQT0kgcGxhY2VkIGluIHRoZSBUaHJlZS5qcyB2aWV3ZXIgaXMgc3RvcmVkIHdpdGg6IHdoaWNoIDNEIG1vZGVsIGl0IHdhcyBwbGFjZWRcbiAgICogaW4sIGFuZCAtIHdoZW4gdGhhdCBtb2RlbCBpcyBub3QgY2FsaWJyYXRlZCAtIHRoYXQgaXRzIGNvb3JkaW5hdGVzIGFyZSB0aGUgbW9kZWwncyBvd24uXG4gICAqL1xuICBidWlsZFRocmVlSnNQb2lNZXRhZGF0YShleHRyYTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9KTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgLi4uZXh0cmEsXG4gICAgICAuLi4odGhpcy5jdXJyZW50Q2FwdHVyZUlEID8geyBjYXB0dXJlSUQ6IHRoaXMuY3VycmVudENhcHR1cmVJRCB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuY3VycmVudENhcHR1cmVJRCAmJiAhdGhpcy50aHJlZUpzQ2FsaWJyYXRlZCA/IHsgZnJhbWU6ICdtb2RlbCcgfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBXaGljaCBvZiB0aGUgM0QgbW9kZWwncyBheGVzIGlzIGJlaW5nIHRyZWF0ZWQgYXMgdXAuICovXG4gIGdldFRocmVlSnNNb2RlbFVwKCk6IFRocmVlSnNNb2RlbFVwIHtcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5nZXRNb2RlbFVwKCk7XG4gIH1cblxuICAvKipcbiAgICogVHVybnMgdGhlIDNEIG1vZGVsIHRvIHRoZSBuZXh0IGNhbmRpZGF0ZSBmb3IgXCJ3aGljaCBheGlzIGlzIHVwXCIsIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlXG4gICAqIG1ldGFkYXRhIHdpdGggdGhhdCBjaG9pY2Ugd3JpdHRlbiBpbiwgZm9yIHRoZSBjYWxsZXIgdG8gc3RvcmUuXG4gICAqXG4gICAqIFRoZSB2ZXJ0aWNhbCBheGlzIGlzIHdvcmtlZCBvdXQgZnJvbSB0aGUgZ2VvbWV0cnkgd2hlbiBhIG1vZGVsIGxvYWRzLCBhbmQgdGhhdCBjYW4gYmUgd3Jvbmc6XG4gICAqIGEgbmFycm93IGNvcnJpZG9yIGFuZCBhIGxvdyBzbGFiIGFyZSB0aGUgc2FtZSBzaGFwZSB0dXJuZWQgb3Zlci4gVGhpcyBpcyB0aGUgd2F5IHRvIGNvcnJlY3QgaXQuXG4gICAqL1xuICBjeWNsZVRocmVlSnNNb2RlbFVwKGV4aXN0aW5nTWV0YWRhdGE6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiB7IHVwOiBUaHJlZUpzTW9kZWxVcDsgbWV0YWRhdGE6IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudCA9IFRIUkVFSlNfTU9ERUxfVVBfT1BUSU9OUy5pbmRleE9mKHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0TW9kZWxVcCgpKTtcbiAgICBjb25zdCB1cCA9IFRIUkVFSlNfTU9ERUxfVVBfT1BUSU9OU1soY3VycmVudCArIDEpICUgVEhSRUVKU19NT0RFTF9VUF9PUFRJT05TLmxlbmd0aF07XG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRNb2RlbFVwKHVwKTtcblxuICAgIGxldCBzdG9yZWQ6IGFueSA9IHt9O1xuICAgIHRyeSB7XG4gICAgICBzdG9yZWQgPSBleGlzdGluZ01ldGFkYXRhID8gSlNPTi5wYXJzZShleGlzdGluZ01ldGFkYXRhKSA6IHt9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgc3RvcmVkID0ge307XG4gICAgfVxuICAgIHN0b3JlZC51cCA9IHVwO1xuICAgIHJldHVybiB7IHVwLCBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkoc3RvcmVkKSB9O1xuICB9XG5cbiAgLyoqIENob29zZXMgdGhlIHRhZyBmb3IgdGhlIGNhbGlicmF0aW9uIHBhaXIgYmVpbmcgbWF0Y2hlZCBieSBpZCwgaW5zdGVhZCBvZiBieSBjbGlja2luZyBpdC4gKi9cbiAgc2VsZWN0VGhyZWVKc0FsaWdubWVudFRhZyhlbGVtZW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpICYmIHRoaXMudGhyZWVKc1NlcnZpY2Uuc2VsZWN0QWxpZ25tZW50VGFnKGVsZW1lbnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZXMgdGhlIHRhZyBiZWluZyBtYXRjaGVkIGluIHRoZSBjYWxpYnJhdGlvbiB1bmRlciB3YXkgaXRzIHJlYWwgcGxhY2UsIHBpY2tlZCBvbiB0aGUgbW9kZWwgaW5cbiAgICogYW5vdGhlciB2aWV3ZXIgLSB0aGUgc3BsYXQgdmlld2VyIC0gaW4gdGhlIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLiBGYWxzZSB3aGVuIG5vIHRhZyB3YXMgd2FpdGluZy5cbiAgICovXG4gIG1hdGNoVGhyZWVKc0FsaWdubWVudFRhZ0F0TW9kZWxQb2ludChwb2ludDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSAmJiB0aGlzLnRocmVlSnNTZXJ2aWNlLm1hdGNoQWxpZ25tZW50VGFnQXRNb2RlbFBvaW50KHBvaW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBiYWNrIHRoZSBsYXN0IHN0ZXAgb2YgdGhlIGNhbGlicmF0aW9uIHVuZGVyIHdheTogdGhlIHRhZyBqdXN0IGNob3Nlbiwgb3IgZWxzZSB0aGUgbGFzdFxuICAgKiBwYWlyIG1hdGNoZWQuIEZhbHNlIHdoZW4gdGhlcmUgd2FzIG5vdGhpbmcgdG8gdGFrZSBiYWNrLlxuICAgKi9cbiAgdW5kb1RocmVlSnNBbGlnbm1lbnRTdGVwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpICYmIHRoaXMudGhyZWVKc1NlcnZpY2UudW5kb0FsaWdubWVudFN0ZXAoKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmVzIG9uZSBtYXRjaGVkIHBhaXIgb2YgdGhlIGNhbGlicmF0aW9uIHVuZGVyIHdheSwgYnkgaXRzIHBsYWNlIGluIHRoZSBsaXN0LiAqL1xuICByZW1vdmVUaHJlZUpzQWxpZ25tZW50UGFpcihpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykgJiYgdGhpcy50aHJlZUpzU2VydmljZS5yZW1vdmVBbGlnbm1lbnRQYWlyKGluZGV4KTtcbiAgfVxuXG4gIC8qKiBIb3cgZmFyIHRoZSB2aXNpYmxlIHRhZ3Mgc2l0IGZyb20gdGhlIDNEIG1vZGVsLCBpbiBtb2RlbCByYWRpaS4gTnVsbCB3aXRob3V0IGJvdGguICovXG4gIGdldFRocmVlSnNUYWdEaXN0YW5jZUZyb21Nb2RlbCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSA/IHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0VGFnRGlzdGFuY2VGcm9tTW9kZWwoKSA6IG51bGw7XG4gIH1cblxuICAvKiogSG93IG1hbnkgdGFncyB0aGUgVGhyZWUuanMgc2NlbmUgaXMgc2hvd2luZy4gKi9cbiAgZ2V0VGhyZWVKc1RhZ0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykgPyB0aGlzLnRocmVlSnNTZXJ2aWNlLmdldFRhZ0NvdW50KCkgOiAwO1xuICB9XG5cbiAgYXN5bmMgYWN0aW9uX3VwZGF0ZV9wb2koXG4gICAgcG9pOiBQT0ksXG4gICAgaXNWYWxpZDogYm9vbGVhbixcbiAgICBlbGVtZW50OiBEYk9iamVjdFR5cGVcbiAgKTogUHJvbWlzZTxQT0k+IHtcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgY29uc3QgbGFzdFRhZyA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UubWF0dGVydGFnVG9Gb2xsb3dcbiAgICAgICAgICA/IHRoaXMubWF0dGVycG9ydFNlcnZpY2UubWF0dGVydGFnVG9Gb2xsb3dcbiAgICAgICAgICA6IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0TGFzdFRhZygpO1xuICAgICAgICBpZiAoIWxhc3RUYWcpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvaSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFnRGF0YSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0TWF0dGVyVGFnRGF0YUZvck1hdHRlcnRhZyhsYXN0VGFnKTtcbiAgICAgICAgaWYgKCF0YWdEYXRhKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb2kpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9pTWV0YWRhdGEgPSAoISFwb2kgJiYgcG9pLm1ldGFkYXRhKSA/IEpTT04ucGFyc2UocG9pLm1ldGFkYXRhKSA6IHt9O1xuICAgICAgICBwb2lNZXRhZGF0YS5ub3JtYWwgPSB0YWdEYXRhLmdldE5vcm1hbCgpO1xuICAgICAgICBpZiAoIXBvaSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvaUlucHV0ID0ge1xuICAgICAgICAgIGlkOiBwb2kuaWQsXG4gICAgICAgICAgY29vcmRpbmF0ZTogdGFnRGF0YS5nZXRDb29yZGluYXRlU3RyaW5nKCksXG4gICAgICAgICAgbWF0dGVycG9ydFN3ZWVwSUQ6IHRhZ0RhdGEuZ2V0U3dlZXBJRCgpLFxuICAgICAgICAgIG1ldGFkYXRhOiBKU09OLnN0cmluZ2lmeShwb2lNZXRhZGF0YSksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRQb2k6IFBPSSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS51cGRhdGVQb2kocG9pSW5wdXQpO1xuICAgICAgICB0YWdEYXRhLnNldFBvaSh1cGRhdGVkUG9pKTtcbiAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5zZXRPYmplY3RBbmRQb2lJblRhZyhsYXN0VGFnLCBlbGVtZW50LCBQb2lUeXBlLkRFU0ssIHVwZGF0ZWRQb2kpO1xuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmluamVjdEh0bWxJblRhZyhcbiAgICAgICAgICBwb2kudHlwZSEsXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICBsYXN0VGFnXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2V0VGFnSWNvbkFuZE9wYWNpdHkobGFzdFRhZywgdGFnRGF0YSk7XG4gICAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ29Ub1RhZyhsYXN0VGFnKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVwZGF0ZWRQb2kpO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5kZWxldGVMYXN0TWF0dGVydGFnKCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvaSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbW1pdFRocmVlSnNUYWdQbGFjZW1lbnQocG9pLCBpc1ZhbGlkLCBlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvaSk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBzcG90IHBpY2tlZCBpbiB0aGUgVGhyZWUuanMgc2NlbmUgaW50byB0aGUgUE9JLCBtaXJyb3JpbmcgdGhlIE1hdHRlcnBvcnQgYnJhbmNoLlxuICAgKlxuICAgKiBUaGUgY29vcmRpbmF0ZSBnb2VzIGluIHRoZSBzYW1lIGZpZWxkIGFuZCB0aGUgc2FtZSBzcGFjZSBNYXR0ZXJwb3J0IHdyaXRlcywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuICAgKiBhIHRhZyBjcmVhdGVkIGhlcmUgc2hvdyB1cCBpbiB0aGUgcmlnaHQgcGxhY2UgdGhlcmUgLSBhbmQgdGhlIG90aGVyIHdheSByb3VuZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29tbWl0VGhyZWVKc1RhZ1BsYWNlbWVudChcbiAgICBwb2k6IFBPSSxcbiAgICBpc1ZhbGlkOiBib29sZWFuLFxuICAgIGVsZW1lbnQ6IERiT2JqZWN0VHlwZVxuICApOiBQcm9taXNlPFBPST4ge1xuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0UGVuZGluZ1RhZ1BsYWNlbWVudCgpO1xuICAgIGlmICghaXNWYWxpZCB8fCAhcGxhY2VtZW50IHx8ICFwb2kpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuY2FuY2VsVGFnUGxhY2VtZW50KCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvaSk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9pTWV0YWRhdGEgPSBwb2kubWV0YWRhdGEgPyBKU09OLnBhcnNlKHBvaS5tZXRhZGF0YSkgOiB7fTtcbiAgICBwb2lNZXRhZGF0YS5ub3JtYWwgPSBwbGFjZW1lbnQubm9ybWFsO1xuXG4gICAgY29uc3QgdXBkYXRlZFBvaSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS51cGRhdGVQb2koe1xuICAgICAgaWQ6IHBvaS5pZCxcbiAgICAgIGNvb3JkaW5hdGU6IEpTT04uc3RyaW5naWZ5KHBsYWNlbWVudC5wb3NpdGlvbiksXG4gICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkocG9pTWV0YWRhdGEpLFxuICAgICAgLy8gbWF0dGVycG9ydFN3ZWVwSUQgaXMgbGVmdCBhcyBpdCB3YXM6IHRoaXMgdmlld2VyIGhhcyBubyBzd2VlcHMsIGFuZCBNYXR0ZXJwb3J0IGZpbHRlcnMgdGFnXG4gICAgICAvLyB2aXNpYmlsaXR5IGJ5IHRoZW0sIHNvIGNsZWFyaW5nIGl0IHdvdWxkIGhpZGUgdGhlIHRhZyBvdmVyIHRoZXJlLlxuICAgIH0pO1xuXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS51cHNlcnRUYWcoe1xuICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICBwb3NpdGlvbjogcGxhY2VtZW50LnBvc2l0aW9uLFxuICAgICAgcG9pVHlwZTogdXBkYXRlZFBvaT8udHlwZSA/PyBwb2kudHlwZSxcbiAgICAgIGljb25Vcmw6IHVwZGF0ZWRQb2k/LnRhZ0ljb24gPyBhd2FpdCBnZXRTaWduZWRGaWxlKHVwZGF0ZWRQb2kudGFnSWNvbikgOiBudWxsLFxuICAgICAgbm9ybWFsOiBwbGFjZW1lbnQubm9ybWFsLFxuICAgICAgLy8gQXMgaXQgaXMgc3RvcmVkIChzZWUgYnVpbGRUaHJlZUpzUG9pTWV0YWRhdGEpOiBwbGFjZWQgaW4gdGhpcyBtb2RlbCwgYW5kIGluIGl0cyBvd25cbiAgICAgIC8vIGNvb3JkaW5hdGVzIHdoaWxlIGl0IGlzIG5vdCBjYWxpYnJhdGVkIC0gc28gdGhhdCBpdCBzaG93cyBhcyB0aGUgbW9kZWwncyBvd24gc3RyYWlnaHQgYXdheS5cbiAgICAgIC4uLih0aGlzLmN1cnJlbnRDYXB0dXJlSUQgPyB7IG9yaWdpbkNhcHR1cmVJRDogdGhpcy5jdXJyZW50Q2FwdHVyZUlEIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5jdXJyZW50Q2FwdHVyZUlEICYmICF0aGlzLnRocmVlSnNDYWxpYnJhdGVkID8geyBmcmFtZTogJ21vZGVsJyBhcyBjb25zdCB9IDoge30pLFxuICAgIH0pO1xuICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuY2FuY2VsVGFnUGxhY2VtZW50KCk7XG5cbiAgICByZXR1cm4gdXBkYXRlZFBvaTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBQT0kgZm9yIGFuIGVsZW1lbnQganVzdCBwbGFjZWQgaW4gdGhlIFRocmVlLmpzIHNjZW5lLlxuICAgKlxuICAgKiBUaGUgTWF0dGVycG9ydCBwYXRoIHJlYWNoZXMgdGhlIHNhbWUgcmVzdWx0IHRocm91Z2ggaXRzIHRhZyBkaWN0aW9uYXJ5IC0gdGhlIHRhZyBleGlzdHMgZmlyc3RcbiAgICogYW5kIGNhcnJpZXMgdGhlIGNvb3JkaW5hdGVzLiBUaHJlZS5qcyBoYXMgbm8gc3VjaCBvYmplY3QsIHNvIHRoZSBwbGFjZW1lbnQgY2FwdHVyZWQgYXQgY2xpY2tcbiAgICogdGltZSBpcyB0aGUgb25seSByZWNvcmQgb2Ygd2hlcmUgdGhlIHVzZXIgcG9pbnRlZCwgYW5kIGl0IGhhcyB0byBiZWNvbWUgYSBQT0kgaGVyZSBvciBpdCBpc1xuICAgKiBsb3N0IHdoZW4gdGhlIGZvcm0gY2xvc2VzLlxuICAgKlxuICAgKiBSZXR1cm5zIG51bGwgd2hlbiB0aGVyZSBpcyBubyBwZW5kaW5nIHBsYWNlbWVudCwgd2hpY2ggaXMgdGhlIG5vcm1hbCBjYXNlIGluIE1hdHRlcnBvcnQgbW9kZS5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBvaUZvclRocmVlSnNQbGFjZW1lbnQoZWxlbWVudDogRGJPYmplY3RUeXBlLCBwb2lUeXBlOiBQb2lUeXBlLCBleHRyYTogUGFydGlhbDxQT0k+ID0ge30pOiBQcm9taXNlPFBPSSB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBwbGFjZW1lbnQgPSB0aGlzLnRocmVlSnNTZXJ2aWNlLmdldFBlbmRpbmdUYWdQbGFjZW1lbnQoKTtcbiAgICBpZiAoIXBsYWNlbWVudCB8fCAhZWxlbWVudD8uaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFdpdGhvdXQgYSBzd2VlcCB0aGUgdGFnIGlzIGxlZnQgb2ZmIGV2ZXJ5dGhpbmcgb24gdGhlIE1hdHRlcnBvcnQgc2lkZSB0aGF0IGlzIG9yZ2FuaXNlZCBieVxuICAgIC8vIHN3ZWVwIC0gdGhlIGZsb29yIHBsYW4gbW9zdCB2aXNpYmx5LCB3aGljaCBvbmx5IGRyYXdzIHRhZ3Mgd2hvc2Ugc3dlZXAgYmVsb25ncyB0byBpdC5cbiAgICBjb25zdCBtYXR0ZXJwb3J0U3dlZXBJRCA9IGF3YWl0IHRoaXMuZmluZE5lYXJlc3RTd2VlcEZvclRocmVlSnMocGxhY2VtZW50LnBvc2l0aW9uKTtcbiAgICBjb25zdCBwb2kgPSBhd2FpdCB0aGlzLnBvaVNlcnZpY2UuY3JlYXRlUE9JRm9yU3BhY2VJRCh7XG4gICAgICAvLyBXaGF0IGEgZm9ybSBhc2tlZCBmb3IgYmVzaWRlcyB0aGUgcGxhY2UgLSB0aGUgbXVzZXVtJ3MsIHNheSAtIHVuZGVyIHdoYXQgdGhlIHBsYWNlbWVudCBzYXlzLlxuICAgICAgLi4uZXh0cmEsXG4gICAgICBjb29yZGluYXRlOiBKU09OLnN0cmluZ2lmeShwbGFjZW1lbnQucG9zaXRpb24pLFxuICAgICAgdHlwZTogcG9pVHlwZSxcbiAgICAgIGVsZW1lbnRJRDogZWxlbWVudC5pZCxcbiAgICAgIG1ldGFkYXRhOiB0aGlzLmJ1aWxkVGhyZWVKc1BvaU1ldGFkYXRhKHsgbm9ybWFsOiBwbGFjZW1lbnQubm9ybWFsIH0pLFxuICAgICAgLi4uKG1hdHRlcnBvcnRTd2VlcElEID8geyBtYXR0ZXJwb3J0U3dlZXBJRCB9IDoge30pLFxuICAgIH0gYXMgUE9JKTtcblxuICAgIC8vIERyYXcgaXQgc3RyYWlnaHQgYXdheSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgbmV4dCByZWZyZXNoLCBzbyB0aGUgdXNlciBzZWVzIHdoZXJlIHRoZVxuICAgIC8vIHRoaW5nIHRoZXkganVzdCBjcmVhdGVkIGVuZGVkIHVwLiBUaHJvdWdoIHRoZSBzYW1lIHBhdGggdGhlIHJlZnJlc2ggdXNlcywgc28gaXQgYXJyaXZlcyB3aXRoXG4gICAgLy8gdGhlIHR5cGUncyBpY29uIGluc3RlYWQgb2YgdGhlIGJhcmUgbWFya2VyIC0gdGhlIGRpZmZlcmVuY2Ugd2FzIHZpc2libGUgdW50aWwgdGhlIG5leHQgcmVsb2FkLlxuICAgIGF3YWl0IHRoaXMuYWRkVGhyZWVKc1RhZ0Zyb21QT0koZWxlbWVudCwgcG9pKTtcbiAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xuICAgIHJldHVybiBwb2k7XG4gIH1cblxuICAvKiogRW1pdHMgd2hlbiBhIHRhZyBpcyBkcm9wcGVkIG9uIHRoZSBtb2RlbCBpbiB0aGUgVGhyZWUuanMgc2NlbmUuICovXG4gIGdldCB0aHJlZUpzVGFnUGxhY2VkJCgpIHtcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS50YWdQbGFjZWQkO1xuICB9XG5cbiAgLyoqIEVtaXRzIHdoZW4gdGhlIGNhbGlicmF0aW9uIHdhbGt0aHJvdWdoIGlzIGFiYW5kb25lZCwgaW5jbHVkaW5nIHZpYSBFc2NhcGUuICovXG4gIGdldCB0aHJlZUpzQWxpZ25tZW50Q2FuY2VsbGVkJCgpIHtcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5hbGlnbm1lbnRDYW5jZWxsZWQkO1xuICB9XG5cbiAgLyoqIEVtaXRzIHdoZW4gdGhlIFRocmVlLmpzIHRhZ3MgY2hhbmdlOyBzZWUgZ2V0VGhyZWVKc1RhZ1NuYXBzaG90LiAqL1xuICBnZXQgdGhyZWVKc1RhZ3NDaGFuZ2VkJCgpIHtcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS50YWdzQ2hhbmdlZCQ7XG4gIH1cblxuICAvKiogVGhlIHRhZ3MsIGFuZCB0aGVpciBjYWxpYnJhdGlvbiwgYXMgYSB2aWV3ZXIgZHJhd2luZyB0aGUgc2NlbmUgZWxzZXdoZXJlIG5lZWRzIHRoZW0uICovXG4gIGdldFRocmVlSnNUYWdTbmFwc2hvdCgpIHtcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5nZXRUYWdTbmFwc2hvdCgpO1xuICB9XG5cbiAgLyoqIFN0b3BzIGRyYXdpbmcgdGhlIFRocmVlLmpzIHNjZW5lIHdoaWxlIGFub3RoZXIgdmlld2VyIGNvdmVycyBpdCwgb3Igc3RhcnRzIGFnYWluLiAqL1xuICBzZXRUaHJlZUpzUmVuZGVyaW5nUGF1c2VkKHBhdXNlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc2V0UmVuZGVyaW5nUGF1c2VkKHBhdXNlZCk7XG4gIH1cblxuICAvKiogRW1pdHMgd2hlbiBhIGNsaWNrIGR1cmluZyBjYWxpYnJhdGlvbiBsYW5kZWQgb24gbm90aGluZyBpdCBjb3VsZCB1c2U6IGEgdGFnLCBvciB0aGUgbW9kZWwuICovXG4gIGdldCB0aHJlZUpzQWxpZ25tZW50Q2xpY2tJZ25vcmVkJCgpIHtcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5hbGlnbm1lbnRDbGlja0lnbm9yZWQkO1xuICB9XG5cbiAgLyoqIEVtaXRzIHdoZW4gVGhyZWUuanMgdGFnIHBsYWNlbWVudCBpcyBhcm1lZCAodHJ1ZSkgYW5kIHdoZW4gaXQgZW5kcyAoZmFsc2UpLiAqL1xuICBnZXQgdGhyZWVKc1BsYWNlbWVudENoYW5nZWQkKCkge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLnBsYWNlbWVudENoYW5nZWQkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlcyBhbiBhcm1lZCBUaHJlZS5qcyB0YWcgcGxhY2VtZW50IGF0IGEgc3BvdCB0aGUgc3BsYXQgdmlld2VyIHBpY2tlZCwgaW4gdGhlIG1vZGVsJ3Mgb3duXG4gICAqIGNvb3JkaW5hdGVzOiB0aGUgY3JlYXRpb24gZm9ybSB0aGVuIG9wZW5zIGFzIGZvciBhIGNsaWNrIGluIHRoZSBUaHJlZS5qcyBzY2VuZS5cbiAgICovXG4gIHBsYWNlVGhyZWVKc1RhZ0F0TW9kZWxQb2ludChwb2ludDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0sIG5vcm1hbDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0gfCBudWxsID0gbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnBsYWNlVGFnQXRNb2RlbFBvaW50KHBvaW50LCBub3JtYWwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBMZWF2ZXMgVGhyZWUuanMgdGFnIHBsYWNlbWVudCBtb2RlIHdpdGhvdXQgcGxhY2luZyBhbnl0aGluZy4gKi9cbiAgY2FuY2VsVGhyZWVKc1RhZ1BsYWNlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5jYW5jZWxUYWdQbGFjZW1lbnQoKTtcbiAgICB9XG4gIH1cblxuICBlZGl0T25seVRhZ1N0eWxlRm9yUG9pKHBvaTogUE9JLCBvYmplY3Q6IERiT2JqZWN0VHlwZSkge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xuICAgICAgaWYgKHRhZ0RhdGEudGFnKSB7XG4gICAgICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldE1hdHRlclRhZ0RhdGFGb3JNYXR0ZXJ0YWcoXG4gICAgICAgICAgdGFnRGF0YS50YWdcbiAgICAgICAgKTtcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3Qob2JqZWN0LCBQb2lUeXBlLlJPT00pO1xuICAgICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnNldFRhZ0ljb25BbmRPcGFjaXR5KHRhZ0RhdGEudGFnLCBtYXR0ZXJ0YWdEYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRJY29uQW5kU2V0Rm9yUG9pKHBvaTogUE9JLCBpY29uUGF0aDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQocG9pLmVsZW1lbnRJRCk7XG4gICAgICBpZiAodGFnRGF0YS50YWcpIHtcbiAgICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hZGROZXdJY29uQW5kU2V0Rm9yVGFnKHRhZ0RhdGEudGFnLCBpY29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlVG9SZWdpc3RyZWRJY29uRm9yUG9pKHBvaTogUE9JLCBpY29uTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQocG9pLmVsZW1lbnRJRCk7XG4gICAgICBpZiAodGFnRGF0YS50YWcpIHtcbiAgICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5zZXRSZWdpc3RyZWRJY29uRm9yVGFnKHRhZ0RhdGEudGFnLCBpY29uTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlSHRtbFRhZ0ZvclBvaVdpdGhPYmplY3QocG9pOiBQT0ksIG9iamVjdDogRGJPYmplY3RUeXBlKSB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQocG9pLmVsZW1lbnRJRCk7XG4gICAgICBpZiAodGFnRGF0YS50YWcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS51cGRhdGVJbmplY3RlZEh0bWxGb3JUYWdJRChcbiAgICAgICAgICB0YWdEYXRhLnRhZyxcbiAgICAgICAgICBvYmplY3QsXG4gICAgICAgICAgcG9pLnR5cGVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBhbiBleGlzdGluZyBwb2kgaW4gTWF0dGVycG9ydFxuICAgKiBAcGFyYW0gcG9pXG4gICAqIEBwYXJhbSBlbGVtZW50XG4gICAqL1xuICBhc3luYyBhY3Rpb25fbW92ZV9wb2lfdmlzdWFsbHkoXG4gICAgcG9pOiBQT0ksXG4gICAgZWxlbWVudDogVGlja2V0IHwgRmVhdHVyZSB8IEVxdWlwbWVudCB8IENvbW1lbnRcbiAgKSB7XG4gICAgYXdhaXQgdGhpcy5hY3Rpb25fZGVsZXRlX2VsZW1lbnQoZWxlbWVudCk7XG4gICAgYXdhaXQgdGhpcy5hY3Rpb25BZGRPYmplY3RGcm9tUE9JKGVsZW1lbnQsIHBvaSk7XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgQ3VwaXhcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIE1hdHRlcnBvcnRcbiAgICBodHRwczovL21hdHRlcnBvcnQuZ2l0aHViLmlvL3Nob3djYXNlLXNkay9kb2NzL3Nkay9yZWZlcmVuY2UvY3VycmVudC9tb2R1bGVzL21hdHRlcnRhZy5odG1sI2FkZFxuICAgIGh0dHBzOi8vbWF0dGVycG9ydC5naXRodWIuaW8vc2hvd2Nhc2Utc2RrL2RvY3Mvc2RrL3JlZmVyZW5jZS9jdXJyZW50L21vZHVsZXMvbWF0dGVydGFnLmh0bWwjcmVtb3ZlXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgaW5pdFRocmVlSnMoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmluaXQoY2FudmFzKTtcbiAgICAvLyBUaGUgdGFnIHBpcGVsaW5lIGlzIGdhdGVkIG9uIHRoaXMgZmxhZywgd2hpY2ggdW50aWwgbm93IG9ubHkgdGhlIE1hdHRlcnBvcnQgU0RLIHNldC4gQVxuICAgIC8vIFRocmVlLmpzIHZpc2l0IG5ldmVyIHJlYWNoZXMgdGhhdCBjb2RlLCBzbyBldmVyeSB0YWcgd2FzIGRyb3BwZWQgYmVmb3JlIGl0IGNvdWxkIGJlIGRyYXduLlxuICAgIHRoaXMuc2hvd2luZ1ZpZXdlciA9IHRydWU7XG5cbiAgICAvLyBFdmVyeXRoaW5nIHRoYXQgbG9hZHMgZGF0YSBmb3IgYSBzcGFjZSAtIHRpY2tldHMsIGVxdWlwbWVudHMsIGZlYXR1cmVzLCBtZWFzdXJlbWVudHMgLSBoYW5nc1xuICAgIC8vIG9mZiB0aGlzIGV2ZW50LCB3aGljaCBNYXR0ZXJwb3J0IHJhaXNlcyBvbmNlIGl0cyBTREsgc3RhcnRzIHBsYXlpbmcuIEEgVGhyZWUuanMgdmlzaXQgbmV2ZXJcbiAgICAvLyB0b3VjaGVzIHRoZSBTREssIHNvIG5vdGhpbmcgZXZlciBhbm5vdW5jZWQgdGhlIHNwYWNlIGFuZCBldmVyeSBsaXN0IGNhbWUgYmFjayBlbXB0eS5cbiAgICBpZiAodGhpcy5jdXJyZW50U3BhY2VJRCkge1xuICAgICAgdGhpcy52aWV3ZXJJc09uLm5leHQoe1xuICAgICAgICBzcGFjZUlEOiB0aGlzLmN1cnJlbnRTcGFjZUlELFxuICAgICAgICBtb2RlbDNEOiBudWxsLFxuICAgICAgICBzd2VlcDogbnVsbCxcbiAgICAgICAgcm90YXRpb246IG51bGwsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGF0YUlzTG9hZGVkLm5leHQodHJ1ZSk7XG4gICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYSAzRCBtb2RlbCBpbnRvIHRoZSBUaHJlZS5qcyBzY2VuZSAoR0xURikuXG4gICAqIE9ubHkgd29ya3Mgd2hlbiB0aGUgdmlld2VyIGlzIGluICd0aHJlZWpzJyBtb2RlLlxuICAgKi9cbiAgbG9hZEdMVEZNb2RlbCh1cmw6IHN0cmluZywgY2FtZXJhUG9zaXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIHJvdGF0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UubG9hZEdMVEZNb2RlbCh1cmwsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGEgR0xCIHN0b3JlZCBpbiBTMywgZ2l2ZW4gaXRzIGtleSAoZS5nLiBgdmlzaXRzLzxpZD4vbW9kZWwuZ2xiYCkuXG4gICAqXG4gICAqIFJlc29sdmVzIHRoZSBrZXkgdG8gYSBzaWduZWQgVVJMIGZpcnN0LCB0aGVuIGxvYWRzIGl0IGxpa2UgYW55IG90aGVyLiBUaGUgc2lnbmVkIFVSTCBvbmx5XG4gICAqIGNvdmVycyBhdXRoZW50aWNhdGlvbiAtIHRoZSBidWNrZXQgc3RpbGwgbmVlZHMgYSBDT1JTIHJ1bGUgYWxsb3dpbmcgR0VUIGZyb20gdGhlIGFwcCdzIG9yaWdpbixcbiAgICogb3IgdGhlIGJyb3dzZXIgYmxvY2tzIHRoZSBkb3dubG9hZCBiZWZvcmUgaXQgc3RhcnRzLlxuICAgKlxuICAgKiBgcGxhY2VtZW50TWV0YWRhdGFgIGlzIHRoZSBjYXB0dXJlJ3Mgc3RvcmVkIHBsYWNlbWVudDsgd2hlbiBhYnNlbnQgb3IgdW51c2FibGUgdGhlIHZpZXdlciBmYWxsc1xuICAgKiBiYWNrIHRvIGZyYW1pbmcgdGhlIG1vZGVsIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICBhc3luYyBsb2FkR0xURk1vZGVsRnJvbVMzKGtleTogc3RyaW5nLCBwbGFjZW1lbnRNZXRhZGF0YT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIGtleSB1bmRlciBhc3NldHMvIGlzIHNlcnZlZCBieSB0aGUgYXBwIGl0c2VsZiwgc28gaXQgbmVlZHMgbm8gc2lnbmluZy4gVGhpcyBpcyB3aGF0IGxldHMgYVxuICAgIC8vIG1vZGVsIGJ1bmRsZWQgd2l0aCB0aGUgYnVpbGQgc3RhbmQgaW4gZm9yIG9uZSBpbiBTMyB3aGlsZSB0aGUgdHdvIGFyZSBvdGhlcndpc2UgaWRlbnRpY2FsLlxuICAgIGNvbnN0IGlzTG9jYWxBc3NldCA9IGtleS5zdGFydHNXaXRoKCdhc3NldHMvJyk7XG4gICAgY29uc3QgdXJsID0gaXNMb2NhbEFzc2V0ID8ga2V5IDogYXdhaXQgZ2V0U2lnbmVkRmlsZShrZXkpO1xuICAgIGlmICghdXJsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBWaWV3ZXJTZXJ2aWNlOiBjb3VsZCBub3QgcmVzb2x2ZSBhIHNpZ25lZCBVUkwgZm9yIHRoZSAzRCBtb2RlbCBhdCBcIiR7a2V5fVwiLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwbGFjZW1lbnQgPSBwYXJzZVRocmVlSnNQbGFjZW1lbnQocGxhY2VtZW50TWV0YWRhdGEpO1xuICAgIC8vIFRoZSBrZXksIG5vdCB0aGUgc2lnbmVkIFVSTCwgaXMgd2hhdCBpZGVudGlmaWVzIHRoZSBtb2RlbCBhY3Jvc3MgbG9hZHMgLSB0aGUgc2lnbmF0dXJlIG1ha2VzXG4gICAgLy8gZXZlcnkgVVJMIHVuaXF1ZSwgd2hpY2ggaXMgZXhhY3RseSB3aHkgdGhlIGJyb3dzZXIncyBvd24gY2FjaGUgbmV2ZXIgaGVscHMgaGVyZS5cbiAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmxvYWRHTFRGTW9kZWwodXJsLCBwbGFjZW1lbnQ/LmNhbWVyYVBvc2l0aW9uLCBwbGFjZW1lbnQ/LnJvdGF0aW9uLCBrZXksIHBsYWNlbWVudD8udXApO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGEgM0QgbW9kZWwgaW50byB0aGUgVGhyZWUuanMgc2NlbmUgKE9CSikuXG4gICAqL1xuICBsb2FkT2JqTW9kZWwobXRsVXJsOiBzdHJpbmcsIG9ialVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5sb2FkT2JqTW9kZWwobXRsVXJsLCBvYmpVcmwsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRocmVlSnNPYmplY3RIb3ZlcmVkJCgpIHtcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5vYmplY3RIb3ZlcmVkJDtcbiAgfVxuXG4gIGdldCB0aHJlZUpzT2JqZWN0Q2xpY2tlZCQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2Uub2JqZWN0Q2xpY2tlZCQ7XG4gIH1cblxuICAvKiogRW1pdHMgdHJ1ZSB3aGlsZSBhIGhlYXZ5IC5vYmogZmlsZSBpcyBiZWluZyBwYXJzZWQgKGluIGEgd29ya2VyLCB3aGVuIGF2YWlsYWJsZSksIGZhbHNlIG9uY2UgZG9uZS4gKi9cbiAgZ2V0IHRocmVlSnNNb2RlbExvYWRpbmckKCkge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLm1vZGVsTG9hZGluZyQ7XG4gIH1cblxuICAvKiogRG93bmxvYWQgcHJvZ3Jlc3MgZm9yIEdMQiBtb2RlbHMgYXMgYSAwLTEgZnJhY3Rpb24sIG9yIG51bGwgd2hlbiB0aGUgc2l6ZSBpc24ndCBrbm93biB1cGZyb250LiAqL1xuICBnZXQgdGhyZWVKc01vZGVsTG9hZFByb2dyZXNzJCgpIHtcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5tb2RlbExvYWRQcm9ncmVzcyQ7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBXZWIgV29ya2VyIHVzZWQgdG8gcGFyc2UgaGVhdnkgLm9iaiBmaWxlcyBvZmYgdGhlIG1haW4gdGhyZWFkLlxuICAgKiBNdXN0IGJlIGNyZWF0ZWQgYnkgdGhlIGFwcCAoc2VlIG9iai1wYXJzZXIud29ya2VyLnRzKSwgc2luY2UgdGhpcyBsaWJyYXJ5IGNhbid0IGJ1bmRsZSB3b3JrZXIgZmlsZXMuXG4gICAqL1xuICBzZXRPYmpQYXJzZXJXb3JrZXIod29ya2VyOiBXb3JrZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnNldE9ialBhcnNlcldvcmtlcih3b3JrZXIpO1xuICB9XG5cbiAgYWRkVGhyZWVKc09iamVjdHMob2JqczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS51cGRhdGVPYmpzVG9TY2VuZShvYmpzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbml0TWF0dGVycG9ydFNkayhcbiAgICBzcGFjZUlEOiBzdHJpbmcsXG4gICAgbW9kZWwzRDogc3RyaW5nLFxuICAgIHRhZ1NlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlLFxuICAgIG1vZHVsZTogU3BNb2R1bGUgPSBTcE1vZHVsZS5JTU1PXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEEgVGhyZWUuanMgdmlzaXQgaXMgYW5ub3VuY2VkIGFzIGxvYWRlZCBieSBpbml0VGhyZWVKcywgYW5kIHdoZW4gb25lIHZpc2l0IGlzIHN3YXBwZWQgZm9yXG4gICAgLy8gYW5vdGhlciB0aGF0IGhhcyBhbHJlYWR5IGhhcHBlbmVkIGJ5IHRoZSB0aW1lIHRoaXMgcnVucy4gQ2xlYXJpbmcgdGhlIGZsYWcgaGVyZSBsZWZ0IHRoZVxuICAgIC8vIHJlc3Qgb2YgdGhlIHBhZ2UgYmVsaWV2aW5nIG5vIHZpZXdlciB3YXMgdXAgLSBcInNob3cgaW4gM0RcIiBncmV5ZWQgb3V0IG9uIGV2ZXJ5IHBhbmVsLlxuICAgIGlmICghdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmN1cnJlbnRTcGFjZUlEID0gc3BhY2VJRDtcbiAgICBpZiAodGhpcy5tYXR0ZXJwb3J0U2VydmljZS5zZGspIHtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYXJBbGwoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFNlcnZpY2VcbiAgICAgIC5pbml0U2RrKHRhZ1NlcnZpY2UsIG1vZHVsZSlcbiAgICAgIC50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IHsgc2RrIH0gPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlO1xuXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgc2RrLlNjZW5lLnJlZ2lzdGVyKHNlY3VyaXR5Q2FtZXJhVHlwZSwgbWFrZVNlY3VyaXR5Q2FtZXJhLmJpbmQoc2RrLlNjZW5lKSksXG4gICAgICAgICAgICBzZGsuU2NlbmUucmVnaXN0ZXIoVmlld0ZydXN0dW1NZXNoVHlwZSwgbWFrZVZpZXdGcnVzdHVtTWVzaC5iaW5kKHNkay5TY2VuZSkpXG4gICAgICAgICAgXSk7XG5cbiAgICAgICAgICB0aGlzLnNob3dpbmdWaWV3ZXIgPSB0cnVlO1xuXG4gICAgICAgICAgc2RrLkFwcC5zdGF0ZS5zdWJzY3JpYmUoXG4gICAgICAgICAgICBmdW5jdGlvbiAoYXBwU3RhdGUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnVGhlIGN1cnJlbnQgcGhhc2U6ICcsIGFwcFN0YXRlLnBoYXNlKTtcbiAgICAgICAgICAgICAgaWYgKGFwcFN0YXRlLnBoYXNlID09PSBzZGsuQXBwLlBoYXNlLlBMQVlJTkcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVGhlIGFwcCBpcyBwbGF5aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93aW5nVmlld2VyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdlcklzT24ubmV4dCh7XG4gICAgICAgICAgICAgICAgICBzcGFjZUlELFxuICAgICAgICAgICAgICAgICAgbW9kZWwzRCxcbiAgICAgICAgICAgICAgICAgIHN3ZWVwOiB0aGlzLnN3ZWVwVG9Nb3ZlLFxuICAgICAgICAgICAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb25Ub01vdmUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhSXNMb2FkZWQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN3ZWVwVG9Nb3ZlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdGF0aW9uVG9Nb3ZlID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRoaXMudmlld2VySXNPbi5uZXh0KHtcbiAgICAgICAgICAgIHNwYWNlSUQsXG4gICAgICAgICAgICBtb2RlbDNELFxuICAgICAgICAgICAgc3dlZXA6IHRoaXMuc3dlZXBUb01vdmUsXG4gICAgICAgICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvblRvTW92ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmRhdGFJc0xvYWRlZC5uZXh0KHRydWUpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc3dlZXBUb01vdmUgPSBudWxsO1xuICAgICAgICAgIHRoaXMucm90YXRpb25Ub01vdmUgPSBudWxsO1xuXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuICAgICAgfSk7XG4gIH1cblxuICByZW1vdmVGb3JiaWRkZW5Td2VlcHMoZm9yYmlkZGVuU3dlZXBzOiBzdHJpbmdbXSkge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnJlbW92ZUZvcmJpZGRlblN3ZWVwcyhmb3JiaWRkZW5Td2VlcHMpO1xuICAgIH1cbiAgfVxuXG4gIHNldE9iamVjdDNETG9hZGVkSW5Qb3NpdGlvbihvYmplY3RMb2FkZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzT2JqZWN0TG9hZGVkID0gb2JqZWN0TG9hZGVkO1xuICB9XG5cbiAgaXNPYmplY3QzRExvYWRlZEluUG9zaXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNPYmplY3RMb2FkZWQ7XG4gIH1cbn1cbiJdfQ==