@jax-data-science/sci-image-visualizer 0.8.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +28 -15
  3. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
  4. package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
  5. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
  7. package/esm2022/lib/contracts/color.mjs +60 -0
  8. package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
  9. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
  10. package/esm2022/lib/contracts/display-types.mjs +11 -1
  11. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/intensity.mjs +48 -5
  13. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  14. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  18. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  19. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  20. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  21. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  25. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  26. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  28. package/esm2022/lib/geometry/contour.mjs +63 -0
  29. package/esm2022/lib/geometry/raster.mjs +98 -0
  30. package/esm2022/lib/geometry/ring.mjs +201 -0
  31. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  32. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  33. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  34. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  35. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  36. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  37. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
  38. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
  39. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
  40. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  41. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  42. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  43. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
  45. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  46. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  47. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  48. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  49. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  50. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
  51. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +361 -4184
  52. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
  53. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  54. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  55. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  56. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
  57. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  58. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  59. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  60. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  61. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  62. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  63. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  64. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  65. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  66. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  67. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  68. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  69. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  70. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  71. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  72. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  73. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  74. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  75. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
  76. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
  77. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  78. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  79. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  80. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  81. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  82. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  83. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  84. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  85. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  86. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  87. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  88. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  89. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  90. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  91. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  92. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  93. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  94. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  95. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  96. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  97. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  98. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  99. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  100. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  101. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  102. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  103. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  104. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  105. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  106. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  107. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  108. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  109. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  110. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  111. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  112. package/esm2022/lib/models/bezier.mjs +1 -11
  113. package/esm2022/lib/models/class-preset.mjs +41 -3
  114. package/esm2022/lib/models/geometry.mjs +27 -164
  115. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  116. package/esm2022/lib/models/polygon-factory.mjs +118 -0
  117. package/esm2022/lib/models/region-clone.mjs +68 -0
  118. package/esm2022/lib/models/region-geojson.mjs +373 -0
  119. package/esm2022/lib/models/region.mjs +34 -33
  120. package/esm2022/lib/models/shape.mjs +18 -16
  121. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  122. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  123. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  124. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  125. package/esm2022/lib/plot.utilities.mjs +296 -473
  126. package/esm2022/lib/processing/image-crop.mjs +1 -1
  127. package/esm2022/lib/processing/processing-image.mjs +28 -15
  128. package/esm2022/lib/provide-visualization.mjs +40 -14
  129. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
  130. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  131. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  132. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  133. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  134. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  135. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  136. package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
  137. package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
  138. package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
  139. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
  140. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  141. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  142. package/esm2022/lib/region-ops.service.mjs +28 -70
  143. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  144. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  145. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  146. package/esm2022/lib/render-orchestrator.mjs +14 -11
  147. package/esm2022/lib/render-session.mjs +207 -0
  148. package/esm2022/lib/routing-visualizer.service.mjs +459 -411
  149. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  150. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  151. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  152. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  153. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  154. package/esm2022/lib/spatial/lod.mjs +187 -0
  155. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  156. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  157. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  158. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  159. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  160. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  161. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  162. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  163. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  164. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  165. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  166. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  167. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  168. package/esm2022/lib/spatial/stats.mjs +71 -0
  169. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  170. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  171. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  172. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  173. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  174. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  175. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  176. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  177. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  178. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  179. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  180. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  181. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  182. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  183. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  184. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  185. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  186. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  187. package/esm2022/lib/store/class-color.util.mjs +46 -3
  188. package/esm2022/lib/store/region-history.mjs +146 -0
  189. package/esm2022/lib/store/region-scope-cache.mjs +140 -0
  190. package/esm2022/lib/store/region-selection.mjs +82 -0
  191. package/esm2022/lib/store/region-store.service.mjs +279 -675
  192. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  193. package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
  194. package/esm2022/lib/toast-outlets.mjs +5 -4
  195. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  196. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  197. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  198. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  199. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  200. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
  201. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  202. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  203. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  204. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  205. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  206. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  207. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  208. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  209. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  210. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  211. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  212. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  213. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  214. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
  215. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  216. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  217. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  218. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  219. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  220. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  221. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  222. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  223. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  224. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  225. package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
  226. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  227. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  228. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  229. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  230. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  231. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  232. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  233. package/esm2022/lib/util/supersede.mjs +56 -0
  234. package/esm2022/lib/visualization.module.mjs +39 -141
  235. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  236. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  237. package/esm2022/lib/visualizer/region-load.mjs +60 -0
  238. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  239. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  240. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  241. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  242. package/esm2022/lib/visualizer.component.mjs +480 -1902
  243. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  244. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  245. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  246. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
  247. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
  248. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
  249. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
  250. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  251. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  252. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34430
  253. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  254. package/fesm2022/mask.worker.js +36 -917
  255. package/fesm2022/onnx-sam.worker.js +52 -16
  256. package/fesm2022/spatial-math.worker.js +471 -0
  257. package/fesm2022/tsne.worker.js +32 -15
  258. package/index.d.ts +13 -10
  259. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  260. package/lib/contracts/capabilities.contract.d.ts +4 -2
  261. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  262. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  263. package/lib/contracts/color.d.ts +27 -0
  264. package/lib/contracts/colormap-lut.d.ts +19 -4
  265. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  266. package/lib/contracts/display-types.d.ts +21 -0
  267. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  268. package/lib/contracts/intensity.d.ts +13 -2
  269. package/lib/contracts/plot-type.d.ts +3 -1
  270. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  271. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  272. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  273. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  274. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  275. package/lib/contracts/region-editor-api.contract.d.ts +1 -1
  276. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  277. package/lib/contracts/sam.contract.d.ts +7 -0
  278. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  279. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  280. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  281. package/lib/contracts/visualizer.contract.d.ts +221 -54
  282. package/lib/contracts/viz-config.d.ts +1 -0
  283. package/lib/geometry/contour.d.ts +24 -0
  284. package/lib/geometry/raster.d.ts +42 -0
  285. package/lib/geometry/ring.d.ts +67 -0
  286. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  287. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  288. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  289. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  290. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  291. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  292. package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
  293. package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
  294. package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
  295. package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
  296. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  297. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  298. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  299. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
  300. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  301. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  302. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  303. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  304. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  305. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  306. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -878
  307. package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
  308. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  309. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  310. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  311. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  312. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  313. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  314. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  315. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  316. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  317. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  318. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  319. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  320. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  321. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  322. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  323. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  324. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  325. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  326. package/lib/implementations/osd/osd-export.d.ts +36 -0
  327. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  328. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  329. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  330. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
  331. package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
  332. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  333. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  334. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  335. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  336. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  337. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  338. package/lib/implementations/osd/simple-source.d.ts +161 -0
  339. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  340. package/lib/implementations/osd/tile-client.d.ts +11 -14
  341. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  342. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  343. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  344. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  345. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  346. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  347. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  348. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  349. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  350. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  351. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  352. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  353. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  354. package/lib/implementations/region-centroids.d.ts +14 -0
  355. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  356. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  357. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  358. package/lib/implementations/tile-server/index.d.ts +5 -0
  359. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  360. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  361. package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
  362. package/lib/implementations/tile-server/transport.d.ts +62 -0
  363. package/lib/intensity/intensity-profile.d.ts +66 -0
  364. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  365. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  366. package/lib/models/bezier.d.ts +0 -5
  367. package/lib/models/class-preset.d.ts +18 -0
  368. package/lib/models/geometry.d.ts +14 -48
  369. package/lib/models/polygon-edit.d.ts +72 -0
  370. package/lib/models/polygon-factory.d.ts +40 -0
  371. package/lib/models/region-clone.d.ts +20 -0
  372. package/lib/models/region-geojson.d.ts +17 -0
  373. package/lib/models/region.d.ts +40 -4
  374. package/lib/models/shape.d.ts +8 -0
  375. package/lib/plot-mode/contribution-host.d.ts +125 -0
  376. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  377. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  378. package/lib/plot.utilities.d.ts +19 -30
  379. package/lib/processing/processing-image.d.ts +5 -2
  380. package/lib/provide-visualization.d.ts +19 -2
  381. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
  382. package/lib/region-editor/file-stem.d.ts +7 -0
  383. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  384. package/lib/region-editor/mask-export.service.d.ts +54 -0
  385. package/lib/region-editor/mask-raster.d.ts +2 -8
  386. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  387. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  388. package/lib/region-editor/region-editor.component.d.ts +166 -199
  389. package/lib/region-editor/region-metrics.d.ts +26 -0
  390. package/lib/region-editor/region-persistence.service.d.ts +69 -0
  391. package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
  392. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  393. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  394. package/lib/region-ops.service.d.ts +1 -7
  395. package/lib/region-overlay/region-geometry.d.ts +157 -0
  396. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  397. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  398. package/lib/render-orchestrator.d.ts +6 -2
  399. package/lib/render-session.d.ts +75 -0
  400. package/lib/routing-visualizer.service.d.ts +110 -58
  401. package/lib/spatial/density-raster.d.ts +6 -0
  402. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  403. package/lib/spatial/embedding-compute.d.ts +21 -2
  404. package/lib/spatial/glyphs.d.ts +16 -0
  405. package/lib/spatial/lod.d.ts +94 -0
  406. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  407. package/lib/spatial/spatial-density.d.ts +15 -5
  408. package/lib/spatial/spatial-encoding.d.ts +11 -44
  409. package/lib/spatial/spatial-expression.d.ts +40 -22
  410. package/lib/spatial/spatial-framing.d.ts +1 -0
  411. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  412. package/lib/spatial/spatial-hover.d.ts +4 -16
  413. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  414. package/lib/spatial/spatial-selection.d.ts +21 -26
  415. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  416. package/lib/spatial/spatial-tiles.d.ts +9 -256
  417. package/lib/spatial/stats.d.ts +38 -0
  418. package/lib/spatial/transcript-grouping.d.ts +119 -0
  419. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  420. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  421. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  422. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  423. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  424. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  425. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  426. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  427. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  428. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  429. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  430. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  431. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  432. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  433. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  434. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  435. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  436. package/lib/store/class-color.util.d.ts +35 -1
  437. package/lib/store/region-history.d.ts +66 -0
  438. package/lib/store/region-scope-cache.d.ts +63 -0
  439. package/lib/store/region-selection.d.ts +36 -0
  440. package/lib/store/region-store.service.d.ts +104 -112
  441. package/lib/store/visualizer-store.service.d.ts +22 -33
  442. package/lib/toast-outlets.d.ts +4 -3
  443. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  444. package/lib/toolbar/canvas-tools.d.ts +20 -0
  445. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  446. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  447. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  448. package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
  449. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  450. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  451. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  452. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  453. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  454. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  455. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  456. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  457. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  458. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  459. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  460. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  461. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  462. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
  463. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  464. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  465. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  466. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  467. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  468. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  469. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  470. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  471. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  472. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  473. package/lib/toolbar/toolbar.component.d.ts +47 -83
  474. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  475. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  476. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  477. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  478. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  479. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  480. package/lib/util/mark-for-check.d.ts +11 -0
  481. package/lib/util/supersede.d.ts +53 -0
  482. package/lib/visualization.module.d.ts +18 -39
  483. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  484. package/lib/visualizer/region-actions.d.ts +54 -0
  485. package/lib/visualizer/region-load.d.ts +27 -0
  486. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  487. package/lib/visualizer/tool-modes.d.ts +49 -0
  488. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  489. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  490. package/lib/visualizer.component.d.ts +201 -447
  491. package/lib/workers/spatial-math-ops.d.ts +65 -0
  492. package/lib/workers/spatial-math-worker.d.ts +7 -0
  493. package/lib/workers/spatial-math.d.ts +74 -0
  494. package/package.json +12 -3
  495. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  496. package/src/lib/styles/viz-icons.scss +14 -0
  497. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  498. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  499. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  500. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  501. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  502. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  503. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  504. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  505. package/src/lib/assets/cell-detection.svg +0 -37
  506. package/src/lib/assets/click.svg +0 -1
  507. package/src/lib/assets/colormap-luts.json +0 -1
  508. package/src/lib/assets/edit-selection-white.svg +0 -47
  509. package/src/lib/assets/icons/colormap-earth.png +0 -0
  510. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  511. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  512. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  513. package/src/lib/assets/picture-segmentation.svg +0 -43
  514. package/src/lib/assets/test/download-379.svg +0 -1
  515. package/src/lib/assets/test/download-98.svg +0 -1
  516. package/src/lib/assets/test/json-1.svg +0 -1
  517. package/src/lib/assets/test/load-53.svg +0 -1
  518. package/src/lib/assets/test/mask-44.svg +0 -1
  519. package/src/lib/assets/test/mask-download-44.svg +0 -15
  520. package/src/lib/assets/test/mask-save-44.svg +0 -11
  521. package/src/lib/assets/test/overlay-1.svg +0 -1
  522. package/src/lib/assets/test/overlay-4.svg +0 -1
  523. package/src/lib/assets/test/region-26.svg +0 -1
  524. package/src/lib/assets/test/save-56.svg +0 -1
  525. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -1,5 +1,6 @@
1
1
  import { PlotType } from '../../contracts/plot-type';
2
2
  import { bt601Luminance } from '../../contracts/intensity';
3
+ import { polygonCentroid } from '../region-centroids';
3
4
  // ── helpers ──────────────────────────────────────────────────────────────
4
5
  /** Scalar value of a frame cell: `[r, g, b]` → BT.601 luminance, scalar as-is. */
5
6
  function luminance(cell) {
@@ -46,7 +47,9 @@ function downsampleMatrix(matrix, sx, sy) {
46
47
  * the heatmap trace geometry (x0/dx/y0/dy) so it lines up with the image axes;
47
48
  * the stride scales dx/dy so the coarser grid still spans the true extent. */
48
49
  function buildContourTraces(input) {
49
- const [x0, , y0] = [input.trueImageSize[0], input.trueImageSize[1], input.trueImageSize[2]];
50
+ // Sample k is cell k·stride, so the samples keep the cells' centres.
51
+ const x0 = firstCellCentre(input.trueImageSize[0], input.ratios[0]);
52
+ const y0 = firstCellCentre(input.trueImageSize[2], input.ratios[0]);
50
53
  return input.frames.map((frame, index) => {
51
54
  const scalar = toScalarFrame(frame, input.isGrayscale);
52
55
  const height = scalar.length;
@@ -77,16 +80,15 @@ function buildScatterTraces(input) {
77
80
  const ys = [];
78
81
  const text = [];
79
82
  input.regions.forEach((poly, i) => {
80
- const n = poly.xpoints.length;
81
- if (n === 0)
83
+ const c = polygonCentroid(poly.xpoints, poly.ypoints);
84
+ if (!c)
82
85
  return;
83
- const cx = poly.xpoints.reduce((a, b) => a + b, 0) / n;
84
- const cy = poly.ypoints.reduce((a, b) => a + b, 0) / n;
85
- xs.push(cx);
86
- ys.push(cy);
86
+ xs.push(c[0]);
87
+ ys.push(c[1]);
87
88
  text.push(`R${i + 1}`);
88
89
  });
89
- return [{
90
+ return [
91
+ {
90
92
  x: xs,
91
93
  y: ys,
92
94
  text,
@@ -95,7 +97,8 @@ function buildScatterTraces(input) {
95
97
  textposition: 'top center',
96
98
  marker: { size: 10, color: input.shapeColor, line: { color: '#000', width: 1 } },
97
99
  name: 'Region centroids',
98
- }];
100
+ },
101
+ ];
99
102
  }
100
103
  /**
101
104
  * Collect a downsampled regular grid of voxels across the z-stack.
@@ -103,7 +106,7 @@ function buildScatterTraces(input) {
103
106
  * A single-frame image is thickened to two z-planes so 3D traces render.
104
107
  */
105
108
  function sampleVolume(input, maxXY, maxZ) {
106
- let frames = input.frames.map(f => toScalarFrame(f, input.isGrayscale));
109
+ let frames = input.frames.map((f) => toScalarFrame(f, input.isGrayscale));
107
110
  if (frames.length < 2)
108
111
  frames = [frames[0] || [], frames[0] || []];
109
112
  const height = frames[0].length;
@@ -131,10 +134,13 @@ function sampleVolume(input, maxXY, maxZ) {
131
134
  /** SCATTER3D — downsampled voxels as intensity-coloured 3D markers. */
132
135
  function buildScatter3dTraces(input) {
133
136
  const { x, y, z, value } = sampleVolume(input, 48, 40);
134
- return [{
137
+ return [
138
+ {
135
139
  type: 'scatter3d',
136
140
  mode: 'markers',
137
- x, y, z,
141
+ x,
142
+ y,
143
+ z,
138
144
  marker: {
139
145
  size: 2,
140
146
  color: value,
@@ -143,7 +149,8 @@ function buildScatter3dTraces(input) {
143
149
  opacity: 0.8,
144
150
  },
145
151
  name: 'Voxels',
146
- }];
152
+ },
153
+ ];
147
154
  }
148
155
  /** ISOSURFACE — iso-intensity surfaces over the downsampled volume grid.
149
156
  * isomin/isomax come straight from the toolbar range slider (0–255). */
@@ -154,9 +161,13 @@ function buildIsosurfaceTraces(input) {
154
161
  // We only guard ordering here.
155
162
  const isoMin = Math.min(input.isoMin, input.isoMax);
156
163
  const isoMax = Math.max(input.isoMin, input.isoMax);
157
- return [{
164
+ return [
165
+ {
158
166
  type: 'isosurface',
159
- x, y, z, value,
167
+ x,
168
+ y,
169
+ z,
170
+ value,
160
171
  isomin: isoMin,
161
172
  isomax: isoMax,
162
173
  // A few nested levels (not just the two band extremes): even if an extreme
@@ -168,7 +179,8 @@ function buildIsosurfaceTraces(input) {
168
179
  opacity: 0.6,
169
180
  caps: { x: { show: false }, y: { show: false }, z: { show: false } },
170
181
  name: 'Isosurface',
171
- }];
182
+ },
183
+ ];
172
184
  }
173
185
  /** Registry of the pluggable (non-original) plot types. */
174
186
  export const PLOTLY_PLOT_TYPE_IMPLS = {
@@ -177,7 +189,55 @@ export const PLOTLY_PLOT_TYPE_IMPLS = {
177
189
  [PlotType.SCATTER3D]: { buildTraces: buildScatter3dTraces, layoutKind: '3d-volume', threeD: true },
178
190
  [PlotType.ISOSURFACE]: { buildTraces: buildIsosurfaceTraces, layoutKind: '3d-volume', threeD: true },
179
191
  };
180
- export function getPlotTypeImpl(type) {
181
- return PLOTLY_PLOT_TYPE_IMPLS[type];
192
+ // ── HEATMAP / SURFACE / RGB image (the original renderers) ─────────────────
193
+ /**
194
+ * Plotly centres cell i on `x0 + i·dx`. Image pixel i covers `[i, i + 1)` on every backend (OSD
195
+ * and napari draw it there, and the tools, regions and GeoJSON use that frame), so the first cell
196
+ * is centred half a cell in from the image's (or the zoom crop's) corner.
197
+ */
198
+ function firstCellCentre(corner, step) {
199
+ return corner + step / 2;
200
+ }
201
+ /**
202
+ * One grayscale heatmap trace per z-plane, only the first visible (the layout's
203
+ * slider switches them). `trueImgSize` is [x0, x1, y0, y1]; `ratios` the data
204
+ * units per pixel. No per-cell hover text: building it for every pixel is too slow.
205
+ */
206
+ export function buildHeatmapTraces(frames, trueImgSize, ratios, colorscale, reversescale) {
207
+ return frames.map((z, index) => ({
208
+ x0: firstCellCentre(trueImgSize[0], ratios[0]),
209
+ dx: ratios[0],
210
+ y0: firstCellCentre(trueImgSize[2], ratios[0]),
211
+ dy: ratios[0],
212
+ z,
213
+ type: 'heatmap',
214
+ hoverinfo: 'none',
215
+ colorscale,
216
+ reversescale,
217
+ name: `Slice ${index + 1}`,
218
+ visible: index === 0,
219
+ }));
220
+ }
221
+ /** One grayscale surface trace per frame, coloured by the active colormap. */
222
+ export function buildSurfaceTraces(frames, colorscale, reversescale) {
223
+ return frames.map((z) => ({ z, type: 'surface', colorscale, reversescale }));
224
+ }
225
+ /** One RGB `image` trace per z-plane (width × height pixels), only the first visible. With
226
+ * `sources`, each plane draws its PNG data URI instead of its `z` cells (the browser draws it;
227
+ * Plotly paints `z` one rectangle per pixel). */
228
+ export function buildRgbImageTraces(frames, trueImgSize, ratios, width, height, sources) {
229
+ return frames.map((z, index) => ({
230
+ x0: firstCellCentre(trueImgSize[0], ratios[0]),
231
+ dx: ratios[0],
232
+ y0: firstCellCentre(trueImgSize[2], ratios[0]),
233
+ dy: ratios[0],
234
+ x: Array.from(Array(width).keys()),
235
+ y: Array.from(Array(height).keys()),
236
+ ...(sources ? { source: sources[index] } : { z }),
237
+ hoverinfo: 'none', // no per-cell hover text: too slow for every pixel
238
+ type: 'image',
239
+ name: `Slice ${index + 1}`,
240
+ visible: index === 0,
241
+ }));
182
242
  }
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxvdGx5LXRyYWNlLWJ1aWxkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvcGxvdGx5L3Bsb3RseS10cmFjZS1idWlsZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBNEQzRCw0RUFBNEU7QUFFNUUsa0ZBQWtGO0FBQ2xGLFNBQVMsU0FBUyxDQUFDLElBQVM7SUFDMUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDeEIsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsT0FBTyxJQUFjLENBQUM7QUFDeEIsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxTQUFTLGFBQWEsQ0FBQyxLQUFZLEVBQUUsV0FBb0I7SUFDdkQsSUFBSSxXQUFXO1FBQUUsT0FBTyxLQUFtQixDQUFDO0lBQzVDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsU0FBUyxTQUFTLENBQUMsTUFBYyxFQUFFLFVBQWtCO0lBQ25ELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQsNEVBQTRFO0FBRTVFOzs7b0ZBR29GO0FBQ3BGLE1BQU0sbUJBQW1CLEdBQUcsR0FB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QUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3BFLElBQUksRUFBRSxZQUFZO1NBQ25CLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCwyREFBMkQ7QUFDM0QsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQWtEO0lBQ25GLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFLLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFLLFVBQVUsRUFBRSxVQUFVLEVBQUksTUFBTSxFQUFFLEtBQUssRUFBRTtJQUN0RyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBSyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBSyxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7SUFDdEcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUcsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUcsVUFBVSxFQUFFLFdBQVcsRUFBRyxNQUFNLEVBQUUsSUFBSSxFQUFFO0lBQ3JHLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUcsTUFBTSxFQUFFLElBQUksRUFBRTtDQUN0RyxDQUFDO0FBRUYsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFjO0lBQzVDLE9BQU8sc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsb3RUeXBlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQgeyBidDYwMUx1bWluYW5jZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbnRlbnNpdHknO1xuXG4vKipcbiAqIFBsdWdnYWJsZSBQbG90bHkgdHJhY2UgYnVpbGRlcnMgZm9yIHRoZSBwbG90IHR5cGVzIGFkZGVkIG9uIHRvcCBvZiB0aGVcbiAqIG9yaWdpbmFsIEhFQVRNQVAgLyBTVVJGQUNFIC8gUkdCLWltYWdlIHJlbmRlcmVycy5cbiAqXG4gKiBERVNJR04gLyBFWFRSQUNUSU9OIEFMSUdOTUVOVFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZXJ5IGZ1bmN0aW9uIGhlcmUgaXMgKipwdXJlKiog4oCUIGl0IHRha2VzIGEgYFRyYWNlQnVpbGRJbnB1dGAgYW5kIHJldHVybnNcbiAqIFBsb3RseSB0cmFjZSBkaWN0cy4gVGhlcmUgaXMgbm8gQW5ndWxhciwgbm8gUnhKUywgbm8gaG9zdC1zdGF0ZSBjb3VwbGluZ1xuICogKGBNYWluU3RhdGVgLCBgRmlsZXNTZXJ2aWNlYCwg4oCmKS4gVGhhdCBrZWVwcyB0aGUgbW9kdWxlIHJlbG9jYXRhYmxlIGludG8gdGhlXG4gKiBmdXR1cmUgYEBqYXgtZGF0YS1zY2llbmNlL2ltYWdlLXZpc3VhbGl6YXRpb25gIGxpYnJhcnkgY29yZSAoc2VlIHRoZVxuICogYHNrZXRjaC9qaXQtcGxvdHRpbmctZXh0cmFjdGlvbmAgU09XKSB3aXRob3V0IHBvcnQgc3VyZ2VyeS5cbiAqXG4gKiBMYXlvdXQgYnVpbGRpbmcgc3RheXMgaW4gYFBsb3RseVNlcnZpY2VgIChpdCBuZWVkcyBsaXZlIHNlcnZpY2Ugc3RhdGUgc3VjaFxuICogYXMgc2NyZWVuIGhlaWdodCwgc2NhbGUgcmF0aW8gYW5kIHRoZSBjdXJyZW50IHNoYXBlcyk7IG9ubHkgVFJBQ0UgYnVpbGRpbmdcbiAqIGlzIHBsdWdnYWJsZSBoZXJlLiBUbyBhZGQgYSBuZXcgcGxvdCB0eXBlOiB3cml0ZSBhIGJ1aWxkZXIsIHJlZ2lzdGVyIGl0IGluXG4gKiBgUExPVExZX1BMT1RfVFlQRV9JTVBMU2AsIGFuZCBhZGQgYSBkZXNjcmlwdG9yIGluIGBjb250cmFjdHMvcGxvdC10eXBlLnRzYC5cbiAqXG4gKiBUaGUgb3JpZ2luYWwgSEVBVE1BUC9TVVJGQUNFL1JHQiB0eXBlcyBpbnRlbnRpb25hbGx5IGtlZXAgdGhlaXIgZGVkaWNhdGVkXG4gKiByZW5kZXJlcnMgaW4gYFBsb3RseVNlcnZpY2VgICh0aGV5IGFyZSBhbHNvIHJldXNlZCBieSB0aGUgaGlnaC1kZWYgem9vbVxuICogcmUtZmV0Y2ggcGF0aCksIHNvIHRoZXkgYXJlIE5PVCByZWdpc3RlcmVkIGhlcmUuXG4gKi9cblxuLyoqIE5vcm1hbGlzZWQgaW5wdXQgZm9yIGEgdHJhY2UgYnVpbGRlci4gRnJhbWVzIGFyZSBwZXItei1wbGFuZSBtYXRyaWNlczpcbiAqICBncmF5c2NhbGUgY2VsbHMgYXJlIHNjYWxhcnMsIFJHQiBjZWxscyBhcmUgYFtyLCBnLCBiXWAuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNlQnVpbGRJbnB1dCB7XG4gIGZyYW1lczogYW55W107XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICAvKiogW3hSYXRpbywgeVJhdGlvXSDigJQgZGF0YSB1bml0cyBwZXIgcGl4ZWwuICovXG4gIHJhdGlvczogbnVtYmVyW107XG4gIC8qKiBbeDAsIHgxLCB5MCwgeTFdIOKAlCB0cnVlIGltYWdlIGV4dGVudCBpbiBkYXRhIHVuaXRzLiAqL1xuICB0cnVlSW1hZ2VTaXplOiBudW1iZXJbXTtcbiAgaXNHcmF5c2NhbGU6IGJvb2xlYW47XG4gIC8qKiBQbG90bHkgY29sb3JzY2FsZSB2YWx1ZSAoZS5nLiBmcm9tIHRoZSBhY3RpdmUgY29sb3JtYXApLiAqL1xuICBjb2xvcnNjYWxlOiBhbnk7XG4gIHJldmVyc2VzY2FsZTogYm9vbGVhbjtcbiAgLyoqIFJlZ2lvbiBwb2x5Z29ucyBpbiBkYXRhIGNvb3JkcywgZm9yIHJlZ2lvbi1zb3VyY2VkIHBsb3RzIChTQ0FUVEVSKS4gKi9cbiAgcmVnaW9uczogeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW10gfVtdO1xuICAvKiogRGVmYXVsdCBtYXJrZXIvbGluZSBjb2xvdXIgZm9yIGRlcml2ZWQgKG5vbi1pbWFnZS1MVVQpIHRyYWNlcy4gKi9cbiAgc2hhcGVDb2xvcjogc3RyaW5nO1xuICAvKiogSVNPU1VSRkFDRSBpbnRlbnNpdHkgYm91bmRzICgw4oCTMjU1KTogc3VyZmFjZXMgYXJlIGRyYXduIGZvciB2YWx1ZXMgaW5cbiAgICogIFtpc29NaW4sIGlzb01heF0sIG1hcHBlZCBzdHJhaWdodCBvbnRvIFBsb3RseSdzIGlzb21pbi9pc29tYXguICovXG4gIGlzb01pbjogbnVtYmVyO1xuICBpc29NYXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2VCdWlsZGVyID0gKGlucHV0OiBUcmFjZUJ1aWxkSW5wdXQpID0+IGFueVtdO1xuXG5leHBvcnQgdHlwZSBQbG90TGF5b3V0S2luZCA9ICcyZC1pbWFnZScgfCAnMmQtb3ZlcmxheScgfCAnMmQtY2hhcnQnIHwgJzNkLXZvbHVtZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxvdGx5UGxvdFR5cGVJbXBsIHtcbiAgYnVpbGRUcmFjZXM6IFRyYWNlQnVpbGRlcjtcbiAgLyoqIFdoaWNoIGxheW91dCBgUGxvdGx5U2VydmljZWAgc2hvdWxkIGJ1aWxkIGZvciB0aGlzIHR5cGUuICovXG4gIGxheW91dEtpbmQ6IFBsb3RMYXlvdXRLaW5kO1xuICAvKiogVHJ1ZSBmb3Igc2NlbmUtYmFzZWQgKDNEKSB0cmFjZXMg4oCUIHBpY2tzIHRoZSAzRCBQbG90bHkgY29uZmlnLiAqL1xuICB0aHJlZUQ6IGJvb2xlYW47XG59XG5cbi8vIOKUgOKUgCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogU2NhbGFyIHZhbHVlIG9mIGEgZnJhbWUgY2VsbDogYFtyLCBnLCBiXWAg4oaSIEJULjYwMSBsdW1pbmFuY2UsIHNjYWxhciBhcy1pcy4gKi9cbmZ1bmN0aW9uIGx1bWluYW5jZShjZWxsOiBhbnkpOiBudW1iZXIge1xuICBpZiAoQXJyYXkuaXNBcnJheShjZWxsKSkge1xuICAgIHJldHVybiBidDYwMUx1bWluYW5jZShjZWxsWzBdLCBjZWxsWzFdLCBjZWxsWzJdKTtcbiAgfVxuICByZXR1cm4gY2VsbCBhcyBudW1iZXI7XG59XG5cbi8qKiBQcm9qZWN0IGEgZnJhbWUgdG8gYSBzY2FsYXIgbWF0cml4IChSR0Ig4oaSIGx1bWluYW5jZSwgZ3JheXNjYWxlIOKGkiBhcy1pcykuICovXG5mdW5jdGlvbiB0b1NjYWxhckZyYW1lKGZyYW1lOiBhbnlbXSwgaXNHcmF5c2NhbGU6IGJvb2xlYW4pOiBudW1iZXJbXVtdIHtcbiAgaWYgKGlzR3JheXNjYWxlKSByZXR1cm4gZnJhbWUgYXMgbnVtYmVyW11bXTtcbiAgcmV0dXJuIGZyYW1lLm1hcCgocm93OiBhbnlbXSkgPT4gcm93Lm1hcChsdW1pbmFuY2UpKTtcbn1cblxuLyoqIEV2ZW4gc3RyaWRlIHRoYXQga2VlcHMgYW4gYXhpcyB1bmRlciBgbWF4U2FtcGxlc2Agc2FtcGxlIHBvaW50cy4gKi9cbmZ1bmN0aW9uIHN0cmlkZUZvcihsZW5ndGg6IG51bWJlciwgbWF4U2FtcGxlczogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWF4KDEsIE1hdGguY2VpbChsZW5ndGggLyBtYXhTYW1wbGVzKSk7XG59XG5cbi8vIOKUgOKUgCBidWlsZGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIE1heCBjZWxscyBwZXIgYXhpcyB0aGUgY29udG91ciBncmlkIGlzIGRvd25zYW1wbGVkIHRvLiBUaGUgaGVhdG1hcCB0cmFjZSBjYW5cbiAqICByYXN0ZXIgdGhlIGZ1bGwgcHJldmlldyBjaGVhcGx5LCBidXQgY29udG91ciBydW5zIENQVSBtYXJjaGluZy1zcXVhcmVzIG92ZXJcbiAqICBldmVyeSBjZWxsLCBzbyBhIGZ1bGwtcmVzb2x1dGlvbiBwcmV2aWV3ICh+MTAwMMKyKSBjb3N0cyBzZWNvbmRzLiBDb250b3Vyc1xuICogIGludGVycG9sYXRlLCBzbyBhIGNvYXJzZXIgZ3JpZCBsb29rcyB0aGUgc2FtZSB3aGlsZSByZW5kZXJpbmcgbmVhci1pbnN0YW50bHkuICovXG5jb25zdCBDT05UT1VSX01BWF9TQU1QTEVTID0gNDAwO1xuXG4vKiogRXZlcnkgYHN4YC10aCBjb2x1bW4gLyBgc3lgLXRoIHJvdyBvZiBhIHNjYWxhciBtYXRyaXguICovXG5mdW5jdGlvbiBkb3duc2FtcGxlTWF0cml4KG1hdHJpeDogbnVtYmVyW11bXSwgc3g6IG51bWJlciwgc3k6IG51bWJlcik6IG51bWJlcltdW10ge1xuICBpZiAoc3ggPD0gMSAmJiBzeSA8PSAxKSByZXR1cm4gbWF0cml4O1xuICBjb25zdCBvdXQ6IG51bWJlcltdW10gPSBbXTtcbiAgZm9yIChsZXQgciA9IDA7IHIgPCBtYXRyaXgubGVuZ3RoOyByICs9IHN5KSB7XG4gICAgY29uc3Qgcm93ID0gbWF0cml4W3JdO1xuICAgIGlmIChzeCA8PSAxKSB7IG91dC5wdXNoKHJvdyk7IGNvbnRpbnVlOyB9XG4gICAgY29uc3Qgc2FtcGxlZDogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IHJvdy5sZW5ndGg7IGMgKz0gc3gpIHNhbXBsZWQucHVzaChyb3dbY10pO1xuICAgIG91dC5wdXNoKHNhbXBsZWQpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBDT05UT1VSIOKAlCBwZXItZnJhbWUgaXNvLWNvbnRvdXJzIG92ZXIgYSBkb3duc2FtcGxlZCBzY2FsYXIgbWF0cml4LiBNaXJyb3JzXG4gKiAgdGhlIGhlYXRtYXAgdHJhY2UgZ2VvbWV0cnkgKHgwL2R4L3kwL2R5KSBzbyBpdCBsaW5lcyB1cCB3aXRoIHRoZSBpbWFnZSBheGVzO1xuICogIHRoZSBzdHJpZGUgc2NhbGVzIGR4L2R5IHNvIHRoZSBjb2Fyc2VyIGdyaWQgc3RpbGwgc3BhbnMgdGhlIHRydWUgZXh0ZW50LiAqL1xuZnVuY3Rpb24gYnVpbGRDb250b3VyVHJhY2VzKGlucHV0OiBUcmFjZUJ1aWxkSW5wdXQpOiBhbnlbXSB7XG4gIGNvbnN0IFt4MCwgLCB5MF0gPSBbaW5wdXQudHJ1ZUltYWdlU2l6ZVswXSwgaW5wdXQudHJ1ZUltYWdlU2l6ZVsxXSwgaW5wdXQudHJ1ZUltYWdlU2l6ZVsyXV07XG4gIHJldHVybiBpbnB1dC5mcmFtZXMubWFwKChmcmFtZSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBzY2FsYXIgPSB0b1NjYWxhckZyYW1lKGZyYW1lLCBpbnB1dC5pc0dyYXlzY2FsZSk7XG4gICAgY29uc3QgaGVpZ2h0ID0gc2NhbGFyLmxlbmd0aDtcbiAgICBjb25zdCB3aWR0aCA9IGhlaWdodCA+IDAgPyBzY2FsYXJbMF0ubGVuZ3RoIDogMDtcbiAgICBjb25zdCBzeCA9IHN0cmlkZUZvcih3aWR0aCwgQ09OVE9VUl9NQVhfU0FNUExFUyk7XG4gICAgY29uc3Qgc3kgPSBzdHJpZGVGb3IoaGVpZ2h0LCBDT05UT1VSX01BWF9TQU1QTEVTKTtcbiAgICByZXR1cm4ge1xuICAgICAgeDAsXG4gICAgICBkeDogaW5wdXQucmF0aW9zWzBdICogc3gsXG4gICAgICB5MCxcbiAgICAgIGR5OiBpbnB1dC5yYXRpb3NbMF0gKiBzeSxcbiAgICAgIHo6IGRvd25zYW1wbGVNYXRyaXgoc2NhbGFyLCBzeCwgc3kpLFxuICAgICAgdHlwZTogJ2NvbnRvdXInLFxuICAgICAgaG92ZXJpbmZvOiAnbm9uZScsXG4gICAgICBjb2xvcnNjYWxlOiBpbnB1dC5jb2xvcnNjYWxlLFxuICAgICAgcmV2ZXJzZXNjYWxlOiBpbnB1dC5yZXZlcnNlc2NhbGUsXG4gICAgICBjb250b3VyczogeyBjb2xvcmluZzogJ2hlYXRtYXAnIH0sXG4gICAgICAvLyBDYXAgdGhlIGxldmVsIGNvdW50IHNvIGl0IGRvZXNuJ3Qgc2NhbGUgd2l0aCB0aGUgKG5vdyBjb2Fyc2VyKSBncmlkLlxuICAgICAgbmNvbnRvdXJzOiAxNSxcbiAgICAgIG5hbWU6IGBTbGljZSAke2luZGV4ICsgMX1gLFxuICAgICAgdmlzaWJsZTogaW5kZXggPT09IDAsXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKiBTQ0FUVEVSIOKAlCByZWdpb24gY2VudHJvaWRzIGFzIGxhYmVsbGVkIG1hcmtlcnMgKHJlZ2lvbi1zb3VyY2VkKS4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2NhdHRlclRyYWNlcyhpbnB1dDogVHJhY2VCdWlsZElucHV0KTogYW55W10ge1xuICBjb25zdCB4czogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgeXM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHRleHQ6IHN0cmluZ1tdID0gW107XG4gIGlucHV0LnJlZ2lvbnMuZm9yRWFjaCgocG9seSwgaSkgPT4ge1xuICAgIGNvbnN0IG4gPSBwb2x5Lnhwb2ludHMubGVuZ3RoO1xuICAgIGlmIChuID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgY3ggPSBwb2x5Lnhwb2ludHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyBuO1xuICAgIGNvbnN0IGN5ID0gcG9seS55cG9pbnRzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gbjtcbiAgICB4cy5wdXNoKGN4KTtcbiAgICB5cy5wdXNoKGN5KTtcbiAgICB0ZXh0LnB1c2goYFIke2kgKyAxfWApO1xuICB9KTtcbiAgcmV0dXJuIFt7XG4gICAgeDogeHMsXG4gICAgeTogeXMsXG4gICAgdGV4dCxcbiAgICB0eXBlOiAnc2NhdHRlcicsXG4gICAgbW9kZTogJ21hcmtlcnMrdGV4dCcsXG4gICAgdGV4dHBvc2l0aW9uOiAndG9wIGNlbnRlcicsXG4gICAgbWFya2VyOiB7IHNpemU6IDEwLCBjb2xvcjogaW5wdXQuc2hhcGVDb2xvciwgbGluZTogeyBjb2xvcjogJyMwMDAnLCB3aWR0aDogMSB9IH0sXG4gICAgbmFtZTogJ1JlZ2lvbiBjZW50cm9pZHMnLFxuICB9XTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGEgZG93bnNhbXBsZWQgcmVndWxhciBncmlkIG9mIHZveGVscyBhY3Jvc3MgdGhlIHotc3RhY2suXG4gKiBSZXR1cm5zIHBhcmFsbGVsIGZsYXQgYXJyYXlzIHN1aXRhYmxlIGZvciBib3RoIHNjYXR0ZXIzZCBhbmQgaXNvc3VyZmFjZS5cbiAqIEEgc2luZ2xlLWZyYW1lIGltYWdlIGlzIHRoaWNrZW5lZCB0byB0d28gei1wbGFuZXMgc28gM0QgdHJhY2VzIHJlbmRlci5cbiAqL1xuZnVuY3Rpb24gc2FtcGxlVm9sdW1lKGlucHV0OiBUcmFjZUJ1aWxkSW5wdXQsIG1heFhZOiBudW1iZXIsIG1heFo6IG51bWJlcikge1xuICBsZXQgZnJhbWVzID0gaW5wdXQuZnJhbWVzLm1hcChmID0+IHRvU2NhbGFyRnJhbWUoZiwgaW5wdXQuaXNHcmF5c2NhbGUpKTtcbiAgaWYgKGZyYW1lcy5sZW5ndGggPCAyKSBmcmFtZXMgPSBbZnJhbWVzWzBdIHx8IFtdLCBmcmFtZXNbMF0gfHwgW11dO1xuXG4gIGNvbnN0IGhlaWdodCA9IGZyYW1lc1swXS5sZW5ndGg7XG4gIGNvbnN0IHdpZHRoID0gaGVpZ2h0ID4gMCA/IGZyYW1lc1swXVswXS5sZW5ndGggOiAwO1xuICBjb25zdCBzeCA9IHN0cmlkZUZvcih3aWR0aCwgbWF4WFkpO1xuICBjb25zdCBzeSA9IHN0cmlkZUZvcihoZWlnaHQsIG1heFhZKTtcbiAgY29uc3Qgc3ogPSBzdHJpZGVGb3IoZnJhbWVzLmxlbmd0aCwgbWF4Wik7XG5cbiAgY29uc3QgeDogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgeTogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgejogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgdmFsdWU6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IHppID0gMDsgemkgPCBmcmFtZXMubGVuZ3RoOyB6aSArPSBzeikge1xuICAgIGZvciAobGV0IHlpID0gMDsgeWkgPCBoZWlnaHQ7IHlpICs9IHN5KSB7XG4gICAgICBjb25zdCByb3dBcnIgPSBmcmFtZXNbemldW3lpXSB8fCBbXTtcbiAgICAgIGZvciAobGV0IHhpID0gMDsgeGkgPCB3aWR0aDsgeGkgKz0gc3gpIHtcbiAgICAgICAgeC5wdXNoKHhpICogaW5wdXQucmF0aW9zWzBdKTtcbiAgICAgICAgeS5wdXNoKHlpICogaW5wdXQucmF0aW9zWzBdKTtcbiAgICAgICAgei5wdXNoKHppKTtcbiAgICAgICAgdmFsdWUucHVzaChyb3dBcnJbeGldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgeCwgeSwgeiwgdmFsdWUgfTtcbn1cblxuLyoqIFNDQVRURVIzRCDigJQgZG93bnNhbXBsZWQgdm94ZWxzIGFzIGludGVuc2l0eS1jb2xvdXJlZCAzRCBtYXJrZXJzLiAqL1xuZnVuY3Rpb24gYnVpbGRTY2F0dGVyM2RUcmFjZXMoaW5wdXQ6IFRyYWNlQnVpbGRJbnB1dCk6IGFueVtdIHtcbiAgY29uc3QgeyB4LCB5LCB6LCB2YWx1ZSB9ID0gc2FtcGxlVm9sdW1lKGlucHV0LCA0OCwgNDApO1xuICByZXR1cm4gW3tcbiAgICB0eXBlOiAnc2NhdHRlcjNkJyxcbiAgICBtb2RlOiAnbWFya2VycycsXG4gICAgeCwgeSwgeixcbiAgICBtYXJrZXI6IHtcbiAgICAgIHNpemU6IDIsXG4gICAgICBjb2xvcjogdmFsdWUsXG4gICAgICBjb2xvcnNjYWxlOiBpbnB1dC5jb2xvcnNjYWxlLFxuICAgICAgcmV2ZXJzZXNjYWxlOiBpbnB1dC5yZXZlcnNlc2NhbGUsXG4gICAgICBvcGFjaXR5OiAwLjgsXG4gICAgfSxcbiAgICBuYW1lOiAnVm94ZWxzJyxcbiAgfV07XG59XG5cbi8qKiBJU09TVVJGQUNFIOKAlCBpc28taW50ZW5zaXR5IHN1cmZhY2VzIG92ZXIgdGhlIGRvd25zYW1wbGVkIHZvbHVtZSBncmlkLlxuICogIGlzb21pbi9pc29tYXggY29tZSBzdHJhaWdodCBmcm9tIHRoZSB0b29sYmFyIHJhbmdlIHNsaWRlciAoMOKAkzI1NSkuICovXG5mdW5jdGlvbiBidWlsZElzb3N1cmZhY2VUcmFjZXMoaW5wdXQ6IFRyYWNlQnVpbGRJbnB1dCk6IGFueVtdIHtcbiAgY29uc3QgeyB4LCB5LCB6LCB2YWx1ZSB9ID0gc2FtcGxlVm9sdW1lKGlucHV0LCA0MCwgNDApO1xuICAvLyBUaGUgY2FsbGVyIChQbG90bHlTZXJ2aWNlKSBtYXBzIHRoZSAw4oCTMjU1IHNsaWRlciBvbnRvIHRoZSB2b2x1bWUncyByZWFsXG4gIC8vIGludGVuc2l0eSByYW5nZSBiZWZvcmUgdGhpcyBydW5zLCBzbyB0aGUgYmFuZCBhbHdheXMgc2l0cyBpbnNpZGUgdGhlIGRhdGEuXG4gIC8vIFdlIG9ubHkgZ3VhcmQgb3JkZXJpbmcgaGVyZS5cbiAgY29uc3QgaXNvTWluID0gTWF0aC5taW4oaW5wdXQuaXNvTWluLCBpbnB1dC5pc29NYXgpO1xuICBjb25zdCBpc29NYXggPSBNYXRoLm1heChpbnB1dC5pc29NaW4sIGlucHV0Lmlzb01heCk7XG4gIHJldHVybiBbe1xuICAgIHR5cGU6ICdpc29zdXJmYWNlJyxcbiAgICB4LCB5LCB6LCB2YWx1ZSxcbiAgICBpc29taW46IGlzb01pbixcbiAgICBpc29tYXg6IGlzb01heCxcbiAgICAvLyBBIGZldyBuZXN0ZWQgbGV2ZWxzIChub3QganVzdCB0aGUgdHdvIGJhbmQgZXh0cmVtZXMpOiBldmVuIGlmIGFuIGV4dHJlbWVcbiAgICAvLyBncmF6ZXMgdGhlIGRhdGEgZWRnZSBhbmQgZHJhd3Mgbm90aGluZywgYW4gaW50ZXJpb3IgbGV2ZWwgc3RpbGwgcmVuZGVycyxcbiAgICAvLyBzbyB0aGUgdm9sdW1lIGlzIG5ldmVyIHNpbGVudGx5IGVtcHR5LlxuICAgIHN1cmZhY2U6IHsgY291bnQ6IDMgfSxcbiAgICBjb2xvcnNjYWxlOiBpbnB1dC5jb2xvcnNjYWxlLFxuICAgIHJldmVyc2VzY2FsZTogaW5wdXQucmV2ZXJzZXNjYWxlLFxuICAgIG9wYWNpdHk6IDAuNixcbiAgICBjYXBzOiB7IHg6IHsgc2hvdzogZmFsc2UgfSwgeTogeyBzaG93OiBmYWxzZSB9LCB6OiB7IHNob3c6IGZhbHNlIH0gfSxcbiAgICBuYW1lOiAnSXNvc3VyZmFjZScsXG4gIH1dO1xufVxuXG4vKiogUmVnaXN0cnkgb2YgdGhlIHBsdWdnYWJsZSAobm9uLW9yaWdpbmFsKSBwbG90IHR5cGVzLiAqL1xuZXhwb3J0IGNvbnN0IFBMT1RMWV9QTE9UX1RZUEVfSU1QTFM6IFBhcnRpYWw8UmVjb3JkPFBsb3RUeXBlLCBQbG90bHlQbG90VHlwZUltcGw+PiA9IHtcbiAgW1Bsb3RUeXBlLkNPTlRPVVJdOiAgICB7IGJ1aWxkVHJhY2VzOiBidWlsZENvbnRvdXJUcmFjZXMsICAgIGxheW91dEtpbmQ6ICcyZC1pbWFnZScsICAgdGhyZWVEOiBmYWxzZSB9LFxuICBbUGxvdFR5cGUuU0NBVFRFUl06ICAgIHsgYnVpbGRUcmFjZXM6IGJ1aWxkU2NhdHRlclRyYWNlcywgICAgbGF5b3V0S2luZDogJzJkLW92ZXJsYXknLCB0aHJlZUQ6IGZhbHNlIH0sXG4gIFtQbG90VHlwZS5TQ0FUVEVSM0RdOiAgeyBidWlsZFRyYWNlczogYnVpbGRTY2F0dGVyM2RUcmFjZXMsICBsYXlvdXRLaW5kOiAnM2Qtdm9sdW1lJywgIHRocmVlRDogdHJ1ZSB9LFxuICBbUGxvdFR5cGUuSVNPU1VSRkFDRV06IHsgYnVpbGRUcmFjZXM6IGJ1aWxkSXNvc3VyZmFjZVRyYWNlcywgbGF5b3V0S2luZDogJzNkLXZvbHVtZScsICB0aHJlZUQ6IHRydWUgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQbG90VHlwZUltcGwodHlwZTogUGxvdFR5cGUpOiBQbG90bHlQbG90VHlwZUltcGwgfCB1bmRlZmluZWQge1xuICByZXR1cm4gUExPVExZX1BMT1RfVFlQRV9JTVBMU1t0eXBlXTtcbn1cbiJdfQ==
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxvdGx5LXRyYWNlLWJ1aWxkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvcGxvdGx5L3Bsb3RseS10cmFjZS1idWlsZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQTREdEQsNEVBQTRFO0FBRTVFLGtGQUFrRjtBQUNsRixTQUFTLFNBQVMsQ0FBQyxJQUFTO0lBQzFCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELE9BQU8sSUFBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsU0FBUyxhQUFhLENBQUMsS0FBWSxFQUFFLFdBQW9CO0lBQ3ZELElBQUksV0FBVztRQUFFLE9BQU8sS0FBbUIsQ0FBQztJQUM1QyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFVLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQsdUVBQXVFO0FBQ3ZFLFNBQVMsU0FBUyxDQUFDLE1BQWMsRUFBRSxVQUFrQjtJQUNuRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVELDRFQUE0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QyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDakQsU0FBUyxFQUFFLE1BQU0sRUFBRSxtREFBbUQ7UUFDdEUsSUFBSSxFQUFFLE9BQU87UUFDYixJQUFJLEVBQUUsU0FBUyxLQUFLLEdBQUcsQ0FBQyxFQUFFO1FBQzFCLE9BQU8sRUFBRSxLQUFLLEtBQUssQ0FBQztLQUNyQixDQUFDLENBQUMsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbG90VHlwZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHsgYnQ2MDFMdW1pbmFuY2UgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW50ZW5zaXR5JztcbmltcG9ydCB7IHBvbHlnb25DZW50cm9pZCB9IGZyb20gJy4uL3JlZ2lvbi1jZW50cm9pZHMnO1xuXG4vKipcbiAqIFBsdWdnYWJsZSBQbG90bHkgdHJhY2UgYnVpbGRlcnMgZm9yIHRoZSBwbG90IHR5cGVzIGFkZGVkIG9uIHRvcCBvZiB0aGVcbiAqIG9yaWdpbmFsIEhFQVRNQVAgLyBTVVJGQUNFIC8gUkdCLWltYWdlIHJlbmRlcmVycy5cbiAqXG4gKiBERVNJR04gLyBFWFRSQUNUSU9OIEFMSUdOTUVOVFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZXJ5IGZ1bmN0aW9uIGhlcmUgaXMgKipwdXJlKiog4oCUIGl0IHRha2VzIGEgYFRyYWNlQnVpbGRJbnB1dGAgYW5kIHJldHVybnNcbiAqIFBsb3RseSB0cmFjZSBkaWN0cy4gVGhlcmUgaXMgbm8gQW5ndWxhciwgbm8gUnhKUyBhbmQgbm8gc2VydmljZSBzdGF0ZSwgc29cbiAqIHRoZSBidWlsZGVycyBhcmUgdW5pdC10ZXN0YWJsZSBvbiBwbGFpbiBmaXh0dXJlcy5cbiAqXG4gKiBMYXlvdXRzIGFyZSBidWlsdCBpbiBgcGxvdGx5LWxheW91dHMudHNgIChmcm9tIGEgY29udGV4dCBvZiBsaXZlIHNlcnZpY2VcbiAqIHN0YXRlKTsgb25seSBUUkFDRSBidWlsZGluZyBpcyBwbHVnZ2FibGUgaGVyZS4gVG8gYWRkIGEgbmV3IHBsb3QgdHlwZTogd3JpdGVcbiAqIGEgYnVpbGRlciwgcmVnaXN0ZXIgaXQgaW4gYFBMT1RMWV9QTE9UX1RZUEVfSU1QTFNgLCBhbmQgYWRkIGEgZGVzY3JpcHRvciBpblxuICogYGNvbnRyYWN0cy9wbG90LXR5cGUudHNgLlxuICpcbiAqIFRoZSBvcmlnaW5hbCBIRUFUTUFQL1NVUkZBQ0UvUkdCIHR5cGVzIGhhdmUgdGhlaXIgb3duIGJ1aWxkZXJzIGF0IHRoZSBlbmQgb2ZcbiAqIHRoaXMgZmlsZSAoe0BsaW5rIGJ1aWxkSGVhdG1hcFRyYWNlc30sIHtAbGluayBidWlsZFN1cmZhY2VUcmFjZXN9LFxuICoge0BsaW5rIGJ1aWxkUmdiSW1hZ2VUcmFjZXN9KSDigJQgdXNlZCBieSB0aGUgaW5pdGlhbCByZW5kZXIgYW5kIHRoZSBoaWdoLWRlZlxuICogem9vbSByZS1yZW5kZXIgYWxpa2Ug4oCUIGJ1dCBhcmUgTk9UIHJlZ2lzdGVyZWQ6IHRoZXkgdGFrZSB0aGUgcmF3IGZyYW1lcyBhbmRcbiAqIHRoZSBhY3RpdmUgY29sb3JtYXAsIG5vdCBhIHtAbGluayBUcmFjZUJ1aWxkSW5wdXR9LlxuICovXG5cbi8qKiBOb3JtYWxpc2VkIGlucHV0IGZvciBhIHRyYWNlIGJ1aWxkZXIuIEZyYW1lcyBhcmUgcGVyLXotcGxhbmUgbWF0cmljZXM6XG4gKiAgZ3JheXNjYWxlIGNlbGxzIGFyZSBzY2FsYXJzLCBSR0IgY2VsbHMgYXJlIGBbciwgZywgYl1gLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFjZUJ1aWxkSW5wdXQge1xuICBmcmFtZXM6IGFueVtdO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgLyoqIFt4UmF0aW8sIHlSYXRpb10g4oCUIGRhdGEgdW5pdHMgcGVyIHBpeGVsLiAqL1xuICByYXRpb3M6IG51bWJlcltdO1xuICAvKiogW3gwLCB4MSwgeTAsIHkxXSDigJQgdHJ1ZSBpbWFnZSBleHRlbnQgaW4gZGF0YSB1bml0cy4gKi9cbiAgdHJ1ZUltYWdlU2l6ZTogbnVtYmVyW107XG4gIGlzR3JheXNjYWxlOiBib29sZWFuO1xuICAvKiogUGxvdGx5IGNvbG9yc2NhbGUgdmFsdWUgKGUuZy4gZnJvbSB0aGUgYWN0aXZlIGNvbG9ybWFwKS4gKi9cbiAgY29sb3JzY2FsZTogYW55O1xuICByZXZlcnNlc2NhbGU6IGJvb2xlYW47XG4gIC8qKiBSZWdpb24gcG9seWdvbnMgaW4gZGF0YSBjb29yZHMsIGZvciByZWdpb24tc291cmNlZCBwbG90cyAoU0NBVFRFUikuICovXG4gIHJlZ2lvbnM6IHsgeHBvaW50czogbnVtYmVyW107IHlwb2ludHM6IG51bWJlcltdIH1bXTtcbiAgLyoqIERlZmF1bHQgbWFya2VyL2xpbmUgY29sb3VyIGZvciBkZXJpdmVkIChub24taW1hZ2UtTFVUKSB0cmFjZXMuICovXG4gIHNoYXBlQ29sb3I6IHN0cmluZztcbiAgLyoqIElTT1NVUkZBQ0UgaW50ZW5zaXR5IGJvdW5kcyAoMOKAkzI1NSk6IHN1cmZhY2VzIGFyZSBkcmF3biBmb3IgdmFsdWVzIGluXG4gICAqICBbaXNvTWluLCBpc29NYXhdLCBtYXBwZWQgc3RyYWlnaHQgb250byBQbG90bHkncyBpc29taW4vaXNvbWF4LiAqL1xuICBpc29NaW46IG51bWJlcjtcbiAgaXNvTWF4OiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIFRyYWNlQnVpbGRlciA9IChpbnB1dDogVHJhY2VCdWlsZElucHV0KSA9PiBhbnlbXTtcblxuZXhwb3J0IHR5cGUgUGxvdExheW91dEtpbmQgPSAnMmQtaW1hZ2UnIHwgJzJkLW92ZXJsYXknIHwgJzJkLWNoYXJ0JyB8ICczZC12b2x1bWUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsb3RseVBsb3RUeXBlSW1wbCB7XG4gIGJ1aWxkVHJhY2VzOiBUcmFjZUJ1aWxkZXI7XG4gIC8qKiBXaGljaCBsYXlvdXQgYFBsb3RseVNlcnZpY2VgIHNob3VsZCBidWlsZCBmb3IgdGhpcyB0eXBlLiAqL1xuICBsYXlvdXRLaW5kOiBQbG90TGF5b3V0S2luZDtcbiAgLyoqIFRydWUgZm9yIHNjZW5lLWJhc2VkICgzRCkgdHJhY2VzIOKAlCBwaWNrcyB0aGUgM0QgUGxvdGx5IGNvbmZpZy4gKi9cbiAgdGhyZWVEOiBib29sZWFuO1xufVxuXG4vLyDilIDilIAgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFNjYWxhciB2YWx1ZSBvZiBhIGZyYW1lIGNlbGw6IGBbciwgZywgYl1gIOKGkiBCVC42MDEgbHVtaW5hbmNlLCBzY2FsYXIgYXMtaXMuICovXG5mdW5jdGlvbiBsdW1pbmFuY2UoY2VsbDogYW55KTogbnVtYmVyIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2VsbCkpIHtcbiAgICByZXR1cm4gYnQ2MDFMdW1pbmFuY2UoY2VsbFswXSwgY2VsbFsxXSwgY2VsbFsyXSk7XG4gIH1cbiAgcmV0dXJuIGNlbGwgYXMgbnVtYmVyO1xufVxuXG4vKiogUHJvamVjdCBhIGZyYW1lIHRvIGEgc2NhbGFyIG1hdHJpeCAoUkdCIOKGkiBsdW1pbmFuY2UsIGdyYXlzY2FsZSDihpIgYXMtaXMpLiAqL1xuZnVuY3Rpb24gdG9TY2FsYXJGcmFtZShmcmFtZTogYW55W10sIGlzR3JheXNjYWxlOiBib29sZWFuKTogbnVtYmVyW11bXSB7XG4gIGlmIChpc0dyYXlzY2FsZSkgcmV0dXJuIGZyYW1lIGFzIG51bWJlcltdW107XG4gIHJldHVybiBmcmFtZS5tYXAoKHJvdzogYW55W10pID0+IHJvdy5tYXAobHVtaW5hbmNlKSk7XG59XG5cbi8qKiBFdmVuIHN0cmlkZSB0aGF0IGtlZXBzIGFuIGF4aXMgdW5kZXIgYG1heFNhbXBsZXNgIHNhbXBsZSBwb2ludHMuICovXG5mdW5jdGlvbiBzdHJpZGVGb3IobGVuZ3RoOiBudW1iZXIsIG1heFNhbXBsZXM6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heCgxLCBNYXRoLmNlaWwobGVuZ3RoIC8gbWF4U2FtcGxlcykpO1xufVxuXG4vLyDilIDilIAgYnVpbGRlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBNYXggY2VsbHMgcGVyIGF4aXMgdGhlIGNvbnRvdXIgZ3JpZCBpcyBkb3duc2FtcGxlZCB0by4gVGhlIGhlYXRtYXAgdHJhY2UgY2FuXG4gKiAgcmFzdGVyIHRoZSBmdWxsIHByZXZpZXcgY2hlYXBseSwgYnV0IGNvbnRvdXIgcnVucyBDUFUgbWFyY2hpbmctc3F1YXJlcyBvdmVyXG4gKiAgZXZlcnkgY2VsbCwgc28gYSBmdWxsLXJlc29sdXRpb24gcHJldmlldyAofjEwMDDCsikgY29zdHMgc2Vjb25kcy4gQ29udG91cnNcbiAqICBpbnRlcnBvbGF0ZSwgc28gYSBjb2Fyc2VyIGdyaWQgbG9va3MgdGhlIHNhbWUgd2hpbGUgcmVuZGVyaW5nIG5lYXItaW5zdGFudGx5LiAqL1xuY29uc3QgQ09OVE9VUl9NQVhfU0FNUExFUyA9IDQwMDtcblxuLyoqIEV2ZXJ5IGBzeGAtdGggY29sdW1uIC8gYHN5YC10aCByb3cgb2YgYSBzY2FsYXIgbWF0cml4LiAqL1xuZnVuY3Rpb24gZG93bnNhbXBsZU1hdHJpeChtYXRyaXg6IG51bWJlcltdW10sIHN4OiBudW1iZXIsIHN5OiBudW1iZXIpOiBudW1iZXJbXVtdIHtcbiAgaWYgKHN4IDw9IDEgJiYgc3kgPD0gMSkgcmV0dXJuIG1hdHJpeDtcbiAgY29uc3Qgb3V0OiBudW1iZXJbXVtdID0gW107XG4gIGZvciAobGV0IHIgPSAwOyByIDwgbWF0cml4Lmxlbmd0aDsgciArPSBzeSkge1xuICAgIGNvbnN0IHJvdyA9IG1hdHJpeFtyXTtcbiAgICBpZiAoc3ggPD0gMSkge1xuICAgICAgb3V0LnB1c2gocm93KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBzYW1wbGVkOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgcm93Lmxlbmd0aDsgYyArPSBzeCkgc2FtcGxlZC5wdXNoKHJvd1tjXSk7XG4gICAgb3V0LnB1c2goc2FtcGxlZCk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIENPTlRPVVIg4oCUIHBlci1mcmFtZSBpc28tY29udG91cnMgb3ZlciBhIGRvd25zYW1wbGVkIHNjYWxhciBtYXRyaXguIE1pcnJvcnNcbiAqICB0aGUgaGVhdG1hcCB0cmFjZSBnZW9tZXRyeSAoeDAvZHgveTAvZHkpIHNvIGl0IGxpbmVzIHVwIHdpdGggdGhlIGltYWdlIGF4ZXM7XG4gKiAgdGhlIHN0cmlkZSBzY2FsZXMgZHgvZHkgc28gdGhlIGNvYXJzZXIgZ3JpZCBzdGlsbCBzcGFucyB0aGUgdHJ1ZSBleHRlbnQuICovXG5mdW5jdGlvbiBidWlsZENvbnRvdXJUcmFjZXMoaW5wdXQ6IFRyYWNlQnVpbGRJbnB1dCk6IGFueVtdIHtcbiAgLy8gU2FtcGxlIGsgaXMgY2VsbCBrwrdzdHJpZGUsIHNvIHRoZSBzYW1wbGVzIGtlZXAgdGhlIGNlbGxzJyBjZW50cmVzLlxuICBjb25zdCB4MCA9IGZpcnN0Q2VsbENlbnRyZShpbnB1dC50cnVlSW1hZ2VTaXplWzBdLCBpbnB1dC5yYXRpb3NbMF0pO1xuICBjb25zdCB5MCA9IGZpcnN0Q2VsbENlbnRyZShpbnB1dC50cnVlSW1hZ2VTaXplWzJdLCBpbnB1dC5yYXRpb3NbMF0pO1xuICByZXR1cm4gaW5wdXQuZnJhbWVzLm1hcCgoZnJhbWUsIGluZGV4KSA9PiB7XG4gICAgY29uc3Qgc2NhbGFyID0gdG9TY2FsYXJGcmFtZShmcmFtZSwgaW5wdXQuaXNHcmF5c2NhbGUpO1xuICAgIGNvbnN0IGhlaWdodCA9IHNjYWxhci5sZW5ndGg7XG4gICAgY29uc3Qgd2lkdGggPSBoZWlnaHQgPiAwID8gc2NhbGFyWzBdLmxlbmd0aCA6IDA7XG4gICAgY29uc3Qgc3ggPSBzdHJpZGVGb3Iod2lkdGgsIENPTlRPVVJfTUFYX1NBTVBMRVMpO1xuICAgIGNvbnN0IHN5ID0gc3RyaWRlRm9yKGhlaWdodCwgQ09OVE9VUl9NQVhfU0FNUExFUyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgwLFxuICAgICAgZHg6IGlucHV0LnJhdGlvc1swXSAqIHN4LFxuICAgICAgeTAsXG4gICAgICBkeTogaW5wdXQucmF0aW9zWzBdICogc3ksXG4gICAgICB6OiBkb3duc2FtcGxlTWF0cml4KHNjYWxhciwgc3gsIHN5KSxcbiAgICAgIHR5cGU6ICdjb250b3VyJyxcbiAgICAgIGhvdmVyaW5mbzogJ25vbmUnLFxuICAgICAgY29sb3JzY2FsZTogaW5wdXQuY29sb3JzY2FsZSxcbiAgICAgIHJldmVyc2VzY2FsZTogaW5wdXQucmV2ZXJzZXNjYWxlLFxuICAgICAgY29udG91cnM6IHsgY29sb3Jpbmc6ICdoZWF0bWFwJyB9LFxuICAgICAgLy8gQ2FwIHRoZSBsZXZlbCBjb3VudCBzbyBpdCBkb2Vzbid0IHNjYWxlIHdpdGggdGhlIChub3cgY29hcnNlcikgZ3JpZC5cbiAgICAgIG5jb250b3VyczogMTUsXG4gICAgICBuYW1lOiBgU2xpY2UgJHtpbmRleCArIDF9YCxcbiAgICAgIHZpc2libGU6IGluZGV4ID09PSAwLFxuICAgIH07XG4gIH0pO1xufVxuXG4vKiogU0NBVFRFUiDigJQgcmVnaW9uIGNlbnRyb2lkcyBhcyBsYWJlbGxlZCBtYXJrZXJzIChyZWdpb24tc291cmNlZCkuICovXG5mdW5jdGlvbiBidWlsZFNjYXR0ZXJUcmFjZXMoaW5wdXQ6IFRyYWNlQnVpbGRJbnB1dCk6IGFueVtdIHtcbiAgY29uc3QgeHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHlzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB0ZXh0OiBzdHJpbmdbXSA9IFtdO1xuICBpbnB1dC5yZWdpb25zLmZvckVhY2goKHBvbHksIGkpID0+IHtcbiAgICBjb25zdCBjID0gcG9seWdvbkNlbnRyb2lkKHBvbHkueHBvaW50cywgcG9seS55cG9pbnRzKTtcbiAgICBpZiAoIWMpIHJldHVybjtcbiAgICB4cy5wdXNoKGNbMF0pO1xuICAgIHlzLnB1c2goY1sxXSk7XG4gICAgdGV4dC5wdXNoKGBSJHtpICsgMX1gKTtcbiAgfSk7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgeDogeHMsXG4gICAgICB5OiB5cyxcbiAgICAgIHRleHQsXG4gICAgICB0eXBlOiAnc2NhdHRlcicsXG4gICAgICBtb2RlOiAnbWFya2Vycyt0ZXh0JyxcbiAgICAgIHRleHRwb3NpdGlvbjogJ3RvcCBjZW50ZXInLFxuICAgICAgbWFya2VyOiB7IHNpemU6IDEwLCBjb2xvcjogaW5wdXQuc2hhcGVDb2xvciwgbGluZTogeyBjb2xvcjogJyMwMDAnLCB3aWR0aDogMSB9IH0sXG4gICAgICBuYW1lOiAnUmVnaW9uIGNlbnRyb2lkcycsXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGEgZG93bnNhbXBsZWQgcmVndWxhciBncmlkIG9mIHZveGVscyBhY3Jvc3MgdGhlIHotc3RhY2suXG4gKiBSZXR1cm5zIHBhcmFsbGVsIGZsYXQgYXJyYXlzIHN1aXRhYmxlIGZvciBib3RoIHNjYXR0ZXIzZCBhbmQgaXNvc3VyZmFjZS5cbiAqIEEgc2luZ2xlLWZyYW1lIGltYWdlIGlzIHRoaWNrZW5lZCB0byB0d28gei1wbGFuZXMgc28gM0QgdHJhY2VzIHJlbmRlci5cbiAqL1xuZnVuY3Rpb24gc2FtcGxlVm9sdW1lKGlucHV0OiBUcmFjZUJ1aWxkSW5wdXQsIG1heFhZOiBudW1iZXIsIG1heFo6IG51bWJlcikge1xuICBsZXQgZnJhbWVzID0gaW5wdXQuZnJhbWVzLm1hcCgoZikgPT4gdG9TY2FsYXJGcmFtZShmLCBpbnB1dC5pc0dyYXlzY2FsZSkpO1xuICBpZiAoZnJhbWVzLmxlbmd0aCA8IDIpIGZyYW1lcyA9IFtmcmFtZXNbMF0gfHwgW10sIGZyYW1lc1swXSB8fCBbXV07XG5cbiAgY29uc3QgaGVpZ2h0ID0gZnJhbWVzWzBdLmxlbmd0aDtcbiAgY29uc3Qgd2lkdGggPSBoZWlnaHQgPiAwID8gZnJhbWVzWzBdWzBdLmxlbmd0aCA6IDA7XG4gIGNvbnN0IHN4ID0gc3RyaWRlRm9yKHdpZHRoLCBtYXhYWSk7XG4gIGNvbnN0IHN5ID0gc3RyaWRlRm9yKGhlaWdodCwgbWF4WFkpO1xuICBjb25zdCBzeiA9IHN0cmlkZUZvcihmcmFtZXMubGVuZ3RoLCBtYXhaKTtcblxuICBjb25zdCB4OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB5OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB6OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB2YWx1ZTogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgemkgPSAwOyB6aSA8IGZyYW1lcy5sZW5ndGg7IHppICs9IHN6KSB7XG4gICAgZm9yIChsZXQgeWkgPSAwOyB5aSA8IGhlaWdodDsgeWkgKz0gc3kpIHtcbiAgICAgIGNvbnN0IHJvd0FyciA9IGZyYW1lc1t6aV1beWldIHx8IFtdO1xuICAgICAgZm9yIChsZXQgeGkgPSAwOyB4aSA8IHdpZHRoOyB4aSArPSBzeCkge1xuICAgICAgICB4LnB1c2goeGkgKiBpbnB1dC5yYXRpb3NbMF0pO1xuICAgICAgICB5LnB1c2goeWkgKiBpbnB1dC5yYXRpb3NbMF0pO1xuICAgICAgICB6LnB1c2goemkpO1xuICAgICAgICB2YWx1ZS5wdXNoKHJvd0Fyclt4aV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyB4LCB5LCB6LCB2YWx1ZSB9O1xufVxuXG4vKiogU0NBVFRFUjNEIOKAlCBkb3duc2FtcGxlZCB2b3hlbHMgYXMgaW50ZW5zaXR5LWNvbG91cmVkIDNEIG1hcmtlcnMuICovXG5mdW5jdGlvbiBidWlsZFNjYXR0ZXIzZFRyYWNlcyhpbnB1dDogVHJhY2VCdWlsZElucHV0KTogYW55W10ge1xuICBjb25zdCB7IHgsIHksIHosIHZhbHVlIH0gPSBzYW1wbGVWb2x1bWUoaW5wdXQsIDQ4LCA0MCk7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdHlwZTogJ3NjYXR0ZXIzZCcsXG4gICAgICBtb2RlOiAnbWFya2VycycsXG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHosXG4gICAgICBtYXJrZXI6IHtcbiAgICAgICAgc2l6ZTogMixcbiAgICAgICAgY29sb3I6IHZhbHVlLFxuICAgICAgICBjb2xvcnNjYWxlOiBpbnB1dC5jb2xvcnNjYWxlLFxuICAgICAgICByZXZlcnNlc2NhbGU6IGlucHV0LnJldmVyc2VzY2FsZSxcbiAgICAgICAgb3BhY2l0eTogMC44LFxuICAgICAgfSxcbiAgICAgIG5hbWU6ICdWb3hlbHMnLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKiBJU09TVVJGQUNFIOKAlCBpc28taW50ZW5zaXR5IHN1cmZhY2VzIG92ZXIgdGhlIGRvd25zYW1wbGVkIHZvbHVtZSBncmlkLlxuICogIGlzb21pbi9pc29tYXggY29tZSBzdHJhaWdodCBmcm9tIHRoZSB0b29sYmFyIHJhbmdlIHNsaWRlciAoMOKAkzI1NSkuICovXG5mdW5jdGlvbiBidWlsZElzb3N1cmZhY2VUcmFjZXMoaW5wdXQ6IFRyYWNlQnVpbGRJbnB1dCk6IGFueVtdIHtcbiAgY29uc3QgeyB4LCB5LCB6LCB2YWx1ZSB9ID0gc2FtcGxlVm9sdW1lKGlucHV0LCA0MCwgNDApO1xuICAvLyBUaGUgY2FsbGVyIChQbG90bHlTZXJ2aWNlKSBtYXBzIHRoZSAw4oCTMjU1IHNsaWRlciBvbnRvIHRoZSB2b2x1bWUncyByZWFsXG4gIC8vIGludGVuc2l0eSByYW5nZSBiZWZvcmUgdGhpcyBydW5zLCBzbyB0aGUgYmFuZCBhbHdheXMgc2l0cyBpbnNpZGUgdGhlIGRhdGEuXG4gIC8vIFdlIG9ubHkgZ3VhcmQgb3JkZXJpbmcgaGVyZS5cbiAgY29uc3QgaXNvTWluID0gTWF0aC5taW4oaW5wdXQuaXNvTWluLCBpbnB1dC5pc29NYXgpO1xuICBjb25zdCBpc29NYXggPSBNYXRoLm1heChpbnB1dC5pc29NaW4sIGlucHV0Lmlzb01heCk7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdHlwZTogJ2lzb3N1cmZhY2UnLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB6LFxuICAgICAgdmFsdWUsXG4gICAgICBpc29taW46IGlzb01pbixcbiAgICAgIGlzb21heDogaXNvTWF4LFxuICAgICAgLy8gQSBmZXcgbmVzdGVkIGxldmVscyAobm90IGp1c3QgdGhlIHR3byBiYW5kIGV4dHJlbWVzKTogZXZlbiBpZiBhbiBleHRyZW1lXG4gICAgICAvLyBncmF6ZXMgdGhlIGRhdGEgZWRnZSBhbmQgZHJhd3Mgbm90aGluZywgYW4gaW50ZXJpb3IgbGV2ZWwgc3RpbGwgcmVuZGVycyxcbiAgICAgIC8vIHNvIHRoZSB2b2x1bWUgaXMgbmV2ZXIgc2lsZW50bHkgZW1wdHkuXG4gICAgICBzdXJmYWNlOiB7IGNvdW50OiAzIH0sXG4gICAgICBjb2xvcnNjYWxlOiBpbnB1dC5jb2xvcnNjYWxlLFxuICAgICAgcmV2ZXJzZXNjYWxlOiBpbnB1dC5yZXZlcnNlc2NhbGUsXG4gICAgICBvcGFjaXR5OiAwLjYsXG4gICAgICBjYXBzOiB7IHg6IHsgc2hvdzogZmFsc2UgfSwgeTogeyBzaG93OiBmYWxzZSB9LCB6OiB7IHNob3c6IGZhbHNlIH0gfSxcbiAgICAgIG5hbWU6ICdJc29zdXJmYWNlJyxcbiAgICB9LFxuICBdO1xufVxuXG4vKiogUmVnaXN0cnkgb2YgdGhlIHBsdWdnYWJsZSAobm9uLW9yaWdpbmFsKSBwbG90IHR5cGVzLiAqL1xuZXhwb3J0IGNvbnN0IFBMT1RMWV9QTE9UX1RZUEVfSU1QTFM6IFBhcnRpYWw8UmVjb3JkPFBsb3RUeXBlLCBQbG90bHlQbG90VHlwZUltcGw+PiA9IHtcbiAgW1Bsb3RUeXBlLkNPTlRPVVJdOiB7IGJ1aWxkVHJhY2VzOiBidWlsZENvbnRvdXJUcmFjZXMsIGxheW91dEtpbmQ6ICcyZC1pbWFnZScsIHRocmVlRDogZmFsc2UgfSxcbiAgW1Bsb3RUeXBlLlNDQVRURVJdOiB7IGJ1aWxkVHJhY2VzOiBidWlsZFNjYXR0ZXJUcmFjZXMsIGxheW91dEtpbmQ6ICcyZC1vdmVybGF5JywgdGhyZWVEOiBmYWxzZSB9LFxuICBbUGxvdFR5cGUuU0NBVFRFUjNEXTogeyBidWlsZFRyYWNlczogYnVpbGRTY2F0dGVyM2RUcmFjZXMsIGxheW91dEtpbmQ6ICczZC12b2x1bWUnLCB0aHJlZUQ6IHRydWUgfSxcbiAgW1Bsb3RUeXBlLklTT1NVUkZBQ0VdOiB7IGJ1aWxkVHJhY2VzOiBidWlsZElzb3N1cmZhY2VUcmFjZXMsIGxheW91dEtpbmQ6ICczZC12b2x1bWUnLCB0aHJlZUQ6IHRydWUgfSxcbn07XG5cbi8vIOKUgOKUgCBIRUFUTUFQIC8gU1VSRkFDRSAvIFJHQiBpbWFnZSAodGhlIG9yaWdpbmFsIHJlbmRlcmVycykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUGxvdGx5IGNlbnRyZXMgY2VsbCBpIG9uIGB4MCArIGnCt2R4YC4gSW1hZ2UgcGl4ZWwgaSBjb3ZlcnMgYFtpLCBpICsgMSlgIG9uIGV2ZXJ5IGJhY2tlbmQgKE9TRFxuICogYW5kIG5hcGFyaSBkcmF3IGl0IHRoZXJlLCBhbmQgdGhlIHRvb2xzLCByZWdpb25zIGFuZCBHZW9KU09OIHVzZSB0aGF0IGZyYW1lKSwgc28gdGhlIGZpcnN0IGNlbGxcbiAqIGlzIGNlbnRyZWQgaGFsZiBhIGNlbGwgaW4gZnJvbSB0aGUgaW1hZ2UncyAob3IgdGhlIHpvb20gY3JvcCdzKSBjb3JuZXIuXG4gKi9cbmZ1bmN0aW9uIGZpcnN0Q2VsbENlbnRyZShjb3JuZXI6IG51bWJlciwgc3RlcDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGNvcm5lciArIHN0ZXAgLyAyO1xufVxuXG4vKipcbiAqIE9uZSBncmF5c2NhbGUgaGVhdG1hcCB0cmFjZSBwZXIgei1wbGFuZSwgb25seSB0aGUgZmlyc3QgdmlzaWJsZSAodGhlIGxheW91dCdzXG4gKiBzbGlkZXIgc3dpdGNoZXMgdGhlbSkuIGB0cnVlSW1nU2l6ZWAgaXMgW3gwLCB4MSwgeTAsIHkxXTsgYHJhdGlvc2AgdGhlIGRhdGFcbiAqIHVuaXRzIHBlciBwaXhlbC4gTm8gcGVyLWNlbGwgaG92ZXIgdGV4dDogYnVpbGRpbmcgaXQgZm9yIGV2ZXJ5IHBpeGVsIGlzIHRvbyBzbG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRIZWF0bWFwVHJhY2VzKFxuICBmcmFtZXM6IGFueVtdLFxuICB0cnVlSW1nU2l6ZTogbnVtYmVyW10sXG4gIHJhdGlvczogbnVtYmVyW10sXG4gIGNvbG9yc2NhbGU6IHVua25vd24sXG4gIHJldmVyc2VzY2FsZTogYm9vbGVhbixcbik6IGFueVtdIHtcbiAgcmV0dXJuIGZyYW1lcy5tYXAoKHosIGluZGV4KSA9PiAoe1xuICAgIHgwOiBmaXJzdENlbGxDZW50cmUodHJ1ZUltZ1NpemVbMF0sIHJhdGlvc1swXSksXG4gICAgZHg6IHJhdGlvc1swXSxcbiAgICB5MDogZmlyc3RDZWxsQ2VudHJlKHRydWVJbWdTaXplWzJdLCByYXRpb3NbMF0pLFxuICAgIGR5OiByYXRpb3NbMF0sXG4gICAgeixcbiAgICB0eXBlOiAnaGVhdG1hcCcsXG4gICAgaG92ZXJpbmZvOiAnbm9uZScsXG4gICAgY29sb3JzY2FsZSxcbiAgICByZXZlcnNlc2NhbGUsXG4gICAgbmFtZTogYFNsaWNlICR7aW5kZXggKyAxfWAsXG4gICAgdmlzaWJsZTogaW5kZXggPT09IDAsXG4gIH0pKTtcbn1cblxuLyoqIE9uZSBncmF5c2NhbGUgc3VyZmFjZSB0cmFjZSBwZXIgZnJhbWUsIGNvbG91cmVkIGJ5IHRoZSBhY3RpdmUgY29sb3JtYXAuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdXJmYWNlVHJhY2VzKGZyYW1lczogYW55W10sIGNvbG9yc2NhbGU6IHVua25vd24sIHJldmVyc2VzY2FsZTogYm9vbGVhbik6IGFueVtdIHtcbiAgcmV0dXJuIGZyYW1lcy5tYXAoKHopID0+ICh7IHosIHR5cGU6ICdzdXJmYWNlJywgY29sb3JzY2FsZSwgcmV2ZXJzZXNjYWxlIH0pKTtcbn1cblxuLyoqIE9uZSBSR0IgYGltYWdlYCB0cmFjZSBwZXIgei1wbGFuZSAod2lkdGggw5cgaGVpZ2h0IHBpeGVscyksIG9ubHkgdGhlIGZpcnN0IHZpc2libGUuIFdpdGhcbiAqICBgc291cmNlc2AsIGVhY2ggcGxhbmUgZHJhd3MgaXRzIFBORyBkYXRhIFVSSSBpbnN0ZWFkIG9mIGl0cyBgemAgY2VsbHMgKHRoZSBicm93c2VyIGRyYXdzIGl0O1xuICogIFBsb3RseSBwYWludHMgYHpgIG9uZSByZWN0YW5nbGUgcGVyIHBpeGVsKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJnYkltYWdlVHJhY2VzKFxuICBmcmFtZXM6IGFueVtdLFxuICB0cnVlSW1nU2l6ZTogbnVtYmVyW10sXG4gIHJhdGlvczogbnVtYmVyW10sXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBzb3VyY2VzPzogc3RyaW5nW10sXG4pOiBhbnlbXSB7XG4gIHJldHVybiBmcmFtZXMubWFwKCh6LCBpbmRleCkgPT4gKHtcbiAgICB4MDogZmlyc3RDZWxsQ2VudHJlKHRydWVJbWdTaXplWzBdLCByYXRpb3NbMF0pLFxuICAgIGR4OiByYXRpb3NbMF0sXG4gICAgeTA6IGZpcnN0Q2VsbENlbnRyZSh0cnVlSW1nU2l6ZVsyXSwgcmF0aW9zWzBdKSxcbiAgICBkeTogcmF0aW9zWzBdLFxuICAgIHg6IEFycmF5LmZyb20oQXJyYXkod2lkdGgpLmtleXMoKSksXG4gICAgeTogQXJyYXkuZnJvbShBcnJheShoZWlnaHQpLmtleXMoKSksXG4gICAgLi4uKHNvdXJjZXMgPyB7IHNvdXJjZTogc291cmNlc1tpbmRleF0gfSA6IHsgeiB9KSxcbiAgICBob3ZlcmluZm86ICdub25lJywgLy8gbm8gcGVyLWNlbGwgaG92ZXIgdGV4dDogdG9vIHNsb3cgZm9yIGV2ZXJ5IHBpeGVsXG4gICAgdHlwZTogJ2ltYWdlJyxcbiAgICBuYW1lOiBgU2xpY2UgJHtpbmRleCArIDF9YCxcbiAgICB2aXNpYmxlOiBpbmRleCA9PT0gMCxcbiAgfSkpO1xufVxuIl19
@@ -0,0 +1,223 @@
1
+ import * as Plotly from 'plotly.js-dist-min';
2
+ import { Image } from 'image-js';
3
+ import { Buffer } from 'buffer';
4
+ import { PlotUtilities } from '../../plot.utilities';
5
+ import { VIZ_ALERT_TOAST_KEY } from '../../toast-outlets';
6
+ import { ZOOM_BUTTON_STEP } from '../osd/osd-zoom';
7
+ /**
8
+ * Plotly zoom: the step and box zooms, autoscale, and the HIGH-DEF zoom — a
9
+ * zoomed-in range is re-fetched from the server at screen resolution and
10
+ * re-rendered in place, so the user sees the data at the zoom level rather
11
+ * than the upscaled preview. Owns the current zoom box.
12
+ */
13
+ export class PlotlyZoomController {
14
+ constructor(host, state, tiles, messages) {
15
+ this.host = host;
16
+ this.state = state;
17
+ this.tiles = tiles;
18
+ this.messages = messages;
19
+ /** The zoomed range [x0, x1, y0, y1], or [] when not zoomed. */
20
+ this.zoomCoordinates = [];
21
+ /** Whether a 2D drag-zoom re-fetches at high definition. */
22
+ this.isRealZoom = true;
23
+ this.utils = new PlotUtilities();
24
+ }
25
+ gd() {
26
+ const id = this.host.plotDiv();
27
+ return id ? document.getElementById(id) : null;
28
+ }
29
+ /** The axis-range part of a `plotly_relayout` event: remember the drag-zoom
30
+ * box and, outside stack mode, re-fetch it at high definition. */
31
+ onRelayout(event) {
32
+ const keys = Object.keys(event);
33
+ if (keys.length !== 4 || !this.isRealZoom)
34
+ return;
35
+ const coordinates = keys
36
+ .filter((key) => key.startsWith('xaxis.range[') || key.startsWith('yaxis.range['))
37
+ .map((key) => event[key]);
38
+ this.zoomCoordinates = coordinates;
39
+ if (!this.host.imageInfo()?.showStack)
40
+ this.triggerZoom(coordinates);
41
+ }
42
+ /** Autoscale the plot (and forget the zoom box). */
43
+ autoscale() {
44
+ const plotDiv = this.host.plotDiv();
45
+ if (!plotDiv)
46
+ return;
47
+ this.zoomCoordinates = [];
48
+ Plotly.relayout(plotDiv, { 'xaxis.autorange': true, 'yaxis.autorange': false });
49
+ }
50
+ /** Back to the whole image. */
51
+ resetAxes() {
52
+ this.zoomCoordinates = [];
53
+ this.relayout();
54
+ }
55
+ /**
56
+ * Re-apply the image layout at the current DOM height: over the zoom box when
57
+ * zoomed, else over `trueImageSize` (default: the plotted image). A failed
58
+ * relayout clears the plot and tells the user to reopen the image.
59
+ */
60
+ relayout(trueImageSize) {
61
+ const imgSize = trueImageSize ?? this.host.trueImgSize();
62
+ const plotDiv = this.host.plotDiv();
63
+ if (!plotDiv)
64
+ return;
65
+ // Refresh height from current DOM so panel resizes are reflected
66
+ const plotEl = document.getElementById(plotDiv);
67
+ if (plotEl?.offsetHeight)
68
+ this.host.setScreenHeight(plotEl.offsetHeight);
69
+ try {
70
+ const z = this.zoomCoordinates;
71
+ Plotly.relayout(plotDiv, z.length > 0
72
+ ? this.host.heatmapLayout([z[0], z[1]], [z[2], z[3]]) // reverse the y range
73
+ : // autorange is off and the axis not reversed, so the y range is set here
74
+ this.host.heatmapLayout([imgSize[0], imgSize[1]], [imgSize[3], imgSize[2]]));
75
+ }
76
+ catch (err) {
77
+ const msg = err?.error?.message || err?.message || err?.statusText || String(err);
78
+ console.error('Error occured', err);
79
+ this.messages.add({
80
+ key: VIZ_ALERT_TOAST_KEY,
81
+ sticky: true,
82
+ severity: 'error',
83
+ summary: 'An error occured',
84
+ detail: `The following
85
+ error occured: ${msg}. Please try to open the image again through the
86
+ file navigator.`,
87
+ });
88
+ // TODO correctly clear the plot
89
+ this.host.reset();
90
+ }
91
+ }
92
+ zoomIn() {
93
+ this.stepZoom(1 / ZOOM_BUTTON_STEP);
94
+ }
95
+ zoomOut() {
96
+ this.stepZoom(ZOOM_BUTTON_STEP);
97
+ }
98
+ /** Scale the visible range about its centre by `factor` (< 1 zooms in). */
99
+ stepZoom(factor) {
100
+ const plotDiv = this.host.plotDiv();
101
+ const layout = this.gd()?._fullLayout;
102
+ if (!plotDiv || !layout)
103
+ return;
104
+ const xl = layout.xaxis;
105
+ const yl = layout.yaxis;
106
+ // 3D scenes have no 2D xaxis/yaxis (they live under `scene`); the step-zoom
107
+ // is meaningless there and would throw on `xl.range`. Plotly's scene handles
108
+ // scroll-zoom natively, so just bail.
109
+ if (!xl?.range || !yl?.range)
110
+ return;
111
+ const xc = (xl.range[0] + xl.range[1]) / 2;
112
+ const yc = (yl.range[0] + yl.range[1]) / 2;
113
+ const dx = (xl.range[1] - xl.range[0]) * factor;
114
+ const dy = (yl.range[1] - yl.range[0]) * factor;
115
+ const x0 = xc - dx / 2, x1 = xc + dx / 2;
116
+ const y0 = yc - dy / 2, y1 = yc + dy / 2;
117
+ this.zoomCoordinates = [x0, x1, y0, y1];
118
+ Plotly.relayout(plotDiv, {
119
+ 'xaxis.range[0]': x0,
120
+ 'xaxis.range[1]': x1,
121
+ 'yaxis.range[0]': y0,
122
+ 'yaxis.range[1]': y1,
123
+ });
124
+ }
125
+ /** Overlay pixel → data coords via the axis objects (minus the plot margin);
126
+ * the zoom-to-box tool calls this through its host. */
127
+ pixelToData(px, py) {
128
+ const layout = this.gd()._fullLayout;
129
+ const xaxis = layout.xaxis;
130
+ const yaxis = layout.yaxis;
131
+ return { x: xaxis.p2d(px - xaxis._offset), y: yaxis.p2d(py - yaxis._offset) };
132
+ }
133
+ /**
134
+ * Apply a zoom-to-box selection: stack mode does a pure axis-range relayout;
135
+ * otherwise the high-def pipeline re-fetches the box at the new resolution.
136
+ */
137
+ applyZoomToBox(coordinates) {
138
+ this.zoomCoordinates = coordinates;
139
+ if (this.host.imageInfo()?.showStack) {
140
+ Plotly.relayout(this.host.plotDiv(), {
141
+ 'xaxis.range[0]': coordinates[0],
142
+ 'xaxis.range[1]': coordinates[1],
143
+ 'yaxis.range[0]': coordinates[2],
144
+ 'yaxis.range[1]': coordinates[3],
145
+ });
146
+ }
147
+ else {
148
+ this.triggerZoom(coordinates);
149
+ }
150
+ }
151
+ /**
152
+ * The high-def zoom: fetch `coordinates` from the server at screen resolution
153
+ * and re-render it in place (in the plot type on screen), unless the user
154
+ * moved on meanwhile — another file, another render of the div (a new zoom or
155
+ * plot, or the div handed to another backend). A box covering the whole image
156
+ * autoscales instead.
157
+ */
158
+ triggerZoom(coordinates) {
159
+ const trueImgSize = this.host.trueImgSize();
160
+ if (coordinates.length === 0 || !trueImgSize)
161
+ return;
162
+ this.zoomCoordinates = coordinates;
163
+ const rect = this.utils.getRectangle(coordinates, trueImgSize);
164
+ if (this.utils.isZoomSameAsImgSize(rect, trueImgSize)) {
165
+ this.autoscale();
166
+ return;
167
+ }
168
+ // A brief "Caching image..." message for uncached files (large files take a
169
+ // moment to cache); just a spinner otherwise.
170
+ this.state.setImageLoadingMessage(this.host.imageCached() ? '' : 'Caching image...');
171
+ // Sized from this viewer's own plot div, not jit-ui's `#diagram` wrapper,
172
+ // which other hosts (and the pipeline preview) don't have.
173
+ const screen = this.utils.getDomRectangle(this.host.plotDiv());
174
+ const imageSize = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height];
175
+ // Snapshot the filename so a response that arrives after the user switched
176
+ // files is dropped (the request carried the file selected at call time).
177
+ const reqName = this.host.fileName();
178
+ const gen = this.host.nextRenderGen();
179
+ const sample = this.host.cropSampler();
180
+ this.state.setImageLoading(true);
181
+ this.state.setZoom(true);
182
+ this.tiles.zoomOnRegion(rect, screen, this.host.zIndex()).subscribe({
183
+ next: (zoomData) => {
184
+ Image.load(Buffer.from(new Uint8Array(zoomData))).then((image) => {
185
+ const ratios = [rect.width / image.width, rect.height / image.height];
186
+ const current = this.host.fileName() === reqName && this.host.isCurrentRender(gen);
187
+ if (!current || !this.gd()?._fullLayout)
188
+ return;
189
+ const frame = this.host.imageInfo()?.isGrayscale
190
+ ? this.utils.arrayToMatrix(image.grey().data, image.width)
191
+ : this.utils.arrayToMatrix(image.getPixelsArray(), image.width);
192
+ // Also sample the intensity profiles (and the tools) from the crop, so
193
+ // they reflect the zoom-level resolution (origin = crop top-left).
194
+ sample([frame], ratios, [imageSize[0], imageSize[2]]);
195
+ const { rendered, reapplyRange } = this.host.renderCrop(frame, ratios, [image.width, image.height], imageSize, reqName);
196
+ rendered.then(() => {
197
+ this.state.setImageCached(true);
198
+ this.state.setImageLoading(false);
199
+ image = null;
200
+ if (reapplyRange)
201
+ this.relayout(imageSize);
202
+ });
203
+ });
204
+ },
205
+ error: (err) => {
206
+ const msg = err?.error?.message || err?.message || err?.statusText || String(err);
207
+ console.error('Error occured when zooming', err);
208
+ this.messages.add({
209
+ key: VIZ_ALERT_TOAST_KEY,
210
+ sticky: true,
211
+ severity: 'error',
212
+ summary: 'An error occured',
213
+ detail: `The following error occured while zooming: ${msg}.
214
+ Please try to open the image again through the file navigator and
215
+ zoom on the selected area once more.`,
216
+ });
217
+ this.state.setLoadingError(true);
218
+ this.state.setImageLoading(false);
219
+ },
220
+ });
221
+ }
222
+ }
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxvdGx5LXpvb20tY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL3Bsb3RseS9wbG90bHktem9vbS1jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBTWhDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQXNDbkQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBTy9CLFlBQ21CLElBQW9CLEVBQ3BCLEtBQXFCLEVBQ3JCLEtBQXFCLEVBQ3JCLFFBQXdCO1FBSHhCLFNBQUksR0FBSixJQUFJLENBQWdCO1FBQ3BCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQWdCO1FBVjNDLGdFQUFnRTtRQUNoRSxvQkFBZSxHQUFhLEVBQUUsQ0FBQztRQUMvQiw0REFBNEQ7UUFDNUQsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNELFVBQUssR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO0lBTzFDLENBQUM7SUFFSSxFQUFFO1FBQ1IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQixPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQXFCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FB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QyxDQUFDO2dCQUNILElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUGxvdGx5IGZyb20gJ3Bsb3RseS5qcy1kaXN0LW1pbic7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBUaWxlQWNjZXNzUG9ydCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy90aWxlLWFjY2Vzcy5wb3J0JztcbmltcG9ydCB7IEltYWdlU3RhdGVQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL2ltYWdlLXN0YXRlLnBvcnQnO1xuaW1wb3J0IHsgUGxvdFV0aWxpdGllcyB9IGZyb20gJy4uLy4uL3Bsb3QudXRpbGl0aWVzJztcbmltcG9ydCB7IFZJWl9BTEVSVF9UT0FTVF9LRVkgfSBmcm9tICcuLi8uLi90b2FzdC1vdXRsZXRzJztcbmltcG9ydCB7IFpPT01fQlVUVE9OX1NURVAgfSBmcm9tICcuLi9vc2Qvb3NkLXpvb20nO1xuXG4vKiogQSBQbG90bHkgZ3JhcGggZGl2LCBhcyBmYXIgYXMgdGhlIHpvb20gcmVhZHMgaXQuICovXG50eXBlIEdyYXBoRGl2ID0gSFRNTEVsZW1lbnQgJiB7XG4gIF9mdWxsTGF5b3V0PzogeyB4YXhpcz86IFBsb3RBeGlzOyB5YXhpcz86IFBsb3RBeGlzIH07XG59O1xudHlwZSBQbG90QXhpcyA9IHsgcmFuZ2U/OiBudW1iZXJbXTsgX29mZnNldDogbnVtYmVyOyBwMmQocHg6IG51bWJlcik6IG51bWJlciB9O1xuXG4vKiogVGhlIHNlcnZpY2Ugc3RhdGUgYW5kIHJlbmRlciBob29rcyB0aGUgem9vbSBkcml2ZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsb3RseVpvb21Ib3N0IHtcbiAgcGxvdERpdigpOiBzdHJpbmc7XG4gIC8qKiBbeDAsIHgxLCB5MCwgeTFdIG9mIHRoZSBwbG90dGVkIGltYWdlLCBvciB1bmRlZmluZWQgYmVmb3JlIG9uZS4gKi9cbiAgdHJ1ZUltZ1NpemUoKTogbnVtYmVyW10gfCB1bmRlZmluZWQ7XG4gIGltYWdlSW5mbygpOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkO1xuICBmaWxlTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGltYWdlQ2FjaGVkKCk6IGJvb2xlYW47XG4gIHpJbmRleCgpOiBudW1iZXI7XG4gIC8qKiBTdGFydCBhIHJlbmRlciBnZW5lcmF0aW9uOyBhIG5ld2VyIG9uZSBzdXBlcnNlZGVzIGEgY3JvcCBpbiBmbGlnaHQuICovXG4gIG5leHRSZW5kZXJHZW4oKTogbnVtYmVyO1xuICBpc0N1cnJlbnRSZW5kZXIoZ2VuOiBudW1iZXIpOiBib29sZWFuO1xuICBoZWF0bWFwTGF5b3V0KHhSYW5nZTogbnVtYmVyW10sIHlSYW5nZTogbnVtYmVyW10pOiBQbG90bHkuTGF5b3V0O1xuICBzZXRTY3JlZW5IZWlnaHQoaGVpZ2h0OiBudW1iZXIpOiB2b2lkO1xuICAvKiogQ2FsbGVkIGF0IHJlcXVlc3QgdGltZTogcmV0dXJucyB0aGUgaG9vayB0aGF0IHNhbXBsZXMgdGhlIGNyb3AncyBwaXhlbHNcbiAgICogICh0b29scyArIGludGVuc2l0eSBwcm9maWxlcyksIG9yIGRyb3BzIHRoZW0gd2hlbiBzYW1wbGluZyBtb3ZlZCBvbi4gKi9cbiAgY3JvcFNhbXBsZXIoKTogKGZyYW1lOiBhbnlbXSwgcmF0aW9zOiBudW1iZXJbXSwgb3JpZ2luOiBbbnVtYmVyLCBudW1iZXJdKSA9PiB2b2lkO1xuICAvKiogUmUtcmVuZGVyIHRoZSBjcm9wIGluIHRoZSBwbG90IHR5cGUgb24gc2NyZWVuOyBgcmVhcHBseVJhbmdlYCB3aGVuIHRoZVxuICAgKiAgbGF5b3V0IGlzIGltYWdlLWFsaWduZWQgKHRoZSBoZWF0bWFwIHJhbmdlIG11c3QgYmUgcmUtYXBwbGllZCkuICovXG4gIHJlbmRlckNyb3AoXG4gICAgZnJhbWU6IGFueVtdLFxuICAgIHJhdGlvczogbnVtYmVyW10sXG4gICAgc2l6ZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBpbWFnZVNpemU6IG51bWJlcltdLFxuICAgIGZpbGVOYW1lPzogc3RyaW5nLFxuICApOiB7IHJlbmRlcmVkOiBQcm9taXNlPHVua25vd24+OyByZWFwcGx5UmFuZ2U6IGJvb2xlYW4gfTtcbiAgLyoqIENsZWFyIHRoZSBwbG90IGFmdGVyIGEgZmFpbGVkIHJlbGF5b3V0LiAqL1xuICByZXNldCgpOiB2b2lkO1xufVxuXG4vKipcbiAqIFBsb3RseSB6b29tOiB0aGUgc3RlcCBhbmQgYm94IHpvb21zLCBhdXRvc2NhbGUsIGFuZCB0aGUgSElHSC1ERUYgem9vbSDigJQgYVxuICogem9vbWVkLWluIHJhbmdlIGlzIHJlLWZldGNoZWQgZnJvbSB0aGUgc2VydmVyIGF0IHNjcmVlbiByZXNvbHV0aW9uIGFuZFxuICogcmUtcmVuZGVyZWQgaW4gcGxhY2UsIHNvIHRoZSB1c2VyIHNlZXMgdGhlIGRhdGEgYXQgdGhlIHpvb20gbGV2ZWwgcmF0aGVyXG4gKiB0aGFuIHRoZSB1cHNjYWxlZCBwcmV2aWV3LiBPd25zIHRoZSBjdXJyZW50IHpvb20gYm94LlxuICovXG5leHBvcnQgY2xhc3MgUGxvdGx5Wm9vbUNvbnRyb2xsZXIge1xuICAvKiogVGhlIHpvb21lZCByYW5nZSBbeDAsIHgxLCB5MCwgeTFdLCBvciBbXSB3aGVuIG5vdCB6b29tZWQuICovXG4gIHpvb21Db29yZGluYXRlczogbnVtYmVyW10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgYSAyRCBkcmFnLXpvb20gcmUtZmV0Y2hlcyBhdCBoaWdoIGRlZmluaXRpb24uICovXG4gIGlzUmVhbFpvb20gPSB0cnVlO1xuICBwcml2YXRlIHJlYWRvbmx5IHV0aWxzID0gbmV3IFBsb3RVdGlsaXRpZXMoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IFBsb3RseVpvb21Ib3N0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhdGU6IEltYWdlU3RhdGVQb3J0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGlsZXM6IFRpbGVBY2Nlc3NQb3J0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZXM6IE1lc3NhZ2VTZXJ2aWNlLFxuICApIHt9XG5cbiAgcHJpdmF0ZSBnZCgpOiBHcmFwaERpdiB8IG51bGwge1xuICAgIGNvbnN0IGlkID0gdGhpcy5ob3N0LnBsb3REaXYoKTtcbiAgICByZXR1cm4gaWQgPyAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpIGFzIEdyYXBoRGl2IHwgbnVsbCkgOiBudWxsO1xuICB9XG5cbiAgLyoqIFRoZSBheGlzLXJhbmdlIHBhcnQgb2YgYSBgcGxvdGx5X3JlbGF5b3V0YCBldmVudDogcmVtZW1iZXIgdGhlIGRyYWctem9vbVxuICAgKiAgYm94IGFuZCwgb3V0c2lkZSBzdGFjayBtb2RlLCByZS1mZXRjaCBpdCBhdCBoaWdoIGRlZmluaXRpb24uICovXG4gIG9uUmVsYXlvdXQoZXZlbnQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnQpO1xuICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gNCB8fCAhdGhpcy5pc1JlYWxab29tKSByZXR1cm47XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBrZXlzXG4gICAgICAuZmlsdGVyKChrZXkpID0+IGtleS5zdGFydHNXaXRoKCd4YXhpcy5yYW5nZVsnKSB8fCBrZXkuc3RhcnRzV2l0aCgneWF4aXMucmFuZ2VbJykpXG4gICAgICAubWFwKChrZXkpID0+IGV2ZW50W2tleV0pO1xuICAgIHRoaXMuem9vbUNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7XG4gICAgaWYgKCF0aGlzLmhvc3QuaW1hZ2VJbmZvKCk/LnNob3dTdGFjaykgdGhpcy50cmlnZ2VyWm9vbShjb29yZGluYXRlcyk7XG4gIH1cblxuICAvKiogQXV0b3NjYWxlIHRoZSBwbG90IChhbmQgZm9yZ2V0IHRoZSB6b29tIGJveCkuICovXG4gIGF1dG9zY2FsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBwbG90RGl2ID0gdGhpcy5ob3N0LnBsb3REaXYoKTtcbiAgICBpZiAoIXBsb3REaXYpIHJldHVybjtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IFtdO1xuICAgIFBsb3RseS5yZWxheW91dChwbG90RGl2LCB7ICd4YXhpcy5hdXRvcmFuZ2UnOiB0cnVlLCAneWF4aXMuYXV0b3JhbmdlJzogZmFsc2UgfSk7XG4gIH1cblxuICAvKiogQmFjayB0byB0aGUgd2hvbGUgaW1hZ2UuICovXG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IFtdO1xuICAgIHRoaXMucmVsYXlvdXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1hcHBseSB0aGUgaW1hZ2UgbGF5b3V0IGF0IHRoZSBjdXJyZW50IERPTSBoZWlnaHQ6IG92ZXIgdGhlIHpvb20gYm94IHdoZW5cbiAgICogem9vbWVkLCBlbHNlIG92ZXIgYHRydWVJbWFnZVNpemVgIChkZWZhdWx0OiB0aGUgcGxvdHRlZCBpbWFnZSkuIEEgZmFpbGVkXG4gICAqIHJlbGF5b3V0IGNsZWFycyB0aGUgcGxvdCBhbmQgdGVsbHMgdGhlIHVzZXIgdG8gcmVvcGVuIHRoZSBpbWFnZS5cbiAgICovXG4gIHJlbGF5b3V0KHRydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGNvbnN0IGltZ1NpemUgPSB0cnVlSW1hZ2VTaXplID8/IHRoaXMuaG9zdC50cnVlSW1nU2l6ZSgpITtcbiAgICBjb25zdCBwbG90RGl2ID0gdGhpcy5ob3N0LnBsb3REaXYoKTtcbiAgICBpZiAoIXBsb3REaXYpIHJldHVybjtcbiAgICAvLyBSZWZyZXNoIGhlaWdodCBmcm9tIGN1cnJlbnQgRE9NIHNvIHBhbmVsIHJlc2l6ZXMgYXJlIHJlZmxlY3RlZFxuICAgIGNvbnN0IHBsb3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsb3REaXYpO1xuICAgIGlmIChwbG90RWw/Lm9mZnNldEhlaWdodCkgdGhpcy5ob3N0LnNldFNjcmVlbkhlaWdodChwbG90RWwub2Zmc2V0SGVpZ2h0KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeiA9IHRoaXMuem9vbUNvb3JkaW5hdGVzO1xuICAgICAgUGxvdGx5LnJlbGF5b3V0KFxuICAgICAgICBwbG90RGl2LFxuICAgICAgICB6Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHRoaXMuaG9zdC5oZWF0bWFwTGF5b3V0KFt6WzBdLCB6WzFdXSwgW3pbMl0sIHpbM11dKSAvLyByZXZlcnNlIHRoZSB5IHJhbmdlXG4gICAgICAgICAgOiAvLyBhdXRvcmFuZ2UgaXMgb2ZmIGFuZCB0aGUgYXhpcyBub3QgcmV2ZXJzZWQsIHNvIHRoZSB5IHJhbmdlIGlzIHNldCBoZXJlXG4gICAgICAgICAgICB0aGlzLmhvc3QuaGVhdG1hcExheW91dChbaW1nU2l6ZVswXSwgaW1nU2l6ZVsxXV0sIFtpbWdTaXplWzNdLCBpbWdTaXplWzJdXSksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCBlcnI/LnN0YXR1c1RleHQgfHwgU3RyaW5nKGVycik7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cmVkJywgZXJyKTtcbiAgICAgIHRoaXMubWVzc2FnZXMuYWRkKHtcbiAgICAgICAga2V5OiBWSVpfQUxFUlRfVE9BU1RfS0VZLFxuICAgICAgICBzdGlja3k6IHRydWUsXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICBzdW1tYXJ5OiAnQW4gZXJyb3Igb2NjdXJlZCcsXG4gICAgICAgIGRldGFpbDogYFRoZSBmb2xsb3dpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciBvY2N1cmVkOiAke21zZ30uIFBsZWFzZSB0cnkgdG8gb3BlbiB0aGUgaW1hZ2UgYWdhaW4gdGhyb3VnaCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIG5hdmlnYXRvci5gLFxuICAgICAgfSk7XG4gICAgICAvLyBUT0RPIGNvcnJlY3RseSBjbGVhciB0aGUgcGxvdFxuICAgICAgdGhpcy5ob3N0LnJlc2V0KCk7XG4gICAgfVxuICB9XG5cbiAgem9vbUluKCk6IHZvaWQge1xuICAgIHRoaXMuc3RlcFpvb20oMSAvIFpPT01fQlVUVE9OX1NURVApO1xuICB9XG5cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0ZXBab29tKFpPT01fQlVUVE9OX1NURVApO1xuICB9XG5cbiAgLyoqIFNjYWxlIHRoZSB2aXNpYmxlIHJhbmdlIGFib3V0IGl0cyBjZW50cmUgYnkgYGZhY3RvcmAgKDwgMSB6b29tcyBpbikuICovXG4gIHByaXZhdGUgc3RlcFpvb20oZmFjdG9yOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwbG90RGl2ID0gdGhpcy5ob3N0LnBsb3REaXYoKTtcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmdkKCk/Ll9mdWxsTGF5b3V0O1xuICAgIGlmICghcGxvdERpdiB8fCAhbGF5b3V0KSByZXR1cm47XG4gICAgY29uc3QgeGwgPSBsYXlvdXQueGF4aXM7XG4gICAgY29uc3QgeWwgPSBsYXlvdXQueWF4aXM7XG4gICAgLy8gM0Qgc2NlbmVzIGhhdmUgbm8gMkQgeGF4aXMveWF4aXMgKHRoZXkgbGl2ZSB1bmRlciBgc2NlbmVgKTsgdGhlIHN0ZXAtem9vbVxuICAgIC8vIGlzIG1lYW5pbmdsZXNzIHRoZXJlIGFuZCB3b3VsZCB0aHJvdyBvbiBgeGwucmFuZ2VgLiBQbG90bHkncyBzY2VuZSBoYW5kbGVzXG4gICAgLy8gc2Nyb2xsLXpvb20gbmF0aXZlbHksIHNvIGp1c3QgYmFpbC5cbiAgICBpZiAoIXhsPy5yYW5nZSB8fCAheWw/LnJhbmdlKSByZXR1cm47XG4gICAgY29uc3QgeGMgPSAoeGwucmFuZ2VbMF0gKyB4bC5yYW5nZVsxXSkgLyAyO1xuICAgIGNvbnN0IHljID0gKHlsLnJhbmdlWzBdICsgeWwucmFuZ2VbMV0pIC8gMjtcbiAgICBjb25zdCBkeCA9ICh4bC5yYW5nZVsxXSAtIHhsLnJhbmdlWzBdKSAqIGZhY3RvcjtcbiAgICBjb25zdCBkeSA9ICh5bC5yYW5nZVsxXSAtIHlsLnJhbmdlWzBdKSAqIGZhY3RvcjtcbiAgICBjb25zdCB4MCA9IHhjIC0gZHggLyAyLFxuICAgICAgeDEgPSB4YyArIGR4IC8gMjtcbiAgICBjb25zdCB5MCA9IHljIC0gZHkgLyAyLFxuICAgICAgeTEgPSB5YyArIGR5IC8gMjtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IFt4MCwgeDEsIHkwLCB5MV07XG4gICAgUGxvdGx5LnJlbGF5b3V0KHBsb3REaXYsIHtcbiAgICAgICd4YXhpcy5yYW5nZVswXSc6IHgwLFxuICAgICAgJ3hheGlzLnJhbmdlWzFdJzogeDEsXG4gICAgICAneWF4aXMucmFuZ2VbMF0nOiB5MCxcbiAgICAgICd5YXhpcy5yYW5nZVsxXSc6IHkxLFxuICAgIH0gYXMgUGxvdGx5LkxheW91dCk7XG4gIH1cblxuICAvKiogT3ZlcmxheSBwaXhlbCDihpIgZGF0YSBjb29yZHMgdmlhIHRoZSBheGlzIG9iamVjdHMgKG1pbnVzIHRoZSBwbG90IG1hcmdpbik7XG4gICAqICB0aGUgem9vbS10by1ib3ggdG9vbCBjYWxscyB0aGlzIHRocm91Z2ggaXRzIGhvc3QuICovXG4gIHBpeGVsVG9EYXRhKHB4OiBudW1iZXIsIHB5OiBudW1iZXIpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuZ2QoKSEuX2Z1bGxMYXlvdXQhO1xuICAgIGNvbnN0IHhheGlzID0gbGF5b3V0LnhheGlzITtcbiAgICBjb25zdCB5YXhpcyA9IGxheW91dC55YXhpcyE7XG4gICAgcmV0dXJuIHsgeDogeGF4aXMucDJkKHB4IC0geGF4aXMuX29mZnNldCksIHk6IHlheGlzLnAyZChweSAtIHlheGlzLl9vZmZzZXQpIH07XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYSB6b29tLXRvLWJveCBzZWxlY3Rpb246IHN0YWNrIG1vZGUgZG9lcyBhIHB1cmUgYXhpcy1yYW5nZSByZWxheW91dDtcbiAgICogb3RoZXJ3aXNlIHRoZSBoaWdoLWRlZiBwaXBlbGluZSByZS1mZXRjaGVzIHRoZSBib3ggYXQgdGhlIG5ldyByZXNvbHV0aW9uLlxuICAgKi9cbiAgYXBwbHlab29tVG9Cb3goY29vcmRpbmF0ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgdGhpcy56b29tQ29vcmRpbmF0ZXMgPSBjb29yZGluYXRlcztcbiAgICBpZiAodGhpcy5ob3N0LmltYWdlSW5mbygpPy5zaG93U3RhY2spIHtcbiAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLmhvc3QucGxvdERpdigpLCB7XG4gICAgICAgICd4YXhpcy5yYW5nZVswXSc6IGNvb3JkaW5hdGVzWzBdLFxuICAgICAgICAneGF4aXMucmFuZ2VbMV0nOiBjb29yZGluYXRlc1sxXSxcbiAgICAgICAgJ3lheGlzLnJhbmdlWzBdJzogY29vcmRpbmF0ZXNbMl0sXG4gICAgICAgICd5YXhpcy5yYW5nZVsxXSc6IGNvb3JkaW5hdGVzWzNdLFxuICAgICAgfSBhcyBQbG90bHkuTGF5b3V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmlnZ2VyWm9vbShjb29yZGluYXRlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBoaWdoLWRlZiB6b29tOiBmZXRjaCBgY29vcmRpbmF0ZXNgIGZyb20gdGhlIHNlcnZlciBhdCBzY3JlZW4gcmVzb2x1dGlvblxuICAgKiBhbmQgcmUtcmVuZGVyIGl0IGluIHBsYWNlIChpbiB0aGUgcGxvdCB0eXBlIG9uIHNjcmVlbiksIHVubGVzcyB0aGUgdXNlclxuICAgKiBtb3ZlZCBvbiBtZWFud2hpbGUg4oCUIGFub3RoZXIgZmlsZSwgYW5vdGhlciByZW5kZXIgb2YgdGhlIGRpdiAoYSBuZXcgem9vbSBvclxuICAgKiBwbG90LCBvciB0aGUgZGl2IGhhbmRlZCB0byBhbm90aGVyIGJhY2tlbmQpLiBBIGJveCBjb3ZlcmluZyB0aGUgd2hvbGUgaW1hZ2VcbiAgICogYXV0b3NjYWxlcyBpbnN0ZWFkLlxuICAgKi9cbiAgdHJpZ2dlclpvb20oY29vcmRpbmF0ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3QgdHJ1ZUltZ1NpemUgPSB0aGlzLmhvc3QudHJ1ZUltZ1NpemUoKTtcbiAgICBpZiAoY29vcmRpbmF0ZXMubGVuZ3RoID09PSAwIHx8ICF0cnVlSW1nU2l6ZSkgcmV0dXJuO1xuICAgIHRoaXMuem9vbUNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMudXRpbHMuZ2V0UmVjdGFuZ2xlKGNvb3JkaW5hdGVzLCB0cnVlSW1nU2l6ZSk7XG4gICAgaWYgKHRoaXMudXRpbHMuaXNab29tU2FtZUFzSW1nU2l6ZShyZWN0LCB0cnVlSW1nU2l6ZSkpIHtcbiAgICAgIHRoaXMuYXV0b3NjYWxlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEEgYnJpZWYgXCJDYWNoaW5nIGltYWdlLi4uXCIgbWVzc2FnZSBmb3IgdW5jYWNoZWQgZmlsZXMgKGxhcmdlIGZpbGVzIHRha2UgYVxuICAgIC8vIG1vbWVudCB0byBjYWNoZSk7IGp1c3QgYSBzcGlubmVyIG90aGVyd2lzZS5cbiAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZ01lc3NhZ2UodGhpcy5ob3N0LmltYWdlQ2FjaGVkKCkgPyAnJyA6ICdDYWNoaW5nIGltYWdlLi4uJyk7XG4gICAgLy8gU2l6ZWQgZnJvbSB0aGlzIHZpZXdlcidzIG93biBwbG90IGRpdiwgbm90IGppdC11aSdzIGAjZGlhZ3JhbWAgd3JhcHBlcixcbiAgICAvLyB3aGljaCBvdGhlciBob3N0cyAoYW5kIHRoZSBwaXBlbGluZSBwcmV2aWV3KSBkb24ndCBoYXZlLlxuICAgIGNvbnN0IHNjcmVlbiA9IHRoaXMudXRpbHMuZ2V0RG9tUmVjdGFuZ2xlKHRoaXMuaG9zdC5wbG90RGl2KCkpO1xuICAgIGNvbnN0IGltYWdlU2l6ZSA9IFtyZWN0LngsIHJlY3QueCArIHJlY3Qud2lkdGgsIHJlY3QueSwgcmVjdC55ICsgcmVjdC5oZWlnaHRdO1xuICAgIC8vIFNuYXBzaG90IHRoZSBmaWxlbmFtZSBzbyBhIHJlc3BvbnNlIHRoYXQgYXJyaXZlcyBhZnRlciB0aGUgdXNlciBzd2l0Y2hlZFxuICAgIC8vIGZpbGVzIGlzIGRyb3BwZWQgKHRoZSByZXF1ZXN0IGNhcnJpZWQgdGhlIGZpbGUgc2VsZWN0ZWQgYXQgY2FsbCB0aW1lKS5cbiAgICBjb25zdCByZXFOYW1lID0gdGhpcy5ob3N0LmZpbGVOYW1lKCk7XG4gICAgY29uc3QgZ2VuID0gdGhpcy5ob3N0Lm5leHRSZW5kZXJHZW4oKTtcbiAgICBjb25zdCBzYW1wbGUgPSB0aGlzLmhvc3QuY3JvcFNhbXBsZXIoKTtcbiAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZyh0cnVlKTtcbiAgICB0aGlzLnN0YXRlLnNldFpvb20odHJ1ZSk7XG4gICAgdGhpcy50aWxlcy56b29tT25SZWdpb24ocmVjdCwgc2NyZWVuLCB0aGlzLmhvc3QuekluZGV4KCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoem9vbURhdGEpID0+IHtcbiAgICAgICAgSW1hZ2UubG9hZChCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheSh6b29tRGF0YSkpKS50aGVuKChpbWFnZTogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmF0aW9zID0gW3JlY3Qud2lkdGggLyBpbWFnZS53aWR0aCwgcmVjdC5oZWlnaHQgLyBpbWFnZS5oZWlnaHRdO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmhvc3QuZmlsZU5hbWUoKSA9PT0gcmVxTmFtZSAmJiB0aGlzLmhvc3QuaXNDdXJyZW50UmVuZGVyKGdlbik7XG4gICAgICAgICAgaWYgKCFjdXJyZW50IHx8ICF0aGlzLmdkKCk/Ll9mdWxsTGF5b3V0KSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmhvc3QuaW1hZ2VJbmZvKCk/LmlzR3JheXNjYWxlXG4gICAgICAgICAgICA/IHRoaXMudXRpbHMuYXJyYXlUb01hdHJpeChpbWFnZS5ncmV5KCkuZGF0YSwgaW1hZ2Uud2lkdGgpXG4gICAgICAgICAgICA6IHRoaXMudXRpbHMuYXJyYXlUb01hdHJpeChpbWFnZS5nZXRQaXhlbHNBcnJheSgpLCBpbWFnZS53aWR0aCk7XG4gICAgICAgICAgLy8gQWxzbyBzYW1wbGUgdGhlIGludGVuc2l0eSBwcm9maWxlcyAoYW5kIHRoZSB0b29scykgZnJvbSB0aGUgY3JvcCwgc29cbiAgICAgICAgICAvLyB0aGV5IHJlZmxlY3QgdGhlIHpvb20tbGV2ZWwgcmVzb2x1dGlvbiAob3JpZ2luID0gY3JvcCB0b3AtbGVmdCkuXG4gICAgICAgICAgc2FtcGxlKFtmcmFtZV0sIHJhdGlvcywgW2ltYWdlU2l6ZVswXSwgaW1hZ2VTaXplWzJdXSk7XG4gICAgICAgICAgY29uc3QgeyByZW5kZXJlZCwgcmVhcHBseVJhbmdlIH0gPSB0aGlzLmhvc3QucmVuZGVyQ3JvcChcbiAgICAgICAgICAgIGZyYW1lLFxuICAgICAgICAgICAgcmF0aW9zLFxuICAgICAgICAgICAgW2ltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHRdLFxuICAgICAgICAgICAgaW1hZ2VTaXplLFxuICAgICAgICAgICAgcmVxTmFtZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlbmRlcmVkLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUNhY2hlZCh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICAgIGltYWdlID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChyZWFwcGx5UmFuZ2UpIHRoaXMucmVsYXlvdXQoaW1hZ2VTaXplKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgZXJyPy5zdGF0dXNUZXh0IHx8IFN0cmluZyhlcnIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cmVkIHdoZW4gem9vbWluZycsIGVycik7XG4gICAgICAgIHRoaXMubWVzc2FnZXMuYWRkKHtcbiAgICAgICAgICBrZXk6IFZJWl9BTEVSVF9UT0FTVF9LRVksXG4gICAgICAgICAgc3RpY2t5OiB0cnVlLFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIHN1bW1hcnk6ICdBbiBlcnJvciBvY2N1cmVkJyxcbiAgICAgICAgICBkZXRhaWw6IGBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VyZWQgd2hpbGUgem9vbWluZzogJHttc2d9LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2UgdHJ5IHRvIG9wZW4gdGhlIGltYWdlIGFnYWluIHRocm91Z2ggdGhlIGZpbGUgbmF2aWdhdG9yIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tIG9uIHRoZSBzZWxlY3RlZCBhcmVhIG9uY2UgbW9yZS5gLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdGF0ZS5zZXRMb2FkaW5nRXJyb3IodHJ1ZSk7XG4gICAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==