@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.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 (579) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +34 -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/image.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  13. package/esm2022/lib/contracts/intensity.mjs +48 -5
  14. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  15. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  16. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  17. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  18. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  19. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  20. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  21. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  25. package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
  26. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  28. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  29. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  30. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  31. package/esm2022/lib/geometry/contour.mjs +63 -0
  32. package/esm2022/lib/geometry/loft.mjs +128 -0
  33. package/esm2022/lib/geometry/polylabel.mjs +156 -0
  34. package/esm2022/lib/geometry/raster.mjs +98 -0
  35. package/esm2022/lib/geometry/reconstruct.mjs +315 -0
  36. package/esm2022/lib/geometry/reslice-image.mjs +57 -0
  37. package/esm2022/lib/geometry/ring.mjs +201 -0
  38. package/esm2022/lib/geometry/section.mjs +215 -0
  39. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  40. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  41. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  42. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  43. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  45. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +12 -9
  46. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
  47. package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
  48. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -591
  49. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  50. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  51. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  52. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  53. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +270 -0
  54. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  55. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  56. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  57. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  58. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  59. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +347 -0
  60. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
  61. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
  62. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
  63. package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
  64. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  65. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  66. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  67. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +194 -0
  68. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  69. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  70. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  71. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  72. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  73. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  74. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  75. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  76. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  77. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  78. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  79. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  80. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  81. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  82. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  83. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  84. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  85. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  86. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +164 -0
  87. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
  88. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  89. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  90. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  91. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  92. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  93. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  94. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  95. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  96. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  97. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  98. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  99. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  100. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  101. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  102. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  103. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  104. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  105. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  106. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  107. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  108. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  109. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  110. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  111. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  112. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  113. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  114. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  115. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  116. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  117. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  118. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  119. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  120. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  121. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  122. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  123. package/esm2022/lib/models/bezier.mjs +1 -11
  124. package/esm2022/lib/models/class-preset.mjs +41 -3
  125. package/esm2022/lib/models/geometry.mjs +27 -164
  126. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  127. package/esm2022/lib/models/polygon-factory.mjs +134 -0
  128. package/esm2022/lib/models/region-clone.mjs +68 -0
  129. package/esm2022/lib/models/region-geojson.mjs +411 -0
  130. package/esm2022/lib/models/region.mjs +34 -33
  131. package/esm2022/lib/models/shape.mjs +18 -16
  132. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  133. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  134. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  135. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  136. package/esm2022/lib/plot.utilities.mjs +296 -473
  137. package/esm2022/lib/processing/image-crop.mjs +1 -1
  138. package/esm2022/lib/processing/processing-image.mjs +28 -15
  139. package/esm2022/lib/provide-visualization.mjs +40 -14
  140. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
  141. package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
  142. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -0
  143. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  144. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  145. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  146. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  147. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  148. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  149. package/esm2022/lib/region-editor/region-editor.component.mjs +896 -660
  150. package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
  151. package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
  152. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -0
  153. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  154. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  155. package/esm2022/lib/region-ops.service.mjs +28 -70
  156. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  157. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  158. package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
  159. package/esm2022/lib/region-overlay/region-style.mjs +97 -0
  160. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  161. package/esm2022/lib/region-source/http-region-source.mjs +104 -0
  162. package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
  163. package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
  164. package/esm2022/lib/region-source/region-source.mjs +67 -0
  165. package/esm2022/lib/region-source/region-tiles.mjs +708 -0
  166. package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
  167. package/esm2022/lib/render-orchestrator.mjs +14 -11
  168. package/esm2022/lib/render-session.mjs +207 -0
  169. package/esm2022/lib/routing-visualizer.service.mjs +858 -414
  170. package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
  171. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  172. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  173. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  174. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  175. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  176. package/esm2022/lib/spatial/lod.mjs +187 -0
  177. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  178. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  179. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  180. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  181. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  182. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  183. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  184. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  185. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  186. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  187. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  188. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  189. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  190. package/esm2022/lib/spatial/stats.mjs +71 -0
  191. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  192. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  193. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  194. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  195. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  196. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  197. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  198. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  199. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  200. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  201. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  202. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  203. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  204. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  205. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  206. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  207. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  208. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  209. package/esm2022/lib/store/class-color.util.mjs +53 -5
  210. package/esm2022/lib/store/class-signatures.mjs +63 -0
  211. package/esm2022/lib/store/region-history.mjs +146 -0
  212. package/esm2022/lib/store/region-scope-cache.mjs +144 -0
  213. package/esm2022/lib/store/region-selection.mjs +82 -0
  214. package/esm2022/lib/store/region-source-scope.mjs +171 -0
  215. package/esm2022/lib/store/region-store.service.mjs +986 -670
  216. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  217. package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
  218. package/esm2022/lib/toast-outlets.mjs +5 -4
  219. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  220. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  221. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  222. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  223. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  224. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +120 -0
  225. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  226. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  227. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  228. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  229. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  230. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  231. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  232. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  233. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  234. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  235. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  236. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  237. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  238. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +121 -0
  239. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  240. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  241. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  242. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  243. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  244. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  245. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  246. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  247. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  248. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  249. package/esm2022/lib/toolbar/toolbar.component.mjs +84 -119
  250. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  251. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  252. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  253. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  254. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  255. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  256. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  257. package/esm2022/lib/util/supersede.mjs +56 -0
  258. package/esm2022/lib/visualization.module.mjs +39 -141
  259. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  260. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  261. package/esm2022/lib/visualizer/region-load.mjs +123 -0
  262. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  263. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  264. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  265. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  266. package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
  267. package/esm2022/lib/visualizer.component.mjs +602 -1902
  268. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  269. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  270. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  271. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs +47169 -0
  272. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
  273. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
  274. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
  275. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
  276. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
  277. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  278. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  279. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
  280. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  281. package/fesm2022/mask.worker.js +36 -917
  282. package/fesm2022/onnx-sam.worker.js +52 -16
  283. package/fesm2022/region-source.worker.js +1067 -0
  284. package/fesm2022/spatial-math.worker.js +471 -0
  285. package/fesm2022/tsne.worker.js +32 -15
  286. package/index.d.ts +19 -10
  287. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  288. package/lib/contracts/capabilities.contract.d.ts +4 -2
  289. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  290. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  291. package/lib/contracts/color.d.ts +27 -0
  292. package/lib/contracts/colormap-lut.d.ts +19 -4
  293. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  294. package/lib/contracts/display-types.d.ts +21 -0
  295. package/lib/contracts/image.contract.d.ts +4 -0
  296. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  297. package/lib/contracts/intensity.d.ts +13 -2
  298. package/lib/contracts/plot-type.d.ts +3 -1
  299. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  300. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  301. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  302. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  303. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  304. package/lib/contracts/region-editor-api.contract.d.ts +85 -1
  305. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  306. package/lib/contracts/region-store.contract.d.ts +22 -0
  307. package/lib/contracts/sam.contract.d.ts +7 -0
  308. package/lib/contracts/section-view.contract.d.ts +44 -0
  309. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  310. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  311. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  312. package/lib/contracts/visualizer.contract.d.ts +231 -54
  313. package/lib/contracts/viz-config.d.ts +9 -0
  314. package/lib/geometry/contour.d.ts +24 -0
  315. package/lib/geometry/loft.d.ts +22 -0
  316. package/lib/geometry/polylabel.d.ts +23 -0
  317. package/lib/geometry/raster.d.ts +42 -0
  318. package/lib/geometry/reconstruct.d.ts +54 -0
  319. package/lib/geometry/reslice-image.d.ts +33 -0
  320. package/lib/geometry/ring.d.ts +67 -0
  321. package/lib/geometry/section.d.ts +52 -0
  322. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  323. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  324. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  325. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  326. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  327. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  328. package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -3
  329. package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
  330. package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
  331. package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
  332. package/lib/implementations/napari-js/napari-scene.d.ts +126 -0
  333. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  334. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  335. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  336. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +91 -0
  337. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  338. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  339. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  340. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  341. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  342. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  343. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +169 -883
  344. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
  345. package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
  346. package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
  347. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  348. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  349. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  350. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  351. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  352. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  353. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  354. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  355. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  356. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  357. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  358. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  359. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  360. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  361. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  362. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  363. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  364. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  365. package/lib/implementations/osd/osd-export.d.ts +36 -0
  366. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  367. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  368. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  369. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +38 -0
  370. package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
  371. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  372. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  373. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  374. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  375. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  376. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  377. package/lib/implementations/osd/simple-source.d.ts +161 -0
  378. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  379. package/lib/implementations/osd/tile-client.d.ts +11 -14
  380. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  381. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  382. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  383. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  384. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  385. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  386. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  387. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  388. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  389. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  390. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  391. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  392. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  393. package/lib/implementations/region-centroids.d.ts +14 -0
  394. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  395. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  396. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  397. package/lib/implementations/tile-server/index.d.ts +5 -0
  398. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  399. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  400. package/lib/implementations/tile-server/tile-protocol.d.ts +83 -0
  401. package/lib/implementations/tile-server/transport.d.ts +62 -0
  402. package/lib/intensity/intensity-profile.d.ts +66 -0
  403. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  404. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  405. package/lib/models/bezier.d.ts +0 -5
  406. package/lib/models/class-preset.d.ts +25 -0
  407. package/lib/models/geometry.d.ts +14 -48
  408. package/lib/models/polygon-edit.d.ts +72 -0
  409. package/lib/models/polygon-factory.d.ts +45 -0
  410. package/lib/models/region-clone.d.ts +20 -0
  411. package/lib/models/region-geojson.d.ts +57 -0
  412. package/lib/models/region.d.ts +59 -4
  413. package/lib/models/shape.d.ts +8 -0
  414. package/lib/plot-mode/contribution-host.d.ts +125 -0
  415. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  416. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  417. package/lib/plot.utilities.d.ts +19 -30
  418. package/lib/processing/processing-image.d.ts +5 -2
  419. package/lib/provide-visualization.d.ts +19 -2
  420. package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
  421. package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
  422. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -0
  423. package/lib/region-editor/file-stem.d.ts +7 -0
  424. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  425. package/lib/region-editor/mask-export.service.d.ts +54 -0
  426. package/lib/region-editor/mask-raster.d.ts +2 -8
  427. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  428. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  429. package/lib/region-editor/region-editor.component.d.ts +283 -200
  430. package/lib/region-editor/region-metrics.d.ts +34 -0
  431. package/lib/region-editor/region-persistence.service.d.ts +77 -0
  432. package/lib/region-editor/region-table/region-table.component.d.ts +89 -0
  433. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  434. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  435. package/lib/region-ops.service.d.ts +1 -7
  436. package/lib/region-overlay/region-geometry.d.ts +158 -0
  437. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  438. package/lib/region-overlay/region-source-layer.d.ts +96 -0
  439. package/lib/region-overlay/region-style.d.ts +52 -0
  440. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  441. package/lib/region-source/http-region-source.d.ts +45 -0
  442. package/lib/region-source/region-source-ops.d.ts +89 -0
  443. package/lib/region-source/region-source-worker.d.ts +7 -0
  444. package/lib/region-source/region-source.d.ts +82 -0
  445. package/lib/region-source/region-tiles.d.ts +289 -0
  446. package/lib/region-source/worker-region-source.d.ts +65 -0
  447. package/lib/render-orchestrator.d.ts +6 -2
  448. package/lib/render-session.d.ts +75 -0
  449. package/lib/routing-visualizer.service.d.ts +248 -59
  450. package/lib/section-pane/section-pane.component.d.ts +47 -0
  451. package/lib/spatial/density-raster.d.ts +6 -0
  452. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  453. package/lib/spatial/embedding-compute.d.ts +21 -2
  454. package/lib/spatial/glyphs.d.ts +16 -0
  455. package/lib/spatial/lod.d.ts +94 -0
  456. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  457. package/lib/spatial/spatial-density.d.ts +15 -5
  458. package/lib/spatial/spatial-encoding.d.ts +11 -44
  459. package/lib/spatial/spatial-expression.d.ts +40 -22
  460. package/lib/spatial/spatial-framing.d.ts +1 -0
  461. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  462. package/lib/spatial/spatial-hover.d.ts +4 -16
  463. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  464. package/lib/spatial/spatial-selection.d.ts +21 -26
  465. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  466. package/lib/spatial/spatial-tiles.d.ts +9 -256
  467. package/lib/spatial/stats.d.ts +38 -0
  468. package/lib/spatial/transcript-grouping.d.ts +119 -0
  469. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  470. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  471. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  472. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  473. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  474. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  475. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  476. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  477. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  478. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  479. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  480. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  481. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  482. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  483. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  484. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  485. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  486. package/lib/store/class-color.util.d.ts +39 -2
  487. package/lib/store/class-signatures.d.ts +11 -0
  488. package/lib/store/region-history.d.ts +66 -0
  489. package/lib/store/region-scope-cache.d.ts +65 -0
  490. package/lib/store/region-selection.d.ts +36 -0
  491. package/lib/store/region-source-scope.d.ts +68 -0
  492. package/lib/store/region-store.service.d.ts +312 -116
  493. package/lib/store/visualizer-store.service.d.ts +32 -33
  494. package/lib/toast-outlets.d.ts +4 -3
  495. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  496. package/lib/toolbar/canvas-tools.d.ts +20 -0
  497. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  498. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  499. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  500. package/lib/toolbar/region-tools/region-tools.component.d.ts +62 -0
  501. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  502. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  503. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  504. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  505. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  506. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  507. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  508. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  509. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  510. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  511. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  512. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  513. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  514. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +51 -0
  515. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  516. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  517. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  518. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  519. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  520. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  521. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  522. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  523. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  524. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  525. package/lib/toolbar/toolbar.component.d.ts +55 -84
  526. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  527. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  528. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  529. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  530. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  531. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  532. package/lib/util/mark-for-check.d.ts +11 -0
  533. package/lib/util/supersede.d.ts +53 -0
  534. package/lib/visualization.module.d.ts +18 -39
  535. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  536. package/lib/visualizer/region-actions.d.ts +54 -0
  537. package/lib/visualizer/region-load.d.ts +46 -0
  538. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  539. package/lib/visualizer/tool-modes.d.ts +49 -0
  540. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  541. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  542. package/lib/visualizer/volume-sections.d.ts +64 -0
  543. package/lib/visualizer.component.d.ts +232 -447
  544. package/lib/workers/spatial-math-ops.d.ts +65 -0
  545. package/lib/workers/spatial-math-worker.d.ts +7 -0
  546. package/lib/workers/spatial-math.d.ts +74 -0
  547. package/package.json +12 -3
  548. package/src/lib/assets/slice.svg +23 -0
  549. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  550. package/src/lib/styles/viz-icons.scss +14 -0
  551. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  552. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  553. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  554. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  555. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  556. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  557. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  558. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  559. package/src/lib/assets/cell-detection.svg +0 -37
  560. package/src/lib/assets/click.svg +0 -1
  561. package/src/lib/assets/colormap-luts.json +0 -1
  562. package/src/lib/assets/edit-selection-white.svg +0 -47
  563. package/src/lib/assets/icons/colormap-earth.png +0 -0
  564. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  565. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  566. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  567. package/src/lib/assets/picture-segmentation.svg +0 -43
  568. package/src/lib/assets/test/download-379.svg +0 -1
  569. package/src/lib/assets/test/download-98.svg +0 -1
  570. package/src/lib/assets/test/json-1.svg +0 -1
  571. package/src/lib/assets/test/load-53.svg +0 -1
  572. package/src/lib/assets/test/mask-44.svg +0 -1
  573. package/src/lib/assets/test/mask-download-44.svg +0 -15
  574. package/src/lib/assets/test/mask-save-44.svg +0 -11
  575. package/src/lib/assets/test/overlay-1.svg +0 -1
  576. package/src/lib/assets/test/overlay-4.svg +0 -1
  577. package/src/lib/assets/test/region-26.svg +0 -1
  578. package/src/lib/assets/test/save-56.svg +0 -1
  579. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -0,0 +1,282 @@
1
+ import { INFERNO_LUT } from 'napari-js/colormaps';
2
+ import { lutFor, spatialContinuousLut } from './spatial-encoding';
3
+ import { TRANSCRIPT_GLYPHS, glyphOutline } from './spatial-tiles';
4
+ /** A gene name as a dropdown option. Objects rather than bare strings because the
5
+ * dropdown filters on a named field (`filterBy="label"`), which a string has not. */
6
+ export function geneOption(name) {
7
+ return { label: name, value: name };
8
+ }
9
+ /** Glyph choices with an SVG `points` string for the preview. */
10
+ export const GLYPH_OPTIONS = TRANSCRIPT_GLYPHS.map((g) => {
11
+ const o = glyphOutline(g);
12
+ const pts = [];
13
+ for (let i = 0; i < o.length; i += 2)
14
+ pts.push(`${o[i].toFixed(3)},${o[i + 1].toFixed(3)}`);
15
+ return { label: g.replace('-', ' '), value: g, points: pts.join(' ') };
16
+ });
17
+ /** The preview outline of `glyph`, or `''` for an unknown one. */
18
+ export function glyphPoints(glyph) {
19
+ return GLYPH_OPTIONS.find((o) => o.value === glyph)?.points ?? '';
20
+ }
21
+ /** Outlier clipping presets, as `[lo, hi]` percentile fractions. */
22
+ export const CLIP_OPTIONS = [
23
+ { label: 'None', value: [0, 1] },
24
+ { label: '1%', value: [0.01, 0.99] },
25
+ { label: '2%', value: [0.02, 0.98] },
26
+ { label: '5%', value: [0.05, 0.95] },
27
+ ];
28
+ /**
29
+ * `group,gene` rows (CSV or TSV, header optional) → gene groups, in file order.
30
+ */
31
+ export function parseGeneGroups(text) {
32
+ const groups = new Map();
33
+ for (const line of text.split(/\r?\n/)) {
34
+ const [a, b] = line.split(/,|\t/).map((f) => f.trim().replace(/^"|"$/g, ''));
35
+ if (!a || !b || (/^(group|cell_?type|name)$/i.test(a) && /^(gene|genes|feature)$/i.test(b)))
36
+ continue;
37
+ const list = groups.get(a) ?? [];
38
+ if (!list.includes(b))
39
+ list.push(b);
40
+ groups.set(a, list);
41
+ }
42
+ return [...groups].map(([name, genes]) => ({ name, genes }));
43
+ }
44
+ /** `name — 2 categories` / `name — counts`: a column as the pickers list it. */
45
+ export function columnLabel(c) {
46
+ const kind = c.kind === 'categorical'
47
+ ? `${c.categories.length} categories`
48
+ : (c.unit ?? 'continuous');
49
+ return `${c.name} — ${kind}`;
50
+ }
51
+ /** A categorical column's label in the group pickers: its description where it is a
52
+ * sectioned (derived) grouping, its name and size otherwise. */
53
+ function groupLabel(c) {
54
+ return c.description && c.section ? c.description : columnLabel(c);
55
+ }
56
+ /** Colour-by column choices — "None" plus every column the dataset declares. */
57
+ export function columnOptions(ds) {
58
+ return [
59
+ { label: 'None (flat colour)', value: null },
60
+ ...(ds?.columns ?? []).map((c) => ({ label: columnLabel(c), value: c.name })),
61
+ ];
62
+ }
63
+ /** {@link TileOptions} for `ds`: short labels, cell set first, "Both" when there are two —
64
+ * as Xenium Explorer. */
65
+ export function tileOptions(ds) {
66
+ const sets = [...(ds?.polygonTiles?.sets ?? [])].sort((a, b) => a.name === 'cell' ? -1 : b.name === 'cell' ? 1 : 0);
67
+ const has = (name) => !!ds?.columns.some((c) => c.name === name);
68
+ return {
69
+ cellSetOptions: [
70
+ ...sets.map((s) => ({ label: s.label.replace(/\s*boundar(y|ies)$/i, ''), value: s.name })),
71
+ ...(sets.length > 1 ? [{ label: 'Both', value: 'both' }] : []),
72
+ ],
73
+ transcriptModeOptions: [
74
+ ...(ds?.transcriptTiles
75
+ ? [
76
+ { label: 'Points', value: 'circles' },
77
+ { label: 'Icons', value: 'glyphs' },
78
+ ]
79
+ : []),
80
+ ...(ds?.density ? [{ label: 'Density Map', value: 'density' }] : []),
81
+ ],
82
+ cellColorOptions: [
83
+ { label: 'Group Affiliation', value: 'group' },
84
+ ...(ds?.features ? [{ label: 'Gene Expression', value: 'gene' }] : []),
85
+ ...(has('transcript_density')
86
+ ? [{ label: 'Transcript Density Map', value: 'transcriptDensity' }]
87
+ : []),
88
+ { label: 'Single Color', value: 'single' },
89
+ ...(has('segmentation_method') ? [{ label: 'Segmentation Method', value: 'segmentation' }] : []),
90
+ ],
91
+ };
92
+ }
93
+ /** The value the group picker uses for a family of columns. */
94
+ export const FAMILY_PREFIX = 'family:';
95
+ /**
96
+ * The group picker: categorical columns under their section heading, a family of
97
+ * variants (k-means at k = 2…10) listed once. Values are a column name, or
98
+ * `family:<id>` for a family. The segmentation method is not a grouping of cells.
99
+ */
100
+ export function groupOptions(ds) {
101
+ const sections = new Map();
102
+ const seenFamilies = new Set();
103
+ for (const c of ds?.columns ?? []) {
104
+ if (c.kind !== 'categorical' || c.name === 'segmentation_method')
105
+ continue;
106
+ const section = c.section ?? 'Groups';
107
+ const list = sections.get(section) ?? [];
108
+ if (c.family) {
109
+ if (seenFamilies.has(c.family.id))
110
+ continue;
111
+ seenFamilies.add(c.family.id);
112
+ list.push({ label: c.family.label, value: `${FAMILY_PREFIX}${c.family.id}` });
113
+ }
114
+ else {
115
+ list.push({ label: groupLabel(c), value: c.name });
116
+ }
117
+ sections.set(section, list);
118
+ }
119
+ return [...sections].map(([label, items]) => ({ label, items }));
120
+ }
121
+ function categoricalMeta(ds, name) {
122
+ const meta = name ? ds?.columns.find((c) => c.name === name) : undefined;
123
+ return meta?.kind === 'categorical' ? meta : undefined;
124
+ }
125
+ /** The group picker's value for the active group column: its family's entry, or itself. */
126
+ export function groupEntryFor(ds, column) {
127
+ const family = categoricalMeta(ds, column)?.family;
128
+ return family ? `${FAMILY_PREFIX}${family.id}` : column;
129
+ }
130
+ /** The columns of family `id`, in dataset order. */
131
+ export function familyMembers(ds, id) {
132
+ return (ds?.columns ?? []).filter((c) => c.kind === 'categorical' && c.family?.id === id);
133
+ }
134
+ /** Variants of the active column's family (k = 2…10), or none when it has no family. */
135
+ export function groupVariantOptions(ds, column) {
136
+ const family = categoricalMeta(ds, column)?.family;
137
+ return family ? familyMembers(ds, family.id).map((c) => ({ label: c.family.variant, value: c.name })) : [];
138
+ }
139
+ /** A grouping's categories with colours and cell counts, largest first, and their total. */
140
+ export function countGroupRows(v) {
141
+ const counts = new Uint32Array(v.categories.length);
142
+ for (const c of v.codes)
143
+ if (c < counts.length)
144
+ counts[c]++;
145
+ const rows = v.categories
146
+ .map((label, i) => ({ label, color: v.colors[i] ?? '#999', count: counts[i] }))
147
+ .sort((a, b) => b.count - a.count);
148
+ return { rows, total: rows.reduce((n, r) => n + r.count, 0) };
149
+ }
150
+ /** `list` with `items` removed (`on`) or added (`!on`) — a hidden-set toggle. */
151
+ export function toggleHidden(list, items, on) {
152
+ const hidden = new Set(list);
153
+ for (const item of items) {
154
+ if (on)
155
+ hidden.delete(item);
156
+ else
157
+ hidden.add(item);
158
+ }
159
+ return [...hidden];
160
+ }
161
+ /** The selected genes as Explorer's tree: named groups, then the ungrouped ones. */
162
+ export function buildGeneTree(selected, groups) {
163
+ const chosen = new Set(selected);
164
+ const grouped = new Set();
165
+ const out = [];
166
+ for (const g of groups) {
167
+ const genes = g.genes.filter((x) => chosen.has(x));
168
+ if (!genes.length)
169
+ continue;
170
+ genes.forEach((x) => grouped.add(x));
171
+ out.push({ name: g.name, genes });
172
+ }
173
+ const rest = selected.filter((x) => !grouped.has(x));
174
+ if (rest.length)
175
+ out.push({ name: null, genes: rest });
176
+ return out;
177
+ }
178
+ /** Every categorical column but the segmentation method, which says nothing about genes. */
179
+ export function markerColumnOptions(columns) {
180
+ return (columns ?? [])
181
+ .filter((c) => c.kind === 'categorical' && c.name !== 'segmentation_method')
182
+ .map((c) => ({ label: groupLabel(c), value: c.name }));
183
+ }
184
+ /**
185
+ * Each picked cluster's marker genes as a gene group named after it. A gene that marks
186
+ * several clusters goes to the one it scores highest in, so the tree lists it once;
187
+ * clusters left with no gene are dropped.
188
+ */
189
+ export function markerGeneGroups(result, picked) {
190
+ const best = new Map();
191
+ for (const g of result.groups) {
192
+ if (!picked.has(g.name))
193
+ continue;
194
+ for (const gene of g.genes) {
195
+ const prev = best.get(gene.name);
196
+ if (!prev || gene.score > prev.score)
197
+ best.set(gene.name, { group: g.name, score: gene.score });
198
+ }
199
+ }
200
+ return result.groups
201
+ .filter((g) => picked.has(g.name))
202
+ .map((g) => ({
203
+ name: g.name,
204
+ genes: g.genes.map((x) => x.name).filter((n) => best.get(n)?.group === g.name),
205
+ }))
206
+ .filter((g) => g.genes.length);
207
+ }
208
+ /** `groups` merged into the view's gene groups (replacing any of the same name). */
209
+ export function withGeneGroups(view, groups) {
210
+ const names = new Set(groups.map((g) => g.name));
211
+ return [...view.transcriptGeneGroups.filter((g) => !names.has(g.name)), ...groups];
212
+ }
213
+ /**
214
+ * The patch that adds marker groups: the groups, their genes appended to the selection,
215
+ * transcripts coloured by cluster (as their cells are), and switched on when off.
216
+ */
217
+ export function markerGenesPatch(view, groups) {
218
+ const genes = [...view.transcriptGenes];
219
+ for (const g of groups)
220
+ for (const n of g.genes)
221
+ if (!genes.includes(n))
222
+ genes.push(n);
223
+ return {
224
+ transcriptGeneGroups: withGeneGroups(view, groups),
225
+ transcriptGenes: genes,
226
+ transcriptColorBy: 'cluster',
227
+ ...(view.transcriptMode === 'off' ? { transcriptMode: 'circles' } : {}),
228
+ };
229
+ }
230
+ /** The patch that imports gene groups: the groups, and their genes added to the selection. */
231
+ export function importGeneGroupsPatch(view, groups) {
232
+ return {
233
+ transcriptGeneGroups: withGeneGroups(view, groups),
234
+ transcriptGenes: [...new Set([...view.transcriptGenes, ...groups.flatMap((g) => g.genes)])],
235
+ transcriptAllGenes: false,
236
+ };
237
+ }
238
+ /** `linear-gradient(...)` sampling `lut` at `steps + 1` evenly spaced stops. */
239
+ export function gradientCss(lut, steps = 16) {
240
+ const stops = [];
241
+ for (let i = 0; i <= steps; i++) {
242
+ const [r, g, b] = lut[Math.round((i / steps) * (lut.length - 1))];
243
+ stops.push(`rgb(${r},${g},${b}) ${((i / steps) * 100).toFixed(0)}%`);
244
+ }
245
+ return `linear-gradient(to right, ${stops.join(', ')})`;
246
+ }
247
+ /**
248
+ * The continuous colour bar, resolved exactly the way the renderer resolves its colours —
249
+ * the same override, the same grey fallback. Built from `lutFor` alone, this bar showed a
250
+ * black-to-white ramp while the canvas drew Viridis, which makes the key worse than none.
251
+ */
252
+ export function continuousColorBarCss(colormap, reverse, override) {
253
+ return gradientCss(spatialContinuousLut(colormap, reverse, override));
254
+ }
255
+ /** The density map's colour bar: its own colormap, Inferno by default. */
256
+ export function densityColorBarCss(colormap) {
257
+ return gradientCss(lutFor(colormap ?? INFERNO_LUT));
258
+ }
259
+ /** The middle of a section stack: where a "one section" picker opens, rather than on the
260
+ * first section, which for a brain is a nearly empty olfactory-bulb slide. */
261
+ export function middleSection(sections) {
262
+ return sections ? Math.floor((sections.length - 1) / 2) : 0;
263
+ }
264
+ /** "12 of 53" — 1-based, because the sections are slides, not array slots; `''` with none. */
265
+ export function sectionLabel(sections, at) {
266
+ const total = sections?.length ?? 0;
267
+ if (!total)
268
+ return '';
269
+ const i = Math.max(0, Math.min(total - 1, at ?? 0));
270
+ return `${i + 1} of ${total}`;
271
+ }
272
+ /** Why "All genes" is not offered yet, while the server builds its pyramid; null otherwise. */
273
+ export function allGenesPreparingNote(ds) {
274
+ const st = ds?.transcriptBinsStatus;
275
+ if (!st || ds?.transcriptBins)
276
+ return null;
277
+ if (st.state === 'failed')
278
+ return `"All genes" is unavailable: preparing it failed (${st.message ?? 'unknown error'}).`;
279
+ const pct = st.total ? ` — ${Math.floor((100 * (st.done ?? 0)) / st.total)}% when this dataset was opened` : '';
280
+ return `"All genes" is being prepared on the server${pct}; reopen the dataset once it is done.`;
281
+ }
282
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1wYW5lbC1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLXBhbmVsLW1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVdsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBY2xFO3NGQUNzRjtBQUN0RixNQUFNLFVBQVUsVUFBVSxDQUFDLElBQVk7SUFDckMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFPRCxpRUFBaUU7QUFDakUsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFrQixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUN0RSxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsTUFBTSxHQUFHLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVGLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQXdCLEVB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QUUsRUFBRSxvQkFBb0IsQ0FBQztJQUNwQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxjQUFjO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0MsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLFFBQVE7UUFDdkIsT0FBTyxvREFBb0QsRUFBRSxDQUFDLE9BQU8sSUFBSSxlQUFlLElBQUksQ0FBQztJQUMvRixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2hILE9BQU8sOENBQThDLEdBQUcsdUNBQXVDLENBQUM7QUFDbEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElORkVSTk9fTFVUIH0gZnJvbSAnbmFwYXJpLWpzL2NvbG9ybWFwcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQ2F0ZWdvcmljYWxDb2x1bW5NZXRhLFxuICBTcGF0aWFsQ29sdW1uTWV0YSxcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxNYXJrZXJHZW5lcyxcbn0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxDYXRlZ29yaWNhbFZpZXcgfSBmcm9tICcuLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbG9ybWFwVmFsdWUsIFNwYXRpYWxWaWV3U3RhdGUsIFRyYW5zY3JpcHRHbHlwaE5hbWUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFJnYiB9IGZyb20gJy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHsgbHV0Rm9yLCBzcGF0aWFsQ29udGludW91c0x1dCB9IGZyb20gJy4vc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBUUkFOU0NSSVBUX0dMWVBIUywgZ2x5cGhPdXRsaW5lIH0gZnJvbSAnLi9zcGF0aWFsLXRpbGVzJztcblxuLyoqXG4gKiBQdXJlIG1vZGVsIG9mIHRoZSBzcGF0aWFsLW9taWNzIHBhbmVsOiB0aGUgb3B0aW9uIGxpc3RzLCByb3dzIGFuZCBwYXRjaGVzIGl0cyBjb250cm9sc1xuICogc2hvdyBhbmQgd3JpdGUsIGFzIGZ1bmN0aW9ucyBvZiB0aGUgZGF0YXNldCBhbmQgdGhlIHZpZXcuIE5vIEFuZ3VsYXIgYW5kIG5vIHN0YXRlLCBzb1xuICogZXZlcnkgcnVsZSBoZXJlIGlzIHVuaXQtdGVzdGVkIHdpdGhvdXQgYSBUZXN0QmVkIGFuZCBzaGFyZWQgYnkgd2hpY2hldmVyIHBhbmVsIHNob3dzIGl0LlxuICovXG5cbi8qKiBBIGxhYmVsbGVkIGRyb3Bkb3duIG9wdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFuZWxPcHRpb248VD4ge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogVDtcbn1cblxuLyoqIEEgZ2VuZSBuYW1lIGFzIGEgZHJvcGRvd24gb3B0aW9uLiBPYmplY3RzIHJhdGhlciB0aGFuIGJhcmUgc3RyaW5ncyBiZWNhdXNlIHRoZVxuICogIGRyb3Bkb3duIGZpbHRlcnMgb24gYSBuYW1lZCBmaWVsZCAoYGZpbHRlckJ5PVwibGFiZWxcImApLCB3aGljaCBhIHN0cmluZyBoYXMgbm90LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVPcHRpb24obmFtZTogc3RyaW5nKTogUGFuZWxPcHRpb248c3RyaW5nPiB7XG4gIHJldHVybiB7IGxhYmVsOiBuYW1lLCB2YWx1ZTogbmFtZSB9O1xufVxuXG4vKiogQSB0cmFuc2NyaXB0IGdseXBoIGNob2ljZSwgd2l0aCBhbiBTVkcgYHBvaW50c2Agc3RyaW5nIGZvciBpdHMgcHJldmlldy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2x5cGhPcHRpb24gZXh0ZW5kcyBQYW5lbE9wdGlvbjxUcmFuc2NyaXB0R2x5cGhOYW1lPiB7XG4gIHBvaW50czogc3RyaW5nO1xufVxuXG4vKiogR2x5cGggY2hvaWNlcyB3aXRoIGFuIFNWRyBgcG9pbnRzYCBzdHJpbmcgZm9yIHRoZSBwcmV2aWV3LiAqL1xuZXhwb3J0IGNvbnN0IEdMWVBIX09QVElPTlM6IEdseXBoT3B0aW9uW10gPSBUUkFOU0NSSVBUX0dMWVBIUy5tYXAoKGcpID0+IHtcbiAgY29uc3QgbyA9IGdseXBoT3V0bGluZShnKTtcbiAgY29uc3QgcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG8ubGVuZ3RoOyBpICs9IDIpIHB0cy5wdXNoKGAke29baV0udG9GaXhlZCgzKX0sJHtvW2kgKyAxXS50b0ZpeGVkKDMpfWApO1xuICByZXR1cm4geyBsYWJlbDogZy5yZXBsYWNlKCctJywgJyAnKSwgdmFsdWU6IGcgYXMgVHJhbnNjcmlwdEdseXBoTmFtZSwgcG9pbnRzOiBwdHMuam9pbignICcpIH07XG59KTtcblxuLyoqIFRoZSBwcmV2aWV3IG91dGxpbmUgb2YgYGdseXBoYCwgb3IgYCcnYCBmb3IgYW4gdW5rbm93biBvbmUuICovXG5leHBvcnQgZnVuY3Rpb24gZ2x5cGhQb2ludHMoZ2x5cGg6IFRyYW5zY3JpcHRHbHlwaE5hbWUpOiBzdHJpbmcge1xuICByZXR1cm4gR0xZUEhfT1BUSU9OUy5maW5kKChvKSA9PiBvLnZhbHVlID09PSBnbHlwaCk/LnBvaW50cyA/PyAnJztcbn1cblxuLyoqIE91dGxpZXIgY2xpcHBpbmcgcHJlc2V0cywgYXMgYFtsbywgaGldYCBwZXJjZW50aWxlIGZyYWN0aW9ucy4gKi9cbmV4cG9ydCBjb25zdCBDTElQX09QVElPTlM6IFBhbmVsT3B0aW9uPFtudW1iZXIsIG51bWJlcl0+W10gPSBbXG4gIHsgbGFiZWw6ICdOb25lJywgdmFsdWU6IFswLCAxXSB9LFxuICB7IGxhYmVsOiAnMSUnLCB2YWx1ZTogWzAuMDEsIDAuOTldIH0sXG4gIHsgbGFiZWw6ICcyJScsIHZhbHVlOiBbMC4wMiwgMC45OF0gfSxcbiAgeyBsYWJlbDogJzUlJywgdmFsdWU6IFswLjA1LCAwLjk1XSB9LFxuXTtcblxuLyoqXG4gKiBgZ3JvdXAsZ2VuZWAgcm93cyAoQ1NWIG9yIFRTViwgaGVhZGVyIG9wdGlvbmFsKSDihpIgZ2VuZSBncm91cHMsIGluIGZpbGUgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUdlbmVHcm91cHModGV4dDogc3RyaW5nKTogeyBuYW1lOiBzdHJpbmc7IGdlbmVzOiBzdHJpbmdbXSB9W10ge1xuICBjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiB0ZXh0LnNwbGl0KC9cXHI/XFxuLykpIHtcbiAgICBjb25zdCBbYSwgYl0gPSBsaW5lLnNwbGl0KC8sfFxcdC8pLm1hcCgoZikgPT4gZi50cmltKCkucmVwbGFjZSgvXlwifFwiJC9nLCAnJykpO1xuICAgIGlmICghYSB8fCAhYiB8fCAoL14oZ3JvdXB8Y2VsbF8/dHlwZXxuYW1lKSQvaS50ZXN0KGEpICYmIC9eKGdlbmV8Z2VuZXN8ZmVhdHVyZSkkL2kudGVzdChiKSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxpc3QgPSBncm91cHMuZ2V0KGEpID8/IFtdO1xuICAgIGlmICghbGlzdC5pbmNsdWRlcyhiKSkgbGlzdC5wdXNoKGIpO1xuICAgIGdyb3Vwcy5zZXQoYSwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIFsuLi5ncm91cHNdLm1hcCgoW25hbWUsIGdlbmVzXSkgPT4gKHsgbmFtZSwgZ2VuZXMgfSkpO1xufVxuXG4vKiogYG5hbWUg4oCUIDIgY2F0ZWdvcmllc2AgLyBgbmFtZSDigJQgY291bnRzYDogYSBjb2x1bW4gYXMgdGhlIHBpY2tlcnMgbGlzdCBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2x1bW5MYWJlbChjOiBTcGF0aWFsQ29sdW1uTWV0YSk6IHN0cmluZyB7XG4gIGNvbnN0IGtpbmQgPVxuICAgIGMua2luZCA9PT0gJ2NhdGVnb3JpY2FsJ1xuICAgICAgPyBgJHsoYyBhcyBDYXRlZ29yaWNhbENvbHVtbk1ldGEpLmNhdGVnb3JpZXMubGVuZ3RofSBjYXRlZ29yaWVzYFxuICAgICAgOiAoYy51bml0ID8/ICdjb250aW51b3VzJyk7XG4gIHJldHVybiBgJHtjLm5hbWV9IOKAlCAke2tpbmR9YDtcbn1cblxuLyoqIEEgY2F0ZWdvcmljYWwgY29sdW1uJ3MgbGFiZWwgaW4gdGhlIGdyb3VwIHBpY2tlcnM6IGl0cyBkZXNjcmlwdGlvbiB3aGVyZSBpdCBpcyBhXG4gKiAgc2VjdGlvbmVkIChkZXJpdmVkKSBncm91cGluZywgaXRzIG5hbWUgYW5kIHNpemUgb3RoZXJ3aXNlLiAqL1xuZnVuY3Rpb24gZ3JvdXBMYWJlbChjOiBDYXRlZ29yaWNhbENvbHVtbk1ldGEpOiBzdHJpbmcge1xuICByZXR1cm4gYy5kZXNjcmlwdGlvbiAmJiBjLnNlY3Rpb24gPyBjLmRlc2NyaXB0aW9uIDogY29sdW1uTGFiZWwoYyk7XG59XG5cbi8qKiBDb2xvdXItYnkgY29sdW1uIGNob2ljZXMg4oCUIFwiTm9uZVwiIHBsdXMgZXZlcnkgY29sdW1uIHRoZSBkYXRhc2V0IGRlY2xhcmVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbHVtbk9wdGlvbnMoZHM6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCk6IFBhbmVsT3B0aW9uPHN0cmluZyB8IG51bGw+W10ge1xuICByZXR1cm4gW1xuICAgIHsgbGFiZWw6ICdOb25lIChmbGF0IGNvbG91ciknLCB2YWx1ZTogbnVsbCB9LFxuICAgIC4uLihkcz8uY29sdW1ucyA/PyBbXSkubWFwKChjKSA9PiAoeyBsYWJlbDogY29sdW1uTGFiZWwoYyksIHZhbHVlOiBjLm5hbWUgfSkpLFxuICBdO1xufVxuXG4vKiogVGhlIG9wdGlvbiBsaXN0cyBvZiB0aGUgY2VsbCBhbmQgdHJhbnNjcmlwdCBjb250cm9scywgd2hpY2ggZGVwZW5kIG9uIHRoZSBkYXRhc2V0IG9ubHkuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbGVPcHRpb25zIHtcbiAgY2VsbFNldE9wdGlvbnM6IFBhbmVsT3B0aW9uPHN0cmluZz5bXTtcbiAgdHJhbnNjcmlwdE1vZGVPcHRpb25zOiBQYW5lbE9wdGlvbjxTcGF0aWFsVmlld1N0YXRlWyd0cmFuc2NyaXB0TW9kZSddPltdO1xuICBjZWxsQ29sb3JPcHRpb25zOiBQYW5lbE9wdGlvbjxTcGF0aWFsVmlld1N0YXRlWydjZWxsQ29sb3JNb2RlJ10+W107XG59XG5cbi8qKiB7QGxpbmsgVGlsZU9wdGlvbnN9IGZvciBgZHNgOiBzaG9ydCBsYWJlbHMsIGNlbGwgc2V0IGZpcnN0LCBcIkJvdGhcIiB3aGVuIHRoZXJlIGFyZSB0d28g4oCUXG4gKiAgYXMgWGVuaXVtIEV4cGxvcmVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVPcHRpb25zKGRzOiBTcGF0aWFsRGF0YXNldCB8IG51bGwpOiBUaWxlT3B0aW9ucyB7XG4gIGNvbnN0IHNldHMgPSBbLi4uKGRzPy5wb2x5Z29uVGlsZXM/LnNldHMgPz8gW10pXS5zb3J0KChhLCBiKSA9PlxuICAgIGEubmFtZSA9PT0gJ2NlbGwnID8gLTEgOiBiLm5hbWUgPT09ICdjZWxsJyA/IDEgOiAwLFxuICApO1xuICBjb25zdCBoYXMgPSAobmFtZTogc3RyaW5nKSA9PiAhIWRzPy5jb2x1bW5zLnNvbWUoKGMpID0+IGMubmFtZSA9PT0gbmFtZSk7XG4gIHJldHVybiB7XG4gICAgY2VsbFNldE9wdGlvbnM6IFtcbiAgICAgIC4uLnNldHMubWFwKChzKSA9PiAoeyBsYWJlbDogcy5sYWJlbC5yZXBsYWNlKC9cXHMqYm91bmRhcih5fGllcykkL2ksICcnKSwgdmFsdWU6IHMubmFtZSB9KSksXG4gICAgICAuLi4oc2V0cy5sZW5ndGggPiAxID8gW3sgbGFiZWw6ICdCb3RoJywgdmFsdWU6ICdib3RoJyB9XSA6IFtdKSxcbiAgICBdLFxuICAgIHRyYW5zY3JpcHRNb2RlT3B0aW9uczogW1xuICAgICAgLi4uKGRzPy50cmFuc2NyaXB0VGlsZXNcbiAgICAgICAgPyBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnUG9pbnRzJywgdmFsdWU6ICdjaXJjbGVzJyBhcyBjb25zdCB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0ljb25zJywgdmFsdWU6ICdnbHlwaHMnIGFzIGNvbnN0IH0sXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihkcz8uZGVuc2l0eSA/IFt7IGxhYmVsOiAnRGVuc2l0eSBNYXAnLCB2YWx1ZTogJ2RlbnNpdHknIGFzIGNvbnN0IH1dIDogW10pLFxuICAgIF0sXG4gICAgY2VsbENvbG9yT3B0aW9uczogW1xuICAgICAgeyBsYWJlbDogJ0dyb3VwIEFmZmlsaWF0aW9uJywgdmFsdWU6ICdncm91cCcgfSxcbiAgICAgIC4uLihkcz8uZmVhdHVyZXMgPyBbeyBsYWJlbDogJ0dlbmUgRXhwcmVzc2lvbicsIHZhbHVlOiAnZ2VuZScgYXMgY29uc3QgfV0gOiBbXSksXG4gICAgICAuLi4oaGFzKCd0cmFuc2NyaXB0X2RlbnNpdHknKVxuICAgICAgICA/IFt7IGxhYmVsOiAnVHJhbnNjcmlwdCBEZW5zaXR5IE1hcCcsIHZhbHVlOiAndHJhbnNjcmlwdERlbnNpdHknIGFzIGNvbnN0IH1dXG4gICAgICAgIDogW10pLFxuICAgICAgeyBsYWJlbDogJ1NpbmdsZSBDb2xvcicsIHZhbHVlOiAnc2luZ2xlJyB9LFxuICAgICAgLi4uKGhhcygnc2VnbWVudGF0aW9uX21ldGhvZCcpID8gW3sgbGFiZWw6ICdTZWdtZW50YXRpb24gTWV0aG9kJywgdmFsdWU6ICdzZWdtZW50YXRpb24nIGFzIGNvbnN0IH1dIDogW10pLFxuICAgIF0sXG4gIH07XG59XG5cbi8qKiBBIHNlY3Rpb24gb2YgdGhlIGdyb3VwIHBpY2tlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBPcHRpb25TZWN0aW9uIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgaXRlbXM6IFBhbmVsT3B0aW9uPHN0cmluZz5bXTtcbn1cblxuLyoqIFRoZSB2YWx1ZSB0aGUgZ3JvdXAgcGlja2VyIHVzZXMgZm9yIGEgZmFtaWx5IG9mIGNvbHVtbnMuICovXG5leHBvcnQgY29uc3QgRkFNSUxZX1BSRUZJWCA9ICdmYW1pbHk6JztcblxuLyoqXG4gKiBUaGUgZ3JvdXAgcGlja2VyOiBjYXRlZ29yaWNhbCBjb2x1bW5zIHVuZGVyIHRoZWlyIHNlY3Rpb24gaGVhZGluZywgYSBmYW1pbHkgb2ZcbiAqIHZhcmlhbnRzIChrLW1lYW5zIGF0IGsgPSAy4oCmMTApIGxpc3RlZCBvbmNlLiBWYWx1ZXMgYXJlIGEgY29sdW1uIG5hbWUsIG9yXG4gKiBgZmFtaWx5OjxpZD5gIGZvciBhIGZhbWlseS4gVGhlIHNlZ21lbnRhdGlvbiBtZXRob2QgaXMgbm90IGEgZ3JvdXBpbmcgb2YgY2VsbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cE9wdGlvbnMoZHM6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCk6IEdyb3VwT3B0aW9uU2VjdGlvbltdIHtcbiAgY29uc3Qgc2VjdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgUGFuZWxPcHRpb248c3RyaW5nPltdPigpO1xuICBjb25zdCBzZWVuRmFtaWxpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBjIG9mIGRzPy5jb2x1bW5zID8/IFtdKSB7XG4gICAgaWYgKGMua2luZCAhPT0gJ2NhdGVnb3JpY2FsJyB8fCBjLm5hbWUgPT09ICdzZWdtZW50YXRpb25fbWV0aG9kJykgY29udGludWU7XG4gICAgY29uc3Qgc2VjdGlvbiA9IGMuc2VjdGlvbiA/PyAnR3JvdXBzJztcbiAgICBjb25zdCBsaXN0ID0gc2VjdGlvbnMuZ2V0KHNlY3Rpb24pID8/IFtdO1xuICAgIGlmIChjLmZhbWlseSkge1xuICAgICAgaWYgKHNlZW5GYW1pbGllcy5oYXMoYy5mYW1pbHkuaWQpKSBjb250aW51ZTtcbiAgICAgIHNlZW5GYW1pbGllcy5hZGQoYy5mYW1pbHkuaWQpO1xuICAgICAgbGlzdC5wdXNoKHsgbGFiZWw6IGMuZmFtaWx5LmxhYmVsLCB2YWx1ZTogYCR7RkFNSUxZX1BSRUZJWH0ke2MuZmFtaWx5LmlkfWAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpc3QucHVzaCh7IGxhYmVsOiBncm91cExhYmVsKGMpLCB2YWx1ZTogYy5uYW1lIH0pO1xuICAgIH1cbiAgICBzZWN0aW9ucy5zZXQoc2VjdGlvbiwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIFsuLi5zZWN0aW9uc10ubWFwKChbbGFiZWwsIGl0ZW1zXSkgPT4gKHsgbGFiZWwsIGl0ZW1zIH0pKTtcbn1cblxuZnVuY3Rpb24gY2F0ZWdvcmljYWxNZXRhKGRzOiBTcGF0aWFsRGF0YXNldCB8IG51bGwsIG5hbWU6IHN0cmluZyB8IG51bGwpOiBDYXRlZ29yaWNhbENvbHVtbk1ldGEgfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXRhID0gbmFtZSA/IGRzPy5jb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gbmFtZSkgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBtZXRhPy5raW5kID09PSAnY2F0ZWdvcmljYWwnID8gbWV0YSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRoZSBncm91cCBwaWNrZXIncyB2YWx1ZSBmb3IgdGhlIGFjdGl2ZSBncm91cCBjb2x1bW46IGl0cyBmYW1pbHkncyBlbnRyeSwgb3IgaXRzZWxmLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwRW50cnlGb3IoZHM6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgY29sdW1uOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGZhbWlseSA9IGNhdGVnb3JpY2FsTWV0YShkcywgY29sdW1uKT8uZmFtaWx5O1xuICByZXR1cm4gZmFtaWx5ID8gYCR7RkFNSUxZX1BSRUZJWH0ke2ZhbWlseS5pZH1gIDogY29sdW1uO1xufVxuXG4vKiogVGhlIGNvbHVtbnMgb2YgZmFtaWx5IGBpZGAsIGluIGRhdGFzZXQgb3JkZXIuICovXG5leHBvcnQgZnVuY3Rpb24gZmFtaWx5TWVtYmVycyhkczogU3BhdGlhbERhdGFzZXQgfCBudWxsLCBpZDogc3RyaW5nKTogQ2F0ZWdvcmljYWxDb2x1bW5NZXRhW10ge1xuICByZXR1cm4gKGRzPy5jb2x1bW5zID8/IFtdKS5maWx0ZXIoXG4gICAgKGMpOiBjIGlzIENhdGVnb3JpY2FsQ29sdW1uTWV0YSA9PiBjLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcgJiYgYy5mYW1pbHk/LmlkID09PSBpZCxcbiAgKTtcbn1cblxuLyoqIFZhcmlhbnRzIG9mIHRoZSBhY3RpdmUgY29sdW1uJ3MgZmFtaWx5IChrID0gMuKApjEwKSwgb3Igbm9uZSB3aGVuIGl0IGhhcyBubyBmYW1pbHkuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBWYXJpYW50T3B0aW9ucyhkczogU3BhdGlhbERhdGFzZXQgfCBudWxsLCBjb2x1bW46IHN0cmluZyB8IG51bGwpOiBQYW5lbE9wdGlvbjxzdHJpbmc+W10ge1xuICBjb25zdCBmYW1pbHkgPSBjYXRlZ29yaWNhbE1ldGEoZHMsIGNvbHVtbik/LmZhbWlseTtcbiAgcmV0dXJuIGZhbWlseSA/IGZhbWlseU1lbWJlcnMoZHMsIGZhbWlseS5pZCkubWFwKChjKSA9PiAoeyBsYWJlbDogYy5mYW1pbHkhLnZhcmlhbnQsIHZhbHVlOiBjLm5hbWUgfSkpIDogW107XG59XG5cbi8qKiBPbmUgcm93IG9mIHRoZSBncm91cHMgbGlzdDogYSBjYXRlZ29yeSB3aXRoIGl0cyBjb2xvdXIgYW5kIGNlbGwgY291bnQuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyb3VwUm93IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgY29sb3I6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuLyoqIEEgZ3JvdXBpbmcncyBjYXRlZ29yaWVzIHdpdGggY29sb3VycyBhbmQgY2VsbCBjb3VudHMsIGxhcmdlc3QgZmlyc3QsIGFuZCB0aGVpciB0b3RhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudEdyb3VwUm93cyh2OiBQaWNrPFNwYXRpYWxDYXRlZ29yaWNhbFZpZXcsICdjYXRlZ29yaWVzJyB8ICdjb2xvcnMnIHwgJ2NvZGVzJz4pOiB7XG4gIHJvd3M6IEdyb3VwUm93W107XG4gIHRvdGFsOiBudW1iZXI7XG59IHtcbiAgY29uc3QgY291bnRzID0gbmV3IFVpbnQzMkFycmF5KHYuY2F0ZWdvcmllcy5sZW5ndGgpO1xuICBmb3IgKGNvbnN0IGMgb2Ygdi5jb2RlcykgaWYgKGMgPCBjb3VudHMubGVuZ3RoKSBjb3VudHNbY10rKztcbiAgY29uc3Qgcm93cyA9IHYuY2F0ZWdvcmllc1xuICAgIC5tYXAoKGxhYmVsLCBpKSA9PiAoeyBsYWJlbCwgY29sb3I6IHYuY29sb3JzW2ldID8/ICcjOTk5JywgY291bnQ6IGNvdW50c1tpXSB9KSlcbiAgICAuc29ydCgoYSwgYikgPT4gYi5jb3VudCAtIGEuY291bnQpO1xuICByZXR1cm4geyByb3dzLCB0b3RhbDogcm93cy5yZWR1Y2UoKG4sIHIpID0+IG4gKyByLmNvdW50LCAwKSB9O1xufVxuXG4vKiogYGxpc3RgIHdpdGggYGl0ZW1zYCByZW1vdmVkIChgb25gKSBvciBhZGRlZCAoYCFvbmApIOKAlCBhIGhpZGRlbi1zZXQgdG9nZ2xlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZUhpZGRlbihsaXN0OiByZWFkb25seSBzdHJpbmdbXSwgaXRlbXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBvbjogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgaGlkZGVuID0gbmV3IFNldChsaXN0KTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgaWYgKG9uKSBoaWRkZW4uZGVsZXRlKGl0ZW0pO1xuICAgIGVsc2UgaGlkZGVuLmFkZChpdGVtKTtcbiAgfVxuICByZXR1cm4gWy4uLmhpZGRlbl07XG59XG5cbi8qKiBPbmUgbm9kZSBvZiB0aGUgc2VsZWN0ZWQtZ2VuZXMgdHJlZTogYSBuYW1lZCBnZW5lIGdyb3VwLCBvciB0aGUgdW5ncm91cGVkIHJlc3QgKGBudWxsYCkuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVUcmVlTm9kZSB7XG4gIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGdlbmVzOiBzdHJpbmdbXTtcbn1cblxuLyoqIFRoZSBzZWxlY3RlZCBnZW5lcyBhcyBFeHBsb3JlcidzIHRyZWU6IG5hbWVkIGdyb3VwcywgdGhlbiB0aGUgdW5ncm91cGVkIG9uZXMuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHZW5lVHJlZShcbiAgc2VsZWN0ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBncm91cHM6IHJlYWRvbmx5IHsgbmFtZTogc3RyaW5nOyBnZW5lczogcmVhZG9ubHkgc3RyaW5nW10gfVtdLFxuKTogR2VuZVRyZWVOb2RlW10ge1xuICBjb25zdCBjaG9zZW4gPSBuZXcgU2V0KHNlbGVjdGVkKTtcbiAgY29uc3QgZ3JvdXBlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBvdXQ6IEdlbmVUcmVlTm9kZVtdID0gW107XG4gIGZvciAoY29uc3QgZyBvZiBncm91cHMpIHtcbiAgICBjb25zdCBnZW5lcyA9IGcuZ2VuZXMuZmlsdGVyKCh4KSA9PiBjaG9zZW4uaGFzKHgpKTtcbiAgICBpZiAoIWdlbmVzLmxlbmd0aCkgY29udGludWU7XG4gICAgZ2VuZXMuZm9yRWFjaCgoeCkgPT4gZ3JvdXBlZC5hZGQoeCkpO1xuICAgIG91dC5wdXNoKHsgbmFtZTogZy5uYW1lLCBnZW5lcyB9KTtcbiAgfVxuICBjb25zdCByZXN0ID0gc2VsZWN0ZWQuZmlsdGVyKCh4KSA9PiAhZ3JvdXBlZC5oYXMoeCkpO1xuICBpZiAocmVzdC5sZW5ndGgpIG91dC5wdXNoKHsgbmFtZTogbnVsbCwgZ2VuZXM6IHJlc3QgfSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBFdmVyeSBjYXRlZ29yaWNhbCBjb2x1bW4gYnV0IHRoZSBzZWdtZW50YXRpb24gbWV0aG9kLCB3aGljaCBzYXlzIG5vdGhpbmcgYWJvdXQgZ2VuZXMuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2VyQ29sdW1uT3B0aW9ucyhjb2x1bW5zOiByZWFkb25seSBTcGF0aWFsQ29sdW1uTWV0YVtdIHwgdW5kZWZpbmVkKTogUGFuZWxPcHRpb248c3RyaW5nPltdIHtcbiAgcmV0dXJuIChjb2x1bW5zID8/IFtdKVxuICAgIC5maWx0ZXIoKGMpOiBjIGlzIENhdGVnb3JpY2FsQ29sdW1uTWV0YSA9PiBjLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcgJiYgYy5uYW1lICE9PSAnc2VnbWVudGF0aW9uX21ldGhvZCcpXG4gICAgLm1hcCgoYykgPT4gKHsgbGFiZWw6IGdyb3VwTGFiZWwoYyksIHZhbHVlOiBjLm5hbWUgfSkpO1xufVxuXG4vKipcbiAqIEVhY2ggcGlja2VkIGNsdXN0ZXIncyBtYXJrZXIgZ2VuZXMgYXMgYSBnZW5lIGdyb3VwIG5hbWVkIGFmdGVyIGl0LiBBIGdlbmUgdGhhdCBtYXJrc1xuICogc2V2ZXJhbCBjbHVzdGVycyBnb2VzIHRvIHRoZSBvbmUgaXQgc2NvcmVzIGhpZ2hlc3QgaW4sIHNvIHRoZSB0cmVlIGxpc3RzIGl0IG9uY2U7XG4gKiBjbHVzdGVycyBsZWZ0IHdpdGggbm8gZ2VuZSBhcmUgZHJvcHBlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlckdlbmVHcm91cHMoXG4gIHJlc3VsdDogUGljazxTcGF0aWFsTWFya2VyR2VuZXMsICdncm91cHMnPixcbiAgcGlja2VkOiBSZWFkb25seVNldDxzdHJpbmc+LFxuKTogeyBuYW1lOiBzdHJpbmc7IGdlbmVzOiBzdHJpbmdbXSB9W10ge1xuICBjb25zdCBiZXN0ID0gbmV3IE1hcDxzdHJpbmcsIHsgZ3JvdXA6IHN0cmluZzsgc2NvcmU6IG51bWJlciB9PigpO1xuICBmb3IgKGNvbnN0IGcgb2YgcmVzdWx0Lmdyb3Vwcykge1xuICAgIGlmICghcGlja2VkLmhhcyhnLm5hbWUpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IGdlbmUgb2YgZy5nZW5lcykge1xuICAgICAgY29uc3QgcHJldiA9IGJlc3QuZ2V0KGdlbmUubmFtZSk7XG4gICAgICBpZiAoIXByZXYgfHwgZ2VuZS5zY29yZSA+IHByZXYuc2NvcmUpIGJlc3Quc2V0KGdlbmUubmFtZSwgeyBncm91cDogZy5uYW1lLCBzY29yZTogZ2VuZS5zY29yZSB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5ncm91cHNcbiAgICAuZmlsdGVyKChnKSA9PiBwaWNrZWQuaGFzKGcubmFtZSkpXG4gICAgLm1hcCgoZykgPT4gKHtcbiAgICAgIG5hbWU6IGcubmFtZSxcbiAgICAgIGdlbmVzOiBnLmdlbmVzLm1hcCgoeCkgPT4geC5uYW1lKS5maWx0ZXIoKG4pID0+IGJlc3QuZ2V0KG4pPy5ncm91cCA9PT0gZy5uYW1lKSxcbiAgICB9KSlcbiAgICAuZmlsdGVyKChnKSA9PiBnLmdlbmVzLmxlbmd0aCk7XG59XG5cbi8qKiBgZ3JvdXBzYCBtZXJnZWQgaW50byB0aGUgdmlldydzIGdlbmUgZ3JvdXBzIChyZXBsYWNpbmcgYW55IG9mIHRoZSBzYW1lIG5hbWUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhHZW5lR3JvdXBzKFxuICB2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICd0cmFuc2NyaXB0R2VuZUdyb3Vwcyc+LFxuICBncm91cHM6IHsgbmFtZTogc3RyaW5nOyBnZW5lczogc3RyaW5nW10gfVtdLFxuKTogU3BhdGlhbFZpZXdTdGF0ZVsndHJhbnNjcmlwdEdlbmVHcm91cHMnXSB7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldChncm91cHMubWFwKChnKSA9PiBnLm5hbWUpKTtcbiAgcmV0dXJuIFsuLi52aWV3LnRyYW5zY3JpcHRHZW5lR3JvdXBzLmZpbHRlcigoZykgPT4gIW5hbWVzLmhhcyhnLm5hbWUpKSwgLi4uZ3JvdXBzXTtcbn1cblxuLyoqXG4gKiBUaGUgcGF0Y2ggdGhhdCBhZGRzIG1hcmtlciBncm91cHM6IHRoZSBncm91cHMsIHRoZWlyIGdlbmVzIGFwcGVuZGVkIHRvIHRoZSBzZWxlY3Rpb24sXG4gKiB0cmFuc2NyaXB0cyBjb2xvdXJlZCBieSBjbHVzdGVyIChhcyB0aGVpciBjZWxscyBhcmUpLCBhbmQgc3dpdGNoZWQgb24gd2hlbiBvZmYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZXJHZW5lc1BhdGNoKFxuICB2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICd0cmFuc2NyaXB0R2VuZUdyb3VwcycgfCAndHJhbnNjcmlwdEdlbmVzJyB8ICd0cmFuc2NyaXB0TW9kZSc+LFxuICBncm91cHM6IHsgbmFtZTogc3RyaW5nOyBnZW5lczogc3RyaW5nW10gfVtdLFxuKTogUGFydGlhbDxTcGF0aWFsVmlld1N0YXRlPiB7XG4gIGNvbnN0IGdlbmVzID0gWy4uLnZpZXcudHJhbnNjcmlwdEdlbmVzXTtcbiAgZm9yIChjb25zdCBnIG9mIGdyb3VwcykgZm9yIChjb25zdCBuIG9mIGcuZ2VuZXMpIGlmICghZ2VuZXMuaW5jbHVkZXMobikpIGdlbmVzLnB1c2gobik7XG4gIHJldHVybiB7XG4gICAgdHJhbnNjcmlwdEdlbmVHcm91cHM6IHdpdGhHZW5lR3JvdXBzKHZpZXcsIGdyb3VwcyksXG4gICAgdHJhbnNjcmlwdEdlbmVzOiBnZW5lcyxcbiAgICB0cmFuc2NyaXB0Q29sb3JCeTogJ2NsdXN0ZXInLFxuICAgIC4uLih2aWV3LnRyYW5zY3JpcHRNb2RlID09PSAnb2ZmJyA/IHsgdHJhbnNjcmlwdE1vZGU6ICdjaXJjbGVzJyBhcyBjb25zdCB9IDoge30pLFxuICB9O1xufVxuXG4vKiogVGhlIHBhdGNoIHRoYXQgaW1wb3J0cyBnZW5lIGdyb3VwczogdGhlIGdyb3VwcywgYW5kIHRoZWlyIGdlbmVzIGFkZGVkIHRvIHRoZSBzZWxlY3Rpb24uICovXG5leHBvcnQgZnVuY3Rpb24gaW1wb3J0R2VuZUdyb3Vwc1BhdGNoKFxuICB2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICd0cmFuc2NyaXB0R2VuZUdyb3VwcycgfCAndHJhbnNjcmlwdEdlbmVzJz4sXG4gIGdyb3VwczogeyBuYW1lOiBzdHJpbmc7IGdlbmVzOiBzdHJpbmdbXSB9W10sXG4pOiBQYXJ0aWFsPFNwYXRpYWxWaWV3U3RhdGU+IHtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2NyaXB0R2VuZUdyb3Vwczogd2l0aEdlbmVHcm91cHModmlldywgZ3JvdXBzKSxcbiAgICB0cmFuc2NyaXB0R2VuZXM6IFsuLi5uZXcgU2V0KFsuLi52aWV3LnRyYW5zY3JpcHRHZW5lcywgLi4uZ3JvdXBzLmZsYXRNYXAoKGcpID0+IGcuZ2VuZXMpXSldLFxuICAgIHRyYW5zY3JpcHRBbGxHZW5lczogZmFsc2UsXG4gIH07XG59XG5cbi8qKiBgbGluZWFyLWdyYWRpZW50KC4uLilgIHNhbXBsaW5nIGBsdXRgIGF0IGBzdGVwcyArIDFgIGV2ZW5seSBzcGFjZWQgc3RvcHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JhZGllbnRDc3MobHV0OiByZWFkb25seSBSZ2JbXSwgc3RlcHMgPSAxNik6IHN0cmluZyB7XG4gIGNvbnN0IHN0b3BzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdGVwczsgaSsrKSB7XG4gICAgY29uc3QgW3IsIGcsIGJdID0gbHV0W01hdGgucm91bmQoKGkgLyBzdGVwcykgKiAobHV0Lmxlbmd0aCAtIDEpKV07XG4gICAgc3RvcHMucHVzaChgcmdiKCR7cn0sJHtnfSwke2J9KSAkeygoaSAvIHN0ZXBzKSAqIDEwMCkudG9GaXhlZCgwKX0lYCk7XG4gIH1cbiAgcmV0dXJuIGBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICR7c3RvcHMuam9pbignLCAnKX0pYDtcbn1cblxuLyoqXG4gKiBUaGUgY29udGludW91cyBjb2xvdXIgYmFyLCByZXNvbHZlZCBleGFjdGx5IHRoZSB3YXkgdGhlIHJlbmRlcmVyIHJlc29sdmVzIGl0cyBjb2xvdXJzIOKAlFxuICogdGhlIHNhbWUgb3ZlcnJpZGUsIHRoZSBzYW1lIGdyZXkgZmFsbGJhY2suIEJ1aWx0IGZyb20gYGx1dEZvcmAgYWxvbmUsIHRoaXMgYmFyIHNob3dlZCBhXG4gKiBibGFjay10by13aGl0ZSByYW1wIHdoaWxlIHRoZSBjYW52YXMgZHJldyBWaXJpZGlzLCB3aGljaCBtYWtlcyB0aGUga2V5IHdvcnNlIHRoYW4gbm9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRpbnVvdXNDb2xvckJhckNzcyhcbiAgY29sb3JtYXA6IHVua25vd24sXG4gIHJldmVyc2U6IGJvb2xlYW4sXG4gIG92ZXJyaWRlOiBDb2xvcm1hcFZhbHVlIHwgbnVsbCxcbik6IHN0cmluZyB7XG4gIHJldHVybiBncmFkaWVudENzcyhzcGF0aWFsQ29udGludW91c0x1dChjb2xvcm1hcCwgcmV2ZXJzZSwgb3ZlcnJpZGUpKTtcbn1cblxuLyoqIFRoZSBkZW5zaXR5IG1hcCdzIGNvbG91ciBiYXI6IGl0cyBvd24gY29sb3JtYXAsIEluZmVybm8gYnkgZGVmYXVsdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZW5zaXR5Q29sb3JCYXJDc3MoY29sb3JtYXA6IFNwYXRpYWxWaWV3U3RhdGVbJ2RlbnNpdHlDb2xvcm1hcCddKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdyYWRpZW50Q3NzKGx1dEZvcihjb2xvcm1hcCA/PyBJTkZFUk5PX0xVVCkpO1xufVxuXG4vKiogVGhlIG1pZGRsZSBvZiBhIHNlY3Rpb24gc3RhY2s6IHdoZXJlIGEgXCJvbmUgc2VjdGlvblwiIHBpY2tlciBvcGVucywgcmF0aGVyIHRoYW4gb24gdGhlXG4gKiAgZmlyc3Qgc2VjdGlvbiwgd2hpY2ggZm9yIGEgYnJhaW4gaXMgYSBuZWFybHkgZW1wdHkgb2xmYWN0b3J5LWJ1bGIgc2xpZGUuICovXG5leHBvcnQgZnVuY3Rpb24gbWlkZGxlU2VjdGlvbihzZWN0aW9uczogQXJyYXlMaWtlPG51bWJlcj4gfCBudWxsKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNlY3Rpb25zID8gTWF0aC5mbG9vcigoc2VjdGlvbnMubGVuZ3RoIC0gMSkgLyAyKSA6IDA7XG59XG5cbi8qKiBcIjEyIG9mIDUzXCIg4oCUIDEtYmFzZWQsIGJlY2F1c2UgdGhlIHNlY3Rpb25zIGFyZSBzbGlkZXMsIG5vdCBhcnJheSBzbG90czsgYCcnYCB3aXRoIG5vbmUuICovXG5leHBvcnQgZnVuY3Rpb24gc2VjdGlvbkxhYmVsKHNlY3Rpb25zOiBBcnJheUxpa2U8bnVtYmVyPiB8IG51bGwsIGF0OiBudW1iZXIgfCBudWxsKTogc3RyaW5nIHtcbiAgY29uc3QgdG90YWwgPSBzZWN0aW9ucz8ubGVuZ3RoID8/IDA7XG4gIGlmICghdG90YWwpIHJldHVybiAnJztcbiAgY29uc3QgaSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRvdGFsIC0gMSwgYXQgPz8gMCkpO1xuICByZXR1cm4gYCR7aSArIDF9IG9mICR7dG90YWx9YDtcbn1cblxuLyoqIFdoeSBcIkFsbCBnZW5lc1wiIGlzIG5vdCBvZmZlcmVkIHlldCwgd2hpbGUgdGhlIHNlcnZlciBidWlsZHMgaXRzIHB5cmFtaWQ7IG51bGwgb3RoZXJ3aXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFsbEdlbmVzUHJlcGFyaW5nTm90ZShkczogU3BhdGlhbERhdGFzZXQgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHN0ID0gZHM/LnRyYW5zY3JpcHRCaW5zU3RhdHVzO1xuICBpZiAoIXN0IHx8IGRzPy50cmFuc2NyaXB0QmlucykgcmV0dXJuIG51bGw7XG4gIGlmIChzdC5zdGF0ZSA9PT0gJ2ZhaWxlZCcpXG4gICAgcmV0dXJuIGBcIkFsbCBnZW5lc1wiIGlzIHVuYXZhaWxhYmxlOiBwcmVwYXJpbmcgaXQgZmFpbGVkICgke3N0Lm1lc3NhZ2UgPz8gJ3Vua25vd24gZXJyb3InfSkuYDtcbiAgY29uc3QgcGN0ID0gc3QudG90YWwgPyBgIOKAlCAke01hdGguZmxvb3IoKDEwMCAqIChzdC5kb25lID8/IDApKSAvIHN0LnRvdGFsKX0lIHdoZW4gdGhpcyBkYXRhc2V0IHdhcyBvcGVuZWRgIDogJyc7XG4gIHJldHVybiBgXCJBbGwgZ2VuZXNcIiBpcyBiZWluZyBwcmVwYXJlZCBvbiB0aGUgc2VydmVyJHtwY3R9OyByZW9wZW4gdGhlIGRhdGFzZXQgb25jZSBpdCBpcyBkb25lLmA7XG59XG4iXX0=
@@ -93,4 +93,4 @@ export function sectionsOf(obs) {
93
93
  memo.set(obs, sections);
94
94
  return sections;
95
95
  }
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLXNlY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVIOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBRXhDOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLEdBQXdCLEVBQ3hCLEdBQUcsR0FBRyxvQkFBb0I7SUFFMUIsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoQixJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXZDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZiw4RUFBOEU7UUFDOUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQUUsU0FBUztRQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1osSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUc7WUFBRSxPQUFPLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNqQyxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDeEMsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxHQUF3QixFQUFFLENBQVM7SUFDdkUsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUMsRUFBRTtRQUFFLE9BQU8sSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbkMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsZ0VBQWdFO0FBQ2hFLE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxFQUE0QyxDQUFDO0FBRXJFOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsR0FBd0I7SUFDakQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLEdBQUcsS0FBSyxTQUFTO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDbEMsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTcGF0aWFsT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5cbi8qKlxuICogVGhlIHBsYW5lcyBhICoqc2VyaWFsbHkgc2VjdGlvbmVkKiogZGF0YXNldCB3YXMgYWN0dWFsbHkgaW1hZ2VkIGF0LlxuICpcbiAqIEEgM0Qgc3BhdGlhbC1vbWljcyBkYXRhc2V0IG9mIHRoaXMga2luZCBpcyBub3QgYSBjbG91ZCB0aGF0IGhhcHBlbnMgdG8gaGF2ZSBhIHo6XG4gKiBpdCBpcyBhIHN0YWNrIG9mIHRoaW4gc2VjdGlvbnMsIGh1bmRyZWRzIG9mIG1pY3JvbnMgYXBhcnQsIGVhY2ggb25lIGEgc2VwYXJhdGVcbiAqIHNsaWRlLiBFdmVyeSBvYnNlcnZhdGlvbiBvbiBhIGdpdmVuIHNsaWRlIHNoYXJlcyB0aGF0IHNsaWRlJ3MgcmVnaXN0ZXJlZCB6XG4gKiBleGFjdGx5LCBzbyB0aGUgZGlzdGluY3QgeiB2YWx1ZXMgQVJFIHRoZSBzZWN0aW9ucyDigJQgbm8gYmlubmluZywgbm8gdG9sZXJhbmNlLFxuICogYW5kIG5vIG5lZWQgZm9yIGEgZGF0YXNldC1zcGVjaWZpYyBzZWN0aW9uLWxhYmVsIGNvbHVtbi5cbiAqXG4gKiBUaGF0IG1hdHRlcnMgZm9yIHRoZSAzRCB2aWV3LCB3aGVyZSB0aGUgY2xvdWQgcmVhZHMgYXMgYSBzdGFjayBvZiBkaXNjcyBhbmQgdGhlXG4gKiBkaXNjcyBoaWRlIHRoZSBkZW5zaXR5IHZvbHVtZXMgZHJhd24gYmV0d2VlbiB0aGVtLiBCZWluZyBhYmxlIHRvIHNob3cgb25lXG4gKiBzZWN0aW9uJ3MgY2VsbHMgYWdhaW5zdCB0aGUgZXN0aW1hdGVkIGZpZWxkIGlzIGhvdyB5b3UgY2hlY2sgdGhlIGVzdGltYXRlIGFnYWluc3RcbiAqIHRoZSBtZWFzdXJlbWVudDsgYmVpbmcgYWJsZSB0byBoaWRlIHRoZW0gaXMgaG93IHlvdSBzZWUgdGhlIGZpZWxkIGF0IGFsbC5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGEgYmlubmluZyBvZiBhIGNvbnRpbnVvdXMgeiAodGhhdCBpc1xuICogYG9ic2VydmF0aW9uc0luU2xpY2VgJ3Mgam9iLCBhZ2FpbnN0IGEgdm9sdW1lJ3Mgdm94ZWwgcGxhbmVzKS4gSWYgdGhlIHogaXNcbiAqIGNvbnRpbnVvdXMgcmF0aGVyIHRoYW4gc2VjdGlvbmVkIHRoZXJlIGFyZSBubyBzZWN0aW9ucyB0byBvZmZlciwgYW5kXG4gKiB7QGxpbmsgc2FtcGxlZFNlY3Rpb25zfSBzYXlzIHNvIGJ5IHJldHVybmluZyBudWxsIHJhdGhlciB0aGFuIGludmVudGluZyBzb21lLlxuICpcbiAqIFB1cmUg4oCUIG5vIEFuZ3VsYXIsIG5vIEdQVSDigJQgbGlrZSBgc3BhdGlhbC1kZW5zaXR5LnRzYCwgYW5kIHRlc3RlZCB0aGUgc2FtZSB3YXkuXG4gKi9cblxuLyoqXG4gKiBEaXN0aW5jdCB6IHZhbHVlcyBiZXlvbmQgd2hpY2ggdGhlIGRhdGEgaXMgdHJlYXRlZCBhcyBjb250aW51b3VzIHJhdGhlciB0aGFuXG4gKiBzZWN0aW9uZWQuIFNlcmlhbCBzZWN0aW9uaW5nIHJ1bnMgdG8gdGVucyBvciBsb3cgaHVuZHJlZHMgb2Ygc2xpZGVzICg1MyBmb3IgdGhlXG4gKiBBQkMgd2hvbGUtYnJhaW4gTUVSRklTSCBhdGxhcyk7IGEgeiB0aGF0IGtlZXBzIHByb2R1Y2luZyBuZXcgdmFsdWVzIGlzIGFcbiAqIG1lYXN1cmVtZW50IGF4aXMsIGFuZCBhIFwicGljayBvbmUgc2VjdGlvblwiIGNvbnRyb2wgb3ZlciBpdCB3b3VsZCBiZSBhIGxpZS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TQU1QTEVEX1NFQ1RJT05TID0gNTEyO1xuXG4vKipcbiAqIFRoZSBkYXRhc2V0J3Mgc2FtcGxlZCBzZWN0aW9uIHBvc2l0aW9ucywgYXNjZW5kaW5nIOKAlCBvciBudWxsIHdoZW4gaXQgaGFzIG5vIHosXG4gKiBubyBvYnNlcnZhdGlvbnMsIG9yIGEgeiB0b28gZmluZWx5IGRpdmlkZWQgdG8gYmUgc2VjdGlvbnMgYXQgYWxsLlxuICpcbiAqIEJhaWxzIG91dCBhcyBzb29uIGFzIHRoZSBkaXN0aW5jdCBjb3VudCBwYXNzZXMgYG1heGAsIHNvIGEgY29udGludW91cyB6IGNvc3RzIG9uZVxuICogcGFydGlhbCBwYXNzIHJhdGhlciB0aGFuIGEgc2V0IHdpdGggb25lIGVudHJ5IHBlciBvYnNlcnZhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbXBsZWRTZWN0aW9ucyhcbiAgb2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICBtYXggPSBNQVhfU0FNUExFRF9TRUNUSU9OUyxcbik6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICBjb25zdCB6ID0gb2JzLno7XG4gIGlmICgheiB8fCBvYnMuY291bnQgPT09IDApIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYnMuY291bnQ7IGkrKykge1xuICAgIGNvbnN0IHYgPSB6W2ldO1xuICAgIC8vIEEgbm9uLWZpbml0ZSB6IHBsYWNlcyBhbiBvYnNlcnZhdGlvbiBvbiBubyBzZWN0aW9uOyBpdCBtdXN0IG5vdCBiZWNvbWUgb25lLlxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHYpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZCh2KTtcbiAgICBpZiAoc2Vlbi5zaXplID4gbWF4KSByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoc2Vlbi5zaXplID09PSAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIEZsb2F0MzJBcnJheS5mcm9tKHNlZW4pLnNvcnQoKTtcbn1cblxuLyoqXG4gKiBJbmRpY2VzIG9mIHRoZSBvYnNlcnZhdGlvbnMgbHlpbmcgb24gb25lIHNhbXBsZWQgc2VjdGlvbi5cbiAqXG4gKiBFeGFjdCBlcXVhbGl0eSBvbiBwdXJwb3NlOiBgemAgY29tZXMgZnJvbSB7QGxpbmsgc2FtcGxlZFNlY3Rpb25zfSwgd2hpY2ggcmVhZCB0aGVcbiAqIHZhbHVlcyBvdXQgb2YgdGhpcyBzYW1lIGFycmF5LCBzbyB0aGUgY29tcGFyaXNvbiBjYW5ub3QgZHJpZnQuIFBhc3NpbmcgYSB6IHRoYXRcbiAqIGlzIG5vdCBvbmUgb2YgdGhlIHNhbXBsZWQgcG9zaXRpb25zIHlpZWxkcyBub3RoaW5nLCB3aGljaCBpcyB0aGUgaG9uZXN0IGFuc3dlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmF0aW9uc0luU2VjdGlvbihvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsIHo6IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgY29uc3QgenMgPSBvYnMuejtcbiAgaWYgKCF6cykgcmV0dXJuIG5ldyBVaW50MzJBcnJheSgwKTtcbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQzMkFycmF5KG9icy5jb3VudCk7XG4gIGxldCBuID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYnMuY291bnQ7IGkrKykge1xuICAgIGlmICh6c1tpXSA9PT0geikgb3V0W24rK10gPSBpO1xuICB9XG4gIHJldHVybiBvdXQuc3ViYXJyYXkoMCwgbik7XG59XG5cbi8qKiBNZW1vaXplZCBwZXIgb2JzZXJ2YXRpb25zIG9iamVjdDsgc2VlIHtAbGluayBzZWN0aW9uc09mfS4gKi9cbmNvbnN0IG1lbW8gPSBuZXcgV2Vha01hcDxTcGF0aWFsT2JzZXJ2YXRpb25zLCBGbG9hdDMyQXJyYXkgfCBudWxsPigpO1xuXG4vKipcbiAqIHtAbGluayBzYW1wbGVkU2VjdGlvbnN9IGZvciBhIGRhdGFzZXQncyBvYnNlcnZhdGlvbnMsIGNvbXB1dGVkIG9uY2UuXG4gKlxuICogQm90aCB0aGUgcmVuZGVyZXIgKHdoaWNoIGZpbHRlcnMgdGhlIGNsb3VkJ3MgZ2VvbWV0cnkgdG8gb25lIHNlY3Rpb24pIGFuZCB0aGVcbiAqIGNvbnRyb2wgcGFuZWwgKHdoaWNoIG9mZmVycyB0aGUgc2VjdGlvbnMgdG8gcGljayBmcm9tKSBuZWVkIHRoaXMgbGlzdCwgYW5kIHRoZVxuICogc2NhbiByZWFkcyB0aGUgeiBvZiB1cCB0byAzLjdNIG9ic2VydmF0aW9ucyDigJQgc28gaXQgaXMgbWVtb2l6ZWQgb24gdGhlXG4gKiBvYnNlcnZhdGlvbnMgb2JqZWN0IGl0c2VsZiByYXRoZXIgdGhhbiBlYWNoIGNhbGxlciBrZWVwaW5nIGl0cyBvd24gY29weSBrZXllZCBieVxuICogYSBkYXRhc2V0IGlkIGl0IGhhcyB0byByZW1lbWJlciB0byBpbnZhbGlkYXRlLiBTdGlsbCByZWZlcmVudGlhbGx5IHRyYW5zcGFyZW50OlxuICogdGhlIHNhbWUgb2JzZXJ2YXRpb25zIGFsd2F5cyBnaXZlIHRoZSBzYW1lIHNlY3Rpb25zLlxuICpcbiAqIERlZmF1bHQgYG1heGAgb25seTsgYSBjYWxsZXIgd2FudGluZyBhIGRpZmZlcmVudCBjYXAgc2hvdWxkIGNhbGxcbiAqIHtAbGluayBzYW1wbGVkU2VjdGlvbnN9IGRpcmVjdGx5IGFuZCBjYWNoZSBpdCBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWN0aW9uc09mKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICBjb25zdCBoaXQgPSBtZW1vLmdldChvYnMpO1xuICBpZiAoaGl0ICE9PSB1bmRlZmluZWQpIHJldHVybiBoaXQ7XG4gIGNvbnN0IHNlY3Rpb25zID0gc2FtcGxlZFNlY3Rpb25zKG9icyk7XG4gIG1lbW8uc2V0KG9icywgc2VjdGlvbnMpO1xuICByZXR1cm4gc2VjdGlvbnM7XG59XG4iXX0=
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLXNlY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVIOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBRXhDOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsR0FBd0IsRUFBRSxHQUFHLEdBQUcsb0JBQW9CO0lBQ2xGLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEIsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUV2QyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsOEVBQThFO1FBQzlFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUFFLFNBQVM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNaLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHO1lBQUUsT0FBTyxJQUFJLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDakMsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3hDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsR0FBd0IsRUFBRSxDQUFTO0lBQ3ZFLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakIsSUFBSSxDQUFDLEVBQUU7UUFBRSxPQUFPLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ25DLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBNEMsQ0FBQztBQUVyRTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLEdBQXdCO0lBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsSUFBSSxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ2xDLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN4QixPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3BhdGlhbE9ic2VydmF0aW9ucyB9IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuXG4vKipcbiAqIFRoZSBwbGFuZXMgYSAqKnNlcmlhbGx5IHNlY3Rpb25lZCoqIGRhdGFzZXQgd2FzIGFjdHVhbGx5IGltYWdlZCBhdC5cbiAqXG4gKiBBIDNEIHNwYXRpYWwtb21pY3MgZGF0YXNldCBvZiB0aGlzIGtpbmQgaXMgbm90IGEgY2xvdWQgdGhhdCBoYXBwZW5zIHRvIGhhdmUgYSB6OlxuICogaXQgaXMgYSBzdGFjayBvZiB0aGluIHNlY3Rpb25zLCBodW5kcmVkcyBvZiBtaWNyb25zIGFwYXJ0LCBlYWNoIG9uZSBhIHNlcGFyYXRlXG4gKiBzbGlkZS4gRXZlcnkgb2JzZXJ2YXRpb24gb24gYSBnaXZlbiBzbGlkZSBzaGFyZXMgdGhhdCBzbGlkZSdzIHJlZ2lzdGVyZWQgelxuICogZXhhY3RseSwgc28gdGhlIGRpc3RpbmN0IHogdmFsdWVzIEFSRSB0aGUgc2VjdGlvbnMg4oCUIG5vIGJpbm5pbmcsIG5vIHRvbGVyYW5jZSxcbiAqIGFuZCBubyBuZWVkIGZvciBhIGRhdGFzZXQtc3BlY2lmaWMgc2VjdGlvbi1sYWJlbCBjb2x1bW4uXG4gKlxuICogVGhhdCBtYXR0ZXJzIGZvciB0aGUgM0Qgdmlldywgd2hlcmUgdGhlIGNsb3VkIHJlYWRzIGFzIGEgc3RhY2sgb2YgZGlzY3MgYW5kIHRoZVxuICogZGlzY3MgaGlkZSB0aGUgZGVuc2l0eSB2b2x1bWVzIGRyYXduIGJldHdlZW4gdGhlbS4gQmVpbmcgYWJsZSB0byBzaG93IG9uZVxuICogc2VjdGlvbidzIGNlbGxzIGFnYWluc3QgdGhlIGVzdGltYXRlZCBmaWVsZCBpcyBob3cgeW91IGNoZWNrIHRoZSBlc3RpbWF0ZSBhZ2FpbnN0XG4gKiB0aGUgbWVhc3VyZW1lbnQ7IGJlaW5nIGFibGUgdG8gaGlkZSB0aGVtIGlzIGhvdyB5b3Ugc2VlIHRoZSBmaWVsZCBhdCBhbGwuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBhIGJpbm5pbmcgb2YgYSBjb250aW51b3VzIHogKHRoYXQgaXNcbiAqIGBvYnNlcnZhdGlvbnNJblNsaWNlYCdzIGpvYiwgYWdhaW5zdCBhIHZvbHVtZSdzIHZveGVsIHBsYW5lcykuIElmIHRoZSB6IGlzXG4gKiBjb250aW51b3VzIHJhdGhlciB0aGFuIHNlY3Rpb25lZCB0aGVyZSBhcmUgbm8gc2VjdGlvbnMgdG8gb2ZmZXIsIGFuZFxuICoge0BsaW5rIHNhbXBsZWRTZWN0aW9uc30gc2F5cyBzbyBieSByZXR1cm5pbmcgbnVsbCByYXRoZXIgdGhhbiBpbnZlbnRpbmcgc29tZS5cbiAqXG4gKiBQdXJlIOKAlCBubyBBbmd1bGFyLCBubyBHUFUg4oCUIGxpa2UgYHNwYXRpYWwtZGVuc2l0eS50c2AsIGFuZCB0ZXN0ZWQgdGhlIHNhbWUgd2F5LlxuICovXG5cbi8qKlxuICogRGlzdGluY3QgeiB2YWx1ZXMgYmV5b25kIHdoaWNoIHRoZSBkYXRhIGlzIHRyZWF0ZWQgYXMgY29udGludW91cyByYXRoZXIgdGhhblxuICogc2VjdGlvbmVkLiBTZXJpYWwgc2VjdGlvbmluZyBydW5zIHRvIHRlbnMgb3IgbG93IGh1bmRyZWRzIG9mIHNsaWRlcyAoNTMgZm9yIHRoZVxuICogQUJDIHdob2xlLWJyYWluIE1FUkZJU0ggYXRsYXMpOyBhIHogdGhhdCBrZWVwcyBwcm9kdWNpbmcgbmV3IHZhbHVlcyBpcyBhXG4gKiBtZWFzdXJlbWVudCBheGlzLCBhbmQgYSBcInBpY2sgb25lIHNlY3Rpb25cIiBjb250cm9sIG92ZXIgaXQgd291bGQgYmUgYSBsaWUuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfU0FNUExFRF9TRUNUSU9OUyA9IDUxMjtcblxuLyoqXG4gKiBUaGUgZGF0YXNldCdzIHNhbXBsZWQgc2VjdGlvbiBwb3NpdGlvbnMsIGFzY2VuZGluZyDigJQgb3IgbnVsbCB3aGVuIGl0IGhhcyBubyB6LFxuICogbm8gb2JzZXJ2YXRpb25zLCBvciBhIHogdG9vIGZpbmVseSBkaXZpZGVkIHRvIGJlIHNlY3Rpb25zIGF0IGFsbC5cbiAqXG4gKiBCYWlscyBvdXQgYXMgc29vbiBhcyB0aGUgZGlzdGluY3QgY291bnQgcGFzc2VzIGBtYXhgLCBzbyBhIGNvbnRpbnVvdXMgeiBjb3N0cyBvbmVcbiAqIHBhcnRpYWwgcGFzcyByYXRoZXIgdGhhbiBhIHNldCB3aXRoIG9uZSBlbnRyeSBwZXIgb2JzZXJ2YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW1wbGVkU2VjdGlvbnMob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCBtYXggPSBNQVhfU0FNUExFRF9TRUNUSU9OUyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICBjb25zdCB6ID0gb2JzLno7XG4gIGlmICgheiB8fCBvYnMuY291bnQgPT09IDApIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYnMuY291bnQ7IGkrKykge1xuICAgIGNvbnN0IHYgPSB6W2ldO1xuICAgIC8vIEEgbm9uLWZpbml0ZSB6IHBsYWNlcyBhbiBvYnNlcnZhdGlvbiBvbiBubyBzZWN0aW9uOyBpdCBtdXN0IG5vdCBiZWNvbWUgb25lLlxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHYpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZCh2KTtcbiAgICBpZiAoc2Vlbi5zaXplID4gbWF4KSByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoc2Vlbi5zaXplID09PSAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIEZsb2F0MzJBcnJheS5mcm9tKHNlZW4pLnNvcnQoKTtcbn1cblxuLyoqXG4gKiBJbmRpY2VzIG9mIHRoZSBvYnNlcnZhdGlvbnMgbHlpbmcgb24gb25lIHNhbXBsZWQgc2VjdGlvbi5cbiAqXG4gKiBFeGFjdCBlcXVhbGl0eSBvbiBwdXJwb3NlOiBgemAgY29tZXMgZnJvbSB7QGxpbmsgc2FtcGxlZFNlY3Rpb25zfSwgd2hpY2ggcmVhZCB0aGVcbiAqIHZhbHVlcyBvdXQgb2YgdGhpcyBzYW1lIGFycmF5LCBzbyB0aGUgY29tcGFyaXNvbiBjYW5ub3QgZHJpZnQuIFBhc3NpbmcgYSB6IHRoYXRcbiAqIGlzIG5vdCBvbmUgb2YgdGhlIHNhbXBsZWQgcG9zaXRpb25zIHlpZWxkcyBub3RoaW5nLCB3aGljaCBpcyB0aGUgaG9uZXN0IGFuc3dlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmF0aW9uc0luU2VjdGlvbihvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsIHo6IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgY29uc3QgenMgPSBvYnMuejtcbiAgaWYgKCF6cykgcmV0dXJuIG5ldyBVaW50MzJBcnJheSgwKTtcbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQzMkFycmF5KG9icy5jb3VudCk7XG4gIGxldCBuID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYnMuY291bnQ7IGkrKykge1xuICAgIGlmICh6c1tpXSA9PT0geikgb3V0W24rK10gPSBpO1xuICB9XG4gIHJldHVybiBvdXQuc3ViYXJyYXkoMCwgbik7XG59XG5cbi8qKiBNZW1vaXplZCBwZXIgb2JzZXJ2YXRpb25zIG9iamVjdDsgc2VlIHtAbGluayBzZWN0aW9uc09mfS4gKi9cbmNvbnN0IG1lbW8gPSBuZXcgV2Vha01hcDxTcGF0aWFsT2JzZXJ2YXRpb25zLCBGbG9hdDMyQXJyYXkgfCBudWxsPigpO1xuXG4vKipcbiAqIHtAbGluayBzYW1wbGVkU2VjdGlvbnN9IGZvciBhIGRhdGFzZXQncyBvYnNlcnZhdGlvbnMsIGNvbXB1dGVkIG9uY2UuXG4gKlxuICogQm90aCB0aGUgcmVuZGVyZXIgKHdoaWNoIGZpbHRlcnMgdGhlIGNsb3VkJ3MgZ2VvbWV0cnkgdG8gb25lIHNlY3Rpb24pIGFuZCB0aGVcbiAqIGNvbnRyb2wgcGFuZWwgKHdoaWNoIG9mZmVycyB0aGUgc2VjdGlvbnMgdG8gcGljayBmcm9tKSBuZWVkIHRoaXMgbGlzdCwgYW5kIHRoZVxuICogc2NhbiByZWFkcyB0aGUgeiBvZiB1cCB0byAzLjdNIG9ic2VydmF0aW9ucyDigJQgc28gaXQgaXMgbWVtb2l6ZWQgb24gdGhlXG4gKiBvYnNlcnZhdGlvbnMgb2JqZWN0IGl0c2VsZiByYXRoZXIgdGhhbiBlYWNoIGNhbGxlciBrZWVwaW5nIGl0cyBvd24gY29weSBrZXllZCBieVxuICogYSBkYXRhc2V0IGlkIGl0IGhhcyB0byByZW1lbWJlciB0byBpbnZhbGlkYXRlLiBTdGlsbCByZWZlcmVudGlhbGx5IHRyYW5zcGFyZW50OlxuICogdGhlIHNhbWUgb2JzZXJ2YXRpb25zIGFsd2F5cyBnaXZlIHRoZSBzYW1lIHNlY3Rpb25zLlxuICpcbiAqIERlZmF1bHQgYG1heGAgb25seTsgYSBjYWxsZXIgd2FudGluZyBhIGRpZmZlcmVudCBjYXAgc2hvdWxkIGNhbGxcbiAqIHtAbGluayBzYW1wbGVkU2VjdGlvbnN9IGRpcmVjdGx5IGFuZCBjYWNoZSBpdCBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWN0aW9uc09mKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICBjb25zdCBoaXQgPSBtZW1vLmdldChvYnMpO1xuICBpZiAoaGl0ICE9PSB1bmRlZmluZWQpIHJldHVybiBoaXQ7XG4gIGNvbnN0IHNlY3Rpb25zID0gc2FtcGxlZFNlY3Rpb25zKG9icyk7XG4gIG1lbW8uc2V0KG9icywgc2VjdGlvbnMpO1xuICByZXR1cm4gc2VjdGlvbnM7XG59XG4iXX0=