@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
@@ -0,0 +1,133 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, Inject, Input, NgZone, signal, } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { CommonModule } from '@angular/common';
4
+ import { VISUALIZER } from '../contracts/visualizer.contract';
5
+ import { FloatingDragDirective } from '../visualizer/floating-drag.directive';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ /**
9
+ * The floating, draggable intensity-profile inset: shown while any intensity line
10
+ * exists, charting one trace per line as lines are added, moved or removed.
11
+ *
12
+ * Owns the profile and viewport-change subscriptions, the window-resize reflow, the
13
+ * drag and the per-instance chart div id it is given. The chart itself is drawn by the
14
+ * backend (`IVisualizer.renderIntensityInset`) so this never reaches a charting
15
+ * library. Fixed to the viewport, outside the plot div, so it is not clipped to the
16
+ * canvas.
17
+ *
18
+ * OnPush, with its view state in signals: the profile stream may fire outside the zone.
19
+ */
20
+ export class IntensityInsetComponent {
21
+ constructor(visualizer, cdr, zone, destroyRef) {
22
+ this.visualizer = visualizer;
23
+ this.cdr = cdr;
24
+ this.zone = zone;
25
+ this.destroyRef = destroyRef;
26
+ /** Id of the chart div — unique per viewer: the backend resolves it by id. */
27
+ this.divId = '';
28
+ /** Id of the viewer's plot div: the inset parks near its top-right corner. */
29
+ this.plotDivName = '';
30
+ /** The displayed slice, re-sampled at when the view settles. */
31
+ this.zIndex = 0;
32
+ /** The Image view (OSD), whose line sampling is fed from preview frames. */
33
+ this.imageView = false;
34
+ /** True whenever any intensity-profile line exists (whatever the plot type). */
35
+ this.hasProfiles = signal(false);
36
+ this.pos = signal({ x: 20, y: 70 });
37
+ /** Where a header drag starts from. */
38
+ this.dragOrigin = () => this.pos();
39
+ this.profiles = [];
40
+ this.onResize = () => {
41
+ // Reflow to the (fixed) panel size once layout has settled: a mid-reflow resize
42
+ // can leave the chart at a stale or zero size.
43
+ if (this.hasProfiles())
44
+ requestAnimationFrame(() => this.render());
45
+ };
46
+ }
47
+ ngOnInit() {
48
+ this.visualizer
49
+ .getIntensityProfile$()
50
+ .pipe(takeUntilDestroyed(this.destroyRef))
51
+ .subscribe((profiles) => {
52
+ this.profiles = profiles;
53
+ this.hasProfiles.set(profiles.length > 0);
54
+ // The panel is behind *ngIf. detectChanges() materializes it synchronously (the
55
+ // stream may fire outside the zone, e.g. from an OSD drag). Render on the next
56
+ // frame, AFTER layout: drawn synchronously, Plotly sizes a fresh chart to a zero
57
+ // box and keeps it, so the inset stays blank.
58
+ this.cdr.detectChanges();
59
+ requestAnimationFrame(() => this.render());
60
+ });
61
+ // When the OSD view settles at a new zoom/pan, re-sample from a crop of the
62
+ // visible region so the inset reflects the zoom-level resolution (Plotly's own
63
+ // high-def zoom updates the sampling cache inline).
64
+ this.visualizer
65
+ .getViewportChange$()
66
+ .pipe(takeUntilDestroyed(this.destroyRef))
67
+ .subscribe((roi) => {
68
+ if (this.hasProfiles() && this.imageView) {
69
+ this.visualizer.refreshIntensitySamplingForRoi(roi.x, roi.y, roi.width, roi.height, this.zIndex);
70
+ }
71
+ });
72
+ this.zone.runOutsideAngular(() => window.addEventListener('resize', this.onResize));
73
+ }
74
+ /** Removes the window resize listener; the streams end through `takeUntilDestroyed`. */
75
+ ngOnDestroy() {
76
+ window.removeEventListener('resize', this.onResize);
77
+ }
78
+ /** The canvas was resized: reflow the chart a tick later, once the panel has settled. */
79
+ reflow() {
80
+ if (this.hasProfiles())
81
+ setTimeout(() => this.render(), 0);
82
+ }
83
+ /** A slice was committed: keep the lines sampled from it (Image view). */
84
+ sliceCommitted(z) {
85
+ if (this.hasProfiles() && this.imageView && this.imageInfo) {
86
+ void this.visualizer.ensureIntensitySampling(this.imageInfo, z);
87
+ }
88
+ }
89
+ /**
90
+ * Add another line ROI (next bright colour) and select it on the active backend so
91
+ * it is ready to move or delete. The first line parks the inset near the plot's
92
+ * top-right. Resolves the new line, or null when no image extent is known yet.
93
+ */
94
+ async addProfileLine() {
95
+ if (!this.hasProfiles()) {
96
+ const rect = document.getElementById(this.plotDivName)?.getBoundingClientRect();
97
+ this.pos.set(rect ? { x: Math.max(10, rect.right - 300), y: rect.top + 10 } : { x: 20, y: 70 });
98
+ }
99
+ // Image (OSD) view: Plotly never rendered, so it has no pixel cache / extent. Load
100
+ // the current slice's frames for sampling + line placement first.
101
+ if (this.imageView && this.imageInfo) {
102
+ await this.visualizer.ensureIntensitySampling(this.imageInfo, this.zIndex);
103
+ }
104
+ const region = this.visualizer.getIntensityControls()?.addProfileLine() ?? null;
105
+ if (region)
106
+ this.visualizer.selectRegion(region);
107
+ return region;
108
+ }
109
+ render() {
110
+ if (this.hasProfiles())
111
+ this.visualizer.renderIntensityInset(this.divId, this.profiles);
112
+ }
113
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: IntensityInsetComponent, deps: [{ token: VISUALIZER }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component }); }
114
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: IntensityInsetComponent, isStandalone: true, selector: "viz-intensity-inset", inputs: { divId: "divId", plotDivName: "plotDivName", zIndex: "zIndex", imageView: "imageView", imageInfo: "imageInfo" }, ngImport: i0, template: "<div *ngIf=\"hasProfiles()\" class=\"intensity-panel\" [style.left.px]=\"pos().x\" [style.top.px]=\"pos().y\">\n <div class=\"intensity-panel-header\" [vizFloatingDrag]=\"dragOrigin\" (vizFloatingDragMove)=\"pos.set($event)\">\n <span>Intensity profile</span>\n <i class=\"pi pi-arrows-alt\"></i>\n </div>\n <div [id]=\"divId\" class=\"intensity-panel-plot\"></div>\n</div>\n", styles: [".intensity-panel{position:fixed;z-index:1100;width:280px;height:180px;background:#191919e6;border:1px solid var(--primary-color, #3399ff);border-radius:6px;box-shadow:0 4px 14px #00000073;display:flex;flex-direction:column;overflow:hidden}.intensity-panel-header{display:flex;align-items:center;justify-content:space-between;padding:.25rem .5rem;cursor:move;-webkit-user-select:none;user-select:none;background:#ffffff14;color:#eee;font-size:.75rem;font-weight:600}.intensity-panel-header i{opacity:.6;font-size:.7rem}.intensity-panel-plot{flex:1 1 auto;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: FloatingDragDirective, selector: "[vizFloatingDrag]", inputs: ["vizFloatingDrag"], outputs: ["vizFloatingDragMove"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
115
+ }
116
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: IntensityInsetComponent, decorators: [{
117
+ type: Component,
118
+ args: [{ selector: 'viz-intensity-inset', standalone: true, imports: [CommonModule, FloatingDragDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"hasProfiles()\" class=\"intensity-panel\" [style.left.px]=\"pos().x\" [style.top.px]=\"pos().y\">\n <div class=\"intensity-panel-header\" [vizFloatingDrag]=\"dragOrigin\" (vizFloatingDragMove)=\"pos.set($event)\">\n <span>Intensity profile</span>\n <i class=\"pi pi-arrows-alt\"></i>\n </div>\n <div [id]=\"divId\" class=\"intensity-panel-plot\"></div>\n</div>\n", styles: [".intensity-panel{position:fixed;z-index:1100;width:280px;height:180px;background:#191919e6;border:1px solid var(--primary-color, #3399ff);border-radius:6px;box-shadow:0 4px 14px #00000073;display:flex;flex-direction:column;overflow:hidden}.intensity-panel-header{display:flex;align-items:center;justify-content:space-between;padding:.25rem .5rem;cursor:move;-webkit-user-select:none;user-select:none;background:#ffffff14;color:#eee;font-size:.75rem;font-weight:600}.intensity-panel-header i{opacity:.6;font-size:.7rem}.intensity-panel-plot{flex:1 1 auto;width:100%}\n"] }]
119
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
120
+ type: Inject,
121
+ args: [VISUALIZER]
122
+ }] }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i0.DestroyRef }], propDecorators: { divId: [{
123
+ type: Input
124
+ }], plotDivName: [{
125
+ type: Input
126
+ }], zIndex: [{
127
+ type: Input
128
+ }], imageView: [{
129
+ type: Input
130
+ }], imageInfo: [{
131
+ type: Input
132
+ }] } });
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZW5zaXR5LWluc2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvaW50ZW5zaXR5LWluc2V0L2ludGVuc2l0eS1pbnNldC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2ludGVuc2l0eS1pbnNldC9pbnRlbnNpdHktaW5zZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFHTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBaUMsVUFBVSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFN0YsT0FBTyxFQUFFLHFCQUFxQixFQUFlLE1BQU0sdUNBQXVDLENBQUM7OztBQUUzRjs7Ozs7Ozs7Ozs7R0FXRztBQVNILE1BQU0sT0FBTyx1QkFBdUI7SUF5QmxDLFlBQ3VDLFVBQXVCLEVBQzNDLEdBQXNCLEVBQ3RCLElBQVksRUFDWixVQUFzQjtRQUhGLGVBQVUsR0FBVixVQUFVLENBQWE7UUFDM0MsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGVBQVUsR0FBVixVQUFVLENBQVk7UUE1QnpDLDhFQUE4RTtRQUNyRSxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLDhFQUE4RTtRQUNyRSxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUMxQixnRUFBZ0U7UUFDdkQsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNwQiw0RUFBNEU7UUFDbkUsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUkzQixnRkFB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R1UsdUJBQXVCLGtCQTBCeEIsVUFBVTtrR0ExQlQsdUJBQXVCLHlNQ3hDcEMsa1lBT0EsZ25CRDRCWSxZQUFZLG1JQUFFLHFCQUFxQjs7MkZBS2xDLHVCQUF1QjtrQkFSbkMsU0FBUzsrQkFDRSxxQkFBcUIsY0FDbkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLHFCQUFxQixDQUFDLG1CQUM3Qix1QkFBdUIsQ0FBQyxNQUFNOzswQkE4QjVDLE1BQU07MkJBQUMsVUFBVTt1SEF4QlgsS0FBSztzQkFBYixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlbnNpdHlQcm9maWxlLCBJVmlzdWFsaXplciwgVklTVUFMSVpFUiB9IGZyb20gJy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvbiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgRmxvYXRpbmdEcmFnRGlyZWN0aXZlLCBGbG9hdGluZ1BvcyB9IGZyb20gJy4uL3Zpc3VhbGl6ZXIvZmxvYXRpbmctZHJhZy5kaXJlY3RpdmUnO1xuXG4vKipcbiAqIFRoZSBmbG9hdGluZywgZHJhZ2dhYmxlIGludGVuc2l0eS1wcm9maWxlIGluc2V0OiBzaG93biB3aGlsZSBhbnkgaW50ZW5zaXR5IGxpbmVcbiAqIGV4aXN0cywgY2hhcnRpbmcgb25lIHRyYWNlIHBlciBsaW5lIGFzIGxpbmVzIGFyZSBhZGRlZCwgbW92ZWQgb3IgcmVtb3ZlZC5cbiAqXG4gKiBPd25zIHRoZSBwcm9maWxlIGFuZCB2aWV3cG9ydC1jaGFuZ2Ugc3Vic2NyaXB0aW9ucywgdGhlIHdpbmRvdy1yZXNpemUgcmVmbG93LCB0aGVcbiAqIGRyYWcgYW5kIHRoZSBwZXItaW5zdGFuY2UgY2hhcnQgZGl2IGlkIGl0IGlzIGdpdmVuLiBUaGUgY2hhcnQgaXRzZWxmIGlzIGRyYXduIGJ5IHRoZVxuICogYmFja2VuZCAoYElWaXN1YWxpemVyLnJlbmRlckludGVuc2l0eUluc2V0YCkgc28gdGhpcyBuZXZlciByZWFjaGVzIGEgY2hhcnRpbmdcbiAqIGxpYnJhcnkuIEZpeGVkIHRvIHRoZSB2aWV3cG9ydCwgb3V0c2lkZSB0aGUgcGxvdCBkaXYsIHNvIGl0IGlzIG5vdCBjbGlwcGVkIHRvIHRoZVxuICogY2FudmFzLlxuICpcbiAqIE9uUHVzaCwgd2l0aCBpdHMgdmlldyBzdGF0ZSBpbiBzaWduYWxzOiB0aGUgcHJvZmlsZSBzdHJlYW0gbWF5IGZpcmUgb3V0c2lkZSB0aGUgem9uZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndml6LWludGVuc2l0eS1pbnNldCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZsb2F0aW5nRHJhZ0RpcmVjdGl2ZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZVVybDogJy4vaW50ZW5zaXR5LWluc2V0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW50ZW5zaXR5LWluc2V0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEludGVuc2l0eUluc2V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiogSWQgb2YgdGhlIGNoYXJ0IGRpdiDigJQgdW5pcXVlIHBlciB2aWV3ZXI6IHRoZSBiYWNrZW5kIHJlc29sdmVzIGl0IGJ5IGlkLiAqL1xuICBASW5wdXQoKSBkaXZJZCA9ICcnO1xuICAvKiogSWQgb2YgdGhlIHZpZXdlcidzIHBsb3QgZGl2OiB0aGUgaW5zZXQgcGFya3MgbmVhciBpdHMgdG9wLXJpZ2h0IGNvcm5lci4gKi9cbiAgQElucHV0KCkgcGxvdERpdk5hbWUgPSAnJztcbiAgLyoqIFRoZSBkaXNwbGF5ZWQgc2xpY2UsIHJlLXNhbXBsZWQgYXQgd2hlbiB0aGUgdmlldyBzZXR0bGVzLiAqL1xuICBASW5wdXQoKSB6SW5kZXggPSAwO1xuICAvKiogVGhlIEltYWdlIHZpZXcgKE9TRCksIHdob3NlIGxpbmUgc2FtcGxpbmcgaXMgZmVkIGZyb20gcHJldmlldyBmcmFtZXMuICovXG4gIEBJbnB1dCgpIGltYWdlVmlldyA9IGZhbHNlO1xuICAvKiogVGhlIGltYWdlIHNob3duICh0aGUgSW1hZ2UgdmlldyBzYW1wbGVzIGl0cyBsaW5lcyBmcm9tIGl0KS4gKi9cbiAgQElucHV0KCkgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUcnVlIHdoZW5ldmVyIGFueSBpbnRlbnNpdHktcHJvZmlsZSBsaW5lIGV4aXN0cyAod2hhdGV2ZXIgdGhlIHBsb3QgdHlwZSkuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBoYXNQcm9maWxlcyA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBwb3MgPSBzaWduYWw8RmxvYXRpbmdQb3M+KHsgeDogMjAsIHk6IDcwIH0pO1xuICAvKiogV2hlcmUgYSBoZWFkZXIgZHJhZyBzdGFydHMgZnJvbS4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRyYWdPcmlnaW4gPSAoKTogRmxvYXRpbmdQb3MgPT4gdGhpcy5wb3MoKTtcblxuICBwcml2YXRlIHByb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBvblJlc2l6ZSA9ICgpID0+IHtcbiAgICAvLyBSZWZsb3cgdG8gdGhlIChmaXhlZCkgcGFuZWwgc2l6ZSBvbmNlIGxheW91dCBoYXMgc2V0dGxlZDogYSBtaWQtcmVmbG93IHJlc2l6ZVxuICAgIC8vIGNhbiBsZWF2ZSB0aGUgY2hhcnQgYXQgYSBzdGFsZSBvciB6ZXJvIHNpemUuXG4gICAgaWYgKHRoaXMuaGFzUHJvZmlsZXMoKSkgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMucmVuZGVyKCkpO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVklTVUFMSVpFUikgcHJpdmF0ZSByZWFkb25seSB2aXN1YWxpemVyOiBJVmlzdWFsaXplcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSB6b25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmOiBEZXN0cm95UmVmLFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy52aXN1YWxpemVyXG4gICAgICAuZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChwcm9maWxlcykgPT4ge1xuICAgICAgICB0aGlzLnByb2ZpbGVzID0gcHJvZmlsZXM7XG4gICAgICAgIHRoaXMuaGFzUHJvZmlsZXMuc2V0KHByb2ZpbGVzLmxlbmd0aCA+IDApO1xuICAgICAgICAvLyBUaGUgcGFuZWwgaXMgYmVoaW5kICpuZ0lmLiBkZXRlY3RDaGFuZ2VzKCkgbWF0ZXJpYWxpemVzIGl0IHN5bmNocm9ub3VzbHkgKHRoZVxuICAgICAgICAvLyBzdHJlYW0gbWF5IGZpcmUgb3V0c2lkZSB0aGUgem9uZSwgZS5nLiBmcm9tIGFuIE9TRCBkcmFnKS4gUmVuZGVyIG9uIHRoZSBuZXh0XG4gICAgICAgIC8vIGZyYW1lLCBBRlRFUiBsYXlvdXQ6IGRyYXduIHN5bmNocm9ub3VzbHksIFBsb3RseSBzaXplcyBhIGZyZXNoIGNoYXJ0IHRvIGEgemVyb1xuICAgICAgICAvLyBib3ggYW5kIGtlZXBzIGl0LCBzbyB0aGUgaW5zZXQgc3RheXMgYmxhbmsuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMucmVuZGVyKCkpO1xuICAgICAgfSk7XG4gICAgLy8gV2hlbiB0aGUgT1NEIHZpZXcgc2V0dGxlcyBhdCBhIG5ldyB6b29tL3BhbiwgcmUtc2FtcGxlIGZyb20gYSBjcm9wIG9mIHRoZVxuICAgIC8vIHZpc2libGUgcmVnaW9uIHNvIHRoZSBpbnNldCByZWZsZWN0cyB0aGUgem9vbS1sZXZlbCByZXNvbHV0aW9uIChQbG90bHkncyBvd25cbiAgICAvLyBoaWdoLWRlZiB6b29tIHVwZGF0ZXMgdGhlIHNhbXBsaW5nIGNhY2hlIGlubGluZSkuXG4gICAgdGhpcy52aXN1YWxpemVyXG4gICAgICAuZ2V0Vmlld3BvcnRDaGFuZ2UkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgocm9pKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc1Byb2ZpbGVzKCkgJiYgdGhpcy5pbWFnZVZpZXcpIHtcbiAgICAgICAgICB0aGlzLnZpc3VhbGl6ZXIucmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHJvaS54LCByb2kueSwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCB0aGlzLnpJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5vblJlc2l6ZSkpO1xuICB9XG5cbiAgLyoqIFJlbW92ZXMgdGhlIHdpbmRvdyByZXNpemUgbGlzdGVuZXI7IHRoZSBzdHJlYW1zIGVuZCB0aHJvdWdoIGB0YWtlVW50aWxEZXN0cm95ZWRgLiAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5vblJlc2l6ZSk7XG4gIH1cblxuICAvKiogVGhlIGNhbnZhcyB3YXMgcmVzaXplZDogcmVmbG93IHRoZSBjaGFydCBhIHRpY2sgbGF0ZXIsIG9uY2UgdGhlIHBhbmVsIGhhcyBzZXR0bGVkLiAqL1xuICByZWZsb3coKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJvZmlsZXMoKSkgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlbmRlcigpLCAwKTtcbiAgfVxuXG4gIC8qKiBBIHNsaWNlIHdhcyBjb21taXR0ZWQ6IGtlZXAgdGhlIGxpbmVzIHNhbXBsZWQgZnJvbSBpdCAoSW1hZ2UgdmlldykuICovXG4gIHNsaWNlQ29tbWl0dGVkKHo6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc1Byb2ZpbGVzKCkgJiYgdGhpcy5pbWFnZVZpZXcgJiYgdGhpcy5pbWFnZUluZm8pIHtcbiAgICAgIHZvaWQgdGhpcy52aXN1YWxpemVyLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKHRoaXMuaW1hZ2VJbmZvLCB6KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFub3RoZXIgbGluZSBST0kgKG5leHQgYnJpZ2h0IGNvbG91cikgYW5kIHNlbGVjdCBpdCBvbiB0aGUgYWN0aXZlIGJhY2tlbmQgc29cbiAgICogaXQgaXMgcmVhZHkgdG8gbW92ZSBvciBkZWxldGUuIFRoZSBmaXJzdCBsaW5lIHBhcmtzIHRoZSBpbnNldCBuZWFyIHRoZSBwbG90J3NcbiAgICogdG9wLXJpZ2h0LiBSZXNvbHZlcyB0aGUgbmV3IGxpbmUsIG9yIG51bGwgd2hlbiBubyBpbWFnZSBleHRlbnQgaXMga25vd24geWV0LlxuICAgKi9cbiAgYXN5bmMgYWRkUHJvZmlsZUxpbmUoKTogUHJvbWlzZTxSZWdpb24gfCBudWxsPiB7XG4gICAgaWYgKCF0aGlzLmhhc1Byb2ZpbGVzKCkpIHtcbiAgICAgIGNvbnN0IHJlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXZOYW1lKT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLnBvcy5zZXQocmVjdCA/IHsgeDogTWF0aC5tYXgoMTAsIHJlY3QucmlnaHQgLSAzMDApLCB5OiByZWN0LnRvcCArIDEwIH0gOiB7IHg6IDIwLCB5OiA3MCB9KTtcbiAgICB9XG4gICAgLy8gSW1hZ2UgKE9TRCkgdmlldzogUGxvdGx5IG5ldmVyIHJlbmRlcmVkLCBzbyBpdCBoYXMgbm8gcGl4ZWwgY2FjaGUgLyBleHRlbnQuIExvYWRcbiAgICAvLyB0aGUgY3VycmVudCBzbGljZSdzIGZyYW1lcyBmb3Igc2FtcGxpbmcgKyBsaW5lIHBsYWNlbWVudCBmaXJzdC5cbiAgICBpZiAodGhpcy5pbWFnZVZpZXcgJiYgdGhpcy5pbWFnZUluZm8pIHtcbiAgICAgIGF3YWl0IHRoaXMudmlzdWFsaXplci5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZyh0aGlzLmltYWdlSW5mbywgdGhpcy56SW5kZXgpO1xuICAgIH1cbiAgICBjb25zdCByZWdpb24gPSB0aGlzLnZpc3VhbGl6ZXIuZ2V0SW50ZW5zaXR5Q29udHJvbHMoKT8uYWRkUHJvZmlsZUxpbmUoKSA/PyBudWxsO1xuICAgIGlmIChyZWdpb24pIHRoaXMudmlzdWFsaXplci5zZWxlY3RSZWdpb24ocmVnaW9uKTtcbiAgICByZXR1cm4gcmVnaW9uO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJvZmlsZXMoKSkgdGhpcy52aXN1YWxpemVyLnJlbmRlckludGVuc2l0eUluc2V0KHRoaXMuZGl2SWQsIHRoaXMucHJvZmlsZXMpO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiaGFzUHJvZmlsZXMoKVwiIGNsYXNzPVwiaW50ZW5zaXR5LXBhbmVsXCIgW3N0eWxlLmxlZnQucHhdPVwicG9zKCkueFwiIFtzdHlsZS50b3AucHhdPVwicG9zKCkueVwiPlxuICA8ZGl2IGNsYXNzPVwiaW50ZW5zaXR5LXBhbmVsLWhlYWRlclwiIFt2aXpGbG9hdGluZ0RyYWddPVwiZHJhZ09yaWdpblwiICh2aXpGbG9hdGluZ0RyYWdNb3ZlKT1cInBvcy5zZXQoJGV2ZW50KVwiPlxuICAgIDxzcGFuPkludGVuc2l0eSBwcm9maWxlPC9zcGFuPlxuICAgIDxpIGNsYXNzPVwicGkgcGktYXJyb3dzLWFsdFwiPjwvaT5cbiAgPC9kaXY+XG4gIDxkaXYgW2lkXT1cImRpdklkXCIgY2xhc3M9XCJpbnRlbnNpdHktcGFuZWwtcGxvdFwiPjwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -107,14 +107,4 @@ export function bezierCurveFromHandles(xs, ys, handles, closed) {
107
107
  }
108
108
  return { xs: outX, ys: outY };
109
109
  }
110
- /**
111
- * Flatten the smooth Catmull-Rom bezier through the anchors (no custom handles).
112
- * Falls back to the anchors when there are too few to form a curve.
113
- */
114
- export function bezierCurve(xs, ys, closed) {
115
- const n = Math.min(xs.length, ys.length);
116
- if (n < 3)
117
- return { xs: xs.slice(), ys: ys.slice() };
118
- return bezierCurveFromHandles(xs, ys, bezierAnchorHandles(xs, ys, closed), closed);
119
- }
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmV6aWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvYmV6aWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQWdCSCw4RUFBOEU7QUFDOUUsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7QUFFL0I7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsRUFBWSxFQUFFLEVBQVksRUFBRSxNQUFlO0lBQzdFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekMsTUFBTSxHQUFHLEdBQW1CLEVBQUUsQ0FBQztJQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUks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LEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLG1CQUFtQixFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUMzRCxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxFQUFZLEVBQUUsRUFBWSxFQUFFLE1BQWU7SUFDckUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQ3JELE9BQU8sc0JBQXNCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3JGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJlemllci1jdXJ2ZSBoZWxwZXJzIChubyBleHRlcm5hbCBkZXBlbmRlbmN5KS5cbiAqXG4gKiBKSVQgc3VwcG9ydHMgdHJ1ZSBiZXppZXIgcmVnaW9uczogYSBwb2x5Z29uJ3MgdmVydGljZXMgYXJlIHRoZSBlZGl0YWJsZVxuICogKmFuY2hvcnMqLCBhbmQgdGhlIHNtb290aCBjdXJ2ZSB0aHJvdWdoIHRoZW0gaXMgZGVyaXZlZCBoZXJlIHdpdGggdGhlXG4gKiBDYXRtdWxsLVJvbSBjb25zdHJ1Y3Rpb24g4oCUIHRoZSBzYW1lIGFsZ29yaXRobSBwYXBlci5qcyB1c2VzIGluXG4gKiBgcGF0aC5zbW9vdGgoKWAuIFRoZSBjdXJ2ZSBpbnRlcnBvbGF0ZXMgZXZlcnkgYW5jaG9yIGFuZFxuICogZWFjaCBhbmNob3IncyB0d28gaGFuZGxlcyBhcmUgY29saW5lYXIgKGEgc21vb3RoIHRhbmdlbnQpLlxuICpcbiAqIFRoZSBPU0Qgb3ZlcmxheSByZW5kZXJzIHRoZSBjdXJ2ZSBhcyBhIHRydWUgY3ViaWMgU1ZHIHBhdGggKyBkcmFnZ2FibGUgaGFuZGxlc1xuICogKHNlZSB7QGxpbmsgYmV6aWVyQW5jaG9ySGFuZGxlc30pOyBHZW9KU09OIGV4cG9ydCBmbGF0dGVucyB0aGUgKnNhbWUqIGN1Ymljc1xuICogaW50byBhIGRlbnNlIHBvaW50IGxpc3QgKHNlZSB7QGxpbmsgYmV6aWVyQ3VydmV9KSBzbyBhIHZpZXdlciB3aXRob3V0IGJlemllclxuICogc3VwcG9ydCAoZS5nLiBRdVBhdGgsIHdoaWNoIGp1c3QgZHJhd3MgdGhlIGNvb3JkaW5hdGUgbGlzdCkgc3RpbGwgc2hvd3MgdGhlXG4gKiBzbW9vdGggc2hhcGUuIFVzaW5nIG9uZSBhbGdvcml0aG0gZm9yIGJvdGgga2VlcHMgd2hhdCBKSVQgZHJhd3MgaWRlbnRpY2FsIHRvXG4gKiB3aGF0IGl0IGV4cG9ydHMuXG4gKlxuICogUHVyZSBmdW5jdGlvbnM6IG5vIERPTSwgbm8gc2VydmljZSBzdGF0ZS4gQ29vcmRpbmF0ZXMgYXJlIGltYWdlIHBpeGVscy5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEN1cnZlUG9pbnRzIHtcbiAgeHM6IG51bWJlcltdO1xuICB5czogbnVtYmVyW107XG59XG5cbi8qKiBBIHZlcnRleCdzIHR3byBjdWJpYy1iZXppZXIgY29udHJvbCBwb2ludHMgKGFic29sdXRlIGNvb3JkcykgcGx1cyB3aGV0aGVyXG4gKiAgZWFjaCBzaWRlIGhhcyBhIGhhbmRsZSAob3Blbi1wYXRoIGVuZHBvaW50cyBoYXZlIG9ubHkgb25lKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5jaG9ySGFuZGxlIHtcbiAgaW46IFtudW1iZXIsIG51bWJlcl07XG4gIG91dDogW251bWJlciwgbnVtYmVyXTtcbiAgaGFzSW46IGJvb2xlYW47XG4gIGhhc091dDogYm9vbGVhbjtcbn1cblxuLyoqIEhvdyBtYW55IHBvaW50cyB0byBzYW1wbGUgcGVyIGN1YmljIHNlZ21lbnQgd2hlbiBmbGF0dGVuaW5nIGZvciBleHBvcnQuICovXG5jb25zdCBTQU1QTEVTX1BFUl9TRUdNRU5UID0gMTY7XG5cbi8qKlxuICogUGVyLWFuY2hvciBjdWJpYy1iZXppZXIgY29udHJvbCBwb2ludHMgdXNpbmcgdGhlIENhdG11bGwtUm9tIGNvbnN0cnVjdGlvblxuICogKHRlbnNpb24gMTogY29udHJvbCA9IGFuY2hvciDCsSAobmV4dCDiiJIgcHJldikgLyA2KS4gTWF0Y2hlcyBwYXBlci5qc1xuICogYHBhdGguc21vb3RoKClgOiB0aGUgcmVzdWx0aW5nIGN1YmljIGludGVycG9sYXRlcyBldmVyeSBhbmNob3IgYW5kIHRoZSB0d29cbiAqIGhhbmRsZXMgb2YgZWFjaCBhbmNob3IgYXJlIGNvbGluZWFyLiBDb29yZGluYXRlcyBhcmUgaW4gdGhlIGlucHV0IHNwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmV6aWVyQW5jaG9ySGFuZGxlcyh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSwgY2xvc2VkOiBib29sZWFuKTogQW5jaG9ySGFuZGxlW10ge1xuICBjb25zdCBuID0gTWF0aC5taW4oeHMubGVuZ3RoLCB5cy5sZW5ndGgpO1xuICBjb25zdCBvdXQ6IEFuY2hvckhhbmRsZVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgY29uc3QgcHJldiA9IGNsb3NlZCA/IChpIC0gMSArIG4pICUgbiA6IE1hdGgubWF4KDAsIGkgLSAxKTtcbiAgICBjb25zdCBuZXh0ID0gY2xvc2VkID8gKGkgKyAxKSAlIG4gOiBNYXRoLm1pbihuIC0gMSwgaSArIDEpO1xuICAgIGNvbnN0IHR4ID0gKHhzW25leHRdIC0geHNbcHJldl0pIC8gNjtcbiAgICBjb25zdCB0eSA9ICh5c1tuZXh0XSAtIHlzW3ByZXZdKSAvIDY7XG4gICAgb3V0LnB1c2goe1xuICAgICAgb3V0OiBbeHNbaV0gKyB0eCwgeXNbaV0gKyB0eV0sXG4gICAgICBpbjogW3hzW2ldIC0gdHgsIHlzW2ldIC0gdHldLFxuICAgICAgaGFzT3V0OiBjbG9zZWQgfHwgaSA8IG4gLSAxLFxuICAgICAgaGFzSW46IGNsb3NlZCB8fCBpID4gMCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogVGhlIENhdG11bGwtUm9tIGhhbmRsZXMgYXMgKipyZWxhdGl2ZSoqIG9mZnNldHMgYFtkeCwgZHldYCBwZXIgYW5jaG9yIOKAlCB1c2VkXG4gKiAgdG8gaW5pdGlhbGlzZSBhIHJlZ2lvbidzIGVkaXRhYmxlIGhhbmRsZXMgd2hlbiBiZXppZXIgaXMgdHVybmVkIG9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRIYW5kbGVPZmZzZXRzKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdLCBjbG9zZWQ6IGJvb2xlYW4pOlxuICB7IGluOiBudW1iZXJbXVtdOyBvdXQ6IG51bWJlcltdW10gfSB7XG4gIGNvbnN0IGggPSBiZXppZXJBbmNob3JIYW5kbGVzKHhzLCB5cywgY2xvc2VkKTtcbiAgcmV0dXJuIHtcbiAgICBpbjogaC5tYXAoKGEsIGkpID0+IFthLmluWzBdIC0geHNbaV0sIGEuaW5bMV0gLSB5c1tpXV0pLFxuICAgIG91dDogaC5tYXAoKGEsIGkpID0+IFthLm91dFswXSAtIHhzW2ldLCBhLm91dFsxXSAtIHlzW2ldXSksXG4gIH07XG59XG5cbi8qKiBBYnNvbHV0ZSBoYW5kbGVzIGZyb20gc3RvcmVkIHJlbGF0aXZlIG9mZnNldHMgKGFuY2hvciArIG9mZnNldCkuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlc0Zyb21PZmZzZXRzKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9mZjogbnVtYmVyW11bXSwgb3V0T2ZmOiBudW1iZXJbXVtdLCBjbG9zZWQ6IGJvb2xlYW4pOiBBbmNob3JIYW5kbGVbXSB7XG4gIGNvbnN0IG4gPSBNYXRoLm1pbih4cy5sZW5ndGgsIHlzLmxlbmd0aCk7XG4gIGNvbnN0IG91dDogQW5jaG9ySGFuZGxlW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBvdXQucHVzaCh7XG4gICAgICBpbjogW3hzW2ldICsgKGluT2ZmW2ldPy5bMF0gPz8gMCksIHlzW2ldICsgKGluT2ZmW2ldPy5bMV0gPz8gMCldLFxuICAgICAgb3V0OiBbeHNbaV0gKyAob3V0T2ZmW2ldPy5bMF0gPz8gMCksIHlzW2ldICsgKG91dE9mZltpXT8uWzFdID8/IDApXSxcbiAgICAgIGhhc091dDogY2xvc2VkIHx8IGkgPCBuIC0gMSxcbiAgICAgIGhhc0luOiBjbG9zZWQgfHwgaSA+IDAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIEEgcmVnaW9uJ3MgaGFuZGxlczogZnJvbSBpdHMgc3RvcmVkIChlZGl0YWJsZSkgb2Zmc2V0cyB3aGVuIHByZXNlbnQsIGVsc2UgdGhlXG4gKiAgQ2F0bXVsbC1Sb20gZGVmYXVsdC4gVGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGJvdGggcmVuZGVyaW5nIGFuZCBleHBvcnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUhhbmRsZXMoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGNsb3NlZDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9mZj86IG51bWJlcltdW10sIG91dE9mZj86IG51bWJlcltdW10pOiBBbmNob3JIYW5kbGVbXSB7XG4gIGlmIChpbk9mZiAmJiBvdXRPZmYgJiYgaW5PZmYubGVuZ3RoID09PSB4cy5sZW5ndGggJiYgb3V0T2ZmLmxlbmd0aCA9PT0geHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGhhbmRsZXNGcm9tT2Zmc2V0cyh4cywgeXMsIGluT2ZmLCBvdXRPZmYsIGNsb3NlZCk7XG4gIH1cbiAgcmV0dXJuIGJlemllckFuY2hvckhhbmRsZXMoeHMsIHlzLCBjbG9zZWQpO1xufVxuXG4vKipcbiAqIEZsYXR0ZW4gYSBjdWJpYyBiZXppZXIgKGRlZmluZWQgYnkgZXhwbGljaXQgcGVyLWFuY2hvciBoYW5kbGVzKSBpbnRvIGEgZGVuc2VcbiAqIHBvaW50IGxpc3QgYnkgc2FtcGxpbmcgZWFjaCBzZWdtZW50LiBUaGUgY3VydmUgcGFzc2VzIHRocm91Z2ggZXZlcnkgYW5jaG9yOyBhXG4gKiBjbG9zZWQgcmluZyByZXR1cm5zIHRvIGl0cyBmaXJzdCBwb2ludC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlemllckN1cnZlRnJvbUhhbmRsZXMoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzOiBBbmNob3JIYW5kbGVbXSwgY2xvc2VkOiBib29sZWFuKTogQ3VydmVQb2ludHMge1xuICBjb25zdCBuID0gTWF0aC5taW4oeHMubGVuZ3RoLCB5cy5sZW5ndGgpO1xuICBpZiAobiA8IDMpIHJldHVybiB7IHhzOiB4cy5zbGljZSgpLCB5czogeXMuc2xpY2UoKSB9O1xuXG4gIGNvbnN0IG91dFg6IG51bWJlcltdID0gW107XG4gIGNvbnN0IG91dFk6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHNlZ3MgPSBjbG9zZWQgPyBuIDogbiAtIDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnczsgaSsrKSB7XG4gICAgY29uc3QgaiA9IChpICsgMSkgJSBuO1xuICAgIGNvbnN0IHAweCA9IHhzW2ldLCBwMHkgPSB5c1tpXTtcbiAgICBjb25zdCBjMSA9IGhhbmRsZXNbaV0ub3V0LCBjMiA9IGhhbmRsZXNbal0uaW47XG4gICAgY29uc3QgcDN4ID0geHNbal0sIHAzeSA9IHlzW2pdO1xuICAgIGZvciAobGV0IHMgPSAwOyBzIDwgU0FNUExFU19QRVJfU0VHTUVOVDsgcysrKSB7XG4gICAgICBjb25zdCB0ID0gcyAvIFNBTVBMRVNfUEVSX1NFR01FTlQ7XG4gICAgICBjb25zdCB1ID0gMSAtIHQ7XG4gICAgICBjb25zdCB3MCA9IHUgKiB1ICogdSwgdzEgPSAzICogdSAqIHUgKiB0LCB3MiA9IDMgKiB1ICogdCAqIHQsIHczID0gdCAqIHQgKiB0O1xuICAgICAgb3V0WC5wdXNoKHcwICogcDB4ICsgdzEgKiBjMVswXSArIHcyICogYzJbMF0gKyB3MyAqIHAzeCk7XG4gICAgICBvdXRZLnB1c2godzAgKiBwMHkgKyB3MSAqIGMxWzFdICsgdzIgKiBjMlsxXSArIHczICogcDN5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGNsb3NlZCkge1xuICAgIG91dFgucHVzaCh4c1swXSk7IG91dFkucHVzaCh5c1swXSk7XG4gIH0gZWxzZSB7XG4gICAgb3V0WC5wdXNoKHhzW24gLSAxXSk7IG91dFkucHVzaCh5c1tuIC0gMV0pO1xuICB9XG4gIHJldHVybiB7IHhzOiBvdXRYLCB5czogb3V0WSB9O1xufVxuXG4vKipcbiAqIEZsYXR0ZW4gdGhlIHNtb290aCBDYXRtdWxsLVJvbSBiZXppZXIgdGhyb3VnaCB0aGUgYW5jaG9ycyAobm8gY3VzdG9tIGhhbmRsZXMpLlxuICogRmFsbHMgYmFjayB0byB0aGUgYW5jaG9ycyB3aGVuIHRoZXJlIGFyZSB0b28gZmV3IHRvIGZvcm0gYSBjdXJ2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlemllckN1cnZlKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdLCBjbG9zZWQ6IGJvb2xlYW4pOiBDdXJ2ZVBvaW50cyB7XG4gIGNvbnN0IG4gPSBNYXRoLm1pbih4cy5sZW5ndGgsIHlzLmxlbmd0aCk7XG4gIGlmIChuIDwgMykgcmV0dXJuIHsgeHM6IHhzLnNsaWNlKCksIHlzOiB5cy5zbGljZSgpIH07XG4gIHJldHVybiBiZXppZXJDdXJ2ZUZyb21IYW5kbGVzKHhzLCB5cywgYmV6aWVyQW5jaG9ySGFuZGxlcyh4cywgeXMsIGNsb3NlZCksIGNsb3NlZCk7XG59XG4iXX0=
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmV6aWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvYmV6aWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQWdCSCw4RUFBOEU7QUFDOUUsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7QUFFL0I7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsRUFBWSxFQUFFLEVBQVksRUFBRSxNQUFlO0lBQzdFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekMsTUFBTSxHQUFHLEdBQW1CLEVBQUUsQ0FBQztJQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUks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QUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUM7U0FBTSxDQUFDO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUNELE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCZXppZXItY3VydmUgaGVscGVycyAobm8gZXh0ZXJuYWwgZGVwZW5kZW5jeSkuXG4gKlxuICogSklUIHN1cHBvcnRzIHRydWUgYmV6aWVyIHJlZ2lvbnM6IGEgcG9seWdvbidzIHZlcnRpY2VzIGFyZSB0aGUgZWRpdGFibGVcbiAqICphbmNob3JzKiwgYW5kIHRoZSBzbW9vdGggY3VydmUgdGhyb3VnaCB0aGVtIGlzIGRlcml2ZWQgaGVyZSB3aXRoIHRoZVxuICogQ2F0bXVsbC1Sb20gY29uc3RydWN0aW9uIOKAlCB0aGUgc2FtZSBhbGdvcml0aG0gcGFwZXIuanMgdXNlcyBpblxuICogYHBhdGguc21vb3RoKClgLiBUaGUgY3VydmUgaW50ZXJwb2xhdGVzIGV2ZXJ5IGFuY2hvciBhbmRcbiAqIGVhY2ggYW5jaG9yJ3MgdHdvIGhhbmRsZXMgYXJlIGNvbGluZWFyIChhIHNtb290aCB0YW5nZW50KS5cbiAqXG4gKiBUaGUgT1NEIG92ZXJsYXkgcmVuZGVycyB0aGUgY3VydmUgYXMgYSB0cnVlIGN1YmljIFNWRyBwYXRoICsgZHJhZ2dhYmxlIGhhbmRsZXNcbiAqIChzZWUge0BsaW5rIGJlemllckFuY2hvckhhbmRsZXN9KTsgR2VvSlNPTiBleHBvcnQgZmxhdHRlbnMgdGhlICpzYW1lKiBjdWJpY3NcbiAqIGludG8gYSBkZW5zZSBwb2ludCBsaXN0IChzZWUge0BsaW5rIGJlemllckN1cnZlfSkgc28gYSB2aWV3ZXIgd2l0aG91dCBiZXppZXJcbiAqIHN1cHBvcnQgKGUuZy4gUXVQYXRoLCB3aGljaCBqdXN0IGRyYXdzIHRoZSBjb29yZGluYXRlIGxpc3QpIHN0aWxsIHNob3dzIHRoZVxuICogc21vb3RoIHNoYXBlLiBVc2luZyBvbmUgYWxnb3JpdGhtIGZvciBib3RoIGtlZXBzIHdoYXQgSklUIGRyYXdzIGlkZW50aWNhbCB0b1xuICogd2hhdCBpdCBleHBvcnRzLlxuICpcbiAqIFB1cmUgZnVuY3Rpb25zOiBubyBET00sIG5vIHNlcnZpY2Ugc3RhdGUuIENvb3JkaW5hdGVzIGFyZSBpbWFnZSBwaXhlbHMuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBDdXJ2ZVBvaW50cyB7XG4gIHhzOiBudW1iZXJbXTtcbiAgeXM6IG51bWJlcltdO1xufVxuXG4vKiogQSB2ZXJ0ZXgncyB0d28gY3ViaWMtYmV6aWVyIGNvbnRyb2wgcG9pbnRzIChhYnNvbHV0ZSBjb29yZHMpIHBsdXMgd2hldGhlclxuICogIGVhY2ggc2lkZSBoYXMgYSBoYW5kbGUgKG9wZW4tcGF0aCBlbmRwb2ludHMgaGF2ZSBvbmx5IG9uZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuY2hvckhhbmRsZSB7XG4gIGluOiBbbnVtYmVyLCBudW1iZXJdO1xuICBvdXQ6IFtudW1iZXIsIG51bWJlcl07XG4gIGhhc0luOiBib29sZWFuO1xuICBoYXNPdXQ6IGJvb2xlYW47XG59XG5cbi8qKiBIb3cgbWFueSBwb2ludHMgdG8gc2FtcGxlIHBlciBjdWJpYyBzZWdtZW50IHdoZW4gZmxhdHRlbmluZyBmb3IgZXhwb3J0LiAqL1xuY29uc3QgU0FNUExFU19QRVJfU0VHTUVOVCA9IDE2O1xuXG4vKipcbiAqIFBlci1hbmNob3IgY3ViaWMtYmV6aWVyIGNvbnRyb2wgcG9pbnRzIHVzaW5nIHRoZSBDYXRtdWxsLVJvbSBjb25zdHJ1Y3Rpb25cbiAqICh0ZW5zaW9uIDE6IGNvbnRyb2wgPSBhbmNob3IgwrEgKG5leHQg4oiSIHByZXYpIC8gNikuIE1hdGNoZXMgcGFwZXIuanNcbiAqIGBwYXRoLnNtb290aCgpYDogdGhlIHJlc3VsdGluZyBjdWJpYyBpbnRlcnBvbGF0ZXMgZXZlcnkgYW5jaG9yIGFuZCB0aGUgdHdvXG4gKiBoYW5kbGVzIG9mIGVhY2ggYW5jaG9yIGFyZSBjb2xpbmVhci4gQ29vcmRpbmF0ZXMgYXJlIGluIHRoZSBpbnB1dCBzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlemllckFuY2hvckhhbmRsZXMoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGNsb3NlZDogYm9vbGVhbik6IEFuY2hvckhhbmRsZVtdIHtcbiAgY29uc3QgbiA9IE1hdGgubWluKHhzLmxlbmd0aCwgeXMubGVuZ3RoKTtcbiAgY29uc3Qgb3V0OiBBbmNob3JIYW5kbGVbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IHByZXYgPSBjbG9zZWQgPyAoaSAtIDEgKyBuKSAlIG4gOiBNYXRoLm1heCgwLCBpIC0gMSk7XG4gICAgY29uc3QgbmV4dCA9IGNsb3NlZCA/IChpICsgMSkgJSBuIDogTWF0aC5taW4obiAtIDEsIGkgKyAxKTtcbiAgICBjb25zdCB0eCA9ICh4c1tuZXh0XSAtIHhzW3ByZXZdKSAvIDY7XG4gICAgY29uc3QgdHkgPSAoeXNbbmV4dF0gLSB5c1twcmV2XSkgLyA2O1xuICAgIG91dC5wdXNoKHtcbiAgICAgIG91dDogW3hzW2ldICsgdHgsIHlzW2ldICsgdHldLFxuICAgICAgaW46IFt4c1tpXSAtIHR4LCB5c1tpXSAtIHR5XSxcbiAgICAgIGhhc091dDogY2xvc2VkIHx8IGkgPCBuIC0gMSxcbiAgICAgIGhhc0luOiBjbG9zZWQgfHwgaSA+IDAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIFRoZSBDYXRtdWxsLVJvbSBoYW5kbGVzIGFzICoqcmVsYXRpdmUqKiBvZmZzZXRzIGBbZHgsIGR5XWAgcGVyIGFuY2hvciDigJQgdXNlZFxuICogIHRvIGluaXRpYWxpc2UgYSByZWdpb24ncyBlZGl0YWJsZSBoYW5kbGVzIHdoZW4gYmV6aWVyIGlzIHR1cm5lZCBvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0SGFuZGxlT2Zmc2V0cyhcbiAgeHM6IG51bWJlcltdLFxuICB5czogbnVtYmVyW10sXG4gIGNsb3NlZDogYm9vbGVhbixcbik6IHsgaW46IG51bWJlcltdW107IG91dDogbnVtYmVyW11bXSB9IHtcbiAgY29uc3QgaCA9IGJlemllckFuY2hvckhhbmRsZXMoeHMsIHlzLCBjbG9zZWQpO1xuICByZXR1cm4ge1xuICAgIGluOiBoLm1hcCgoYSwgaSkgPT4gW2EuaW5bMF0gLSB4c1tpXSwgYS5pblsxXSAtIHlzW2ldXSksXG4gICAgb3V0OiBoLm1hcCgoYSwgaSkgPT4gW2Eub3V0WzBdIC0geHNbaV0sIGEub3V0WzFdIC0geXNbaV1dKSxcbiAgfTtcbn1cblxuLyoqIEFic29sdXRlIGhhbmRsZXMgZnJvbSBzdG9yZWQgcmVsYXRpdmUgb2Zmc2V0cyAoYW5jaG9yICsgb2Zmc2V0KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVzRnJvbU9mZnNldHMoXG4gIHhzOiBudW1iZXJbXSxcbiAgeXM6IG51bWJlcltdLFxuICBpbk9mZjogbnVtYmVyW11bXSxcbiAgb3V0T2ZmOiBudW1iZXJbXVtdLFxuICBjbG9zZWQ6IGJvb2xlYW4sXG4pOiBBbmNob3JIYW5kbGVbXSB7XG4gIGNvbnN0IG4gPSBNYXRoLm1pbih4cy5sZW5ndGgsIHlzLmxlbmd0aCk7XG4gIGNvbnN0IG91dDogQW5jaG9ySGFuZGxlW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBvdXQucHVzaCh7XG4gICAgICBpbjogW3hzW2ldICsgKGluT2ZmW2ldPy5bMF0gPz8gMCksIHlzW2ldICsgKGluT2ZmW2ldPy5bMV0gPz8gMCldLFxuICAgICAgb3V0OiBbeHNbaV0gKyAob3V0T2ZmW2ldPy5bMF0gPz8gMCksIHlzW2ldICsgKG91dE9mZltpXT8uWzFdID8/IDApXSxcbiAgICAgIGhhc091dDogY2xvc2VkIHx8IGkgPCBuIC0gMSxcbiAgICAgIGhhc0luOiBjbG9zZWQgfHwgaSA+IDAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIEEgcmVnaW9uJ3MgaGFuZGxlczogZnJvbSBpdHMgc3RvcmVkIChlZGl0YWJsZSkgb2Zmc2V0cyB3aGVuIHByZXNlbnQsIGVsc2UgdGhlXG4gKiAgQ2F0bXVsbC1Sb20gZGVmYXVsdC4gVGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGJvdGggcmVuZGVyaW5nIGFuZCBleHBvcnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUhhbmRsZXMoXG4gIHhzOiBudW1iZXJbXSxcbiAgeXM6IG51bWJlcltdLFxuICBjbG9zZWQ6IGJvb2xlYW4sXG4gIGluT2ZmPzogbnVtYmVyW11bXSxcbiAgb3V0T2ZmPzogbnVtYmVyW11bXSxcbik6IEFuY2hvckhhbmRsZVtdIHtcbiAgaWYgKGluT2ZmICYmIG91dE9mZiAmJiBpbk9mZi5sZW5ndGggPT09IHhzLmxlbmd0aCAmJiBvdXRPZmYubGVuZ3RoID09PSB4cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gaGFuZGxlc0Zyb21PZmZzZXRzKHhzLCB5cywgaW5PZmYsIG91dE9mZiwgY2xvc2VkKTtcbiAgfVxuICByZXR1cm4gYmV6aWVyQW5jaG9ySGFuZGxlcyh4cywgeXMsIGNsb3NlZCk7XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIGN1YmljIGJlemllciAoZGVmaW5lZCBieSBleHBsaWNpdCBwZXItYW5jaG9yIGhhbmRsZXMpIGludG8gYSBkZW5zZVxuICogcG9pbnQgbGlzdCBieSBzYW1wbGluZyBlYWNoIHNlZ21lbnQuIFRoZSBjdXJ2ZSBwYXNzZXMgdGhyb3VnaCBldmVyeSBhbmNob3I7IGFcbiAqIGNsb3NlZCByaW5nIHJldHVybnMgdG8gaXRzIGZpcnN0IHBvaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmV6aWVyQ3VydmVGcm9tSGFuZGxlcyhcbiAgeHM6IG51bWJlcltdLFxuICB5czogbnVtYmVyW10sXG4gIGhhbmRsZXM6IEFuY2hvckhhbmRsZVtdLFxuICBjbG9zZWQ6IGJvb2xlYW4sXG4pOiBDdXJ2ZVBvaW50cyB7XG4gIGNvbnN0IG4gPSBNYXRoLm1pbih4cy5sZW5ndGgsIHlzLmxlbmd0aCk7XG4gIGlmIChuIDwgMykgcmV0dXJuIHsgeHM6IHhzLnNsaWNlKCksIHlzOiB5cy5zbGljZSgpIH07XG5cbiAgY29uc3Qgb3V0WDogbnVtYmVyW10gPSBbXTtcbiAgY29uc3Qgb3V0WTogbnVtYmVyW10gPSBbXTtcbiAgY29uc3Qgc2VncyA9IGNsb3NlZCA/IG4gOiBuIC0gMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzOyBpKyspIHtcbiAgICBjb25zdCBqID0gKGkgKyAxKSAlIG47XG4gICAgY29uc3QgcDB4ID0geHNbaV0sXG4gICAgICBwMHkgPSB5c1tpXTtcbiAgICBjb25zdCBjMSA9IGhhbmRsZXNbaV0ub3V0LFxuICAgICAgYzIgPSBoYW5kbGVzW2pdLmluO1xuICAgIGNvbnN0IHAzeCA9IHhzW2pdLFxuICAgICAgcDN5ID0geXNbal07XG4gICAgZm9yIChsZXQgcyA9IDA7IHMgPCBTQU1QTEVTX1BFUl9TRUdNRU5UOyBzKyspIHtcbiAgICAgIGNvbnN0IHQgPSBzIC8gU0FNUExFU19QRVJfU0VHTUVOVDtcbiAgICAgIGNvbnN0IHUgPSAxIC0gdDtcbiAgICAgIGNvbnN0IHcwID0gdSAqIHUgKiB1LFxuICAgICAgICB3MSA9IDMgKiB1ICogdSAqIHQsXG4gICAgICAgIHcyID0gMyAqIHUgKiB0ICogdCxcbiAgICAgICAgdzMgPSB0ICogdCAqIHQ7XG4gICAgICBvdXRYLnB1c2godzAgKiBwMHggKyB3MSAqIGMxWzBdICsgdzIgKiBjMlswXSArIHczICogcDN4KTtcbiAgICAgIG91dFkucHVzaCh3MCAqIHAweSArIHcxICogYzFbMV0gKyB3MiAqIGMyWzFdICsgdzMgKiBwM3kpO1xuICAgIH1cbiAgfVxuICBpZiAoY2xvc2VkKSB7XG4gICAgb3V0WC5wdXNoKHhzWzBdKTtcbiAgICBvdXRZLnB1c2goeXNbMF0pO1xuICB9IGVsc2Uge1xuICAgIG91dFgucHVzaCh4c1tuIC0gMV0pO1xuICAgIG91dFkucHVzaCh5c1tuIC0gMV0pO1xuICB9XG4gIHJldHVybiB7IHhzOiBvdXRYLCB5czogb3V0WSB9O1xufVxuIl19
@@ -11,8 +11,16 @@
11
11
  * gets the same colour with no stored state.
12
12
  */
13
13
  export const DEFAULT_FALLBACK_PALETTE = [
14
- '#6C8EBF', '#82B366', '#B85450', '#9673A6', '#D79B00',
15
- '#3C948B', '#A64CA6', '#CC6677', '#4477AA', '#228833',
14
+ '#6C8EBF',
15
+ '#82B366',
16
+ '#B85450',
17
+ '#9673A6',
18
+ '#D79B00',
19
+ '#3C948B',
20
+ '#A64CA6',
21
+ '#CC6677',
22
+ '#4477AA',
23
+ '#228833',
16
24
  ];
17
25
  /** Seed classes — mirrors the historical hard-coded `classificationColors` map. */
18
26
  const DEFAULT_CLASSES = [
@@ -43,4 +51,34 @@ export function defaultPresetSet() {
43
51
  export function isEmptyPresetSet(set) {
44
52
  return !set || !Array.isArray(set.classes) || set.classes.length === 0;
45
53
  }
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MtcHJlc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvY2xhc3MtcHJlc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQTRCSDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQWE7SUFDaEQsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVM7SUFDckQsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVM7Q0FDdEQsQ0FBQztBQUVGLG1GQUFtRjtBQUNuRixNQUFNLGVBQWUsR0FBa0I7SUFDckMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO0lBQ2xFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7SUFDN0QsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO0lBQ2hFLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtJQUNoRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO0lBQ3hELEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7SUFDdEQsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtJQUN2RCxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO0lBQzdELEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7SUFDekQsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtJQUN2RCxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO0lBQ3ZELEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7SUFDekQsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtDQUMxRCxDQUFDO0FBRUYsNkVBQTZFO0FBQzdFLE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsT0FBTztRQUNMLE9BQU8sRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLGVBQWUsRUFBRSxDQUFDLEdBQUcsd0JBQXdCLENBQUM7UUFDOUMsV0FBVyxFQUFFLEtBQUs7UUFDbEIsU0FBUyxFQUFFLE9BQU87S0FDbkIsQ0FBQztBQUNKLENBQUM7QUFFRCxnR0FBZ0c7QUFDaEcsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQWlDO0lBQ2hFLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJlc2V0IGFubm90YXRpb24gY2xhc3NlcyAoaml0LXVpIzcwKS5cbiAqXG4gKiBBIGNsYXNzIGlzIGEgZmxhdCBgeyBuYW1lLCBjb2xvciB9YCBwYWlyICh2MTogbm8gaGllcmFyY2h5LCBubyBzcGVjaWFsLWNsYXNzIHNlbWFudGljcykuXG4gKiBUaGUgYFByZXNldFNldGAgaXMgdGhlIHBlci11c2VyLCBzZXJ2ZXItcGVyc2lzdGVkIHNvdXJjZSBvZiB0cnV0aCBmb3IgcmVnaW9uIGNvbG91cnM7XG4gKiBzZWUgYGNsYXNzLWNvbG9yLnV0aWwudHNgIGZvciB0aGUgZGV0ZXJtaW5pc3RpYyBjb2xvdXItcmVzb2x1dGlvbiBlbmdpbmUuXG4gKi9cblxuZXhwb3J0IHR5cGUgUHJlc2V0U291cmNlID0gJ3VzZXInIHwgJ2RlZmF1bHQnIHwgJ2F1dG8nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsYXNzUHJlc2V0IHtcbiAgLyoqIFRoZSBjbGFzcyBuYW1lIOKAlCBtYXRjaGVkIGFnYWluc3QgYFJlZ2lvbi5sYWJlbGAuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIEhleCBjb2xvdXIsIGAjUlJHR0JCYC4gKi9cbiAgY29sb3I6IHN0cmluZztcbiAgLyoqIFJlc2VydmVkIGZvciBhIGZ1dHVyZSBwZXItY2xhc3Mgb3ZlcmxheS12aXNpYmlsaXR5IHRvZ2dsZS4gKi9cbiAgdmlzaWJsZT86IGJvb2xlYW47XG4gIC8qKiBQcm92ZW5hbmNlOyBgJ2F1dG8nYCA9IGFkZGVkIGJ5IG9wdC1pbiBmYWxsYmFjayBwcm9tb3Rpb24uICovXG4gIHNvdXJjZT86IFByZXNldFNvdXJjZTtcbn1cblxuZXhwb3J0IHR5cGUgTWF0Y2hNb2RlID0gJ2V4YWN0JyB8ICdub3JtYWxpemVkJztcblxuZXhwb3J0IGludGVyZmFjZSBQcmVzZXRTZXQge1xuICAvKiogT3JkZXJlZCBsaXN0IG9mIHByZXNldCBjbGFzc2VzLiAqL1xuICBjbGFzc2VzOiBDbGFzc1ByZXNldFtdO1xuICAvKiogQ29sb3VycyB1c2VkIGZvciBjbGFzc2VzIG5vdCBpbiBgY2xhc3Nlc2AgKGFzc2lnbmVkIGRldGVybWluaXN0aWNhbGx5KS4gKi9cbiAgZmFsbGJhY2tQYWxldHRlOiBzdHJpbmdbXTtcbiAgLyoqIE9wdC1pbiAoZGVmYXVsdCBmYWxzZSk6IGFkZCBhbiB1bmtub3duIGNsYXNzIHRvIGBjbGFzc2VzYCB0aGUgZmlyc3QgdGltZSBpdCBpcyBzZWVuLiAqL1xuICBhdXRvUHJvbW90ZTogYm9vbGVhbjtcbiAgLyoqIExhYmVsIG1hdGNoaW5nIGFnYWluc3QgYFJlZ2lvbi5sYWJlbGAgKGRlZmF1bHQgYCdleGFjdCdgKS4gKi9cbiAgbWF0Y2hNb2RlOiBNYXRjaE1vZGU7XG59XG5cbi8qKlxuICogRmFsbGJhY2sgcGFsZXR0ZSBmb3IgY2xhc3NlcyBub3QgcHJlc2VudCBpbiB0aGUgcHJlc2V0IHNldCDigJQgcmVhc29uYWJseSBkaXN0aW5jdCBodWVzLlxuICogQ29sb3VycyBhcmUgYXNzaWduZWQgYnkgYSBzdGFibGUgaGFzaCBvZiB0aGUgY2xhc3MgbmFtZSwgc28gdGhlIHNhbWUgdW5rbm93biBjbGFzcyBhbHdheXNcbiAqIGdldHMgdGhlIHNhbWUgY29sb3VyIHdpdGggbm8gc3RvcmVkIHN0YXRlLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9GQUxMQkFDS19QQUxFVFRFOiBzdHJpbmdbXSA9IFtcbiAgJyM2QzhFQkYnLCAnIzgyQjM2NicsICcjQjg1NDUwJywgJyM5NjczQTYnLCAnI0Q3OUIwMCcsXG4gICcjM0M5NDhCJywgJyNBNjRDQTYnLCAnI0NDNjY3NycsICcjNDQ3N0FBJywgJyMyMjg4MzMnLFxuXTtcblxuLyoqIFNlZWQgY2xhc3NlcyDigJQgbWlycm9ycyB0aGUgaGlzdG9yaWNhbCBoYXJkLWNvZGVkIGBjbGFzc2lmaWNhdGlvbkNvbG9yc2AgbWFwLiAqL1xuY29uc3QgREVGQVVMVF9DTEFTU0VTOiBDbGFzc1ByZXNldFtdID0gW1xuICB7IG5hbWU6ICdGcmFnbWVudGVkLWVtYnJ5bycsIGNvbG9yOiAnI0ZGOEMwMCcsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ0R5aW5nLWVtYnJ5bycsIGNvbG9yOiAnI0ZGMzMzMycsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ1R3by1jZWxsLWVtYnJ5bycsIGNvbG9yOiAnIzMzQ0M2NicsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ09uZS1jZWxsLWVtYnJ5bycsIGNvbG9yOiAnIzMzOTlGRicsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ1Vua25vd24nLCBjb2xvcjogJyM4ODg4ODgnLCBzb3VyY2U6ICdkZWZhdWx0JyB9LFxuICB7IG5hbWU6ICdUdW1vcicsIGNvbG9yOiAnI0ZGNDQ0NCcsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ1N0cm9tYScsIGNvbG9yOiAnIzQ0QUFGRicsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ0ltbXVuZSBjZWxscycsIGNvbG9yOiAnI0ZGREQwMCcsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ05lY3Jvc2lzJywgY29sb3I6ICcjQUE2NjMzJywgc291cmNlOiAnZGVmYXVsdCcgfSxcbiAgeyBuYW1lOiAnUmVnaW9uJywgY29sb3I6ICcjMDBGRkZGJywgc291cmNlOiAnZGVmYXVsdCcgfSxcbiAgeyBuYW1lOiAnSWdub3JlJywgY29sb3I6ICcjQUFBQUFBJywgc291cmNlOiAnZGVmYXVsdCcgfSxcbiAgeyBuYW1lOiAnUG9zaXRpdmUnLCBjb2xvcjogJyMwMENDNDQnLCBzb3VyY2U6ICdkZWZhdWx0JyB9LFxuICB7IG5hbWU6ICdOZWdhdGl2ZScsIGNvbG9yOiAnI0NDMDAwMCcsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG5dO1xuXG4vKiogQSBmcmVzaCBkZWZhdWx0IHByZXNldCBzZXQgKGRlZXAtY29waWVkIHNvIGNhbGxlcnMgY2FuIG11dGF0ZSBzYWZlbHkpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRQcmVzZXRTZXQoKTogUHJlc2V0U2V0IHtcbiAgcmV0dXJuIHtcbiAgICBjbGFzc2VzOiBERUZBVUxUX0NMQVNTRVMubWFwKChjKSA9PiAoeyAuLi5jIH0pKSxcbiAgICBmYWxsYmFja1BhbGV0dGU6IFsuLi5ERUZBVUxUX0ZBTExCQUNLX1BBTEVUVEVdLFxuICAgIGF1dG9Qcm9tb3RlOiBmYWxzZSxcbiAgICBtYXRjaE1vZGU6ICdleGFjdCcsXG4gIH07XG59XG5cbi8qKiBUcnVlIHdoZW4gdGhlIHNldCBoYXMgbm8gdXNhYmxlIGNsYXNzZXMgKGUuZy4gdGhlIHNlcnZlciByZXR1cm5lZCBhbiBlbXB0eS9ibGFuayByZWNvcmQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlQcmVzZXRTZXQoc2V0OiBQcmVzZXRTZXQgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhc2V0IHx8ICFBcnJheS5pc0FycmF5KHNldC5jbGFzc2VzKSB8fCBzZXQuY2xhc3Nlcy5sZW5ndGggPT09IDA7XG59XG4iXX0=
54
+ /**
55
+ * Validate an untrusted value (e.g. an imported JSON file) as a preset set.
56
+ * Returns a clean copy — only well-formed `{ name, color }` classes, defaults
57
+ * for missing optional fields — or null when it has no usable classes.
58
+ */
59
+ export function parsePresetSet(value) {
60
+ if (!value || typeof value !== 'object')
61
+ return null;
62
+ const raw = value;
63
+ if (!Array.isArray(raw.classes))
64
+ return null;
65
+ const classes = [];
66
+ for (const c of raw.classes) {
67
+ const entry = c;
68
+ if (!entry || typeof entry.name !== 'string' || typeof entry.color !== 'string')
69
+ continue;
70
+ classes.push({ ...entry, name: entry.name, color: entry.color });
71
+ }
72
+ if (classes.length === 0)
73
+ return null;
74
+ const palette = Array.isArray(raw.fallbackPalette)
75
+ ? raw.fallbackPalette.filter((c) => typeof c === 'string')
76
+ : [];
77
+ return {
78
+ classes,
79
+ fallbackPalette: palette.length ? palette : [...DEFAULT_FALLBACK_PALETTE],
80
+ autoPromote: raw.autoPromote === true,
81
+ matchMode: raw.matchMode === 'normalized' ? 'normalized' : 'exact',
82
+ };
83
+ }
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MtcHJlc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvY2xhc3MtcHJlc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQXdDSDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQWE7SUFDaEQsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztDQUNWLENBQUM7QUFFRixtRkFBbUY7QUFDbkYsTUFBTSxlQUFlLEdBQWtCO0lBQ3JDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtJQUNsRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO0lBQzdELEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtJQUNoRSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7SUFDaEUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtJQUN4RCxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO0lBQ3RELEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7SUFDdkQsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxF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QUFZLENBQUMsQ0FBQyxDQUFDLE9BQU87S0FDbkUsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFByZXNldCBhbm5vdGF0aW9uIGNsYXNzZXMgKGppdC11aSM3MCkuXG4gKlxuICogQSBjbGFzcyBpcyBhIGZsYXQgYHsgbmFtZSwgY29sb3IgfWAgcGFpciAodjE6IG5vIGhpZXJhcmNoeSwgbm8gc3BlY2lhbC1jbGFzcyBzZW1hbnRpY3MpLlxuICogVGhlIGBQcmVzZXRTZXRgIGlzIHRoZSBwZXItdXNlciwgc2VydmVyLXBlcnNpc3RlZCBzb3VyY2Ugb2YgdHJ1dGggZm9yIHJlZ2lvbiBjb2xvdXJzO1xuICogc2VlIGBjbGFzcy1jb2xvci51dGlsLnRzYCBmb3IgdGhlIGRldGVybWluaXN0aWMgY29sb3VyLXJlc29sdXRpb24gZW5naW5lLlxuICovXG5cbi8qKiBXaGVyZSBhIHByZXNldCBjbGFzcyBjYW1lIGZyb206IGFkZGVkIGJ5IHRoZSB1c2VyLCBvbmUgb2YgdGhlIGJ1aWx0LWluXG4gKiAgZGVmYXVsdHMsIG9yIGF1dG8tcHJvbW90ZWQgZnJvbSBhbiB1bmtub3duIHJlZ2lvbiBsYWJlbC4gKi9cbmV4cG9ydCB0eXBlIFByZXNldFNvdXJjZSA9ICd1c2VyJyB8ICdkZWZhdWx0JyB8ICdhdXRvJztcblxuLyoqIE9uZSBhbm5vdGF0aW9uIGNsYXNzIGFuZCBpdHMgY29sb3VyOiByZWdpb25zIHdob3NlIGBsYWJlbGAgbWF0Y2hlc1xuICogIGBuYW1lYCAocGVyIHRoZSBzZXQncyB7QGxpbmsgTWF0Y2hNb2RlfSkgZHJhdyBpbiBgY29sb3JgIHVubGVzcyB0aGVpciBjb2xvdXJcbiAqICB3YXMgb3ZlcnJpZGRlbiBieSBoYW5kLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGFzc1ByZXNldCB7XG4gIC8qKiBUaGUgY2xhc3MgbmFtZSDigJQgbWF0Y2hlZCBhZ2FpbnN0IGBSZWdpb24ubGFiZWxgLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBIZXggY29sb3VyLCBgI1JSR0dCQmAuICovXG4gIGNvbG9yOiBzdHJpbmc7XG4gIC8qKiBSZXNlcnZlZCBmb3IgYSBmdXR1cmUgcGVyLWNsYXNzIG92ZXJsYXktdmlzaWJpbGl0eSB0b2dnbGUuICovXG4gIHZpc2libGU/OiBib29sZWFuO1xuICAvKiogUHJvdmVuYW5jZTsgYCdhdXRvJ2AgPSBhZGRlZCBieSBvcHQtaW4gZmFsbGJhY2sgcHJvbW90aW9uLiAqL1xuICBzb3VyY2U/OiBQcmVzZXRTb3VyY2U7XG59XG5cbi8qKiBIb3cgYSByZWdpb24gbGFiZWwgaXMgbWF0Y2hlZCB0byBhIHByZXNldCBuYW1lOiBgJ2V4YWN0J2AgY29tcGFyZXMgdGhlXG4gKiAgc3RyaW5ncyBhcyBpczsgYCdub3JtYWxpemVkJ2AgdHJpbXMgYW5kIGxvd2VyLWNhc2VzIGJvdGggZmlyc3QuICovXG5leHBvcnQgdHlwZSBNYXRjaE1vZGUgPSAnZXhhY3QnIHwgJ25vcm1hbGl6ZWQnO1xuXG4vKipcbiAqIFRoZSBwZXItdXNlciBjbGFzcy1jb2xvdXIgY29uZmlndXJhdGlvbiAoc2VydmVyLXBlcnNpc3RlZCB0aHJvdWdoIHRoZVxuICogcHJlZmVyZW5jZXMgcG9ydCk6IHRoZSBwcmVzZXQgY2xhc3NlcywgdGhlIHBhbGV0dGUgZm9yIGxhYmVscyBvdXRzaWRlIHRoZW0sXG4gKiBhbmQgdGhlIG1hdGNoaW5nIHJ1bGVzLiBSZXNvbHZlZCBpbnRvIHJlZ2lvbiBjb2xvdXJzIGJ5IGBjbGFzcy1jb2xvci51dGlsLnRzYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVzZXRTZXQge1xuICAvKiogT3JkZXJlZCBsaXN0IG9mIHByZXNldCBjbGFzc2VzLiAqL1xuICBjbGFzc2VzOiBDbGFzc1ByZXNldFtdO1xuICAvKiogQ29sb3VycyB1c2VkIGZvciBjbGFzc2VzIG5vdCBpbiBgY2xhc3Nlc2AgKGFzc2lnbmVkIGRldGVybWluaXN0aWNhbGx5KS4gKi9cbiAgZmFsbGJhY2tQYWxldHRlOiBzdHJpbmdbXTtcbiAgLyoqIE9wdC1pbiAoZGVmYXVsdCBmYWxzZSk6IGFkZCBhbiB1bmtub3duIGNsYXNzIHRvIGBjbGFzc2VzYCB0aGUgZmlyc3QgdGltZSBpdCBpcyBzZWVuLiAqL1xuICBhdXRvUHJvbW90ZTogYm9vbGVhbjtcbiAgLyoqIExhYmVsIG1hdGNoaW5nIGFnYWluc3QgYFJlZ2lvbi5sYWJlbGAgKGRlZmF1bHQgYCdleGFjdCdgKS4gKi9cbiAgbWF0Y2hNb2RlOiBNYXRjaE1vZGU7XG59XG5cbi8qKlxuICogRmFsbGJhY2sgcGFsZXR0ZSBmb3IgY2xhc3NlcyBub3QgcHJlc2VudCBpbiB0aGUgcHJlc2V0IHNldCDigJQgcmVhc29uYWJseSBkaXN0aW5jdCBodWVzLlxuICogQ29sb3VycyBhcmUgYXNzaWduZWQgYnkgYSBzdGFibGUgaGFzaCBvZiB0aGUgY2xhc3MgbmFtZSwgc28gdGhlIHNhbWUgdW5rbm93biBjbGFzcyBhbHdheXNcbiAqIGdldHMgdGhlIHNhbWUgY29sb3VyIHdpdGggbm8gc3RvcmVkIHN0YXRlLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9GQUxMQkFDS19QQUxFVFRFOiBzdHJpbmdbXSA9IFtcbiAgJyM2QzhFQkYnLFxuICAnIzgyQjM2NicsXG4gICcjQjg1NDUwJyxcbiAgJyM5NjczQTYnLFxuICAnI0Q3OUIwMCcsXG4gICcjM0M5NDhCJyxcbiAgJyNBNjRDQTYnLFxuICAnI0NDNjY3NycsXG4gICcjNDQ3N0FBJyxcbiAgJyMyMjg4MzMnLFxuXTtcblxuLyoqIFNlZWQgY2xhc3NlcyDigJQgbWlycm9ycyB0aGUgaGlzdG9yaWNhbCBoYXJkLWNvZGVkIGBjbGFzc2lmaWNhdGlvbkNvbG9yc2AgbWFwLiAqL1xuY29uc3QgREVGQVVMVF9DTEFTU0VTOiBDbGFzc1ByZXNldFtdID0gW1xuICB7IG5hbWU6ICdGcmFnbWVudGVkLWVtYnJ5bycsIGNvbG9yOiAnI0ZGOEMwMCcsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ0R5aW5nLWVtYnJ5bycsIGNvbG9yOiAnI0ZGMzMzMycsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ1R3by1jZWxsLWVtYnJ5bycsIGNvbG9yOiAnIzMzQ0M2NicsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ09uZS1jZWxsLWVtYnJ5bycsIGNvbG9yOiAnIzMzOTlGRicsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ1Vua25vd24nLCBjb2xvcjogJyM4ODg4ODgnLCBzb3VyY2U6ICdkZWZhdWx0JyB9LFxuICB7IG5hbWU6ICdUdW1vcicsIGNvbG9yOiAnI0ZGNDQ0NCcsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ1N0cm9tYScsIGNvbG9yOiAnIzQ0QUFGRicsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ0ltbXVuZSBjZWxscycsIGNvbG9yOiAnI0ZGREQwMCcsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ05lY3Jvc2lzJywgY29sb3I6ICcjQUE2NjMzJywgc291cmNlOiAnZGVmYXVsdCcgfSxcbiAgeyBuYW1lOiAnUmVnaW9uJywgY29sb3I6ICcjMDBGRkZGJywgc291cmNlOiAnZGVmYXVsdCcgfSxcbiAgeyBuYW1lOiAnSWdub3JlJywgY29sb3I6ICcjQUFBQUFBJywgc291cmNlOiAnZGVmYXVsdCcgfSxcbiAgeyBuYW1lOiAnUG9zaXRpdmUnLCBjb2xvcjogJyMwMENDNDQnLCBzb3VyY2U6ICdkZWZhdWx0JyB9LFxuICB7IG5hbWU6ICdOZWdhdGl2ZScsIGNvbG9yOiAnI0NDMDAwMCcsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG5dO1xuXG4vKiogQSBmcmVzaCBkZWZhdWx0IHByZXNldCBzZXQgKGRlZXAtY29waWVkIHNvIGNhbGxlcnMgY2FuIG11dGF0ZSBzYWZlbHkpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRQcmVzZXRTZXQoKTogUHJlc2V0U2V0IHtcbiAgcmV0dXJuIHtcbiAgICBjbGFzc2VzOiBERUZBVUxUX0NMQVNTRVMubWFwKChjKSA9PiAoeyAuLi5jIH0pKSxcbiAgICBmYWxsYmFja1BhbGV0dGU6IFsuLi5ERUZBVUxUX0ZBTExCQUNLX1BBTEVUVEVdLFxuICAgIGF1dG9Qcm9tb3RlOiBmYWxzZSxcbiAgICBtYXRjaE1vZGU6ICdleGFjdCcsXG4gIH07XG59XG5cbi8qKiBUcnVlIHdoZW4gdGhlIHNldCBoYXMgbm8gdXNhYmxlIGNsYXNzZXMgKGUuZy4gdGhlIHNlcnZlciByZXR1cm5lZCBhbiBlbXB0eS9ibGFuayByZWNvcmQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlQcmVzZXRTZXQoc2V0OiBQcmVzZXRTZXQgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhc2V0IHx8ICFBcnJheS5pc0FycmF5KHNldC5jbGFzc2VzKSB8fCBzZXQuY2xhc3Nlcy5sZW5ndGggPT09IDA7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW4gdW50cnVzdGVkIHZhbHVlIChlLmcuIGFuIGltcG9ydGVkIEpTT04gZmlsZSkgYXMgYSBwcmVzZXQgc2V0LlxuICogUmV0dXJucyBhIGNsZWFuIGNvcHkg4oCUIG9ubHkgd2VsbC1mb3JtZWQgYHsgbmFtZSwgY29sb3IgfWAgY2xhc3NlcywgZGVmYXVsdHNcbiAqIGZvciBtaXNzaW5nIG9wdGlvbmFsIGZpZWxkcyDigJQgb3IgbnVsbCB3aGVuIGl0IGhhcyBubyB1c2FibGUgY2xhc3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHJlc2V0U2V0KHZhbHVlOiB1bmtub3duKTogUHJlc2V0U2V0IHwgbnVsbCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHJhdyA9IHZhbHVlIGFzIFBhcnRpYWw8UmVjb3JkPGtleW9mIFByZXNldFNldCwgdW5rbm93bj4+O1xuICBpZiAoIUFycmF5LmlzQXJyYXkocmF3LmNsYXNzZXMpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgY2xhc3NlczogQ2xhc3NQcmVzZXRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGMgb2YgcmF3LmNsYXNzZXMgYXMgdW5rbm93bltdKSB7XG4gICAgY29uc3QgZW50cnkgPSBjIGFzIFBhcnRpYWw8Q2xhc3NQcmVzZXQ+IHwgbnVsbDtcbiAgICBpZiAoIWVudHJ5IHx8IHR5cGVvZiBlbnRyeS5uYW1lICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZW50cnkuY29sb3IgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICBjbGFzc2VzLnB1c2goeyAuLi5lbnRyeSwgbmFtZTogZW50cnkubmFtZSwgY29sb3I6IGVudHJ5LmNvbG9yIH0pO1xuICB9XG4gIGlmIChjbGFzc2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHBhbGV0dGUgPSBBcnJheS5pc0FycmF5KHJhdy5mYWxsYmFja1BhbGV0dGUpXG4gICAgPyAocmF3LmZhbGxiYWNrUGFsZXR0ZSBhcyB1bmtub3duW10pLmZpbHRlcigoYyk6IGMgaXMgc3RyaW5nID0+IHR5cGVvZiBjID09PSAnc3RyaW5nJylcbiAgICA6IFtdO1xuICByZXR1cm4ge1xuICAgIGNsYXNzZXMsXG4gICAgZmFsbGJhY2tQYWxldHRlOiBwYWxldHRlLmxlbmd0aCA/IHBhbGV0dGUgOiBbLi4uREVGQVVMVF9GQUxMQkFDS19QQUxFVFRFXSxcbiAgICBhdXRvUHJvbW90ZTogcmF3LmF1dG9Qcm9tb3RlID09PSB0cnVlLFxuICAgIG1hdGNoTW9kZTogcmF3Lm1hdGNoTW9kZSA9PT0gJ25vcm1hbGl6ZWQnID8gJ25vcm1hbGl6ZWQnIDogJ2V4YWN0JyxcbiAgfTtcbn1cbiJdfQ==
@@ -1,56 +1,46 @@
1
1
  /**
2
- * Pure geometry helpers extracted from PlotlyService.
2
+ * Pure SVG-path helpers (build and parse a vertex ring as a Plotly path).
3
3
  *
4
- * No DOM access, no service state, no `this` — every function is testable
5
- * in isolation. Keep it that way: this module is the dumping ground for
6
- * shape/mask/SVG-path utilities the wand, vertex eraser, and region editor
7
- * share. If a helper grows a `this.shapes` reference, it doesn't belong here.
4
+ * No DOM access, no service state, no `this`. Mask and ring geometry (the
5
+ * rasterizer, mask set operations, point-in-ring, simplification, contour
6
+ * tracing) lives in `src/lib/geometry/`.
8
7
  */
9
8
  // ── SVG path parsing / building ──────────────────────────────────────
10
9
  /**
11
- * Parse a single-subpath `M x,y L x,y ... Z` path into vertex arrays.
10
+ * Split a single-subpath `M x,y L x,y ... [Z]` path into vertex arrays, plus
11
+ * whether it is closed (ends in `Z`). No validation: a coordinate that doesn't
12
+ * parse comes back as NaN. See {@link parseSvgPathPolygon} for the checked form.
13
+ */
14
+ export function parseSvgPath(path) {
15
+ const closed = path.endsWith('Z');
16
+ const body = closed ? path.slice(1, -1) : path.slice(1); // drop M and optionally Z
17
+ const xpoints = [];
18
+ const ypoints = [];
19
+ for (const seg of body.split('L')) {
20
+ const [sx, sy] = seg.split(',');
21
+ xpoints.push(parseFloat(sx));
22
+ ypoints.push(parseFloat(sy));
23
+ }
24
+ return { xpoints, ypoints, closed };
25
+ }
26
+ /**
27
+ * Parse a single-subpath `M x,y L x,y ... [Z]` path into vertex arrays.
12
28
  *
13
29
  * Returns null for paths we can't safely round-trip (multi-subpath, curves,
14
- * fewer than three vertices). The wand only adopts shapes it produced or
15
- * that Plotly's drawclosedpath produces, both of which are single-subpath
16
- * polygons.
30
+ * non-numeric coordinates, fewer than three vertices).
17
31
  */
18
32
  export function parseSvgPathPolygon(path) {
19
33
  if (!path || path[0] !== 'M')
20
34
  return null;
21
35
  if (path.indexOf('M', 1) !== -1)
22
36
  return null; // multi-subpath
23
- const trimmed = path.endsWith('Z') ? path.slice(1, -1) : path.slice(1);
24
- const segs = trimmed.split('L');
25
- const xpoints = [];
26
- const ypoints = [];
27
- for (const seg of segs) {
28
- const [sx, sy] = seg.split(',');
29
- const x = parseFloat(sx);
30
- const y = parseFloat(sy);
31
- if (!Number.isFinite(x) || !Number.isFinite(y))
32
- return null;
33
- xpoints.push(x);
34
- ypoints.push(y);
35
- }
37
+ const { xpoints, ypoints } = parseSvgPath(path);
38
+ if (xpoints.some((x, i) => !Number.isFinite(x) || !Number.isFinite(ypoints[i])))
39
+ return null;
36
40
  if (xpoints.length < 3)
37
41
  return null;
38
42
  return { xpoints, ypoints };
39
43
  }
40
- /**
41
- * Build a closed SVG path string `M x,y L x,y L ... Z` from vertex arrays.
42
- * Returns '' for fewer than three vertices (degenerate).
43
- */
44
- export function polygonToSvgPath(xpoints, ypoints) {
45
- if (xpoints.length < 3)
46
- return '';
47
- let path = 'M';
48
- for (let i = 0; i < xpoints.length; i++) {
49
- path += `${xpoints[i]},${ypoints[i]}`;
50
- path += i < xpoints.length - 1 ? 'L' : 'Z';
51
- }
52
- return path;
53
- }
54
44
  /**
55
45
  * Build an SVG path string from vertex arrays. Closed polygons end with `Z`,
56
46
  * open polylines do not. Returns '' for fewer than two vertices (degenerate).
@@ -68,131 +58,4 @@ export function verticesToSvgPath(xs, ys, closed) {
68
58
  path += 'Z';
69
59
  return path;
70
60
  }
71
- // ── Region equality ──────────────────────────────────────────────────
72
- /**
73
- * Compare two Plotly shape objects for "same region" — used by the wand to
74
- * avoid appending duplicates when the user pushes the same find result more
75
- * than once. Polygons compare by SVG path string, rectangles compare by
76
- * (x0, y0, x1, y1).
77
- */
78
- export function shapesEqual(a, b) {
79
- if (a.path && b.path) {
80
- return a.path === b.path;
81
- }
82
- if (a.x0 !== undefined && a.y0 !== undefined &&
83
- a.x1 !== undefined && a.y1 !== undefined &&
84
- b.x0 !== undefined && b.y0 !== undefined &&
85
- b.x1 !== undefined && b.y1 !== undefined) {
86
- return a.x0 === b.x0 &&
87
- a.y0 === b.y0 &&
88
- a.x1 === b.x1 &&
89
- a.y1 === b.y1;
90
- }
91
- return false;
92
- }
93
- // ── BBox-mask operations (used by the wand stroke accumulator) ───────
94
- /** Returns true if the two bbox-relative masks share at least one set pixel. */
95
- export function masksOverlap(a, b) {
96
- const ix0 = Math.max(a.bx, b.bx);
97
- const iy0 = Math.max(a.by, b.by);
98
- const ix1 = Math.min(a.bx + a.bw, b.bx + b.bw);
99
- const iy1 = Math.min(a.by + a.bh, b.by + b.bh);
100
- if (ix0 >= ix1 || iy0 >= iy1)
101
- return false;
102
- for (let y = iy0; y < iy1; y++) {
103
- const ar = (y - a.by) * a.bw;
104
- const br = (y - b.by) * b.bw;
105
- for (let x = ix0; x < ix1; x++) {
106
- if (a.mask[ar + (x - a.bx)] && b.mask[br + (x - b.bx)])
107
- return true;
108
- }
109
- }
110
- return false;
111
- }
112
- /**
113
- * Allocate a fresh accumulator covering both masks and OR them in. The
114
- * resulting mask's bbox is the smallest rectangle containing both inputs.
115
- */
116
- export function unionMasks(a, b) {
117
- const ux0 = Math.min(a.bx, b.bx);
118
- const uy0 = Math.min(a.by, b.by);
119
- const ux1 = Math.max(a.bx + a.bw, b.bx + b.bw);
120
- const uy1 = Math.max(a.by + a.bh, b.by + b.bh);
121
- const ubw = ux1 - ux0;
122
- const ubh = uy1 - uy0;
123
- const umask = new Uint8Array(ubw * ubh);
124
- const dax = a.bx - ux0;
125
- const day = a.by - uy0;
126
- for (let row = 0; row < a.bh; row++) {
127
- const src = row * a.bw;
128
- const dst = (row + day) * ubw + dax;
129
- umask.set(a.mask.subarray(src, src + a.bw), dst);
130
- }
131
- const dbx = b.bx - ux0;
132
- const dby = b.by - uy0;
133
- for (let row = 0; row < b.bh; row++) {
134
- const srcRow = row * b.bw;
135
- const dstRow = (row + dby) * ubw;
136
- for (let col = 0; col < b.bw; col++) {
137
- if (b.mask[srcRow + col])
138
- umask[dstRow + (dbx + col)] = 1;
139
- }
140
- }
141
- return { bx: ux0, by: uy0, bw: ubw, bh: ubh, mask: umask };
142
- }
143
- // ── Ring simplification (Douglas–Peucker) ───────────────────────────────
144
- /** Perpendicular distance from (px,py) to the segment (ax,ay)–(bx,by). */
145
- function perpDistance(px, py, ax, ay, bx, by) {
146
- const dx = bx - ax, dy = by - ay;
147
- const len2 = dx * dx + dy * dy;
148
- if (len2 === 0)
149
- return Math.hypot(px - ax, py - ay);
150
- let t = ((px - ax) * dx + (py - ay) * dy) / len2;
151
- t = Math.max(0, Math.min(1, t));
152
- return Math.hypot(px - (ax + t * dx), py - (ay + t * dy));
153
- }
154
- /**
155
- * Simplify a closed ring with the Douglas–Peucker algorithm (jit-ui#85):
156
- * drop every vertex that lies within `epsilon` pixels (the "altitude
157
- * threshold") of the line between its kept neighbours. Anchored at vertex 0
158
- * (the ring is closed by appending it). Rings of ≤ 3 vertices, or a
159
- * non-positive epsilon, are returned unchanged. Output keeps the closed-ring
160
- * convention (no repeated closing point).
161
- */
162
- export function simplifyRing(xs, ys, epsilon) {
163
- const n = xs.length;
164
- if (n <= 3 || !(epsilon > 0))
165
- return { xs: xs.slice(), ys: ys.slice() };
166
- // Close the ring so both endpoints of the DP run are vertex 0.
167
- const px = [...xs, xs[0]];
168
- const py = [...ys, ys[0]];
169
- const m = px.length;
170
- const keep = new Array(m).fill(false);
171
- keep[0] = true;
172
- keep[m - 1] = true;
173
- const stack = [[0, m - 1]];
174
- while (stack.length) {
175
- const [a, b] = stack.pop();
176
- let maxD = -1, idx = -1;
177
- for (let i = a + 1; i < b; i++) {
178
- const d = perpDistance(px[i], py[i], px[a], py[a], px[b], py[b]);
179
- if (d > maxD) {
180
- maxD = d;
181
- idx = i;
182
- }
183
- }
184
- if (maxD > epsilon && idx > a) {
185
- keep[idx] = true;
186
- stack.push([a, idx], [idx, b]);
187
- }
188
- }
189
- const outX = [], outY = [];
190
- for (let i = 0; i < m - 1; i++) { // drop the duplicated closing vertex
191
- if (keep[i]) {
192
- outX.push(px[i]);
193
- outY.push(py[i]);
194
- }
195
- }
196
- return { xs: outX, ys: outY };
197
- }
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21vZGVscy9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBaUJILHdFQUF3RTtBQUV4RTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBQVk7SUFDOUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0I7SUFDOUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUM3QixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FB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O0lBQ3ZCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQ3ZCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDcEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNwQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUN2QixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUN2QixLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNqQyxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO2dCQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUQs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WyIvKipcbiAqIFB1cmUgZ2VvbWV0cnkgaGVscGVycyBleHRyYWN0ZWQgZnJvbSBQbG90bHlTZXJ2aWNlLlxuICpcbiAqIE5vIERPTSBhY2Nlc3MsIG5vIHNlcnZpY2Ugc3RhdGUsIG5vIGB0aGlzYCDigJQgZXZlcnkgZnVuY3Rpb24gaXMgdGVzdGFibGVcbiAqIGluIGlzb2xhdGlvbi4gS2VlcCBpdCB0aGF0IHdheTogdGhpcyBtb2R1bGUgaXMgdGhlIGR1bXBpbmcgZ3JvdW5kIGZvclxuICogc2hhcGUvbWFzay9TVkctcGF0aCB1dGlsaXRpZXMgdGhlIHdhbmQsIHZlcnRleCBlcmFzZXIsIGFuZCByZWdpb24gZWRpdG9yXG4gKiBzaGFyZS4gSWYgYSBoZWxwZXIgZ3Jvd3MgYSBgdGhpcy5zaGFwZXNgIHJlZmVyZW5jZSwgaXQgZG9lc24ndCBiZWxvbmcgaGVyZS5cbiAqL1xuXG4vKiogQSBiYm94LXJlbGF0aXZlIGJpbmFyeSBtYXNrICgxID0gZmlsbGVkLCAwID0gZW1wdHkpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCQm94TWFzayB7XG4gIGJ4OiBudW1iZXI7XG4gIGJ5OiBudW1iZXI7XG4gIGJ3OiBudW1iZXI7XG4gIGJoOiBudW1iZXI7XG4gIG1hc2s6IFVpbnQ4QXJyYXk7XG59XG5cbi8qKiBQYXJzZWQgc2luZ2xlLXN1YnBhdGggcG9seWdvbiB2ZXJ0aWNlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9seWdvblZlcnRpY2VzIHtcbiAgeHBvaW50czogbnVtYmVyW107XG4gIHlwb2ludHM6IG51bWJlcltdO1xufVxuXG4vLyDilIDilIAgU1ZHIHBhdGggcGFyc2luZyAvIGJ1aWxkaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFBhcnNlIGEgc2luZ2xlLXN1YnBhdGggYE0geCx5IEwgeCx5IC4uLiBaYCBwYXRoIGludG8gdmVydGV4IGFycmF5cy5cbiAqXG4gKiBSZXR1cm5zIG51bGwgZm9yIHBhdGhzIHdlIGNhbid0IHNhZmVseSByb3VuZC10cmlwIChtdWx0aS1zdWJwYXRoLCBjdXJ2ZXMsXG4gKiBmZXdlciB0aGFuIHRocmVlIHZlcnRpY2VzKS4gVGhlIHdhbmQgb25seSBhZG9wdHMgc2hhcGVzIGl0IHByb2R1Y2VkIG9yXG4gKiB0aGF0IFBsb3RseSdzIGRyYXdjbG9zZWRwYXRoIHByb2R1Y2VzLCBib3RoIG9mIHdoaWNoIGFyZSBzaW5nbGUtc3VicGF0aFxuICogcG9seWdvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN2Z1BhdGhQb2x5Z29uKHBhdGg6IHN0cmluZyk6IFBvbHlnb25WZXJ0aWNlcyB8IG51bGwge1xuICBpZiAoIXBhdGggfHwgcGF0aFswXSAhPT0gJ00nKSByZXR1cm4gbnVsbDtcbiAgaWYgKHBhdGguaW5kZXhPZignTScsIDEpICE9PSAtMSkgcmV0dXJuIG51bGw7IC8vIG11bHRpLXN1YnBhdGhcbiAgY29uc3QgdHJpbW1lZCA9IHBhdGguZW5kc1dpdGgoJ1onKSA/IHBhdGguc2xpY2UoMSwgLTEpIDogcGF0aC5zbGljZSgxKTtcbiAgY29uc3Qgc2VncyA9IHRyaW1tZWQuc3BsaXQoJ0wnKTtcbiAgY29uc3QgeHBvaW50czogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgeXBvaW50czogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2Vncykge1xuICAgIGNvbnN0IFtzeCwgc3ldID0gc2VnLnNwbGl0KCcsJyk7XG4gICAgY29uc3QgeCA9IHBhcnNlRmxvYXQoc3gpO1xuICAgIGNvbnN0IHkgPSBwYXJzZUZsb2F0KHN5KTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHkpKSByZXR1cm4gbnVsbDtcbiAgICB4cG9pbnRzLnB1c2goeCk7XG4gICAgeXBvaW50cy5wdXNoKHkpO1xuICB9XG4gIGlmICh4cG9pbnRzLmxlbmd0aCA8IDMpIHJldHVybiBudWxsO1xuICByZXR1cm4geyB4cG9pbnRzLCB5cG9pbnRzIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBjbG9zZWQgU1ZHIHBhdGggc3RyaW5nIGBNIHgseSBMIHgseSBMIC4uLiBaYCBmcm9tIHZlcnRleCBhcnJheXMuXG4gKiBSZXR1cm5zICcnIGZvciBmZXdlciB0aGFuIHRocmVlIHZlcnRpY2VzIChkZWdlbmVyYXRlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbHlnb25Ub1N2Z1BhdGgoeHBvaW50czogbnVtYmVyW10sIHlwb2ludHM6IG51bWJlcltdKTogc3RyaW5nIHtcbiAgaWYgKHhwb2ludHMubGVuZ3RoIDwgMykgcmV0dXJuICcnO1xuICBsZXQgcGF0aCA9ICdNJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgcGF0aCArPSBgJHt4cG9pbnRzW2ldfSwke3lwb2ludHNbaV19YDtcbiAgICBwYXRoICs9IGkgPCB4cG9pbnRzLmxlbmd0aCAtIDEgPyAnTCcgOiAnWic7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbi8qKlxuICogQnVpbGQgYW4gU1ZHIHBhdGggc3RyaW5nIGZyb20gdmVydGV4IGFycmF5cy4gQ2xvc2VkIHBvbHlnb25zIGVuZCB3aXRoIGBaYCxcbiAqIG9wZW4gcG9seWxpbmVzIGRvIG5vdC4gUmV0dXJucyAnJyBmb3IgZmV3ZXIgdGhhbiB0d28gdmVydGljZXMgKGRlZ2VuZXJhdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVydGljZXNUb1N2Z1BhdGgoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGNsb3NlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICh4cy5sZW5ndGggPCAyKSByZXR1cm4gJyc7XG4gIGxldCBwYXRoID0gJ00nO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgcGF0aCArPSBgJHt4c1tpXX0sJHt5c1tpXX1gO1xuICAgIGlmIChpIDwgeHMubGVuZ3RoIC0gMSkgcGF0aCArPSAnTCc7XG4gIH1cbiAgaWYgKGNsb3NlZCkgcGF0aCArPSAnWic7XG4gIHJldHVybiBwYXRoO1xufVxuXG4vLyDilIDilIAgUmVnaW9uIGVxdWFsaXR5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIENvbXBhcmUgdHdvIFBsb3RseSBzaGFwZSBvYmplY3RzIGZvciBcInNhbWUgcmVnaW9uXCIg4oCUIHVzZWQgYnkgdGhlIHdhbmQgdG9cbiAqIGF2b2lkIGFwcGVuZGluZyBkdXBsaWNhdGVzIHdoZW4gdGhlIHVzZXIgcHVzaGVzIHRoZSBzYW1lIGZpbmQgcmVzdWx0IG1vcmVcbiAqIHRoYW4gb25jZS4gUG9seWdvbnMgY29tcGFyZSBieSBTVkcgcGF0aCBzdHJpbmcsIHJlY3RhbmdsZXMgY29tcGFyZSBieVxuICogKHgwLCB5MCwgeDEsIHkxKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXBlc0VxdWFsKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gIGlmIChhLnBhdGggJiYgYi5wYXRoKSB7XG4gICAgcmV0dXJuIGEucGF0aCA9PT0gYi5wYXRoO1xuICB9XG4gIGlmIChcbiAgICBhLngwICE9PSB1bmRlZmluZWQgJiYgYS55MCAhPT0gdW5kZWZpbmVkICYmXG4gICAgYS54MSAhPT0gdW5kZWZpbmVkICYmIGEueTEgIT09IHVuZGVmaW5lZCAmJlxuICAgIGIueDAgIT09IHVuZGVmaW5lZCAmJiBiLnkwICE9PSB1bmRlZmluZWQgJiZcbiAgICBiLngxICE9PSB1bmRlZmluZWQgJiYgYi55MSAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIHJldHVybiBhLngwID09PSBiLngwICYmXG4gICAgICAgICAgIGEueTAgPT09IGIueTAgJiZcbiAgICAgICAgICAgYS54MSA9PT0gYi54MSAmJlxuICAgICAgICAgICBhLnkxID09PSBiLnkxO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8g4pSA4pSAIEJCb3gtbWFzayBvcGVyYXRpb25zICh1c2VkIGJ5IHRoZSB3YW5kIHN0cm9rZSBhY2N1bXVsYXRvcikg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBiYm94LXJlbGF0aXZlIG1hc2tzIHNoYXJlIGF0IGxlYXN0IG9uZSBzZXQgcGl4ZWwuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza3NPdmVybGFwKGE6IEJCb3hNYXNrLCBiOiBCQm94TWFzayk6IGJvb2xlYW4ge1xuICBjb25zdCBpeDAgPSBNYXRoLm1heChhLmJ4LCBiLmJ4KTtcbiAgY29uc3QgaXkwID0gTWF0aC5tYXgoYS5ieSwgYi5ieSk7XG4gIGNvbnN0IGl4MSA9IE1hdGgubWluKGEuYnggKyBhLmJ3LCBiLmJ4ICsgYi5idyk7XG4gIGNvbnN0IGl5MSA9IE1hdGgubWluKGEuYnkgKyBhLmJoLCBiLmJ5ICsgYi5iaCk7XG4gIGlmIChpeDAgPj0gaXgxIHx8IGl5MCA+PSBpeTEpIHJldHVybiBmYWxzZTtcbiAgZm9yIChsZXQgeSA9IGl5MDsgeSA8IGl5MTsgeSsrKSB7XG4gICAgY29uc3QgYXIgPSAoeSAtIGEuYnkpICogYS5idztcbiAgICBjb25zdCBiciA9ICh5IC0gYi5ieSkgKiBiLmJ3O1xuICAgIGZvciAobGV0IHggPSBpeDA7IHggPCBpeDE7IHgrKykge1xuICAgICAgaWYgKGEubWFza1thciArICh4IC0gYS5ieCldICYmIGIubWFza1ticiArICh4IC0gYi5ieCldKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEFsbG9jYXRlIGEgZnJlc2ggYWNjdW11bGF0b3IgY292ZXJpbmcgYm90aCBtYXNrcyBhbmQgT1IgdGhlbSBpbi4gVGhlXG4gKiByZXN1bHRpbmcgbWFzaydzIGJib3ggaXMgdGhlIHNtYWxsZXN0IHJlY3RhbmdsZSBjb250YWluaW5nIGJvdGggaW5wdXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pb25NYXNrcyhhOiBCQm94TWFzaywgYjogQkJveE1hc2spOiBCQm94TWFzayB7XG4gIGNvbnN0IHV4MCA9IE1hdGgubWluKGEuYngsIGIuYngpO1xuICBjb25zdCB1eTAgPSBNYXRoLm1pbihhLmJ5LCBiLmJ5KTtcbiAgY29uc3QgdXgxID0gTWF0aC5tYXgoYS5ieCArIGEuYncsIGIuYnggKyBiLmJ3KTtcbiAgY29uc3QgdXkxID0gTWF0aC5tYXgoYS5ieSArIGEuYmgsIGIuYnkgKyBiLmJoKTtcbiAgY29uc3QgdWJ3ID0gdXgxIC0gdXgwO1xuICBjb25zdCB1YmggPSB1eTEgLSB1eTA7XG4gIGNvbnN0IHVtYXNrID0gbmV3IFVpbnQ4QXJyYXkodWJ3ICogdWJoKTtcblxuICBjb25zdCBkYXggPSBhLmJ4IC0gdXgwO1xuICBjb25zdCBkYXkgPSBhLmJ5IC0gdXkwO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBhLmJoOyByb3crKykge1xuICAgIGNvbnN0IHNyYyA9IHJvdyAqIGEuYnc7XG4gICAgY29uc3QgZHN0ID0gKHJvdyArIGRheSkgKiB1YncgKyBkYXg7XG4gICAgdW1hc2suc2V0KGEubWFzay5zdWJhcnJheShzcmMsIHNyYyArIGEuYncpLCBkc3QpO1xuICB9XG4gIGNvbnN0IGRieCA9IGIuYnggLSB1eDA7XG4gIGNvbnN0IGRieSA9IGIuYnkgLSB1eTA7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGIuYmg7IHJvdysrKSB7XG4gICAgY29uc3Qgc3JjUm93ID0gcm93ICogYi5idztcbiAgICBjb25zdCBkc3RSb3cgPSAocm93ICsgZGJ5KSAqIHVidztcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBiLmJ3OyBjb2wrKykge1xuICAgICAgaWYgKGIubWFza1tzcmNSb3cgKyBjb2xdKSB1bWFza1tkc3RSb3cgKyAoZGJ4ICsgY29sKV0gPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBieDogdXgwLCBieTogdXkwLCBidzogdWJ3LCBiaDogdWJoLCBtYXNrOiB1bWFzayB9O1xufVxuXG4vLyDilIDilIAgUmluZyBzaW1wbGlmaWNhdGlvbiAoRG91Z2xhc+KAk1BldWNrZXIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogUGVycGVuZGljdWxhciBkaXN0YW5jZSBmcm9tIChweCxweSkgdG8gdGhlIHNlZ21lbnQgKGF4LGF5KeKAkyhieCxieSkuICovXG5mdW5jdGlvbiBwZXJwRGlzdGFuY2UocHg6IG51bWJlciwgcHk6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICBheDogbnVtYmVyLCBheTogbnVtYmVyLCBieDogbnVtYmVyLCBieTogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgZHggPSBieCAtIGF4LCBkeSA9IGJ5IC0gYXk7XG4gIGNvbnN0IGxlbjIgPSBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgaWYgKGxlbjIgPT09IDApIHJldHVybiBNYXRoLmh5cG90KHB4IC0gYXgsIHB5IC0gYXkpO1xuICBsZXQgdCA9ICgocHggLSBheCkgKiBkeCArIChweSAtIGF5KSAqIGR5KSAvIGxlbjI7XG4gIHQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB0KSk7XG4gIHJldHVybiBNYXRoLmh5cG90KHB4IC0gKGF4ICsgdCAqIGR4KSwgcHkgLSAoYXkgKyB0ICogZHkpKTtcbn1cblxuLyoqXG4gKiBTaW1wbGlmeSBhIGNsb3NlZCByaW5nIHdpdGggdGhlIERvdWdsYXPigJNQZXVja2VyIGFsZ29yaXRobSAoaml0LXVpIzg1KTpcbiAqIGRyb3AgZXZlcnkgdmVydGV4IHRoYXQgbGllcyB3aXRoaW4gYGVwc2lsb25gIHBpeGVscyAodGhlIFwiYWx0aXR1ZGVcbiAqIHRocmVzaG9sZFwiKSBvZiB0aGUgbGluZSBiZXR3ZWVuIGl0cyBrZXB0IG5laWdoYm91cnMuIEFuY2hvcmVkIGF0IHZlcnRleCAwXG4gKiAodGhlIHJpbmcgaXMgY2xvc2VkIGJ5IGFwcGVuZGluZyBpdCkuIFJpbmdzIG9mIOKJpCAzIHZlcnRpY2VzLCBvciBhXG4gKiBub24tcG9zaXRpdmUgZXBzaWxvbiwgYXJlIHJldHVybmVkIHVuY2hhbmdlZC4gT3V0cHV0IGtlZXBzIHRoZSBjbG9zZWQtcmluZ1xuICogY29udmVudGlvbiAobm8gcmVwZWF0ZWQgY2xvc2luZyBwb2ludCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaW1wbGlmeVJpbmcoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGVwc2lsb246IG51bWJlcilcbiAgOiB7IHhzOiBudW1iZXJbXTsgeXM6IG51bWJlcltdIH0ge1xuICBjb25zdCBuID0geHMubGVuZ3RoO1xuICBpZiAobiA8PSAzIHx8ICEoZXBzaWxvbiA+IDApKSByZXR1cm4geyB4czogeHMuc2xpY2UoKSwgeXM6IHlzLnNsaWNlKCkgfTtcblxuICAvLyBDbG9zZSB0aGUgcmluZyBzbyBib3RoIGVuZHBvaW50cyBvZiB0aGUgRFAgcnVuIGFyZSB2ZXJ0ZXggMC5cbiAgY29uc3QgcHggPSBbLi4ueHMsIHhzWzBdXTtcbiAgY29uc3QgcHkgPSBbLi4ueXMsIHlzWzBdXTtcbiAgY29uc3QgbSA9IHB4Lmxlbmd0aDtcbiAgY29uc3Qga2VlcCA9IG5ldyBBcnJheTxib29sZWFuPihtKS5maWxsKGZhbHNlKTtcbiAga2VlcFswXSA9IHRydWU7XG4gIGtlZXBbbSAtIDFdID0gdHJ1ZTtcblxuICBjb25zdCBzdGFjazogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gPSBbWzAsIG0gLSAxXV07XG4gIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICBjb25zdCBbYSwgYl0gPSBzdGFjay5wb3AoKSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgIGxldCBtYXhEID0gLTEsIGlkeCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSBhICsgMTsgaSA8IGI7IGkrKykge1xuICAgICAgY29uc3QgZCA9IHBlcnBEaXN0YW5jZShweFtpXSwgcHlbaV0sIHB4W2FdLCBweVthXSwgcHhbYl0sIHB5W2JdKTtcbiAgICAgIGlmIChkID4gbWF4RCkgeyBtYXhEID0gZDsgaWR4ID0gaTsgfVxuICAgIH1cbiAgICBpZiAobWF4RCA+IGVwc2lsb24gJiYgaWR4ID4gYSkge1xuICAgICAga2VlcFtpZHhdID0gdHJ1ZTtcbiAgICAgIHN0YWNrLnB1c2goW2EsIGlkeF0sIFtpZHgsIGJdKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBvdXRYOiBudW1iZXJbXSA9IFtdLCBvdXRZOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG0gLSAxOyBpKyspIHsgICAgICAvLyBkcm9wIHRoZSBkdXBsaWNhdGVkIGNsb3NpbmcgdmVydGV4XG4gICAgaWYgKGtlZXBbaV0pIHsgb3V0WC5wdXNoKHB4W2ldKTsgb3V0WS5wdXNoKHB5W2ldKTsgfVxuICB9XG4gIHJldHVybiB7IHhzOiBvdXRYLCB5czogb3V0WSB9O1xufVxuIl19
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21vZGVscy9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFRSCx3RUFBd0U7QUFFeEU7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBWTtJQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBCQUEwQjtJQUNuRixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQzdCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUFZO0lBQzlDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUc7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMxQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsZ0JBQWdCO0lBQzlELE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM3RixJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxFQUFZLEVBQUUsRUFBWSxFQUFFLE1BQWU7SUFDM0UsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUM3QixJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7SUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ25DLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxJQUFJLElBQUksR0FBRyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxJQUFJLE1BQU07UUFBRSxJQUFJLElBQUksR0FBRyxDQUFDO0lBQ3hCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHVyZSBTVkctcGF0aCBoZWxwZXJzIChidWlsZCBhbmQgcGFyc2UgYSB2ZXJ0ZXggcmluZyBhcyBhIFBsb3RseSBwYXRoKS5cbiAqXG4gKiBObyBET00gYWNjZXNzLCBubyBzZXJ2aWNlIHN0YXRlLCBubyBgdGhpc2AuIE1hc2sgYW5kIHJpbmcgZ2VvbWV0cnkgKHRoZVxuICogcmFzdGVyaXplciwgbWFzayBzZXQgb3BlcmF0aW9ucywgcG9pbnQtaW4tcmluZywgc2ltcGxpZmljYXRpb24sIGNvbnRvdXJcbiAqIHRyYWNpbmcpIGxpdmVzIGluIGBzcmMvbGliL2dlb21ldHJ5L2AuXG4gKi9cblxuLyoqIFBhcnNlZCBzaW5nbGUtc3VicGF0aCBwb2x5Z29uIHZlcnRpY2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2x5Z29uVmVydGljZXMge1xuICB4cG9pbnRzOiBudW1iZXJbXTtcbiAgeXBvaW50czogbnVtYmVyW107XG59XG5cbi8vIOKUgOKUgCBTVkcgcGF0aCBwYXJzaW5nIC8gYnVpbGRpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogU3BsaXQgYSBzaW5nbGUtc3VicGF0aCBgTSB4LHkgTCB4LHkgLi4uIFtaXWAgcGF0aCBpbnRvIHZlcnRleCBhcnJheXMsIHBsdXNcbiAqIHdoZXRoZXIgaXQgaXMgY2xvc2VkIChlbmRzIGluIGBaYCkuIE5vIHZhbGlkYXRpb246IGEgY29vcmRpbmF0ZSB0aGF0IGRvZXNuJ3RcbiAqIHBhcnNlIGNvbWVzIGJhY2sgYXMgTmFOLiBTZWUge0BsaW5rIHBhcnNlU3ZnUGF0aFBvbHlnb259IGZvciB0aGUgY2hlY2tlZCBmb3JtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdmdQYXRoKHBhdGg6IHN0cmluZyk6IFBvbHlnb25WZXJ0aWNlcyAmIHsgY2xvc2VkOiBib29sZWFuIH0ge1xuICBjb25zdCBjbG9zZWQgPSBwYXRoLmVuZHNXaXRoKCdaJyk7XG4gIGNvbnN0IGJvZHkgPSBjbG9zZWQgPyBwYXRoLnNsaWNlKDEsIC0xKSA6IHBhdGguc2xpY2UoMSk7IC8vIGRyb3AgTSBhbmQgb3B0aW9uYWxseSBaXG4gIGNvbnN0IHhwb2ludHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHlwb2ludHM6IG51bWJlcltdID0gW107XG4gIGZvciAoY29uc3Qgc2VnIG9mIGJvZHkuc3BsaXQoJ0wnKSkge1xuICAgIGNvbnN0IFtzeCwgc3ldID0gc2VnLnNwbGl0KCcsJyk7XG4gICAgeHBvaW50cy5wdXNoKHBhcnNlRmxvYXQoc3gpKTtcbiAgICB5cG9pbnRzLnB1c2gocGFyc2VGbG9hdChzeSkpO1xuICB9XG4gIHJldHVybiB7IHhwb2ludHMsIHlwb2ludHMsIGNsb3NlZCB9O1xufVxuXG4vKipcbiAqIFBhcnNlIGEgc2luZ2xlLXN1YnBhdGggYE0geCx5IEwgeCx5IC4uLiBbWl1gIHBhdGggaW50byB2ZXJ0ZXggYXJyYXlzLlxuICpcbiAqIFJldHVybnMgbnVsbCBmb3IgcGF0aHMgd2UgY2FuJ3Qgc2FmZWx5IHJvdW5kLXRyaXAgKG11bHRpLXN1YnBhdGgsIGN1cnZlcyxcbiAqIG5vbi1udW1lcmljIGNvb3JkaW5hdGVzLCBmZXdlciB0aGFuIHRocmVlIHZlcnRpY2VzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3ZnUGF0aFBvbHlnb24ocGF0aDogc3RyaW5nKTogUG9seWdvblZlcnRpY2VzIHwgbnVsbCB7XG4gIGlmICghcGF0aCB8fCBwYXRoWzBdICE9PSAnTScpIHJldHVybiBudWxsO1xuICBpZiAocGF0aC5pbmRleE9mKCdNJywgMSkgIT09IC0xKSByZXR1cm4gbnVsbDsgLy8gbXVsdGktc3VicGF0aFxuICBjb25zdCB7IHhwb2ludHMsIHlwb2ludHMgfSA9IHBhcnNlU3ZnUGF0aChwYXRoKTtcbiAgaWYgKHhwb2ludHMuc29tZSgoeCwgaSkgPT4gIU51bWJlci5pc0Zpbml0ZSh4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHlwb2ludHNbaV0pKSkgcmV0dXJuIG51bGw7XG4gIGlmICh4cG9pbnRzLmxlbmd0aCA8IDMpIHJldHVybiBudWxsO1xuICByZXR1cm4geyB4cG9pbnRzLCB5cG9pbnRzIH07XG59XG5cbi8qKlxuICogQnVpbGQgYW4gU1ZHIHBhdGggc3RyaW5nIGZyb20gdmVydGV4IGFycmF5cy4gQ2xvc2VkIHBvbHlnb25zIGVuZCB3aXRoIGBaYCxcbiAqIG9wZW4gcG9seWxpbmVzIGRvIG5vdC4gUmV0dXJucyAnJyBmb3IgZmV3ZXIgdGhhbiB0d28gdmVydGljZXMgKGRlZ2VuZXJhdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVydGljZXNUb1N2Z1BhdGgoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGNsb3NlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICh4cy5sZW5ndGggPCAyKSByZXR1cm4gJyc7XG4gIGxldCBwYXRoID0gJ00nO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgcGF0aCArPSBgJHt4c1tpXX0sJHt5c1tpXX1gO1xuICAgIGlmIChpIDwgeHMubGVuZ3RoIC0gMSkgcGF0aCArPSAnTCc7XG4gIH1cbiAgaWYgKGNsb3NlZCkgcGF0aCArPSAnWic7XG4gIHJldHVybiBwYXRoO1xufVxuIl19