@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
@@ -1,27 +1,43 @@
1
+ import { LruCache } from 'napari-js';
1
2
  import * as ort from 'onnxruntime-web';
2
3
  import { fetchModel, runEncoder, runDecoder } from './sam-onnx-core';
3
4
  import { getOrtWasmBase } from './ort-runtime-config';
5
+ import { PendingCalls } from './pending-calls';
6
+ /**
7
+ * onnxruntime-web implementation of {@link ISamSession} (jit-ui#90), with two
8
+ * execution modes chosen per model:
9
+ *
10
+ * - **in-process** (main thread) — for small WASM models flagged `inProcess`
11
+ * (e.g. micro-sam ViT-T). Fast load + inference with no Web Worker spawn /
12
+ * second ORT runtime / message round-trips; the brief encode runs on the main
13
+ * thread (fine for a tiny model).
14
+ * - **worker** — for WebGPU models (e.g. ViT-B, patho-sam fp16) whose heavy
15
+ * encode would otherwise freeze the tab. Runs in {@link ./onnx-sam.worker} so
16
+ * the UI stays responsive (the spinner animates).
17
+ *
18
+ * Both modes share their inference math via {@link ./sam-onnx-core}. Lazy-imported
19
+ * by the SAM tools so onnxruntime-web / the worker never load in unit tests or
20
+ * the initial bundle.
21
+ */
4
22
  export class OnnxSamSession {
5
23
  constructor() {
6
24
  this.mode = null;
7
25
  this.loaded = false;
8
- this.model = null;
9
26
  this.inputSize = 1024;
10
27
  // ── worker mode ──
11
28
  this.worker = null;
12
- this.seq = 0;
13
- this.pending = new Map();
29
+ this.calls = new PendingCalls();
14
30
  // ── in-process mode ──
15
31
  this.encoder = null;
16
32
  this.decoder = null;
17
33
  this.nextToken = 1;
18
- this.embeddings = new Map();
34
+ /** The few most recently used embeddings, by token (one per recently viewed image). */
35
+ this.embeddings = new LruCache(3);
19
36
  }
20
37
  async loadModel(model, onProgress) {
21
38
  if (!model.encoderUrl || !model.decoderUrl) {
22
39
  throw new Error(`SAM model "${model.id}" has no ONNX URLs configured.`);
23
40
  }
24
- this.model = model;
25
41
  this.inputSize = model.inputSize;
26
42
  const hasGpu = typeof navigator !== 'undefined' && 'gpu' in navigator;
27
43
  const eps = model.encoderProviders ?? (hasGpu ? ['webgpu', 'wasm'] : ['wasm']);
@@ -31,8 +47,8 @@ export class OnnxSamSession {
31
47
  this.mode = !usesWebGpu && model.inProcess ? 'inproc' : 'worker';
32
48
  if (this.mode === 'inproc') {
33
49
  ort.env.wasm.wasmPaths = getOrtWasmBase();
34
- const encBuf = await fetchModel(model.encoderUrl, onProgress);
35
- const decBuf = await fetchModel(model.decoderUrl);
50
+ const encBuf = await fetchModel(model.encoderUrl, onProgress, model.revision);
51
+ const decBuf = await fetchModel(model.decoderUrl, undefined, model.revision);
36
52
  this.encoder = await ort.InferenceSession.create(encBuf, { executionProviders: eps });
37
53
  this.decoder = await ort.InferenceSession.create(decBuf, { executionProviders: ['wasm'] });
38
54
  }
@@ -41,6 +57,7 @@ export class OnnxSamSession {
41
57
  type: 'load',
42
58
  encoderUrl: model.encoderUrl,
43
59
  decoderUrl: model.decoderUrl,
60
+ revision: model.revision,
44
61
  wasmPaths: getOrtWasmBase(),
45
62
  inputSize: model.inputSize,
46
63
  encoderProviders: model.encoderProviders,
@@ -56,19 +73,25 @@ export class OnnxSamSession {
56
73
  const e = await runEncoder(this.encoder, image.data, image.width, image.height, this.inputSize);
57
74
  const token = this.nextToken++;
58
75
  this.embeddings.set(token, e);
59
- if (this.embeddings.size > 3)
60
- this.embeddings.delete(this.embeddings.keys().next().value);
61
76
  return {
62
- data: new Float32Array(0), dims: e.dims, scale: e.scale,
63
- imageWidth: e.imageWidth, imageHeight: e.imageHeight, token,
77
+ data: new Float32Array(0),
78
+ dims: e.dims,
79
+ scale: e.scale,
80
+ imageWidth: e.imageWidth,
81
+ imageHeight: e.imageHeight,
82
+ token,
64
83
  };
65
84
  }
66
85
  // worker: transfer the RGBA buffer (callers pass a fresh frame buffer).
67
86
  const buffer = image.data.buffer;
68
87
  const res = await this.call({ type: 'embed', width: image.width, height: image.height, buffer }, [buffer]);
69
88
  return {
70
- data: new Float32Array(0), dims: res.dims, scale: res.scale,
71
- imageWidth: res.imageWidth, imageHeight: res.imageHeight, token: res.token,
89
+ data: new Float32Array(0),
90
+ dims: res['dims'],
91
+ scale: res['scale'],
92
+ imageWidth: res['imageWidth'],
93
+ imageHeight: res['imageHeight'],
94
+ token: res['token'],
72
95
  };
73
96
  }
74
97
  async decode(embedding, prompt) {
@@ -79,12 +102,17 @@ export class OnnxSamSession {
79
102
  return runDecoder(this.decoder, e, prompt);
80
103
  }
81
104
  const res = await this.call({ type: 'decode', token: embedding.token, prompt });
82
- return { mask: new Uint8Array(res.buffer), width: res.width, height: res.height, iou: res.iou };
105
+ return {
106
+ mask: new Uint8Array(res['buffer']),
107
+ width: res['width'],
108
+ height: res['height'],
109
+ iou: res['iou'],
110
+ };
83
111
  }
112
+ /** Release the worker / ORT sessions. Calls still in flight reject (RT-8), so
113
+ * their callers' `finally` blocks run (e.g. a tool's busy flag clears). */
84
114
  dispose() {
85
- this.worker?.terminate();
86
- this.worker = null;
87
- this.pending.clear();
115
+ this.dropWorker(new Error('SAM session disposed'));
88
116
  this.encoder?.release?.();
89
117
  this.decoder?.release?.();
90
118
  this.encoder = this.decoder = null;
@@ -97,37 +125,28 @@ export class OnnxSamSession {
97
125
  if (this.worker)
98
126
  return this.worker;
99
127
  const worker = new Worker(new URL('./onnx-sam.worker', import.meta.url), { type: 'module' });
100
- worker.onmessage = (ev) => {
101
- const m = ev.data;
102
- const p = this.pending.get(m.id);
103
- if (!p)
104
- return;
105
- if (m.type === 'progress') {
106
- p.onProgress?.(m.fraction);
107
- return;
108
- }
109
- this.pending.delete(m.id);
110
- if (m.type === 'error')
111
- p.reject(new Error(m.error));
112
- else
113
- p.resolve(m);
114
- };
128
+ worker.onmessage = (ev) => this.calls.handle(ev.data);
115
129
  worker.onerror = (ev) => {
116
- const err = new Error(ev.message || 'SAM worker crashed.');
117
- for (const p of this.pending.values())
118
- p.reject(err);
119
- this.pending.clear();
130
+ // A crashed worker can't serve the loaded model any more: drop it, so the
131
+ // next run reloads instead of posting to a dead worker.
132
+ this.dropWorker(new Error(ev.message || 'SAM worker crashed.'));
133
+ this.loaded = false;
134
+ this.mode = null;
120
135
  };
121
136
  this.worker = worker;
122
137
  return worker;
123
138
  }
139
+ /** Terminate the worker (if any) and reject every call still waiting on it. */
140
+ dropWorker(err) {
141
+ this.worker?.terminate();
142
+ this.worker = null;
143
+ this.calls.rejectAll(err);
144
+ }
124
145
  call(msg, transfer = [], onProgress) {
125
- const id = ++this.seq;
126
146
  const worker = this.ensureWorker();
127
- return new Promise((resolve, reject) => {
128
- this.pending.set(id, { resolve, reject, onProgress });
129
- worker.postMessage({ ...msg, id }, transfer);
130
- });
147
+ const { id, promise } = this.calls.open(onProgress);
148
+ worker.postMessage({ ...msg, id }, transfer);
149
+ return promise;
131
150
  }
132
151
  }
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25ueC1zYW0tc2Vzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vb25ueC1zYW0tc2Vzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLGlCQUFpQixDQUFDO0FBS3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUF3QnRELE1BQU0sT0FBTyxjQUFjO0lBQTNCO1FBQ1UsU0FBSSxHQUErQixJQUFJLENBQUM7UUFDeEMsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLFVBQUssR0FBdUIsSUFBSSxDQUFDO1FBQ2pDLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFFekIsb0JBQW9CO1FBQ1osV0FBTSxHQUFrQixJQUFJLENBQUM7UUFDN0IsUUFBRyxHQUFHLENBQUMsQ0FBQztRQUNDLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztRQUV0RCx3QkFBd0I7UUFDaEIsWUFBTyxHQUFnQyxJQUFJLENBQUM7UUFDNUMsWUFBTyxHQUFnQyxJQUFJLENBQUM7UUFDNUMsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNMLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztJQThHakUsQ0FBQztJQTVHQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQWtCLEVBQUUsVUFBdUM7UUFDekUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLEtBQUssQ0FBQyxFQUFFLGdDQUFnQyxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25C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SSxDQUFDLEdBQVEsRUFBRSxXQUEyQixFQUFFLEVBQUUsVUFBZ0M7UUFDcEYsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNuQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN0RCxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBvcnQgZnJvbSAnb25ueHJ1bnRpbWUtd2ViJztcblxuaW1wb3J0IHtcbiAgSVNhbVNlc3Npb24sIFNhbUVtYmVkZGluZywgU2FtTWFza1Jlc3VsdCwgU2FtTW9kZWxEZWYsIFNhbVByb21wdCxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NhbS5jb250cmFjdCc7XG5pbXBvcnQgeyBmZXRjaE1vZGVsLCBydW5FbmNvZGVyLCBydW5EZWNvZGVyLCB0eXBlIENvcmVFbWJlZGRpbmcgfSBmcm9tICcuL3NhbS1vbm54LWNvcmUnO1xuaW1wb3J0IHsgZ2V0T3J0V2FzbUJhc2UgfSBmcm9tICcuL29ydC1ydW50aW1lLWNvbmZpZyc7XG5cbi8qKlxuICogb25ueHJ1bnRpbWUtd2ViIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJU2FtU2Vzc2lvbn0gKGppdC11aSM5MCksIHdpdGggdHdvXG4gKiBleGVjdXRpb24gbW9kZXMgY2hvc2VuIHBlciBtb2RlbDpcbiAqXG4gKiAgLSAqKmluLXByb2Nlc3MqKiAobWFpbiB0aHJlYWQpIOKAlCBmb3Igc21hbGwgV0FTTSBtb2RlbHMgZmxhZ2dlZCBgaW5Qcm9jZXNzYFxuICogICAgKGUuZy4gbWljcm8tc2FtIFZpVC1UKS4gRmFzdCBsb2FkICsgaW5mZXJlbmNlIHdpdGggbm8gV2ViIFdvcmtlciBzcGF3biAvXG4gKiAgICBzZWNvbmQgT1JUIHJ1bnRpbWUgLyBtZXNzYWdlIHJvdW5kLXRyaXBzOyB0aGUgYnJpZWYgZW5jb2RlIHJ1bnMgb24gdGhlIG1haW5cbiAqICAgIHRocmVhZCAoZmluZSBmb3IgYSB0aW55IG1vZGVsKS5cbiAqICAtICoqd29ya2VyKiog4oCUIGZvciBXZWJHUFUgbW9kZWxzIChlLmcuIFZpVC1CLCBwYXRoby1zYW0gZnAxNikgd2hvc2UgaGVhdnlcbiAqICAgIGVuY29kZSB3b3VsZCBvdGhlcndpc2UgZnJlZXplIHRoZSB0YWIuIFJ1bnMgaW4ge0BsaW5rIC4vb25ueC1zYW0ud29ya2VyfSBzb1xuICogICAgdGhlIFVJIHN0YXlzIHJlc3BvbnNpdmUgKHRoZSBzcGlubmVyIGFuaW1hdGVzKS5cbiAqXG4gKiBCb3RoIG1vZGVzIHNoYXJlIHRoZWlyIGluZmVyZW5jZSBtYXRoIHZpYSB7QGxpbmsgLi9zYW0tb25ueC1jb3JlfS4gTGF6eS1pbXBvcnRlZFxuICogYnkgdGhlIFNBTSB0b29scyBzbyBvbm54cnVudGltZS13ZWIgLyB0aGUgd29ya2VyIG5ldmVyIGxvYWQgaW4gdW5pdCB0ZXN0cyBvclxuICogdGhlIGluaXRpYWwgYnVuZGxlLlxuICovXG50eXBlIFBlbmRpbmcgPSB7XG4gIHJlc29sdmU6IChtc2c6IGFueSkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcbiAgb25Qcm9ncmVzcz86IChmcmFjdGlvbjogbnVtYmVyKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGNsYXNzIE9ubnhTYW1TZXNzaW9uIGltcGxlbWVudHMgSVNhbVNlc3Npb24ge1xuICBwcml2YXRlIG1vZGU6ICdpbnByb2MnIHwgJ3dvcmtlcicgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2FkZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBtb2RlbDogU2FtTW9kZWxEZWYgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpbnB1dFNpemUgPSAxMDI0O1xuXG4gIC8vIOKUgOKUgCB3b3JrZXIgbW9kZSDilIDilIBcbiAgcHJpdmF0ZSB3b3JrZXI6IFdvcmtlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlcSA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZyA9IG5ldyBNYXA8bnVtYmVyLCBQZW5kaW5nPigpO1xuXG4gIC8vIOKUgOKUgCBpbi1wcm9jZXNzIG1vZGUg4pSA4pSAXG4gIHByaXZhdGUgZW5jb2Rlcjogb3J0LkluZmVyZW5jZVNlc3Npb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZWNvZGVyOiBvcnQuSW5mZXJlbmNlU2Vzc2lvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG5leHRUb2tlbiA9IDE7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW1iZWRkaW5ncyA9IG5ldyBNYXA8bnVtYmVyLCBDb3JlRW1iZWRkaW5nPigpO1xuXG4gIGFzeW5jIGxvYWRNb2RlbChtb2RlbDogU2FtTW9kZWxEZWYsIG9uUHJvZ3Jlc3M/OiAoZnJhY3Rpb246IG51bWJlcikgPT4gdm9pZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghbW9kZWwuZW5jb2RlclVybCB8fCAhbW9kZWwuZGVjb2RlclVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTQU0gbW9kZWwgXCIke21vZGVsLmlkfVwiIGhhcyBubyBPTk5YIFVSTHMgY29uZmlndXJlZC5gKTtcbiAgICB9XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuaW5wdXRTaXplID0gbW9kZWwuaW5wdXRTaXplO1xuICAgIGNvbnN0IGhhc0dwdSA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmICdncHUnIGluIG5hdmlnYXRvcjtcbiAgICBjb25zdCBlcHM6IHN0cmluZ1tdID0gbW9kZWwuZW5jb2RlclByb3ZpZGVycyA/PyAoaGFzR3B1ID8gWyd3ZWJncHUnLCAnd2FzbSddIDogWyd3YXNtJ10pO1xuICAgIGNvbnN0IHVzZXNXZWJHcHUgPSBlcHMuaW5jbHVkZXMoJ3dlYmdwdScpO1xuICAgIC8vIFdlYkdQVSBtdXN0IHJ1biBpbiB0aGUgd29ya2VyIChlbHNlIGl0IGZyZWV6ZXMgdGhlIG1haW4gdGhyZWFkKTsgc21hbGxcbiAgICAvLyBXQVNNIG1vZGVscyBvcHQgaW50byB0aGUgZmFzdGVyIGluLXByb2Nlc3MgcGF0aCB2aWEgYGluUHJvY2Vzc2AuXG4gICAgdGhpcy5tb2RlID0gIXVzZXNXZWJHcHUgJiYgbW9kZWwuaW5Qcm9jZXNzID8gJ2lucHJvYycgOiAnd29ya2VyJztcblxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdpbnByb2MnKSB7XG4gICAgICBvcnQuZW52Lndhc20ud2FzbVBhdGhzID0gZ2V0T3J0V2FzbUJhc2UoKTtcbiAgICAgIGNvbnN0IGVuY0J1ZiA9IGF3YWl0IGZldGNoTW9kZWwobW9kZWwuZW5jb2RlclVybCwgb25Qcm9ncmVzcyk7XG4gICAgICBjb25zdCBkZWNCdWYgPSBhd2FpdCBmZXRjaE1vZGVsKG1vZGVsLmRlY29kZXJVcmwpO1xuICAgICAgdGhpcy5lbmNvZGVyID0gYXdhaXQgb3J0LkluZmVyZW5jZVNlc3Npb24uY3JlYXRlKGVuY0J1ZiwgeyBleGVjdXRpb25Qcm92aWRlcnM6IGVwcyB9KTtcbiAgICAgIHRoaXMuZGVjb2RlciA9IGF3YWl0IG9ydC5JbmZlcmVuY2VTZXNzaW9uLmNyZWF0ZShkZWNCdWYsIHsgZXhlY3V0aW9uUHJvdmlkZXJzOiBbJ3dhc20nXSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsKHtcbiAgICAgICAgdHlwZTogJ2xvYWQnLFxuICAgICAgICBlbmNvZGVyVXJsOiBtb2RlbC5lbmNvZGVyVXJsLFxuICAgICAgICBkZWNvZGVyVXJsOiBtb2RlbC5kZWNvZGVyVXJsLFxuICAgICAgICB3YXNtUGF0aHM6IGdldE9ydFdhc21CYXNlKCksXG4gICAgICAgIGlucHV0U2l6ZTogbW9kZWwuaW5wdXRTaXplLFxuICAgICAgICBlbmNvZGVyUHJvdmlkZXJzOiBtb2RlbC5lbmNvZGVyUHJvdmlkZXJzLFxuICAgICAgfSwgW10sIG9uUHJvZ3Jlc3MpO1xuICAgIH1cbiAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gIH1cblxuICBpc0xvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkZWQ7XG4gIH1cblxuICBhc3luYyBlbWJlZChpbWFnZTogeyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSk6IFByb21pc2U8U2FtRW1iZWRkaW5nPiB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2lucHJvYycpIHtcbiAgICAgIGNvbnN0IGUgPSBhd2FpdCBydW5FbmNvZGVyKHRoaXMuZW5jb2RlciEsIGltYWdlLmRhdGEsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIHRoaXMuaW5wdXRTaXplKTtcbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5uZXh0VG9rZW4rKztcbiAgICAgIHRoaXMuZW1iZWRkaW5ncy5zZXQodG9rZW4sIGUpO1xuICAgICAgaWYgKHRoaXMuZW1iZWRkaW5ncy5zaXplID4gMykgdGhpcy5lbWJlZGRpbmdzLmRlbGV0ZSh0aGlzLmVtYmVkZGluZ3Mua2V5cygpLm5leHQoKS52YWx1ZSBhcyBudW1iZXIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogbmV3IEZsb2F0MzJBcnJheSgwKSwgZGltczogZS5kaW1zLCBzY2FsZTogZS5zY2FsZSxcbiAgICAgICAgaW1hZ2VXaWR0aDogZS5pbWFnZVdpZHRoLCBpbWFnZUhlaWdodDogZS5pbWFnZUhlaWdodCwgdG9rZW4sXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyB3b3JrZXI6IHRyYW5zZmVyIHRoZSBSR0JBIGJ1ZmZlciAoY2FsbGVycyBwYXNzIGEgZnJlc2ggZnJhbWUgYnVmZmVyKS5cbiAgICBjb25zdCBidWZmZXIgPSBpbWFnZS5kYXRhLmJ1ZmZlcjtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNhbGwoeyB0eXBlOiAnZW1iZWQnLCB3aWR0aDogaW1hZ2Uud2lkdGgsIGhlaWdodDogaW1hZ2UuaGVpZ2h0LCBidWZmZXIgfSwgW2J1ZmZlcl0pO1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBuZXcgRmxvYXQzMkFycmF5KDApLCBkaW1zOiByZXMuZGltcywgc2NhbGU6IHJlcy5zY2FsZSxcbiAgICAgIGltYWdlV2lkdGg6IHJlcy5pbWFnZVdpZHRoLCBpbWFnZUhlaWdodDogcmVzLmltYWdlSGVpZ2h0LCB0b2tlbjogcmVzLnRva2VuLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWNvZGUoZW1iZWRkaW5nOiBTYW1FbWJlZGRpbmcsIHByb21wdDogU2FtUHJvbXB0KTogUHJvbWlzZTxTYW1NYXNrUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2lucHJvYycpIHtcbiAgICAgIGNvbnN0IGUgPSB0aGlzLmVtYmVkZGluZ3MuZ2V0KGVtYmVkZGluZy50b2tlbiBhcyBudW1iZXIpO1xuICAgICAgaWYgKCFlKSB0aHJvdyBuZXcgRXJyb3IoJ1NBTSBlbWJlZGRpbmcgZXhwaXJlZDsgcmUtZW5jb2RlIHRoZSBpbWFnZS4nKTtcbiAgICAgIHJldHVybiBydW5EZWNvZGVyKHRoaXMuZGVjb2RlciEsIGUsIHByb21wdCk7XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2FsbCh7IHR5cGU6ICdkZWNvZGUnLCB0b2tlbjogZW1iZWRkaW5nLnRva2VuLCBwcm9tcHQgfSk7XG4gICAgcmV0dXJuIHsgbWFzazogbmV3IFVpbnQ4QXJyYXkocmVzLmJ1ZmZlciksIHdpZHRoOiByZXMud2lkdGgsIGhlaWdodDogcmVzLmhlaWdodCwgaW91OiByZXMuaW91IH07XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMud29ya2VyPy50ZXJtaW5hdGUoKTtcbiAgICB0aGlzLndvcmtlciA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nLmNsZWFyKCk7XG4gICAgdGhpcy5lbmNvZGVyPy5yZWxlYXNlPy4oKTtcbiAgICB0aGlzLmRlY29kZXI/LnJlbGVhc2U/LigpO1xuICAgIHRoaXMuZW5jb2RlciA9IHRoaXMuZGVjb2RlciA9IG51bGw7XG4gICAgdGhpcy5lbWJlZGRpbmdzLmNsZWFyKCk7XG4gICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm1vZGUgPSBudWxsO1xuICB9XG5cbiAgLy8g4pSA4pSAIHdvcmtlciBwbHVtYmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcHJpdmF0ZSBlbnN1cmVXb3JrZXIoKTogV29ya2VyIHtcbiAgICBpZiAodGhpcy53b3JrZXIpIHJldHVybiB0aGlzLndvcmtlcjtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKG5ldyBVUkwoJy4vb25ueC1zYW0ud29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSwgeyB0eXBlOiAnbW9kdWxlJyB9KTtcbiAgICB3b3JrZXIub25tZXNzYWdlID0gKGV2OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IG0gPSBldi5kYXRhO1xuICAgICAgY29uc3QgcCA9IHRoaXMucGVuZGluZy5nZXQobS5pZCk7XG4gICAgICBpZiAoIXApIHJldHVybjtcbiAgICAgIGlmIChtLnR5cGUgPT09ICdwcm9ncmVzcycpIHsgcC5vblByb2dyZXNzPy4obS5mcmFjdGlvbik7IHJldHVybjsgfVxuICAgICAgdGhpcy5wZW5kaW5nLmRlbGV0ZShtLmlkKTtcbiAgICAgIGlmIChtLnR5cGUgPT09ICdlcnJvcicpIHAucmVqZWN0KG5ldyBFcnJvcihtLmVycm9yKSk7XG4gICAgICBlbHNlIHAucmVzb2x2ZShtKTtcbiAgICB9O1xuICAgIHdvcmtlci5vbmVycm9yID0gKGV2OiBFcnJvckV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoZXYubWVzc2FnZSB8fCAnU0FNIHdvcmtlciBjcmFzaGVkLicpO1xuICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXMucGVuZGluZy52YWx1ZXMoKSkgcC5yZWplY3QoZXJyKTtcbiAgICAgIHRoaXMucGVuZGluZy5jbGVhcigpO1xuICAgIH07XG4gICAgdGhpcy53b3JrZXIgPSB3b3JrZXI7XG4gICAgcmV0dXJuIHdvcmtlcjtcbiAgfVxuXG4gIHByaXZhdGUgY2FsbChtc2c6IGFueSwgdHJhbnNmZXI6IFRyYW5zZmVyYWJsZVtdID0gW10sIG9uUHJvZ3Jlc3M/OiAoZjogbnVtYmVyKSA9PiB2b2lkKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBpZCA9ICsrdGhpcy5zZXE7XG4gICAgY29uc3Qgd29ya2VyID0gdGhpcy5lbnN1cmVXb3JrZXIoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nLnNldChpZCwgeyByZXNvbHZlLCByZWplY3QsIG9uUHJvZ3Jlc3MgfSk7XG4gICAgICB3b3JrZXIucG9zdE1lc3NhZ2UoeyAuLi5tc2csIGlkIH0sIHRyYW5zZmVyKTtcbiAgICB9KTtcbiAgfVxufVxuIl19
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25ueC1zYW0tc2Vzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vb25ueC1zYW0tc2Vzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUM7QUFHdkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFzQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0saUJBQWlCLENBQUM7QUFFNUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFBM0I7UUFDVSxTQUFJLEdBQStCLElBQUksQ0FBQztRQUN4QyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsY0FBUyxHQUFHLElBQUksQ0FBQztRQUV6QixvQkFBb0I7UUFDWixXQUFNLEdBQWtCLElBQUksQ0FBQztRQUNwQixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUU1Qyx3QkFBd0I7UUFDaEIsWUFBTyxHQUFnQyxJQUFJLENBQUM7UUFDNUMsWUFBTyxHQUFnQyxJQUFJLENBQUM7UUFDNUMsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUN0Qix1RkFBdUY7UUFDdEUsZUFBVSxHQUFHLElBQUksUUFBUSxDQUF3QixDQUFDLENBQUMsQ0FBQztJQWlJdkUsQ0FBQztJQS9IQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQWtCLEVBQUUsVUFBdUM7UUFDekUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLEtBQUss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IjpbImltcG9ydCB7IExydUNhY2hlIH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCAqIGFzIG9ydCBmcm9tICdvbm54cnVudGltZS13ZWInO1xuXG5pbXBvcnQgeyBJU2FtU2Vzc2lvbiwgU2FtRW1iZWRkaW5nLCBTYW1NYXNrUmVzdWx0LCBTYW1Nb2RlbERlZiwgU2FtUHJvbXB0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NhbS5jb250cmFjdCc7XG5pbXBvcnQgeyBmZXRjaE1vZGVsLCBydW5FbmNvZGVyLCBydW5EZWNvZGVyLCB0eXBlIENvcmVFbWJlZGRpbmcgfSBmcm9tICcuL3NhbS1vbm54LWNvcmUnO1xuaW1wb3J0IHsgZ2V0T3J0V2FzbUJhc2UgfSBmcm9tICcuL29ydC1ydW50aW1lLWNvbmZpZyc7XG5pbXBvcnQgeyBQZW5kaW5nQ2FsbHMsIFdvcmtlclJlcGx5IH0gZnJvbSAnLi9wZW5kaW5nLWNhbGxzJztcblxuLyoqXG4gKiBvbm54cnVudGltZS13ZWIgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElTYW1TZXNzaW9ufSAoaml0LXVpIzkwKSwgd2l0aCB0d29cbiAqIGV4ZWN1dGlvbiBtb2RlcyBjaG9zZW4gcGVyIG1vZGVsOlxuICpcbiAqICAtICoqaW4tcHJvY2VzcyoqIChtYWluIHRocmVhZCkg4oCUIGZvciBzbWFsbCBXQVNNIG1vZGVscyBmbGFnZ2VkIGBpblByb2Nlc3NgXG4gKiAgICAoZS5nLiBtaWNyby1zYW0gVmlULVQpLiBGYXN0IGxvYWQgKyBpbmZlcmVuY2Ugd2l0aCBubyBXZWIgV29ya2VyIHNwYXduIC9cbiAqICAgIHNlY29uZCBPUlQgcnVudGltZSAvIG1lc3NhZ2Ugcm91bmQtdHJpcHM7IHRoZSBicmllZiBlbmNvZGUgcnVucyBvbiB0aGUgbWFpblxuICogICAgdGhyZWFkIChmaW5lIGZvciBhIHRpbnkgbW9kZWwpLlxuICogIC0gKip3b3JrZXIqKiDigJQgZm9yIFdlYkdQVSBtb2RlbHMgKGUuZy4gVmlULUIsIHBhdGhvLXNhbSBmcDE2KSB3aG9zZSBoZWF2eVxuICogICAgZW5jb2RlIHdvdWxkIG90aGVyd2lzZSBmcmVlemUgdGhlIHRhYi4gUnVucyBpbiB7QGxpbmsgLi9vbm54LXNhbS53b3JrZXJ9IHNvXG4gKiAgICB0aGUgVUkgc3RheXMgcmVzcG9uc2l2ZSAodGhlIHNwaW5uZXIgYW5pbWF0ZXMpLlxuICpcbiAqIEJvdGggbW9kZXMgc2hhcmUgdGhlaXIgaW5mZXJlbmNlIG1hdGggdmlhIHtAbGluayAuL3NhbS1vbm54LWNvcmV9LiBMYXp5LWltcG9ydGVkXG4gKiBieSB0aGUgU0FNIHRvb2xzIHNvIG9ubnhydW50aW1lLXdlYiAvIHRoZSB3b3JrZXIgbmV2ZXIgbG9hZCBpbiB1bml0IHRlc3RzIG9yXG4gKiB0aGUgaW5pdGlhbCBidW5kbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBPbm54U2FtU2Vzc2lvbiBpbXBsZW1lbnRzIElTYW1TZXNzaW9uIHtcbiAgcHJpdmF0ZSBtb2RlOiAnaW5wcm9jJyB8ICd3b3JrZXInIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9hZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgaW5wdXRTaXplID0gMTAyNDtcblxuICAvLyDilIDilIAgd29ya2VyIG1vZGUg4pSA4pSAXG4gIHByaXZhdGUgd29ya2VyOiBXb3JrZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBjYWxscyA9IG5ldyBQZW5kaW5nQ2FsbHMoKTtcblxuICAvLyDilIDilIAgaW4tcHJvY2VzcyBtb2RlIOKUgOKUgFxuICBwcml2YXRlIGVuY29kZXI6IG9ydC5JbmZlcmVuY2VTZXNzaW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGVjb2Rlcjogb3J0LkluZmVyZW5jZVNlc3Npb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBuZXh0VG9rZW4gPSAxO1xuICAvKiogVGhlIGZldyBtb3N0IHJlY2VudGx5IHVzZWQgZW1iZWRkaW5ncywgYnkgdG9rZW4gKG9uZSBwZXIgcmVjZW50bHkgdmlld2VkIGltYWdlKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBlbWJlZGRpbmdzID0gbmV3IExydUNhY2hlPENvcmVFbWJlZGRpbmcsIG51bWJlcj4oMyk7XG5cbiAgYXN5bmMgbG9hZE1vZGVsKG1vZGVsOiBTYW1Nb2RlbERlZiwgb25Qcm9ncmVzcz86IChmcmFjdGlvbjogbnVtYmVyKSA9PiB2b2lkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFtb2RlbC5lbmNvZGVyVXJsIHx8ICFtb2RlbC5kZWNvZGVyVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNBTSBtb2RlbCBcIiR7bW9kZWwuaWR9XCIgaGFzIG5vIE9OTlggVVJMcyBjb25maWd1cmVkLmApO1xuICAgIH1cbiAgICB0aGlzLmlucHV0U2l6ZSA9IG1vZGVsLmlucHV0U2l6ZTtcbiAgICBjb25zdCBoYXNHcHUgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAnZ3B1JyBpbiBuYXZpZ2F0b3I7XG4gICAgY29uc3QgZXBzOiBzdHJpbmdbXSA9IG1vZGVsLmVuY29kZXJQcm92aWRlcnMgPz8gKGhhc0dwdSA/IFsnd2ViZ3B1JywgJ3dhc20nXSA6IFsnd2FzbSddKTtcbiAgICBjb25zdCB1c2VzV2ViR3B1ID0gZXBzLmluY2x1ZGVzKCd3ZWJncHUnKTtcbiAgICAvLyBXZWJHUFUgbXVzdCBydW4gaW4gdGhlIHdvcmtlciAoZWxzZSBpdCBmcmVlemVzIHRoZSBtYWluIHRocmVhZCk7IHNtYWxsXG4gICAgLy8gV0FTTSBtb2RlbHMgb3B0IGludG8gdGhlIGZhc3RlciBpbi1wcm9jZXNzIHBhdGggdmlhIGBpblByb2Nlc3NgLlxuICAgIHRoaXMubW9kZSA9ICF1c2VzV2ViR3B1ICYmIG1vZGVsLmluUHJvY2VzcyA/ICdpbnByb2MnIDogJ3dvcmtlcic7XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAnaW5wcm9jJykge1xuICAgICAgb3J0LmVudi53YXNtLndhc21QYXRocyA9IGdldE9ydFdhc21CYXNlKCk7XG4gICAgICBjb25zdCBlbmNCdWYgPSBhd2FpdCBmZXRjaE1vZGVsKG1vZGVsLmVuY29kZXJVcmwsIG9uUHJvZ3Jlc3MsIG1vZGVsLnJldmlzaW9uKTtcbiAgICAgIGNvbnN0IGRlY0J1ZiA9IGF3YWl0IGZldGNoTW9kZWwobW9kZWwuZGVjb2RlclVybCwgdW5kZWZpbmVkLCBtb2RlbC5yZXZpc2lvbik7XG4gICAgICB0aGlzLmVuY29kZXIgPSBhd2FpdCBvcnQuSW5mZXJlbmNlU2Vzc2lvbi5jcmVhdGUoZW5jQnVmLCB7IGV4ZWN1dGlvblByb3ZpZGVyczogZXBzIH0pO1xuICAgICAgdGhpcy5kZWNvZGVyID0gYXdhaXQgb3J0LkluZmVyZW5jZVNlc3Npb24uY3JlYXRlKGRlY0J1ZiwgeyBleGVjdXRpb25Qcm92aWRlcnM6IFsnd2FzbSddIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGwoXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnbG9hZCcsXG4gICAgICAgICAgZW5jb2RlclVybDogbW9kZWwuZW5jb2RlclVybCxcbiAgICAgICAgICBkZWNvZGVyVXJsOiBtb2RlbC5kZWNvZGVyVXJsLFxuICAgICAgICAgIHJldmlzaW9uOiBtb2RlbC5yZXZpc2lvbixcbiAgICAgICAgICB3YXNtUGF0aHM6IGdldE9ydFdhc21CYXNlKCksXG4gICAgICAgICAgaW5wdXRTaXplOiBtb2RlbC5pbnB1dFNpemUsXG4gICAgICAgICAgZW5jb2RlclByb3ZpZGVyczogbW9kZWwuZW5jb2RlclByb3ZpZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgW10sXG4gICAgICAgIG9uUHJvZ3Jlc3MsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gIH1cblxuICBpc0xvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkZWQ7XG4gIH1cblxuICBhc3luYyBlbWJlZChpbWFnZTogeyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSk6IFByb21pc2U8U2FtRW1iZWRkaW5nPiB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2lucHJvYycpIHtcbiAgICAgIGNvbnN0IGUgPSBhd2FpdCBydW5FbmNvZGVyKHRoaXMuZW5jb2RlciEsIGltYWdlLmRhdGEsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIHRoaXMuaW5wdXRTaXplKTtcbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5uZXh0VG9rZW4rKztcbiAgICAgIHRoaXMuZW1iZWRkaW5ncy5zZXQodG9rZW4sIGUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogbmV3IEZsb2F0MzJBcnJheSgwKSxcbiAgICAgICAgZGltczogZS5kaW1zLFxuICAgICAgICBzY2FsZTogZS5zY2FsZSxcbiAgICAgICAgaW1hZ2VXaWR0aDogZS5pbWFnZVdpZHRoLFxuICAgICAgICBpbWFnZUhlaWdodDogZS5pbWFnZUhlaWdodCxcbiAgICAgICAgdG9rZW4sXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyB3b3JrZXI6IHRyYW5zZmVyIHRoZSBSR0JBIGJ1ZmZlciAoY2FsbGVycyBwYXNzIGEgZnJlc2ggZnJhbWUgYnVmZmVyKS5cbiAgICBjb25zdCBidWZmZXIgPSBpbWFnZS5kYXRhLmJ1ZmZlcjtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNhbGwoeyB0eXBlOiAnZW1iZWQnLCB3aWR0aDogaW1hZ2Uud2lkdGgsIGhlaWdodDogaW1hZ2UuaGVpZ2h0LCBidWZmZXIgfSwgW2J1ZmZlcl0pO1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBuZXcgRmxvYXQzMkFycmF5KDApLFxuICAgICAgZGltczogcmVzWydkaW1zJ10gYXMgbnVtYmVyW10sXG4gICAgICBzY2FsZTogcmVzWydzY2FsZSddIGFzIG51bWJlcixcbiAgICAgIGltYWdlV2lkdGg6IHJlc1snaW1hZ2VXaWR0aCddIGFzIG51bWJlcixcbiAgICAgIGltYWdlSGVpZ2h0OiByZXNbJ2ltYWdlSGVpZ2h0J10gYXMgbnVtYmVyLFxuICAgICAgdG9rZW46IHJlc1sndG9rZW4nXSBhcyBudW1iZXIsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlY29kZShlbWJlZGRpbmc6IFNhbUVtYmVkZGluZywgcHJvbXB0OiBTYW1Qcm9tcHQpOiBQcm9taXNlPFNhbU1hc2tSZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnaW5wcm9jJykge1xuICAgICAgY29uc3QgZSA9IHRoaXMuZW1iZWRkaW5ncy5nZXQoZW1iZWRkaW5nLnRva2VuIGFzIG51bWJlcik7XG4gICAgICBpZiAoIWUpIHRocm93IG5ldyBFcnJvcignU0FNIGVtYmVkZGluZyBleHBpcmVkOyByZS1lbmNvZGUgdGhlIGltYWdlLicpO1xuICAgICAgcmV0dXJuIHJ1bkRlY29kZXIodGhpcy5kZWNvZGVyISwgZSwgcHJvbXB0KTtcbiAgICB9XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jYWxsKHsgdHlwZTogJ2RlY29kZScsIHRva2VuOiBlbWJlZGRpbmcudG9rZW4sIHByb21wdCB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgbWFzazogbmV3IFVpbnQ4QXJyYXkocmVzWydidWZmZXInXSBhcyBBcnJheUJ1ZmZlciksXG4gICAgICB3aWR0aDogcmVzWyd3aWR0aCddIGFzIG51bWJlcixcbiAgICAgIGhlaWdodDogcmVzWydoZWlnaHQnXSBhcyBudW1iZXIsXG4gICAgICBpb3U6IHJlc1snaW91J10gYXMgbnVtYmVyLFxuICAgIH07XG4gIH1cblxuICAvKiogUmVsZWFzZSB0aGUgd29ya2VyIC8gT1JUIHNlc3Npb25zLiBDYWxscyBzdGlsbCBpbiBmbGlnaHQgcmVqZWN0IChSVC04KSwgc29cbiAgICogIHRoZWlyIGNhbGxlcnMnIGBmaW5hbGx5YCBibG9ja3MgcnVuIChlLmcuIGEgdG9vbCdzIGJ1c3kgZmxhZyBjbGVhcnMpLiAqL1xuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZHJvcFdvcmtlcihuZXcgRXJyb3IoJ1NBTSBzZXNzaW9uIGRpc3Bvc2VkJykpO1xuICAgIHRoaXMuZW5jb2Rlcj8ucmVsZWFzZT8uKCk7XG4gICAgdGhpcy5kZWNvZGVyPy5yZWxlYXNlPy4oKTtcbiAgICB0aGlzLmVuY29kZXIgPSB0aGlzLmRlY29kZXIgPSBudWxsO1xuICAgIHRoaXMuZW1iZWRkaW5ncy5jbGVhcigpO1xuICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5tb2RlID0gbnVsbDtcbiAgfVxuXG4gIC8vIOKUgOKUgCB3b3JrZXIgcGx1bWJpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgZW5zdXJlV29ya2VyKCk6IFdvcmtlciB7XG4gICAgaWYgKHRoaXMud29ya2VyKSByZXR1cm4gdGhpcy53b3JrZXI7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcihuZXcgVVJMKCcuL29ubngtc2FtLndvcmtlcicsIGltcG9ydC5tZXRhLnVybCksIHsgdHlwZTogJ21vZHVsZScgfSk7XG4gICAgd29ya2VyLm9ubWVzc2FnZSA9IChldjogTWVzc2FnZUV2ZW50PFdvcmtlclJlcGx5PikgPT4gdGhpcy5jYWxscy5oYW5kbGUoZXYuZGF0YSk7XG4gICAgd29ya2VyLm9uZXJyb3IgPSAoZXY6IEVycm9yRXZlbnQpID0+IHtcbiAgICAgIC8vIEEgY3Jhc2hlZCB3b3JrZXIgY2FuJ3Qgc2VydmUgdGhlIGxvYWRlZCBtb2RlbCBhbnkgbW9yZTogZHJvcCBpdCwgc28gdGhlXG4gICAgICAvLyBuZXh0IHJ1biByZWxvYWRzIGluc3RlYWQgb2YgcG9zdGluZyB0byBhIGRlYWQgd29ya2VyLlxuICAgICAgdGhpcy5kcm9wV29ya2VyKG5ldyBFcnJvcihldi5tZXNzYWdlIHx8ICdTQU0gd29ya2VyIGNyYXNoZWQuJykpO1xuICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMubW9kZSA9IG51bGw7XG4gICAgfTtcbiAgICB0aGlzLndvcmtlciA9IHdvcmtlcjtcbiAgICByZXR1cm4gd29ya2VyO1xuICB9XG5cbiAgLyoqIFRlcm1pbmF0ZSB0aGUgd29ya2VyIChpZiBhbnkpIGFuZCByZWplY3QgZXZlcnkgY2FsbCBzdGlsbCB3YWl0aW5nIG9uIGl0LiAqL1xuICBwcml2YXRlIGRyb3BXb3JrZXIoZXJyOiBFcnJvcik6IHZvaWQge1xuICAgIHRoaXMud29ya2VyPy50ZXJtaW5hdGUoKTtcbiAgICB0aGlzLndvcmtlciA9IG51bGw7XG4gICAgdGhpcy5jYWxscy5yZWplY3RBbGwoZXJyKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsbChcbiAgICBtc2c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHRyYW5zZmVyOiBUcmFuc2ZlcmFibGVbXSA9IFtdLFxuICAgIG9uUHJvZ3Jlc3M/OiAoZjogbnVtYmVyKSA9PiB2b2lkLFxuICApOiBQcm9taXNlPFdvcmtlclJlcGx5PiB7XG4gICAgY29uc3Qgd29ya2VyID0gdGhpcy5lbnN1cmVXb3JrZXIoKTtcbiAgICBjb25zdCB7IGlkLCBwcm9taXNlIH0gPSB0aGlzLmNhbGxzLm9wZW4ob25Qcm9ncmVzcyk7XG4gICAgd29ya2VyLnBvc3RNZXNzYWdlKHsgLi4ubXNnLCBpZCB9LCB0cmFuc2Zlcik7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Request/response bookkeeping for a worker RPC: each call gets an id and a
3
+ * promise that its reply settles. Every exit path (dispose, a worker crash)
4
+ * must {@link rejectAll}, or awaiting callers never reach their `finally` and a
5
+ * tool's busy flag sticks forever (RT-8).
6
+ */
7
+ export class PendingCalls {
8
+ constructor() {
9
+ this.seq = 0;
10
+ this.pending = new Map();
11
+ }
12
+ /** Calls still awaiting a reply. */
13
+ get size() {
14
+ return this.pending.size;
15
+ }
16
+ /** Register a new call; post the message with the returned id. */
17
+ open(onProgress) {
18
+ const id = ++this.seq;
19
+ const promise = new Promise((resolve, reject) => {
20
+ this.pending.set(id, { resolve, reject, onProgress });
21
+ });
22
+ return { id, promise };
23
+ }
24
+ /** Route a worker reply to its call: progress, error or result. */
25
+ handle(reply) {
26
+ const p = this.pending.get(reply.id);
27
+ if (!p)
28
+ return;
29
+ if (reply.type === 'progress') {
30
+ p.onProgress?.(reply.fraction ?? 0);
31
+ return;
32
+ }
33
+ this.pending.delete(reply.id);
34
+ if (reply.type === 'error')
35
+ p.reject(new Error(reply.error ?? 'SAM worker error.'));
36
+ else
37
+ p.resolve(reply);
38
+ }
39
+ /** Reject every pending call with `err` and forget them. */
40
+ rejectAll(err) {
41
+ const calls = Array.from(this.pending.values());
42
+ this.pending.clear();
43
+ for (const p of calls)
44
+ p.reject(err);
45
+ }
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVuZGluZy1jYWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vcGVuZGluZy1jYWxscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkE7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUF6QjtRQUNVLFFBQUcsR0FBRyxDQUFDLENBQUM7UUFDQyxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFtQ3hELENBQUM7SUFqQ0Msb0NBQW9DO0lBQ3BDLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELGtFQUFrRTtJQUNsRSxJQUFJLENBQUMsVUFBdUM7UUFDMUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3RCLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFjLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSxNQUFNLENBQUMsS0FBa0I7UUFDdkIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUNmLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM5QixDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNwQyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTztZQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7O1lBQy9FLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELDREQUE0RDtJQUM1RCxTQUFTLENBQUMsR0FBVTtRQUNsQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSztZQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEEgcmVwbHkgZnJvbSB0aGUgU0FNIHdvcmtlcjogcHJvZ3Jlc3MgZm9yLCBvciB0aGUgcmVzdWx0IG9mLCBjYWxsIGBpZGAuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlclJlcGx5IHtcbiAgaWQ6IG51bWJlcjtcbiAgdHlwZTogc3RyaW5nO1xuICAvKiogUHJlc2VudCBvbiBgdHlwZTogJ3Byb2dyZXNzJ2AgcmVwbGllcy4gKi9cbiAgZnJhY3Rpb24/OiBudW1iZXI7XG4gIC8qKiBQcmVzZW50IG9uIGB0eXBlOiAnZXJyb3InYCByZXBsaWVzLiAqL1xuICBlcnJvcj86IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIFBlbmRpbmcge1xuICByZXNvbHZlOiAocmVwbHk6IFdvcmtlclJlcGx5KSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnI6IEVycm9yKSA9PiB2b2lkO1xuICBvblByb2dyZXNzPzogKGZyYWN0aW9uOiBudW1iZXIpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUmVxdWVzdC9yZXNwb25zZSBib29ra2VlcGluZyBmb3IgYSB3b3JrZXIgUlBDOiBlYWNoIGNhbGwgZ2V0cyBhbiBpZCBhbmQgYVxuICogcHJvbWlzZSB0aGF0IGl0cyByZXBseSBzZXR0bGVzLiBFdmVyeSBleGl0IHBhdGggKGRpc3Bvc2UsIGEgd29ya2VyIGNyYXNoKVxuICogbXVzdCB7QGxpbmsgcmVqZWN0QWxsfSwgb3IgYXdhaXRpbmcgY2FsbGVycyBuZXZlciByZWFjaCB0aGVpciBgZmluYWxseWAgYW5kIGFcbiAqIHRvb2wncyBidXN5IGZsYWcgc3RpY2tzIGZvcmV2ZXIgKFJULTgpLlxuICovXG5leHBvcnQgY2xhc3MgUGVuZGluZ0NhbGxzIHtcbiAgcHJpdmF0ZSBzZXEgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmcgPSBuZXcgTWFwPG51bWJlciwgUGVuZGluZz4oKTtcblxuICAvKiogQ2FsbHMgc3RpbGwgYXdhaXRpbmcgYSByZXBseS4gKi9cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nLnNpemU7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgYSBuZXcgY2FsbDsgcG9zdCB0aGUgbWVzc2FnZSB3aXRoIHRoZSByZXR1cm5lZCBpZC4gKi9cbiAgb3BlbihvblByb2dyZXNzPzogKGZyYWN0aW9uOiBudW1iZXIpID0+IHZvaWQpOiB7IGlkOiBudW1iZXI7IHByb21pc2U6IFByb21pc2U8V29ya2VyUmVwbHk+IH0ge1xuICAgIGNvbnN0IGlkID0gKyt0aGlzLnNlcTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8V29ya2VyUmVwbHk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZy5zZXQoaWQsIHsgcmVzb2x2ZSwgcmVqZWN0LCBvblByb2dyZXNzIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB7IGlkLCBwcm9taXNlIH07XG4gIH1cblxuICAvKiogUm91dGUgYSB3b3JrZXIgcmVwbHkgdG8gaXRzIGNhbGw6IHByb2dyZXNzLCBlcnJvciBvciByZXN1bHQuICovXG4gIGhhbmRsZShyZXBseTogV29ya2VyUmVwbHkpOiB2b2lkIHtcbiAgICBjb25zdCBwID0gdGhpcy5wZW5kaW5nLmdldChyZXBseS5pZCk7XG4gICAgaWYgKCFwKSByZXR1cm47XG4gICAgaWYgKHJlcGx5LnR5cGUgPT09ICdwcm9ncmVzcycpIHtcbiAgICAgIHAub25Qcm9ncmVzcz8uKHJlcGx5LmZyYWN0aW9uID8/IDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHJlcGx5LmlkKTtcbiAgICBpZiAocmVwbHkudHlwZSA9PT0gJ2Vycm9yJykgcC5yZWplY3QobmV3IEVycm9yKHJlcGx5LmVycm9yID8/ICdTQU0gd29ya2VyIGVycm9yLicpKTtcbiAgICBlbHNlIHAucmVzb2x2ZShyZXBseSk7XG4gIH1cblxuICAvKiogUmVqZWN0IGV2ZXJ5IHBlbmRpbmcgY2FsbCB3aXRoIGBlcnJgIGFuZCBmb3JnZXQgdGhlbS4gKi9cbiAgcmVqZWN0QWxsKGVycjogRXJyb3IpOiB2b2lkIHtcbiAgICBjb25zdCBjYWxscyA9IEFycmF5LmZyb20odGhpcy5wZW5kaW5nLnZhbHVlcygpKTtcbiAgICB0aGlzLnBlbmRpbmcuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IHAgb2YgY2FsbHMpIHAucmVqZWN0KGVycik7XG4gIH1cbn1cbiJdfQ==
@@ -12,7 +12,12 @@
12
12
  * cellpose default). A host can repoint them at its own hosting (e.g. a GCS
13
13
  * bucket) at runtime via {@link setSamModelUrls}; an empty URL disables a model
14
14
  * (the session throws a clear "not configured" error). Export/quantization
15
- * tooling: the sibling `browser-onnx-tools` project; see docs/sam-segmentation-design.md.
15
+ * tooling: the sibling `browser-onnx-tools` project; see
16
+ * docs/design/sam-segmentation-design.md.
17
+ *
18
+ * Downloads are cached in the browser by URL and `revision`: when a model's files are
19
+ * re-exported under the same URLs, set (or bump) its `revision` so browsers fetch the
20
+ * new files instead of serving the old ones from cache.
16
21
  */
17
22
  export const SAM_MODELS = [
18
23
  {
@@ -92,17 +97,20 @@ export function isSamModelReady(model) {
92
97
  /**
93
98
  * Point a registered model at its hosted ONNX pair (HF / GCS). Called by the
94
99
  * host's composition root once hosting is decided, keeping deployment URLs out
95
- * of the library.
100
+ * of the library. Pass `revision` when the files at those URLs can be replaced in
101
+ * place, and change it whenever they are (see {@link SamModelDef.revision}).
96
102
  */
97
- export function setSamModelUrls(id, encoderUrl, decoderUrl) {
103
+ export function setSamModelUrls(id, encoderUrl, decoderUrl, revision) {
98
104
  const m = SAM_MODELS.find((x) => x.id === id);
99
105
  if (m) {
100
106
  m.encoderUrl = encoderUrl;
101
107
  m.decoderUrl = decoderUrl;
108
+ if (revision !== undefined)
109
+ m.revision = revision;
102
110
  // The configured (hosted) model becomes the active default, so the tools
103
111
  // use it rather than the first registry entry (which may be unhosted).
104
112
  if (encoderUrl && decoderUrl)
105
113
  activeDefaultId = id;
106
114
  }
107
115
  }
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLW1vZGVsLXJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tbW9kZWwtcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFrQjtJQUN2QztRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsS0FBSyxFQUFFLGlCQUFpQjtRQUN4QixVQUFVLEVBQUUsOEZBQThGO1FBQzFHLFVBQVUsRUFBRSx5RkFBeUY7UUFDckcsT0FBTyxFQUFFLE1BQU07UUFDZixTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLDBFQUEwRTtRQUMxRSx3RUFBd0U7UUFDeEUsaUVBQWlFO1FBQ2pFLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDO1FBQzFCLHFFQUFxRTtRQUNyRSwyRUFBMkU7UUFDM0UseUNBQXlDO1FBQ3pDLFNBQVMsRUFBRSxJQUFJO0tBQ2hCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsbUJBQW1CO1FBQ3ZCLEtBQUssRUFBRSxpQkFBaUI7UUFDeEIsVUFBVSxFQUFFLDhGQUE4RjtRQUMxRyxVQUFVLEVBQUUseUZBQXlGO1FBQ3JHLE9BQU8sRUFBRSxNQUFNO1FBQ2YsU0FBUyxFQUFFLElBQUk7UUFDZixVQUFVLEVBQUUsSUFBSTtLQUNqQjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGlCQUFpQjtRQUNyQixLQUFLLEVBQUUsaUJBQWlCO1FBQ3hCLFVBQVUsRUFBRSw0RkFBNEY7UUFDeEcsVUFBVSxFQUFFLHVGQUF1RjtRQUNuRyxPQUFPLEVBQUUsTUFBTTtRQUNmLFNBQVMsRUFBRSxJQUFJO1FBQ2YsVUFBVSxFQUFFLElBQUk7S0FDakI7SUFDRDtRQUNFLEVBQUUsRUFBRSxzQkFBc0I7UUFDMUIsS0FBSyxFQUFFLHdCQUF3QjtRQUMvQixVQUFVLEVBQUUsNEZBQTRGO1FBQ3hHLFVBQVUsRUFBRSx1RkFBdUY7UUFDbkcsT0FBTyxFQUFFLE1BQU07UUFDZixTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUseUVBQXlFO1FBQ3pFLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDO0tBQzNCO0NBQ0YsQ0FBQztBQUVGO2lEQUNpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRXJEO29GQUNvRjtBQUNwRixJQUFJLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQztBQUUzQztzQkFDc0I7QUFDdEIsTUFBTSxVQUFVLFdBQVcsQ0FBQyxFQUFXO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxlQUFlLENBQUM7SUFDckMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELG9FQUFvRTtBQUNwRSxNQUFNLFVBQVUsa0JBQWtCLENBQUMsRUFBVTtJQUMzQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQUUsZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBa0I7SUFDaEQsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztBQUNsRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsRUFBVSxFQUFFLFVBQWtCLEVBQUUsVUFBa0I7SUFDaEYsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ04sQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDMUIsQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDMUIseUVBQXlFO1FBQ3pFLHVFQUF1RTtRQUN2RSxJQUFJLFVBQVUsSUFBSSxVQUFVO1lBQUUsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNhbU1vZGVsRGVmIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NhbS5jb250cmFjdCc7XG5cbi8qKlxuICogUmVnaXN0cnkgb2YgcHJvbXB0YWJsZSBTQU0gbW9kZWxzIGZvciB0aGUgYnJvd3NlciBzZWdtZW50IHRvb2wuXG4gKlxuICogbWljcm8tc2FtIChtaWNyb3Njb3B5LWZpbmV0dW5lZCwgcHJvbXB0YWJsZSkgYW5kIHBhdGhvLXNhbSAoaGlzdG9wYXRob2xvZ3ktXG4gKiBmaW5ldHVuZWQpIGFyZSBlbnRyaWVzOyBTQU0zIHNsb3RzIGluIGhlcmUgb25jZSBpdHMgcXVhbnRpemVkIE9OTlggZXhwb3J0IGFuZFxuICogYSBgdmFyaWFudDogJ3NhbTMnYCBkZWNvZGVyIHBhdGggYXJlIHB1Ymxpc2hlZC4gVGhlXG4gKiBhdXRvbWF0aWMgY2VsbHBvc2UtU0FNIG1vZGVsIGlzIGludGVudGlvbmFsbHkgTk9UIGhlcmUg4oCUIGl0J3Mgbm90IHByb21wdGFibGVcbiAqIGFuZCBsaXZlcyBpbiB0aGUgcHJvY2Vzc2luZy1waXBlbGluZSdzIGNlbGxwb3NlIGVuZ2luZSBhcyB0aGUgYXV0b21hdGljIHRvb2wuXG4gKlxuICogYGVuY29kZXJVcmxgIC8gYGRlY29kZXJVcmxgIHBvaW50IGF0IHRoZSBwdWJsaWMgSEYtaG9zdGVkIE9OTlggcGFpcnMgYnlcbiAqIGRlZmF1bHQsIHNvIHRoZSBzZWdtZW50IHRvb2xzIHdvcmsgb3V0IG9mIHRoZSBib3ggaW4gYW55IGhvc3QgKG1pcnJvcmluZyB0aGVcbiAqIGNlbGxwb3NlIGRlZmF1bHQpLiBBIGhvc3QgY2FuIHJlcG9pbnQgdGhlbSBhdCBpdHMgb3duIGhvc3RpbmcgKGUuZy4gYSBHQ1NcbiAqIGJ1Y2tldCkgYXQgcnVudGltZSB2aWEge0BsaW5rIHNldFNhbU1vZGVsVXJsc307IGFuIGVtcHR5IFVSTCBkaXNhYmxlcyBhIG1vZGVsXG4gKiAodGhlIHNlc3Npb24gdGhyb3dzIGEgY2xlYXIgXCJub3QgY29uZmlndXJlZFwiIGVycm9yKS4gRXhwb3J0L3F1YW50aXphdGlvblxuICogdG9vbGluZzogdGhlIHNpYmxpbmcgYGJyb3dzZXItb25ueC10b29sc2AgcHJvamVjdDsgc2VlIGRvY3Mvc2FtLXNlZ21lbnRhdGlvbi1kZXNpZ24ubWQuXG4gKi9cbmV4cG9ydCBjb25zdCBTQU1fTU9ERUxTOiBTYW1Nb2RlbERlZltdID0gW1xuICB7XG4gICAgaWQ6ICdtaWNyb3NhbS12aXQtdC1sbScsXG4gICAgbGFiZWw6ICdtaWNyby1zYW0gVmlULVQnLFxuICAgIGVuY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9taWNyb3NhbS12aXQtdC1sbS1vbm54L3Jlc29sdmUvbWFpbi9lbmNvZGVyLmZwMTYub25ueCcsXG4gICAgZGVjb2RlclVybDogJ2h0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vamF4LWltYWdlLXRvb2xzL21pY3Jvc2FtLXZpdC10LWxtLW9ubngvcmVzb2x2ZS9tYWluL2RlY29kZXIub25ueCcsXG4gICAgdmFyaWFudDogJ3NhbTEnLFxuICAgIGlucHV0U2l6ZTogMTAyNCxcbiAgICBtaWNyb3Njb3B5OiB0cnVlLFxuICAgIC8vIFRpbnlWaVQncyBmcDE2IGF0dGVudGlvbiBvdmVyZmxvd3Mgb24gdGhlIG9ubnhydW50aW1lLXdlYiBXZWJHUFUgRVAgYW5kXG4gICAgLy8gcmV0dXJucyBhbiBlbXB0eSBtYXNrIChcIk5vIG1hc2tzIGZvdW5kXCIpOyBpdCdzIG51bWVyaWNhbGx5IGNvcnJlY3Qgb25cbiAgICAvLyBXQVNNLCBhbmQgdGhlIGVuY29kZXIgaXMgdGlueSAofjE0IE1CKSBzbyBXQVNNIGlzIHBsZW50eSBmYXN0LlxuICAgIGVuY29kZXJQcm92aWRlcnM6IFsnd2FzbSddLFxuICAgIC8vIFNtYWxsIGVub3VnaCB0byBydW4gaW4tcHJvY2VzcyBvbiB0aGUgbWFpbiB0aHJlYWQg4oCUIGF2b2lkcyB0aGUgV2ViXG4gICAgLy8gV29ya2VyJ3Mgc3Bhd24gLyBzZWNvbmQtT1JULXJ1bnRpbWUgLyByb3VuZC10cmlwIG92ZXJoZWFkLCB3aGljaCBtYWRlIGl0XG4gICAgLy8gbm90aWNlYWJseSBzbG93ZXIgdG8gbG9hZCBhbmQgc2VnbWVudC5cbiAgICBpblByb2Nlc3M6IHRydWUsXG4gIH0sXG4gIHtcbiAgICBpZDogJ21pY3Jvc2FtLXZpdC1iLWxtJyxcbiAgICBsYWJlbDogJ21pY3JvLXNhbSBWaVQtQicsXG4gICAgZW5jb2RlclVybDogJ2h0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vamF4LWltYWdlLXRvb2xzL21pY3Jvc2FtLXZpdC1iLWxtLW9ubngvcmVzb2x2ZS9tYWluL2VuY29kZXIuZnAxNi5vbm54JyxcbiAgICBkZWNvZGVyVXJsOiAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9qYXgtaW1hZ2UtdG9vbHMvbWljcm9zYW0tdml0LWItbG0tb25ueC9yZXNvbHZlL21haW4vZGVjb2Rlci5vbm54JyxcbiAgICB2YXJpYW50OiAnc2FtMScsXG4gICAgaW5wdXRTaXplOiAxMDI0LFxuICAgIG1pY3Jvc2NvcHk6IHRydWUsXG4gIH0sXG4gIHtcbiAgICBpZDogJ3BhdGhvLXNhbS12aXQtYicsXG4gICAgbGFiZWw6ICdwYXRoby1zYW0gVmlULUInLFxuICAgIGVuY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZW5jb2Rlci5mcDE2Lm9ubngnLFxuICAgIGRlY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZGVjb2Rlci5vbm54JyxcbiAgICB2YXJpYW50OiAnc2FtMScsXG4gICAgaW5wdXRTaXplOiAxMDI0LFxuICAgIG1pY3Jvc2NvcHk6IHRydWUsXG4gIH0sXG4gIHtcbiAgICBpZDogJ3BhdGhvLXNhbS12aXQtYi1pbnQ4JyxcbiAgICBsYWJlbDogJ3BhdGhvLXNhbSBWaVQtQiAoaW50OCknLFxuICAgIGVuY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZW5jb2Rlci5pbnQ4Lm9ubngnLFxuICAgIGRlY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZGVjb2Rlci5vbm54JyxcbiAgICB2YXJpYW50OiAnc2FtMScsXG4gICAgaW5wdXRTaXplOiAxMDI0LFxuICAgIG1pY3Jvc2NvcHk6IHRydWUsXG4gICAgLy8gaW50OCBkeW5hbWljLXF1YW50aXplZCBlbmNvZGVyICh+MTAwIE1CIHZzIH4xODAgTUIgZnAxNiwgSW9VIH4wLjk5IG9uIHRoZVxuICAgIC8vIHNhbml0eSB0ZXN0KS4gb25ueHJ1bnRpbWUtd2ViJ3MgV2ViR1BVIEVQIGRvZXNuJ3Qgc3VwcG9ydCBpbnQ4IG1hdG11bCwgc29cbiAgICAvLyBpdCBydW5zIG9uIFdBU00g4oCUIHNtYWxsZXIgZG93bmxvYWQsIHNsb3dlciBlbmNvZGUgdGhhbiB0aGUgZnAxNiBlbnRyeS5cbiAgICBlbmNvZGVyUHJvdmlkZXJzOiBbJ3dhc20nXSxcbiAgfSxcbl07XG5cbi8qKiBJbml0aWFsIGRlZmF1bHQgbW9kZWwgaWQgKG92ZXJyaWRkZW4gYXQgcnVudGltZSBvbmNlIHRoZSBob3N0IGNvbmZpZ3VyZXMgYVxuICogIGhvc3RlZCBtb2RlbCB2aWEge0BsaW5rIHNldFNhbU1vZGVsVXJsc30pLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0FNX01PREVMX0lEID0gU0FNX01PREVMU1swXS5pZDtcblxuLyoqIFRoZSBhY3RpdmUgZGVmYXVsdCDigJQgdXBkYXRlZCB3aGVuIHRoZSBob3N0IGNvbmZpZ3VyZXMgYSBtb2RlbCdzIE9OTlggVVJMcyxcbiAqICBzbyB0aGUgdG9vbCB1c2VzIHRoZSBtb2RlbCB0aGF0J3MgYWN0dWFsbHkgaG9zdGVkIChub3QganVzdCB0aGUgZmlyc3QgZW50cnkpLiAqL1xubGV0IGFjdGl2ZURlZmF1bHRJZCA9IERFRkFVTFRfU0FNX01PREVMX0lEO1xuXG4vKiogTG9vayB1cCBhIG1vZGVsIGJ5IGlkOyBmYWxscyBiYWNrIHRvIHRoZSBhY3RpdmUgZGVmYXVsdCB3aGVuIGlkIGlzXG4gKiAgdW5rbm93bi9hYnNlbnQuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FtTW9kZWwoaWQ/OiBzdHJpbmcpOiBTYW1Nb2RlbERlZiB7XG4gIGNvbnN0IHdhbnRlZCA9IGlkID8/IGFjdGl2ZURlZmF1bHRJZDtcbiAgcmV0dXJuIFNBTV9NT0RFTFMuZmluZCgobSkgPT4gbS5pZCA9PT0gd2FudGVkKSA/PyBTQU1fTU9ERUxTWzBdO1xufVxuXG4vKiogVGhlIGFjdGl2ZSBkZWZhdWx0IG1vZGVsIGlkICh3aGF0IHRoZSB0b29scy9waWNrZXIgdXNlIHdoZW4gdW5zZXQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRTYW1Nb2RlbElkKCk6IHN0cmluZyB7XG4gIHJldHVybiBhY3RpdmVEZWZhdWx0SWQ7XG59XG5cbi8qKiBTZXQgdGhlIGFjdGl2ZSBkZWZhdWx0IG1vZGVsIGlkIChtdXN0IGJlIGEgcmVnaXN0ZXJlZCBtb2RlbCkuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKFNBTV9NT0RFTFMuc29tZSgobSkgPT4gbS5pZCA9PT0gaWQpKSBhY3RpdmVEZWZhdWx0SWQgPSBpZDtcbn1cblxuLyoqIFRydWUgd2hlbiBhIG1vZGVsIGhhcyBib3RoIE9OTlggVVJMcyBjb25maWd1cmVkIChpLmUuIGl0IGNhbiBhY3R1YWxseSBydW4pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtTW9kZWxSZWFkeShtb2RlbDogU2FtTW9kZWxEZWYpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhbW9kZWwuZW5jb2RlclVybCAmJiAhIW1vZGVsLmRlY29kZXJVcmw7XG59XG5cbi8qKlxuICogUG9pbnQgYSByZWdpc3RlcmVkIG1vZGVsIGF0IGl0cyBob3N0ZWQgT05OWCBwYWlyIChIRiAvIEdDUykuIENhbGxlZCBieSB0aGVcbiAqIGhvc3QncyBjb21wb3NpdGlvbiByb290IG9uY2UgaG9zdGluZyBpcyBkZWNpZGVkLCBrZWVwaW5nIGRlcGxveW1lbnQgVVJMcyBvdXRcbiAqIG9mIHRoZSBsaWJyYXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U2FtTW9kZWxVcmxzKGlkOiBzdHJpbmcsIGVuY29kZXJVcmw6IHN0cmluZywgZGVjb2RlclVybDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG0gPSBTQU1fTU9ERUxTLmZpbmQoKHgpID0+IHguaWQgPT09IGlkKTtcbiAgaWYgKG0pIHtcbiAgICBtLmVuY29kZXJVcmwgPSBlbmNvZGVyVXJsO1xuICAgIG0uZGVjb2RlclVybCA9IGRlY29kZXJVcmw7XG4gICAgLy8gVGhlIGNvbmZpZ3VyZWQgKGhvc3RlZCkgbW9kZWwgYmVjb21lcyB0aGUgYWN0aXZlIGRlZmF1bHQsIHNvIHRoZSB0b29sc1xuICAgIC8vIHVzZSBpdCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgcmVnaXN0cnkgZW50cnkgKHdoaWNoIG1heSBiZSB1bmhvc3RlZCkuXG4gICAgaWYgKGVuY29kZXJVcmwgJiYgZGVjb2RlclVybCkgYWN0aXZlRGVmYXVsdElkID0gaWQ7XG4gIH1cbn1cbiJdfQ==
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLW1vZGVsLXJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tbW9kZWwtcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFrQjtJQUN2QztRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsS0FBSyxFQUFFLGlCQUFpQjtRQUN4QixVQUFVLEVBQUUsOEZBQThGO1FBQzFHLFVBQVUsRUFBRSx5RkFBeUY7UUFDckcsT0FBTyxFQUFFLE1BQU07UUFDZixTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLDBFQUEwRTtRQUMxRSx3RUFBd0U7UUFDeEUsaUVBQWlFO1FBQ2pFLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDO1FBQzFCLHFFQUFxRTtRQUNyRSwyRUFBMkU7UUFDM0UseUNBQXlDO1FBQ3pDLFNBQVMsRUFBRSxJQUFJO0tBQ2hCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsbUJBQW1CO1FBQ3ZCLEtBQUssRUFBRSxpQkFBaUI7UUFDeEIsVUFBVSxFQUFFLDhGQUE4RjtRQUMxRyxVQUFVLEVBQUUseUZBQXlGO1FBQ3JHLE9BQU8sRUFBRSxNQUFNO1FBQ2YsU0FBUyxFQUFFLElBQUk7UUFDZixVQUFVLEVBQUUsSUFBSTtLQUNqQjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGlCQUFpQjtRQUNyQixLQUFLLEVBQUUsaUJBQWlCO1FBQ3hCLFVBQVUsRUFBRSw0RkFBNEY7UUFDeEcsVUFBVSxFQUFFLHVGQUF1RjtRQUNuRyxPQUFPLEVBQUUsTUFBTTtRQUNmLFNBQVMsRUFBRSxJQUFJO1FBQ2YsVUFBVSxFQUFFLElBQUk7S0FDakI7SUFDRDtRQUNFLEVBQUUsRUFBRSxzQkFBc0I7UUFDMUIsS0FBSyxFQUFFLHdCQUF3QjtRQUMvQixVQUFVLEVBQUUsNEZBQTRGO1FBQ3hHLFVBQVUsRUFBRSx1RkFBdUY7UUFDbkcsT0FBTyxFQUFFLE1BQU07UUFDZixTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUseUVBQXlFO1FBQ3pFLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDO0tBQzNCO0NBQ0YsQ0FBQztBQUVGO2lEQUNpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRXJEO29GQUNvRjtBQUNwRixJQUFJLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQztBQUUzQztzQkFDc0I7QUFDdEIsTUFBTSxVQUFVLFdBQVcsQ0FBQyxFQUFXO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxlQUFlLENBQUM7SUFDckMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELG9FQUFvRTtBQUNwRSxNQUFNLFVBQVUsa0JBQWtCLENBQUMsRUFBVTtJQUMzQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQUUsZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBa0I7SUFDaEQsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztBQUNsRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEVBQVUsRUFBRSxVQUFrQixFQUFFLFVBQWtCLEVBQUUsUUFBaUI7SUFDbkcsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ04sQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDMUIsQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDMUIsSUFBSSxRQUFRLEtBQUssU0FBUztZQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ2xELHlFQUF5RTtRQUN6RSx1RUFBdUU7UUFDdkUsSUFBSSxVQUFVLElBQUksVUFBVTtZQUFFLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDckQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTYW1Nb2RlbERlZiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zYW0uY29udHJhY3QnO1xuXG4vKipcbiAqIFJlZ2lzdHJ5IG9mIHByb21wdGFibGUgU0FNIG1vZGVscyBmb3IgdGhlIGJyb3dzZXIgc2VnbWVudCB0b29sLlxuICpcbiAqIG1pY3JvLXNhbSAobWljcm9zY29weS1maW5ldHVuZWQsIHByb21wdGFibGUpIGFuZCBwYXRoby1zYW0gKGhpc3RvcGF0aG9sb2d5LVxuICogZmluZXR1bmVkKSBhcmUgZW50cmllczsgU0FNMyBzbG90cyBpbiBoZXJlIG9uY2UgaXRzIHF1YW50aXplZCBPTk5YIGV4cG9ydCBhbmRcbiAqIGEgYHZhcmlhbnQ6ICdzYW0zJ2AgZGVjb2RlciBwYXRoIGFyZSBwdWJsaXNoZWQuIFRoZVxuICogYXV0b21hdGljIGNlbGxwb3NlLVNBTSBtb2RlbCBpcyBpbnRlbnRpb25hbGx5IE5PVCBoZXJlIOKAlCBpdCdzIG5vdCBwcm9tcHRhYmxlXG4gKiBhbmQgbGl2ZXMgaW4gdGhlIHByb2Nlc3NpbmctcGlwZWxpbmUncyBjZWxscG9zZSBlbmdpbmUgYXMgdGhlIGF1dG9tYXRpYyB0b29sLlxuICpcbiAqIGBlbmNvZGVyVXJsYCAvIGBkZWNvZGVyVXJsYCBwb2ludCBhdCB0aGUgcHVibGljIEhGLWhvc3RlZCBPTk5YIHBhaXJzIGJ5XG4gKiBkZWZhdWx0LCBzbyB0aGUgc2VnbWVudCB0b29scyB3b3JrIG91dCBvZiB0aGUgYm94IGluIGFueSBob3N0IChtaXJyb3JpbmcgdGhlXG4gKiBjZWxscG9zZSBkZWZhdWx0KS4gQSBob3N0IGNhbiByZXBvaW50IHRoZW0gYXQgaXRzIG93biBob3N0aW5nIChlLmcuIGEgR0NTXG4gKiBidWNrZXQpIGF0IHJ1bnRpbWUgdmlhIHtAbGluayBzZXRTYW1Nb2RlbFVybHN9OyBhbiBlbXB0eSBVUkwgZGlzYWJsZXMgYSBtb2RlbFxuICogKHRoZSBzZXNzaW9uIHRocm93cyBhIGNsZWFyIFwibm90IGNvbmZpZ3VyZWRcIiBlcnJvcikuIEV4cG9ydC9xdWFudGl6YXRpb25cbiAqIHRvb2xpbmc6IHRoZSBzaWJsaW5nIGBicm93c2VyLW9ubngtdG9vbHNgIHByb2plY3Q7IHNlZVxuICogZG9jcy9kZXNpZ24vc2FtLXNlZ21lbnRhdGlvbi1kZXNpZ24ubWQuXG4gKlxuICogRG93bmxvYWRzIGFyZSBjYWNoZWQgaW4gdGhlIGJyb3dzZXIgYnkgVVJMIGFuZCBgcmV2aXNpb25gOiB3aGVuIGEgbW9kZWwncyBmaWxlcyBhcmVcbiAqIHJlLWV4cG9ydGVkIHVuZGVyIHRoZSBzYW1lIFVSTHMsIHNldCAob3IgYnVtcCkgaXRzIGByZXZpc2lvbmAgc28gYnJvd3NlcnMgZmV0Y2ggdGhlXG4gKiBuZXcgZmlsZXMgaW5zdGVhZCBvZiBzZXJ2aW5nIHRoZSBvbGQgb25lcyBmcm9tIGNhY2hlLlxuICovXG5leHBvcnQgY29uc3QgU0FNX01PREVMUzogU2FtTW9kZWxEZWZbXSA9IFtcbiAge1xuICAgIGlkOiAnbWljcm9zYW0tdml0LXQtbG0nLFxuICAgIGxhYmVsOiAnbWljcm8tc2FtIFZpVC1UJyxcbiAgICBlbmNvZGVyVXJsOiAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9qYXgtaW1hZ2UtdG9vbHMvbWljcm9zYW0tdml0LXQtbG0tb25ueC9yZXNvbHZlL21haW4vZW5jb2Rlci5mcDE2Lm9ubngnLFxuICAgIGRlY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9taWNyb3NhbS12aXQtdC1sbS1vbm54L3Jlc29sdmUvbWFpbi9kZWNvZGVyLm9ubngnLFxuICAgIHZhcmlhbnQ6ICdzYW0xJyxcbiAgICBpbnB1dFNpemU6IDEwMjQsXG4gICAgbWljcm9zY29weTogdHJ1ZSxcbiAgICAvLyBUaW55VmlUJ3MgZnAxNiBhdHRlbnRpb24gb3ZlcmZsb3dzIG9uIHRoZSBvbm54cnVudGltZS13ZWIgV2ViR1BVIEVQIGFuZFxuICAgIC8vIHJldHVybnMgYW4gZW1wdHkgbWFzayAoXCJObyBtYXNrcyBmb3VuZFwiKTsgaXQncyBudW1lcmljYWxseSBjb3JyZWN0IG9uXG4gICAgLy8gV0FTTSwgYW5kIHRoZSBlbmNvZGVyIGlzIHRpbnkgKH4xNCBNQikgc28gV0FTTSBpcyBwbGVudHkgZmFzdC5cbiAgICBlbmNvZGVyUHJvdmlkZXJzOiBbJ3dhc20nXSxcbiAgICAvLyBTbWFsbCBlbm91Z2ggdG8gcnVuIGluLXByb2Nlc3Mgb24gdGhlIG1haW4gdGhyZWFkIOKAlCBhdm9pZHMgdGhlIFdlYlxuICAgIC8vIFdvcmtlcidzIHNwYXduIC8gc2Vjb25kLU9SVC1ydW50aW1lIC8gcm91bmQtdHJpcCBvdmVyaGVhZCwgd2hpY2ggbWFkZSBpdFxuICAgIC8vIG5vdGljZWFibHkgc2xvd2VyIHRvIGxvYWQgYW5kIHNlZ21lbnQuXG4gICAgaW5Qcm9jZXNzOiB0cnVlLFxuICB9LFxuICB7XG4gICAgaWQ6ICdtaWNyb3NhbS12aXQtYi1sbScsXG4gICAgbGFiZWw6ICdtaWNyby1zYW0gVmlULUInLFxuICAgIGVuY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9taWNyb3NhbS12aXQtYi1sbS1vbm54L3Jlc29sdmUvbWFpbi9lbmNvZGVyLmZwMTYub25ueCcsXG4gICAgZGVjb2RlclVybDogJ2h0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vamF4LWltYWdlLXRvb2xzL21pY3Jvc2FtLXZpdC1iLWxtLW9ubngvcmVzb2x2ZS9tYWluL2RlY29kZXIub25ueCcsXG4gICAgdmFyaWFudDogJ3NhbTEnLFxuICAgIGlucHV0U2l6ZTogMTAyNCxcbiAgICBtaWNyb3Njb3B5OiB0cnVlLFxuICB9LFxuICB7XG4gICAgaWQ6ICdwYXRoby1zYW0tdml0LWInLFxuICAgIGxhYmVsOiAncGF0aG8tc2FtIFZpVC1CJyxcbiAgICBlbmNvZGVyVXJsOiAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9qYXgtaW1hZ2UtdG9vbHMvcGF0aG8tc2FtLXZpdC1iLW9ubngvcmVzb2x2ZS9tYWluL2VuY29kZXIuZnAxNi5vbm54JyxcbiAgICBkZWNvZGVyVXJsOiAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9qYXgtaW1hZ2UtdG9vbHMvcGF0aG8tc2FtLXZpdC1iLW9ubngvcmVzb2x2ZS9tYWluL2RlY29kZXIub25ueCcsXG4gICAgdmFyaWFudDogJ3NhbTEnLFxuICAgIGlucHV0U2l6ZTogMTAyNCxcbiAgICBtaWNyb3Njb3B5OiB0cnVlLFxuICB9LFxuICB7XG4gICAgaWQ6ICdwYXRoby1zYW0tdml0LWItaW50OCcsXG4gICAgbGFiZWw6ICdwYXRoby1zYW0gVmlULUIgKGludDgpJyxcbiAgICBlbmNvZGVyVXJsOiAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9qYXgtaW1hZ2UtdG9vbHMvcGF0aG8tc2FtLXZpdC1iLW9ubngvcmVzb2x2ZS9tYWluL2VuY29kZXIuaW50OC5vbm54JyxcbiAgICBkZWNvZGVyVXJsOiAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9qYXgtaW1hZ2UtdG9vbHMvcGF0aG8tc2FtLXZpdC1iLW9ubngvcmVzb2x2ZS9tYWluL2RlY29kZXIub25ueCcsXG4gICAgdmFyaWFudDogJ3NhbTEnLFxuICAgIGlucHV0U2l6ZTogMTAyNCxcbiAgICBtaWNyb3Njb3B5OiB0cnVlLFxuICAgIC8vIGludDggZHluYW1pYy1xdWFudGl6ZWQgZW5jb2RlciAofjEwMCBNQiB2cyB+MTgwIE1CIGZwMTYsIElvVSB+MC45OSBvbiB0aGVcbiAgICAvLyBzYW5pdHkgdGVzdCkuIG9ubnhydW50aW1lLXdlYidzIFdlYkdQVSBFUCBkb2Vzbid0IHN1cHBvcnQgaW50OCBtYXRtdWwsIHNvXG4gICAgLy8gaXQgcnVucyBvbiBXQVNNIOKAlCBzbWFsbGVyIGRvd25sb2FkLCBzbG93ZXIgZW5jb2RlIHRoYW4gdGhlIGZwMTYgZW50cnkuXG4gICAgZW5jb2RlclByb3ZpZGVyczogWyd3YXNtJ10sXG4gIH0sXG5dO1xuXG4vKiogSW5pdGlhbCBkZWZhdWx0IG1vZGVsIGlkIChvdmVycmlkZGVuIGF0IHJ1bnRpbWUgb25jZSB0aGUgaG9zdCBjb25maWd1cmVzIGFcbiAqICBob3N0ZWQgbW9kZWwgdmlhIHtAbGluayBzZXRTYW1Nb2RlbFVybHN9KS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NBTV9NT0RFTF9JRCA9IFNBTV9NT0RFTFNbMF0uaWQ7XG5cbi8qKiBUaGUgYWN0aXZlIGRlZmF1bHQg4oCUIHVwZGF0ZWQgd2hlbiB0aGUgaG9zdCBjb25maWd1cmVzIGEgbW9kZWwncyBPTk5YIFVSTHMsXG4gKiAgc28gdGhlIHRvb2wgdXNlcyB0aGUgbW9kZWwgdGhhdCdzIGFjdHVhbGx5IGhvc3RlZCAobm90IGp1c3QgdGhlIGZpcnN0IGVudHJ5KS4gKi9cbmxldCBhY3RpdmVEZWZhdWx0SWQgPSBERUZBVUxUX1NBTV9NT0RFTF9JRDtcblxuLyoqIExvb2sgdXAgYSBtb2RlbCBieSBpZDsgZmFsbHMgYmFjayB0byB0aGUgYWN0aXZlIGRlZmF1bHQgd2hlbiBpZCBpc1xuICogIHVua25vd24vYWJzZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNhbU1vZGVsKGlkPzogc3RyaW5nKTogU2FtTW9kZWxEZWYge1xuICBjb25zdCB3YW50ZWQgPSBpZCA/PyBhY3RpdmVEZWZhdWx0SWQ7XG4gIHJldHVybiBTQU1fTU9ERUxTLmZpbmQoKG0pID0+IG0uaWQgPT09IHdhbnRlZCkgPz8gU0FNX01PREVMU1swXTtcbn1cblxuLyoqIFRoZSBhY3RpdmUgZGVmYXVsdCBtb2RlbCBpZCAod2hhdCB0aGUgdG9vbHMvcGlja2VyIHVzZSB3aGVuIHVuc2V0KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0U2FtTW9kZWxJZCgpOiBzdHJpbmcge1xuICByZXR1cm4gYWN0aXZlRGVmYXVsdElkO1xufVxuXG4vKiogU2V0IHRoZSBhY3RpdmUgZGVmYXVsdCBtb2RlbCBpZCAobXVzdCBiZSBhIHJlZ2lzdGVyZWQgbW9kZWwpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChTQU1fTU9ERUxTLnNvbWUoKG0pID0+IG0uaWQgPT09IGlkKSkgYWN0aXZlRGVmYXVsdElkID0gaWQ7XG59XG5cbi8qKiBUcnVlIHdoZW4gYSBtb2RlbCBoYXMgYm90aCBPTk5YIFVSTHMgY29uZmlndXJlZCAoaS5lLiBpdCBjYW4gYWN0dWFsbHkgcnVuKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhbU1vZGVsUmVhZHkobW9kZWw6IFNhbU1vZGVsRGVmKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIW1vZGVsLmVuY29kZXJVcmwgJiYgISFtb2RlbC5kZWNvZGVyVXJsO1xufVxuXG4vKipcbiAqIFBvaW50IGEgcmVnaXN0ZXJlZCBtb2RlbCBhdCBpdHMgaG9zdGVkIE9OTlggcGFpciAoSEYgLyBHQ1MpLiBDYWxsZWQgYnkgdGhlXG4gKiBob3N0J3MgY29tcG9zaXRpb24gcm9vdCBvbmNlIGhvc3RpbmcgaXMgZGVjaWRlZCwga2VlcGluZyBkZXBsb3ltZW50IFVSTHMgb3V0XG4gKiBvZiB0aGUgbGlicmFyeS4gUGFzcyBgcmV2aXNpb25gIHdoZW4gdGhlIGZpbGVzIGF0IHRob3NlIFVSTHMgY2FuIGJlIHJlcGxhY2VkIGluXG4gKiBwbGFjZSwgYW5kIGNoYW5nZSBpdCB3aGVuZXZlciB0aGV5IGFyZSAoc2VlIHtAbGluayBTYW1Nb2RlbERlZi5yZXZpc2lvbn0pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U2FtTW9kZWxVcmxzKGlkOiBzdHJpbmcsIGVuY29kZXJVcmw6IHN0cmluZywgZGVjb2RlclVybDogc3RyaW5nLCByZXZpc2lvbj86IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBtID0gU0FNX01PREVMUy5maW5kKCh4KSA9PiB4LmlkID09PSBpZCk7XG4gIGlmIChtKSB7XG4gICAgbS5lbmNvZGVyVXJsID0gZW5jb2RlclVybDtcbiAgICBtLmRlY29kZXJVcmwgPSBkZWNvZGVyVXJsO1xuICAgIGlmIChyZXZpc2lvbiAhPT0gdW5kZWZpbmVkKSBtLnJldmlzaW9uID0gcmV2aXNpb247XG4gICAgLy8gVGhlIGNvbmZpZ3VyZWQgKGhvc3RlZCkgbW9kZWwgYmVjb21lcyB0aGUgYWN0aXZlIGRlZmF1bHQsIHNvIHRoZSB0b29sc1xuICAgIC8vIHVzZSBpdCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgcmVnaXN0cnkgZW50cnkgKHdoaWNoIG1heSBiZSB1bmhvc3RlZCkuXG4gICAgaWYgKGVuY29kZXJVcmwgJiYgZGVjb2RlclVybCkgYWN0aXZlRGVmYXVsdElkID0gaWQ7XG4gIH1cbn1cbiJdfQ==
@@ -3,18 +3,71 @@ import * as ort from 'onnxruntime-web';
3
3
  * Shared, DOM-free SAM inference primitives used by BOTH inference backends:
4
4
  * the in-process session (`OnnxSamSession`, main thread) and the dedicated
5
5
  * Web Worker (`onnx-sam.worker`). Keeping these here avoids duplicating the
6
- * preprocessing / decoder-prompt math and keeps the worker DOM-free (it can't
7
- * import sam-prompt.ts, which pulls in DOM types).
6
+ * preprocessing / decoder-prompt math; nothing here may import Angular or the
7
+ * DOM, since the worker bundles it.
8
8
  */
9
+ /** SAM's per-channel (RGB) pixel mean, subtracted before the encoder. */
9
10
  export const PIXEL_MEAN = [123.675, 116.28, 103.53];
11
+ /** SAM's per-channel (RGB) pixel standard deviation, divided out before the encoder. */
10
12
  export const PIXEL_STD = [58.395, 57.12, 57.375];
11
- const MODEL_CACHE = 'sam-onnx';
13
+ /** Cache API store for downloaded model files. Bump the version only when the cache
14
+ * LAYOUT changes — opening the cache deletes every older `sam-onnx*` store. A model
15
+ * re-exported under the same URLs bumps its own `SamModelDef.revision` instead,
16
+ * which re-downloads that model alone (see {@link modelCacheKey}). */
17
+ const MODEL_CACHE_PREFIX = 'sam-onnx';
18
+ const MODEL_CACHE = `${MODEL_CACHE_PREFIX}-v2`;
19
+ let staleCachesPurged = null;
20
+ /** Delete model caches from earlier versions (once per page/worker). */
21
+ function purgeStaleModelCaches() {
22
+ staleCachesPurged ??= caches
23
+ .keys()
24
+ .then((names) => Promise.all(names.filter((n) => n.startsWith(MODEL_CACHE_PREFIX) && n !== MODEL_CACHE).map((n) => caches.delete(n))))
25
+ .then(() => undefined)
26
+ .catch(() => undefined); // best effort: a stale cache only wastes space
27
+ return staleCachesPurged;
28
+ }
29
+ /** Open the current model cache, or null where the Cache API is unavailable. */
30
+ async function openModelCache() {
31
+ if (typeof caches === 'undefined')
32
+ return null;
33
+ await purgeStaleModelCaches();
34
+ return caches.open(MODEL_CACHE).catch(() => null);
35
+ }
36
+ /**
37
+ * Delete every downloaded SAM model (several hundred MB per origin). Resolves
38
+ * to true when something was removed; false where the Cache API is unavailable.
39
+ */
40
+ export async function clearSamModelCache() {
41
+ if (typeof caches === 'undefined')
42
+ return false;
43
+ const names = (await caches.keys()).filter((n) => n.startsWith(MODEL_CACHE_PREFIX));
44
+ const removed = await Promise.all(names.map((n) => caches.delete(n)));
45
+ return removed.some(Boolean);
46
+ }
47
+ /**
48
+ * The Cache API key a model file is stored under: its URL, plus the model's
49
+ * `SamModelDef.revision` as a query parameter when it has one, so a bumped revision
50
+ * misses the cache and downloads the re-exported file.
51
+ */
52
+ export function modelCacheKey(url, revision) {
53
+ if (!revision)
54
+ return url;
55
+ return `${url}${url.includes('?') ? '&' : '?'}siv-model-rev=${encodeURIComponent(revision)}`;
56
+ }
57
+ /** Store a downloaded file under `key`, first dropping every other copy of the same file
58
+ * (other revisions, or the same path under another query): a model is several hundred
59
+ * MB, and a superseded copy would otherwise stay on disk for good. */
60
+ async function cacheModel(cache, url, key, body) {
61
+ await cache.delete(url, { ignoreSearch: true }).catch(() => undefined);
62
+ await cache.put(key, body).catch(() => undefined);
63
+ }
12
64
  /** Fetch a model as an ArrayBuffer, streaming progress and caching in the Cache
13
- * API (so it isn't re-downloaded). Cache hit → progress jumps to 1. Works on
14
- * the main thread and in a worker (both have `fetch` + `caches`). */
15
- export async function fetchModel(url, onProgress) {
16
- const cache = typeof caches !== 'undefined' ? await caches.open(MODEL_CACHE).catch(() => null) : null;
17
- const hit = cache ? await cache.match(url) : null;
65
+ * API (so it isn't re-downloaded) under {@link modelCacheKey}. Cache hit → progress
66
+ * jumps to 1. Works on the main thread and in a worker (both have `fetch` + `caches`). */
67
+ export async function fetchModel(url, onProgress, revision) {
68
+ const key = modelCacheKey(url, revision);
69
+ const cache = await openModelCache();
70
+ const hit = cache ? await cache.match(key) : null;
18
71
  if (hit) {
19
72
  onProgress?.(1);
20
73
  return await hit.arrayBuffer();
@@ -27,7 +80,7 @@ export async function fetchModel(url, onProgress) {
27
80
  const buf = await resp.arrayBuffer();
28
81
  onProgress?.(1);
29
82
  if (cache)
30
- await cache.put(url, new Response(buf)).catch(() => undefined);
83
+ await cacheModel(cache, url, key, new Response(buf));
31
84
  return buf;
32
85
  }
33
86
  const reader = resp.body.getReader();
@@ -48,8 +101,8 @@ export async function fetchModel(url, onProgress) {
48
101
  off += c.length;
49
102
  }
50
103
  if (cache) {
51
- await cache.put(url, new Response(out.slice(), { headers: { 'content-length': String(received) } }))
52
- .catch(() => undefined);
104
+ // The Response copies its body, so no extra full-size copy of the model here.
105
+ await cacheModel(cache, url, key, new Response(out, { headers: { 'content-length': String(received) } }));
53
106
  }
54
107
  onProgress?.(1);
55
108
  return out.buffer;
@@ -134,8 +187,11 @@ export async function runEncoder(encoder, data, width, height, inputSize) {
134
187
  });
135
188
  const emb = out[encoder.outputNames[0]];
136
189
  return {
137
- data: emb.data, dims: emb.dims,
138
- scale, imageWidth: width, imageHeight: height,
190
+ data: emb.data,
191
+ dims: emb.dims,
192
+ scale,
193
+ imageWidth: width,
194
+ imageHeight: height,
139
195
  };
140
196
  }
141
197
  /** Run the decoder for one prompt against a cached embedding → a binary mask. */
@@ -156,4 +212,4 @@ export async function runDecoder(decoder, e, prompt) {
156
212
  const logits = masks.data.subarray(idx * h * w, (idx + 1) * h * w);
157
213
  return { mask: binarizeMask(logits), width: w, height: h, iou: iou[idx] ?? 1 };
158
214
  }
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLW9ubngtY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLW9ubngtY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLGlCQUFpQixDQUFDO0FBSXZDOzs7Ozs7R0FNRztBQUVILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDcEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNqRCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUM7QUFtQi9COztzRUFFc0U7QUFDdEUsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQUMsR0FBVyxFQUFFLFVBQWdDO0lBQzVFLE1BQU0sS0FBSyxHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3RHLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbEQsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUMsT0FBTyxNQUFNLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUFDLENBQUM7SUFFN0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQUUs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RyxLQUFLLENBQUMsQ0FBQztRQUMzQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDbkIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDOUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUMxQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDbkIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FB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TSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9GLENBQUMsQ0FBQztJQUNILE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFELE1BQU0sR0FBRyxHQUFJLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLElBQXFCLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckYsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBZ0IsQ0FBQztJQUMzQyxNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQyxNQUFNLE1BQU0sR0FBSSxLQUFLLENBQUMsSUFBcUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2pGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBvcnQgZnJvbSAnb25ueHJ1bnRpbWUtd2ViJztcblxuaW1wb3J0IHR5cGUgeyBTYW1Qcm9tcHQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvc2FtLmNvbnRyYWN0JztcblxuLyoqXG4gKiBTaGFyZWQsIERPTS1mcmVlIFNBTSBpbmZlcmVuY2UgcHJpbWl0aXZlcyB1c2VkIGJ5IEJPVEggaW5mZXJlbmNlIGJhY2tlbmRzOlxuICogdGhlIGluLXByb2Nlc3Mgc2Vzc2lvbiAoYE9ubnhTYW1TZXNzaW9uYCwgbWFpbiB0aHJlYWQpIGFuZCB0aGUgZGVkaWNhdGVkXG4gKiBXZWIgV29ya2VyIChgb25ueC1zYW0ud29ya2VyYCkuIEtlZXBpbmcgdGhlc2UgaGVyZSBhdm9pZHMgZHVwbGljYXRpbmcgdGhlXG4gKiBwcmVwcm9jZXNzaW5nIC8gZGVjb2Rlci1wcm9tcHQgbWF0aCBhbmQga2VlcHMgdGhlIHdvcmtlciBET00tZnJlZSAoaXQgY2FuJ3RcbiAqIGltcG9ydCBzYW0tcHJvbXB0LnRzLCB3aGljaCBwdWxscyBpbiBET00gdHlwZXMpLlxuICovXG5cbmV4cG9ydCBjb25zdCBQSVhFTF9NRUFOID0gWzEyMy42NzUsIDExNi4yOCwgMTAzLjUzXTtcbmV4cG9ydCBjb25zdCBQSVhFTF9TVEQgPSBbNTguMzk1LCA1Ny4xMiwgNTcuMzc1XTtcbmNvbnN0IE1PREVMX0NBQ0hFID0gJ3NhbS1vbm54JztcblxuLyoqIEVuY29kZXIgb3V0cHV0IGZvciBvbmUgaW1hZ2UsIHJldXNlZCBhY3Jvc3MgcHJvbXB0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZUVtYmVkZGluZyB7XG4gIGRhdGE6IEZsb2F0MzJBcnJheTtcbiAgZGltczogbnVtYmVyW107XG4gIHNjYWxlOiBudW1iZXI7XG4gIGltYWdlV2lkdGg6IG51bWJlcjtcbiAgaW1hZ2VIZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqIERlY29kZXIgb3V0cHV0OiBhIGJpbmFyeSBtYXNrIGF0IG9yaWdpbmFsLWltYWdlIHJlc29sdXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIENvcmVNYXNrIHtcbiAgbWFzazogVWludDhBcnJheTtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGlvdTogbnVtYmVyO1xufVxuXG4vKiogRmV0Y2ggYSBtb2RlbCBhcyBhbiBBcnJheUJ1ZmZlciwgc3RyZWFtaW5nIHByb2dyZXNzIGFuZCBjYWNoaW5nIGluIHRoZSBDYWNoZVxuICogIEFQSSAoc28gaXQgaXNuJ3QgcmUtZG93bmxvYWRlZCkuIENhY2hlIGhpdCDihpIgcHJvZ3Jlc3MganVtcHMgdG8gMS4gV29ya3Mgb25cbiAqICB0aGUgbWFpbiB0aHJlYWQgYW5kIGluIGEgd29ya2VyIChib3RoIGhhdmUgYGZldGNoYCArIGBjYWNoZXNgKS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaE1vZGVsKHVybDogc3RyaW5nLCBvblByb2dyZXNzPzogKGY6IG51bWJlcikgPT4gdm9pZCk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgY29uc3QgY2FjaGUgPSB0eXBlb2YgY2FjaGVzICE9PSAndW5kZWZpbmVkJyA/IGF3YWl0IGNhY2hlcy5vcGVuKE1PREVMX0NBQ0hFKS5jYXRjaCgoKSA9PiBudWxsKSA6IG51bGw7XG4gIGNvbnN0IGhpdCA9IGNhY2hlID8gYXdhaXQgY2FjaGUubWF0Y2godXJsKSA6IG51bGw7XG4gIGlmIChoaXQpIHsgb25Qcm9ncmVzcz8uKDEpOyByZXR1cm4gYXdhaXQgaGl0LmFycmF5QnVmZmVyKCk7IH1cblxuICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgaWYgKCFyZXNwLm9rKSB0aHJvdyBuZXcgRXJyb3IoYGZldGNoICR7dXJsfSBmYWlsZWQ6IEhUVFAgJHtyZXNwLnN0YXR1c31gKTtcbiAgY29uc3QgdG90YWwgPSBOdW1iZXIocmVzcC5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKSkgfHwgMDtcbiAgaWYgKCFyZXNwLmJvZHkgfHwgIXRvdGFsKSB7XG4gICAgY29uc3QgYnVmID0gYXdhaXQgcmVzcC5hcnJheUJ1ZmZlcigpO1xuICAgIG9uUHJvZ3Jlc3M/LigxKTtcbiAgICBpZiAoY2FjaGUpIGF3YWl0IGNhY2hlLnB1dCh1cmwsIG5ldyBSZXNwb25zZShidWYpKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIHJldHVybiBidWY7XG4gIH1cbiAgY29uc3QgcmVhZGVyID0gcmVzcC5ib2R5LmdldFJlYWRlcigpO1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgcmVjZWl2ZWQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoZG9uZSkgYnJlYWs7XG4gICAgY2h1bmtzLnB1c2godmFsdWUpO1xuICAgIHJlY2VpdmVkICs9IHZhbHVlLmxlbmd0aDtcbiAgICBvblByb2dyZXNzPy4ocmVjZWl2ZWQgLyB0b3RhbCk7XG4gIH1cbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4QXJyYXkocmVjZWl2ZWQpO1xuICBsZXQgb2ZmID0gMDtcbiAgZm9yIChjb25zdCBjIG9mIGNodW5rcykgeyBvdXQuc2V0KGMsIG9mZik7IG9mZiArPSBjLmxlbmd0aDsgfVxuICBpZiAoY2FjaGUpIHtcbiAgICBhd2FpdCBjYWNoZS5wdXQodXJsLCBuZXcgUmVzcG9uc2Uob3V0LnNsaWNlKCksIHsgaGVhZGVyczogeyAnY29udGVudC1sZW5ndGgnOiBTdHJpbmcocmVjZWl2ZWQpIH0gfSkpXG4gICAgICAuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfVxuICBvblByb2dyZXNzPy4oMSk7XG4gIHJldHVybiBvdXQuYnVmZmVyO1xufVxuXG4vKiogUmVzaXplIChsb25nIHNpZGUg4oaSIHNpemUsIGJpbGluZWFyKSwgcGFkIHRvIHNpemXDl3NpemUsIFNBTS1ub3JtYWxpemUg4oaSIENIVyBmbG9hdDMyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXByb2Nlc3MoXG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgc2l6ZTogbnVtYmVyLCBzY2FsZTogbnVtYmVyLFxuKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbmV3VyA9IE1hdGgucm91bmQod2lkdGggKiBzY2FsZSk7XG4gIGNvbnN0IG5ld0ggPSBNYXRoLnJvdW5kKGhlaWdodCAqIHNjYWxlKTtcbiAgY29uc3QgY2h3ID0gbmV3IEZsb2F0MzJBcnJheSgzICogc2l6ZSAqIHNpemUpOyAvLyB6ZXJvLXBhZGRlZFxuICBmb3IgKGxldCB5ID0gMDsgeSA8IG5ld0g7IHkrKykge1xuICAgIGNvbnN0IHN5ID0gTWF0aC5taW4oaGVpZ2h0IC0gMSwgeSAvIHNjYWxlKTtcbiAgICBjb25zdCB5MCA9IE1hdGguZmxvb3Ioc3kpO1xuICAgIGNvbnN0IGZ5ID0gc3kgLSB5MDtcbiAgICBjb25zdCB5MSA9IE1hdGgubWluKGhlaWdodCAtIDEsIHkwICsgMSk7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBuZXdXOyB4KyspIHtcbiAgICAgIGNvbnN0IHN4ID0gTWF0aC5taW4od2lkdGggLSAxLCB4IC8gc2NhbGUpO1xuICAgICAgY29uc3QgeDAgPSBNYXRoLmZsb29yKHN4KTtcbiAgICAgIGNvbnN0IGZ4ID0gc3ggLSB4MDtcbiAgICAgIGNvbnN0IHgxID0gTWF0aC5taW4od2lkdGggLSAxLCB4MCArIDEpO1xuICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCAzOyBjKyspIHtcbiAgICAgICAgY29uc3QgcDAwID0gZGF0YVsoeTAgKiB3aWR0aCArIHgwKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgcDAxID0gZGF0YVsoeTAgKiB3aWR0aCArIHgxKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgcDEwID0gZGF0YVsoeTEgKiB3aWR0aCArIHgwKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgcDExID0gZGF0YVsoeTEgKiB3aWR0aCArIHgxKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgdG9wID0gcDAwICsgKHAwMSAtIHAwMCkgKiBmeDtcbiAgICAgICAgY29uc3QgYm90ID0gcDEwICsgKHAxMSAtIHAxMCkgKiBmeDtcbiAgICAgICAgY29uc3QgdiA9IHRvcCArIChib3QgLSB0b3ApICogZnk7XG4gICAgICAgIGNod1tjICogc2l6ZSAqIHNpemUgKyB5ICogc2l6ZSArIHhdID0gKHYgLSBQSVhFTF9NRUFOW2NdKSAvIFBJWEVMX1NURFtjXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNodztcbn1cblxuLyoqIEFzc2VtYmxlIGRlY29kZXIgYHBvaW50X2Nvb3Jkc2AvYHBvaW50X2xhYmVsc2AgZnJvbSBhIHByb21wdCwgaW4gZW5jb2RlclxuICogIChyZXNpemVkKSBzcGFjZS4gQm94ID0gdHdvIHBvaW50cyBsYWJlbGxlZCAyLzM7IHBvaW50cyB1c2UgMS8wOyBhIHBvaW50cy1vbmx5XG4gKiAgcHJvbXB0IHBhZHMgdGhlIGFic2VudCBib3ggc2xvdCB3aXRoIGBbMCwwXWAgbGFiZWxsZWQgLTEuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREZWNvZGVyUHJvbXB0KFxuICBwcm9tcHQ6IFNhbVByb21wdCwgc2NhbGU6IG51bWJlcixcbik6IHsgcG9pbnRDb29yZHM6IEZsb2F0MzJBcnJheTsgcG9pbnRMYWJlbHM6IEZsb2F0MzJBcnJheTsgbnVtUG9pbnRzOiBudW1iZXIgfSB7XG4gIGNvbnN0IGNvb3JkczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgbGFiZWxzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHAgb2YgcHJvbXB0LnBvaW50cyA/PyBbXSkgeyBjb29yZHMucHVzaChwLnggKiBzY2FsZSwgcC55ICogc2NhbGUpOyBsYWJlbHMucHVzaChwLmxhYmVsKTsgfVxuICBpZiAocHJvbXB0LmJveCkge1xuICAgIGNvbnN0IGIgPSBwcm9tcHQuYm94O1xuICAgIGNvb3Jkcy5wdXNoKGIueDAgKiBzY2FsZSwgYi55MCAqIHNjYWxlKTsgbGFiZWxzLnB1c2goMik7XG4gICAgY29vcmRzLnB1c2goYi54MSAqIHNjYWxlLCBiLnkxICogc2NhbGUpOyBsYWJlbHMucHVzaCgzKTtcbiAgfSBlbHNlIGlmIChsYWJlbHMubGVuZ3RoID4gMCkge1xuICAgIGNvb3Jkcy5wdXNoKDAsIDApOyBsYWJlbHMucHVzaCgtMSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwb2ludENvb3JkczogRmxvYXQzMkFycmF5LmZyb20oY29vcmRzKSxcbiAgICBwb2ludExhYmVsczogRmxvYXQzMkFycmF5LmZyb20obGFiZWxzKSxcbiAgICBudW1Qb2ludHM6IGxhYmVscy5sZW5ndGgsXG4gIH07XG59XG5cbi8qKiBCaW5hcml6ZSBtYXNrIGxvZ2l0cyAoYD4gdGhyZXNob2xkYCkgaW50byBhIDAvMSBtYXNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyaXplTWFzayhsb2dpdHM6IEZsb2F0MzJBcnJheSwgdGhyZXNob2xkID0gMCk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheShsb2dpdHMubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2dpdHMubGVuZ3RoOyBpKyspIG91dFtpXSA9IGxvZ2l0c1tpXSA+IHRocmVzaG9sZCA/IDEgOiAwO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKiogSW5kZXggb2YgdGhlIGhpZ2hlc3Qtc2NvcmluZyBtYXNrIGluIGEgbXVsdGltYXNrIGRlY29kZXIgb3V0cHV0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlc3RNYXNrSW5kZXgoaW91OiBGbG9hdDMyQXJyYXkgfCBudW1iZXJbXSk6IG51bWJlciB7XG4gIGxldCBiZXN0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBpb3UubGVuZ3RoOyBpKyspIGlmIChpb3VbaV0gPiBpb3VbYmVzdF0pIGJlc3QgPSBpO1xuICByZXR1cm4gYmVzdDtcbn1cblxuLyoqIFJ1biB0aGUgZW5jb2RlciBvbiBhbiBSR0JBIGltYWdlIOKGkiBhIHJldXNhYmxlIGVtYmVkZGluZy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5FbmNvZGVyKFxuICBlbmNvZGVyOiBvcnQuSW5mZXJlbmNlU2Vzc2lvbiwgZGF0YTogVWludDhDbGFtcGVkQXJyYXksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBpbnB1dFNpemU6IG51bWJlcixcbik6IFByb21pc2U8Q29yZUVtYmVkZGluZz4ge1xuICBjb25zdCBzY2FsZSA9IGlucHV0U2l6ZSAvIE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpO1xuICBjb25zdCBpbnB1dCA9IHByZXByb2Nlc3MoZGF0YSwgd2lkdGgsIGhlaWdodCwgaW5wdXRTaXplLCBzY2FsZSk7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGVuY29kZXIucnVuKHtcbiAgICBbZW5jb2Rlci5pbnB1dE5hbWVzWzBdXTogbmV3IG9ydC5UZW5zb3IoJ2Zsb2F0MzInLCBpbnB1dCwgWzEsIDMsIGlucHV0U2l6ZSwgaW5wdXRTaXplXSksXG4gIH0pO1xuICBjb25zdCBlbWIgPSBvdXRbZW5jb2Rlci5vdXRwdXROYW1lc1swXV07XG4gIHJldHVybiB7XG4gICAgZGF0YTogZW1iLmRhdGEgYXMgRmxvYXQzMkFycmF5LCBkaW1zOiBlbWIuZGltcyBhcyBudW1iZXJbXSxcbiAgICBzY2FsZSwgaW1hZ2VXaWR0aDogd2lkdGgsIGltYWdlSGVpZ2h0OiBoZWlnaHQsXG4gIH07XG59XG5cbi8qKiBSdW4gdGhlIGRlY29kZXIgZm9yIG9uZSBwcm9tcHQgYWdhaW5zdCBhIGNhY2hlZCBlbWJlZGRpbmcg4oaSIGEgYmluYXJ5IG1hc2suICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuRGVjb2RlcihcbiAgZGVjb2Rlcjogb3J0LkluZmVyZW5jZVNlc3Npb24sIGU6IENvcmVFbWJlZGRpbmcsIHByb21wdDogU2FtUHJvbXB0LFxuKTogUHJvbWlzZTxDb3JlTWFzaz4ge1xuICBjb25zdCB7IHBvaW50Q29vcmRzLCBwb2ludExhYmVscywgbnVtUG9pbnRzIH0gPSBidWlsZERlY29kZXJQcm9tcHQocHJvbXB0LCBlLnNjYWxlKTtcbiAgY29uc3Qgb3V0ID0gYXdhaXQgZGVjb2Rlci5ydW4oe1xuICAgIGltYWdlX2VtYmVkZGluZ3M6IG5ldyBvcnQuVGVuc29yKCdmbG9hdDMyJywgZS5kYXRhLCBlLmRpbXMpLFxuICAgIHBvaW50X2Nvb3JkczogbmV3IG9ydC5UZW5zb3IoJ2Zsb2F0MzInLCBwb2ludENvb3JkcywgWzEsIG51bVBvaW50cywgMl0pLFxuICAgIHBvaW50X2xhYmVsczogbmV3IG9ydC5UZW5zb3IoJ2Zsb2F0MzInLCBwb2ludExhYmVscywgWzEsIG51bVBvaW50c10pLFxuICAgIG1hc2tfaW5wdXQ6IG5ldyBvcnQuVGVuc29yKCdmbG9hdDMyJywgbmV3IEZsb2F0MzJBcnJheSgyNTYgKiAyNTYpLCBbMSwgMSwgMjU2LCAyNTZdKSxcbiAgICBoYXNfbWFza19pbnB1dDogbmV3IG9ydC5UZW5zb3IoJ2Zsb2F0MzInLCBGbG9hdDMyQXJyYXkuZnJvbShbMF0pLCBbMV0pLFxuICAgIG9yaWdfaW1fc2l6ZTogbmV3IG9ydC5UZW5zb3IoJ2Zsb2F0MzInLCBGbG9hdDMyQXJyYXkuZnJvbShbZS5pbWFnZUhlaWdodCwgZS5pbWFnZVdpZHRoXSksIFsyXSksXG4gIH0pO1xuICBjb25zdCBtYXNrcyA9IG91dFsnbWFza3MnXSA/PyBvdXRbZGVjb2Rlci5vdXRwdXROYW1lc1swXV07XG4gIGNvbnN0IGlvdSA9IChvdXRbJ2lvdV9wcmVkaWN0aW9ucyddPy5kYXRhIGFzIEZsb2F0MzJBcnJheSkgPz8gRmxvYXQzMkFycmF5LmZyb20oWzFdKTtcbiAgY29uc3QgWywgbSwgaCwgd10gPSBtYXNrcy5kaW1zIGFzIG51bWJlcltdO1xuICBjb25zdCBpZHggPSBiZXN0TWFza0luZGV4KGlvdS5zbGljZSgwLCBtKSk7XG4gIGNvbnN0IGxvZ2l0cyA9IChtYXNrcy5kYXRhIGFzIEZsb2F0MzJBcnJheSkuc3ViYXJyYXkoaWR4ICogaCAqIHcsIChpZHggKyAxKSAqIGggKiB3KTtcbiAgcmV0dXJuIHsgbWFzazogYmluYXJpemVNYXNrKGxvZ2l0cyksIHdpZHRoOiB3LCBoZWlnaHQ6IGgsIGlvdTogaW91W2lkeF0gPz8gMSB9O1xufVxuIl19
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLW9ubngtY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLW9ubngtY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLGlCQUFpQixDQUFDO0FBSXZDOzs7Ozs7R0FNRztBQUVILHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3BELHdGQUF3RjtBQUN4RixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2pEOzs7dUVBR3VFO0FBQ3ZFLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDO0FBQ3RDLE1BQU0sV0FBVyxHQUFHLEdBQUcsa0JBQWtCLEtBQUssQ0FBQztBQUUvQyxJQUFJLGlCQUFpQixHQUF5QixJQUFJLENBQUM7QUFFbkQsd0VBQXdFO0FBQ3hFLFNBQVMscUJBQXFCO0lBQzVCLGlCQUFpQixLQUFLLE1BQU07U0FDekIsSUFBSSxFQUFFO1NBQ04sSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDZCxPQUFPLENBQUMsR0FBRyxDQUNULEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3hHLENBQ0Y7U0FDQSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDO1NBQ3JCLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FB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LENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzlCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ25CLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FB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QUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUQsTUFBTSxHQUFHLEdBQUksR0FBRyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsSUFBcUIsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFnQixDQUFDO0lBQzNDLE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sTUFBTSxHQUFJLEtBQUssQ0FBQyxJQUFxQixDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckYsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDakYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIG9ydCBmcm9tICdvbm54cnVudGltZS13ZWInO1xuXG5pbXBvcnQgdHlwZSB7IFNhbVByb21wdCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zYW0uY29udHJhY3QnO1xuXG4vKipcbiAqIFNoYXJlZCwgRE9NLWZyZWUgU0FNIGluZmVyZW5jZSBwcmltaXRpdmVzIHVzZWQgYnkgQk9USCBpbmZlcmVuY2UgYmFja2VuZHM6XG4gKiB0aGUgaW4tcHJvY2VzcyBzZXNzaW9uIChgT25ueFNhbVNlc3Npb25gLCBtYWluIHRocmVhZCkgYW5kIHRoZSBkZWRpY2F0ZWRcbiAqIFdlYiBXb3JrZXIgKGBvbm54LXNhbS53b3JrZXJgKS4gS2VlcGluZyB0aGVzZSBoZXJlIGF2b2lkcyBkdXBsaWNhdGluZyB0aGVcbiAqIHByZXByb2Nlc3NpbmcgLyBkZWNvZGVyLXByb21wdCBtYXRoOyBub3RoaW5nIGhlcmUgbWF5IGltcG9ydCBBbmd1bGFyIG9yIHRoZVxuICogRE9NLCBzaW5jZSB0aGUgd29ya2VyIGJ1bmRsZXMgaXQuXG4gKi9cblxuLyoqIFNBTSdzIHBlci1jaGFubmVsIChSR0IpIHBpeGVsIG1lYW4sIHN1YnRyYWN0ZWQgYmVmb3JlIHRoZSBlbmNvZGVyLiAqL1xuZXhwb3J0IGNvbnN0IFBJWEVMX01FQU4gPSBbMTIzLjY3NSwgMTE2LjI4LCAxMDMuNTNdO1xuLyoqIFNBTSdzIHBlci1jaGFubmVsIChSR0IpIHBpeGVsIHN0YW5kYXJkIGRldmlhdGlvbiwgZGl2aWRlZCBvdXQgYmVmb3JlIHRoZSBlbmNvZGVyLiAqL1xuZXhwb3J0IGNvbnN0IFBJWEVMX1NURCA9IFs1OC4zOTUsIDU3LjEyLCA1Ny4zNzVdO1xuLyoqIENhY2hlIEFQSSBzdG9yZSBmb3IgZG93bmxvYWRlZCBtb2RlbCBmaWxlcy4gQnVtcCB0aGUgdmVyc2lvbiBvbmx5IHdoZW4gdGhlIGNhY2hlXG4gKiAgTEFZT1VUIGNoYW5nZXMg4oCUIG9wZW5pbmcgdGhlIGNhY2hlIGRlbGV0ZXMgZXZlcnkgb2xkZXIgYHNhbS1vbm54KmAgc3RvcmUuIEEgbW9kZWxcbiAqICByZS1leHBvcnRlZCB1bmRlciB0aGUgc2FtZSBVUkxzIGJ1bXBzIGl0cyBvd24gYFNhbU1vZGVsRGVmLnJldmlzaW9uYCBpbnN0ZWFkLFxuICogIHdoaWNoIHJlLWRvd25sb2FkcyB0aGF0IG1vZGVsIGFsb25lIChzZWUge0BsaW5rIG1vZGVsQ2FjaGVLZXl9KS4gKi9cbmNvbnN0IE1PREVMX0NBQ0hFX1BSRUZJWCA9ICdzYW0tb25ueCc7XG5jb25zdCBNT0RFTF9DQUNIRSA9IGAke01PREVMX0NBQ0hFX1BSRUZJWH0tdjJgO1xuXG5sZXQgc3RhbGVDYWNoZXNQdXJnZWQ6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcblxuLyoqIERlbGV0ZSBtb2RlbCBjYWNoZXMgZnJvbSBlYXJsaWVyIHZlcnNpb25zIChvbmNlIHBlciBwYWdlL3dvcmtlcikuICovXG5mdW5jdGlvbiBwdXJnZVN0YWxlTW9kZWxDYWNoZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHN0YWxlQ2FjaGVzUHVyZ2VkID8/PSBjYWNoZXNcbiAgICAua2V5cygpXG4gICAgLnRoZW4oKG5hbWVzKSA9PlxuICAgICAgUHJvbWlzZS5hbGwoXG4gICAgICAgIG5hbWVzLmZpbHRlcigobikgPT4gbi5zdGFydHNXaXRoKE1PREVMX0NBQ0hFX1BSRUZJWCkgJiYgbiAhPT0gTU9ERUxfQ0FDSEUpLm1hcCgobikgPT4gY2FjaGVzLmRlbGV0ZShuKSksXG4gICAgICApLFxuICAgIClcbiAgICAudGhlbigoKSA9PiB1bmRlZmluZWQpXG4gICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7IC8vIGJlc3QgZWZmb3J0OiBhIHN0YWxlIGNhY2hlIG9ubHkgd2FzdGVzIHNwYWNlXG4gIHJldHVybiBzdGFsZUNhY2hlc1B1cmdlZDtcbn1cblxuLyoqIE9wZW4gdGhlIGN1cnJlbnQgbW9kZWwgY2FjaGUsIG9yIG51bGwgd2hlcmUgdGhlIENhY2hlIEFQSSBpcyB1bmF2YWlsYWJsZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5Nb2RlbENhY2hlKCk6IFByb21pc2U8Q2FjaGUgfCBudWxsPiB7XG4gIGlmICh0eXBlb2YgY2FjaGVzID09PSAndW5kZWZpbmVkJykgcmV0dXJuIG51bGw7XG4gIGF3YWl0IHB1cmdlU3RhbGVNb2RlbENhY2hlcygpO1xuICByZXR1cm4gY2FjaGVzLm9wZW4oTU9ERUxfQ0FDSEUpLmNhdGNoKCgpID0+IG51bGwpO1xufVxuXG4vKipcbiAqIERlbGV0ZSBldmVyeSBkb3dubG9hZGVkIFNBTSBtb2RlbCAoc2V2ZXJhbCBodW5kcmVkIE1CIHBlciBvcmlnaW4pLiBSZXNvbHZlc1xuICogdG8gdHJ1ZSB3aGVuIHNvbWV0aGluZyB3YXMgcmVtb3ZlZDsgZmFsc2Ugd2hlcmUgdGhlIENhY2hlIEFQSSBpcyB1bmF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFyU2FtTW9kZWxDYWNoZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKHR5cGVvZiBjYWNoZXMgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IG5hbWVzID0gKGF3YWl0IGNhY2hlcy5rZXlzKCkpLmZpbHRlcigobikgPT4gbi5zdGFydHNXaXRoKE1PREVMX0NBQ0hFX1BSRUZJWCkpO1xuICBjb25zdCByZW1vdmVkID0gYXdhaXQgUHJvbWlzZS5hbGwobmFtZXMubWFwKChuKSA9PiBjYWNoZXMuZGVsZXRlKG4pKSk7XG4gIHJldHVybiByZW1vdmVkLnNvbWUoQm9vbGVhbik7XG59XG5cbi8qKiBFbmNvZGVyIG91dHB1dCBmb3Igb25lIGltYWdlLCByZXVzZWQgYWNyb3NzIHByb21wdHMuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcmVFbWJlZGRpbmcge1xuICBkYXRhOiBGbG9hdDMyQXJyYXk7XG4gIGRpbXM6IG51bWJlcltdO1xuICBzY2FsZTogbnVtYmVyO1xuICBpbWFnZVdpZHRoOiBudW1iZXI7XG4gIGltYWdlSGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBEZWNvZGVyIG91dHB1dDogYSBiaW5hcnkgbWFzayBhdCBvcmlnaW5hbC1pbWFnZSByZXNvbHV0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlTWFzayB7XG4gIG1hc2s6IFVpbnQ4QXJyYXk7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBpb3U6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgQ2FjaGUgQVBJIGtleSBhIG1vZGVsIGZpbGUgaXMgc3RvcmVkIHVuZGVyOiBpdHMgVVJMLCBwbHVzIHRoZSBtb2RlbCdzXG4gKiBgU2FtTW9kZWxEZWYucmV2aXNpb25gIGFzIGEgcXVlcnkgcGFyYW1ldGVyIHdoZW4gaXQgaGFzIG9uZSwgc28gYSBidW1wZWQgcmV2aXNpb25cbiAqIG1pc3NlcyB0aGUgY2FjaGUgYW5kIGRvd25sb2FkcyB0aGUgcmUtZXhwb3J0ZWQgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsQ2FjaGVLZXkodXJsOiBzdHJpbmcsIHJldmlzaW9uPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFyZXZpc2lvbikgcmV0dXJuIHVybDtcbiAgcmV0dXJuIGAke3VybH0ke3VybC5pbmNsdWRlcygnPycpID8gJyYnIDogJz8nfXNpdi1tb2RlbC1yZXY9JHtlbmNvZGVVUklDb21wb25lbnQocmV2aXNpb24pfWA7XG59XG5cbi8qKiBTdG9yZSBhIGRvd25sb2FkZWQgZmlsZSB1bmRlciBga2V5YCwgZmlyc3QgZHJvcHBpbmcgZXZlcnkgb3RoZXIgY29weSBvZiB0aGUgc2FtZSBmaWxlXG4gKiAgKG90aGVyIHJldmlzaW9ucywgb3IgdGhlIHNhbWUgcGF0aCB1bmRlciBhbm90aGVyIHF1ZXJ5KTogYSBtb2RlbCBpcyBzZXZlcmFsIGh1bmRyZWRcbiAqICBNQiwgYW5kIGEgc3VwZXJzZWRlZCBjb3B5IHdvdWxkIG90aGVyd2lzZSBzdGF5IG9uIGRpc2sgZm9yIGdvb2QuICovXG5hc3luYyBmdW5jdGlvbiBjYWNoZU1vZGVsKGNhY2hlOiBDYWNoZSwgdXJsOiBzdHJpbmcsIGtleTogc3RyaW5nLCBib2R5OiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBjYWNoZS5kZWxldGUodXJsLCB7IGlnbm9yZVNlYXJjaDogdHJ1ZSB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICBhd2FpdCBjYWNoZS5wdXQoa2V5LCBib2R5KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xufVxuXG4vKiogRmV0Y2ggYSBtb2RlbCBhcyBhbiBBcnJheUJ1ZmZlciwgc3RyZWFtaW5nIHByb2dyZXNzIGFuZCBjYWNoaW5nIGluIHRoZSBDYWNoZVxuICogIEFQSSAoc28gaXQgaXNuJ3QgcmUtZG93bmxvYWRlZCkgdW5kZXIge0BsaW5rIG1vZGVsQ2FjaGVLZXl9LiBDYWNoZSBoaXQg4oaSIHByb2dyZXNzXG4gKiAganVtcHMgdG8gMS4gV29ya3Mgb24gdGhlIG1haW4gdGhyZWFkIGFuZCBpbiBhIHdvcmtlciAoYm90aCBoYXZlIGBmZXRjaGAgKyBgY2FjaGVzYCkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNb2RlbChcbiAgdXJsOiBzdHJpbmcsXG4gIG9uUHJvZ3Jlc3M/OiAoZjogbnVtYmVyKSA9PiB2b2lkLFxuICByZXZpc2lvbj86IHN0cmluZyxcbik6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgY29uc3Qga2V5ID0gbW9kZWxDYWNoZUtleSh1cmwsIHJldmlzaW9uKTtcbiAgY29uc3QgY2FjaGUgPSBhd2FpdCBvcGVuTW9kZWxDYWNoZSgpO1xuICBjb25zdCBoaXQgPSBjYWNoZSA/IGF3YWl0IGNhY2hlLm1hdGNoKGtleSkgOiBudWxsO1xuICBpZiAoaGl0KSB7XG4gICAgb25Qcm9ncmVzcz8uKDEpO1xuICAgIHJldHVybiBhd2FpdCBoaXQuYXJyYXlCdWZmZXIoKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcihgZmV0Y2ggJHt1cmx9IGZhaWxlZDogSFRUUCAke3Jlc3Auc3RhdHVzfWApO1xuICBjb25zdCB0b3RhbCA9IE51bWJlcihyZXNwLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKSB8fCAwO1xuICBpZiAoIXJlc3AuYm9keSB8fCAhdG90YWwpIHtcbiAgICBjb25zdCBidWYgPSBhd2FpdCByZXNwLmFycmF5QnVmZmVyKCk7XG4gICAgb25Qcm9ncmVzcz8uKDEpO1xuICAgIGlmIChjYWNoZSkgYXdhaXQgY2FjaGVNb2RlbChjYWNoZSwgdXJsLCBrZXksIG5ldyBSZXNwb25zZShidWYpKTtcbiAgICByZXR1cm4gYnVmO1xuICB9XG4gIGNvbnN0IHJlYWRlciA9IHJlc3AuYm9keS5nZXRSZWFkZXIoKTtcbiAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgbGV0IHJlY2VpdmVkID0gMDtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgaWYgKGRvbmUpIGJyZWFrO1xuICAgIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgICByZWNlaXZlZCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgb25Qcm9ncmVzcz8uKHJlY2VpdmVkIC8gdG90YWwpO1xuICB9XG4gIGNvbnN0IG91dCA9IG5ldyBVaW50OEFycmF5KHJlY2VpdmVkKTtcbiAgbGV0IG9mZiA9IDA7XG4gIGZvciAoY29uc3QgYyBvZiBjaHVua3MpIHtcbiAgICBvdXQuc2V0KGMsIG9mZik7XG4gICAgb2ZmICs9IGMubGVuZ3RoO1xuICB9XG4gIGlmIChjYWNoZSkge1xuICAgIC8vIFRoZSBSZXNwb25zZSBjb3BpZXMgaXRzIGJvZHksIHNvIG5vIGV4dHJhIGZ1bGwtc2l6ZSBjb3B5IG9mIHRoZSBtb2RlbCBoZXJlLlxuICAgIGF3YWl0IGNhY2hlTW9kZWwoY2FjaGUsIHVybCwga2V5LCBuZXcgUmVzcG9uc2Uob3V0LCB7IGhlYWRlcnM6IHsgJ2NvbnRlbnQtbGVuZ3RoJzogU3RyaW5nKHJlY2VpdmVkKSB9IH0pKTtcbiAgfVxuICBvblByb2dyZXNzPy4oMSk7XG4gIHJldHVybiBvdXQuYnVmZmVyO1xufVxuXG4vKiogUmVzaXplIChsb25nIHNpZGUg4oaSIHNpemUsIGJpbGluZWFyKSwgcGFkIHRvIHNpemXDl3NpemUsIFNBTS1ub3JtYWxpemUg4oaSIENIVyBmbG9hdDMyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXByb2Nlc3MoXG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgc2l6ZTogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbmV3VyA9IE1hdGgucm91bmQod2lkdGggKiBzY2FsZSk7XG4gIGNvbnN0IG5ld0ggPSBNYXRoLnJvdW5kKGhlaWdodCAqIHNjYWxlKTtcbiAgY29uc3QgY2h3ID0gbmV3IEZsb2F0MzJBcnJheSgzICogc2l6ZSAqIHNpemUpOyAvLyB6ZXJvLXBhZGRlZFxuICBmb3IgKGxldCB5ID0gMDsgeSA8IG5ld0g7IHkrKykge1xuICAgIGNvbnN0IHN5ID0gTWF0aC5taW4oaGVpZ2h0IC0gMSwgeSAvIHNjYWxlKTtcbiAgICBjb25zdCB5MCA9IE1hdGguZmxvb3Ioc3kpO1xuICAgIGNvbnN0IGZ5ID0gc3kgLSB5MDtcbiAgICBjb25zdCB5MSA9IE1hdGgubWluKGhlaWdodCAtIDEsIHkwICsgMSk7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBuZXdXOyB4KyspIHtcbiAgICAgIGNvbnN0IHN4ID0gTWF0aC5taW4od2lkdGggLSAxLCB4IC8gc2NhbGUpO1xuICAgICAgY29uc3QgeDAgPSBNYXRoLmZsb29yKHN4KTtcbiAgICAgIGNvbnN0IGZ4ID0gc3ggLSB4MDtcbiAgICAgIGNvbnN0IHgxID0gTWF0aC5taW4od2lkdGggLSAxLCB4MCArIDEpO1xuICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCAzOyBjKyspIHtcbiAgICAgICAgY29uc3QgcDAwID0gZGF0YVsoeTAgKiB3aWR0aCArIHgwKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgcDAxID0gZGF0YVsoeTAgKiB3aWR0aCArIHgxKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgcDEwID0gZGF0YVsoeTEgKiB3aWR0aCArIHgwKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgcDExID0gZGF0YVsoeTEgKiB3aWR0aCArIHgxKSAqIDQgKyBjXTtcbiAgICAgICAgY29uc3QgdG9wID0gcDAwICsgKHAwMSAtIHAwMCkgKiBmeDtcbiAgICAgICAgY29uc3QgYm90ID0gcDEwICsgKHAxMSAtIHAxMCkgKiBmeDtcbiAgICAgICAgY29uc3QgdiA9IHRvcCArIChib3QgLSB0b3ApICogZnk7XG4gICAgICAgIGNod1tjICogc2l6ZSAqIHNpemUgKyB5ICogc2l6ZSArIHhdID0gKHYgLSBQSVhFTF9NRUFOW2NdKSAvIFBJWEVMX1NURFtjXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNodztcbn1cblxuLyoqIEFzc2VtYmxlIGRlY29kZXIgYHBvaW50X2Nvb3Jkc2AvYHBvaW50X2xhYmVsc2AgZnJvbSBhIHByb21wdCwgaW4gZW5jb2RlclxuICogIChyZXNpemVkKSBzcGFjZS4gQm94ID0gdHdvIHBvaW50cyBsYWJlbGxlZCAyLzM7IHBvaW50cyB1c2UgMS8wOyBhIHBvaW50cy1vbmx5XG4gKiAgcHJvbXB0IHBhZHMgdGhlIGFic2VudCBib3ggc2xvdCB3aXRoIGBbMCwwXWAgbGFiZWxsZWQgLTEuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREZWNvZGVyUHJvbXB0KFxuICBwcm9tcHQ6IFNhbVByb21wdCxcbiAgc2NhbGU6IG51bWJlcixcbik6IHsgcG9pbnRDb29yZHM6IEZsb2F0MzJBcnJheTsgcG9pbnRMYWJlbHM6IEZsb2F0MzJBcnJheTsgbnVtUG9pbnRzOiBudW1iZXIgfSB7XG4gIGNvbnN0IGNvb3JkczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgbGFiZWxzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHAgb2YgcHJvbXB0LnBvaW50cyA/PyBbXSkge1xuICAgIGNvb3Jkcy5wdXNoKHAueCAqIHNjYWxlLCBwLnkgKiBzY2FsZSk7XG4gICAgbGFiZWxzLnB1c2gocC5sYWJlbCk7XG4gIH1cbiAgaWYgKHByb21wdC5ib3gpIHtcbiAgICBjb25zdCBiID0gcHJvbXB0LmJveDtcbiAgICBjb29yZHMucHVzaChiLngwICogc2NhbGUsIGIueTAgKiBzY2FsZSk7XG4gICAgbGFiZWxzLnB1c2goMik7XG4gICAgY29vcmRzLnB1c2goYi54MSAqIHNjYWxlLCBiLnkxICogc2NhbGUpO1xuICAgIGxhYmVscy5wdXNoKDMpO1xuICB9IGVsc2UgaWYgKGxhYmVscy5sZW5ndGggPiAwKSB7XG4gICAgY29vcmRzLnB1c2goMCwgMCk7XG4gICAgbGFiZWxzLnB1c2goLTEpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcG9pbnRDb29yZHM6IEZsb2F0MzJBcnJheS5mcm9tKGNvb3JkcyksXG4gICAgcG9pbnRMYWJlbHM6IEZsb2F0MzJBcnJheS5mcm9tKGxhYmVscyksXG4gICAgbnVtUG9pbnRzOiBsYWJlbHMubGVuZ3RoLFxuICB9O1xufVxuXG4vKiogQmluYXJpemUgbWFzayBsb2dpdHMgKGA+IHRocmVzaG9sZGApIGludG8gYSAwLzEgbWFzay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5hcml6ZU1hc2sobG9naXRzOiBGbG9hdDMyQXJyYXksIHRocmVzaG9sZCA9IDApOiBVaW50OEFycmF5IHtcbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4QXJyYXkobG9naXRzLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbG9naXRzLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBsb2dpdHNbaV0gPiB0aHJlc2hvbGQgPyAxIDogMDtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIEluZGV4IG9mIHRoZSBoaWdoZXN0LXNjb3JpbmcgbWFzayBpbiBhIG11bHRpbWFzayBkZWNvZGVyIG91dHB1dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZXN0TWFza0luZGV4KGlvdTogRmxvYXQzMkFycmF5IHwgbnVtYmVyW10pOiBudW1iZXIge1xuICBsZXQgYmVzdCA9IDA7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgaW91Lmxlbmd0aDsgaSsrKSBpZiAoaW91W2ldID4gaW91W2Jlc3RdKSBiZXN0ID0gaTtcbiAgcmV0dXJuIGJlc3Q7XG59XG5cbi8qKiBSdW4gdGhlIGVuY29kZXIgb24gYW4gUkdCQSBpbWFnZSDihpIgYSByZXVzYWJsZSBlbWJlZGRpbmcuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuRW5jb2RlcihcbiAgZW5jb2Rlcjogb3J0LkluZmVyZW5jZVNlc3Npb24sXG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgaW5wdXRTaXplOiBudW1iZXIsXG4pOiBQcm9taXNlPENvcmVFbWJlZGRpbmc+IHtcbiAgY29uc3Qgc2NhbGUgPSBpbnB1dFNpemUgLyBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KTtcbiAgY29uc3QgaW5wdXQgPSBwcmVwcm9jZXNzKGRhdGEsIHdpZHRoLCBoZWlnaHQsIGlucHV0U2l6ZSwgc2NhbGUpO1xuICBjb25zdCBvdXQgPSBhd2FpdCBlbmNvZGVyLnJ1bih7XG4gICAgW2VuY29kZXIuaW5wdXROYW1lc1swXV06IG5ldyBvcnQuVGVuc29yKCdmbG9hdDMyJywgaW5wdXQsIFsxLCAzLCBpbnB1dFNpemUsIGlucHV0U2l6ZV0pLFxuICB9KTtcbiAgY29uc3QgZW1iID0gb3V0W2VuY29kZXIub3V0cHV0TmFtZXNbMF1dO1xuICByZXR1cm4ge1xuICAgIGRhdGE6IGVtYi5kYXRhIGFzIEZsb2F0MzJBcnJheSxcbiAgICBkaW1zOiBlbWIuZGltcyBhcyBudW1iZXJbXSxcbiAgICBzY2FsZSxcbiAgICBpbWFnZVdpZHRoOiB3aWR0aCxcbiAgICBpbWFnZUhlaWdodDogaGVpZ2h0LFxuICB9O1xufVxuXG4vKiogUnVuIHRoZSBkZWNvZGVyIGZvciBvbmUgcHJvbXB0IGFnYWluc3QgYSBjYWNoZWQgZW1iZWRkaW5nIOKGkiBhIGJpbmFyeSBtYXNrLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkRlY29kZXIoXG4gIGRlY29kZXI6IG9ydC5JbmZlcmVuY2VTZXNzaW9uLFxuICBlOiBDb3JlRW1iZWRkaW5nLFxuICBwcm9tcHQ6IFNhbVByb21wdCxcbik6IFByb21pc2U8Q29yZU1hc2s+IHtcbiAgY29uc3QgeyBwb2ludENvb3JkcywgcG9pbnRMYWJlbHMsIG51bVBvaW50cyB9ID0gYnVpbGREZWNvZGVyUHJvbXB0KHByb21wdCwgZS5zY2FsZSk7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGRlY29kZXIucnVuKHtcbiAgICBpbWFnZV9lbWJlZGRpbmdzOiBuZXcgb3J0LlRlbnNvcignZmxvYXQzMicsIGUuZGF0YSwgZS5kaW1zKSxcbiAgICBwb2ludF9jb29yZHM6IG5ldyBvcnQuVGVuc29yKCdmbG9hdDMyJywgcG9pbnRDb29yZHMsIFsxLCBudW1Qb2ludHMsIDJdKSxcbiAgICBwb2ludF9sYWJlbHM6IG5ldyBvcnQuVGVuc29yKCdmbG9hdDMyJywgcG9pbnRMYWJlbHMsIFsxLCBudW1Qb2ludHNdKSxcbiAgICBtYXNrX2lucHV0OiBuZXcgb3J0LlRlbnNvcignZmxvYXQzMicsIG5ldyBGbG9hdDMyQXJyYXkoMjU2ICogMjU2KSwgWzEsIDEsIDI1NiwgMjU2XSksXG4gICAgaGFzX21hc2tfaW5wdXQ6IG5ldyBvcnQuVGVuc29yKCdmbG9hdDMyJywgRmxvYXQzMkFycmF5LmZyb20oWzBdKSwgWzFdKSxcbiAgICBvcmlnX2ltX3NpemU6IG5ldyBvcnQuVGVuc29yKCdmbG9hdDMyJywgRmxvYXQzMkFycmF5LmZyb20oW2UuaW1hZ2VIZWlnaHQsIGUuaW1hZ2VXaWR0aF0pLCBbMl0pLFxuICB9KTtcbiAgY29uc3QgbWFza3MgPSBvdXRbJ21hc2tzJ10gPz8gb3V0W2RlY29kZXIub3V0cHV0TmFtZXNbMF1dO1xuICBjb25zdCBpb3UgPSAob3V0Wydpb3VfcHJlZGljdGlvbnMnXT8uZGF0YSBhcyBGbG9hdDMyQXJyYXkpID8/IEZsb2F0MzJBcnJheS5mcm9tKFsxXSk7XG4gIGNvbnN0IFssIG0sIGgsIHddID0gbWFza3MuZGltcyBhcyBudW1iZXJbXTtcbiAgY29uc3QgaWR4ID0gYmVzdE1hc2tJbmRleChpb3Uuc2xpY2UoMCwgbSkpO1xuICBjb25zdCBsb2dpdHMgPSAobWFza3MuZGF0YSBhcyBGbG9hdDMyQXJyYXkpLnN1YmFycmF5KGlkeCAqIGggKiB3LCAoaWR4ICsgMSkgKiBoICogdyk7XG4gIHJldHVybiB7IG1hc2s6IGJpbmFyaXplTWFzayhsb2dpdHMpLCB3aWR0aDogdywgaGVpZ2h0OiBoLCBpb3U6IGlvdVtpZHhdID8/IDEgfTtcbn1cbiJdfQ==