vitessce 3.6.1__py3-none-any.whl → 3.6.3__py3-none-any.whl

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.
vitessce/__init__.py CHANGED
@@ -27,11 +27,6 @@ from .constants import (
27
27
  BASE_URL_PLACEHOLDER,
28
28
  )
29
29
 
30
- from .config_converter import (
31
- CellBrowserToAnndataZarrConverter, # only exported for testing.
32
- convert_cell_browser_project_to_anndata,
33
- )
34
-
35
30
  from .wrappers import AbstractWrapper
36
31
 
37
32
  # We allow installation without all of the dependencies that the widget requires.
vitessce/config.py CHANGED
@@ -602,7 +602,7 @@ class VitessceConfigView:
602
602
  })
603
603
  spatial_view.use_coordination_by_dict(scopes)
604
604
  """
605
- if "coordinationScopes" not in self.view["coordinationScopes"] or self.view["coordinationScopes"] is None:
605
+ if "coordinationScopes" not in self.view or self.view["coordinationScopes"] is None:
606
606
  self.view["coordinationScopes"] = {}
607
607
 
608
608
  if "coordinationScopesBy" not in self.view or self.view["coordinationScopesBy"] is None:
@@ -99,7 +99,9 @@ def rgb_img_to_ome_zarr(img_arr, output_path, img_name="Image", chunks=(1, 256,
99
99
  z_root.attrs["omero"] = {
100
100
  "name": img_name,
101
101
  "version": "0.3",
102
- "rdefs": {},
102
+ "rdefs": {
103
+ "model": "color",
104
+ },
103
105
  "channels": [
104
106
  {
105
107
  "label": "R",
@@ -156,7 +158,9 @@ def multiplex_img_to_ome_zarr(img_arr, channel_names, output_path, img_name="Ima
156
158
  z_root.attrs["omero"] = {
157
159
  "name": img_name,
158
160
  "version": "0.3",
159
- "rdefs": {},
161
+ "rdefs": {
162
+ "model": "greyscale",
163
+ },
160
164
  "channels": [
161
165
  {
162
166
  "label": channel_name,
@@ -101,6 +101,17 @@ def gen_obs_labels_schema(options: dict, paths: Optional[list[str]] = None, name
101
101
  return options
102
102
 
103
103
 
104
+ def gen_obs_feature_columns_schema(options: dict, obs_feature_column_paths: Optional[list[str]] = None):
105
+ if obs_feature_column_paths is not None:
106
+ options["obsFeatureColumns"] = [
107
+ {
108
+ "path": col_path
109
+ }
110
+ for col_path in obs_feature_column_paths
111
+ ]
112
+ return options
113
+
114
+
104
115
  def gen_path_schema(key: str, path: Optional[str], options: dict):
105
116
  if path is not None:
106
117
  options[key] = {
vitessce/widget.py CHANGED
@@ -2,21 +2,11 @@ import importlib.util
2
2
  from urllib.parse import quote_plus
3
3
  import json
4
4
  import sys
5
-
6
- # Widget dependencies
7
- import anywidget
8
- from traitlets import Unicode, Dict, List, Int, Bool
9
5
  import time
10
6
  import uuid
7
+ import anywidget
8
+ from traitlets import Unicode, Dict, List, Int, Bool
11
9
 
12
- # Server dependencies
13
- from uvicorn import Config, Server
14
-
15
- from starlette.applications import Starlette
16
- from starlette.middleware import Middleware
17
- from starlette.middleware.cors import CORSMiddleware
18
- from threading import Thread
19
- import socket
20
10
 
21
11
  MAX_PORT_TRIES = 1000
22
12
  DEFAULT_PORT = 8000
@@ -25,6 +15,10 @@ DEFAULT_PORT = 8000
25
15
  class BackgroundServer:
26
16
  # Reference: https://github.com/gosling-lang/gos/blob/main/gosling/data/_background_server.py#L10
27
17
  def __init__(self, routes):
18
+ from starlette.applications import Starlette
19
+ from starlette.middleware import Middleware
20
+ from starlette.middleware.cors import CORSMiddleware
21
+
28
22
  middleware = [
29
23
  Middleware(CORSMiddleware, allow_origins=[
30
24
  '*'], allow_methods=["OPTIONS", "GET"], allow_headers=['Range'])
@@ -47,6 +41,9 @@ class BackgroundServer:
47
41
  return self
48
42
 
49
43
  def start(self, port=None, timeout=1, daemon=True, log_level="warning"):
44
+ from uvicorn import Config, Server
45
+ from threading import Thread
46
+
50
47
  if self.thread is not None:
51
48
  return self
52
49
 
@@ -87,6 +84,7 @@ data_server = VitessceDataServer()
87
84
 
88
85
 
89
86
  def is_port_in_use(port):
87
+ import socket
90
88
  with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
91
89
  return s.connect_ex(('localhost', port)) == 0
92
90
 
@@ -234,6 +232,7 @@ async function render(view) {
234
232
  const storeUrls = view.model.get('store_urls');
235
233
  const invokeTimeout = view.model.get('invoke_timeout');
236
234
  const invokeBatched = view.model.get('invoke_batched');
235
+ const preventScroll = view.model.get('prevent_scroll');
237
236
 
238
237
  const pageMode = view.model.get('page_mode');
239
238
  const pageEsm = view.model.get('page_esm');
@@ -426,7 +425,7 @@ async function render(view) {
426
425
  const divRef = React.useRef();
427
426
 
428
427
  React.useEffect(() => {
429
- if(!divRef.current) {
428
+ if(!divRef.current || !preventScroll) {
430
429
  return () => {};
431
430
  }
432
431
 
@@ -452,7 +451,7 @@ async function render(view) {
452
451
  divRef.current.removeEventListener("mouseleave", handleMouseLeave);
453
452
  }
454
453
  };
455
- }, [divRef]);
454
+ }, [divRef, preventScroll]);
456
455
 
457
456
  // Config changed on JS side (from within <Vitessce/>),
458
457
  // send updated config to Python side.
@@ -602,7 +601,7 @@ class VitessceWidget(anywidget.AnyWidget):
602
601
 
603
602
  next_port = DEFAULT_PORT
604
603
 
605
- js_package_version = Unicode('3.6.2').tag(sync=True)
604
+ js_package_version = Unicode('3.6.4').tag(sync=True)
606
605
  js_dev_mode = Bool(False).tag(sync=True)
607
606
  custom_js_url = Unicode('').tag(sync=True)
608
607
  plugin_esm = List(trait=Unicode(''), default_value=[]).tag(sync=True)
@@ -611,10 +610,11 @@ class VitessceWidget(anywidget.AnyWidget):
611
610
  page_esm = Unicode('').tag(sync=True)
612
611
  invoke_timeout = Int(300000).tag(sync=True)
613
612
  invoke_batched = Bool(True).tag(sync=True)
613
+ prevent_scroll = Bool(True).tag(sync=True)
614
614
 
615
615
  store_urls = List(trait=Unicode(''), default_value=[]).tag(sync=True)
616
616
 
617
- def __init__(self, config, height=600, theme='auto', uid=None, port=None, proxy=False, js_package_version='3.6.2', js_dev_mode=False, custom_js_url='', plugins=None, remount_on_uid_change=True, prefer_local=True, invoke_timeout=300000, invoke_batched=True, page_mode=False, page_esm=None):
617
+ def __init__(self, config, height=600, theme='auto', uid=None, port=None, proxy=False, js_package_version='3.6.4', js_dev_mode=False, custom_js_url='', plugins=None, remount_on_uid_change=True, prefer_local=True, invoke_timeout=300000, invoke_batched=True, page_mode=False, page_esm=None, prevent_scroll=True):
618
618
  """
619
619
  Construct a new Vitessce widget.
620
620
 
@@ -634,6 +634,7 @@ class VitessceWidget(anywidget.AnyWidget):
634
634
  :param bool invoke_batched: Should invocations (Zarr gets) be submitted in batch, or individually? By default, True.
635
635
  :param bool page_mode: Whether to render the <Vitessce/> component in grid-mode or page-mode. By default, False.
636
636
  :param str page_esm: The ES module string for the page component creation function. Optional.
637
+ :param bool prevent_scroll: Should mouseover in the Vitessce widget prevent disable the scrolling of the notebook? By default, True.
637
638
 
638
639
  .. code-block:: python
639
640
  :emphasize-lines: 4
@@ -667,7 +668,7 @@ class VitessceWidget(anywidget.AnyWidget):
667
668
  js_package_version=js_package_version, js_dev_mode=js_dev_mode, custom_js_url=custom_js_url,
668
669
  plugin_esm=plugin_esm, remount_on_uid_change=remount_on_uid_change,
669
670
  page_mode=page_mode, page_esm=('' if page_esm is None else page_esm),
670
- invoke_timeout=invoke_timeout, invoke_batched=invoke_batched,
671
+ invoke_timeout=invoke_timeout, invoke_batched=invoke_batched, prevent_scroll=prevent_scroll,
671
672
  uid=uid_str, store_urls=list(self._stores.keys())
672
673
  )
673
674
 
@@ -749,7 +750,7 @@ class VitessceWidget(anywidget.AnyWidget):
749
750
  # Launch Vitessce using plain HTML representation (no ipywidgets)
750
751
 
751
752
 
752
- def ipython_display(config, height=600, theme='auto', base_url=None, host_name=None, uid=None, port=None, proxy=False, js_package_version='3.6.2', js_dev_mode=False, custom_js_url='', plugins=None, remount_on_uid_change=True, page_mode=False, page_esm=None):
753
+ def ipython_display(config, height=600, theme='auto', base_url=None, host_name=None, uid=None, port=None, proxy=False, js_package_version='3.6.4', js_dev_mode=False, custom_js_url='', plugins=None, remount_on_uid_change=True, page_mode=False, page_esm=None):
753
754
  from IPython.display import display, HTML
754
755
  uid_str = "vitessce" + get_uid_str(uid)
755
756
 
vitessce/wrappers.py CHANGED
@@ -33,6 +33,7 @@ from vitessce.file_def_utils import (
33
33
  gen_sdata_obs_spots_schema,
34
34
  gen_sdata_obs_sets_schema,
35
35
  gen_sdata_obs_feature_matrix_schema,
36
+ gen_obs_feature_columns_schema,
36
37
  )
37
38
 
38
39
  from .constants import (
@@ -1192,7 +1193,7 @@ def raise_error_if_more_than_one(inputs):
1192
1193
 
1193
1194
 
1194
1195
  class AnnDataWrapper(AbstractWrapper):
1195
- def __init__(self, adata_path=None, adata_url=None, adata_store=None, adata_artifact=None, ref_path=None, ref_url=None, ref_artifact=None, obs_feature_matrix_path=None, feature_filter_path=None, initial_feature_filter_path=None, obs_set_paths=None, obs_set_names=None, obs_locations_path=None, obs_segmentations_path=None, obs_embedding_paths=None, obs_embedding_names=None, obs_embedding_dims=None, obs_spots_path=None, obs_points_path=None, feature_labels_path=None, obs_labels_path=None, convert_to_dense=True, coordination_values=None, obs_labels_paths=None, obs_labels_names=None, is_zip=None, **kwargs):
1196
+ def __init__(self, adata_path=None, adata_url=None, adata_store=None, adata_artifact=None, ref_path=None, ref_url=None, ref_artifact=None, obs_feature_matrix_path=None, obs_feature_column_paths=None, feature_filter_path=None, initial_feature_filter_path=None, obs_set_paths=None, obs_set_names=None, obs_locations_path=None, obs_segmentations_path=None, obs_embedding_paths=None, obs_embedding_names=None, obs_embedding_dims=None, obs_spots_path=None, obs_points_path=None, feature_labels_path=None, obs_labels_path=None, convert_to_dense=True, coordination_values=None, obs_labels_paths=None, obs_labels_names=None, is_zip=None, **kwargs):
1196
1197
  """
1197
1198
  Wrap an AnnData object by creating an instance of the ``AnnDataWrapper`` class.
1198
1199
 
@@ -1218,6 +1219,7 @@ class AnnDataWrapper(AbstractWrapper):
1218
1219
  :param str obs_labels_path: (DEPRECATED) The name of a column containing observation labels (e.g., alternate cell IDs), instead of the default index in `obs` of the AnnData store. Use `obs_labels_paths` and `obs_labels_names` instead. This arg will be removed in a future release.
1219
1220
  :param list[str] obs_labels_paths: The names of columns containing observation labels (e.g., alternate cell IDs), instead of the default index in `obs` of the AnnData store.
1220
1221
  :param list[str] obs_labels_names: The optional display names of columns containing observation labels (e.g., alternate cell IDs), instead of the default index in `obs` of the AnnData store.
1222
+ :param list[str] obs_feature_column_paths: The paths to columns (typically in `obs`) that contain numerical values per observation (e.g., cell size, quality control metrics, etc.) which are not part of the main expression matrix.
1221
1223
  :param bool convert_to_dense: Whether or not to convert `X` to dense the zarr store (dense is faster but takes more disk space).
1222
1224
  :param coordination_values: Coordination values for the file definition.
1223
1225
  :param is_zip: Boolean indicating whether the Zarr store is in a zipped format.
@@ -1289,6 +1291,7 @@ class AnnDataWrapper(AbstractWrapper):
1289
1291
  self._spatial_spots_obsm = obs_spots_path
1290
1292
  self._spatial_points_obsm = obs_points_path
1291
1293
  self._feature_labels = feature_labels_path
1294
+ self._obs_feature_column_paths = obs_feature_column_paths
1292
1295
  # Support legacy provision of single obs labels path
1293
1296
  if (obs_labels_path is not None):
1294
1297
  warnings.warn("`obs_labels_path` will be deprecated in a future release.", DeprecationWarning)
@@ -1357,6 +1360,7 @@ class AnnDataWrapper(AbstractWrapper):
1357
1360
  options = gen_obs_feature_matrix_schema(options, self._expression_matrix, self._gene_var_filter, self._matrix_gene_var_filter)
1358
1361
  options = gen_feature_labels_schema(self._feature_labels, options)
1359
1362
  options = gen_obs_labels_schema(options, self._obs_labels_elems, self._obs_labels_names)
1363
+ options = gen_obs_feature_columns_schema(options, self._obs_feature_column_paths)
1360
1364
 
1361
1365
  if len(options.keys()) > 0:
1362
1366
  if self.is_h5ad:
@@ -1397,7 +1401,7 @@ SpatialDataWrapperType = TypeVar('SpatialDataWrapperType', bound='SpatialDataWra
1397
1401
 
1398
1402
  class SpatialDataWrapper(AnnDataWrapper):
1399
1403
 
1400
- def __init__(self, sdata_path: Optional[str] = None, sdata_url: Optional[str] = None, sdata_store: Optional[Union[str, zarr.storage.StoreLike]] = None, sdata_artifact: Optional[ln.Artifact] = None, image_path: Optional[str] = None, region: Optional[str] = None, coordinate_system: Optional[str] = None, affine_transformation: Optional[np.ndarray] = None, obs_spots_path: Optional[str] = None, labels_path: Optional[str] = None, table_path: str = "tables/table", **kwargs):
1404
+ def __init__(self, sdata_path: Optional[str] = None, sdata_url: Optional[str] = None, sdata_store: Optional[Union[str, zarr.storage.StoreLike]] = None, sdata_artifact: Optional[ln.Artifact] = None, image_path: Optional[str] = None, region: Optional[str] = None, coordinate_system: Optional[str] = None, affine_transformation: Optional[np.ndarray] = None, obs_spots_path: Optional[str] = None, labels_path: Optional[str] = None, table_path: str = "tables/table", coordination_values=None, **kwargs):
1401
1405
  """
1402
1406
  Wrap a SpatialData object.
1403
1407
 
@@ -1444,6 +1448,7 @@ class SpatialDataWrapper(AnnDataWrapper):
1444
1448
  if self._adata_path is not None:
1445
1449
  self.zarr_folder = 'spatialdata.zarr'
1446
1450
  self.obs_type_label = None
1451
+ self._coordination_values = coordination_values
1447
1452
  if self._coordination_values is not None and "obsType" in self._coordination_values:
1448
1453
  self.obs_type_label = self._coordination_values["obsType"]
1449
1454
  self._table_path = table_path
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vitessce
3
- Version: 3.6.1
3
+ Version: 3.6.3
4
4
  Summary: Jupyter widget facilitating interactive visualization of spatial single-cell data with Vitessce
5
5
  Project-URL: repository, https://github.com/vitessce/vitessce-python
6
6
  Author-email: Mark Keller <mark_keller@hms.harvard.edu>
@@ -37,28 +37,26 @@ Classifier: Programming Language :: Python :: 3.11
37
37
  Classifier: Programming Language :: Python :: 3.12
38
38
  Classifier: Topic :: Multimedia :: Graphics
39
39
  Requires-Python: >=3.10
40
- Requires-Dist: anndata>=0.7.8
41
40
  Requires-Dist: black>=21.11b1
42
- Requires-Dist: jsonschema>=3.2
43
- Requires-Dist: negspy>=0.2.24
44
41
  Requires-Dist: numcodecs<0.16.0,>=0.5.7
45
42
  Requires-Dist: numpy>=1.21.2
46
- Requires-Dist: ome-zarr<0.10.3
47
43
  Requires-Dist: pandas>=1.1.2
48
- Requires-Dist: scanpy>=1.10.2
49
44
  Requires-Dist: scipy>=1.2.1
50
- Requires-Dist: tifffile>=2020.10.1
51
- Requires-Dist: tqdm>=4.1.0
52
45
  Requires-Dist: zarr<3,>=2.5.0
53
46
  Provides-Extra: all
54
47
  Requires-Dist: aiofiles>=0.6.0; extra == 'all'
48
+ Requires-Dist: anndata>=0.7.8; extra == 'all'
55
49
  Requires-Dist: anywidget>=0.9.10; extra == 'all'
56
50
  Requires-Dist: fsspec; extra == 'all'
57
51
  Requires-Dist: generate-tiff-offsets>=0.1.9; extra == 'all'
58
52
  Requires-Dist: jupyter-server-proxy>=1.5.2; extra == 'all'
59
53
  Requires-Dist: kerchunk>=0.2.6; extra == 'all'
54
+ Requires-Dist: negspy>=0.2.24; extra == 'all'
55
+ Requires-Dist: ome-zarr<0.10.3; extra == 'all'
60
56
  Requires-Dist: oxc-py>=0.1.1; extra == 'all'
57
+ Requires-Dist: scanpy>=1.10.2; extra == 'all'
61
58
  Requires-Dist: starlette>=0.14.0; extra == 'all'
59
+ Requires-Dist: tifffile>=2020.10.1; extra == 'all'
62
60
  Requires-Dist: ujson>=4.0.1; extra == 'all'
63
61
  Requires-Dist: uvicorn>=0.17.0; extra == 'all'
64
62
  Provides-Extra: building
@@ -87,6 +85,7 @@ Requires-Dist: dask[dataframe]==2024.11.1; extra == 'notebook'
87
85
  Requires-Dist: marimo; extra == 'notebook'
88
86
  Requires-Dist: spatialdata>=0.3.0; extra == 'notebook'
89
87
  Requires-Dist: starlette>=0.42.0; extra == 'notebook'
88
+ Requires-Dist: tqdm>=4.1.0; extra == 'notebook'
90
89
  Provides-Extra: testing
91
90
  Description-Content-Type: text/markdown
92
91
 
@@ -1,24 +1,24 @@
1
- vitessce/__init__.py,sha256=03pAJROyDfo6EErBx8Oqb9Emqol1QKQ_9zKhkwuQ36Q,1781
2
- vitessce/config.py,sha256=vZX4k-kS3zspYVT08PRuLSBeB-tU4GJgbN93z1Ed1iY,81228
1
+ vitessce/__init__.py,sha256=GWGahpQMOGFotQXilRccGT0Bnn3OyoCQUCUphW_DtTI,1632
2
+ vitessce/config.py,sha256=GLiFSYh-ACJvQhrEVu3-nqFj1HtlCF86V_mMDljvwFo,81206
3
3
  vitessce/config_converter.py,sha256=IRPnGPGaETvJbYZNUv2pe54SHHHsDY9VWo3JRjSI5FM,14681
4
4
  vitessce/constants.py,sha256=nBMH55TcnSavcpvYE-epyx3cJ0iDS31eHsL_1e9qb9M,15360
5
5
  vitessce/export.py,sha256=L7j5sVC0nBSqGocFWQyyHImSiAF4IjXhmqV1QtpuNc4,3874
6
- vitessce/file_def_utils.py,sha256=RM9Hj1uwPY-Y37JLOHiKA_acGY40p8C9WsDk8iVjDz8,6692
6
+ vitessce/file_def_utils.py,sha256=0Q1jxTOBDtvbRJEDX3s80oPr1EYrwkqixjkA5-rzAFM,7028
7
7
  vitessce/repr.py,sha256=qMmefmZ3E-3sRVxeI5q1DTZnfuwbXKiA85eyqk5MCT4,2287
8
8
  vitessce/responses.py,sha256=Z6Wo4AXN-RyzmxMPhSuhpIsHTItHM4GyIgMLGoVEYcU,339
9
9
  vitessce/routes.py,sha256=U8T-L-3QCD_tAbPF8LsUlSMhPWNbyzbLNUnxP9Z9s9o,2140
10
10
  vitessce/utils.py,sha256=obzjj65qsagu60_yuhGc-0jmHO-BW0Y-bDs0FgrBqLY,981
11
- vitessce/widget.py,sha256=2ConheUZqGuA2zAPsqKeliDCxegnderWgTxXkStYVNU,33210
12
- vitessce/wrappers.py,sha256=3ZNldH2uDhOzUl8ahil7GxnPcr0nKwqfrjjbgS2IL0Y,75010
11
+ vitessce/widget.py,sha256=OX9L6mnliYh2j5jQo_BcDYRCgccdYpgJqEOQzybZQ9I,33543
12
+ vitessce/wrappers.py,sha256=garL6KfL5hEqGBQpf3NV_ZsZhaV_-RN1GrCmA1Fc_1I,75557
13
13
  vitessce/data_utils/__init__.py,sha256=3mWi1lMjoj4_dNbhMOvyE-HEJu0qpMzcmkhfz_5T6n8,361
14
14
  vitessce/data_utils/anndata.py,sha256=iLa5-bRezHgBzL_XCHO7w0pc0RQ4urzZbDsqJbBYeCk,10668
15
15
  vitessce/data_utils/entities.py,sha256=X8enC_TQbgwBzjgD1x53IPS6aVr9wyP0s-NLuYBeMeU,11705
16
16
  vitessce/data_utils/multivec.py,sha256=YVc68uKNdS-ga89GapQjY9lDjmje0dm-MExq1yT_6ZE,11571
17
- vitessce/data_utils/ome.py,sha256=aK-iGNgjUmUMsWgdZhW78VrtMBKMW_jIQDYnsupq6BE,5436
17
+ vitessce/data_utils/ome.py,sha256=tJHlSHbZTxpjRgYfTxbYMS9zSnSHQwJVWPZpREAvHtU,5518
18
18
  vitessce/widget_plugins/__init__.py,sha256=lto2GXnc7KwjIoT-jvzyRYLj0XTJG3uxoX45Hc9EcWA,82
19
19
  vitessce/widget_plugins/demo_plugin.py,sha256=14S7nOxdlKSxIHw9DUcNCN83NE_U1EMPy2D4k0FDues,1797
20
20
  vitessce/widget_plugins/spatial_query.py,sha256=CYxvmMT1Je_jguikPROQxlegkPgIIzemKGbZSJfZMyI,12314
21
- vitessce-3.6.1.dist-info/METADATA,sha256=2MqadRVK49A5pj1SgGfpLxJX479mA2FRyxMaj_bp9dQ,9756
22
- vitessce-3.6.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
23
- vitessce-3.6.1.dist-info/licenses/LICENSE,sha256=sNNpI0PQ57AW8_XnTAjU5Yw8YBA_DRNkVHrHYpCIhRU,1067
24
- vitessce-3.6.1.dist-info/RECORD,,
21
+ vitessce-3.6.3.dist-info/METADATA,sha256=P0ImyRQlP8PlT9aJJfVJRMyJG3AvDF7FyYmoR-orMko,9826
22
+ vitessce-3.6.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
23
+ vitessce-3.6.3.dist-info/licenses/LICENSE,sha256=sNNpI0PQ57AW8_XnTAjU5Yw8YBA_DRNkVHrHYpCIhRU,1067
24
+ vitessce-3.6.3.dist-info/RECORD,,