@jax-data-science/sci-image-visualizer 0.17.0 → 0.18.1

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 (121) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +3 -2
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
  4. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
  9. package/esm2022/lib/geometry/place.mjs +47 -0
  10. package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
  11. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
  12. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
  13. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  14. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +81 -15
  15. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
  16. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +325 -18
  17. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +182 -24
  18. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
  19. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
  20. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +30 -2
  21. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
  22. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +111 -28
  23. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +14 -2
  24. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +180 -48
  25. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +28 -8
  26. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
  27. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
  28. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
  29. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
  30. package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
  31. package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
  32. package/esm2022/lib/region-source/region-tiles.mjs +1 -1
  33. package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
  34. package/esm2022/lib/routing-visualizer.service.mjs +404 -7
  35. package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
  36. package/esm2022/lib/spatial/plane-cells.mjs +119 -0
  37. package/esm2022/lib/spatial/spatial-controls.facade.mjs +298 -5
  38. package/esm2022/lib/spatial/spatial-encoding.mjs +35 -3
  39. package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
  40. package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
  41. package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
  42. package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
  43. package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
  44. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
  45. package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
  46. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +47 -12
  47. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +3 -3
  48. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +38 -10
  49. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  50. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  51. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
  52. package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
  53. package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
  54. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
  55. package/esm2022/lib/store/region-source-scope.mjs +10 -1
  56. package/esm2022/lib/store/region-store.service.mjs +33 -2
  57. package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
  58. package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
  59. package/esm2022/lib/visualizer.component.mjs +40 -4
  60. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-YrNqv8wH.mjs} +4521 -759
  61. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-YrNqv8wH.mjs.map +1 -0
  62. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-Dph35S7m.mjs} +2 -2
  63. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-Dph35S7m.mjs.map} +1 -1
  64. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  65. package/fesm2022/region-source.worker.js +84 -2
  66. package/lib/contracts/display-types.d.ts +90 -4
  67. package/lib/contracts/image.contract.d.ts +6 -0
  68. package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
  69. package/lib/contracts/region-editor-api.contract.d.ts +9 -0
  70. package/lib/contracts/region-store.contract.d.ts +6 -0
  71. package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
  72. package/lib/contracts/visualizer.contract.d.ts +43 -1
  73. package/lib/geometry/cell-meshes.d.ts +27 -0
  74. package/lib/geometry/place.d.ts +45 -0
  75. package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
  76. package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
  77. package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
  78. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
  79. package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
  80. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +87 -0
  81. package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +49 -8
  82. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
  83. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
  84. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +15 -0
  85. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
  86. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +38 -19
  87. package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
  88. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +53 -0
  89. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
  90. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
  91. package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
  92. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
  93. package/lib/region-editor/region-editor.component.d.ts +4 -0
  94. package/lib/region-source/region-source-ops.d.ts +12 -0
  95. package/lib/region-source/region-tiles.d.ts +8 -0
  96. package/lib/region-source/worker-region-source.d.ts +18 -0
  97. package/lib/routing-visualizer.service.d.ts +140 -1
  98. package/lib/spatial/observations-in-selection.d.ts +43 -0
  99. package/lib/spatial/plane-cells.d.ts +37 -0
  100. package/lib/spatial/spatial-controls.facade.d.ts +59 -0
  101. package/lib/spatial/spatial-encoding.d.ts +14 -1
  102. package/lib/spatial/spatial-hover.d.ts +23 -0
  103. package/lib/spatial/spatial-planes.d.ts +22 -0
  104. package/lib/spatial/spatial-selection.d.ts +2 -1
  105. package/lib/spatial/spatial-tile-merge.d.ts +9 -0
  106. package/lib/spatial/transcripts-in-selection.d.ts +95 -0
  107. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
  108. package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
  109. package/lib/spatial-controls/spatial-controls.component.d.ts +17 -2
  110. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +16 -6
  111. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
  112. package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
  113. package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
  114. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
  115. package/lib/store/region-source-scope.d.ts +4 -0
  116. package/lib/store/region-store.service.d.ts +21 -0
  117. package/lib/toolbar/toolbar.component.d.ts +6 -1
  118. package/lib/visualizer/spatial-region-set.d.ts +55 -0
  119. package/lib/visualizer.component.d.ts +14 -0
  120. package/package.json +1 -1
  121. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +0 -1
@@ -1,11 +1,11 @@
1
1
  import { pointSymbolCode } from 'napari-js';
2
2
  import { ALL_GENES } from '../../../contracts/ports/spatial-data.port';
3
3
  import { NO_CATEGORY, NO_OBSERVATION, } from '../../../contracts/spatial-dataset.contract';
4
- import { DEFAULT_CATEGORICAL_PALETTE, categoryColorsFor, groupColorsKey, parseHex, } from '../../../spatial/spatial-encoding';
4
+ import { DEFAULT_CATEGORICAL_PALETTE, categoryColorsFor, fadeOutsideSelection, groupColorsKey, parseHex, } from '../../../spatial/spatial-encoding';
5
5
  import { cellTypeColumnFor } from '../../../spatial/lod';
6
6
  import { clusterColorMap } from '../../../spatial/transcript-grouping';
7
7
  import { defaultGlyphFor } from '../../../spatial/glyphs';
8
- import { filterTranscripts, hiddenAllGeneCodes, hiddenGeneSlots, median, } from '../../../spatial/spatial-tile-merge';
8
+ import { filterTranscripts, hiddenAllGeneCodes, hiddenGeneSlots, median, transcriptsInBand, } from '../../../spatial/spatial-tile-merge';
9
9
  import { geneFilterKey, hasGeneFilter } from '../../../spatial/spatial-gene-filter';
10
10
  import { groupSelection } from './transcript-jobs';
11
11
  /** Icons get a dark rim only while there are at most this many, at least this big (px). */
@@ -39,9 +39,11 @@ const GLYPH_SIZE = { square: 0.8 };
39
39
  * What a transcript plan draws, as a key: an unchanged one is a no-op. Marker sizes follow the
40
40
  * zoom, so the zoom is part of it; a pan that keeps the same tiles on screen changes nothing.
41
41
  */
42
- function transcriptPlanKey(dataset, view, job, pxPerUnit) {
42
+ function transcriptPlanKey(dataset, view, job, pxPerUnit, zBand, selectionRev) {
43
43
  return [
44
+ selectionRev,
44
45
  dataset.id,
46
+ zBand ? zBand.join(',') : '',
45
47
  view.transcriptMode,
46
48
  job.key,
47
49
  view.transcriptColorBy,
@@ -93,6 +95,9 @@ export class TranscriptLayers {
93
95
  this.hover = hover;
94
96
  /** The loaded per-gene transcripts the in-view counts are taken from. */
95
97
  this.countSource = null;
98
+ /** The selection the last plan faded by, and its revision, bumped each time it changes. */
99
+ this.lastSelection = null;
100
+ this.selectionRevision = 0;
96
101
  }
97
102
  /**
98
103
  * Transcripts of each selected gene inside `rect`: each entry counts for the transcripts it
@@ -119,8 +124,12 @@ export class TranscriptLayers {
119
124
  detached() {
120
125
  this.countSource = null;
121
126
  }
122
- /** Draw the view's transcript markers (or drop them); an unchanged plan key is a no-op. */
123
- async plan(dataset, view, rect, pxPerUnit, ctx) {
127
+ /**
128
+ * Draw the view's transcript markers (or drop them); an unchanged plan key is a no-op. With a
129
+ * `zBand`, the view shows one plane of a 3D assay: only the transcripts at that depth are drawn
130
+ * (summed density grids and aggregates, which mix depths, stay whole).
131
+ */
132
+ async plan(dataset, view, rect, pxPerUnit, ctx, zBand = null, selection = null) {
124
133
  const mode = view.transcriptMode;
125
134
  const job = this.jobs.jobFor(dataset, view, rect, pxPerUnit);
126
135
  if (!job) {
@@ -129,7 +138,7 @@ export class TranscriptLayers {
129
138
  this.countSource = null;
130
139
  return;
131
140
  }
132
- const planKey = transcriptPlanKey(dataset, view, job, pxPerUnit);
141
+ const planKey = transcriptPlanKey(dataset, view, job, pxPerUnit, zBand, this.selectionRev(selection));
133
142
  if (planKey === this.groups.key('transcripts') && this.groups.shown('transcripts')) {
134
143
  return;
135
144
  }
@@ -168,7 +177,7 @@ export class TranscriptLayers {
168
177
  : kind === 'individual'
169
178
  ? hiddenAllGeneCodes(view, allGeneNames)
170
179
  : null);
171
- let { merged, px } = filtered;
180
+ let { merged, px } = loaded.clustered || !zBand ? filtered : transcriptsInBand(filtered.merged, filtered.px, zBand);
172
181
  let selectionBin = loaded.clustered?.bin ?? null;
173
182
  let entryGroup = loaded.clustered?.group ?? null;
174
183
  let groupNames = loaded.clustered?.names ?? null;
@@ -182,6 +191,9 @@ export class TranscriptLayers {
182
191
  const geneCluster = view.transcriptGenes.map((g) => view.transcriptGeneGroups.find((x) => x.genes.includes(g))?.name ?? g);
183
192
  const clusterOf = (i) => entryGroup && groupNames ? (groupNames[entryGroup[i]] ?? null) : (geneCluster[merged.gene[i]] ?? null);
184
193
  const rgba = await this.transcriptColors(dataset, colorView, merged, kind === 'genes' ? clusterOf : undefined);
194
+ // A selected cell or cell type: its transcripts as they are, the others faded, as the cells are.
195
+ // Density-grid markers carry no cells, so they all fade.
196
+ fadeOutsideSelection(rgba, merged.count, (i) => (loaded.clustered ? -1 : merged.observation[i]), selection);
185
197
  const typeColumn = cellTypeColumnFor(dataset, view);
186
198
  const types = typeColumn ? await this.lookup.codes(typeColumn).catch(() => null) : null;
187
199
  // Nothing is recorded before the last await: a superseded plan that had already keyed the
@@ -267,6 +279,14 @@ export class TranscriptLayers {
267
279
  this.groups.replace('transcripts', layer);
268
280
  return layer;
269
281
  }
282
+ selectionRev(selection) {
283
+ const live = selection && selection.count > 0 ? selection : null;
284
+ if (live !== this.lastSelection) {
285
+ this.lastSelection = live;
286
+ this.selectionRevision++;
287
+ }
288
+ return this.selectionRevision;
289
+ }
270
290
  /** Per-entry colours, as packed RGBA. */
271
291
  async transcriptColors(dataset, view, t, clusterOf) {
272
292
  let rgb;
@@ -334,4 +354,4 @@ export class TranscriptLayers {
334
354
  return rgba;
335
355
  }
336
356
  }
337
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNjcmlwdC1sYXllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvc3BhdGlhbC10aWxlcy90cmFuc2NyaXB0LWxheWVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSTVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUV2RSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGNBQWMsR0FHZixNQUFNLDZDQUE2QyxDQUFDO0FBQ3JELE9BQU8sRUFDTCwyQkFBMkIsRUFDM0IsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxRQUFRLEdBQ1QsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQVksaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFtQixlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsTUFBTSxHQUNQLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUtwRixPQUFPLEVBQWlELGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxHLDJGQUEyRjtBQUMzRixNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztBQUNqQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUUvQixnQ0FBZ0M7QUFDaEMsTUFBTSxTQUFTLEdBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUVoRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1B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QUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBvaW50U3ltYm9sQ29kZSB9IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgdHlwZSB7IFBvaW50U3ltYm9sLCBQb2ludHNMYXllciwgUkdCQSB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB0eXBlIHsgUmdiIH0gZnJvbSAnLi4vLi4vLi4vY29udHJhY3RzL2NvbG9ybWFwLWx1dCc7XG5pbXBvcnQgeyBBTExfR0VORVMgfSBmcm9tICcuLi8uLi8uLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsVmlld1N0YXRlIH0gZnJvbSAnLi4vLi4vLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHtcbiAgTk9fQ0FURUdPUlksXG4gIE5PX09CU0VSVkFUSU9OLFxuICBTcGF0aWFsRGF0YXNldCxcbiAgU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxufSBmcm9tICcuLi8uLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURSxcbiAgY2F0ZWdvcnlDb2xvcnNGb3IsXG4gIGdyb3VwQ29sb3JzS2V5LFxuICBwYXJzZUhleCxcbn0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IERhdGFSZWN0LCBjZWxsVHlwZUNvbHVtbkZvciB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvbG9kJztcbmltcG9ydCB7IGNsdXN0ZXJDb2xvck1hcCB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvdHJhbnNjcmlwdC1ncm91cGluZyc7XG5pbXBvcnQgeyBUcmFuc2NyaXB0R2x5cGgsIGRlZmF1bHRHbHlwaEZvciB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvZ2x5cGhzJztcbmltcG9ydCB7XG4gIGZpbHRlclRyYW5zY3JpcHRzLFxuICBoaWRkZW5BbGxHZW5lQ29kZXMsXG4gIGhpZGRlbkdlbmVTbG90cyxcbiAgbWVkaWFuLFxufSBmcm9tICcuLi8uLi8uLi9zcGF0aWFsL3NwYXRpYWwtdGlsZS1tZXJnZSc7XG5pbXBvcnQgeyBnZW5lRmlsdGVyS2V5LCBoYXNHZW5lRmlsdGVyIH0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWdlbmUtZmlsdGVyJztcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcmljYWxMb29rdXAgfSBmcm9tICcuL2NhdGVnb3JpY2FsLWxvb2t1cCc7XG5pbXBvcnQgdHlwZSB7IE9yZGVyZWRMYXllckdyb3VwcywgVGlsZUdyb3VwIH0gZnJvbSAnLi9sYXllci1ncm91cHMnO1xuaW1wb3J0IHR5cGUgeyBQbGFuQ29udGV4dCB9IGZyb20gJy4vcGxhbi1jb250ZXh0JztcbmltcG9ydCB0eXBlIHsgVHJhbnNjcmlwdEhvdmVyLCBUcmFuc2NyaXB0S2luZCB9IGZyb20gJy4vdHJhbnNjcmlwdC1ob3Zlcic7XG5pbXBvcnQgeyB0eXBlIFRyYW5zY3JpcHRKb2IsIHR5cGUgVHJhbnNjcmlwdEpvYlBsYW5uZXIsIGdyb3VwU2VsZWN0aW9uIH0gZnJvbSAnLi90cmFuc2NyaXB0LWpvYnMnO1xuXG4vKiogSWNvbnMgZ2V0IGEgZGFyayByaW0gb25seSB3aGlsZSB0aGVyZSBhcmUgYXQgbW9zdCB0aGlzIG1hbnksIGF0IGxlYXN0IHRoaXMgYmlnIChweCkuICovXG5jb25zdCBHTFlQSF9PVVRMSU5FX01BWCA9IDIwXzAwMDtcbmNvbnN0IEdMWVBIX09VVExJTkVfTUlOX1BYID0gODtcblxuLyoqIFRoZSBkYXJrIHJpbSBvZiBhIG1hcmtlci4gKi9cbmNvbnN0IFJJTV9DT0xPUjogUkdCQSA9IFswLjA0LCAwLjA0LCAwLjA1LCAwLjldO1xuXG4vKipcbiAqIFRoZSBuYXBhcmktanMgcG9pbnQgc3ltYm9sIGVhY2ggdHJhbnNjcmlwdCBpY29uIGlzIGRyYXduIGFzLiBFdmVyeSBpY29uIGhhcyBhIGNvdW50ZXJwYXJ0IG9mXG4gKiB0aGUgc2FtZSBvdXRsaW5lIChgY2lyY2xlYCBpcyBuYXBhcmkncyBgZGlzY2ApOyBzZWUge0BsaW5rIEdMWVBIX1NJWkV9IGZvciB0aGUgb25lIHdob3NlIHNpemVcbiAqIGRpZmZlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBHTFlQSF9TWU1CT0xTOiBSZWFkb25seTxSZWNvcmQ8VHJhbnNjcmlwdEdseXBoLCBQb2ludFN5bWJvbD4+ID0ge1xuICBjaXJjbGU6ICdkaXNjJyxcbiAgc3RhcjogJ3N0YXInLFxuICB0cmlhbmdsZTogJ3RyaWFuZ2xlX3VwJyxcbiAgc3F1YXJlOiAnc3F1YXJlJyxcbiAgZGlhbW9uZDogJ2RpYW1vbmQnLFxuICBjcm9zczogJ2Nyb3NzJyxcbiAgaGV4YWdvbjogJ2hleGFnb24nLFxuICAndHJpYW5nbGUtZG93bic6ICd0cmlhbmdsZV9kb3duJyxcbiAgcGVudGFnb246ICdwZW50YWdvbicsXG4gIHg6ICd4Jyxcbn07XG5cbi8qKlxuICogTWFya2VyIGRpYW1ldGVyIHBlciBpY29uLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBlbnRyeSdzOiBuYXBhcmkncyBgc3F1YXJlYCBmaWxscyB0aGUgbWFya2VyJ3NcbiAqIHdob2xlIGJveCwgd2hlcmUgdGhlIGljb24gaXQgcmVwbGFjZXMgaGFkIGEgMC44IGhhbGYtc2lkZSwgYXMgaGVhdnkgYXMgdGhlIG90aGVyIGljb25zLlxuICovXG5jb25zdCBHTFlQSF9TSVpFOiBSZWFkb25seTxQYXJ0aWFsPFJlY29yZDxUcmFuc2NyaXB0R2x5cGgsIG51bWJlcj4+PiA9IHsgc3F1YXJlOiAwLjggfTtcblxuLyoqXG4gKiBXaGF0IGEgdHJhbnNjcmlwdCBwbGFuIGRyYXdzLCBhcyBhIGtleTogYW4gdW5jaGFuZ2VkIG9uZSBpcyBhIG5vLW9wLiBNYXJrZXIgc2l6ZXMgZm9sbG93IHRoZVxuICogem9vbSwgc28gdGhlIHpvb20gaXMgcGFydCBvZiBpdDsgYSBwYW4gdGhhdCBrZWVwcyB0aGUgc2FtZSB0aWxlcyBvbiBzY3JlZW4gY2hhbmdlcyBub3RoaW5nLlxuICovXG5mdW5jdGlvbiB0cmFuc2NyaXB0UGxhbktleShcbiAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gIGpvYjogVHJhbnNjcmlwdEpvYixcbiAgcHhQZXJVbml0OiBudW1iZXIsXG4pOiBzdHJpbmcge1xuICByZXR1cm4gW1xuICAgIGRhdGFzZXQuaWQsXG4gICAgdmlldy50cmFuc2NyaXB0TW9kZSxcbiAgICBqb2Iua2V5LFxuICAgIHZpZXcudHJhbnNjcmlwdENvbG9yQnksXG4gICAgY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldyksXG4gICAgdmlldy50cmFuc2NyaXB0U2NhbGUsXG4gICAgdmlldy50cmFuc2NyaXB0T3BhY2l0eSxcbiAgICBKU09OLnN0cmluZ2lmeSh2aWV3LnRyYW5zY3JpcHRHbHlwaHMpLFxuICAgIHB4UGVyVW5pdC50b1ByZWNpc2lvbig0KSxcbiAgICB2aWV3LmhpZGRlbkdyb3Vwcy5qb2luKCdcXHUwMDAxJyksXG4gICAgZ2VuZUZpbHRlcktleSh2aWV3KSxcbiAgICB2aWV3LnRyYW5zY3JpcHRIaWRkZW5HZW5lcy5qb2luKCcsJyksXG4gICAgdmlldy50cmFuc2NyaXB0QWxsR2VuZXNIaWRkZW4uam9pbignLCcpLFxuICAgIEpTT04uc3RyaW5naWZ5KHZpZXcudHJhbnNjcmlwdEdlbmVDb2xvcnMpLFxuICAgIEpTT04uc3RyaW5naWZ5KHZpZXcudHJhbnNjcmlwdEdlbmVHcm91cHMpLFxuICAgIGdyb3VwQ29sb3JzS2V5KGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpLCB2aWV3Lmdyb3VwQ29sb3JzKSxcbiAgXS5qb2luKCd8Jyk7XG59XG5cbi8qKiBUaGUgdmlldyB0aGUgbWFya2VycyBhcmUgY29sb3VyZWQgYnksIGZvciB3aGF0IHdhcyBsb2FkZWQuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JWaWV3Rm9yKFxuICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICBraW5kOiBUcmFuc2NyaXB0S2luZCxcbiAgY2x1c3RlcmVkOiBib29sZWFuLFxuICBoYXNDZWxsVHlwZXM6IGJvb2xlYW4sXG4pOiBTcGF0aWFsVmlld1N0YXRlIHtcbiAgLy8gQSBiaW4gb2YgdGhlIGFsbC1nZW5lIHB5cmFtaWQgbWl4ZXMgZ2VuZXMgYW5kIGNhcnJpZXMgbm9uZSwgc28gaXQgY2Fubm90IGJlIGNvbG91cmVkXG4gIC8vIGJ5IGdlbmU6IGNvbG91ciBpdCBieSBpdHMgZG9taW5hbnQgY2VsbCdzIHR5cGUgdW50aWwgaW5kaXZpZHVhbCB0cmFuc2NyaXB0cyBzaG93ICh3aXRoXG4gIC8vIG5vIGNlbGwgdHlwZXMsIHRoYXQgbGVhdmVzIGV2ZXJ5IGJpbiB1bmFzc2lnbmVkOiBvbmUgY29sb3VyKS5cbiAgaWYgKGtpbmQgPT09ICdiaW5zJyAmJiB2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ICE9PSAnY2VsbFR5cGUnKSByZXR1cm4geyAuLi52aWV3LCB0cmFuc2NyaXB0Q29sb3JCeTogJ2NlbGxUeXBlJyB9O1xuICAvLyBEZW5zaXR5LWdyaWQgbWFya2VycyBoYXZlIG5vIGNlbGwgdG8gdGFrZSBhIHR5cGUgZnJvbTogdGhleSB0YWtlIHRoZWlyIGNsdXN0ZXIncyBjb2xvdXIuXG4gIGlmIChjbHVzdGVyZWQgJiYgdmlldy50cmFuc2NyaXB0Q29sb3JCeSA9PT0gJ2NlbGxUeXBlJykgcmV0dXJuIHsgLi4udmlldywgdHJhbnNjcmlwdENvbG9yQnk6ICdjbHVzdGVyJyB9O1xuICAvLyBObyBjZWxsIHR5cGVzIHRvIGNvbG91ciBieSAodGhlIHBhbmVsIHRoZW4gZG9lcyBub3Qgb2ZmZXIgaXQpOiBieSBnZW5lIGluc3RlYWQuXG4gIGlmICghaGFzQ2VsbFR5cGVzICYmIGtpbmQgIT09ICdiaW5zJyAmJiB2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ID09PSAnY2VsbFR5cGUnKSB7XG4gICAgcmV0dXJuIHsgLi4udmlldywgdHJhbnNjcmlwdENvbG9yQnk6ICdnZW5lJyB9O1xuICB9XG4gIHJldHVybiB2aWV3O1xufVxuXG4vKiogV2hlcmUgYSBsYXllciBzaXRzIGluIHdvcmxkIHNwYWNlOiB0aGUgZGF0YXNldCdzIGFmZmluZSBvbnRvIGl0cyB0aXNzdWUgaW1hZ2UuICovXG5pbnRlcmZhY2UgUGxhY2VtZW50IHtcbiAgc2NhbGU6IFtudW1iZXIsIG51bWJlcl07XG4gIHRyYW5zbGF0ZTogW251bWJlciwgbnVtYmVyXTtcbn1cblxuY29uc3QgVU5BU1NJR05FRF9SR0JBOiBSR0JBID0gWzAuNjIsIDAuNjIsIDAuNjIsIDAuNTVdO1xuXG4vKipcbiAqIFRoZSB0cmFuc2NyaXB0IG1hcmtlcnMgb2YgdGhlIDJEIHNwYXRpYWwgdmlldzogcnVucyB0aGUgcGxhbm5lcidzIGpvYiwgZHJvcHMgaGlkZGVuIGdyb3Vwc1xuICogYW5kIGdlbmVzLCBncm91cHMgYSBzZWxlY3Rpb24gdW5kZXIgdGhlIG1hcmtlciBidWRnZXQsIGNvbG91cnMgdGhlIGVudHJpZXMgYW5kIGRyYXdzIHRoZW0gYXNcbiAqIG9uZSBwb2ludHMgbGF5ZXI6IHNpemVkIGNpcmNsZXMsIG9yIGdlbmUgaWNvbnMgYXMgcGVyLXBvaW50IHN5bWJvbHMgKHdpdGggYSBkYXJrIHJpbSB3aGlsZVxuICogdGhlcmUgYXJlIGZldyBlbm91Z2gpLlxuICpcbiAqIEhhbmRzIHdoYXQgaXQgZHJldyB0byB0aGUgaG92ZXIgb25lIHdheSAoe0BsaW5rIFRyYW5zY3JpcHRIb3Zlci5zZXREcmF3bn0pLCBhbmQga2VlcHMgdGhlXG4gKiBsb2FkZWQgcGVyLWdlbmUgdHJhbnNjcmlwdHMgdGhlIGluLXZpZXcgZ2VuZSBjb3VudHMgYXJlIHRha2VuIGZyb20uXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2NyaXB0TGF5ZXJzIHtcbiAgLyoqIFRoZSBsb2FkZWQgcGVyLWdlbmUgdHJhbnNjcmlwdHMgdGhlIGluLXZpZXcgY291bnRzIGFyZSB0YWtlbiBmcm9tLiAqL1xuICBwcml2YXRlIGNvdW50U291cmNlOiB7IG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlOyBnZW5lczogc3RyaW5nW10gfSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZ3JvdXBzOiBPcmRlcmVkTGF5ZXJHcm91cHM8VGlsZUdyb3VwPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGpvYnM6IFRyYW5zY3JpcHRKb2JQbGFubmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9va3VwOiBDYXRlZ29yaWNhbExvb2t1cCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvdmVyOiBUcmFuc2NyaXB0SG92ZXIsXG4gICkge31cblxuICAvKipcbiAgICogVHJhbnNjcmlwdHMgb2YgZWFjaCBzZWxlY3RlZCBnZW5lIGluc2lkZSBgcmVjdGA6IGVhY2ggZW50cnkgY291bnRzIGZvciB0aGUgdHJhbnNjcmlwdHMgaXRcbiAgICogc3RhbmRzIGZvciAoYW4gYWdncmVnYXRlIGF0IGEgY29hcnNlIGxldmVsIGhvbGRzIHNldmVyYWwpLiBOdWxsIHdpdGhvdXQgcGVyLWdlbmUgZGF0YS5cbiAgICovXG4gIGdlbmVDb3VudHNJbihyZWN0OiBEYXRhUmVjdCk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsIHtcbiAgICBjb25zdCBzcmMgPSB0aGlzLmNvdW50U291cmNlO1xuICAgIGlmICghc3JjKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGcgb2Ygc3JjLmdlbmVzKSBvdXRbZ10gPSAwO1xuICAgIGNvbnN0IHsgeCwgeSwgd2VpZ2h0LCBnZW5lIH0gPSBzcmMubWVyZ2VkO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3JjLm1lcmdlZC5jb3VudDsgaSsrKSB7XG4gICAgICBpZiAoeFtpXSA8IHJlY3QueDAgfHwgeFtpXSA+IHJlY3QueDEgfHwgeVtpXSA8IHJlY3QueTAgfHwgeVtpXSA+IHJlY3QueTEpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmFtZSA9IHNyYy5nZW5lc1tnZW5lW2ldXTtcbiAgICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIG91dFtuYW1lXSArPSB3ZWlnaHRbaV07XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogVGhlIHZpZXdlciB3ZW50IGF3YXk6IG5vIGNvdW50cyB1bnRpbCB0aGUgbmV4dCBwbGFuLiAqL1xuICBkZXRhY2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvdW50U291cmNlID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBEcmF3IHRoZSB2aWV3J3MgdHJhbnNjcmlwdCBtYXJrZXJzIChvciBkcm9wIHRoZW0pOyBhbiB1bmNoYW5nZWQgcGxhbiBrZXkgaXMgYSBuby1vcC4gKi9cbiAgYXN5bmMgcGxhbihcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHJlY3Q6IERhdGFSZWN0LFxuICAgIHB4UGVyVW5pdDogbnVtYmVyLFxuICAgIGN0eDogUGxhbkNvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1vZGUgPSB2aWV3LnRyYW5zY3JpcHRNb2RlO1xuICAgIGNvbnN0IGpvYiA9IHRoaXMuam9icy5qb2JGb3IoZGF0YXNldCwgdmlldywgcmVjdCwgcHhQZXJVbml0KTtcbiAgICBpZiAoIWpvYikge1xuICAgICAgdGhpcy5ncm91cHMuZHJvcCgndHJhbnNjcmlwdHMnKTtcbiAgICAgIHRoaXMuaG92ZXIuY2xlYXIoKTtcbiAgICAgIHRoaXMuY291bnRTb3VyY2UgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwbGFuS2V5ID0gdHJhbnNjcmlwdFBsYW5LZXkoZGF0YXNldCwgdmlldywgam9iLCBweFBlclVuaXQpO1xuICAgIGlmIChwbGFuS2V5ID09PSB0aGlzLmdyb3Vwcy5rZXkoJ3RyYW5zY3JpcHRzJykgJiYgdGhpcy5ncm91cHMuc2hvd24oJ3RyYW5zY3JpcHRzJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgY3R4LnRyYWNrKCdUcmFuc2NyaXB0cycsIGpvYi5sb2FkKGN0eCkpO1xuICAgIGlmIChjdHguc3RhbGUoKSkgcmV0dXJuO1xuICAgIC8vIE1hcmtlcnMgZHJhd24gZnJvbSBzdW1tZWQgZGVuc2l0eSBncmlkcyAoem9vbWVkIG91dCkgY2Fycnkgbm8gY2VsbHMsIHNvIHRoZXkgY2Fubm90IGZvbGxvd1xuICAgIC8vIHRoZSBvYnNlcnZhdGlvbiBnZW5lIGZpbHRlcjogZHJhd24sIHRoZXkgd291bGQgc2hvdyB0aGUgdHJhbnNjcmlwdHMgb2YgdGhlIGNlbGxzIGl0IGhpZGVzLlxuICAgIC8vIE5vbmUgd2hpbGUgaXQgaXMgb247IHpvb21lZCBpbiwgdGhlIGNlbGwtYXNzaWduZWQgdHJhbnNjcmlwdHMgYXJlIGZpbHRlcmVkIChiZWxvdykuXG4gICAgaWYgKGxvYWRlZC5jbHVzdGVyZWQgJiYgaGFzR2VuZUZpbHRlcih2aWV3KSkge1xuICAgICAgdGhpcy5ncm91cHMuZHJvcCgndHJhbnNjcmlwdHMnKTtcbiAgICAgIHRoaXMuaG92ZXIuY2xlYXIoKTtcbiAgICAgIHRoaXMuY291bnRTb3VyY2UgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBQZXItZ2VuZSBjb3VudHMgaW4gdmlldyBjb21lIGZyb20gd2hhdCB3YXMgbG9hZGVkLCBiZWZvcmUgaGlkZGVuIGdlbmVzIGFyZSBkcm9wcGVkOlxuICAgIC8vIGEgaGlkZGVuIGdlbmUgc3RpbGwgaGFzIHRyYW5zY3JpcHRzIHRoZXJlLiBTdW1tZWQgZGVuc2l0eSBncmlkcyAobm8gcGVyLWdlbmUgbGV2ZWxzLFxuICAgIC8vIHpvb21lZCBvdXQpIGhvbGQgY2x1c3RlcnMsIG5vdCBnZW5lczogbm8gcGVyLWdlbmUgY291bnRzIHRoZXJlLCByYXRoZXIgdGhhbiBhIGd1ZXNzLlxuICAgIC8vIEV2ZXJ5IGdlbmUncyBpbmRpdmlkdWFsIHRyYW5zY3JpcHRzIGFyZSBjb3VudGVkIGJ5IHRoZSBkYXRhc2V0J3MgZ2VuZSBsaXN0LCB3aGVuIGl0IGhhcyBvbmUuXG4gICAgY29uc3QgYWxsR2VuZU5hbWVzID0gZGF0YXNldC50cmFuc2NyaXB0VGlsZXM/LmdlbmVzO1xuICAgIGNvbnN0IGtpbmQgPSBsb2FkZWQua2luZCA/PyBqb2Iua2luZDtcbiAgICB0aGlzLmNvdW50U291cmNlID1cbiAgICAgIGtpbmQgPT09ICdnZW5lcycgJiYgIWxvYWRlZC5jbHVzdGVyZWRcbiAgICAgICAgPyB7IG1lcmdlZDogbG9hZGVkLm1lcmdlZCwgZ2VuZXM6IFsuLi52aWV3LnRyYW5zY3JpcHRHZW5lc10gfVxuICAgICAgICA6IGtpbmQgPT09ICdpbmRpdmlkdWFsJyAmJiBhbGxHZW5lTmFtZXNcbiAgICAgICAgICA/IHsgbWVyZ2VkOiBsb2FkZWQubWVyZ2VkLCBnZW5lczogYWxsR2VuZU5hbWVzIH1cbiAgICAgICAgICA6IG51bGw7XG4gICAgY29uc3QgaGlkZGVuID0gYXdhaXQgdGhpcy5sb29rdXAuaGlkZGVuQ29kZXMoZGF0YXNldCwgdmlldyk7XG4gICAgaWYgKGN0eC5zdGFsZSgpKSByZXR1cm47XG4gICAgLy8gRGVuc2l0eS1ncmlkIG1hcmtlcnMgY2Fycnkgbm8gY2VsbHMgYW5kIHdlcmUgYnVpbHQgZnJvbSB0aGUgdmlzaWJsZSBnZW5lcyBvbmx5LlxuICAgIGNvbnN0IGZpbHRlcmVkID0gbG9hZGVkLmNsdXN0ZXJlZFxuICAgICAgPyB7IG1lcmdlZDogbG9hZGVkLm1lcmdlZCwgcHg6IGxvYWRlZC5weCB9XG4gICAgICA6IGZpbHRlclRyYW5zY3JpcHRzKFxuICAgICAgICAgIGxvYWRlZC5tZXJnZWQsXG4gICAgICAgICAgbG9hZGVkLnB4LFxuICAgICAgICAgIGhpZGRlbixcbiAgICAgICAgICBraW5kID09PSAnZ2VuZXMnXG4gICAgICAgICAgICA/IGhpZGRlbkdlbmVTbG90cyh2aWV3KVxuICAgICAgICAgICAgOiBraW5kID09PSAnaW5kaXZpZHVhbCdcbiAgICAgICAgICAgICAgPyBoaWRkZW5BbGxHZW5lQ29kZXModmlldywgYWxsR2VuZU5hbWVzKVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICk7XG4gICAgbGV0IHsgbWVyZ2VkLCBweCB9ID0gZmlsdGVyZWQ7XG4gICAgbGV0IHNlbGVjdGlvbkJpbjogbnVtYmVyIHwgbnVsbCA9IGxvYWRlZC5jbHVzdGVyZWQ/LmJpbiA/PyBudWxsO1xuICAgIGxldCBlbnRyeUdyb3VwOiBJbnQzMkFycmF5IHwgbnVsbCA9IGxvYWRlZC5jbHVzdGVyZWQ/Lmdyb3VwID8/IG51bGw7XG4gICAgbGV0IGdyb3VwTmFtZXM6IHN0cmluZ1tdIHwgbnVsbCA9IGxvYWRlZC5jbHVzdGVyZWQ/Lm5hbWVzID8/IG51bGw7XG4gICAgaWYgKGxvYWRlZC5sYWRkZXIpIHtcbiAgICAgIGNvbnN0IGcgPSBncm91cFNlbGVjdGlvbihtZXJnZWQsIHZpZXcsIGxvYWRlZC5sYWRkZXIsIHB4UGVyVW5pdCk7XG4gICAgICBpZiAoZykgKHsgbWVyZ2VkLCBweCwgYmluOiBzZWxlY3Rpb25CaW4sIGdyb3VwOiBlbnRyeUdyb3VwLCBuYW1lczogZ3JvdXBOYW1lcyB9ID0gZyk7XG4gICAgfVxuICAgIGNvbnN0IGNvbG9yVmlldyA9IGNvbG9yVmlld0Zvcih2aWV3LCBraW5kLCAhIWxvYWRlZC5jbHVzdGVyZWQsIGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpICE9PSBudWxsKTtcbiAgICAvLyBFYWNoIGVudHJ5J3MgY2x1c3RlcjogaXRzIG1hcmtlcidzIGdyb3VwLCBvciB0aGUgZ2VuZS10cmVlIGdyb3VwIGl0cyBnZW5lIGlzIGluLlxuICAgIGNvbnN0IGdlbmVDbHVzdGVyID0gdmlldy50cmFuc2NyaXB0R2VuZXMubWFwKFxuICAgICAgKGcpID0+IHZpZXcudHJhbnNjcmlwdEdlbmVHcm91cHMuZmluZCgoeCkgPT4geC5nZW5lcy5pbmNsdWRlcyhnKSk/Lm5hbWUgPz8gZyxcbiAgICApO1xuICAgIGNvbnN0IGNsdXN0ZXJPZiA9IChpOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsID0+XG4gICAgICBlbnRyeUdyb3VwICYmIGdyb3VwTmFtZXMgPyAoZ3JvdXBOYW1lc1tlbnRyeUdyb3VwW2ldXSA/PyBudWxsKSA6IChnZW5lQ2x1c3RlclttZXJnZWQuZ2VuZVtpXV0gPz8gbnVsbCk7XG4gICAgY29uc3QgcmdiYSA9IGF3YWl0IHRoaXMudHJhbnNjcmlwdENvbG9ycyhkYXRhc2V0LCBjb2xvclZpZXcsIG1lcmdlZCwga2luZCA9PT0gJ2dlbmVzJyA/IGNsdXN0ZXJPZiA6IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgdHlwZUNvbHVtbiA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgIGNvbnN0IHR5cGVzID0gdHlwZUNvbHVtbiA/IGF3YWl0IHRoaXMubG9va3VwLmNvZGVzKHR5cGVDb2x1bW4pLmNhdGNoKCgpID0+IG51bGwpIDogbnVsbDtcbiAgICAvLyBOb3RoaW5nIGlzIHJlY29yZGVkIGJlZm9yZSB0aGUgbGFzdCBhd2FpdDogYSBzdXBlcnNlZGVkIHBsYW4gdGhhdCBoYWQgYWxyZWFkeSBrZXllZCB0aGVcbiAgICAvLyBncm91cCB3b3VsZCBtYWtlIHRoZSBuZXdlciBwbGFuIG9mIHRoZSBzYW1lIHZpZXcgdGFrZSB0aGUgb2xkIGxheWVyIGZvciBpdHMgb3duLlxuICAgIGlmIChjdHguc3RhbGUoKSkgcmV0dXJuO1xuXG4gICAgaWYgKGN0eC5pbmNvbXBsZXRlKSB0aGlzLmdyb3Vwcy5mb3JnZXRLZXkoJ3RyYW5zY3JpcHRzJyk7XG4gICAgZWxzZSB0aGlzLmdyb3Vwcy5zZXRLZXkoJ3RyYW5zY3JpcHRzJywgcGxhbktleSk7XG4gICAgY29uc3QgZGlhbSA9IHB4Lm1hcCgoZCkgPT4gZCAvIHB4UGVyVW5pdCk7XG4gICAgY29uc3QgcmVmID0gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBwbGFjZTogUGxhY2VtZW50ID0geyBzY2FsZTogcmVmPy5zY2FsZSA/PyBbMSwgMV0sIHRyYW5zbGF0ZTogcmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdIH07XG4gICAgY29uc3QgbGF5ZXIgPVxuICAgICAgbW9kZSA9PT0gJ2NpcmNsZXMnXG4gICAgICAgID8gLy8gQSBkYXJrIHJpbTogYSB0cmFuc2NyaXB0IGNvbG91cmVkIGJ5IGl0cyBjZWxsJ3MgdHlwZSBpcyBvdGhlcndpc2UgdGhlIHNhbWUgY29sb3VyIGFzXG4gICAgICAgICAgLy8gdGhlIGNlbGwgZmlsbCBpdCBzaXRzIG9uLCBhbmQgdmFuaXNoZXMgaW50byBpdC5cbiAgICAgICAgICB0aGlzLmRyYXdUcmFuc2NyaXB0cyhtZXJnZWQsIGRpYW0sIHJnYmEsIHZpZXcsIHBsYWNlLCBudWxsLCAwLjE4ICogbWVkaWFuKGRpYW0pKVxuICAgICAgICA6IHRoaXMuZHJhd1RyYW5zY3JpcHRHbHlwaHMobWVyZ2VkLCBkaWFtLCByZ2JhLCB2aWV3LCBwbGFjZSwgcHhQZXJVbml0KTtcbiAgICB0aGlzLmhvdmVyLnNldERyYXduKFxuICAgICAge1xuICAgICAgICBraW5kLFxuICAgICAgICBiaW46IHNlbGVjdGlvbkJpblxuICAgICAgICAgID8geyBzaXplOiBzZWxlY3Rpb25CaW4sIG9yaWdpbjogbG9hZGVkLmNsdXN0ZXJlZD8ub3JpZ2luID8/IFswLCAwXSB9XG4gICAgICAgICAgOiBsb2FkZWQua2luZFxuICAgICAgICAgICAgPyBsb2FkZWQuYmluXG4gICAgICAgICAgICA6IGpvYi5iaW4sXG4gICAgICAgIG1lcmdlZCxcbiAgICAgICAgbGF5ZXIsXG4gICAgICAgIGdlbmVzOiBraW5kID09PSAnaW5kaXZpZHVhbCcgPyAoYWxsR2VuZU5hbWVzID8/IFtdKSA6IFsuLi52aWV3LnRyYW5zY3JpcHRHZW5lc10sXG4gICAgICAgIC4uLihlbnRyeUdyb3VwICYmIGdyb3VwTmFtZXMgPyB7IGVudHJ5R3JvdXAsIGdyb3VwTmFtZXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGxvYWRlZC5jbHVzdGVyZWQgPyB7IGdyb3VwR2VuZXM6IGxvYWRlZC5jbHVzdGVyZWQuZ2VuZXMgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgICBkYXRhc2V0Lm1pY3JvbnNQZXJVbml0ID8/IG51bGwsXG4gICAgKTtcbiAgICB0aGlzLmhvdmVyLnNldFR5cGVzKHR5cGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lIGljb25zOiBlYWNoIGVudHJ5IGRyYXduIGFzIGl0cyBnZW5lJ3MgbmFwYXJpLWpzIHBvaW50IHN5bWJvbCwgaW4gdGhlIHNhbWUgb25lIHBvaW50c1xuICAgKiBsYXllciBhcyB0aGUgY2lyY2xlcy4gV2l0aCBldmVyeSBnZW5lIGRyYXduIHRoZXJlIGlzIG9uZSBpY29uIGZvciBhbGwgb2YgdGhlbSDigJQgMTgsMDAwXG4gICAqIHNoYXBlcyB3b3VsZCBzYXkgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgZHJhd1RyYW5zY3JpcHRHbHlwaHMoXG4gICAgbWVyZ2VkOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG4gICAgZGlhbTogRmxvYXQzMkFycmF5LFxuICAgIHJnYmE6IEZsb2F0MzJBcnJheSxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHBsYWNlOiBQbGFjZW1lbnQsXG4gICAgcHhQZXJVbml0OiBudW1iZXIsXG4gICk6IFBvaW50c0xheWVyIHtcbiAgICBjb25zdCBnZW5lcyA9IHZpZXcudHJhbnNjcmlwdEdlbmVzO1xuICAgIGNvbnN0IGdseXBoRm9yID0gKHNsb3Q6IG51bWJlcik6IFRyYW5zY3JpcHRHbHlwaCA9PlxuICAgICAgKHZpZXcudHJhbnNjcmlwdEdseXBoc1tnZW5lc1tzbG90XV0gYXMgVHJhbnNjcmlwdEdseXBoIHwgdW5kZWZpbmVkKSA/PyBkZWZhdWx0R2x5cGhGb3Ioc2xvdCk7XG4gICAgY29uc3Qgc2luZ2xlID0gdmlldy50cmFuc2NyaXB0QWxsR2VuZXNcbiAgICAgID8gKCh2aWV3LnRyYW5zY3JpcHRHbHlwaHNbQUxMX0dFTkVTXSBhcyBUcmFuc2NyaXB0R2x5cGggfCB1bmRlZmluZWQpID8/ICdjaXJjbGUnKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHNsb3RzID0gc2luZ2xlID8gW3NpbmdsZV0gOiBnZW5lcy5tYXAoKF9nLCBzbG90KSA9PiBnbHlwaEZvcihzbG90KSk7XG4gICAgY29uc3QgY29kZXMgPSBzbG90cy5tYXAoKGcpID0+IHBvaW50U3ltYm9sQ29kZShHTFlQSF9TWU1CT0xTW2ddKSk7XG4gICAgY29uc3Qgc2l6ZXMgPSBzbG90cy5tYXAoKGcpID0+IEdMWVBIX1NJWkVbZ10gPz8gMSk7XG4gICAgY29uc3Qgc3ltYm9scyA9IG5ldyBVaW50OEFycmF5KG1lcmdlZC5jb3VudCk7XG4gICAgY29uc3Qgc2l6ZSA9IG5ldyBGbG9hdDMyQXJyYXkobWVyZ2VkLmNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lcmdlZC5jb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBzbG90ID0gc2luZ2xlID8gMCA6IG1lcmdlZC5nZW5lW2ldO1xuICAgICAgc3ltYm9sc1tpXSA9IGNvZGVzW3Nsb3RdO1xuICAgICAgc2l6ZVtpXSA9IGRpYW1baV0gKiBzaXplc1tzbG90XTtcbiAgICB9XG4gICAgLy8gQSBkYXJrIHJpbSwgb25lIHNjcmVlbiBwaXhlbCB3aWRlLCBrZWVwcyBhIGZldyBsYXJnZSBpY29ucyByZWFkYWJsZSBvdmVyIHRoZSB0aXNzdWU7IG9uXG4gICAgLy8gbWFueSBzbWFsbCBvbmVzIHRoZSByaW1zIG1lcmdlIGludG8gYSBzb2xpZCBkYXJrIHNoZWV0IHRoYXQgaGlkZXMgZXZlcnkgY29sb3VyLCBzbyB0aGV5XG4gICAgLy8gYXJlIGxlZnQgb2ZmLlxuICAgIGNvbnN0IG1lZGlhblB4ID0gbWVkaWFuKGRpYW0pICogcHhQZXJVbml0O1xuICAgIGNvbnN0IHJpbSA9IG1lcmdlZC5jb3VudCA+IEdMWVBIX09VVExJTkVfTUFYIHx8IG1lZGlhblB4IDwgR0xZUEhfT1VUTElORV9NSU5fUFggPyAwIDogMSAvIHB4UGVyVW5pdDtcbiAgICByZXR1cm4gdGhpcy5kcmF3VHJhbnNjcmlwdHMobWVyZ2VkLCBzaXplLCByZ2JhLCB2aWV3LCBwbGFjZSwgc3ltYm9scywgcmltKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb25lIHRyYW5zY3JpcHRzIGxheWVyOiBhIG1hcmtlciBwZXIgZW50cnksIGBzaXplYCBzYXlpbmcgaG93IG1hbnkgdHJhbnNjcmlwdHMgaXQgc3RhbmRzXG4gICAqIGZvciwgZHJhd24gYXMgdGhlIGxheWVyJ3MgZGlzYyBvciBhcyBlYWNoIGVudHJ5J3MgYHN5bWJvbHNgIGNvZGUuXG4gICAqL1xuICBwcml2YXRlIGRyYXdUcmFuc2NyaXB0cyhcbiAgICBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgICBzaXplOiBGbG9hdDMyQXJyYXksXG4gICAgcmdiYTogRmxvYXQzMkFycmF5LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgeyBzY2FsZSwgdHJhbnNsYXRlIH06IFBsYWNlbWVudCxcbiAgICBzeW1ib2xzOiBVaW50OEFycmF5IHwgbnVsbCxcbiAgICBib3JkZXJXaWR0aDogbnVtYmVyLFxuICApOiBQb2ludHNMYXllciB7XG4gICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShtZXJnZWQuY291bnQgKiAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lcmdlZC5jb3VudDsgaSsrKSB7XG4gICAgICBwb3NpdGlvbnNbMiAqIGldID0gbWVyZ2VkLnhbaV07XG4gICAgICBwb3NpdGlvbnNbMiAqIGkgKyAxXSA9IG1lcmdlZC55W2ldO1xuICAgIH1cbiAgICBjb25zdCBsYXllciA9IHRoaXMuZ3JvdXBzLnZpZXdlciEuYWRkUG9pbnRzKHBvc2l0aW9ucywge1xuICAgICAgbmFtZTogJ3RyYW5zY3JpcHRzJyxcbiAgICAgIHNpemUsXG4gICAgICBmYWNlQ29sb3I6IHJnYmEsXG4gICAgICBib3JkZXJDb2xvcjogUklNX0NPTE9SLFxuICAgICAgYm9yZGVyV2lkdGgsXG4gICAgICBzeW1ib2xzLFxuICAgICAgb3BhY2l0eTogdmlldy50cmFuc2NyaXB0T3BhY2l0eSxcbiAgICAgIHNjYWxlLFxuICAgICAgdHJhbnNsYXRlLFxuICAgIH0pO1xuICAgIHRoaXMuZ3JvdXBzLnJlcGxhY2UoJ3RyYW5zY3JpcHRzJywgbGF5ZXIpO1xuICAgIHJldHVybiBsYXllcjtcbiAgfVxuXG4gIC8qKiBQZXItZW50cnkgY29sb3VycywgYXMgcGFja2VkIFJHQkEuICovXG4gIHByaXZhdGUgYXN5bmMgdHJhbnNjcmlwdENvbG9ycyhcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgICBjbHVzdGVyT2Y/OiAoaTogbnVtYmVyKSA9PiBzdHJpbmcgfCBudWxsLFxuICApOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xuICAgIGxldCByZ2I6IFJnYltdO1xuICAgIGxldCBjb2RlT2Y6IChpOiBudW1iZXIpID0+IG51bWJlcjtcbiAgICBpZiAodmlldy50cmFuc2NyaXB0Q29sb3JCeSA9PT0gJ2NsdXN0ZXInICYmIGNsdXN0ZXJPZikge1xuICAgICAgLy8gQSBjbHVzdGVyIG5hbWVkIGxpa2UgYSBncm91cCBvZiB0aGUgY2VsbHMnIGdyb3VwaW5nIHRha2VzIHRoYXQgZ3JvdXAncyBjb2xvdXIsIHNvIGFcbiAgICAgIC8vIGNsdXN0ZXIncyB0cmFuc2NyaXB0cyBhbmQgaXRzIGNlbGxzIGFncmVlOyBhbnkgb3RoZXIgY2x1c3RlciB0YWtlcyBhIHBhbGV0dGUgY29sb3VyLlxuICAgICAgY29uc3QgbmFtZSA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgY29uc3QgY29kZXMgPSBuYW1lID8gYXdhaXQgdGhpcy5sb29rdXAuY29kZXMobmFtZSkuY2F0Y2goKCkgPT4gbnVsbCkgOiBudWxsO1xuICAgICAgY29uc3QgY2VsbENvbG9yID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgIGlmIChuYW1lICYmIGNvZGVzPy5tZXRhLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcpIHtcbiAgICAgICAgY29uc3QgY29sb3JzID0gY2F0ZWdvcnlDb2xvcnNGb3IobmFtZSwgY29kZXMubWV0YSwgdmlldy5ncm91cENvbG9ycyk7XG4gICAgICAgIGNvZGVzLm1ldGEuY2F0ZWdvcmllcy5mb3JFYWNoKChjLCBrKSA9PiBjZWxsQ29sb3Iuc2V0KGMsIGNvbG9yc1trXSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29sb3JzID0gY2x1c3RlckNvbG9yTWFwKFxuICAgICAgICB2aWV3LnRyYW5zY3JpcHRHZW5lcyxcbiAgICAgICAgdmlldy50cmFuc2NyaXB0R2VuZUdyb3VwcyxcbiAgICAgICAgY2VsbENvbG9yLFxuICAgICAgICBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEUsXG4gICAgICApO1xuICAgICAgY29uc3QgaW5kZXggPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgY29uc3QgaGV4OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgY29kZUZvciA9IChjbHVzdGVyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IGsgPSBpbmRleC5nZXQoY2x1c3Rlcik7XG4gICAgICAgIGlmIChrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBrID0gaGV4Lmxlbmd0aDtcbiAgICAgICAgICBpbmRleC5zZXQoY2x1c3Rlciwgayk7XG4gICAgICAgICAgaGV4LnB1c2goY29sb3JzLmdldChjbHVzdGVyKSA/PyBjZWxsQ29sb3IuZ2V0KGNsdXN0ZXIpID8/IERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGs7XG4gICAgICB9O1xuICAgICAgY29uc3QgY29kZSA9IG5ldyBJbnQzMkFycmF5KHQuY291bnQpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IGNsdXN0ZXJPZihpKTtcbiAgICAgICAgY29kZVtpXSA9IGMgPT09IG51bGwgPyAtMSA6IGNvZGVGb3IoYyk7XG4gICAgICB9XG4gICAgICByZ2IgPSBoZXgubWFwKHBhcnNlSGV4KTtcbiAgICAgIGNvZGVPZiA9IChpKSA9PiBjb2RlW2ldO1xuICAgIH0gZWxzZSBpZiAodmlldy50cmFuc2NyaXB0Q29sb3JCeSA9PT0gJ2dlbmUnIHx8IHZpZXcudHJhbnNjcmlwdENvbG9yQnkgPT09ICdjbHVzdGVyJykge1xuICAgICAgLy8gQWxsIGdlbmVzOiBjb2RlcyBhcmUgdGhlIGRhdGFzZXQncyBnZW5lIGluZGljZXMsIGNvbG91cmVkIGJ5IG5hbWUgd2hlbiB0aGUgZGF0YXNldFxuICAgICAgLy8gbGlzdHMgdGhlbSAoc28gYSBnZW5lJ3MgY2hvc2VuIGNvbG91ciBhcHBsaWVzKSwgZWxzZSBmb2xkZWQgb250byB0aGUgcGFsZXR0ZS5cbiAgICAgIGNvbnN0IG5hbWVzID0gdmlldy50cmFuc2NyaXB0QWxsR2VuZXMgPyAoZGF0YXNldC50cmFuc2NyaXB0VGlsZXM/LmdlbmVzID8/IG51bGwpIDogdmlldy50cmFuc2NyaXB0R2VuZXM7XG4gICAgICBjb25zdCBuID0gbmFtZXMgPyBuYW1lcy5sZW5ndGggOiBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEUubGVuZ3RoO1xuICAgICAgcmdiID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoX2csIGkpID0+XG4gICAgICAgIHBhcnNlSGV4KFxuICAgICAgICAgIChuYW1lcyAmJiB2aWV3LnRyYW5zY3JpcHRHZW5lQ29sb3JzW25hbWVzW2ldXSkgfHxcbiAgICAgICAgICAgIERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURVtpICUgREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLmxlbmd0aF0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgY29kZU9mID0gbmFtZXMgPyAoaSkgPT4gKHQuZ2VuZVtpXSA8IG4gPyB0LmdlbmVbaV0gOiAtMSkgOiAoaSkgPT4gdC5nZW5lW2ldICUgbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmFtZSA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgY29uc3QgY29kZXMgPSBuYW1lID8gYXdhaXQgdGhpcy5sb29rdXAuY29kZXMobmFtZSkgOiBudWxsO1xuICAgICAgcmdiID1cbiAgICAgICAgbmFtZSAmJiBjb2Rlcz8ubWV0YS5raW5kID09PSAnY2F0ZWdvcmljYWwnXG4gICAgICAgICAgPyBjYXRlZ29yeUNvbG9yc0ZvcihuYW1lLCBjb2Rlcy5tZXRhLCB2aWV3Lmdyb3VwQ29sb3JzKS5tYXAocGFyc2VIZXgpXG4gICAgICAgICAgOiBbXTtcbiAgICAgIGNvZGVPZiA9IChpKSA9PiB7XG4gICAgICAgIGNvbnN0IG8gPSB0Lm9ic2VydmF0aW9uW2ldO1xuICAgICAgICBpZiAoIWNvZGVzIHx8IG8gPT09IE5PX09CU0VSVkFUSU9OKSByZXR1cm4gLTE7XG4gICAgICAgIGNvbnN0IGMgPSBjb2Rlcy5jb2Rlc1tvXTtcbiAgICAgICAgcmV0dXJuIGMgPT09IE5PX0NBVEVHT1JZID8gLTEgOiBjO1xuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmdiYSA9IG5ldyBGbG9hdDMyQXJyYXkodC5jb3VudCAqIDQpO1xuICAgIGNvbnN0IHR1cGxlczogUkdCQVtdID0gcmdiLm1hcCgoW3IsIGcsIGJdKSA9PiBbciAvIDI1NSwgZyAvIDI1NSwgYiAvIDI1NSwgMV0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gY29kZU9mKGkpO1xuICAgICAgcmdiYS5zZXQoYyA8IDAgPyBVTkFTU0lHTkVEX1JHQkEgOiB0dXBsZXNbY10sIGkgKiA0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJnYmE7XG4gIH1cbn1cbiJdfQ==
357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNjcmlwdC1sYXllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvc3BhdGlhbC10aWxlcy90cmFuc2NyaXB0LWxheWVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSTVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUV2RSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGNBQWMsR0FHZixNQUFNLDZDQUE2QyxDQUFDO0FBQ3JELE9BQU8sRUFDTCwyQkFBMkIsRUFDM0IsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsUUFBUSxHQUNULE1BQU0sbUNBQW1DLENBQUM7QUFFM0MsT0FBTyxFQUFZLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBbUIsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0UsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLE1BQU0sRUFDTixpQkFBaUIsR0FDbEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBS3BGLE9BQU8sRUFBaUQsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEcsMkZBQTJGO0FBQzNGLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDO0FBQ2pDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBRS9CLGdDQUFnQztBQUNoQyxNQUFNLFNBQVMsR0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWhE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QyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcG9pbnRTeW1ib2xDb2RlIH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB0eXBlIHsgUG9pbnRTeW1ib2wsIFBvaW50c0xheWVyLCBSR0JBIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHR5cGUgeyBSZ2IgfSBmcm9tICcuLi8uLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IEFMTF9HRU5FUyB9IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0cy9wb3J0cy9zcGF0aWFsLWRhdGEucG9ydCc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBOT19DQVRFR09SWSxcbiAgTk9fT0JTRVJWQVRJT04sXG4gIFNwYXRpYWxEYXRhc2V0LFxuICBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG59IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLFxuICBjYXRlZ29yeUNvbG9yc0ZvcixcbiAgZmFkZU91dHNpZGVTZWxlY3Rpb24sXG4gIGdyb3VwQ29sb3JzS2V5LFxuICBwYXJzZUhleCxcbn0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB0eXBlIHsgU3BhdGlhbFNlbGVjdGlvbk1hc2sgfSBmcm9tICcuLi8uLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmltcG9ydCB7IERhdGFSZWN0LCBjZWxsVHlwZUNvbHVtbkZvciB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvbG9kJztcbmltcG9ydCB7IGNsdXN0ZXJDb2xvck1hcCB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvdHJhbnNjcmlwdC1ncm91cGluZyc7XG5pbXBvcnQgeyBUcmFuc2NyaXB0R2x5cGgsIGRlZmF1bHRHbHlwaEZvciB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvZ2x5cGhzJztcbmltcG9ydCB7XG4gIGZpbHRlclRyYW5zY3JpcHRzLFxuICBoaWRkZW5BbGxHZW5lQ29kZXMsXG4gIGhpZGRlbkdlbmVTbG90cyxcbiAgbWVkaWFuLFxuICB0cmFuc2NyaXB0c0luQmFuZCxcbn0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXRpbGUtbWVyZ2UnO1xuaW1wb3J0IHsgZ2VuZUZpbHRlcktleSwgaGFzR2VuZUZpbHRlciB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1nZW5lLWZpbHRlcic7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3JpY2FsTG9va3VwIH0gZnJvbSAnLi9jYXRlZ29yaWNhbC1sb29rdXAnO1xuaW1wb3J0IHR5cGUgeyBPcmRlcmVkTGF5ZXJHcm91cHMsIFRpbGVHcm91cCB9IGZyb20gJy4vbGF5ZXItZ3JvdXBzJztcbmltcG9ydCB0eXBlIHsgUGxhbkNvbnRleHQgfSBmcm9tICcuL3BsYW4tY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFRyYW5zY3JpcHRIb3ZlciwgVHJhbnNjcmlwdEtpbmQgfSBmcm9tICcuL3RyYW5zY3JpcHQtaG92ZXInO1xuaW1wb3J0IHsgdHlwZSBUcmFuc2NyaXB0Sm9iLCB0eXBlIFRyYW5zY3JpcHRKb2JQbGFubmVyLCBncm91cFNlbGVjdGlvbiB9IGZyb20gJy4vdHJhbnNjcmlwdC1qb2JzJztcblxuLyoqIEljb25zIGdldCBhIGRhcmsgcmltIG9ubHkgd2hpbGUgdGhlcmUgYXJlIGF0IG1vc3QgdGhpcyBtYW55LCBhdCBsZWFzdCB0aGlzIGJpZyAocHgpLiAqL1xuY29uc3QgR0xZUEhfT1VUTElORV9NQVggPSAyMF8wMDA7XG5jb25zdCBHTFlQSF9PVVRMSU5FX01JTl9QWCA9IDg7XG5cbi8qKiBUaGUgZGFyayByaW0gb2YgYSBtYXJrZXIuICovXG5jb25zdCBSSU1fQ09MT1I6IFJHQkEgPSBbMC4wNCwgMC4wNCwgMC4wNSwgMC45XTtcblxuLyoqXG4gKiBUaGUgbmFwYXJpLWpzIHBvaW50IHN5bWJvbCBlYWNoIHRyYW5zY3JpcHQgaWNvbiBpcyBkcmF3biBhcy4gRXZlcnkgaWNvbiBoYXMgYSBjb3VudGVycGFydCBvZlxuICogdGhlIHNhbWUgb3V0bGluZSAoYGNpcmNsZWAgaXMgbmFwYXJpJ3MgYGRpc2NgKTsgc2VlIHtAbGluayBHTFlQSF9TSVpFfSBmb3IgdGhlIG9uZSB3aG9zZSBzaXplXG4gKiBkaWZmZXJzLlxuICovXG5leHBvcnQgY29uc3QgR0xZUEhfU1lNQk9MUzogUmVhZG9ubHk8UmVjb3JkPFRyYW5zY3JpcHRHbHlwaCwgUG9pbnRTeW1ib2w+PiA9IHtcbiAgY2lyY2xlOiAnZGlzYycsXG4gIHN0YXI6ICdzdGFyJyxcbiAgdHJpYW5nbGU6ICd0cmlhbmdsZV91cCcsXG4gIHNxdWFyZTogJ3NxdWFyZScsXG4gIGRpYW1vbmQ6ICdkaWFtb25kJyxcbiAgY3Jvc3M6ICdjcm9zcycsXG4gIGhleGFnb246ICdoZXhhZ29uJyxcbiAgJ3RyaWFuZ2xlLWRvd24nOiAndHJpYW5nbGVfZG93bicsXG4gIHBlbnRhZ29uOiAncGVudGFnb24nLFxuICB4OiAneCcsXG59O1xuXG4vKipcbiAqIE1hcmtlciBkaWFtZXRlciBwZXIgaWNvbiwgYXMgYSBmcmFjdGlvbiBvZiB0aGUgZW50cnknczogbmFwYXJpJ3MgYHNxdWFyZWAgZmlsbHMgdGhlIG1hcmtlcidzXG4gKiB3aG9sZSBib3gsIHdoZXJlIHRoZSBpY29uIGl0IHJlcGxhY2VzIGhhZCBhIDAuOCBoYWxmLXNpZGUsIGFzIGhlYXZ5IGFzIHRoZSBvdGhlciBpY29ucy5cbiAqL1xuY29uc3QgR0xZUEhfU0laRTogUmVhZG9ubHk8UGFydGlhbDxSZWNvcmQ8VHJhbnNjcmlwdEdseXBoLCBudW1iZXI+Pj4gPSB7IHNxdWFyZTogMC44IH07XG5cbi8qKlxuICogV2hhdCBhIHRyYW5zY3JpcHQgcGxhbiBkcmF3cywgYXMgYSBrZXk6IGFuIHVuY2hhbmdlZCBvbmUgaXMgYSBuby1vcC4gTWFya2VyIHNpemVzIGZvbGxvdyB0aGVcbiAqIHpvb20sIHNvIHRoZSB6b29tIGlzIHBhcnQgb2YgaXQ7IGEgcGFuIHRoYXQga2VlcHMgdGhlIHNhbWUgdGlsZXMgb24gc2NyZWVuIGNoYW5nZXMgbm90aGluZy5cbiAqL1xuZnVuY3Rpb24gdHJhbnNjcmlwdFBsYW5LZXkoXG4gIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICBqb2I6IFRyYW5zY3JpcHRKb2IsXG4gIHB4UGVyVW5pdDogbnVtYmVyLFxuICB6QmFuZDogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSB8IG51bGwsXG4gIHNlbGVjdGlvblJldjogbnVtYmVyLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICBzZWxlY3Rpb25SZXYsXG4gICAgZGF0YXNldC5pZCxcbiAgICB6QmFuZCA/IHpCYW5kLmpvaW4oJywnKSA6ICcnLFxuICAgIHZpZXcudHJhbnNjcmlwdE1vZGUsXG4gICAgam9iLmtleSxcbiAgICB2aWV3LnRyYW5zY3JpcHRDb2xvckJ5LFxuICAgIGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpLFxuICAgIHZpZXcudHJhbnNjcmlwdFNjYWxlLFxuICAgIHZpZXcudHJhbnNjcmlwdE9wYWNpdHksXG4gICAgSlNPTi5zdHJpbmdpZnkodmlldy50cmFuc2NyaXB0R2x5cGhzKSxcbiAgICBweFBlclVuaXQudG9QcmVjaXNpb24oNCksXG4gICAgdmlldy5oaWRkZW5Hcm91cHMuam9pbignXFx1MDAwMScpLFxuICAgIGdlbmVGaWx0ZXJLZXkodmlldyksXG4gICAgdmlldy50cmFuc2NyaXB0SGlkZGVuR2VuZXMuam9pbignLCcpLFxuICAgIHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzSGlkZGVuLmpvaW4oJywnKSxcbiAgICBKU09OLnN0cmluZ2lmeSh2aWV3LnRyYW5zY3JpcHRHZW5lQ29sb3JzKSxcbiAgICBKU09OLnN0cmluZ2lmeSh2aWV3LnRyYW5zY3JpcHRHZW5lR3JvdXBzKSxcbiAgICBncm91cENvbG9yc0tleShjZWxsVHlwZUNvbHVtbkZvcihkYXRhc2V0LCB2aWV3KSwgdmlldy5ncm91cENvbG9ycyksXG4gIF0uam9pbignfCcpO1xufVxuXG4vKiogVGhlIHZpZXcgdGhlIG1hcmtlcnMgYXJlIGNvbG91cmVkIGJ5LCBmb3Igd2hhdCB3YXMgbG9hZGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yVmlld0ZvcihcbiAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAga2luZDogVHJhbnNjcmlwdEtpbmQsXG4gIGNsdXN0ZXJlZDogYm9vbGVhbixcbiAgaGFzQ2VsbFR5cGVzOiBib29sZWFuLFxuKTogU3BhdGlhbFZpZXdTdGF0ZSB7XG4gIC8vIEEgYmluIG9mIHRoZSBhbGwtZ2VuZSBweXJhbWlkIG1peGVzIGdlbmVzIGFuZCBjYXJyaWVzIG5vbmUsIHNvIGl0IGNhbm5vdCBiZSBjb2xvdXJlZFxuICAvLyBieSBnZW5lOiBjb2xvdXIgaXQgYnkgaXRzIGRvbWluYW50IGNlbGwncyB0eXBlIHVudGlsIGluZGl2aWR1YWwgdHJhbnNjcmlwdHMgc2hvdyAod2l0aFxuICAvLyBubyBjZWxsIHR5cGVzLCB0aGF0IGxlYXZlcyBldmVyeSBiaW4gdW5hc3NpZ25lZDogb25lIGNvbG91cikuXG4gIGlmIChraW5kID09PSAnYmlucycgJiYgdmlldy50cmFuc2NyaXB0Q29sb3JCeSAhPT0gJ2NlbGxUeXBlJykgcmV0dXJuIHsgLi4udmlldywgdHJhbnNjcmlwdENvbG9yQnk6ICdjZWxsVHlwZScgfTtcbiAgLy8gRGVuc2l0eS1ncmlkIG1hcmtlcnMgaGF2ZSBubyBjZWxsIHRvIHRha2UgYSB0eXBlIGZyb206IHRoZXkgdGFrZSB0aGVpciBjbHVzdGVyJ3MgY29sb3VyLlxuICBpZiAoY2x1c3RlcmVkICYmIHZpZXcudHJhbnNjcmlwdENvbG9yQnkgPT09ICdjZWxsVHlwZScpIHJldHVybiB7IC4uLnZpZXcsIHRyYW5zY3JpcHRDb2xvckJ5OiAnY2x1c3RlcicgfTtcbiAgLy8gTm8gY2VsbCB0eXBlcyB0byBjb2xvdXIgYnkgKHRoZSBwYW5lbCB0aGVuIGRvZXMgbm90IG9mZmVyIGl0KTogYnkgZ2VuZSBpbnN0ZWFkLlxuICBpZiAoIWhhc0NlbGxUeXBlcyAmJiBraW5kICE9PSAnYmlucycgJiYgdmlldy50cmFuc2NyaXB0Q29sb3JCeSA9PT0gJ2NlbGxUeXBlJykge1xuICAgIHJldHVybiB7IC4uLnZpZXcsIHRyYW5zY3JpcHRDb2xvckJ5OiAnZ2VuZScgfTtcbiAgfVxuICByZXR1cm4gdmlldztcbn1cblxuLyoqIFdoZXJlIGEgbGF5ZXIgc2l0cyBpbiB3b3JsZCBzcGFjZTogdGhlIGRhdGFzZXQncyBhZmZpbmUgb250byBpdHMgdGlzc3VlIGltYWdlLiAqL1xuaW50ZXJmYWNlIFBsYWNlbWVudCB7XG4gIHNjYWxlOiBbbnVtYmVyLCBudW1iZXJdO1xuICB0cmFuc2xhdGU6IFtudW1iZXIsIG51bWJlcl07XG59XG5cbmNvbnN0IFVOQVNTSUdORURfUkdCQTogUkdCQSA9IFswLjYyLCAwLjYyLCAwLjYyLCAwLjU1XTtcblxuLyoqXG4gKiBUaGUgdHJhbnNjcmlwdCBtYXJrZXJzIG9mIHRoZSAyRCBzcGF0aWFsIHZpZXc6IHJ1bnMgdGhlIHBsYW5uZXIncyBqb2IsIGRyb3BzIGhpZGRlbiBncm91cHNcbiAqIGFuZCBnZW5lcywgZ3JvdXBzIGEgc2VsZWN0aW9uIHVuZGVyIHRoZSBtYXJrZXIgYnVkZ2V0LCBjb2xvdXJzIHRoZSBlbnRyaWVzIGFuZCBkcmF3cyB0aGVtIGFzXG4gKiBvbmUgcG9pbnRzIGxheWVyOiBzaXplZCBjaXJjbGVzLCBvciBnZW5lIGljb25zIGFzIHBlci1wb2ludCBzeW1ib2xzICh3aXRoIGEgZGFyayByaW0gd2hpbGVcbiAqIHRoZXJlIGFyZSBmZXcgZW5vdWdoKS5cbiAqXG4gKiBIYW5kcyB3aGF0IGl0IGRyZXcgdG8gdGhlIGhvdmVyIG9uZSB3YXkgKHtAbGluayBUcmFuc2NyaXB0SG92ZXIuc2V0RHJhd259KSwgYW5kIGtlZXBzIHRoZVxuICogbG9hZGVkIHBlci1nZW5lIHRyYW5zY3JpcHRzIHRoZSBpbi12aWV3IGdlbmUgY291bnRzIGFyZSB0YWtlbiBmcm9tLlxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNjcmlwdExheWVycyB7XG4gIC8qKiBUaGUgbG9hZGVkIHBlci1nZW5lIHRyYW5zY3JpcHRzIHRoZSBpbi12aWV3IGNvdW50cyBhcmUgdGFrZW4gZnJvbS4gKi9cbiAgcHJpdmF0ZSBjb3VudFNvdXJjZTogeyBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZTsgZ2VuZXM6IHN0cmluZ1tdIH0gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwczogT3JkZXJlZExheWVyR3JvdXBzPFRpbGVHcm91cD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBqb2JzOiBUcmFuc2NyaXB0Sm9iUGxhbm5lcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvb2t1cDogQ2F0ZWdvcmljYWxMb29rdXAsXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3ZlcjogVHJhbnNjcmlwdEhvdmVyLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFRyYW5zY3JpcHRzIG9mIGVhY2ggc2VsZWN0ZWQgZ2VuZSBpbnNpZGUgYHJlY3RgOiBlYWNoIGVudHJ5IGNvdW50cyBmb3IgdGhlIHRyYW5zY3JpcHRzIGl0XG4gICAqIHN0YW5kcyBmb3IgKGFuIGFnZ3JlZ2F0ZSBhdCBhIGNvYXJzZSBsZXZlbCBob2xkcyBzZXZlcmFsKS4gTnVsbCB3aXRob3V0IHBlci1nZW5lIGRhdGEuXG4gICAqL1xuICBnZW5lQ291bnRzSW4ocmVjdDogRGF0YVJlY3QpOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHwgbnVsbCB7XG4gICAgY29uc3Qgc3JjID0gdGhpcy5jb3VudFNvdXJjZTtcbiAgICBpZiAoIXNyYykgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgZm9yIChjb25zdCBnIG9mIHNyYy5nZW5lcykgb3V0W2ddID0gMDtcbiAgICBjb25zdCB7IHgsIHksIHdlaWdodCwgZ2VuZSB9ID0gc3JjLm1lcmdlZDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNyYy5tZXJnZWQuY291bnQ7IGkrKykge1xuICAgICAgaWYgKHhbaV0gPCByZWN0LngwIHx8IHhbaV0gPiByZWN0LngxIHx8IHlbaV0gPCByZWN0LnkwIHx8IHlbaV0gPiByZWN0LnkxKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG5hbWUgPSBzcmMuZ2VuZXNbZ2VuZVtpXV07XG4gICAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSBvdXRbbmFtZV0gKz0gd2VpZ2h0W2ldO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFRoZSB2aWV3ZXIgd2VudCBhd2F5OiBubyBjb3VudHMgdW50aWwgdGhlIG5leHQgcGxhbi4gKi9cbiAgZGV0YWNoZWQoKTogdm9pZCB7XG4gICAgdGhpcy5jb3VudFNvdXJjZSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgdmlldydzIHRyYW5zY3JpcHQgbWFya2VycyAob3IgZHJvcCB0aGVtKTsgYW4gdW5jaGFuZ2VkIHBsYW4ga2V5IGlzIGEgbm8tb3AuIFdpdGggYVxuICAgKiBgekJhbmRgLCB0aGUgdmlldyBzaG93cyBvbmUgcGxhbmUgb2YgYSAzRCBhc3NheTogb25seSB0aGUgdHJhbnNjcmlwdHMgYXQgdGhhdCBkZXB0aCBhcmUgZHJhd25cbiAgICogKHN1bW1lZCBkZW5zaXR5IGdyaWRzIGFuZCBhZ2dyZWdhdGVzLCB3aGljaCBtaXggZGVwdGhzLCBzdGF5IHdob2xlKS5cbiAgICovXG4gIGFzeW5jIHBsYW4oXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICByZWN0OiBEYXRhUmVjdCxcbiAgICBweFBlclVuaXQ6IG51bWJlcixcbiAgICBjdHg6IFBsYW5Db250ZXh0LFxuICAgIHpCYW5kOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG51bGwsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB8IG51bGwgPSBudWxsLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtb2RlID0gdmlldy50cmFuc2NyaXB0TW9kZTtcbiAgICBjb25zdCBqb2IgPSB0aGlzLmpvYnMuam9iRm9yKGRhdGFzZXQsIHZpZXcsIHJlY3QsIHB4UGVyVW5pdCk7XG4gICAgaWYgKCFqb2IpIHtcbiAgICAgIHRoaXMuZ3JvdXBzLmRyb3AoJ3RyYW5zY3JpcHRzJyk7XG4gICAgICB0aGlzLmhvdmVyLmNsZWFyKCk7XG4gICAgICB0aGlzLmNvdW50U291cmNlID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGxhbktleSA9IHRyYW5zY3JpcHRQbGFuS2V5KGRhdGFzZXQsIHZpZXcsIGpvYiwgcHhQZXJVbml0LCB6QmFuZCwgdGhpcy5zZWxlY3Rpb25SZXYoc2VsZWN0aW9uKSk7XG4gICAgaWYgKHBsYW5LZXkgPT09IHRoaXMuZ3JvdXBzLmtleSgndHJhbnNjcmlwdHMnKSAmJiB0aGlzLmdyb3Vwcy5zaG93bigndHJhbnNjcmlwdHMnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBjdHgudHJhY2soJ1RyYW5zY3JpcHRzJywgam9iLmxvYWQoY3R4KSk7XG4gICAgaWYgKGN0eC5zdGFsZSgpKSByZXR1cm47XG4gICAgLy8gTWFya2VycyBkcmF3biBmcm9tIHN1bW1lZCBkZW5zaXR5IGdyaWRzICh6b29tZWQgb3V0KSBjYXJyeSBubyBjZWxscywgc28gdGhleSBjYW5ub3QgZm9sbG93XG4gICAgLy8gdGhlIG9ic2VydmF0aW9uIGdlbmUgZmlsdGVyOiBkcmF3biwgdGhleSB3b3VsZCBzaG93IHRoZSB0cmFuc2NyaXB0cyBvZiB0aGUgY2VsbHMgaXQgaGlkZXMuXG4gICAgLy8gTm9uZSB3aGlsZSBpdCBpcyBvbjsgem9vbWVkIGluLCB0aGUgY2VsbC1hc3NpZ25lZCB0cmFuc2NyaXB0cyBhcmUgZmlsdGVyZWQgKGJlbG93KS5cbiAgICBpZiAobG9hZGVkLmNsdXN0ZXJlZCAmJiBoYXNHZW5lRmlsdGVyKHZpZXcpKSB7XG4gICAgICB0aGlzLmdyb3Vwcy5kcm9wKCd0cmFuc2NyaXB0cycpO1xuICAgICAgdGhpcy5ob3Zlci5jbGVhcigpO1xuICAgICAgdGhpcy5jb3VudFNvdXJjZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFBlci1nZW5lIGNvdW50cyBpbiB2aWV3IGNvbWUgZnJvbSB3aGF0IHdhcyBsb2FkZWQsIGJlZm9yZSBoaWRkZW4gZ2VuZXMgYXJlIGRyb3BwZWQ6XG4gICAgLy8gYSBoaWRkZW4gZ2VuZSBzdGlsbCBoYXMgdHJhbnNjcmlwdHMgdGhlcmUuIFN1bW1lZCBkZW5zaXR5IGdyaWRzIChubyBwZXItZ2VuZSBsZXZlbHMsXG4gICAgLy8gem9vbWVkIG91dCkgaG9sZCBjbHVzdGVycywgbm90IGdlbmVzOiBubyBwZXItZ2VuZSBjb3VudHMgdGhlcmUsIHJhdGhlciB0aGFuIGEgZ3Vlc3MuXG4gICAgLy8gRXZlcnkgZ2VuZSdzIGluZGl2aWR1YWwgdHJhbnNjcmlwdHMgYXJlIGNvdW50ZWQgYnkgdGhlIGRhdGFzZXQncyBnZW5lIGxpc3QsIHdoZW4gaXQgaGFzIG9uZS5cbiAgICBjb25zdCBhbGxHZW5lTmFtZXMgPSBkYXRhc2V0LnRyYW5zY3JpcHRUaWxlcz8uZ2VuZXM7XG4gICAgY29uc3Qga2luZCA9IGxvYWRlZC5raW5kID8/IGpvYi5raW5kO1xuICAgIHRoaXMuY291bnRTb3VyY2UgPVxuICAgICAga2luZCA9PT0gJ2dlbmVzJyAmJiAhbG9hZGVkLmNsdXN0ZXJlZFxuICAgICAgICA/IHsgbWVyZ2VkOiBsb2FkZWQubWVyZ2VkLCBnZW5lczogWy4uLnZpZXcudHJhbnNjcmlwdEdlbmVzXSB9XG4gICAgICAgIDoga2luZCA9PT0gJ2luZGl2aWR1YWwnICYmIGFsbEdlbmVOYW1lc1xuICAgICAgICAgID8geyBtZXJnZWQ6IGxvYWRlZC5tZXJnZWQsIGdlbmVzOiBhbGxHZW5lTmFtZXMgfVxuICAgICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBoaWRkZW4gPSBhd2FpdCB0aGlzLmxvb2t1cC5oaWRkZW5Db2RlcyhkYXRhc2V0LCB2aWV3KTtcbiAgICBpZiAoY3R4LnN0YWxlKCkpIHJldHVybjtcbiAgICAvLyBEZW5zaXR5LWdyaWQgbWFya2VycyBjYXJyeSBubyBjZWxscyBhbmQgd2VyZSBidWlsdCBmcm9tIHRoZSB2aXNpYmxlIGdlbmVzIG9ubHkuXG4gICAgY29uc3QgZmlsdGVyZWQgPSBsb2FkZWQuY2x1c3RlcmVkXG4gICAgICA/IHsgbWVyZ2VkOiBsb2FkZWQubWVyZ2VkLCBweDogbG9hZGVkLnB4IH1cbiAgICAgIDogZmlsdGVyVHJhbnNjcmlwdHMoXG4gICAgICAgICAgbG9hZGVkLm1lcmdlZCxcbiAgICAgICAgICBsb2FkZWQucHgsXG4gICAgICAgICAgaGlkZGVuLFxuICAgICAgICAgIGtpbmQgPT09ICdnZW5lcydcbiAgICAgICAgICAgID8gaGlkZGVuR2VuZVNsb3RzKHZpZXcpXG4gICAgICAgICAgICA6IGtpbmQgPT09ICdpbmRpdmlkdWFsJ1xuICAgICAgICAgICAgICA/IGhpZGRlbkFsbEdlbmVDb2Rlcyh2aWV3LCBhbGxHZW5lTmFtZXMpXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgKTtcbiAgICBsZXQgeyBtZXJnZWQsIHB4IH0gPVxuICAgICAgbG9hZGVkLmNsdXN0ZXJlZCB8fCAhekJhbmQgPyBmaWx0ZXJlZCA6IHRyYW5zY3JpcHRzSW5CYW5kKGZpbHRlcmVkLm1lcmdlZCwgZmlsdGVyZWQucHgsIHpCYW5kKTtcbiAgICBsZXQgc2VsZWN0aW9uQmluOiBudW1iZXIgfCBudWxsID0gbG9hZGVkLmNsdXN0ZXJlZD8uYmluID8/IG51bGw7XG4gICAgbGV0IGVudHJ5R3JvdXA6IEludDMyQXJyYXkgfCBudWxsID0gbG9hZGVkLmNsdXN0ZXJlZD8uZ3JvdXAgPz8gbnVsbDtcbiAgICBsZXQgZ3JvdXBOYW1lczogc3RyaW5nW10gfCBudWxsID0gbG9hZGVkLmNsdXN0ZXJlZD8ubmFtZXMgPz8gbnVsbDtcbiAgICBpZiAobG9hZGVkLmxhZGRlcikge1xuICAgICAgY29uc3QgZyA9IGdyb3VwU2VsZWN0aW9uKG1lcmdlZCwgdmlldywgbG9hZGVkLmxhZGRlciwgcHhQZXJVbml0KTtcbiAgICAgIGlmIChnKSAoeyBtZXJnZWQsIHB4LCBiaW46IHNlbGVjdGlvbkJpbiwgZ3JvdXA6IGVudHJ5R3JvdXAsIG5hbWVzOiBncm91cE5hbWVzIH0gPSBnKTtcbiAgICB9XG4gICAgY29uc3QgY29sb3JWaWV3ID0gY29sb3JWaWV3Rm9yKHZpZXcsIGtpbmQsICEhbG9hZGVkLmNsdXN0ZXJlZCwgY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldykgIT09IG51bGwpO1xuICAgIC8vIEVhY2ggZW50cnkncyBjbHVzdGVyOiBpdHMgbWFya2VyJ3MgZ3JvdXAsIG9yIHRoZSBnZW5lLXRyZWUgZ3JvdXAgaXRzIGdlbmUgaXMgaW4uXG4gICAgY29uc3QgZ2VuZUNsdXN0ZXIgPSB2aWV3LnRyYW5zY3JpcHRHZW5lcy5tYXAoXG4gICAgICAoZykgPT4gdmlldy50cmFuc2NyaXB0R2VuZUdyb3Vwcy5maW5kKCh4KSA9PiB4LmdlbmVzLmluY2x1ZGVzKGcpKT8ubmFtZSA/PyBnLFxuICAgICk7XG4gICAgY29uc3QgY2x1c3Rlck9mID0gKGk6IG51bWJlcik6IHN0cmluZyB8IG51bGwgPT5cbiAgICAgIGVudHJ5R3JvdXAgJiYgZ3JvdXBOYW1lcyA/IChncm91cE5hbWVzW2VudHJ5R3JvdXBbaV1dID8/IG51bGwpIDogKGdlbmVDbHVzdGVyW21lcmdlZC5nZW5lW2ldXSA/PyBudWxsKTtcbiAgICBjb25zdCByZ2JhID0gYXdhaXQgdGhpcy50cmFuc2NyaXB0Q29sb3JzKGRhdGFzZXQsIGNvbG9yVmlldywgbWVyZ2VkLCBraW5kID09PSAnZ2VuZXMnID8gY2x1c3Rlck9mIDogdW5kZWZpbmVkKTtcbiAgICAvLyBBIHNlbGVjdGVkIGNlbGwgb3IgY2VsbCB0eXBlOiBpdHMgdHJhbnNjcmlwdHMgYXMgdGhleSBhcmUsIHRoZSBvdGhlcnMgZmFkZWQsIGFzIHRoZSBjZWxscyBhcmUuXG4gICAgLy8gRGVuc2l0eS1ncmlkIG1hcmtlcnMgY2Fycnkgbm8gY2VsbHMsIHNvIHRoZXkgYWxsIGZhZGUuXG4gICAgZmFkZU91dHNpZGVTZWxlY3Rpb24ocmdiYSwgbWVyZ2VkLmNvdW50LCAoaSkgPT4gKGxvYWRlZC5jbHVzdGVyZWQgPyAtMSA6IG1lcmdlZC5vYnNlcnZhdGlvbltpXSksIHNlbGVjdGlvbik7XG4gICAgY29uc3QgdHlwZUNvbHVtbiA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgIGNvbnN0IHR5cGVzID0gdHlwZUNvbHVtbiA/IGF3YWl0IHRoaXMubG9va3VwLmNvZGVzKHR5cGVDb2x1bW4pLmNhdGNoKCgpID0+IG51bGwpIDogbnVsbDtcbiAgICAvLyBOb3RoaW5nIGlzIHJlY29yZGVkIGJlZm9yZSB0aGUgbGFzdCBhd2FpdDogYSBzdXBlcnNlZGVkIHBsYW4gdGhhdCBoYWQgYWxyZWFkeSBrZXllZCB0aGVcbiAgICAvLyBncm91cCB3b3VsZCBtYWtlIHRoZSBuZXdlciBwbGFuIG9mIHRoZSBzYW1lIHZpZXcgdGFrZSB0aGUgb2xkIGxheWVyIGZvciBpdHMgb3duLlxuICAgIGlmIChjdHguc3RhbGUoKSkgcmV0dXJuO1xuXG4gICAgaWYgKGN0eC5pbmNvbXBsZXRlKSB0aGlzLmdyb3Vwcy5mb3JnZXRLZXkoJ3RyYW5zY3JpcHRzJyk7XG4gICAgZWxzZSB0aGlzLmdyb3Vwcy5zZXRLZXkoJ3RyYW5zY3JpcHRzJywgcGxhbktleSk7XG4gICAgY29uc3QgZGlhbSA9IHB4Lm1hcCgoZCkgPT4gZCAvIHB4UGVyVW5pdCk7XG4gICAgY29uc3QgcmVmID0gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBwbGFjZTogUGxhY2VtZW50ID0geyBzY2FsZTogcmVmPy5zY2FsZSA/PyBbMSwgMV0sIHRyYW5zbGF0ZTogcmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdIH07XG4gICAgY29uc3QgbGF5ZXIgPVxuICAgICAgbW9kZSA9PT0gJ2NpcmNsZXMnXG4gICAgICAgID8gLy8gQSBkYXJrIHJpbTogYSB0cmFuc2NyaXB0IGNvbG91cmVkIGJ5IGl0cyBjZWxsJ3MgdHlwZSBpcyBvdGhlcndpc2UgdGhlIHNhbWUgY29sb3VyIGFzXG4gICAgICAgICAgLy8gdGhlIGNlbGwgZmlsbCBpdCBzaXRzIG9uLCBhbmQgdmFuaXNoZXMgaW50byBpdC5cbiAgICAgICAgICB0aGlzLmRyYXdUcmFuc2NyaXB0cyhtZXJnZWQsIGRpYW0sIHJnYmEsIHZpZXcsIHBsYWNlLCBudWxsLCAwLjE4ICogbWVkaWFuKGRpYW0pKVxuICAgICAgICA6IHRoaXMuZHJhd1RyYW5zY3JpcHRHbHlwaHMobWVyZ2VkLCBkaWFtLCByZ2JhLCB2aWV3LCBwbGFjZSwgcHhQZXJVbml0KTtcbiAgICB0aGlzLmhvdmVyLnNldERyYXduKFxuICAgICAge1xuICAgICAgICBraW5kLFxuICAgICAgICBiaW46IHNlbGVjdGlvbkJpblxuICAgICAgICAgID8geyBzaXplOiBzZWxlY3Rpb25CaW4sIG9yaWdpbjogbG9hZGVkLmNsdXN0ZXJlZD8ub3JpZ2luID8/IFswLCAwXSB9XG4gICAgICAgICAgOiBsb2FkZWQua2luZFxuICAgICAgICAgICAgPyBsb2FkZWQuYmluXG4gICAgICAgICAgICA6IGpvYi5iaW4sXG4gICAgICAgIG1lcmdlZCxcbiAgICAgICAgbGF5ZXIsXG4gICAgICAgIGdlbmVzOiBraW5kID09PSAnaW5kaXZpZHVhbCcgPyAoYWxsR2VuZU5hbWVzID8/IFtdKSA6IFsuLi52aWV3LnRyYW5zY3JpcHRHZW5lc10sXG4gICAgICAgIC4uLihlbnRyeUdyb3VwICYmIGdyb3VwTmFtZXMgPyB7IGVudHJ5R3JvdXAsIGdyb3VwTmFtZXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGxvYWRlZC5jbHVzdGVyZWQgPyB7IGdyb3VwR2VuZXM6IGxvYWRlZC5jbHVzdGVyZWQuZ2VuZXMgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgICBkYXRhc2V0Lm1pY3JvbnNQZXJVbml0ID8/IG51bGwsXG4gICAgKTtcbiAgICB0aGlzLmhvdmVyLnNldFR5cGVzKHR5cGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lIGljb25zOiBlYWNoIGVudHJ5IGRyYXduIGFzIGl0cyBnZW5lJ3MgbmFwYXJpLWpzIHBvaW50IHN5bWJvbCwgaW4gdGhlIHNhbWUgb25lIHBvaW50c1xuICAgKiBsYXllciBhcyB0aGUgY2lyY2xlcy4gV2l0aCBldmVyeSBnZW5lIGRyYXduIHRoZXJlIGlzIG9uZSBpY29uIGZvciBhbGwgb2YgdGhlbSDigJQgMTgsMDAwXG4gICAqIHNoYXBlcyB3b3VsZCBzYXkgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgZHJhd1RyYW5zY3JpcHRHbHlwaHMoXG4gICAgbWVyZ2VkOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG4gICAgZGlhbTogRmxvYXQzMkFycmF5LFxuICAgIHJnYmE6IEZsb2F0MzJBcnJheSxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHBsYWNlOiBQbGFjZW1lbnQsXG4gICAgcHhQZXJVbml0OiBudW1iZXIsXG4gICk6IFBvaW50c0xheWVyIHtcbiAgICBjb25zdCBnZW5lcyA9IHZpZXcudHJhbnNjcmlwdEdlbmVzO1xuICAgIGNvbnN0IGdseXBoRm9yID0gKHNsb3Q6IG51bWJlcik6IFRyYW5zY3JpcHRHbHlwaCA9PlxuICAgICAgKHZpZXcudHJhbnNjcmlwdEdseXBoc1tnZW5lc1tzbG90XV0gYXMgVHJhbnNjcmlwdEdseXBoIHwgdW5kZWZpbmVkKSA/PyBkZWZhdWx0R2x5cGhGb3Ioc2xvdCk7XG4gICAgY29uc3Qgc2luZ2xlID0gdmlldy50cmFuc2NyaXB0QWxsR2VuZXNcbiAgICAgID8gKCh2aWV3LnRyYW5zY3JpcHRHbHlwaHNbQUxMX0dFTkVTXSBhcyBUcmFuc2NyaXB0R2x5cGggfCB1bmRlZmluZWQpID8/ICdjaXJjbGUnKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHNsb3RzID0gc2luZ2xlID8gW3NpbmdsZV0gOiBnZW5lcy5tYXAoKF9nLCBzbG90KSA9PiBnbHlwaEZvcihzbG90KSk7XG4gICAgY29uc3QgY29kZXMgPSBzbG90cy5tYXAoKGcpID0+IHBvaW50U3ltYm9sQ29kZShHTFlQSF9TWU1CT0xTW2ddKSk7XG4gICAgY29uc3Qgc2l6ZXMgPSBzbG90cy5tYXAoKGcpID0+IEdMWVBIX1NJWkVbZ10gPz8gMSk7XG4gICAgY29uc3Qgc3ltYm9scyA9IG5ldyBVaW50OEFycmF5KG1lcmdlZC5jb3VudCk7XG4gICAgY29uc3Qgc2l6ZSA9IG5ldyBGbG9hdDMyQXJyYXkobWVyZ2VkLmNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lcmdlZC5jb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBzbG90ID0gc2luZ2xlID8gMCA6IG1lcmdlZC5nZW5lW2ldO1xuICAgICAgc3ltYm9sc1tpXSA9IGNvZGVzW3Nsb3RdO1xuICAgICAgc2l6ZVtpXSA9IGRpYW1baV0gKiBzaXplc1tzbG90XTtcbiAgICB9XG4gICAgLy8gQSBkYXJrIHJpbSwgb25lIHNjcmVlbiBwaXhlbCB3aWRlLCBrZWVwcyBhIGZldyBsYXJnZSBpY29ucyByZWFkYWJsZSBvdmVyIHRoZSB0aXNzdWU7IG9uXG4gICAgLy8gbWFueSBzbWFsbCBvbmVzIHRoZSByaW1zIG1lcmdlIGludG8gYSBzb2xpZCBkYXJrIHNoZWV0IHRoYXQgaGlkZXMgZXZlcnkgY29sb3VyLCBzbyB0aGV5XG4gICAgLy8gYXJlIGxlZnQgb2ZmLlxuICAgIGNvbnN0IG1lZGlhblB4ID0gbWVkaWFuKGRpYW0pICogcHhQZXJVbml0O1xuICAgIGNvbnN0IHJpbSA9IG1lcmdlZC5jb3VudCA+IEdMWVBIX09VVExJTkVfTUFYIHx8IG1lZGlhblB4IDwgR0xZUEhfT1VUTElORV9NSU5fUFggPyAwIDogMSAvIHB4UGVyVW5pdDtcbiAgICByZXR1cm4gdGhpcy5kcmF3VHJhbnNjcmlwdHMobWVyZ2VkLCBzaXplLCByZ2JhLCB2aWV3LCBwbGFjZSwgc3ltYm9scywgcmltKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb25lIHRyYW5zY3JpcHRzIGxheWVyOiBhIG1hcmtlciBwZXIgZW50cnksIGBzaXplYCBzYXlpbmcgaG93IG1hbnkgdHJhbnNjcmlwdHMgaXQgc3RhbmRzXG4gICAqIGZvciwgZHJhd24gYXMgdGhlIGxheWVyJ3MgZGlzYyBvciBhcyBlYWNoIGVudHJ5J3MgYHN5bWJvbHNgIGNvZGUuXG4gICAqL1xuICBwcml2YXRlIGRyYXdUcmFuc2NyaXB0cyhcbiAgICBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgICBzaXplOiBGbG9hdDMyQXJyYXksXG4gICAgcmdiYTogRmxvYXQzMkFycmF5LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgeyBzY2FsZSwgdHJhbnNsYXRlIH06IFBsYWNlbWVudCxcbiAgICBzeW1ib2xzOiBVaW50OEFycmF5IHwgbnVsbCxcbiAgICBib3JkZXJXaWR0aDogbnVtYmVyLFxuICApOiBQb2ludHNMYXllciB7XG4gICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShtZXJnZWQuY291bnQgKiAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lcmdlZC5jb3VudDsgaSsrKSB7XG4gICAgICBwb3NpdGlvbnNbMiAqIGldID0gbWVyZ2VkLnhbaV07XG4gICAgICBwb3NpdGlvbnNbMiAqIGkgKyAxXSA9IG1lcmdlZC55W2ldO1xuICAgIH1cbiAgICBjb25zdCBsYXllciA9IHRoaXMuZ3JvdXBzLnZpZXdlciEuYWRkUG9pbnRzKHBvc2l0aW9ucywge1xuICAgICAgbmFtZTogJ3RyYW5zY3JpcHRzJyxcbiAgICAgIHNpemUsXG4gICAgICBmYWNlQ29sb3I6IHJnYmEsXG4gICAgICBib3JkZXJDb2xvcjogUklNX0NPTE9SLFxuICAgICAgYm9yZGVyV2lkdGgsXG4gICAgICBzeW1ib2xzLFxuICAgICAgb3BhY2l0eTogdmlldy50cmFuc2NyaXB0T3BhY2l0eSxcbiAgICAgIHNjYWxlLFxuICAgICAgdHJhbnNsYXRlLFxuICAgIH0pO1xuICAgIHRoaXMuZ3JvdXBzLnJlcGxhY2UoJ3RyYW5zY3JpcHRzJywgbGF5ZXIpO1xuICAgIHJldHVybiBsYXllcjtcbiAgfVxuXG4gIC8qKiBUaGUgc2VsZWN0aW9uIHRoZSBsYXN0IHBsYW4gZmFkZWQgYnksIGFuZCBpdHMgcmV2aXNpb24sIGJ1bXBlZCBlYWNoIHRpbWUgaXQgY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBsYXN0U2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlbGVjdGlvblJldmlzaW9uID0gMDtcblxuICBwcml2YXRlIHNlbGVjdGlvblJldihzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHwgbnVsbCk6IG51bWJlciB7XG4gICAgY29uc3QgbGl2ZSA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24uY291bnQgPiAwID8gc2VsZWN0aW9uIDogbnVsbDtcbiAgICBpZiAobGl2ZSAhPT0gdGhpcy5sYXN0U2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLmxhc3RTZWxlY3Rpb24gPSBsaXZlO1xuICAgICAgdGhpcy5zZWxlY3Rpb25SZXZpc2lvbisrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25SZXZpc2lvbjtcbiAgfVxuXG4gIC8qKiBQZXItZW50cnkgY29sb3VycywgYXMgcGFja2VkIFJHQkEuICovXG4gIHByaXZhdGUgYXN5bmMgdHJhbnNjcmlwdENvbG9ycyhcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgICBjbHVzdGVyT2Y/OiAoaTogbnVtYmVyKSA9PiBzdHJpbmcgfCBudWxsLFxuICApOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xuICAgIGxldCByZ2I6IFJnYltdO1xuICAgIGxldCBjb2RlT2Y6IChpOiBudW1iZXIpID0+IG51bWJlcjtcbiAgICBpZiAodmlldy50cmFuc2NyaXB0Q29sb3JCeSA9PT0gJ2NsdXN0ZXInICYmIGNsdXN0ZXJPZikge1xuICAgICAgLy8gQSBjbHVzdGVyIG5hbWVkIGxpa2UgYSBncm91cCBvZiB0aGUgY2VsbHMnIGdyb3VwaW5nIHRha2VzIHRoYXQgZ3JvdXAncyBjb2xvdXIsIHNvIGFcbiAgICAgIC8vIGNsdXN0ZXIncyB0cmFuc2NyaXB0cyBhbmQgaXRzIGNlbGxzIGFncmVlOyBhbnkgb3RoZXIgY2x1c3RlciB0YWtlcyBhIHBhbGV0dGUgY29sb3VyLlxuICAgICAgY29uc3QgbmFtZSA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgY29uc3QgY29kZXMgPSBuYW1lID8gYXdhaXQgdGhpcy5sb29rdXAuY29kZXMobmFtZSkuY2F0Y2goKCkgPT4gbnVsbCkgOiBudWxsO1xuICAgICAgY29uc3QgY2VsbENvbG9yID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgIGlmIChuYW1lICYmIGNvZGVzPy5tZXRhLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcpIHtcbiAgICAgICAgY29uc3QgY29sb3JzID0gY2F0ZWdvcnlDb2xvcnNGb3IobmFtZSwgY29kZXMubWV0YSwgdmlldy5ncm91cENvbG9ycyk7XG4gICAgICAgIGNvZGVzLm1ldGEuY2F0ZWdvcmllcy5mb3JFYWNoKChjLCBrKSA9PiBjZWxsQ29sb3Iuc2V0KGMsIGNvbG9yc1trXSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29sb3JzID0gY2x1c3RlckNvbG9yTWFwKFxuICAgICAgICB2aWV3LnRyYW5zY3JpcHRHZW5lcyxcbiAgICAgICAgdmlldy50cmFuc2NyaXB0R2VuZUdyb3VwcyxcbiAgICAgICAgY2VsbENvbG9yLFxuICAgICAgICBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEUsXG4gICAgICApO1xuICAgICAgY29uc3QgaW5kZXggPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgY29uc3QgaGV4OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgY29kZUZvciA9IChjbHVzdGVyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IGsgPSBpbmRleC5nZXQoY2x1c3Rlcik7XG4gICAgICAgIGlmIChrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBrID0gaGV4Lmxlbmd0aDtcbiAgICAgICAgICBpbmRleC5zZXQoY2x1c3Rlciwgayk7XG4gICAgICAgICAgaGV4LnB1c2goY29sb3JzLmdldChjbHVzdGVyKSA/PyBjZWxsQ29sb3IuZ2V0KGNsdXN0ZXIpID8/IERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGs7XG4gICAgICB9O1xuICAgICAgY29uc3QgY29kZSA9IG5ldyBJbnQzMkFycmF5KHQuY291bnQpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IGNsdXN0ZXJPZihpKTtcbiAgICAgICAgY29kZVtpXSA9IGMgPT09IG51bGwgPyAtMSA6IGNvZGVGb3IoYyk7XG4gICAgICB9XG4gICAgICByZ2IgPSBoZXgubWFwKHBhcnNlSGV4KTtcbiAgICAgIGNvZGVPZiA9IChpKSA9PiBjb2RlW2ldO1xuICAgIH0gZWxzZSBpZiAodmlldy50cmFuc2NyaXB0Q29sb3JCeSA9PT0gJ2dlbmUnIHx8IHZpZXcudHJhbnNjcmlwdENvbG9yQnkgPT09ICdjbHVzdGVyJykge1xuICAgICAgLy8gQWxsIGdlbmVzOiBjb2RlcyBhcmUgdGhlIGRhdGFzZXQncyBnZW5lIGluZGljZXMsIGNvbG91cmVkIGJ5IG5hbWUgd2hlbiB0aGUgZGF0YXNldFxuICAgICAgLy8gbGlzdHMgdGhlbSAoc28gYSBnZW5lJ3MgY2hvc2VuIGNvbG91ciBhcHBsaWVzKSwgZWxzZSBmb2xkZWQgb250byB0aGUgcGFsZXR0ZS5cbiAgICAgIGNvbnN0IG5hbWVzID0gdmlldy50cmFuc2NyaXB0QWxsR2VuZXMgPyAoZGF0YXNldC50cmFuc2NyaXB0VGlsZXM/LmdlbmVzID8/IG51bGwpIDogdmlldy50cmFuc2NyaXB0R2VuZXM7XG4gICAgICBjb25zdCBuID0gbmFtZXMgPyBuYW1lcy5sZW5ndGggOiBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEUubGVuZ3RoO1xuICAgICAgcmdiID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoX2csIGkpID0+XG4gICAgICAgIHBhcnNlSGV4KFxuICAgICAgICAgIChuYW1lcyAmJiB2aWV3LnRyYW5zY3JpcHRHZW5lQ29sb3JzW25hbWVzW2ldXSkgfHxcbiAgICAgICAgICAgIERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURVtpICUgREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLmxlbmd0aF0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgY29kZU9mID0gbmFtZXMgPyAoaSkgPT4gKHQuZ2VuZVtpXSA8IG4gPyB0LmdlbmVbaV0gOiAtMSkgOiAoaSkgPT4gdC5nZW5lW2ldICUgbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmFtZSA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgY29uc3QgY29kZXMgPSBuYW1lID8gYXdhaXQgdGhpcy5sb29rdXAuY29kZXMobmFtZSkgOiBudWxsO1xuICAgICAgcmdiID1cbiAgICAgICAgbmFtZSAmJiBjb2Rlcz8ubWV0YS5raW5kID09PSAnY2F0ZWdvcmljYWwnXG4gICAgICAgICAgPyBjYXRlZ29yeUNvbG9yc0ZvcihuYW1lLCBjb2Rlcy5tZXRhLCB2aWV3Lmdyb3VwQ29sb3JzKS5tYXAocGFyc2VIZXgpXG4gICAgICAgICAgOiBbXTtcbiAgICAgIGNvZGVPZiA9IChpKSA9PiB7XG4gICAgICAgIGNvbnN0IG8gPSB0Lm9ic2VydmF0aW9uW2ldO1xuICAgICAgICBpZiAoIWNvZGVzIHx8IG8gPT09IE5PX09CU0VSVkFUSU9OKSByZXR1cm4gLTE7XG4gICAgICAgIGNvbnN0IGMgPSBjb2Rlcy5jb2Rlc1tvXTtcbiAgICAgICAgcmV0dXJuIGMgPT09IE5PX0NBVEVHT1JZID8gLTEgOiBjO1xuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmdiYSA9IG5ldyBGbG9hdDMyQXJyYXkodC5jb3VudCAqIDQpO1xuICAgIGNvbnN0IHR1cGxlczogUkdCQVtdID0gcmdiLm1hcCgoW3IsIGcsIGJdKSA9PiBbciAvIDI1NSwgZyAvIDI1NSwgYiAvIDI1NSwgMV0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gY29kZU9mKGkpO1xuICAgICAgcmdiYS5zZXQoYyA8IDAgPyBVTkFTU0lHTkVEX1JHQkEgOiB0dXBsZXNbY10sIGkgKiA0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJnYmE7XG4gIH1cbn1cbiJdfQ==